userdiff: add built-in pattern for golang
authorAlban Gruin <alban.gruin@gmail.com>
Thu, 1 Mar 2018 11:19:07 +0000 (12:19 +0100)
committerJunio C Hamano <gitster@pobox.com>
Thu, 1 Mar 2018 21:36:49 +0000 (13:36 -0800)
This adds xfuncname and word_regex patterns for golang, a quite
popular programming language. It also includes test cases for the
xfuncname regex (t4018) and updated documentation.

The xfuncname regex finds functions, structs and interfaces. Although
the Go language prohibits the opening brace from being on its own
line, the regex does not makes it mandatory, to be able to match
`func` statements like this:

func foo(bar int,
baz int) {
}

This is covered by the test case t4018/golang-long-func.

The word_regex pattern finds identifiers, integers, floats, complex
numbers and operators, according to the go specification.

Signed-off-by: Alban Gruin <alban.gruin@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/gitattributes.txt
t/t4018-diff-funcname.sh
t/t4018/golang-complex-function [new file with mode: 0644]
t/t4018/golang-func [new file with mode: 0644]
t/t4018/golang-interface [new file with mode: 0644]
t/t4018/golang-long-func [new file with mode: 0644]
t/t4018/golang-struct [new file with mode: 0644]
userdiff.c
index c21f5ca109b7ab7fede09e5b698e631daf585f16..d52b254a22bd90fec29ba1e904cef0f06229f1f1 100644 (file)
@@ -714,6 +714,8 @@ patterns are available:
 
 - `fountain` suitable for Fountain documents.
 
+- `golang` suitable for source code in the Go language.
+
 - `html` suitable for HTML/XHTML documents.
 
 - `java` suitable for source code in the Java language.
index 1795ffc3aaf3008f3ef3adc566803a66603975dd..22f9f88f0afc54f1dfeebbea623a4c41fde709f6 100755 (executable)
@@ -33,6 +33,7 @@ diffpatterns="
        css
        fortran
        fountain
+       golang
        html
        java
        matlab
diff --git a/t/t4018/golang-complex-function b/t/t4018/golang-complex-function
new file mode 100644 (file)
index 0000000..e057dce
--- /dev/null
@@ -0,0 +1,8 @@
+type Test struct {
+       a Type
+}
+
+func (t *Test) RIGHT(a Type) (Type, error) {
+       t.a = a
+       return ChangeMe, nil
+}
diff --git a/t/t4018/golang-func b/t/t4018/golang-func
new file mode 100644 (file)
index 0000000..8e9c9ac
--- /dev/null
@@ -0,0 +1,4 @@
+func RIGHT() {
+       a := 5
+       b := ChangeMe
+}
diff --git a/t/t4018/golang-interface b/t/t4018/golang-interface
new file mode 100644 (file)
index 0000000..553bede
--- /dev/null
@@ -0,0 +1,4 @@
+type RIGHT interface {
+       a() Type
+       b() ChangeMe
+}
diff --git a/t/t4018/golang-long-func b/t/t4018/golang-long-func
new file mode 100644 (file)
index 0000000..ac3a77b
--- /dev/null
@@ -0,0 +1,5 @@
+func RIGHT(aVeryVeryVeryLongVariableName AVeryVeryVeryLongType,
+       anotherLongVariableName AnotherLongType) {
+       a := 5
+       b := ChangeMe
+}
diff --git a/t/t4018/golang-struct b/t/t4018/golang-struct
new file mode 100644 (file)
index 0000000..5deda77
--- /dev/null
@@ -0,0 +1,4 @@
+type RIGHT struct {
+       a Type
+       b ChangeMe
+}
index dbfb4e13cddceaa44feee51016c9b837f7f4fce1..8f5028f6b25eb570aedb9763f2456442b2e4a1aa 100644 (file)
@@ -38,6 +38,15 @@ IPATTERN("fortran",
         "|//|\\*\\*|::|[/<>=]="),
 IPATTERN("fountain", "^((\\.[^.]|(int|ext|est|int\\.?/ext|i/e)[. ]).*)$",
         "[^ \t-]+"),
+PATTERNS("golang",
+        /* Functions */
+        "^[ \t]*(func[ \t]*.*(\\{[ \t]*)?)\n"
+        /* Structs and interfaces */
+        "^[ \t]*(type[ \t].*(struct|interface)[ \t]*(\\{[ \t]*)?)",
+        /* -- */
+        "[a-zA-Z_][a-zA-Z0-9_]*"
+        "|[-+0-9.eE]+i?|0[xX]?[0-9a-fA-F]+i?"
+        "|[-+*/<>%&^|=!:]=|--|\\+\\+|<<=?|>>=?|&\\^=?|&&|\\|\\||<-|\\.{3}"),
 PATTERNS("html", "^[ \t]*(<[Hh][1-6]([ \t].*)?>.*)$",
         "[^<>= \t]+"),
 PATTERNS("java",