{"thread":{"id":"56247","subject":"[PATCH v3] userdiff: improve java regex for array, qualified, and generic return types","startedAt":"2021-08-10T14:44:09Z","lastAt":"2021-08-10T15:24:09Z","messageCount":2,"participants":["Tassilo Horn"],"isPatch":true,"patchVersion":3,"patchTotal":null},"messages":[{"id":"432378","messageId":"20210810144358.235603-1-tsdh@gnu.org","threadId":"56247","inReplyTo":null,"subject":"[PATCH v3] userdiff: improve java regex for array, qualified, and generic return types","fromName":"Tassilo Horn","fromEmail":"tsdh@gnu.org","sentAt":"2021-08-10T14:43:58Z","receivedAt":"2021-08-10T14:44:09Z","isPatch":true,"sender":{"key":"tsdh@gnu.org","avatar":"https://avatars.githubusercontent.com/u/103854?v=4"},"body":"Currently, the git diff hunk headers show the wrong method signature if the\nmethod has a qualified return type, an array return type, or a generic return\ntype because the regex doesn't allow dots (.), [], or < and > in the return\ntype.  Also, type parameter declarations couldn't be matched.\n\nAdd several t4018 tests asserting the right hunk headers for increasingly\ncomplex method signatures:\n\n  public String[] secondMethod(String[] RIGHT)\n  public List<String> secondMethod(String[] RIGHT)\n  public <T> List<T> secondMethod(T[] RIGHT)\n  public <AType, B> Map<AType, B> secondMethod(String[] RIGHT)\n  public <AType, B> java.util.Map<AType, Map<B, B[]>> secondMethod(String[] RIGHT)\n\nSigned-off-by: Tassilo Horn <tsdh@gnu.org>\n---\n t/t4018/java-return-array    | 10 ++++++++++\n t/t4018/java-return-generic  | 10 ++++++++++\n t/t4018/java-return-generic2 | 10 ++++++++++\n t/t4018/java-return-generic3 | 10 ++++++++++\n t/t4018/java-return-generic4 | 10 ++++++++++\n userdiff.c                   | 10 +++++++++-\n 6 files changed, 59 insertions(+), 1 deletion(-)\n create mode 100644 t/t4018/java-return-array\n create mode 100644 t/t4018/java-return-generic\n create mode 100644 t/t4018/java-return-generic2\n create mode 100644 t/t4018/java-return-generic3\n create mode 100644 t/t4018/java-return-generic4\n\ndiff --git a/t/t4018/java-return-array b/t/t4018/java-return-array\nnew file mode 100644\nindex 0000000000..fc8882a5a9\n--- /dev/null\n+++ b/t/t4018/java-return-array\n@@ -0,0 +1,10 @@\n+class MyExample {\n+    public void firstMethod() {\n+        // Whatever...\n+    }\n+\n+ public String[] secondMethod(String[] RIGHT) {\n+        // Whatever...\n+        return new; // ChangeMe\n+    }\n+}\ndiff --git a/t/t4018/java-return-generic b/t/t4018/java-return-generic\nnew file mode 100644\nindex 0000000000..7ea7bf8f07\n--- /dev/null\n+++ b/t/t4018/java-return-generic\n@@ -0,0 +1,10 @@\n+class MyExample {\n+    public void firstMethod() {\n+        // Whatever...\n+    }\n+\n+    public List<String> secondMethod(String[] RIGHT) {\n+        // Whatever...\n+        return Arrays.asList(\"ChangeMe\");\n+    }\n+}\ndiff --git a/t/t4018/java-return-generic2 b/t/t4018/java-return-generic2\nnew file mode 100644\nindex 0000000000..d2d2ab7f37\n--- /dev/null\n+++ b/t/t4018/java-return-generic2\n@@ -0,0 +1,10 @@\n+class MyExample {\n+    public void firstMethod() {\n+        // Whatever...\n+    }\n+\n+    public <T> List<T> secondMethod(T[] RIGHT) {\n+        // Whatever...\n+        return (List<T>) Arrays.asList(\"ChangeMe\");\n+    }\n+}\ndiff --git a/t/t4018/java-return-generic3 b/t/t4018/java-return-generic3\nnew file mode 100644\nindex 0000000000..3db1a1ddba\n--- /dev/null\n+++ b/t/t4018/java-return-generic3\n@@ -0,0 +1,10 @@\n+class MyExample {\n+    public void firstMethod() {\n+        // Whatever...\n+    }\n+\n+    public <AType, B> Map<AType, B> secondMethod(String[] RIGHT) {\n+        // Whatever...\n+        return new java.util.HashMap<>(); // ChangeMe\n+    }\n+}\ndiff --git a/t/t4018/java-return-generic4 b/t/t4018/java-return-generic4\nnew file mode 100644\nindex 0000000000..59f2a50dd2\n--- /dev/null\n+++ b/t/t4018/java-return-generic4\n@@ -0,0 +1,10 @@\n+class MyExample {\n+    public void firstMethod() {\n+        // Whatever...\n+    }\n+\n+ public <AType, B> java.util.Map<AType, Map<B, B[]>> secondMethod(String[] RIGHT) {\n+        // Whatever...\n+        return new java.util.HashMap<>(); // ChangeMe\n+    }\n+}\ndiff --git a/userdiff.c b/userdiff.c\nindex 3c3bbe38b0..ded42945c3 100644\n--- a/userdiff.c\n+++ b/userdiff.c\n@@ -142,7 +142,15 @@ PATTERNS(\"html\",\n \t \"[^<>= \\t]+\"),\n PATTERNS(\"java\",\n \t \"!^[ \\t]*(catch|do|for|if|instanceof|new|return|switch|throw|while)\\n\"\n-\t \"^[ \\t]*(([A-Za-z_][A-Za-z_0-9]*[ \\t]+)+[A-Za-z_][A-Za-z_0-9]*[ \\t]*\\\\([^;]*)$\",\n+         /* Method signatures contain: */\n+         /*   modifiers: public static */\n+         \"^[ \\t]*(([A-Za-z_][A-Za-z]*[ \\t]+)*\"\n+         /*   optionally type parameters: <A, B, C> */\n+         \"(<[A-Za-z0-9_, \\t]+>[ \\t]+)?\"\n+         /*   a return type: java.util.Map<A, B[]> */\n+         \"([A-Za-z_]([A-Za-z_0-9<>,.]|\\\\[[ \\t]*\\\\])*[ \\t]+)+\"\n+         /*   the method name followed by the parameter list: myMethod(...) */\n+         \"[A-Za-z_][A-Za-z_0-9]*[ \\t]*\\\\([^;]*)$\",\n \t /* -- */\n \t \"[a-zA-Z_][a-zA-Z0-9_]*\"\n \t \"|[-+0-9.e]+[fFlL]?|0[xXbB]?[0-9a-fA-F]+[lL]?\"\n-- \n2.32.0\n\n"},{"id":"432381","messageId":"8735rhmigc.fsf@gnu.org","threadId":"56247","inReplyTo":"20210810144358.235603-1-tsdh@gnu.org","subject":"Re: [PATCH v3] userdiff: improve java regex for array, qualified, and generic return types","fromName":"Tassilo Horn","fromEmail":"tsdh@gnu.org","sentAt":"2021-08-10T15:22:37Z","receivedAt":"2021-08-10T15:24:09Z","isPatch":true,"sender":{"key":"tsdh@gnu.org","avatar":"https://avatars.githubusercontent.com/u/103854?v=4"},"body":"Gosh, I'm sorry.  I've just discovered yet another corner case that has\nto be catered for (generic return types with wildcards).  Stay tuned for\npatch version v4...\n\nBye,\nTassilo\n"}]}