{"thread":{"id":"63583","subject":"[GSoC PATCH 0/1] userdiff: add javascript diff driver","startedAt":"2025-06-04T09:41:42Z","lastAt":"2025-06-26T06:21:56Z","messageCount":11,"participants":["Derick W. de M. Frias","D. Ben Knoble","Johannes Sixt","Junio C Hamano"],"isPatch":true,"patchVersion":1,"patchTotal":1},"messages":[{"id":"519647","messageId":"20250604094100.80598-1-derick.william.moraes@gmail.com","threadId":"63583","inReplyTo":null,"subject":"[GSoC PATCH 0/1] userdiff: add javascript diff driver","fromName":"Derick W. de M. Frias","fromEmail":"derick.william.moraes@gmail.com","sentAt":"2025-06-04T09:35:45Z","receivedAt":"2025-06-04T09:41:42Z","isPatch":true,"sender":{"key":"derick.william.moraes@gmail.com","avatar":null},"body":"Hi, I'm Derick and this is one of my first contributions. I'm a CS\nundergrad student and I'm really excited to start learning more about\nGit's internals.\n\nAs it is in 2025, javascript is amongst the most prevalent programming\nlanguages and yet it it not beeing supported by a diff driver in Git.\nI do believe that the addition of this functionality is a good\ncontribution that will benefit tons of developers that work with\njavascript.\n\nFor me, it was a surprise to discover that javascript isn't supported\nyet, so the first thing that came to mind was if someone had already\ntried to work on the problem. Searching at Git's lore, I found some\nprevious atempts at tacking it and I tried to learn from them and to \nguide my work along what I believe were good paths taken.\n\nThe pattern I added to userdiff.c to recognize functions groups them in\nsome categories, that are: conventional functions (Those that are\ndeclared in outer scope, and not assigned to any variable), assigned\nfunctions (those that ARE assigned to a variable), arrow functions and\nfunctions declared inside classes or objects.\n\nFor js literals, the regex matches valid alphanumerical literals that\nare valid in javascript. It also matches numerical literals in binary,\noctal, decimal and hexadecimal bases, and punctuations.\n\nI also added test cases for instances of function declarations.\n\nI tried to keep things simple, my idea is to make it work well while\nthinking 'vanilla' javascript-first. I'm quite sure the contribution\nstill can be improved so I'm looking foward for feedback on what is\nimportant/interesting to be made.\n\nDerick W. de M. Frias (1):\n  userdiff: add javascript diff driver\n\n .../javascript-anonymous-function-assigned    |  4 +++\n t/t4018/javascript-arrow-function-assigned    |  4 +++\n t/t4018/javascript-arrow-function-assigned-2  |  1 +\n t/t4018/javascript-async-function             |  4 +++\n t/t4018/javascript-async-function-assigned    |  4 +++\n t/t4018/javascript-class-function             |  6 ++++\n t/t4018/javascript-function                   |  4 +++\n t/t4018/javascript-function-assigned          |  4 +++\n t/t4018/javascript-generator-function         |  5 ++++\n t/t4018/javascript-generator-function-2       |  5 ++++\n .../javascript-generator-function-assigned    |  5 ++++\n .../javascript-generator-function-assigned-2  |  5 ++++\n t/t4018/javascript-method-function            |  6 ++++\n userdiff.c                                    | 28 +++++++++++++++++++\n 14 files changed, 85 insertions(+)\n create mode 100644 t/t4018/javascript-anonymous-function-assigned\n create mode 100644 t/t4018/javascript-arrow-function-assigned\n create mode 100644 t/t4018/javascript-arrow-function-assigned-2\n create mode 100644 t/t4018/javascript-async-function\n create mode 100644 t/t4018/javascript-async-function-assigned\n create mode 100644 t/t4018/javascript-class-function\n create mode 100644 t/t4018/javascript-function\n create mode 100644 t/t4018/javascript-function-assigned\n create mode 100644 t/t4018/javascript-generator-function\n create mode 100644 t/t4018/javascript-generator-function-2\n create mode 100644 t/t4018/javascript-generator-function-assigned\n create mode 100644 t/t4018/javascript-generator-function-assigned-2\n create mode 100644 t/t4018/javascript-method-function\n\n-- \n2.50.0.rc0.62.g658f0ae201.dirty\n\n"},{"id":"519648","messageId":"20250604094100.80598-2-derick.william.moraes@gmail.com","threadId":"63583","inReplyTo":"20250604094100.80598-1-derick.william.moraes@gmail.com","subject":"[GSoC PATCH 1/1] userdiff: add javascript diff driver","fromName":"Derick W. de M. Frias","fromEmail":"derick.william.moraes@gmail.com","sentAt":"2025-06-04T09:35:46Z","receivedAt":"2025-06-04T09:41:44Z","isPatch":true,"sender":{"key":"derick.william.moraes@gmail.com","avatar":null},"body":"Add a userdiff pattern for javascript, and 13 test cases for instances\nof function declarations in javascript.\n\nSigned-off-by: Derick W. de M. Frias <derick.william.moraes@gmail.com>\n---\n .../javascript-anonymous-function-assigned    |  4 +++\n t/t4018/javascript-arrow-function-assigned    |  4 +++\n t/t4018/javascript-arrow-function-assigned-2  |  1 +\n t/t4018/javascript-async-function             |  4 +++\n t/t4018/javascript-async-function-assigned    |  4 +++\n t/t4018/javascript-class-function             |  6 ++++\n t/t4018/javascript-function                   |  4 +++\n t/t4018/javascript-function-assigned          |  4 +++\n t/t4018/javascript-generator-function         |  5 ++++\n t/t4018/javascript-generator-function-2       |  5 ++++\n .../javascript-generator-function-assigned    |  5 ++++\n .../javascript-generator-function-assigned-2  |  5 ++++\n t/t4018/javascript-method-function            |  6 ++++\n userdiff.c                                    | 28 +++++++++++++++++++\n 14 files changed, 85 insertions(+)\n create mode 100644 t/t4018/javascript-anonymous-function-assigned\n create mode 100644 t/t4018/javascript-arrow-function-assigned\n create mode 100644 t/t4018/javascript-arrow-function-assigned-2\n create mode 100644 t/t4018/javascript-async-function\n create mode 100644 t/t4018/javascript-async-function-assigned\n create mode 100644 t/t4018/javascript-class-function\n create mode 100644 t/t4018/javascript-function\n create mode 100644 t/t4018/javascript-function-assigned\n create mode 100644 t/t4018/javascript-generator-function\n create mode 100644 t/t4018/javascript-generator-function-2\n create mode 100644 t/t4018/javascript-generator-function-assigned\n create mode 100644 t/t4018/javascript-generator-function-assigned-2\n create mode 100644 t/t4018/javascript-method-function\n\ndiff --git a/t/t4018/javascript-anonymous-function-assigned b/t/t4018/javascript-anonymous-function-assigned\nnew file mode 100644\nindex 0000000000..d3c1728dd8\n--- /dev/null\n+++ b/t/t4018/javascript-anonymous-function-assigned\n@@ -0,0 +1,4 @@\n+const RIGHT = function (a, b) {\t\n+\n+    return a + b;\n+};\n\\ No newline at end of file\ndiff --git a/t/t4018/javascript-arrow-function-assigned b/t/t4018/javascript-arrow-function-assigned\nnew file mode 100644\nindex 0000000000..5f0b056f61\n--- /dev/null\n+++ b/t/t4018/javascript-arrow-function-assigned\n@@ -0,0 +1,4 @@\n+const RIGHT = (a, b) => {\n+\t\n+    return a + b;\n+};\n\\ No newline at end of file\ndiff --git a/t/t4018/javascript-arrow-function-assigned-2 b/t/t4018/javascript-arrow-function-assigned-2\nnew file mode 100644\nindex 0000000000..9e923f4261\n--- /dev/null\n+++ b/t/t4018/javascript-arrow-function-assigned-2\n@@ -0,0 +1 @@\n+const RIGHT = a => a+1;\n\\ No newline at end of file\ndiff --git a/t/t4018/javascript-async-function b/t/t4018/javascript-async-function\nnew file mode 100644\nindex 0000000000..7f99b8c89a\n--- /dev/null\n+++ b/t/t4018/javascript-async-function\n@@ -0,0 +1,4 @@\n+async function RIGHT (a, b) {\n+\t\n+    return a + b;\n+};\n\\ No newline at end of file\ndiff --git a/t/t4018/javascript-async-function-assigned b/t/t4018/javascript-async-function-assigned\nnew file mode 100644\nindex 0000000000..9a01d9701f\n--- /dev/null\n+++ b/t/t4018/javascript-async-function-assigned\n@@ -0,0 +1,4 @@\n+const RIGHT = async function (a, b) {\n+\t\n+    return a + b;\n+};\n\\ No newline at end of file\ndiff --git a/t/t4018/javascript-class-function b/t/t4018/javascript-class-function\nnew file mode 100644\nindex 0000000000..9f216d7174\n--- /dev/null\n+++ b/t/t4018/javascript-class-function\n@@ -0,0 +1,6 @@\n+class Test {\n+  RIGHT() {\n+    let a = 1;\n+    let b = Value;\n+  }\n+}\n\\ No newline at end of file\ndiff --git a/t/t4018/javascript-function b/t/t4018/javascript-function\nnew file mode 100644\nindex 0000000000..d11ad34aff\n--- /dev/null\n+++ b/t/t4018/javascript-function\n@@ -0,0 +1,4 @@\n+function RIGHT (a, b) {\n+\t\n+    return a + b;\n+};\n\\ No newline at end of file\ndiff --git a/t/t4018/javascript-function-assigned b/t/t4018/javascript-function-assigned\nnew file mode 100644\nindex 0000000000..38eaecafc6\n--- /dev/null\n+++ b/t/t4018/javascript-function-assigned\n@@ -0,0 +1,4 @@\n+const RIGHT = function test (a, b) {\n+\t\n+    return a + b;\n+};\n\\ No newline at end of file\ndiff --git a/t/t4018/javascript-generator-function b/t/t4018/javascript-generator-function\nnew file mode 100644\nindex 0000000000..af7cbb50a3\n--- /dev/null\n+++ b/t/t4018/javascript-generator-function\n@@ -0,0 +1,5 @@\n+function* RIGHT() {\n+  \n+  yield 1;\n+  yield 2;\n+}\n\\ No newline at end of file\ndiff --git a/t/t4018/javascript-generator-function-2 b/t/t4018/javascript-generator-function-2\nnew file mode 100644\nindex 0000000000..d40b395f5c\n--- /dev/null\n+++ b/t/t4018/javascript-generator-function-2\n@@ -0,0 +1,5 @@\n+function *RIGHT() {\n+  \n+  yield 1;\n+  yield 2;\n+}\n\\ No newline at end of file\ndiff --git a/t/t4018/javascript-generator-function-assigned b/t/t4018/javascript-generator-function-assigned\nnew file mode 100644\nindex 0000000000..b45d069949\n--- /dev/null\n+++ b/t/t4018/javascript-generator-function-assigned\n@@ -0,0 +1,5 @@\n+const RIGHT = function* (){\n+  \n+  yield 1;\n+  yield 2;\n+}\n\\ No newline at end of file\ndiff --git a/t/t4018/javascript-generator-function-assigned-2 b/t/t4018/javascript-generator-function-assigned-2\nnew file mode 100644\nindex 0000000000..2c4bc271ab\n--- /dev/null\n+++ b/t/t4018/javascript-generator-function-assigned-2\n@@ -0,0 +1,5 @@\n+const RIGHT = function *(){\n+  \n+  yield 1;\n+  yield 2;\n+}\n\\ No newline at end of file\ndiff --git a/t/t4018/javascript-method-function b/t/t4018/javascript-method-function\nnew file mode 100644\nindex 0000000000..37e380cc6f\n--- /dev/null\n+++ b/t/t4018/javascript-method-function\n@@ -0,0 +1,6 @@\n+const Test = {\n+  RIGHT() {\n+    let a = 1;\n+    let b = Value;\n+  }\n+}\n\\ No newline at end of file\ndiff --git a/userdiff.c b/userdiff.c\nindex 05776ccd10..94134e5b09 100644\n--- a/userdiff.c\n+++ b/userdiff.c\n@@ -237,6 +237,34 @@ PATTERNS(\"java\",\n \t \"|[-+0-9.e]+[fFlL]?|0[xXbB]?[0-9a-fA-F]+[lL]?\"\n \t \"|[-+*/<>%&^|=!]=\"\n \t \"|--|\\\\+\\\\+|<<=?|>>>?=?|&&|\\\\|\\\\|\"),\n+PATTERNS(\"javascript\",\n+     /* conventional named functions */\n+     \"^[ \\t]*(async[ \\t]+)?function[ \\t]*\\\\*?[ \\t]*([$_a-zA-Z][$_a-zA-Z0-9]*)[ \\t]*\\\\(.*$|\"\n+     /* assigned functions */\n+     \"^[ \\t]*(const|let|var)[ \\t]+([$_a-zA-Z][$_a-zA-Z0-9]*)[ \\t]*=\"\n+     \"[ \\t]*(async[ \\t]+)?function[ \\t]*\\\\*?[ \\t]*([$_a-zA-Z][$_a-zA-Z0-9]*)?[ \\t]*\\\\(.*$|\"\n+     /* arrow functions */\n+     \"^[ \\t]*(const|let|var)[ \\t]+([$_a-zA-Z][$_a-zA-Z0-9]*)[ \\t]*=\"\n+     \"[ \\t]*(\\\\([^\\\\)]*\\\\)|[$_a-zA-Z][$_a-zA-Z0-9]*)[ \\t]*=>[ \\t]*\\\\{?.*$|\"\n+     /* functions declared inside classes and objects */\n+     \"^[ \\t]*(static[ \\t]+)?(async[ \\t]+)?(get[ \\t]+|set[ \\t]+)?\\\\*?[ \\t]*\"\n+     \"([$_a-zA-Z][$_a-zA-Z0-9]*)[ \\t]*\\\\([^)]*\\\\)[ \\t]*\\\\{.*$\",\n+     /* identifiers */\n+\t \"[$_A-Za-z][$_A-Za-z0-9]*|\"\n+     /* hexadecimal and big hexadecimal */\n+     \"0[xX](?:[0-9a-fA-F](?:_?[0-9a-fA-F])*)n?|\"\n+     /* octa and big octa */\n+     \"0[oO](?:[0-7](?:_?[0-7])*)n?|\"\n+     /* binary and big binary */\n+     \"0[bB](?:[01](?:_?[01])*)n?|\"\n+     /* decimal, floting point and exponent notation (eE) */\n+     \"(?:0|[1-9](?:_?[0-9])*)(?:\\\\.(?:[0-9](?:_?[0-9])*))?(?:[eE][+-]?(?:[0-9](?:_?[0-9])*))?|\"\n+     /* big decimal */\n+     \"(?:0|[1-9](?:_?[0-9])*)n|\"\n+\t /* punctuation */\n+\t \"\\\\{|\\\\}|\\\\(|\\\\)|\\\\.|\\\\.{3}|;|,|<|>|<=|>=|==|!=|={3}|!==|\\\\+|-|\\\\*|/|%|\\\\*{2}|\"\n+\t \"\\\\+{2}|--|<<|>>|>>>|&|\\\\||\\\\^|!|~|&&|\\\\|{2}|\\\\?{1,2}|:|=|\\\\+=|-=|\\\\*=|%=|\\\\*{2}=|\"\n+\t \"<<=|>>=|>>>=|&=|\\\\|=|\\\\^=|&&=|\\\\|{2}=|\\\\?{2}=|=>\"),\n PATTERNS(\"kotlin\",\n \t \"^[ \\t]*(([a-z]+[ \\t]+)*(fun|class|interface)[ \\t]+.*)$\",\n \t /* -- */\n-- \n2.50.0.rc0.62.g658f0ae201.dirty\n\n"},{"id":"519698","messageId":"CALnO6CBx0ZBXXq9wX_T_YPUYjJESTR28WX-DG5d351FBA2py9g@mail.gmail.com","threadId":"63583","inReplyTo":"20250604094100.80598-2-derick.william.moraes@gmail.com","subject":"Re: [GSoC PATCH 1/1] userdiff: add javascript diff driver","fromName":"D. Ben Knoble","fromEmail":"ben.knoble@gmail.com","sentAt":"2025-06-04T21:19:52Z","receivedAt":"2025-06-04T21:20:05Z","isPatch":true,"sender":{"key":"ben.knoble@gmail.com","avatar":"https://avatars.githubusercontent.com/u/22802209?v=4"},"body":"On Wed, Jun 4, 2025 at 5:44 AM Derick W. de M. Frias\n<derick.william.moraes@gmail.com> wrote:\n>\n> Add a userdiff pattern for javascript, and 13 test cases for instances\n> of function declarations in javascript.\n\nI didn't see any test cases dealing with nested functions, which might\nadd some value?\n\n>\n> Signed-off-by: Derick W. de M. Frias <derick.william.moraes@gmail.com>\n> ---\n>  .../javascript-anonymous-function-assigned    |  4 +++\n>  t/t4018/javascript-arrow-function-assigned    |  4 +++\n>  t/t4018/javascript-arrow-function-assigned-2  |  1 +\n>  t/t4018/javascript-async-function             |  4 +++\n>  t/t4018/javascript-async-function-assigned    |  4 +++\n>  t/t4018/javascript-class-function             |  6 ++++\n>  t/t4018/javascript-function                   |  4 +++\n>  t/t4018/javascript-function-assigned          |  4 +++\n>  t/t4018/javascript-generator-function         |  5 ++++\n>  t/t4018/javascript-generator-function-2       |  5 ++++\n>  .../javascript-generator-function-assigned    |  5 ++++\n>  .../javascript-generator-function-assigned-2  |  5 ++++\n>  t/t4018/javascript-method-function            |  6 ++++\n>  userdiff.c                                    | 28 +++++++++++++++++++\n>  14 files changed, 85 insertions(+)\n>  create mode 100644 t/t4018/javascript-anonymous-function-assigned\n>  create mode 100644 t/t4018/javascript-arrow-function-assigned\n>  create mode 100644 t/t4018/javascript-arrow-function-assigned-2\n>  create mode 100644 t/t4018/javascript-async-function\n>  create mode 100644 t/t4018/javascript-async-function-assigned\n>  create mode 100644 t/t4018/javascript-class-function\n>  create mode 100644 t/t4018/javascript-function\n>  create mode 100644 t/t4018/javascript-function-assigned\n>  create mode 100644 t/t4018/javascript-generator-function\n>  create mode 100644 t/t4018/javascript-generator-function-2\n>  create mode 100644 t/t4018/javascript-generator-function-assigned\n>  create mode 100644 t/t4018/javascript-generator-function-assigned-2\n>  create mode 100644 t/t4018/javascript-method-function\n>\n> diff --git a/t/t4018/javascript-anonymous-function-assigned b/t/t4018/javascript-anonymous-function-assigned\n> new file mode 100644\n> index 0000000000..d3c1728dd8\n> --- /dev/null\n> +++ b/t/t4018/javascript-anonymous-function-assigned\n> @@ -0,0 +1,4 @@\n> +const RIGHT = function (a, b) {\n> +\n> +    return a + b;\n> +};\n> \\ No newline at end of file\n\nNotice these files don't match the *nix convention of having a newline\nat the end. I find that some editors like VS Code have broken defaults\n[1] and require a settings change to get this correct, but notably\nGit's diff machinery will reliably warn you.\n\n[1]: https://stackoverflow.com/q/44704968/4400820\n\n> diff --git a/t/t4018/javascript-arrow-function-assigned b/t/t4018/javascript-arrow-function-assigned\n> new file mode 100644\n> index 0000000000..5f0b056f61\n> --- /dev/null\n> +++ b/t/t4018/javascript-arrow-function-assigned\n> @@ -0,0 +1,4 @@\n> +const RIGHT = (a, b) => {\n> +\n> +    return a + b;\n> +};\n> \\ No newline at end of file\n> diff --git a/t/t4018/javascript-arrow-function-assigned-2 b/t/t4018/javascript-arrow-function-assigned-2\n> new file mode 100644\n> index 0000000000..9e923f4261\n> --- /dev/null\n> +++ b/t/t4018/javascript-arrow-function-assigned-2\n> @@ -0,0 +1 @@\n> +const RIGHT = a => a+1;\n> \\ No newline at end of file\n> diff --git a/t/t4018/javascript-async-function b/t/t4018/javascript-async-function\n> new file mode 100644\n> index 0000000000..7f99b8c89a\n> --- /dev/null\n> +++ b/t/t4018/javascript-async-function\n> @@ -0,0 +1,4 @@\n> +async function RIGHT (a, b) {\n> +\n> +    return a + b;\n> +};\n> \\ No newline at end of file\n> diff --git a/t/t4018/javascript-async-function-assigned b/t/t4018/javascript-async-function-assigned\n> new file mode 100644\n> index 0000000000..9a01d9701f\n> --- /dev/null\n> +++ b/t/t4018/javascript-async-function-assigned\n> @@ -0,0 +1,4 @@\n> +const RIGHT = async function (a, b) {\n> +\n> +    return a + b;\n> +};\n> \\ No newline at end of file\n> diff --git a/t/t4018/javascript-class-function b/t/t4018/javascript-class-function\n> new file mode 100644\n> index 0000000000..9f216d7174\n> --- /dev/null\n> +++ b/t/t4018/javascript-class-function\n> @@ -0,0 +1,6 @@\n> +class Test {\n> +  RIGHT() {\n> +    let a = 1;\n> +    let b = Value;\n> +  }\n> +}\n> \\ No newline at end of file\n> diff --git a/t/t4018/javascript-function b/t/t4018/javascript-function\n> new file mode 100644\n> index 0000000000..d11ad34aff\n> --- /dev/null\n> +++ b/t/t4018/javascript-function\n> @@ -0,0 +1,4 @@\n> +function RIGHT (a, b) {\n> +\n> +    return a + b;\n> +};\n> \\ No newline at end of file\n> diff --git a/t/t4018/javascript-function-assigned b/t/t4018/javascript-function-assigned\n> new file mode 100644\n> index 0000000000..38eaecafc6\n> --- /dev/null\n> +++ b/t/t4018/javascript-function-assigned\n> @@ -0,0 +1,4 @@\n> +const RIGHT = function test (a, b) {\n> +\n> +    return a + b;\n> +};\n> \\ No newline at end of file\n> diff --git a/t/t4018/javascript-generator-function b/t/t4018/javascript-generator-function\n> new file mode 100644\n> index 0000000000..af7cbb50a3\n> --- /dev/null\n> +++ b/t/t4018/javascript-generator-function\n> @@ -0,0 +1,5 @@\n> +function* RIGHT() {\n> +\n> +  yield 1;\n> +  yield 2;\n> +}\n> \\ No newline at end of file\n> diff --git a/t/t4018/javascript-generator-function-2 b/t/t4018/javascript-generator-function-2\n> new file mode 100644\n> index 0000000000..d40b395f5c\n> --- /dev/null\n> +++ b/t/t4018/javascript-generator-function-2\n> @@ -0,0 +1,5 @@\n> +function *RIGHT() {\n> +\n> +  yield 1;\n> +  yield 2;\n> +}\n> \\ No newline at end of file\n> diff --git a/t/t4018/javascript-generator-function-assigned b/t/t4018/javascript-generator-function-assigned\n> new file mode 100644\n> index 0000000000..b45d069949\n> --- /dev/null\n> +++ b/t/t4018/javascript-generator-function-assigned\n> @@ -0,0 +1,5 @@\n> +const RIGHT = function* (){\n> +\n> +  yield 1;\n> +  yield 2;\n> +}\n> \\ No newline at end of file\n> diff --git a/t/t4018/javascript-generator-function-assigned-2 b/t/t4018/javascript-generator-function-assigned-2\n> new file mode 100644\n> index 0000000000..2c4bc271ab\n> --- /dev/null\n> +++ b/t/t4018/javascript-generator-function-assigned-2\n> @@ -0,0 +1,5 @@\n> +const RIGHT = function *(){\n> +\n> +  yield 1;\n> +  yield 2;\n> +}\n> \\ No newline at end of file\n> diff --git a/t/t4018/javascript-method-function b/t/t4018/javascript-method-function\n> new file mode 100644\n> index 0000000000..37e380cc6f\n> --- /dev/null\n> +++ b/t/t4018/javascript-method-function\n> @@ -0,0 +1,6 @@\n> +const Test = {\n> +  RIGHT() {\n> +    let a = 1;\n> +    let b = Value;\n> +  }\n> +}\n> \\ No newline at end of file\n> diff --git a/userdiff.c b/userdiff.c\n> index 05776ccd10..94134e5b09 100644\n> --- a/userdiff.c\n> +++ b/userdiff.c\n> @@ -237,6 +237,34 @@ PATTERNS(\"java\",\n>          \"|[-+0-9.e]+[fFlL]?|0[xXbB]?[0-9a-fA-F]+[lL]?\"\n>          \"|[-+*/<>%&^|=!]=\"\n>          \"|--|\\\\+\\\\+|<<=?|>>>?=?|&&|\\\\|\\\\|\"),\n> +PATTERNS(\"javascript\",\n> +     /* conventional named functions */\n> +     \"^[ \\t]*(async[ \\t]+)?function[ \\t]*\\\\*?[ \\t]*([$_a-zA-Z][$_a-zA-Z0-9]*)[ \\t]*\\\\(.*$|\"\n> +     /* assigned functions */\n> +     \"^[ \\t]*(const|let|var)[ \\t]+([$_a-zA-Z][$_a-zA-Z0-9]*)[ \\t]*=\"\n> +     \"[ \\t]*(async[ \\t]+)?function[ \\t]*\\\\*?[ \\t]*([$_a-zA-Z][$_a-zA-Z0-9]*)?[ \\t]*\\\\(.*$|\"\n> +     /* arrow functions */\n> +     \"^[ \\t]*(const|let|var)[ \\t]+([$_a-zA-Z][$_a-zA-Z0-9]*)[ \\t]*=\"\n> +     \"[ \\t]*(\\\\([^\\\\)]*\\\\)|[$_a-zA-Z][$_a-zA-Z0-9]*)[ \\t]*=>[ \\t]*\\\\{?.*$|\"\n> +     /* functions declared inside classes and objects */\n> +     \"^[ \\t]*(static[ \\t]+)?(async[ \\t]+)?(get[ \\t]+|set[ \\t]+)?\\\\*?[ \\t]*\"\n\nI didn't see any test cases using these modifiers, either, not that we\nhave to test 100% of all cases.\n\n> +     \"([$_a-zA-Z][$_a-zA-Z0-9]*)[ \\t]*\\\\([^)]*\\\\)[ \\t]*\\\\{.*$\",\n> +     /* identifiers */\n> +        \"[$_A-Za-z][$_A-Za-z0-9]*|\"\n> +     /* hexadecimal and big hexadecimal */\n> +     \"0[xX](?:[0-9a-fA-F](?:_?[0-9a-fA-F])*)n?|\"\n> +     /* octa and big octa */\n> +     \"0[oO](?:[0-7](?:_?[0-7])*)n?|\"\n> +     /* binary and big binary */\n> +     \"0[bB](?:[01](?:_?[01])*)n?|\"\n> +     /* decimal, floting point and exponent notation (eE) */\n> +     \"(?:0|[1-9](?:_?[0-9])*)(?:\\\\.(?:[0-9](?:_?[0-9])*))?(?:[eE][+-]?(?:[0-9](?:_?[0-9])*))?|\"\n> +     /* big decimal */\n> +     \"(?:0|[1-9](?:_?[0-9])*)n|\"\n> +        /* punctuation */\n> +        \"\\\\{|\\\\}|\\\\(|\\\\)|\\\\.|\\\\.{3}|;|,|<|>|<=|>=|==|!=|={3}|!==|\\\\+|-|\\\\*|/|%|\\\\*{2}|\"\n> +        \"\\\\+{2}|--|<<|>>|>>>|&|\\\\||\\\\^|!|~|&&|\\\\|{2}|\\\\?{1,2}|:|=|\\\\+=|-=|\\\\*=|%=|\\\\*{2}=|\"\n> +        \"<<=|>>=|>>>=|&=|\\\\|=|\\\\^=|&&=|\\\\|{2}=|\\\\?{2}=|=>\"),\n>  PATTERNS(\"kotlin\",\n>          \"^[ \\t]*(([a-z]+[ \\t]+)*(fun|class|interface)[ \\t]+.*)$\",\n>          /* -- */\n> --\n> 2.50.0.rc0.62.g658f0ae201.dirty\n>\n>\n\n\n-- \nD. Ben Knoble\n"},{"id":"519708","messageId":"4deb24c2-98f2-40f8-b50c-c74485ebc10d@kdbg.org","threadId":"63583","inReplyTo":"20250604094100.80598-2-derick.william.moraes@gmail.com","subject":"Re: [GSoC PATCH 1/1] userdiff: add javascript diff driver","fromName":"Johannes Sixt","fromEmail":"j6t@kdbg.org","sentAt":"2025-06-05T05:51:05Z","receivedAt":"2025-06-05T05:51:21Z","isPatch":true,"sender":{"key":"j6t@kdbg.org","avatar":"https://avatars.githubusercontent.com/u/14810926?v=4"},"body":"Thank you for your contribution. We have had a number of submissions for\nJavascript or Typescript drivers in the past, but none of them were\nfollowed through to be integrated.\n\nTypescript:\n\nhttps://lore.kernel.org/git/20240404163827.5855-1-utsavp0213@gmail.com/\nhttps://lore.kernel.org/git/pull.1746.git.git.1721061218993.gitgitgadget@gmail.com/\n\nJavascript:\n\nhttps://lore.kernel.org/git/20240301074048.188835-1-sergiusnyah@gmail.com/\nhttps://lore.kernel.org/git/20220403132508.28196-1-a97410985new@gmail.com/\n\nPlease review these submission and the responses that they received.\nPerhaps you can find inspiration for improvement from them.\n\nSince this patch is marked as [GSoC], I'll comment on the style a bit,\nbut do not go into the depth of the patch itself too far, yet. Please\nlet us know if one of the earlier submissions can be revived or reused\nin some way.\n\nAm 04.06.25 um 11:35 schrieb Derick W. de M. Frias:\n> Add a userdiff pattern for javascript, and 13 test cases for instances\n> of function declarations in javascript.\n\nThis is written in imperative mood, which is good. A minor\nrecommendation: Don't mention the number of test cases here; it might go\nstale if the patch is updated.\n\n> \n> Signed-off-by: Derick W. de M. Frias <derick.william.moraes@gmail.com>\n> ---\n>  .../javascript-anonymous-function-assigned    |  4 +++\n>  t/t4018/javascript-arrow-function-assigned    |  4 +++\n>  t/t4018/javascript-arrow-function-assigned-2  |  1 +\n>  t/t4018/javascript-async-function             |  4 +++\n>  t/t4018/javascript-async-function-assigned    |  4 +++\n>  t/t4018/javascript-class-function             |  6 ++++\n>  t/t4018/javascript-function                   |  4 +++\n>  t/t4018/javascript-function-assigned          |  4 +++\n>  t/t4018/javascript-generator-function         |  5 ++++\n>  t/t4018/javascript-generator-function-2       |  5 ++++\n>  .../javascript-generator-function-assigned    |  5 ++++\n>  .../javascript-generator-function-assigned-2  |  5 ++++\n>  t/t4018/javascript-method-function            |  6 ++++\n>  userdiff.c                                    | 28 +++++++++++++++++++\n>  14 files changed, 85 insertions(+)\n>  create mode 100644 t/t4018/javascript-anonymous-function-assigned\n>  create mode 100644 t/t4018/javascript-arrow-function-assigned\n>  create mode 100644 t/t4018/javascript-arrow-function-assigned-2\n>  create mode 100644 t/t4018/javascript-async-function\n>  create mode 100644 t/t4018/javascript-async-function-assigned\n>  create mode 100644 t/t4018/javascript-class-function\n>  create mode 100644 t/t4018/javascript-function\n>  create mode 100644 t/t4018/javascript-function-assigned\n>  create mode 100644 t/t4018/javascript-generator-function\n>  create mode 100644 t/t4018/javascript-generator-function-2\n>  create mode 100644 t/t4018/javascript-generator-function-assigned\n>  create mode 100644 t/t4018/javascript-generator-function-assigned-2\n>  create mode 100644 t/t4018/javascript-method-function\n> \n> diff --git a/t/t4018/javascript-anonymous-function-assigned b/t/t4018/javascript-anonymous-function-assigned\n> new file mode 100644\n> index 0000000000..d3c1728dd8\n> --- /dev/null\n> +++ b/t/t4018/javascript-anonymous-function-assigned\n> @@ -0,0 +1,4 @@\n> +const RIGHT = function (a, b) {\t\n> +\n> +    return a + b;\n> +};\n> \\ No newline at end of file\n\nWe avoid incomplete last lines in this code base if it is not mandated\nfor some reason.\n\nHere and in the later test cases, the word \"ChangeMe\" is missing. How\ndid these ever pass the tests?\n\n> diff --git a/t/t4018/javascript-arrow-function-assigned b/t/t4018/javascript-arrow-function-assigned\n> new file mode 100644\n> index 0000000000..5f0b056f61\n> --- /dev/null\n> +++ b/t/t4018/javascript-arrow-function-assigned\n> @@ -0,0 +1,4 @@\n> +const RIGHT = (a, b) => {\n> +\t\n> +    return a + b;\n> +};\n> \\ No newline at end of file\n> diff --git a/t/t4018/javascript-arrow-function-assigned-2 b/t/t4018/javascript-arrow-function-assigned-2\n> new file mode 100644\n> index 0000000000..9e923f4261\n> --- /dev/null\n> +++ b/t/t4018/javascript-arrow-function-assigned-2\n> @@ -0,0 +1 @@\n> +const RIGHT = a => a+1;\n> \\ No newline at end of file\n> diff --git a/t/t4018/javascript-async-function b/t/t4018/javascript-async-function\n> new file mode 100644\n> index 0000000000..7f99b8c89a\n> --- /dev/null\n> +++ b/t/t4018/javascript-async-function\n> @@ -0,0 +1,4 @@\n> +async function RIGHT (a, b) {\n> +\t\n> +    return a + b;\n> +};\n> \\ No newline at end of file\n> diff --git a/t/t4018/javascript-async-function-assigned b/t/t4018/javascript-async-function-assigned\n> new file mode 100644\n> index 0000000000..9a01d9701f\n> --- /dev/null\n> +++ b/t/t4018/javascript-async-function-assigned\n> @@ -0,0 +1,4 @@\n> +const RIGHT = async function (a, b) {\n> +\t\n> +    return a + b;\n> +};\n> \\ No newline at end of file\n> diff --git a/t/t4018/javascript-class-function b/t/t4018/javascript-class-function\n> new file mode 100644\n> index 0000000000..9f216d7174\n> --- /dev/null\n> +++ b/t/t4018/javascript-class-function\n> @@ -0,0 +1,6 @@\n> +class Test {\n> +  RIGHT() {\n> +    let a = 1;\n> +    let b = Value;\n> +  }\n> +}\n> \\ No newline at end of file\n> diff --git a/t/t4018/javascript-function b/t/t4018/javascript-function\n> new file mode 100644\n> index 0000000000..d11ad34aff\n> --- /dev/null\n> +++ b/t/t4018/javascript-function\n> @@ -0,0 +1,4 @@\n> +function RIGHT (a, b) {\n> +\t\n> +    return a + b;\n> +};\n> \\ No newline at end of file\n> diff --git a/t/t4018/javascript-function-assigned b/t/t4018/javascript-function-assigned\n> new file mode 100644\n> index 0000000000..38eaecafc6\n> --- /dev/null\n> +++ b/t/t4018/javascript-function-assigned\n> @@ -0,0 +1,4 @@\n> +const RIGHT = function test (a, b) {\n> +\t\n> +    return a + b;\n> +};\n> \\ No newline at end of file\n> diff --git a/t/t4018/javascript-generator-function b/t/t4018/javascript-generator-function\n> new file mode 100644\n> index 0000000000..af7cbb50a3\n> --- /dev/null\n> +++ b/t/t4018/javascript-generator-function\n> @@ -0,0 +1,5 @@\n> +function* RIGHT() {\n> +  \n> +  yield 1;\n> +  yield 2;\n> +}\n> \\ No newline at end of file\n> diff --git a/t/t4018/javascript-generator-function-2 b/t/t4018/javascript-generator-function-2\n> new file mode 100644\n> index 0000000000..d40b395f5c\n> --- /dev/null\n> +++ b/t/t4018/javascript-generator-function-2\n> @@ -0,0 +1,5 @@\n> +function *RIGHT() {\n> +  \n> +  yield 1;\n> +  yield 2;\n> +}\n> \\ No newline at end of file\n> diff --git a/t/t4018/javascript-generator-function-assigned b/t/t4018/javascript-generator-function-assigned\n> new file mode 100644\n> index 0000000000..b45d069949\n> --- /dev/null\n> +++ b/t/t4018/javascript-generator-function-assigned\n> @@ -0,0 +1,5 @@\n> +const RIGHT = function* (){\n> +  \n> +  yield 1;\n> +  yield 2;\n> +}\n> \\ No newline at end of file\n> diff --git a/t/t4018/javascript-generator-function-assigned-2 b/t/t4018/javascript-generator-function-assigned-2\n> new file mode 100644\n> index 0000000000..2c4bc271ab\n> --- /dev/null\n> +++ b/t/t4018/javascript-generator-function-assigned-2\n> @@ -0,0 +1,5 @@\n> +const RIGHT = function *(){\n> +  \n> +  yield 1;\n> +  yield 2;\n> +}\n> \\ No newline at end of file\n> diff --git a/t/t4018/javascript-method-function b/t/t4018/javascript-method-function\n> new file mode 100644\n> index 0000000000..37e380cc6f\n> --- /dev/null\n> +++ b/t/t4018/javascript-method-function\n> @@ -0,0 +1,6 @@\n> +const Test = {\n> +  RIGHT() {\n> +    let a = 1;\n> +    let b = Value;\n> +  }\n> +}\n> \\ No newline at end of file\n> diff --git a/userdiff.c b/userdiff.c\n> index 05776ccd10..94134e5b09 100644\n> --- a/userdiff.c\n> +++ b/userdiff.c\n> @@ -237,6 +237,34 @@ PATTERNS(\"java\",\n>  \t \"|[-+0-9.e]+[fFlL]?|0[xXbB]?[0-9a-fA-F]+[lL]?\"\n>  \t \"|[-+*/<>%&^|=!]=\"\n>  \t \"|--|\\\\+\\\\+|<<=?|>>>?=?|&&|\\\\|\\\\|\"),\n> +PATTERNS(\"javascript\",\n\nThe following lines are indented by spaces. We use TAB here.\n\n> +     /* conventional named functions */\n> +     \"^[ \\t]*(async[ \\t]+)?function[ \\t]*\\\\*?[ \\t]*([$_a-zA-Z][$_a-zA-Z0-9]*)[ \\t]*\\\\(.*$|\"\n> +     /* assigned functions */\n> +     \"^[ \\t]*(const|let|var)[ \\t]+([$_a-zA-Z][$_a-zA-Z0-9]*)[ \\t]*=\"\n> +     \"[ \\t]*(async[ \\t]+)?function[ \\t]*\\\\*?[ \\t]*([$_a-zA-Z][$_a-zA-Z0-9]*)?[ \\t]*\\\\(.*$|\"\n> +     /* arrow functions */\n> +     \"^[ \\t]*(const|let|var)[ \\t]+([$_a-zA-Z][$_a-zA-Z0-9]*)[ \\t]*=\"\n> +     \"[ \\t]*(\\\\([^\\\\)]*\\\\)|[$_a-zA-Z][$_a-zA-Z0-9]*)[ \\t]*=>[ \\t]*\\\\{?.*$|\"\n> +     /* functions declared inside classes and objects */\n> +     \"^[ \\t]*(static[ \\t]+)?(async[ \\t]+)?(get[ \\t]+|set[ \\t]+)?\\\\*?[ \\t]*\"\n> +     \"([$_a-zA-Z][$_a-zA-Z0-9]*)[ \\t]*\\\\([^)]*\\\\)[ \\t]*\\\\{.*$\",\n> +     /* identifiers */\n> +\t \"[$_A-Za-z][$_A-Za-z0-9]*|\"\n> +     /* hexadecimal and big hexadecimal */\n> +     \"0[xX](?:[0-9a-fA-F](?:_?[0-9a-fA-F])*)n?|\"\n> +     /* octa and big octa */\n> +     \"0[oO](?:[0-7](?:_?[0-7])*)n?|\"\n> +     /* binary and big binary */\n> +     \"0[bB](?:[01](?:_?[01])*)n?|\"\n> +     /* decimal, floting point and exponent notation (eE) */\n> +     \"(?:0|[1-9](?:_?[0-9])*)(?:\\\\.(?:[0-9](?:_?[0-9])*))?(?:[eE][+-]?(?:[0-9](?:_?[0-9])*))?|\"\n> +     /* big decimal */\n> +     \"(?:0|[1-9](?:_?[0-9])*)n|\"\n> +\t /* punctuation */\n> +\t \"\\\\{|\\\\}|\\\\(|\\\\)|\\\\.|\\\\.{3}|;|,|<|>|<=|>=|==|!=|={3}|!==|\\\\+|-|\\\\*|/|%|\\\\*{2}|\"\n> +\t \"\\\\+{2}|--|<<|>>|>>>|&|\\\\||\\\\^|!|~|&&|\\\\|{2}|\\\\?{1,2}|:|=|\\\\+=|-=|\\\\*=|%=|\\\\*{2}=|\"\n> +\t \"<<=|>>=|>>>=|&=|\\\\|=|\\\\^=|&&=|\\\\|{2}=|\\\\?{2}=|=>\"),\n\nYou do not have to include single-character punctuation; these are\nrecognized as words automatically.\n\nPersonally I prefer |===| over |={3}| (and similar for the others)\nbecause it is easier to understand.\n\n>  PATTERNS(\"kotlin\",\n>  \t \"^[ \\t]*(([a-z]+[ \\t]+)*(fun|class|interface)[ \\t]+.*)$\",\n>  \t /* -- */\n\n-- Hannes\n\n"},{"id":"520553","messageId":"20250623090538.154858-1-derick.william.moraes@gmail.com","threadId":"63583","inReplyTo":"4deb24c2-98f2-40f8-b50c-c74485ebc10d@kdbg.org","subject":"[PATCH v2 0/4] diff: create pattern for javascript language","fromName":"Derick W. de M. Frias","fromEmail":"derick.william.moraes@gmail.com","sentAt":"2025-06-23T06:35:45Z","receivedAt":"2025-06-23T09:06:03Z","isPatch":true,"sender":{"key":"derick.william.moraes@gmail.com","avatar":null},"body":"I'm sending a new version of the diff driver. I tried to expand\nrecognition of functions to more possible cases, improved tests in\nt4018 for function matching of the pattern and tried to add test \nt4034 for the matching of words.\n\nI added a lot more test for t4018, so much that I got caught up if I \nwas exaggerating. I was not trying to exhaust all possibilities, I just think\nthat javascript has a lot of different valid syntaxes for declaring\nfunctions and I was trying to make a somewhat complete coverage of that.\nLet me know if perhaps I'm going too far along this direction.\n\nI also tried to incorporate your feedbacks, thanks! \n\n> Thank you for your contribution. We have had a number of submissions for\n> Javascript or Typescript drivers in the past, but none of them were\n> followed through to be integrated.\n\n> Typescript:\n\n> https://lore.kernel.org/git/20240404163827.5855-1-utsavp0213@gmail.com/\n> https://lore.kernel.org/git/pull.1746.git.git.1721061218993.gitgitgadget@gmail.com/\n\n> Javascript:\n\n> https://lore.kernel.org/git/20240301074048.188835-1-sergiusnyah@gmail.com/\n> https://lore.kernel.org/git/20220403132508.28196-1-a97410985new@gmail.com/\n\n> Please review these submission and the responses that they received.\n> Perhaps you can find inspiration for improvement from them.\n\nIt has beeing great fun :)! I took a deep dive into the suggested\nsubmissions. For clarity purposes, I'll be addressing them for the\nfollowing index, and sometimes for the contributor's name: \n\n[1] Utsav Parmar: https://lore.kernel.org/git/20240404163827.5855-1-utsavp0213@gmail.com/\n[2] Mattew Hughes: https://lore.kernel.org/git/pull.1746.git.git.1721061218993.gitgitgadget@gmail.com/\n[3] Sergius Nyah: https://lore.kernel.org/git/20240301074048.188835-1-sergiusnyah@gmail.com/\n[4] Xing Zhi Jiang: https://lore.kernel.org/git/20220403132508.28196-1-a97410985new@gmail.com/\n\nFrom contributions [1], [2] and [3] I did not found many things that are\nworth noting. \n\nPrevious to sending the v1, I had already searched through the lore and\nstumbled across Xing Zhi Jiang's[4] contribution. He had a lot of things\nworked out, including well recognized nested functions, that is\nsomething still not supported here in v2. Also the discutions around it\nbrought up interesting points that I took into consideration:\n\n- ESModules syntax for exporting functions (export function FUNCNAME...)\n- 'exports.' and 'module.exports.' syntax from commonJS.\n- What should and what should not be supported.\n\nI called 'vanillaJS' javascript as it is defined by ECMAScript's specs,\nor what you will find if you are working with JS without things like\nReact, Vue, jQuery, Axios. I noticed that I used this term in the last\nsubmission but had not explained what I was talking about. There I said\nI wanted to be \"vanillaJS\" first, as I believe ECMAs specs should be the \nfocal point of a tool like this one.\n\nThis is important, because some things that live outside 'vanillaJS', like\n'commonJS' for example, which is a thing in Node, add syntax to valid\nfunction declarations in their own context. Exhausting those syntaxes might\nbe impossible, and I belive it's not the way to go here. Also, it would be\nhuge work and I don't believe that I have JS knowledge extensive enough to \ndo so.\n\nAs it was pointed out inside [4] discutions, it would be nice if a\nheavilly spread syntax like 'export.' and 'module.export.' from\n'commonJS' were supported, even thought it is not ECMA, because it would\nbenefit users in more diverse situations, which I agree. That is why I\ntried adding support to recognize them.\n\nXing tried to add in v3 patterns for supporting jQuery. As I don't have\nexperience working, it is not added here. Like in the above paragraph, I\nthink it would greatly benefit a lot of developers if jQuery was\nsupported, but that  raised the discussion:\n\nWhat this pattern should aim to give support to outside vanillaJS,\nif it should? And if yes, where do we draw the line to define what is\nwidespread enough to be supported? I want to know your toughts on it.\n\n> You do not have to include single-character punctuation; these are\n> recognized as words automatically.\n\n> Personally I prefer |===| over |={3}| (and similar for the others)\n> because it is easier to understand.\n\nIn userdiff.c, I cleaned from the pattern the single character punctuation\nidentifiers and I improved the syntax of some other identifiers (Like ={3} --> ===).\nFor scaped punctuations, I kept the syntax with {} as I believe it reads\nmore clearly (Like \\\\.{3} instead of \\\\.\\\\.\\\\.}.\n\n> I didn't see any test cases dealing with nested functions, which might\n> add some value?\n\nI agree it would add value. As I said, [4] had it working and for the moment \nbut I still could not understand the strategy and what part of the regex dealt\nwith it. In his v1, Xing talks about 3 negations rules he added\nto the matching pattern. I think that this is the part responsible for\nsolving the problem, but I don't understand how. I would appreciate if\nsomeone took a little time to maybe figure it out.\n\n> We avoid incomplete last lines in this code base if it is not mandated\n> for some reason.\n\nI put a blank line at the end of all files in this submission.\n \n> Here and in the later test cases, the word \"ChangeMe\" is missing. How\n> did these ever pass the tests?\n\nHere Johannes was reffering to the t4018 test cases which were missing\n\"ChangeMe\", it was a mistake from my part. This time I added \"ChangeMe\"\nto the t4018 tests.\n\nDerick W. de M. Frias (4):\n  userdiff: add javascript diff driver\n  t4034: add tests for javascript word literals\n  t4018: add tests for recognizing javascript function syntax\n  t4018: add tests for javascript 'exports.', 'module.exports' and\n    'export' type functions\n\n Documentation/gitattributes.adoc              |  2 +\n .../javascript-anonymous-assigned-function    |  4 ++\n t/t4018/javascript-arrow-assigned-function    |  4 ++\n t/t4018/javascript-arrow-assigned-function-2  |  5 ++\n t/t4018/javascript-arrow-assigned-function-3  |  1 +\n t/t4018/javascript-assigned-function          |  4 ++\n t/t4018/javascript-async-assigned-function    |  4 ++\n t/t4018/javascript-async-function             |  4 +-\n t/t4018/javascript-class-get-function         |  5 ++\n t/t4018/javascript-class-set-function         |  5 ++\n t/t4018/javascript-class-static-function      |  5 ++\n t/t4018/javascript-class-unprefixed-function  |  6 ++\n ...ascript-dotexpors-async-anonymous-function |  3 +\n .../javascript-dotexports-anonymous-function  |  3 +\n t/t4018/javascript-dotexports-arrow-function  |  4 ++\n .../javascript-dotexports-arrow-function-2    |  4 ++\n .../javascript-dotexports-arrow-function-3    |  1 +\n .../javascript-dotexports-assigned-function   |  1 +\n ...javascript-dotexports-async-arrow-function |  3 +\n ...vascript-dotexports-async-arrow-function-2 |  4 ++\n ...vascript-dotexports-async-arrow-function-3 |  1 +\n t/t4018/javascript-dotexports-async-function  |  4 ++\n ...exports-async-generator-anonymous-function |  5 ++\n ...ports-async-generator-anonymous-function-2 |  5 ++\n ...script-dotexports-async-generator-function |  5 ++\n ...ript-dotexports-async-generator-function-2 |  5 ++\n t/t4018/javascript-dotexports-function        |  4 ++\n ...pt-dotexports-generator-anonymous-function |  5 ++\n ...-dotexports-generator-anonymous-function-2 |  5 ++\n .../javascript-dotexports-generator-function  |  5 ++\n ...javascript-dotexports-generator-function-2 |  5 ++\n t/t4018/javascript-export-arrow-function      |  4 ++\n ...t-export-async-anonymous-assigned-function |  4 ++\n .../javascript-export-async-arrow-function    |  4 ++\n t/t4018/javascript-export-async-function      |  4 ++\n ...sync-generator-anonymous-assigned-function |  4 ++\n ...nc-generator-anonymous-assigned-function-2 |  4 ++\n ...t-export-async-generator-assigned-function |  5 ++\n ...export-async-generator-assigned-function-2 |  5 ++\n ...javascript-export-async-generator-function |  5 ++\n ...vascript-export-async-generator-function-2 |  5 ++\n t/t4018/javascript-export-function            |  4 ++\n ...ascript-export-generator-assigned-function |  6 ++\n ...cript-export-generator-assigned-function-2 |  6 ++\n t/t4018/javascript-export-generator-function  |  5 ++\n .../javascript-export-generator-function-2    |  5 ++\n t/t4018/javascript-function                   |  4 +-\n .../javascript-generator-assigned-function    |  5 ++\n .../javascript-generator-assigned-function-2  |  5 ++\n t/t4018/javascript-generator-function         |  4 +-\n t/t4018/javascript-generator-function-2       |  4 +-\n t/t4018/javascript-method-unprefixed-function |  6 ++\n ...cript-module-dotexports-anonymous-function |  3 +\n ...avascript-module-dotexports-arrow-function |  4 ++\n ...ascript-module-dotexports-arrow-function-2 |  4 ++\n ...ascript-module-dotexports-arrow-function-3 |  1 +\n ...script-module-dotexports-assigned-function |  1 +\n ...ipt-module-dotexports-async-arrow-function |  3 +\n ...t-module-dotexports-async-arrow-function-2 |  4 ++\n ...t-module-dotexports-async-arrow-function-3 |  1 +\n ...avascript-module-dotexports-async-function |  4 ++\n ...exports-async-generator-anonymous-function |  5 ++\n ...ports-async-generator-anonymous-function-2 |  5 ++\n ...module-dotexports-async-generator-function |  5 ++\n ...dule-dotexports-async-generator-function-2 |  5 ++\n t/t4018/javascript-module-dotexports-function |  4 ++\n ...le-dotexports-generator-anonymous-function |  5 ++\n ...-dotexports-generator-anonymous-function-2 |  5 ++\n ...cript-module-dotexports-generator-function |  5 ++\n ...ipt-module-dotexports-generator-function-2 |  5 ++\n t/t4018/javascript-skip-function-calls        |  7 +++\n t/t4018/javascript-skip-reserved-words        | 38 ++++++++++++\n t/t4034-diff-words.sh                         |  1 +\n t/t4034/javascript/expect                     | 26 ++++++--\n t/t4034/javascript/post                       | 16 +++--\n t/t4034/javascript/pre                        | 16 +++--\n userdiff.c                                    | 62 +++++++++++--------\n 77 files changed, 408 insertions(+), 46 deletions(-)\n create mode 100644 t/t4018/javascript-anonymous-assigned-function\n create mode 100644 t/t4018/javascript-arrow-assigned-function\n create mode 100644 t/t4018/javascript-arrow-assigned-function-2\n create mode 100644 t/t4018/javascript-arrow-assigned-function-3\n create mode 100644 t/t4018/javascript-assigned-function\n create mode 100644 t/t4018/javascript-async-assigned-function\n create mode 100644 t/t4018/javascript-class-get-function\n create mode 100644 t/t4018/javascript-class-set-function\n create mode 100644 t/t4018/javascript-class-static-function\n create mode 100644 t/t4018/javascript-class-unprefixed-function\n create mode 100644 t/t4018/javascript-dotexpors-async-anonymous-function\n create mode 100644 t/t4018/javascript-dotexports-anonymous-function\n create mode 100644 t/t4018/javascript-dotexports-arrow-function\n create mode 100644 t/t4018/javascript-dotexports-arrow-function-2\n create mode 100644 t/t4018/javascript-dotexports-arrow-function-3\n create mode 100644 t/t4018/javascript-dotexports-assigned-function\n create mode 100644 t/t4018/javascript-dotexports-async-arrow-function\n create mode 100644 t/t4018/javascript-dotexports-async-arrow-function-2\n create mode 100644 t/t4018/javascript-dotexports-async-arrow-function-3\n create mode 100644 t/t4018/javascript-dotexports-async-function\n create mode 100644 t/t4018/javascript-dotexports-async-generator-anonymous-function\n create mode 100644 t/t4018/javascript-dotexports-async-generator-anonymous-function-2\n create mode 100644 t/t4018/javascript-dotexports-async-generator-function\n create mode 100644 t/t4018/javascript-dotexports-async-generator-function-2\n create mode 100644 t/t4018/javascript-dotexports-function\n create mode 100644 t/t4018/javascript-dotexports-generator-anonymous-function\n create mode 100644 t/t4018/javascript-dotexports-generator-anonymous-function-2\n create mode 100644 t/t4018/javascript-dotexports-generator-function\n create mode 100644 t/t4018/javascript-dotexports-generator-function-2\n create mode 100644 t/t4018/javascript-export-arrow-function\n create mode 100644 t/t4018/javascript-export-async-anonymous-assigned-function\n create mode 100644 t/t4018/javascript-export-async-arrow-function\n create mode 100644 t/t4018/javascript-export-async-function\n create mode 100644 t/t4018/javascript-export-async-generator-anonymous-assigned-function\n create mode 100644 t/t4018/javascript-export-async-generator-anonymous-assigned-function-2\n create mode 100644 t/t4018/javascript-export-async-generator-assigned-function\n create mode 100644 t/t4018/javascript-export-async-generator-assigned-function-2\n create mode 100644 t/t4018/javascript-export-async-generator-function\n create mode 100644 t/t4018/javascript-export-async-generator-function-2\n create mode 100644 t/t4018/javascript-export-function\n create mode 100644 t/t4018/javascript-export-generator-assigned-function\n create mode 100644 t/t4018/javascript-export-generator-assigned-function-2\n create mode 100644 t/t4018/javascript-export-generator-function\n create mode 100644 t/t4018/javascript-export-generator-function-2\n create mode 100644 t/t4018/javascript-generator-assigned-function\n create mode 100644 t/t4018/javascript-generator-assigned-function-2\n create mode 100644 t/t4018/javascript-method-unprefixed-function\n create mode 100644 t/t4018/javascript-module-dotexports-anonymous-function\n create mode 100644 t/t4018/javascript-module-dotexports-arrow-function\n create mode 100644 t/t4018/javascript-module-dotexports-arrow-function-2\n create mode 100644 t/t4018/javascript-module-dotexports-arrow-function-3\n create mode 100644 t/t4018/javascript-module-dotexports-assigned-function\n create mode 100644 t/t4018/javascript-module-dotexports-async-arrow-function\n create mode 100644 t/t4018/javascript-module-dotexports-async-arrow-function-2\n create mode 100644 t/t4018/javascript-module-dotexports-async-arrow-function-3\n create mode 100644 t/t4018/javascript-module-dotexports-async-function\n create mode 100644 t/t4018/javascript-module-dotexports-async-generator-anonymous-function\n create mode 100644 t/t4018/javascript-module-dotexports-async-generator-anonymous-function-2\n create mode 100644 t/t4018/javascript-module-dotexports-async-generator-function\n create mode 100644 t/t4018/javascript-module-dotexports-async-generator-function-2\n create mode 100644 t/t4018/javascript-module-dotexports-function\n create mode 100644 t/t4018/javascript-module-dotexports-generator-anonymous-function\n create mode 100644 t/t4018/javascript-module-dotexports-generator-anonymous-function-2\n create mode 100644 t/t4018/javascript-module-dotexports-generator-function\n create mode 100644 t/t4018/javascript-module-dotexports-generator-function-2\n create mode 100644 t/t4018/javascript-skip-function-calls\n create mode 100644 t/t4018/javascript-skip-reserved-words\n\n-- \n2.50.0.rc0.62.g658f0ae201.dirty\n\n"},{"id":"520554","messageId":"20250623090538.154858-3-derick.william.moraes@gmail.com","threadId":"63583","inReplyTo":"20250623090538.154858-1-derick.william.moraes@gmail.com","subject":"[PATCH v2 2/4] t4034: add tests for javascript word literals","fromName":"Derick W. de M. Frias","fromEmail":"derick.william.moraes@gmail.com","sentAt":"2025-06-23T06:35:47Z","receivedAt":"2025-06-23T09:06:07Z","isPatch":true,"sender":{"key":"derick.william.moraes@gmail.com","avatar":null},"body":"Add tests for javascript word pattern.\n\nSigned-off-by: Derick W. de M. Frias <derick.william.moraes@gmail.com>\n---\n t/t4034-diff-words.sh     |  1 +\n t/t4034/javascript/expect | 26 ++++++++++++++++++++++----\n t/t4034/javascript/post   | 16 ++++++++++++----\n t/t4034/javascript/pre    | 16 ++++++++++++----\n 4 files changed, 47 insertions(+), 12 deletions(-)\n\ndiff --git a/t/t4034-diff-words.sh b/t/t4034-diff-words.sh\nindex 0be647c2fb..5bf1294f27 100755\n--- a/t/t4034-diff-words.sh\n+++ b/t/t4034-diff-words.sh\n@@ -328,6 +328,7 @@ test_language_driver dts\n test_language_driver fortran\n test_language_driver html\n test_language_driver java\n+test_language_driver javascript\n test_language_driver kotlin\n test_language_driver matlab\n test_language_driver objc\ndiff --git a/t/t4034/javascript/expect b/t/t4034/javascript/expect\nindex cc5e1253f6..98b057c48a 100644\n--- a/t/t4034/javascript/expect\n+++ b/t/t4034/javascript/expect\n@@ -43,12 +43,30 @@\n <GREEN>0B0010<RESET>\n <GREEN>0b0001_1101_0011<RESET>\n <GREEN>0b11111111111111000011111111111111111n<RESET>\n+// Floating point and exponent notation<RESET>\n+<RED>3.14<RESET>\n+<RED>0.5<RESET>\n+<RED>1.23e3<RESET>\n+<RED>4.56e-2<RESET>\n+<RED>7.89E4<RESET>\n+<RED>0.12E-1<RESET>\n+<RED>5e2<RESET>\n+<RED>7e-3<RESET>\n+<RED>6E3<RESET>\n+<RED>9E-3<RESET>\n+<GREEN>3.15<RESET>\n+<GREEN>0.75<RESET>\n+<GREEN>1.23e4<RESET>\n+<GREEN>4.96e-3<RESET>\n+<GREEN>7.89E8<RESET>\n+<GREEN>0.11E-2<RESET>\n+<GREEN>6e3<RESET>\n+<GREEN>8e-2<RESET>\n+<GREEN>7E4<RESET>\n+<GREEN>2E-6<RESET>\n // punctuations<RESET>\n-{<RED>a<RESET><GREEN>b<RESET>} (<RED>a<RESET><GREEN>b<RESET>)\n-<RED>a<RESET><GREEN>b<RESET>;\n-[<RED>1,<RESET>2<GREEN>,3<RESET>]\n [<RED>1, 2,<RESET> ...<RED>params<RESET><GREEN>params_v2<RESET> ]\n a<RED><=<RESET><GREEN>=<RESET>2 a<RED>>=<RESET><GREEN>=<RESET>2 a<RED>==<RESET><GREEN>=<RESET>2 a<RED>!=<RESET><GREEN>=<RESET>2 a<RED>===<RESET><GREEN>=<RESET>2 a<RED>!==<RESET><GREEN>=<RESET>2 a<RED>^=<RESET><GREEN>=<RESET>2 a<RED>=><RESET><GREEN>=<RESET>2\n a<RED>+=<RESET><GREEN>-=<RESET>b a<RED>*=<RESET><GREEN>%=<RESET>b a<RED>**=<RESET><GREEN>&&=<RESET>b a<RED>||=<RESET><GREEN>|=<RESET>b\n b<RED>+<RESET><GREEN>-<RESET>c a<RED>--<RESET><GREEN>++<RESET> a<RED>>><RESET><GREEN><<<RESET>b a<RED>>>><RESET><GREEN>>>>=<RESET>b a<RED>>>=<RESET><GREEN><<=<RESET>b\n-a<RED>&&<RESET><GREEN>&<RESET>b a<RED>||<RESET><GREEN>|<RESET>b a<RED>&&=<RESET><GREEN>??=<RESET>b\n\\ No newline at end of file\n+a<RED>&&<RESET><GREEN>&<RESET>b a<RED>||<RESET><GREEN>|<RESET>b a<RED>&&=<RESET><GREEN>??=<RESET>b\ndiff --git a/t/t4034/javascript/post b/t/t4034/javascript/post\nindex 9d66c9dc91..12165198ad 100644\n--- a/t/t4034/javascript/post\n+++ b/t/t4034/javascript/post\n@@ -22,12 +22,20 @@\n 0B0010\n 0b0001_1101_0011\n 0b11111111111111000011111111111111111n\n+// Floating point and exponent notation\n+3.15\n+0.75\n+1.23e4\n+4.96e-3\n+7.89E8\n+0.11E-2\n+6e3\n+8e-2\n+7E4\n+2E-6\n // punctuations\n-{b} (b)\n-b;\n-[2,3]\n [ ...params_v2 ]\n a=2 a=2 a=2 a=2 a=2 a=2 a=2 a=2\n a-=b a%=b a&&=b a|=b\n b-c a++ a<<b a>>>=b a<<=b\n-a&b a|b a??=b\n\\ No newline at end of file\n+a&b a|b a??=b\ndiff --git a/t/t4034/javascript/pre b/t/t4034/javascript/pre\nindex 9876514042..43d5908e09 100644\n--- a/t/t4034/javascript/pre\n+++ b/t/t4034/javascript/pre\n@@ -22,12 +22,20 @@\n 0B0110\n 0b0001_1001_0011\n 0b1111111111111111111111111111111111111n\n+// Floating point and exponent notation\n+3.14\n+0.5\n+1.23e3\n+4.56e-2\n+7.89E4\n+0.12E-1\n+5e2\n+7e-3\n+6E3\n+9E-3\n // punctuations\n-{a} (a)\n-a;\n-[1,2]\n [ 1, 2, ...params ]\n a<=2 a>=2 a==2 a!=2 a===2 a!==2 a^=2 a=>2\n a+=b a*=b a**=b a||=b\n b+c a-- a>>b a>>>b a>>=b\n-a&&b a||b a&&=b\n\\ No newline at end of file\n+a&&b a||b a&&=b\n-- \n2.50.0.rc0.62.g658f0ae201.dirty\n\n"},{"id":"520555","messageId":"20250623090538.154858-4-derick.william.moraes@gmail.com","threadId":"63583","inReplyTo":"20250623090538.154858-1-derick.william.moraes@gmail.com","subject":"[PATCH v2 3/4] t4018: add tests for recognizing javascript function syntax","fromName":"Derick W. de M. Frias","fromEmail":"derick.william.moraes@gmail.com","sentAt":"2025-06-23T06:35:48Z","receivedAt":"2025-06-23T09:06:09Z","isPatch":true,"sender":{"key":"derick.william.moraes@gmail.com","avatar":null},"body":"Add tests for javascript function declarations as in ECMAScript ES5.1<\n\nSigned-off-by: Derick W. de M. Frias <derick.william.moraes@gmail.com>\n---\n .../javascript-anonymous-assigned-function    |  4 ++\n t/t4018/javascript-arrow-assigned-function    |  4 ++\n t/t4018/javascript-arrow-assigned-function-2  |  5 +++\n t/t4018/javascript-arrow-assigned-function-3  |  1 +\n t/t4018/javascript-assigned-function          |  4 ++\n t/t4018/javascript-async-assigned-function    |  4 ++\n t/t4018/javascript-async-function             |  4 +-\n t/t4018/javascript-class-get-function         |  5 +++\n t/t4018/javascript-class-set-function         |  5 +++\n t/t4018/javascript-class-static-function      |  5 +++\n t/t4018/javascript-class-unprefixed-function  |  6 +++\n t/t4018/javascript-function                   |  4 +-\n .../javascript-generator-assigned-function    |  5 +++\n .../javascript-generator-assigned-function-2  |  5 +++\n t/t4018/javascript-generator-function         |  4 +-\n t/t4018/javascript-generator-function-2       |  4 +-\n t/t4018/javascript-method-unprefixed-function |  6 +++\n t/t4018/javascript-skip-function-calls        |  7 ++++\n t/t4018/javascript-skip-reserved-words        | 38 +++++++++++++++++++\n 19 files changed, 112 insertions(+), 8 deletions(-)\n create mode 100644 t/t4018/javascript-anonymous-assigned-function\n create mode 100644 t/t4018/javascript-arrow-assigned-function\n create mode 100644 t/t4018/javascript-arrow-assigned-function-2\n create mode 100644 t/t4018/javascript-arrow-assigned-function-3\n create mode 100644 t/t4018/javascript-assigned-function\n create mode 100644 t/t4018/javascript-async-assigned-function\n create mode 100644 t/t4018/javascript-class-get-function\n create mode 100644 t/t4018/javascript-class-set-function\n create mode 100644 t/t4018/javascript-class-static-function\n create mode 100644 t/t4018/javascript-class-unprefixed-function\n create mode 100644 t/t4018/javascript-generator-assigned-function\n create mode 100644 t/t4018/javascript-generator-assigned-function-2\n create mode 100644 t/t4018/javascript-method-unprefixed-function\n create mode 100644 t/t4018/javascript-skip-function-calls\n create mode 100644 t/t4018/javascript-skip-reserved-words\n\ndiff --git a/t/t4018/javascript-anonymous-assigned-function b/t/t4018/javascript-anonymous-assigned-function\nnew file mode 100644\nindex 0000000000..c9127e231d\n--- /dev/null\n+++ b/t/t4018/javascript-anonymous-assigned-function\n@@ -0,0 +1,4 @@\n+const RIGHT = function (a, b) {\t\n+\n+    return a + b; //ChangeMe\n+};\ndiff --git a/t/t4018/javascript-arrow-assigned-function b/t/t4018/javascript-arrow-assigned-function\nnew file mode 100644\nindex 0000000000..3182197aee\n--- /dev/null\n+++ b/t/t4018/javascript-arrow-assigned-function\n@@ -0,0 +1,4 @@\n+const RIGHT = (a, b) => {\n+\t\n+    return a + b; //ChangeMe\n+};\ndiff --git a/t/t4018/javascript-arrow-assigned-function-2 b/t/t4018/javascript-arrow-assigned-function-2\nnew file mode 100644\nindex 0000000000..b5732967c0\n--- /dev/null\n+++ b/t/t4018/javascript-arrow-assigned-function-2\n@@ -0,0 +1,5 @@\n+const RIGHT = a => {\n+\t\n+    return a + 1; //ChangeMe\n+};\n+\ndiff --git a/t/t4018/javascript-arrow-assigned-function-3 b/t/t4018/javascript-arrow-assigned-function-3\nnew file mode 100644\nindex 0000000000..98ee879dd2\n--- /dev/null\n+++ b/t/t4018/javascript-arrow-assigned-function-3\n@@ -0,0 +1 @@\n+const RIGHT = a => a+1; //ChangeMe\ndiff --git a/t/t4018/javascript-assigned-function b/t/t4018/javascript-assigned-function\nnew file mode 100644\nindex 0000000000..170d54db4f\n--- /dev/null\n+++ b/t/t4018/javascript-assigned-function\n@@ -0,0 +1,4 @@\n+const RIGHT = function test (a, b) {\n+\t\n+    return a + b; //ChangeMe\n+};\ndiff --git a/t/t4018/javascript-async-assigned-function b/t/t4018/javascript-async-assigned-function\nnew file mode 100644\nindex 0000000000..1c1923b336\n--- /dev/null\n+++ b/t/t4018/javascript-async-assigned-function\n@@ -0,0 +1,4 @@\n+const RIGHT = async function (a, b) {\n+\t\n+    return a + b; //ChangeMe\n+};\ndiff --git a/t/t4018/javascript-async-function b/t/t4018/javascript-async-function\nindex 7f99b8c89a..740e5304aa 100644\n--- a/t/t4018/javascript-async-function\n+++ b/t/t4018/javascript-async-function\n@@ -1,4 +1,4 @@\n async function RIGHT (a, b) {\n \t\n-    return a + b;\n-};\n\\ No newline at end of file\n+    return a + b; //ChangeMe\n+};\ndiff --git a/t/t4018/javascript-class-get-function b/t/t4018/javascript-class-get-function\nnew file mode 100644\nindex 0000000000..e27fa81478\n--- /dev/null\n+++ b/t/t4018/javascript-class-get-function\n@@ -0,0 +1,5 @@\n+class ChangeMe {\n+  get RIGHT() {\n+    return 1;\n+  }\n+}\ndiff --git a/t/t4018/javascript-class-set-function b/t/t4018/javascript-class-set-function\nnew file mode 100644\nindex 0000000000..ba747db7c7\n--- /dev/null\n+++ b/t/t4018/javascript-class-set-function\n@@ -0,0 +1,5 @@\n+class ChangeMe {\n+  set RIGHT() {\n+    return 1;\n+  }\n+}\ndiff --git a/t/t4018/javascript-class-static-function b/t/t4018/javascript-class-static-function\nnew file mode 100644\nindex 0000000000..b3c8f1ff2a\n--- /dev/null\n+++ b/t/t4018/javascript-class-static-function\n@@ -0,0 +1,5 @@\n+class ChangeMe {\n+  static RIGHT(a, b) {\n+    return a + b;\n+  }\n+}\ndiff --git a/t/t4018/javascript-class-unprefixed-function b/t/t4018/javascript-class-unprefixed-function\nnew file mode 100644\nindex 0000000000..675c787995\n--- /dev/null\n+++ b/t/t4018/javascript-class-unprefixed-function\n@@ -0,0 +1,6 @@\n+class Test {\n+  RIGHT() {\n+    let a = 1;\n+    let b = ChangeMe;\n+  }\n+}\ndiff --git a/t/t4018/javascript-function b/t/t4018/javascript-function\nindex d11ad34aff..bd7945ca2b 100644\n--- a/t/t4018/javascript-function\n+++ b/t/t4018/javascript-function\n@@ -1,4 +1,4 @@\n function RIGHT (a, b) {\n \t\n-    return a + b;\n-};\n\\ No newline at end of file\n+    return a + b; //ChangeMe\n+};\ndiff --git a/t/t4018/javascript-generator-assigned-function b/t/t4018/javascript-generator-assigned-function\nnew file mode 100644\nindex 0000000000..c5ff9d89b5\n--- /dev/null\n+++ b/t/t4018/javascript-generator-assigned-function\n@@ -0,0 +1,5 @@\n+const RIGHT = function* (){\n+  \n+  yield 1;\n+  yield 2; //ChangeMe\n+}\ndiff --git a/t/t4018/javascript-generator-assigned-function-2 b/t/t4018/javascript-generator-assigned-function-2\nnew file mode 100644\nindex 0000000000..8ce7567987\n--- /dev/null\n+++ b/t/t4018/javascript-generator-assigned-function-2\n@@ -0,0 +1,5 @@\n+const RIGHT = function *(){\n+  \n+  yield 1;\n+  yield 2; //ChangeMe\n+}\ndiff --git a/t/t4018/javascript-generator-function b/t/t4018/javascript-generator-function\nindex af7cbb50a3..9a24ae7d08 100644\n--- a/t/t4018/javascript-generator-function\n+++ b/t/t4018/javascript-generator-function\n@@ -1,5 +1,5 @@\n function* RIGHT() {\n   \n   yield 1;\n-  yield 2;\n-}\n\\ No newline at end of file\n+  yield 2; //ChangeMe\n+}\ndiff --git a/t/t4018/javascript-generator-function-2 b/t/t4018/javascript-generator-function-2\nindex d40b395f5c..bac71e362c 100644\n--- a/t/t4018/javascript-generator-function-2\n+++ b/t/t4018/javascript-generator-function-2\n@@ -1,5 +1,5 @@\n function *RIGHT() {\n   \n   yield 1;\n-  yield 2;\n-}\n\\ No newline at end of file\n+  yield 2; //ChangeMe\n+}\ndiff --git a/t/t4018/javascript-method-unprefixed-function b/t/t4018/javascript-method-unprefixed-function\nnew file mode 100644\nindex 0000000000..eb6300dda3\n--- /dev/null\n+++ b/t/t4018/javascript-method-unprefixed-function\n@@ -0,0 +1,6 @@\n+const Test = {\n+  RIGHT() {\n+    let a = 1;\n+    let b = ChangeMe;\n+  }\n+}\ndiff --git a/t/t4018/javascript-skip-function-calls b/t/t4018/javascript-skip-function-calls\nnew file mode 100644\nindex 0000000000..cc9699a9f5\n--- /dev/null\n+++ b/t/t4018/javascript-skip-function-calls\n@@ -0,0 +1,7 @@\n+class Test {\n+  static RIGHT() {\n+    call_to_skip();\n+    call_to_skip2();\n+    let a = ChangeMe;\n+  }\n+}\n\\ No newline at end of file\ndiff --git a/t/t4018/javascript-skip-reserved-words b/t/t4018/javascript-skip-reserved-words\nnew file mode 100644\nindex 0000000000..d12fe587a8\n--- /dev/null\n+++ b/t/t4018/javascript-skip-reserved-words\n@@ -0,0 +1,38 @@\n+function RIGHT(a, b) {\n+  import(\"./async1\")\n+\n+  if (a > 1) {\n+    // ...\n+  }\n+  do {\n+    // ...\n+  } \n+  while (i < 5){\n+    //\n+  };\n+  for (const element of array1) {\n+    console.log(element)\n+  }\n+  with(o) {\n+    console.log(x)\n+  }\n+  switch (expr) {\n+    case 'a':\n+      // ...\n+      break;\n+    case 'b':\n+      // ...\n+      break;\n+    default:\n+      // ...\n+  }\n+  try {\n+    // ...\n+    return (a + c)\n+  } \n+  catch (error) {\n+    // ...\n+  }\n+\n+  return a + b; // ChangeMe\n+}\n-- \n2.50.0.rc0.62.g658f0ae201.dirty\n\n"},{"id":"520556","messageId":"20250623090538.154858-2-derick.william.moraes@gmail.com","threadId":"63583","inReplyTo":"20250623090538.154858-1-derick.william.moraes@gmail.com","subject":"[PATCH v2 1/4] userdiff: add javascript diff driver","fromName":"Derick W. de M. Frias","fromEmail":"derick.william.moraes@gmail.com","sentAt":"2025-06-23T06:35:46Z","receivedAt":"2025-06-23T09:06:11Z","isPatch":true,"sender":{"key":"derick.william.moraes@gmail.com","avatar":null},"body":"Add diff pattern for JavaScript programming language and documentation. \n\nSigned-off-by: Derick W. de M. Frias <derick.william.moraes@gmail.com>\n---\n Documentation/gitattributes.adoc |  2 ++\n userdiff.c                       | 62 ++++++++++++++++++--------------\n 2 files changed, 38 insertions(+), 26 deletions(-)\n\ndiff --git a/Documentation/gitattributes.adoc b/Documentation/gitattributes.adoc\nindex f20041a323..b7075ccb29 100644\n--- a/Documentation/gitattributes.adoc\n+++ b/Documentation/gitattributes.adoc\n@@ -891,6 +891,8 @@ patterns are available:\n \n - `java` suitable for source code in the Java language.\n \n+- `javascript` suitable for source code in the JavaScript language.\n+\n - `kotlin` suitable for source code in the Kotlin language.\n \n - `markdown` suitable for Markdown documents.\ndiff --git a/userdiff.c b/userdiff.c\nindex 94134e5b09..0d352bc722 100644\n--- a/userdiff.c\n+++ b/userdiff.c\n@@ -238,33 +238,43 @@ PATTERNS(\"java\",\n \t \"|[-+*/<>%&^|=!]=\"\n \t \"|--|\\\\+\\\\+|<<=?|>>>?=?|&&|\\\\|\\\\|\"),\n PATTERNS(\"javascript\",\n-     /* conventional named functions */\n-     \"^[ \\t]*(async[ \\t]+)?function[ \\t]*\\\\*?[ \\t]*([$_a-zA-Z][$_a-zA-Z0-9]*)[ \\t]*\\\\(.*$|\"\n-     /* assigned functions */\n-     \"^[ \\t]*(const|let|var)[ \\t]+([$_a-zA-Z][$_a-zA-Z0-9]*)[ \\t]*=\"\n-     \"[ \\t]*(async[ \\t]+)?function[ \\t]*\\\\*?[ \\t]*([$_a-zA-Z][$_a-zA-Z0-9]*)?[ \\t]*\\\\(.*$|\"\n-     /* arrow functions */\n-     \"^[ \\t]*(const|let|var)[ \\t]+([$_a-zA-Z][$_a-zA-Z0-9]*)[ \\t]*=\"\n-     \"[ \\t]*(\\\\([^\\\\)]*\\\\)|[$_a-zA-Z][$_a-zA-Z0-9]*)[ \\t]*=>[ \\t]*\\\\{?.*$|\"\n-     /* functions declared inside classes and objects */\n-     \"^[ \\t]*(static[ \\t]+)?(async[ \\t]+)?(get[ \\t]+|set[ \\t]+)?\\\\*?[ \\t]*\"\n-     \"([$_a-zA-Z][$_a-zA-Z0-9]*)[ \\t]*\\\\([^)]*\\\\)[ \\t]*\\\\{.*$\",\n-     /* identifiers */\n-\t \"[$_A-Za-z][$_A-Za-z0-9]*|\"\n-     /* hexadecimal and big hexadecimal */\n-     \"0[xX](?:[0-9a-fA-F](?:_?[0-9a-fA-F])*)n?|\"\n-     /* octa and big octa */\n-     \"0[oO](?:[0-7](?:_?[0-7])*)n?|\"\n-     /* binary and big binary */\n-     \"0[bB](?:[01](?:_?[01])*)n?|\"\n-     /* decimal, floting point and exponent notation (eE) */\n-     \"(?:0|[1-9](?:_?[0-9])*)(?:\\\\.(?:[0-9](?:_?[0-9])*))?(?:[eE][+-]?(?:[0-9](?:_?[0-9])*))?|\"\n-     /* big decimal */\n-     \"(?:0|[1-9](?:_?[0-9])*)n|\"\n+\t /* don't match reserved expressions that have function-like syntax */\n+\t \"!^[ \\t]*(if|do|while|for|with|switch|catch|import|return)\\n\"\n+\t /* matches conventional named functions, that can also be async and/or have export */\n+\t \"^[ \\t]*(export[ \\t]+)?(async[ \\t]+)?function[ \\t]*\\\\*?[ \\t]*\"\n+\t \"([$_a-zA-Z][$_a-zA-Z0-9]*)[ \\t]*\\\\(.*$\"\n+\t /* matches assigned exports */\n+\t \"|^[ \\t]*export[ \\t]*(const|default)[ \\t]*([$_a-zA-Z][$_a-zA-Z0-9]*)[ \\t]*=\"\n+\t /* matches assigned functions */\n+\t \"|^[ \\t]*(const|let|var)[ \\t]+([$_a-zA-Z][$_a-zA-Z0-9]*)[ \\t]*=[ \\t]*\"\n+\t \"(async[ \\t]+)?function[ \\t]*\\\\*?[ \\t]*([$_a-zA-Z][$_a-zA-Z0-9]*)?[ \\t]*\\\\(.*$\"\n+\t /* arrow functions */\n+\t \"|^[ \\t]*(const|let|var)[ \\t]+([$_a-zA-Z][$_a-zA-Z0-9]*)[ \\t]*=[ \\t]*\"\n+\t \"(\\\\([^\\\\)]*\\\\)|[$_a-zA-Z][$_a-zA-Z0-9]*)[ \\t]*=>[ \\t]*\\\\{?.*$\"\n+\t /* matches functions declared inside classes and objects */\n+\t \"|^[ \\t]*(static[ \\t]+)?(async[ \\t]+)?(get[ \\t]+|set[ \\t]+)?\\\\*?[ \\t]*\"\n+\t \"([$_a-zA-Z][$_a-zA-Z0-9]*)[ \\t]*\\\\([^)]*\\\\)[ \\t]*\\\\{.*$\"\n+\t /* matches functions created or assigned in 'exports.' or 'module.exports.' context*/\n+\t \"|^[ \\t]*(module.)?exports.([$_a-zA-Z][$_a-zA-Z0-9]*)[ \\t]*=\"\n+\t \"([ \\t]*(async[ \\t]+)?(function)?[ \\t]*\\\\*?[ \\t]*\"\n+\t \"([$_a-zA-Z][$_a-zA-Z0-9]*)?[ \\t]*\\\\(.*$\"\n+\t \"|[ \\t]*([$_a-zA-Z][$_a-zA-Z0-9]*);\"\n+\t \"|[ \\t]*(async[ \\t]+)?([$_a-zA-Z][$_a-zA-Z0-9]*)[ \\t]*=>)\",\n+\t /* identifiers */\n+\t \"[$_A-Za-z][$_A-Za-z0-9]*\"\n+\t /* hexadecimal and big hexadecimal */\n+\t \"|0[xX](?:[0-9a-fA-F](?:_?[0-9a-fA-F])*)n?\"\n+\t /* octa and big octa */\n+\t \"|0[oO](?:[0-7](?:_?[0-7])*)n?\"\n+\t /* binary and big binary */\n+\t \"|0[bB](?:[01](?:_?[01])*)n?\"\n+\t /* decimal, floting point and exponent notation (eE) */\n+\t \"|(?:0|[1-9](?:_?[0-9])*)(?:\\\\.(?:[0-9](?:_?[0-9])*))?(?:[eE][+-]?(?:[0-9](?:_?[0-9])*))?\"\n+\t /* big decimal */\n+\t \"|(?:0|[1-9](?:_?[0-9])*)n\"\n \t /* punctuation */\n-\t \"\\\\{|\\\\}|\\\\(|\\\\)|\\\\.|\\\\.{3}|;|,|<|>|<=|>=|==|!=|={3}|!==|\\\\+|-|\\\\*|/|%|\\\\*{2}|\"\n-\t \"\\\\+{2}|--|<<|>>|>>>|&|\\\\||\\\\^|!|~|&&|\\\\|{2}|\\\\?{1,2}|:|=|\\\\+=|-=|\\\\*=|%=|\\\\*{2}=|\"\n-\t \"<<=|>>=|>>>=|&=|\\\\|=|\\\\^=|&&=|\\\\|{2}=|\\\\?{2}=|=>\"),\n+\t \"|\\\\.{3}|<=|>=|==|!=|===|!==|\\\\*{2}|\\\\+{2}|--|<<|>>|>>>|&&|\\\\|{2}|\\\\?{2}|\\\\+=|-=\"\n+\t \"|\\\\*=|%=|\\\\*{2}=|<<=|>>=|>>>=|&=|\\\\|=|\\\\^=|&&=|\\\\|{2}=|\\\\?{2}=|=>\"),\n PATTERNS(\"kotlin\",\n \t \"^[ \\t]*(([a-z]+[ \\t]+)*(fun|class|interface)[ \\t]+.*)$\",\n \t /* -- */\n-- \n2.50.0.rc0.62.g658f0ae201.dirty\n\n"},{"id":"520557","messageId":"20250623090538.154858-5-derick.william.moraes@gmail.com","threadId":"63583","inReplyTo":"20250623090538.154858-1-derick.william.moraes@gmail.com","subject":"[PATCH v2 4/4] t4018: add tests for javascript export type function declarations","fromName":"Derick W. de M. Frias","fromEmail":"derick.william.moraes@gmail.com","sentAt":"2025-06-23T06:35:49Z","receivedAt":"2025-06-23T09:06:11Z","isPatch":true,"sender":{"key":"derick.william.moraes@gmail.com","avatar":null},"body":"Add tests for javascript export function declarations as in ECMAScript ES6 and CommonJS.\n\nSigned-off-by: Derick W. de M. Frias <derick.william.moraes@gmail.com>\n---\n t/t4018/javascript-dotexpors-async-anonymous-function       | 3 +++\n t/t4018/javascript-dotexports-anonymous-function            | 3 +++\n t/t4018/javascript-dotexports-arrow-function                | 4 ++++\n t/t4018/javascript-dotexports-arrow-function-2              | 4 ++++\n t/t4018/javascript-dotexports-arrow-function-3              | 1 +\n t/t4018/javascript-dotexports-assigned-function             | 1 +\n t/t4018/javascript-dotexports-async-arrow-function          | 3 +++\n t/t4018/javascript-dotexports-async-arrow-function-2        | 4 ++++\n t/t4018/javascript-dotexports-async-arrow-function-3        | 1 +\n t/t4018/javascript-dotexports-async-function                | 4 ++++\n ...javascript-dotexports-async-generator-anonymous-function | 5 +++++\n ...vascript-dotexports-async-generator-anonymous-function-2 | 5 +++++\n t/t4018/javascript-dotexports-async-generator-function      | 5 +++++\n t/t4018/javascript-dotexports-async-generator-function-2    | 5 +++++\n t/t4018/javascript-dotexports-function                      | 4 ++++\n t/t4018/javascript-dotexports-generator-anonymous-function  | 5 +++++\n .../javascript-dotexports-generator-anonymous-function-2    | 5 +++++\n t/t4018/javascript-dotexports-generator-function            | 5 +++++\n t/t4018/javascript-dotexports-generator-function-2          | 5 +++++\n t/t4018/javascript-export-arrow-function                    | 4 ++++\n t/t4018/javascript-export-async-anonymous-assigned-function | 4 ++++\n t/t4018/javascript-export-async-arrow-function              | 4 ++++\n t/t4018/javascript-export-async-function                    | 4 ++++\n ...cript-export-async-generator-anonymous-assigned-function | 4 ++++\n ...ipt-export-async-generator-anonymous-assigned-function-2 | 4 ++++\n t/t4018/javascript-export-async-generator-assigned-function | 5 +++++\n .../javascript-export-async-generator-assigned-function-2   | 5 +++++\n t/t4018/javascript-export-async-generator-function          | 5 +++++\n t/t4018/javascript-export-async-generator-function-2        | 5 +++++\n t/t4018/javascript-export-function                          | 4 ++++\n t/t4018/javascript-export-generator-assigned-function       | 6 ++++++\n t/t4018/javascript-export-generator-assigned-function-2     | 6 ++++++\n t/t4018/javascript-export-generator-function                | 5 +++++\n t/t4018/javascript-export-generator-function-2              | 5 +++++\n t/t4018/javascript-module-dotexports-anonymous-function     | 3 +++\n t/t4018/javascript-module-dotexports-arrow-function         | 4 ++++\n t/t4018/javascript-module-dotexports-arrow-function-2       | 4 ++++\n t/t4018/javascript-module-dotexports-arrow-function-3       | 1 +\n t/t4018/javascript-module-dotexports-assigned-function      | 1 +\n t/t4018/javascript-module-dotexports-async-arrow-function   | 3 +++\n t/t4018/javascript-module-dotexports-async-arrow-function-2 | 4 ++++\n t/t4018/javascript-module-dotexports-async-arrow-function-3 | 1 +\n t/t4018/javascript-module-dotexports-async-function         | 4 ++++\n ...ipt-module-dotexports-async-generator-anonymous-function | 5 +++++\n ...t-module-dotexports-async-generator-anonymous-function-2 | 5 +++++\n .../javascript-module-dotexports-async-generator-function   | 5 +++++\n .../javascript-module-dotexports-async-generator-function-2 | 5 +++++\n t/t4018/javascript-module-dotexports-function               | 4 ++++\n ...avascript-module-dotexports-generator-anonymous-function | 5 +++++\n ...ascript-module-dotexports-generator-anonymous-function-2 | 5 +++++\n t/t4018/javascript-module-dotexports-generator-function     | 5 +++++\n t/t4018/javascript-module-dotexports-generator-function-2   | 5 +++++\n 52 files changed, 211 insertions(+)\n create mode 100644 t/t4018/javascript-dotexpors-async-anonymous-function\n create mode 100644 t/t4018/javascript-dotexports-anonymous-function\n create mode 100644 t/t4018/javascript-dotexports-arrow-function\n create mode 100644 t/t4018/javascript-dotexports-arrow-function-2\n create mode 100644 t/t4018/javascript-dotexports-arrow-function-3\n create mode 100644 t/t4018/javascript-dotexports-assigned-function\n create mode 100644 t/t4018/javascript-dotexports-async-arrow-function\n create mode 100644 t/t4018/javascript-dotexports-async-arrow-function-2\n create mode 100644 t/t4018/javascript-dotexports-async-arrow-function-3\n create mode 100644 t/t4018/javascript-dotexports-async-function\n create mode 100644 t/t4018/javascript-dotexports-async-generator-anonymous-function\n create mode 100644 t/t4018/javascript-dotexports-async-generator-anonymous-function-2\n create mode 100644 t/t4018/javascript-dotexports-async-generator-function\n create mode 100644 t/t4018/javascript-dotexports-async-generator-function-2\n create mode 100644 t/t4018/javascript-dotexports-function\n create mode 100644 t/t4018/javascript-dotexports-generator-anonymous-function\n create mode 100644 t/t4018/javascript-dotexports-generator-anonymous-function-2\n create mode 100644 t/t4018/javascript-dotexports-generator-function\n create mode 100644 t/t4018/javascript-dotexports-generator-function-2\n create mode 100644 t/t4018/javascript-export-arrow-function\n create mode 100644 t/t4018/javascript-export-async-anonymous-assigned-function\n create mode 100644 t/t4018/javascript-export-async-arrow-function\n create mode 100644 t/t4018/javascript-export-async-function\n create mode 100644 t/t4018/javascript-export-async-generator-anonymous-assigned-function\n create mode 100644 t/t4018/javascript-export-async-generator-anonymous-assigned-function-2\n create mode 100644 t/t4018/javascript-export-async-generator-assigned-function\n create mode 100644 t/t4018/javascript-export-async-generator-assigned-function-2\n create mode 100644 t/t4018/javascript-export-async-generator-function\n create mode 100644 t/t4018/javascript-export-async-generator-function-2\n create mode 100644 t/t4018/javascript-export-function\n create mode 100644 t/t4018/javascript-export-generator-assigned-function\n create mode 100644 t/t4018/javascript-export-generator-assigned-function-2\n create mode 100644 t/t4018/javascript-export-generator-function\n create mode 100644 t/t4018/javascript-export-generator-function-2\n create mode 100644 t/t4018/javascript-module-dotexports-anonymous-function\n create mode 100644 t/t4018/javascript-module-dotexports-arrow-function\n create mode 100644 t/t4018/javascript-module-dotexports-arrow-function-2\n create mode 100644 t/t4018/javascript-module-dotexports-arrow-function-3\n create mode 100644 t/t4018/javascript-module-dotexports-assigned-function\n create mode 100644 t/t4018/javascript-module-dotexports-async-arrow-function\n create mode 100644 t/t4018/javascript-module-dotexports-async-arrow-function-2\n create mode 100644 t/t4018/javascript-module-dotexports-async-arrow-function-3\n create mode 100644 t/t4018/javascript-module-dotexports-async-function\n create mode 100644 t/t4018/javascript-module-dotexports-async-generator-anonymous-function\n create mode 100644 t/t4018/javascript-module-dotexports-async-generator-anonymous-function-2\n create mode 100644 t/t4018/javascript-module-dotexports-async-generator-function\n create mode 100644 t/t4018/javascript-module-dotexports-async-generator-function-2\n create mode 100644 t/t4018/javascript-module-dotexports-function\n create mode 100644 t/t4018/javascript-module-dotexports-generator-anonymous-function\n create mode 100644 t/t4018/javascript-module-dotexports-generator-anonymous-function-2\n create mode 100644 t/t4018/javascript-module-dotexports-generator-function\n create mode 100644 t/t4018/javascript-module-dotexports-generator-function-2\n\ndiff --git a/t/t4018/javascript-dotexpors-async-anonymous-function b/t/t4018/javascript-dotexpors-async-anonymous-function\nnew file mode 100644\nindex 0000000000..9f970a2343\n--- /dev/null\n+++ b/t/t4018/javascript-dotexpors-async-anonymous-function\n@@ -0,0 +1,3 @@\n+exports.RIGHT = async function(a, b) {\n+    return a + b; // ChangeMe\n+};\ndiff --git a/t/t4018/javascript-dotexports-anonymous-function b/t/t4018/javascript-dotexports-anonymous-function\nnew file mode 100644\nindex 0000000000..2fa9775c95\n--- /dev/null\n+++ b/t/t4018/javascript-dotexports-anonymous-function\n@@ -0,0 +1,3 @@\n+exports.RIGHT = function(a, b) {\n+    return a + b; //ChangeMe\n+};\ndiff --git a/t/t4018/javascript-dotexports-arrow-function b/t/t4018/javascript-dotexports-arrow-function\nnew file mode 100644\nindex 0000000000..a7d9741e90\n--- /dev/null\n+++ b/t/t4018/javascript-dotexports-arrow-function\n@@ -0,0 +1,4 @@\n+exports.RIGHT = (a, b) => {\t\n+\n+    return a+b; //ChangeMe\n+};\ndiff --git a/t/t4018/javascript-dotexports-arrow-function-2 b/t/t4018/javascript-dotexports-arrow-function-2\nnew file mode 100644\nindex 0000000000..f9cd237bb8\n--- /dev/null\n+++ b/t/t4018/javascript-dotexports-arrow-function-2\n@@ -0,0 +1,4 @@\n+exports.RIGHT = a => {\t\n+\n+    return a+1; //ChangeMe\n+};\ndiff --git a/t/t4018/javascript-dotexports-arrow-function-3 b/t/t4018/javascript-dotexports-arrow-function-3\nnew file mode 100644\nindex 0000000000..cc3f1ec017\n--- /dev/null\n+++ b/t/t4018/javascript-dotexports-arrow-function-3\n@@ -0,0 +1 @@\n+exports.RIGHT = a => a+1; //ChangeMe\ndiff --git a/t/t4018/javascript-dotexports-assigned-function b/t/t4018/javascript-dotexports-assigned-function\nnew file mode 100644\nindex 0000000000..308cc37095\n--- /dev/null\n+++ b/t/t4018/javascript-dotexports-assigned-function\n@@ -0,0 +1 @@\n+exports.RIGHT = PreviousFunction; //ChangeMe\ndiff --git a/t/t4018/javascript-dotexports-async-arrow-function b/t/t4018/javascript-dotexports-async-arrow-function\nnew file mode 100644\nindex 0000000000..01df800f19\n--- /dev/null\n+++ b/t/t4018/javascript-dotexports-async-arrow-function\n@@ -0,0 +1,3 @@\n+exports.RIGHT = async (a, b) => {\n+    return a + b; // ChangeMe\n+};\ndiff --git a/t/t4018/javascript-dotexports-async-arrow-function-2 b/t/t4018/javascript-dotexports-async-arrow-function-2\nnew file mode 100644\nindex 0000000000..453da8fcb4\n--- /dev/null\n+++ b/t/t4018/javascript-dotexports-async-arrow-function-2\n@@ -0,0 +1,4 @@\n+exports.RIGHT = async a => {\n+    \n+    return a + 1; // ChangeMe\n+};\ndiff --git a/t/t4018/javascript-dotexports-async-arrow-function-3 b/t/t4018/javascript-dotexports-async-arrow-function-3\nnew file mode 100644\nindex 0000000000..74b028cf1c\n--- /dev/null\n+++ b/t/t4018/javascript-dotexports-async-arrow-function-3\n@@ -0,0 +1 @@\n+exports.RIGHT = async a => a + 1; // ChangeMe\ndiff --git a/t/t4018/javascript-dotexports-async-function b/t/t4018/javascript-dotexports-async-function\nnew file mode 100644\nindex 0000000000..88b3539544\n--- /dev/null\n+++ b/t/t4018/javascript-dotexports-async-function\n@@ -0,0 +1,4 @@\n+exports.RIGHT = async function ChangeMe(a, b) {\n+    \n+    return a + b; // ChangeMe\n+}\ndiff --git a/t/t4018/javascript-dotexports-async-generator-anonymous-function b/t/t4018/javascript-dotexports-async-generator-anonymous-function\nnew file mode 100644\nindex 0000000000..9e90bdf489\n--- /dev/null\n+++ b/t/t4018/javascript-dotexports-async-generator-anonymous-function\n@@ -0,0 +1,5 @@\n+exports.RIGHT = async function* () {\n+    \n+    yield 1;\n+    yield 2; // ChangeMe\n+};\ndiff --git a/t/t4018/javascript-dotexports-async-generator-anonymous-function-2 b/t/t4018/javascript-dotexports-async-generator-anonymous-function-2\nnew file mode 100644\nindex 0000000000..efe2abe4f7\n--- /dev/null\n+++ b/t/t4018/javascript-dotexports-async-generator-anonymous-function-2\n@@ -0,0 +1,5 @@\n+exports.RIGHT = async function *() {\n+    \n+    yield 1;\n+    yield 2; // ChangeMe\n+};\ndiff --git a/t/t4018/javascript-dotexports-async-generator-function b/t/t4018/javascript-dotexports-async-generator-function\nnew file mode 100644\nindex 0000000000..5d352b5f29\n--- /dev/null\n+++ b/t/t4018/javascript-dotexports-async-generator-function\n@@ -0,0 +1,5 @@\n+exports.RIGHT = async function* ChangeMe() {\n+    \n+    yield 1;\n+    yield 2;\n+}\ndiff --git a/t/t4018/javascript-dotexports-async-generator-function-2 b/t/t4018/javascript-dotexports-async-generator-function-2\nnew file mode 100644\nindex 0000000000..cddc4f9628\n--- /dev/null\n+++ b/t/t4018/javascript-dotexports-async-generator-function-2\n@@ -0,0 +1,5 @@\n+exports.RIGHT = async function *ChangeMe() {\n+    \n+    yield 1;\n+    yield 2;\n+}\ndiff --git a/t/t4018/javascript-dotexports-function b/t/t4018/javascript-dotexports-function\nnew file mode 100644\nindex 0000000000..4c0c622d13\n--- /dev/null\n+++ b/t/t4018/javascript-dotexports-function\n@@ -0,0 +1,4 @@\n+exports.RIGHT = function ChangeMe(a, b) {\n+    \n+    return a + b; \n+};\ndiff --git a/t/t4018/javascript-dotexports-generator-anonymous-function b/t/t4018/javascript-dotexports-generator-anonymous-function\nnew file mode 100644\nindex 0000000000..4899abbb7b\n--- /dev/null\n+++ b/t/t4018/javascript-dotexports-generator-anonymous-function\n@@ -0,0 +1,5 @@\n+exports.RIGHT = function* () {\n+    \n+    yield 1;\n+    yield 2; // ChangeMe\n+}\ndiff --git a/t/t4018/javascript-dotexports-generator-anonymous-function-2 b/t/t4018/javascript-dotexports-generator-anonymous-function-2\nnew file mode 100644\nindex 0000000000..1f1e9995b2\n--- /dev/null\n+++ b/t/t4018/javascript-dotexports-generator-anonymous-function-2\n@@ -0,0 +1,5 @@\n+exports.RIGHT = function *() {\n+    \n+    yield 1;\n+    yield 2; // ChangeMe\n+};\ndiff --git a/t/t4018/javascript-dotexports-generator-function b/t/t4018/javascript-dotexports-generator-function\nnew file mode 100644\nindex 0000000000..837646cacc\n--- /dev/null\n+++ b/t/t4018/javascript-dotexports-generator-function\n@@ -0,0 +1,5 @@\n+exports.RIGHT = function* ChangeMe() {\n+\n+    yield 1;\n+    yield 2;\n+}\ndiff --git a/t/t4018/javascript-dotexports-generator-function-2 b/t/t4018/javascript-dotexports-generator-function-2\nnew file mode 100644\nindex 0000000000..0cc3729220\n--- /dev/null\n+++ b/t/t4018/javascript-dotexports-generator-function-2\n@@ -0,0 +1,5 @@\n+exports.RIGHT = function *ChangeMe() {\n+\n+    yield 1;\n+    yield 2;\n+}\ndiff --git a/t/t4018/javascript-export-arrow-function b/t/t4018/javascript-export-arrow-function\nnew file mode 100644\nindex 0000000000..098b457924\n--- /dev/null\n+++ b/t/t4018/javascript-export-arrow-function\n@@ -0,0 +1,4 @@\n+export const RIGHT = (a, b) => {\n+    \n+    return a + b; // ChangeMe\n+};\ndiff --git a/t/t4018/javascript-export-async-anonymous-assigned-function b/t/t4018/javascript-export-async-anonymous-assigned-function\nnew file mode 100644\nindex 0000000000..0a36b97838\n--- /dev/null\n+++ b/t/t4018/javascript-export-async-anonymous-assigned-function\n@@ -0,0 +1,4 @@\n+export const RIGHT = async function(a, b) {\n+    \n+    return a + b; //ChangeMe\n+};\ndiff --git a/t/t4018/javascript-export-async-arrow-function b/t/t4018/javascript-export-async-arrow-function\nnew file mode 100644\nindex 0000000000..557bcd1c23\n--- /dev/null\n+++ b/t/t4018/javascript-export-async-arrow-function\n@@ -0,0 +1,4 @@\n+export const RIGHT = async (a, b) => {\n+    \n+    return a + b; // ChangeMe\n+};\ndiff --git a/t/t4018/javascript-export-async-function b/t/t4018/javascript-export-async-function\nnew file mode 100644\nindex 0000000000..169f4eeed3\n--- /dev/null\n+++ b/t/t4018/javascript-export-async-function\n@@ -0,0 +1,4 @@\n+export async function RIGHT(a, b) {\n+\n+    return a + b; // ChangeMe\n+}\n\\ No newline at end of file\ndiff --git a/t/t4018/javascript-export-async-generator-anonymous-assigned-function b/t/t4018/javascript-export-async-generator-anonymous-assigned-function\nnew file mode 100644\nindex 0000000000..11ee37b2bc\n--- /dev/null\n+++ b/t/t4018/javascript-export-async-generator-anonymous-assigned-function\n@@ -0,0 +1,4 @@\n+export const RIGHT = async function* () {\n+    yield 1;\n+    yield 2; // ChangeMe\n+};\n\\ No newline at end of file\ndiff --git a/t/t4018/javascript-export-async-generator-anonymous-assigned-function-2 b/t/t4018/javascript-export-async-generator-anonymous-assigned-function-2\nnew file mode 100644\nindex 0000000000..6bff23ed2b\n--- /dev/null\n+++ b/t/t4018/javascript-export-async-generator-anonymous-assigned-function-2\n@@ -0,0 +1,4 @@\n+export const RIGHT = async function *() {\n+    yield 1;\n+    yield 2; // ChangeMe\n+};\n\\ No newline at end of file\ndiff --git a/t/t4018/javascript-export-async-generator-assigned-function b/t/t4018/javascript-export-async-generator-assigned-function\nnew file mode 100644\nindex 0000000000..3d5b1e0879\n--- /dev/null\n+++ b/t/t4018/javascript-export-async-generator-assigned-function\n@@ -0,0 +1,5 @@\n+export const RIGHT = async function* ChangeMe() {\n+\n+    yield 1;\n+    yield 2;\n+};\ndiff --git a/t/t4018/javascript-export-async-generator-assigned-function-2 b/t/t4018/javascript-export-async-generator-assigned-function-2\nnew file mode 100644\nindex 0000000000..31c674f150\n--- /dev/null\n+++ b/t/t4018/javascript-export-async-generator-assigned-function-2\n@@ -0,0 +1,5 @@\n+export const RIGHT = async function *ChangeMe() {\n+    \n+    yield 1;\n+    yield 2;\n+};\ndiff --git a/t/t4018/javascript-export-async-generator-function b/t/t4018/javascript-export-async-generator-function\nnew file mode 100644\nindex 0000000000..548589e597\n--- /dev/null\n+++ b/t/t4018/javascript-export-async-generator-function\n@@ -0,0 +1,5 @@\n+export async function* RIGHT() {\n+    \n+    yield 1;\n+    yield 2; // ChangeMe\n+}\ndiff --git a/t/t4018/javascript-export-async-generator-function-2 b/t/t4018/javascript-export-async-generator-function-2\nnew file mode 100644\nindex 0000000000..99167142d7\n--- /dev/null\n+++ b/t/t4018/javascript-export-async-generator-function-2\n@@ -0,0 +1,5 @@\n+export async function *RIGHT() {\n+\n+    yield 1;\n+    yield 2; // ChangeMe\n+}\ndiff --git a/t/t4018/javascript-export-function b/t/t4018/javascript-export-function\nnew file mode 100644\nindex 0000000000..32f38c36c6\n--- /dev/null\n+++ b/t/t4018/javascript-export-function\n@@ -0,0 +1,4 @@\n+export function RIGHT(a, b) {\n+\n+    return a + b; // ChangeMe\n+}\ndiff --git a/t/t4018/javascript-export-generator-assigned-function b/t/t4018/javascript-export-generator-assigned-function\nnew file mode 100644\nindex 0000000000..30398cd805\n--- /dev/null\n+++ b/t/t4018/javascript-export-generator-assigned-function\n@@ -0,0 +1,6 @@\n+export const RIGHT = function* () {\n+\n+    yield 1;\n+    yield 2; // ChangeMe\n+    \n+};\n\\ No newline at end of file\ndiff --git a/t/t4018/javascript-export-generator-assigned-function-2 b/t/t4018/javascript-export-generator-assigned-function-2\nnew file mode 100644\nindex 0000000000..04d2021af5\n--- /dev/null\n+++ b/t/t4018/javascript-export-generator-assigned-function-2\n@@ -0,0 +1,6 @@\n+export const RIGHT = function *() {\n+\n+    yield 1;\n+    yield 2; // ChangeMe\n+    \n+};\n\\ No newline at end of file\ndiff --git a/t/t4018/javascript-export-generator-function b/t/t4018/javascript-export-generator-function\nnew file mode 100644\nindex 0000000000..2ad38ff088\n--- /dev/null\n+++ b/t/t4018/javascript-export-generator-function\n@@ -0,0 +1,5 @@\n+export function* RIGHT() {\n+\n+    yield 1;\n+    yield 2; // ChangeMe\n+}\ndiff --git a/t/t4018/javascript-export-generator-function-2 b/t/t4018/javascript-export-generator-function-2\nnew file mode 100644\nindex 0000000000..56709a8ae9\n--- /dev/null\n+++ b/t/t4018/javascript-export-generator-function-2\n@@ -0,0 +1,5 @@\n+export function *RIGHT() {\n+    \n+    yield 1;\n+    yield 2; // ChangeMe\n+}\ndiff --git a/t/t4018/javascript-module-dotexports-anonymous-function b/t/t4018/javascript-module-dotexports-anonymous-function\nnew file mode 100644\nindex 0000000000..56c1641edb\n--- /dev/null\n+++ b/t/t4018/javascript-module-dotexports-anonymous-function\n@@ -0,0 +1,3 @@\n+module.exports.RIGHT = function(a, b) {\n+    return a + b; //ChangeMe\n+};\ndiff --git a/t/t4018/javascript-module-dotexports-arrow-function b/t/t4018/javascript-module-dotexports-arrow-function\nnew file mode 100644\nindex 0000000000..32dc4f865d\n--- /dev/null\n+++ b/t/t4018/javascript-module-dotexports-arrow-function\n@@ -0,0 +1,4 @@\n+module.exports.RIGHT = (a, b) => {\t\n+\n+    return a+b; //ChangeMe\n+};\ndiff --git a/t/t4018/javascript-module-dotexports-arrow-function-2 b/t/t4018/javascript-module-dotexports-arrow-function-2\nnew file mode 100644\nindex 0000000000..24d35f8d9e\n--- /dev/null\n+++ b/t/t4018/javascript-module-dotexports-arrow-function-2\n@@ -0,0 +1,4 @@\n+module.exports.RIGHT = a => {\t\n+\n+    return a+1; //ChangeMe\n+};\ndiff --git a/t/t4018/javascript-module-dotexports-arrow-function-3 b/t/t4018/javascript-module-dotexports-arrow-function-3\nnew file mode 100644\nindex 0000000000..333b6c6ff4\n--- /dev/null\n+++ b/t/t4018/javascript-module-dotexports-arrow-function-3\n@@ -0,0 +1 @@\n+module.exports.RIGHT = a => a+1; //ChangeMe\ndiff --git a/t/t4018/javascript-module-dotexports-assigned-function b/t/t4018/javascript-module-dotexports-assigned-function\nnew file mode 100644\nindex 0000000000..fc43431c77\n--- /dev/null\n+++ b/t/t4018/javascript-module-dotexports-assigned-function\n@@ -0,0 +1 @@\n+module.exports.RIGHT = PreviousFunction; //ChangeMe\ndiff --git a/t/t4018/javascript-module-dotexports-async-arrow-function b/t/t4018/javascript-module-dotexports-async-arrow-function\nnew file mode 100644\nindex 0000000000..b7e3341c93\n--- /dev/null\n+++ b/t/t4018/javascript-module-dotexports-async-arrow-function\n@@ -0,0 +1,3 @@\n+module.exports.RIGHT = async (a, b) => {\n+    return a + b; // ChangeMe\n+};\ndiff --git a/t/t4018/javascript-module-dotexports-async-arrow-function-2 b/t/t4018/javascript-module-dotexports-async-arrow-function-2\nnew file mode 100644\nindex 0000000000..715d3e9560\n--- /dev/null\n+++ b/t/t4018/javascript-module-dotexports-async-arrow-function-2\n@@ -0,0 +1,4 @@\n+module.exports.RIGHT = async a => {\n+    \n+    return a + 1; // ChangeMe\n+};\ndiff --git a/t/t4018/javascript-module-dotexports-async-arrow-function-3 b/t/t4018/javascript-module-dotexports-async-arrow-function-3\nnew file mode 100644\nindex 0000000000..3a8ec728a9\n--- /dev/null\n+++ b/t/t4018/javascript-module-dotexports-async-arrow-function-3\n@@ -0,0 +1 @@\n+module.exports.RIGHT = async a => a + 1; // ChangeMe\ndiff --git a/t/t4018/javascript-module-dotexports-async-function b/t/t4018/javascript-module-dotexports-async-function\nnew file mode 100644\nindex 0000000000..b931331c1b\n--- /dev/null\n+++ b/t/t4018/javascript-module-dotexports-async-function\n@@ -0,0 +1,4 @@\n+module.exports.RIGHT = async function ChangeMe(a, b) {\n+    \n+    return a + b; // ChangeMe\n+}\ndiff --git a/t/t4018/javascript-module-dotexports-async-generator-anonymous-function b/t/t4018/javascript-module-dotexports-async-generator-anonymous-function\nnew file mode 100644\nindex 0000000000..66e0acf178\n--- /dev/null\n+++ b/t/t4018/javascript-module-dotexports-async-generator-anonymous-function\n@@ -0,0 +1,5 @@\n+module.exports.RIGHT = async function* () {\n+    \n+    yield 1;\n+    yield 2; // ChangeMe\n+};\ndiff --git a/t/t4018/javascript-module-dotexports-async-generator-anonymous-function-2 b/t/t4018/javascript-module-dotexports-async-generator-anonymous-function-2\nnew file mode 100644\nindex 0000000000..c1cc0c1fce\n--- /dev/null\n+++ b/t/t4018/javascript-module-dotexports-async-generator-anonymous-function-2\n@@ -0,0 +1,5 @@\n+module.exports.RIGHT = async function *() {\n+    \n+    yield 1;\n+    yield 2; // ChangeMe\n+};\ndiff --git a/t/t4018/javascript-module-dotexports-async-generator-function b/t/t4018/javascript-module-dotexports-async-generator-function\nnew file mode 100644\nindex 0000000000..9e1dbb5b65\n--- /dev/null\n+++ b/t/t4018/javascript-module-dotexports-async-generator-function\n@@ -0,0 +1,5 @@\n+module.exports.RIGHT = async function* ChangeMe() {\n+    \n+    yield 1;\n+    yield 2;\n+}\ndiff --git a/t/t4018/javascript-module-dotexports-async-generator-function-2 b/t/t4018/javascript-module-dotexports-async-generator-function-2\nnew file mode 100644\nindex 0000000000..c886c6357b\n--- /dev/null\n+++ b/t/t4018/javascript-module-dotexports-async-generator-function-2\n@@ -0,0 +1,5 @@\n+module.exports.RIGHT = async function *ChangeMe() {\n+    \n+    yield 1;\n+    yield 2;\n+}\ndiff --git a/t/t4018/javascript-module-dotexports-function b/t/t4018/javascript-module-dotexports-function\nnew file mode 100644\nindex 0000000000..6b30d5ea98\n--- /dev/null\n+++ b/t/t4018/javascript-module-dotexports-function\n@@ -0,0 +1,4 @@\n+module.exports.RIGHT = function ChangeMe(a, b) {\n+    \n+    return a + b; \n+};\ndiff --git a/t/t4018/javascript-module-dotexports-generator-anonymous-function b/t/t4018/javascript-module-dotexports-generator-anonymous-function\nnew file mode 100644\nindex 0000000000..c77f32ac64\n--- /dev/null\n+++ b/t/t4018/javascript-module-dotexports-generator-anonymous-function\n@@ -0,0 +1,5 @@\n+module.exports.RIGHT = function* () {\n+    \n+    yield 1;\n+    yield 2; // ChangeMe\n+}\ndiff --git a/t/t4018/javascript-module-dotexports-generator-anonymous-function-2 b/t/t4018/javascript-module-dotexports-generator-anonymous-function-2\nnew file mode 100644\nindex 0000000000..318be0c172\n--- /dev/null\n+++ b/t/t4018/javascript-module-dotexports-generator-anonymous-function-2\n@@ -0,0 +1,5 @@\n+module.exports.RIGHT = function *() {\n+    \n+    yield 1;\n+    yield 2; // ChangeMe\n+};\ndiff --git a/t/t4018/javascript-module-dotexports-generator-function b/t/t4018/javascript-module-dotexports-generator-function\nnew file mode 100644\nindex 0000000000..839a6f16dc\n--- /dev/null\n+++ b/t/t4018/javascript-module-dotexports-generator-function\n@@ -0,0 +1,5 @@\n+module.exports.RIGHT = function* ChangeMe() {\n+\n+    yield 1;\n+    yield 2;\n+}\n\\ No newline at end of file\ndiff --git a/t/t4018/javascript-module-dotexports-generator-function-2 b/t/t4018/javascript-module-dotexports-generator-function-2\nnew file mode 100644\nindex 0000000000..a70100a26b\n--- /dev/null\n+++ b/t/t4018/javascript-module-dotexports-generator-function-2\n@@ -0,0 +1,5 @@\n+module.exports.RIGHT = function *ChangeMe() {\n+\n+    yield 1;\n+    yield 2;\n+}\n-- \n2.50.0.rc0.62.g658f0ae201.dirty\n\n"},{"id":"520581","messageId":"xmqqcyau5nz4.fsf@gitster.g","threadId":"63583","inReplyTo":"20250623090538.154858-2-derick.william.moraes@gmail.com","subject":"Re: [PATCH v2 1/4] userdiff: add javascript diff driver","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2025-06-23T18:09:35Z","receivedAt":"2025-06-23T18:09:37Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"\"Derick W. de M. Frias\" <derick.william.moraes@gmail.com> writes:\n\n> --- a/userdiff.c\n> +++ b/userdiff.c\n> @@ -238,33 +238,43 @@ PATTERNS(\"java\",\n>  \t \"|[-+*/<>%&^|=!]=\"\n>  \t \"|--|\\\\+\\\\+|<<=?|>>>?=?|&&|\\\\|\\\\|\"),\n>  PATTERNS(\"javascript\",\n> -     /* conventional named functions */\n> -     \"^[ \\t]*(async[ \\t]+)?function[ \\t]*\\\\*?[ \\t]*([$_a-zA-Z][$_a-zA-Z0-9]*)[ \\t]*\\\\(.*$|\"\n\nCurious to see that anything needs to be removed from \"javascript\"\nsection, when we do not have any patterns for the language in the\nfile.  Which version of Git is this patch meant to apply to?\n"},{"id":"520743","messageId":"df3f9190-79cd-49d6-934c-a67a2c0c9f0d@kdbg.org","threadId":"63583","inReplyTo":"20250623090538.154858-5-derick.william.moraes@gmail.com","subject":"Re: [PATCH v2 4/4] t4018: add tests for javascript export type function declarations","fromName":"Johannes Sixt","fromEmail":"j6t@kdbg.org","sentAt":"2025-06-26T06:21:48Z","receivedAt":"2025-06-26T06:21:56Z","isPatch":true,"sender":{"key":"j6t@kdbg.org","avatar":"https://avatars.githubusercontent.com/u/14810926?v=4"},"body":"Many of the cases are not valid tests. In particular the word \"ChangeMe\"\nmust occur *only once* and *after* the line with \"RIGHT\" and there must\nbe at least one unchanged line before it. (I wonder how these tests\ncould have passed. Do we have a flaw in the test driver?)\n\n> diff --git a/t/t4018/javascript-dotexpors-async-anonymous-function b/t/t4018/javascript-dotexpors-async-anonymous-function\n> new file mode 100644\n> index 0000000000..9f970a2343\n> --- /dev/null\n> +++ b/t/t4018/javascript-dotexpors-async-anonymous-function\n> @@ -0,0 +1,3 @@\n> +exports.RIGHT = async function(a, b) {\n> +    return a + b; // ChangeMe\n> +};\n\nHere.\n\n> diff --git a/t/t4018/javascript-dotexports-anonymous-function b/t/t4018/javascript-dotexports-anonymous-function\n> new file mode 100644\n> index 0000000000..2fa9775c95\n> --- /dev/null\n> +++ b/t/t4018/javascript-dotexports-anonymous-function\n> @@ -0,0 +1,3 @@\n> +exports.RIGHT = function(a, b) {\n> +    return a + b; //ChangeMe\n> +};\n\nHere.\n\n> diff --git a/t/t4018/javascript-dotexports-arrow-function-3 b/t/t4018/javascript-dotexports-arrow-function-3\n> new file mode 100644\n> index 0000000000..cc3f1ec017\n> --- /dev/null\n> +++ b/t/t4018/javascript-dotexports-arrow-function-3\n> @@ -0,0 +1 @@\n> +exports.RIGHT = a => a+1; //ChangeMe\n\nHere.\n\nAnd many more. You see the pattern.\n\n> +++ b/t/t4018/javascript-module-dotexports-generator-function\n> @@ -0,0 +1,5 @@\n> +module.exports.RIGHT = function* ChangeMe() {\n> +\n> +    yield 1;\n> +    yield 2;\n> +}\n> \\ No newline at end of file\n\nAn incomplete last line, again. Please look at the patch text that you\nare going to submit. Don't depend on reviewers' to notice such obvious\nglitches.\n\nI haven't found enough time for a complete review, yet. Please submit a\npatch series that does not depend on an earlier round.\n\nSplitting the test cases in separate patches is a good idea. I think you\nhave chosen a split that excercises different hunk header patterns. But\nin this case, it would also be feasible and helpful to exclude the\npattern from the earlier patch and add the pattern and the corresponding\ntest cases in the same commit.\n\n-- Hannes\n\n"}]}