[gtksourceview: 2/14] javascript.lang: Fix highlighting for new.target spanning multiple lines



commit 7b0524135bd988ff8029f122d2377e15b7bc136a
Author: Jeffery To <jeffery to gmail com>
Date:   Thu Jun 4 02:11:47 2020 +0800

    javascript.lang: Fix highlighting for new.target spanning multiple lines

 data/language-specs/javascript-expressions.lang | 115 ++++++++++++++++--------
 data/language-specs/javascript-values.lang      |  23 -----
 data/language-specs/javascript.lang             |   7 --
 tests/syntax-highlighting/file.j                |  11 +--
 tests/syntax-highlighting/file.js               |  11 +--
 tests/syntax-highlighting/file.jsx              |  11 +--
 tests/syntax-highlighting/file.ts               |  11 +--
 tests/syntax-highlighting/file.tsx              |  11 +--
 8 files changed, 98 insertions(+), 102 deletions(-)
---
diff --git a/data/language-specs/javascript-expressions.lang b/data/language-specs/javascript-expressions.lang
index bc11e09a..13175eb1 100644
--- a/data/language-specs/javascript-expressions.lang
+++ b/data/language-specs/javascript-expressions.lang
@@ -37,11 +37,11 @@
     <!--
          Expression / context structure:
 
-         left-hand side (lhs) expression:  new Array ()
-                                           === ===== ==
-                                           /     |     \
-                                pre-primary   primary   post-primary
-                                expression   expression  expression
+         left-hand side (lhs) expression:  Array ()
+                                           ===== ==
+                                            /      \
+                                     primary        post-primary
+                                 expression          expression
 
          expression: - obj.count + 1
                      = ========= ===
@@ -51,49 +51,70 @@
     -->
 
 
-    <!-- # Pre-primary expression -->
+    <!-- # "new" expression
 
-    <context id="_pre-primary-expression">
+         new Array()
+         new.target
+    -->
+
+    <!-- <NewTarget> (part of) -->
+    <context id="_choice-new-target-expression" end-parent="true">
+      <start>\.</start>
+      <end>\%{js:before-next-token}</end>
       <include>
+        <context sub-pattern="0" where="start" style-ref="js:keyword"/>
         <context ref="js:embedded-lang-hooks"/>
+        <context ref="js:comments"/>
 
-        <!-- ES2017, cannot be followed by line terminator -->
-        <context id="_async-pre-primary-expression-keywords" style-ref="js:keyword">
-          <match extended="true">
-            \%{js:keyword-start} async \%{js:keyword-end}
-            (?=                                       # preceeds arrow function
-              \%{js:optional-whitespace-or-comments}
-              (?:
-                \%{js:identifier}
-                \%{js:optional-whitespace-or-comments}
-                =&gt; |
-                \(                                      # can this be better?
-              )
-            )
-            (?!                                       # does not preceed "function" (leave to function 
expression)
-              \%{js:optional-whitespace-or-comments}
-              \%{js:keyword-start} function \%{js:keyword-end}
-            )
-          </match>
-        </context> <!-- /_async-pre-primary-expression-keywords -->
+        <context id="_new-target-expression-content">
+          <include>
 
-        <context id="_new-pre-primary-expression-keywords" style-ref="js:keyword">
-          <match extended="true">
-            \%{js:keyword-start} new \%{js:keyword-end}
-            (?! \%{js:new-target-object-keyword-suffix} )
-          </match>
-        </context> <!-- /_new-pre-primary-expression-keywords -->
+            <context id="_new-target-expression-keyword" style-ref="js:keyword" once-only="true">
+              <match extended="true">
+                \%{js:keyword-start} target \%{js:keyword-end}
+              </match>
+            </context> <!-- /_new-target-expression-keyword -->
+
+          </include>
+        </context> <!-- /_new-target-expression-content -->
 
       </include>
-    </context> <!-- /_pre-primary-expression -->
+    </context> <!-- /_choice-new-target-expression -->
 
-    <context id="_ordered-pre-primary-expression" once-only="true">
+    <context id="_choice-new-object-expression" end-parent="true">
       <start>\%{js:before-next-token}</start>
       <end>\%{js:before-next-token}</end>
       <include>
-        <context ref="_pre-primary-expression"/>
+        <context ref="js:embedded-lang-hooks"/>
+        <context ref="js:comments"/>
+
+        <context id="_new-object-expression-content">
+          <include>
+            <context ref="_primary-expression"/>
+          </include>
+        </context> <!-- /_new-object-expression-content -->
+      </include>
+    </context> <!-- /_choice-new-object-expression -->
+
+    <context id="_choice-new-expression" end-parent="true">
+      <start extended="true">
+        \%{js:keyword-start} new \%{js:keyword-end}
+      </start>
+      <end>\%{js:before-next-token}</end>
+      <include>
+        <context sub-pattern="0" where="start" style-ref="js:keyword"/>
+        <context ref="js:embedded-lang-hooks"/>
+        <context ref="js:comments"/>
+
+        <context id="_new-expression-content">
+          <include>
+            <context ref="_choice-new-target-expression"/>
+            <context ref="_choice-new-object-expression"/>
+          </include>
+        </context> <!-- /_new-expression-content -->
+
       </include>
-    </context> <!-- /_ordered-pre-primary-expression -->
+    </context> <!-- /_choice-new-expression -->
 
 
     <!-- # Grouping / arrow function parameters
@@ -182,6 +203,7 @@
             <context ref="js-lit:choice-template-literal"/>
             <context ref="js-fn:choice-function-expression"/>
             <context ref="js-fn:choice-class-expression"/>
+            <context ref="_choice-new-expression"/>
             <context ref="_choice-grouping"/>
             <context ref="js-lit:choice-number"/>
             <context ref="js-lit:choice-string"/>
@@ -403,6 +425,26 @@
         <context ref="js:embedded-lang-hooks"/>
         <context ref="_increment-decrement-operators"/>
 
+        <!-- ES2017, cannot be followed by line terminator -->
+        <context id="_async-keywords" style-ref="js:keyword">
+          <match extended="true">
+            \%{js:keyword-start} async \%{js:keyword-end}
+            # preceeds arrow function
+            (?=
+              \%{js:optional-whitespace-or-comments}
+              (?:
+                \%{js:identifier} \%{js:optional-whitespace-or-comments} =&gt; |
+                \(  # can this be better?
+              )
+            )
+            # does not preceed "function" (leave to function expression)
+            (?!
+              \%{js:optional-whitespace-or-comments}
+              \%{js:keyword-start} function \%{js:keyword-end}
+            )
+          </match>
+        </context> <!-- /_async-keywords -->
+
         <context id="_keyword-unary-operators" style-ref="js:keyword">
           <prefix>\%{js:keyword-start}</prefix>
           <suffix>\%{js:keyword-end}</suffix>
@@ -462,7 +504,6 @@
 
         <context id="_lhs-expression-content">
           <include>
-            <context ref="_ordered-pre-primary-expression"/>
             <context ref="_ordered-primary-expression"/>
             <context ref="_ordered-post-primary-expression"/>
           </include>
diff --git a/data/language-specs/javascript-values.lang b/data/language-specs/javascript-values.lang
index 3224afd6..8dd510f0 100644
--- a/data/language-specs/javascript-values.lang
+++ b/data/language-specs/javascript-values.lang
@@ -143,29 +143,6 @@
           </include>
         </context> <!-- /_import-function-keywords -->
 
-        <context id="_new-target-object-keywords">
-          <start extended="true">
-            \%{js:keyword-start} new \%{js:keyword-end}
-            (?= \%{js:new-target-object-keyword-suffix} )
-          </start>
-          <end extended="true">
-            \%{js:keyword-start} target \%{js:keyword-end}
-          </end>
-          <include>
-            <context sub-pattern="0" where="start" style-ref="js:keyword"/>
-            <context sub-pattern="0" where="end" style-ref="js:keyword"/>
-            <!-- no embedded-lang-hooks here -->
-            <context ref="js:comments"/>
-
-            <context id="_new-target-object-keyword-content">
-              <include>
-                <context ref="js:ordered-keyword-dot"/>
-              </include>
-            </context> <!-- /_new-target-object-keyword-content -->
-
-          </include>
-        </context> <!-- /_new-target-object-keywords -->
-
       </include>
     </context> <!-- /global-values -->
 
diff --git a/data/language-specs/javascript.lang b/data/language-specs/javascript.lang
index 503dc0ee..089bba6a 100644
--- a/data/language-specs/javascript.lang
+++ b/data/language-specs/javascript.lang
@@ -291,13 +291,6 @@
       \%{optional-whitespace-or-comments} \(
     </define-regex> <!-- /import-function-keyword-suffix -->
 
-    <define-regex id="new-target-object-keyword-suffix" extended="true">
-      \%{optional-whitespace-or-comments}
-      \.
-      \%{optional-whitespace-or-comments}
-      target \%{keyword-end}
-    </define-regex> <!-- /new-target-object-keyword-suffix -->
-
     <!-- async function (ES2017)
          no line terminator allowed between "async" and "function" -->
     <define-regex id="function-expression-keyword" extended="true">
diff --git a/tests/syntax-highlighting/file.j b/tests/syntax-highlighting/file.j
index 3b96edba..d46990f7 100644
--- a/tests/syntax-highlighting/file.j
+++ b/tests/syntax-highlighting/file.j
@@ -526,15 +526,12 @@ Math.random();
 // object keywords
 arguments;
 globalThis; // ES2020
-new.target;
-new . /* comment */ target;
 super;
 this;
-// incorrectly highlighted
-new .
-target;
-new . /* comment
-*/ target;
+
+// new.target
+new.target;
+new . /* comment */ target;
 new // comment
 .target;
 
diff --git a/tests/syntax-highlighting/file.js b/tests/syntax-highlighting/file.js
index e3f2de2d..9a5dd5dc 100644
--- a/tests/syntax-highlighting/file.js
+++ b/tests/syntax-highlighting/file.js
@@ -225,15 +225,12 @@ Math.random();
 // object keywords
 arguments;
 globalThis; // ES2020
-new.target;
-new . /* comment */ target;
 super;
 this;
-// incorrectly highlighted
-new .
-target;
-new . /* comment
-*/ target;
+
+// new.target
+new.target;
+new . /* comment */ target;
 new // comment
 .target;
 
diff --git a/tests/syntax-highlighting/file.jsx b/tests/syntax-highlighting/file.jsx
index 5da9cc5a..d7c32319 100644
--- a/tests/syntax-highlighting/file.jsx
+++ b/tests/syntax-highlighting/file.jsx
@@ -282,15 +282,12 @@ Math.random();
 // object keywords
 arguments;
 globalThis; // ES2020
-new.target;
-new . /* comment */ target;
 super;
 this;
-// incorrectly highlighted
-new .
-target;
-new . /* comment
-*/ target;
+
+// new.target
+new.target;
+new . /* comment */ target;
 new // comment
 .target;
 
diff --git a/tests/syntax-highlighting/file.ts b/tests/syntax-highlighting/file.ts
index 47887693..b80e7d57 100644
--- a/tests/syntax-highlighting/file.ts
+++ b/tests/syntax-highlighting/file.ts
@@ -822,15 +822,12 @@ Math.random();
 // object keywords
 arguments;
 globalThis; // ES2020
-new.target;
-new . /* comment */ target;
 super;
 this;
-// incorrectly highlighted
-new .
-target;
-new . /* comment
-*/ target;
+
+// new.target
+new.target;
+new . /* comment */ target;
 new // comment
 .target;
 
diff --git a/tests/syntax-highlighting/file.tsx b/tests/syntax-highlighting/file.tsx
index caab96c1..a681d28b 100644
--- a/tests/syntax-highlighting/file.tsx
+++ b/tests/syntax-highlighting/file.tsx
@@ -930,15 +930,12 @@ Math.random();
 // object keywords
 arguments;
 globalThis; // ES2020
-new.target;
-new . /* comment */ target;
 super;
 this;
-// incorrectly highlighted
-new .
-target;
-new . /* comment
-*/ target;
+
+// new.target
+new.target;
+new . /* comment */ target;
 new // comment
 .target;
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]