Browse Source

userdiff: improve java hunk header regex

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>
maint
Tassilo Horn 4 years ago committed by Junio C Hamano
parent
commit
a8cbc89589
  1. 4
      t/t4018/java-class-member-function
  2. 6
      t/t4018/java-enum-constant
  3. 9
      t/t4018/java-method-return-generic-bounded
  4. 9
      t/t4018/java-method-return-generic-wildcard
  5. 6
      t/t4018/java-nested-field
  6. 6
      userdiff.c

4
t/t4018/java-class-member-function

@ -3,6 +3,10 @@ public class Beer @@ -3,6 +3,10 @@ public class Beer
int special;
public static void main(String RIGHT[])
{
someMethodCall();
someOtherMethod("17")
.doThat();
// Whatever
System.out.print("ChangeMe");
}
}

6
t/t4018/java-enum-constant

@ -0,0 +1,6 @@ @@ -0,0 +1,6 @@
private enum RIGHT {
ONE,
TWO,
THREE,
ChangeMe
}

9
t/t4018/java-method-return-generic-bounded

@ -0,0 +1,9 @@ @@ -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");
}
}

9
t/t4018/java-method-return-generic-wildcard

@ -0,0 +1,9 @@ @@ -0,0 +1,9 @@
class MyExample {
public List<? extends Comparable> foo(String[] RIGHT) {
someMethodCall();
someOtherMethod()
.doThat();
// Whatever...
return Arrays.asList("ChangeMe");
}
}

6
t/t4018/java-nested-field

@ -0,0 +1,6 @@ @@ -0,0 +1,6 @@
class MyExample {
private static class RIGHT {
// change an inner class field
String inner = "ChangeMe";
}
}

6
userdiff.c

@ -142,7 +142,11 @@ PATTERNS("html", @@ -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]?"

Loading…
Cancel
Save