]> git.ipfire.org Git - thirdparty/git.git/commitdiff
userdiff: improve java hunk header regex
authorTassilo Horn <tsdh@gnu.org>
Wed, 11 Aug 2021 17:51:04 +0000 (19:51 +0200)
committerJunio C Hamano <gitster@pobox.com>
Wed, 11 Aug 2021 18:11:30 +0000 (11:11 -0700)
Currently, the git diff hunk headers show the wrong method signature if the
method has a qualified return type, an array return type, or a generic return
type because the regex doesn't allow dots (.), [], or < and > in the return
type.  Also, type parameter declarations couldn't be matched.

Add several t4018 tests asserting the right hunk headers for different cases:

  - enum constant change
  - change in generic method with bounded type parameters
  - change in generic method with wildcard
  - field change in a nested class

Signed-off-by: Tassilo Horn <tsdh@gnu.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
t/t4018/java-class-member-function
t/t4018/java-enum-constant [new file with mode: 0644]
t/t4018/java-method-return-generic-bounded [new file with mode: 0644]
t/t4018/java-method-return-generic-wildcard [new file with mode: 0644]
t/t4018/java-nested-field [new file with mode: 0644]
userdiff.c

index 298bc7a71b29d169c66f1589ca6fa79034609656..3b95f68b3b0c8252f083e549332244175ece6d0a 100644 (file)
@@ -3,6 +3,10 @@ public class Beer
        int special;
        public static void main(String RIGHT[])
        {
+               someMethodCall();
+               someOtherMethod("17")
+                       .doThat();
+               // Whatever
                System.out.print("ChangeMe");
        }
 }
diff --git a/t/t4018/java-enum-constant b/t/t4018/java-enum-constant
new file mode 100644 (file)
index 0000000..a1931c8
--- /dev/null
@@ -0,0 +1,6 @@
+private enum RIGHT {
+    ONE,
+    TWO,
+    THREE,
+    ChangeMe
+}
diff --git a/t/t4018/java-method-return-generic-bounded b/t/t4018/java-method-return-generic-bounded
new file mode 100644 (file)
index 0000000..66dd78c
--- /dev/null
@@ -0,0 +1,9 @@
+class MyExample {
+    public <T extends Bar & Foo<T>, R> Map<T, R[]> foo(String[] RIGHT) {
+        someMethodCall();
+        someOtherMethod()
+            .doThat();
+        // Whatever...
+        return (List<T>) Arrays.asList("ChangeMe");
+    }
+}
diff --git a/t/t4018/java-method-return-generic-wildcard b/t/t4018/java-method-return-generic-wildcard
new file mode 100644 (file)
index 0000000..96e9e5f
--- /dev/null
@@ -0,0 +1,9 @@
+class MyExample {
+    public List<? extends Comparable> foo(String[] RIGHT) {
+        someMethodCall();
+        someOtherMethod()
+            .doThat();
+        // Whatever...
+        return Arrays.asList("ChangeMe");
+    }
+}
diff --git a/t/t4018/java-nested-field b/t/t4018/java-nested-field
new file mode 100644 (file)
index 0000000..d92d3ec
--- /dev/null
@@ -0,0 +1,6 @@
+class MyExample {
+    private static class RIGHT {
+        // change an inner class field
+        String inner = "ChangeMe";
+    }
+}
index d9b2ba752f0885240ea1089ea90525de2cedf40c..af1f1c2a12f7d200791bd8995a789e7effe669b0 100644 (file)
@@ -142,7 +142,11 @@ PATTERNS("html",
         "[^<>= \t]+"),
 PATTERNS("java",
         "!^[ \t]*(catch|do|for|if|instanceof|new|return|switch|throw|while)\n"
-        "^[ \t]*(([A-Za-z_][A-Za-z_0-9]*[ \t]+)+[A-Za-z_][A-Za-z_0-9]*[ \t]*\\([^;]*)$",
+        /* Class, enum, and interface declarations */
+        "^[ \t]*(([a-z]+[ \t]+)*(class|enum|interface)[ \t]+[A-Za-z][A-Za-z0-9_$]*[ \t]+.*)$\n"
+        /* Method definitions; note that constructor signatures are not */
+        /* matched because they are indistinguishable from method calls. */
+        "^[ \t]*(([A-Za-z_<>&][][?&<>.,A-Za-z_0-9]*[ \t]+)+[A-Za-z_][A-Za-z_0-9]*[ \t]*\\([^;]*)$",
         /* -- */
         "[a-zA-Z_][a-zA-Z0-9_]*"
         "|[-+0-9.e]+[fFlL]?|0[xXbB]?[0-9a-fA-F]+[lL]?"