{"thread":{"id":"56245","subject":"[PATCH v2] userdiff: improve java regex for generic return types","startedAt":"2021-08-10T08:28:14Z","lastAt":"2021-08-10T14:45:44Z","messageCount":2,"participants":["Tassilo Horn"],"isPatch":true,"patchVersion":2,"patchTotal":null},"messages":[{"id":"432355","messageId":"20210810082757.219007-1-tsdh@gnu.org","threadId":"56245","inReplyTo":null,"subject":"[PATCH v2] userdiff: improve java regex for generic return types","fromName":"Tassilo Horn","fromEmail":"tsdh@gnu.org","sentAt":"2021-08-10T08:27:57Z","receivedAt":"2021-08-10T08:28:14Z","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 an array or generic return type because the regex doesn't allow [],\nor < and > in the return type.  Also, type parameter declarations couldn't be\nmatched.\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> 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..1fc18a8482\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> 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..22f17c1d3e 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: 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":"432379","messageId":"878s19mk8c.fsf@gnu.org","threadId":"56245","inReplyTo":"20210810082757.219007-1-tsdh@gnu.org","subject":"Re: [PATCH v2] userdiff: improve java regex for generic return types","fromName":"Tassilo Horn","fromEmail":"tsdh@gnu.org","sentAt":"2021-08-10T14:44:13Z","receivedAt":"2021-08-10T14:45:44Z","isPatch":true,"sender":{"key":"tsdh@gnu.org","avatar":"https://avatars.githubusercontent.com/u/103854?v=4"},"body":"Skip that one.  I've just got aware that also qualified return types\nwon't work, e.g.,\n\n  private java.util.Date foo() {\n    ...\n  }\n\nso patch version v3 is unterway.\n\nBye,\nTassilo\n"}]}