[gtksourceview: 10/13] javascript.lang (and family): Add boundary test at start of identifiers



commit 0c1cf89d55119944b14bd263dad052294c7da187
Author: Jeffery To <jeffery to gmail com>
Date:   Mon Jun 1 15:16:13 2020 +0800

    javascript.lang (and family): Add boundary test at start of identifiers
    
    This ensures that identifiers are not partially highlighted/selected in
    cases of incorrect syntax.

 data/language-specs/javascript-expressions.lang    |  4 ++--
 data/language-specs/javascript-modules.lang        |  4 ++--
 data/language-specs/javascript-statements.lang     |  1 +
 data/language-specs/javascript.lang                | 12 +++++++----
 data/language-specs/jsx.lang                       | 24 ++++++++++++++++------
 .../typescript-type-expressions.lang               |  4 +++-
 data/language-specs/typescript.lang                |  7 ++++---
 7 files changed, 38 insertions(+), 18 deletions(-)
---
diff --git a/data/language-specs/javascript-expressions.lang b/data/language-specs/javascript-expressions.lang
index 75ea7cbb..3964f140 100644
--- a/data/language-specs/javascript-expressions.lang
+++ b/data/language-specs/javascript-expressions.lang
@@ -187,7 +187,7 @@
             <context ref="js-lit:choice-string"/>
 
             <context id="_choice-primary-expression-identifier" end-parent="true">
-              <start>(?=\%{js:identifier-start})</start>
+              <start>\%{js:identifier-container-start}</start>
               <end>\%{def:always-match}</end>
               <include>
                 <!-- no embedded-lang-hooks here -->
@@ -292,7 +292,7 @@
     -->
 
     <context id="_choice-property-identifier" end-parent="true">
-      <start>(?=\%{js:identifier-start})</start>
+      <start>\%{js:identifier-container-start}</start>
       <end>\%{def:always-match}</end>
       <include>
         <!-- no embedded-lang-hooks here -->
diff --git a/data/language-specs/javascript-modules.lang b/data/language-specs/javascript-modules.lang
index f5e9ca91..7c111ac2 100644
--- a/data/language-specs/javascript-modules.lang
+++ b/data/language-specs/javascript-modules.lang
@@ -128,7 +128,7 @@
     -->
 
     <context id="_name-group-identifier" once-only="true">
-      <start>(?=\%{js:identifier-start})</start>
+      <start>\%{js:identifier-container-start}</start>
       <end>\%{def:always-match}</end>
       <include>
         <!-- no embedded-lang-hooks here -->
@@ -378,7 +378,7 @@
     </context> <!-- /_choice-import-default-only -->
 
     <context id="_choice-import-default" end-parent="true">
-      <start>(?=\%{js:identifier-start})</start>
+      <start>\%{js:identifier-container-start}</start>
       <end>\%{js:before-next-token}</end>
       <include>
         <context ref="js:embedded-lang-hooks"/>
diff --git a/data/language-specs/javascript-statements.lang b/data/language-specs/javascript-statements.lang
index 2230b0b9..94a092fa 100644
--- a/data/language-specs/javascript-statements.lang
+++ b/data/language-specs/javascript-statements.lang
@@ -489,6 +489,7 @@
     -->
     <context id="_label-statements" style-ref="js:label-statement">
       <start extended="true">
+        (?&lt;! \%{js:identifier-char} )
         (?=
           \%{js:identifier}
           \%{js:optional-whitespace-or-comments}
diff --git a/data/language-specs/javascript.lang b/data/language-specs/javascript.lang
index 5e409511..3c68d23d 100644
--- a/data/language-specs/javascript.lang
+++ b/data/language-specs/javascript.lang
@@ -218,6 +218,10 @@
       \%{identifier-start} \%{identifier-part}*
     </define-regex> <!-- /identifier-->
 
+    <define-regex id="identifier-container-start" extended="true">
+      (?&lt;! \%{identifier-char} ) (?= \%{identifier-start} )
+    </define-regex> <!-- /identifier-container-start -->
+
     <define-regex id="keyword-start" extended="true">
       (?&lt;! \%{identifier-char} )
     </define-regex> <!-- /keyword-start -->
@@ -505,7 +509,7 @@
     </context> <!-- /_identifier-name-content -->
 
     <context id="identifier-name" once-only="true">
-      <start>(?=\%{identifier-start})</start>
+      <start>\%{identifier-container-start}</start>
       <end>\%{def:always-match}</end>
       <include>
         <!-- no embedded-lang-hooks here -->
@@ -517,7 +521,7 @@
     </context> <!-- /choice-identifier-name -->
 
     <context id="choice-identifier-name" end-parent="true">
-      <start>(?=\%{identifier-start})</start>
+      <start>\%{identifier-container-start}</start>
       <end>\%{def:always-match}</end>
       <include>
         <!-- no embedded-lang-hooks here -->
@@ -536,7 +540,7 @@
     </context> <!-- /_identifier-content -->
 
     <context id="identifier" once-only="true">
-      <start>(?=\%{identifier-start})</start>
+      <start>\%{identifier-container-start}</start>
       <end>\%{def:always-match}</end>
       <include>
         <!-- no embedded-lang-hooks here -->
@@ -548,7 +552,7 @@
     </context> <!-- /identifier -->
 
     <context id="choice-identifier" end-parent="true">
-      <start>(?=\%{identifier-start})</start>
+      <start>\%{identifier-container-start}</start>
       <end>\%{def:always-match}</end>
       <include>
         <!-- no embedded-lang-hooks here -->
diff --git a/data/language-specs/jsx.lang b/data/language-specs/jsx.lang
index a922980e..0be7b516 100644
--- a/data/language-specs/jsx.lang
+++ b/data/language-specs/jsx.lang
@@ -72,8 +72,12 @@
 
     <!-- # Names -->
 
+    <define-regex id="_identifier-char" extended="true">
+      \%{js:identifier-char} | -
+    </define-regex> <!-- /_identifier-char -->
+
     <define-regex id="_identifier-part" extended="true">
-      \%{js:identifier-part} | -
+      \%{_identifier-char} | \%{js:unicode-escape}
     </define-regex> <!-- /_identifier-part -->
 
     <!-- <JSXIdentifier> -->
@@ -81,12 +85,16 @@
       \%{js:identifier-start} \%{_identifier-part}*
     </define-regex> <!-- /_identifier -->
 
+    <define-regex id="_identifier-container-start" extended="true">
+      (?&lt;! \%{_identifier-char} ) (?= \%{js:identifier-start} )
+    </define-regex> <!-- /_identifier-container-start -->
+
     <context id="_identifier" once-only="true">
       <match>\%{_identifier}</match>
     </context> <!-- /_identifier -->
 
     <context id="_choice-identifier" end-parent="true">
-      <start>(?=\%{js:identifier-start})</start>
+      <start>\%{_identifier-container-start}</start>
       <end>\%{_identifier}</end>
     </context> <!-- /_choice-identifier -->
 
@@ -96,7 +104,9 @@
     </define-regex> <!-- /_namespaced-name -->
 
     <context id="_choice-namespaced-name" end-parent="true">
-      <start>(?=\%{_namespaced-name})</start>
+      <start extended="true">
+        (?&lt;! \%{_identifier-char} ) (?= \%{_namespaced-name} )
+      </start>
       <end>\%{_namespaced-name}</end>
     </context> <!-- /_choice-namespaced-name -->
 
@@ -106,7 +116,9 @@
     </define-regex> <!-- /_member-expression -->
 
     <context id="_choice-member-expression" end-parent="true">
-      <start>(?=\%{_member-expression})</start>
+      <start extended="true">
+        (?&lt;! \%{_identifier-char} ) (?= \%{_member-expression} )
+      </start>
       <end>\%{_member-expression}</end>
     </context> <!-- /_choice-member-expression -->
 
@@ -115,7 +127,7 @@
 
     <!-- <JSXElementName> -->
     <context id="_element-name" style-ref="xml:element-name" once-only="true">
-      <start>(?=\%{js:identifier-start})</start>
+      <start>\%{_identifier-container-start}</start>
       <end>\%{js:before-next-token}</end>
       <include>
         <context ref="js:comments"/>
@@ -165,7 +177,7 @@
 
     <!-- <JSXAttributeName> -->
     <context id="_attribute-names" style-ref="xml:attribute-name">
-      <start>(?=\%{js:identifier-start})</start>
+      <start>\%{_identifier-container-start}</start>
       <end>\%{js:before-next-token}</end>
       <include>
         <context ref="js:comments"/>
diff --git a/data/language-specs/typescript-type-expressions.lang 
b/data/language-specs/typescript-type-expressions.lang
index 6a5816ad..f1e2375e 100644
--- a/data/language-specs/typescript-type-expressions.lang
+++ b/data/language-specs/typescript-type-expressions.lang
@@ -125,7 +125,9 @@
     <!-- this will only catch simple cases :-( -->
     <context id="_choice-type-grouping-this-parameter-or-binding" end-parent="true">
       <start extended="true">
-        (?&lt;= \.\.\. ) (?= \%{js:identifier} ) |  # adding js:optional-whitespace-or-comments in between 
doesn't work
+        (?&lt;= \.\.\. )
+        (?= \%{js:identifier} ) |  # adding js:optional-whitespace-or-comments in between doesn't work
+        (?&lt;! \%{js:identifier-char} )
         (?= \%{js:identifier} \%{js:optional-whitespace-or-comments} [?:,] )
       </start>
       <end>\%{js:before-next-token}</end>
diff --git a/data/language-specs/typescript.lang b/data/language-specs/typescript.lang
index 80160f1f..3fc095c2 100644
--- a/data/language-specs/typescript.lang
+++ b/data/language-specs/typescript.lang
@@ -221,7 +221,7 @@
 
     <!-- <NamespaceName> -->
     <context id="choice-namespace-name" end-parent="true">
-      <start>(?=\%{js:identifier-start})</start>
+      <start>\%{js:identifier-container-start}</start>
       <end>\%{def:always-match}</end>
       <include>
         <!-- no comments here -->
@@ -469,6 +469,7 @@
 
     <context id="_choice-type-name-identifier-only" end-parent="true">
       <start extended="true">
+        (?&lt;! \%{js:identifier-char} )
         (?= (?&gt; \%{js:identifier} ) (?! \. ) )
       </start>
       <end>\%{def:always-match}</end>
@@ -487,7 +488,7 @@
     </context> <!-- /_choice-type-name-identifier-only -->
 
     <context id="_type-name" end-parent="true">
-      <start>(?=\%{js:identifier-start})</start>
+      <start>\%{js:identifier-container-start}</start>
       <end>\%{js:before-next-token}</end>
       <include>
         <!-- no comments here -->
@@ -584,7 +585,7 @@
 
     <!-- <TypeReference> -->
     <context id="choice-type-reference" end-parent="true">
-      <start>(?=\%{js:identifier-start})</start>
+      <start>\%{js:identifier-container-start}</start>
       <end>\%{js:before-next-token}</end>
       <include>
         <context ref="js:comments"/>


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