[PATCH v3] userdiff: improve java regex for array, qualified, and generic return types

Subsystems: the rest

STALE1828d

2 messages, 1 author, 2021-08-10 · open the first message on its own page

[PATCH v3] userdiff: improve java regex for array, qualified, and generic return types

From: Tassilo Horn <hidden>
Date: 2021-08-10 14:44:09

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 increasingly
complex method signatures:

  public String[] secondMethod(String[] RIGHT)
  public List<String> secondMethod(String[] RIGHT)
  public <T> List<T> secondMethod(T[] RIGHT)
  public <AType, B> Map<AType, B> secondMethod(String[] RIGHT)
  public <AType, B> java.util.Map<AType, Map<B, B[]>> secondMethod(String[] RIGHT)

Signed-off-by: Tassilo Horn <redacted>
---
 t/t4018/java-return-array    | 10 ++++++++++
 t/t4018/java-return-generic  | 10 ++++++++++
 t/t4018/java-return-generic2 | 10 ++++++++++
 t/t4018/java-return-generic3 | 10 ++++++++++
 t/t4018/java-return-generic4 | 10 ++++++++++
 userdiff.c                   | 10 +++++++++-
 6 files changed, 59 insertions(+), 1 deletion(-)
 create mode 100644 t/t4018/java-return-array
 create mode 100644 t/t4018/java-return-generic
 create mode 100644 t/t4018/java-return-generic2
 create mode 100644 t/t4018/java-return-generic3
 create mode 100644 t/t4018/java-return-generic4
diff --git a/t/t4018/java-return-array b/t/t4018/java-return-array
new file mode 100644
index 0000000000..fc8882a5a9
--- /dev/null
+++ b/t/t4018/java-return-array
@@ -0,0 +1,10 @@
+class MyExample {
+    public void firstMethod() {
+        // Whatever...
+    }
+
+ public String[] secondMethod(String[] RIGHT) {
+        // Whatever...
+        return new; // ChangeMe
+    }
+}
diff --git a/t/t4018/java-return-generic b/t/t4018/java-return-generic
new file mode 100644
index 0000000000..7ea7bf8f07
--- /dev/null
+++ b/t/t4018/java-return-generic
@@ -0,0 +1,10 @@
+class MyExample {
+    public void firstMethod() {
+        // Whatever...
+    }
+
+    public List<String> secondMethod(String[] RIGHT) {
+        // Whatever...
+        return Arrays.asList("ChangeMe");
+    }
+}
diff --git a/t/t4018/java-return-generic2 b/t/t4018/java-return-generic2
new file mode 100644
index 0000000000..d2d2ab7f37
--- /dev/null
+++ b/t/t4018/java-return-generic2
@@ -0,0 +1,10 @@
+class MyExample {
+    public void firstMethod() {
+        // Whatever...
+    }
+
+    public <T> List<T> secondMethod(T[] RIGHT) {
+        // Whatever...
+        return (List<T>) Arrays.asList("ChangeMe");
+    }
+}
diff --git a/t/t4018/java-return-generic3 b/t/t4018/java-return-generic3
new file mode 100644
index 0000000000..3db1a1ddba
--- /dev/null
+++ b/t/t4018/java-return-generic3
@@ -0,0 +1,10 @@
+class MyExample {
+    public void firstMethod() {
+        // Whatever...
+    }
+
+    public <AType, B> Map<AType, B> secondMethod(String[] RIGHT) {
+        // Whatever...
+        return new java.util.HashMap<>(); // ChangeMe
+    }
+}
diff --git a/t/t4018/java-return-generic4 b/t/t4018/java-return-generic4
new file mode 100644
index 0000000000..59f2a50dd2
--- /dev/null
+++ b/t/t4018/java-return-generic4
@@ -0,0 +1,10 @@
+class MyExample {
+    public void firstMethod() {
+        // Whatever...
+    }
+
+ public <AType, B> java.util.Map<AType, Map<B, B[]>> secondMethod(String[] RIGHT) {
+        // Whatever...
+        return new java.util.HashMap<>(); // ChangeMe
+    }
+}
diff --git a/userdiff.c b/userdiff.c
index 3c3bbe38b0..ded42945c3 100644
--- a/userdiff.c
+++ b/userdiff.c
@@ -142,7 +142,15 @@ 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]*\\([^;]*)$",
+         /* Method signatures contain: */
+         /*   modifiers: public static */
+         "^[ \t]*(([A-Za-z_][A-Za-z]*[ \t]+)*"
+         /*   optionally type parameters: <A, B, C> */
+         "(<[A-Za-z0-9_, \t]+>[ \t]+)?"
+         /*   a return type: java.util.Map<A, B[]> */
+         "([A-Za-z_]([A-Za-z_0-9<>,.]|\\[[ \t]*\\])*[ \t]+)+"
+         /*   the method name followed by the parameter list: myMethod(...) */
+         "[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]?"
-- 
2.32.0

Re: [PATCH v3] userdiff: improve java regex for array, qualified, and generic return types

From: Tassilo Horn <hidden>
Date: 2021-08-10 15:24:09

Gosh, I'm sorry.  I've just discovered yet another corner case that has
to be catered for (generic return types with wildcards).  Stay tuned for
patch version v4...

Bye,
Tassilo
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help