diff mbox series

[v2] userdiff: add builtin driver for typescript language

Message ID 20240404163827.5855-1-utsavp0213@gmail.com (mailing list archive)
State New, archived
Headers show
Series [v2] userdiff: add builtin driver for typescript language | expand

Commit Message

Utsav Parmar April 4, 2024, 4:38 p.m. UTC
Signed-off-by: Utsav Parmar <utsavp0213@gmail.com>
---
 Documentation/gitattributes.txt          |  2 ++
 t/t4018/typescript-arrow-function        |  4 +++
 t/t4018/typescript-class-member-function |  7 +++++
 t/t4018/typescript-enum                  |  6 +++++
 t/t4018/typescript-function              |  4 +++
 t/t4018/typescript-function-assignment   |  4 +++
 t/t4018/typescript-interface             |  4 +++
 t/t4018/typescript-type                  |  4 +++
 t/t4034-diff-words.sh                    |  1 +
 t/t4034/typescript/expect                | 33 ++++++++++++++++++++++++
 t/t4034/typescript/post                  | 16 ++++++++++++
 t/t4034/typescript/pre                   | 16 ++++++++++++
 userdiff.c                               | 16 ++++++++++++
 13 files changed, 117 insertions(+)
 create mode 100644 t/t4018/typescript-arrow-function
 create mode 100644 t/t4018/typescript-class-member-function
 create mode 100644 t/t4018/typescript-enum
 create mode 100644 t/t4018/typescript-function
 create mode 100644 t/t4018/typescript-function-assignment
 create mode 100644 t/t4018/typescript-interface
 create mode 100644 t/t4018/typescript-type
 create mode 100644 t/t4034/typescript/expect
 create mode 100644 t/t4034/typescript/post
 create mode 100644 t/t4034/typescript/pre

Comments

Junio C Hamano April 5, 2024, 5:43 p.m. UTC | #1
Utsav Parmar <utsavp0213@gmail.com> writes:

> Subject: Re: [PATCH v2] userdiff: add builtin driver for typescript language

"builtin driver" -> "patterns", probably, as the "userdiff"
customization does not allow adding any new code.

> diff --git a/Documentation/gitattributes.txt b/Documentation/gitattributes.txt
> index 4338d023d9..4461c41054 100644
> --- a/Documentation/gitattributes.txt
> +++ b/Documentation/gitattributes.txt
> @@ -902,6 +902,8 @@ patterns are available:
>  
>  - `tex` suitable for source code for LaTeX documents.
>  
> +- `typescript` suitable for source code for TypeScript language.
> +

Good that you did not forget to add an entry to this list (and to
the right place).

> diff --git a/t/t4018/typescript-function-assignment b/t/t4018/typescript-function-assignment
> new file mode 100644
> index 0000000000..49c528713e
> --- /dev/null
> +++ b/t/t4018/typescript-function-assignment
> @@ -0,0 +1,4 @@
> +const RIGHT = function(one: number): Type {
> +    someMethodCall();
> +    return ChangeMe;
> +}
> diff --git a/t/t4018/typescript-interface b/t/t4018/typescript-interface
> new file mode 100644
> index 0000000000..6f3665c2af
> --- /dev/null
> +++ b/t/t4018/typescript-interface
> @@ -0,0 +1,4 @@
> +interface RIGHT {
> +  one?: string;
> +  [propName: ChangeMe]: any;
> +}
> \ No newline at end of file

I do not speak typescript, but is it important for the language that
the sources can be stored with an incomplete line at the end of the
file?  IOW, I am wondering if it is deliberate *and* matters to the
tests that some sample files end with an incomplete line while
others do not.

If that is not the case, please fix this and the next file; we do
not generally want a file with an incomplete line at the end unless
there is a compelling reason to (i.e., we do test that our tools
work with such files, and it may be convenient to ship sample input
with incomplete lines to run such tests).

As to the actual pattern and the words the patterns catch, I have no
idea if they are sensible for typescript language---folks with more
experience than myself should lend their eyeballs to review.

Thanks.
Junio C Hamano April 5, 2024, 5:47 p.m. UTC | #2
Utsav Parmar <utsavp0213@gmail.com> writes:

>...
> diff --git a/t/t4034/typescript/expect b/t/t4034/typescript/expect
> new file mode 100644
> index 0000000000..19605fec4d
> --- /dev/null
> +++ b/t/t4034/typescript/expect
> @@ -0,0 +1,33 @@
> +<BOLD>diff --git a/pre b/post<RESET>
> +<BOLD>index e4a51a2..9c56465 100644<RESET>
> +<BOLD>--- a/pre<RESET>
> +<BOLD>+++ b/post<RESET>
> +<CYAN>@@ -1,16 +1,16 @@<RESET>
> +log("Hello World<RED>!\n<RESET><GREEN>?<RESET>")
> +<GREEN>(<RESET>1<GREEN>) (<RESET>-1e10<GREEN>) (<RESET>0xabcdef<GREEN>) u<RESET>'<RED>x<RESET><GREEN>y<RESET>'
> +!<RED>a<RESET><GREEN>x<RESET> ~<RED>a a<RESET><GREEN>x x<RESET>++ <RED>a<RESET><GREEN>x<RESET>-- <RED>a<RESET><GREEN>x<RESET>*<RED>b a<RESET><GREEN>y x<RESET>&<RED>b
> <RESET>

There is a funny line-wrapping around here that corrupts the patch.

> +<RED>a<RESET><GREEN>y
> <RESET>
diff mbox series

Patch

diff --git a/Documentation/gitattributes.txt b/Documentation/gitattributes.txt
index 4338d023d9..4461c41054 100644
--- a/Documentation/gitattributes.txt
+++ b/Documentation/gitattributes.txt
@@ -902,6 +902,8 @@  patterns are available:
 
 - `tex` suitable for source code for LaTeX documents.
 
+- `typescript` suitable for source code for TypeScript language.
+
 
 Customizing word diff
 ^^^^^^^^^^^^^^^^^^^^^
diff --git a/t/t4018/typescript-arrow-function b/t/t4018/typescript-arrow-function
new file mode 100644
index 0000000000..85a3d9cd6b
--- /dev/null
+++ b/t/t4018/typescript-arrow-function
@@ -0,0 +1,4 @@ 
+const RIGHT = (one) => {
+    someMethodCall();
+    return ChangeMe;
+}
diff --git a/t/t4018/typescript-class-member-function b/t/t4018/typescript-class-member-function
new file mode 100644
index 0000000000..f34b0a2bac
--- /dev/null
+++ b/t/t4018/typescript-class-member-function
@@ -0,0 +1,7 @@ 
+class Test {
+	var one;
+	function RIGHT(two: string) {
+		someMethodCall();
+		return ChangeMe;
+	}
+}
diff --git a/t/t4018/typescript-enum b/t/t4018/typescript-enum
new file mode 100644
index 0000000000..8c045a45ec
--- /dev/null
+++ b/t/t4018/typescript-enum
@@ -0,0 +1,6 @@ 
+enum RIGHT {
+    ONE = 1,
+    TWO,
+    THREE,
+    ChangeMe
+}
diff --git a/t/t4018/typescript-function b/t/t4018/typescript-function
new file mode 100644
index 0000000000..62cf63f669
--- /dev/null
+++ b/t/t4018/typescript-function
@@ -0,0 +1,4 @@ 
+function RIGHT<Type implements AnotherType>(one: number): Type {
+    someMethodCall();
+    return ChangeMe;
+}
diff --git a/t/t4018/typescript-function-assignment b/t/t4018/typescript-function-assignment
new file mode 100644
index 0000000000..49c528713e
--- /dev/null
+++ b/t/t4018/typescript-function-assignment
@@ -0,0 +1,4 @@ 
+const RIGHT = function(one: number): Type {
+    someMethodCall();
+    return ChangeMe;
+}
diff --git a/t/t4018/typescript-interface b/t/t4018/typescript-interface
new file mode 100644
index 0000000000..6f3665c2af
--- /dev/null
+++ b/t/t4018/typescript-interface
@@ -0,0 +1,4 @@ 
+interface RIGHT {
+  one?: string;
+  [propName: ChangeMe]: any;
+}
\ No newline at end of file
diff --git a/t/t4018/typescript-type b/t/t4018/typescript-type
new file mode 100644
index 0000000000..e1bb2d8371
--- /dev/null
+++ b/t/t4018/typescript-type
@@ -0,0 +1,4 @@ 
+type RIGHT = {
+  one: number,
+  ChangeMe: CustomType
+}
\ No newline at end of file
diff --git a/t/t4034-diff-words.sh b/t/t4034-diff-words.sh
index 74586f3813..4e3cf415c2 100755
--- a/t/t4034-diff-words.sh
+++ b/t/t4034-diff-words.sh
@@ -338,6 +338,7 @@  test_language_driver python
 test_language_driver ruby
 test_language_driver scheme
 test_language_driver tex
+test_language_driver typescript
 
 test_expect_success 'word-diff with diff.sbe' '
 	cat >pre <<-\EOF &&
diff --git a/t/t4034/typescript/expect b/t/t4034/typescript/expect
new file mode 100644
index 0000000000..19605fec4d
--- /dev/null
+++ b/t/t4034/typescript/expect
@@ -0,0 +1,33 @@ 
+<BOLD>diff --git a/pre b/post<RESET>
+<BOLD>index e4a51a2..9c56465 100644<RESET>
+<BOLD>--- a/pre<RESET>
+<BOLD>+++ b/post<RESET>
+<CYAN>@@ -1,16 +1,16 @@<RESET>
+log("Hello World<RED>!\n<RESET><GREEN>?<RESET>")
+<GREEN>(<RESET>1<GREEN>) (<RESET>-1e10<GREEN>) (<RESET>0xabcdef<GREEN>) u<RESET>'<RED>x<RESET><GREEN>y<RESET>'
+!<RED>a<RESET><GREEN>x<RESET> ~<RED>a a<RESET><GREEN>x x<RESET>++ <RED>a<RESET><GREEN>x<RESET>-- <RED>a<RESET><GREEN>x<RESET>*<RED>b a<RESET><GREEN>y x<RESET>&<RED>b
<RESET>
+<RED>a<RESET><GREEN>y
<RESET>
+<GREEN>x<RESET>*<RED>b a<RESET><GREEN>y x<RESET>/<RED>b a<RESET><GREEN>y x<RESET>%<RED>b
<RESET>
+<RED>a<RESET><GREEN>y
<RESET>
+<GREEN>x<RESET>+<RED>b a<RESET><GREEN>y x<RESET>-<RED>b
<RESET>
+<RED>a<RESET><GREEN>y
<RESET>
+<GREEN>x<RESET><<<RED>b a<RESET><GREEN>y x<RESET>>><RED>b
<RESET>
+<RED>a<RESET><GREEN>y
<RESET>
+<GREEN>x<RESET><<RED>b a<RESET><GREEN>y x<RESET><=<RED>b a<RESET><GREEN>y x<RESET>><RED>b a<RESET><GREEN>y x<RESET>>=<RED>b
<RESET>
+<RED>a<RESET><GREEN>y
<RESET>
+<GREEN>x<RESET>==<RED>b a<RESET><GREEN>y x<RESET>!=<RED>b
<RESET>
+<RED>a<RESET><GREEN>y
<RESET>
+<GREEN>x<RESET>&<RED>b
<RESET>
+<RED>a<RESET><GREEN>y
<RESET>
+<GREEN>x<RESET>^<RED>b
<RESET>
+<RED>a<RESET><GREEN>y
<RESET>
+<GREEN>x<RESET>|<RED>b
<RESET>
+<RED>a<RESET><GREEN>y
<RESET>
+<GREEN>x<RESET>&&<RED>b
<RESET>
+<RED>a<RESET><GREEN>y
<RESET>
+<GREEN>x<RESET>||<RED>b
<RESET>
+<RED>a<RESET><GREEN>y
<RESET>
+<GREEN>x<RESET>?<RED>b<RESET><GREEN>y<RESET>:z
+<RED>a<RESET><GREEN>x<RESET>=<RED>b a<RESET><GREEN>y x<RESET>+=<RED>b a<RESET><GREEN>y x<RESET>-=<RED>b a<RESET><GREEN>y x<RESET>*=<RED>b a<RESET><GREEN>y x<RESET>/=<RED>b a<RESET><GREEN>y x<RESET>%=<RED>b a<RESET><GREEN>y x<RESET><<=<RED>b a<RESET><GREEN>y x<RESET>>>=<RED>b a<RESET><GREEN>y x<RESET>&=<RED>b a<RESET><GREEN>y x<RESET>^=<RED>b a<RESET><GREEN>y x<RESET>|=<RED>b
<RESET>
+<RED>a<RESET><GREEN>y
<RESET>
+<GREEN>x<RESET>,y
diff --git a/t/t4034/typescript/post b/t/t4034/typescript/post
new file mode 100644
index 0000000000..b1b03a7666
--- /dev/null
+++ b/t/t4034/typescript/post
@@ -0,0 +1,16 @@ 
+log("Hello World?")
+(1) (-1e10) (0xabcdef) u'y'
+!x ~x x++ x-- x*y x&y
+x*y x/y x%y
+x+y x-y
+x<<y x>>y
+x<y x<=y x>y x>=y
+x==y x!=y
+x&y
+x^y
+x|y
+x&&y
+x||y
+x?y:z
+x=y x+=y x-=y x*=y x/=y x%=y x<<=y x>>=y x&=y x^=y x|=y
+x,y
diff --git a/t/t4034/typescript/pre b/t/t4034/typescript/pre
new file mode 100644
index 0000000000..13a0b2138c
--- /dev/null
+++ b/t/t4034/typescript/pre
@@ -0,0 +1,16 @@ 
+log("Hello World!\n")
+1 -1e10 0xabcdef 'x'
+!a ~a a++ a-- a*b a&b
+a*b a/b a%b
+a+b a-b
+a<<b a>>b
+a<b a<=b a>b a>=b
+a==b a!=b
+a&b
+a^b
+a|b
+a&&b
+a||b
+a?b:z
+a=b a+=b a-=b a*=b a/=b a%=b a<<=b a>>=b a&=b a^=b a|=b
+a,y
diff --git a/userdiff.c b/userdiff.c
index 92ef649c99..dbb5d7c072 100644
--- a/userdiff.c
+++ b/userdiff.c
@@ -297,6 +297,22 @@  PATTERNS("scheme",
 	 "|([^][)(}{[ \t])+"),
 PATTERNS("tex", "^(\\\\((sub)*section|chapter|part)\\*{0,1}\\{.*)$",
 	 "\\\\[a-zA-Z@]+|\\\\.|([a-zA-Z0-9]|[^\x01-\x7f])+"),
+PATTERNS("typescript",
+         "^[ \t]*((enum|interface|type)[ \t]+([a-zA-Z][a-zA-Z0-9]*)+.*)$\n"
+         /* Method definitions */
+         "^[ \t]*[a-z]+[ \t]+([A-Za-z_][A-Za-z_0-9]*)+([ \t]*=[ \t]*(function)?)?([ \t]*[A-Za-z_<>&][?&<>|.,A-Za-z_]*[ \t]*)*[ \t]*\\([^;]*$",
+         /* -- */
+         "[a-zA-Z_][a-zA-Z0-9_]*"
+         /* Integers and floats */
+         "|[-+]?[0-9]*\\.?[0-9]+([eE][-+]?[0-9]+)?"
+         /* Binary */
+         "|0[bB][01]+"
+         /* Hexadecimals */
+         "|0[xX][0-9a-fA-F]+"
+         /* Floats starting with a decimal point */
+         "|[-+]?([0-9]*\\.?[0-9]+|[0-9]+\\.?[0-9]*)([eE][-+]?[0-9]+)?"
+         /* Operators */
+         "[-+*/%&|^!=<>]=?|===|!==|<<=?|>>=?|&&|\\|\\||\\?\\?|\\+\\+|--|~"),
 { "default", NULL, NULL, -1, { NULL, 0 } },
 };
 #undef PATTERNS