[gtksourceview: 7/14] javascript.lang, typescript.lang: Centralize keyword regexes



commit 4ad9814eded1be81b15caddba57949f9ef45374a
Author: Jeffery To <jeffery to gmail com>
Date:   Mon Jun 8 06:51:02 2020 +0800

    javascript.lang, typescript.lang: Centralize keyword regexes
    
    Instead of spreading literal keywords in different files, define keyword
    regexes in the main language definition files (javascript.lang,
    typescript.lang).
    
    Some keyword regexes are reused in different places; having a general
    rule (all keywords defined in one place) should make maintenance easier.

 data/language-specs/javascript-expressions.lang    |  40 ++--
 .../javascript-functions-classes.lang              |  47 ++---
 data/language-specs/javascript-literals.lang       |  11 +-
 data/language-specs/javascript-modules.lang        |  28 +--
 data/language-specs/javascript-statements.lang     |  86 +++------
 data/language-specs/javascript-values.lang         |  13 +-
 data/language-specs/javascript.lang                | 202 ++++++++++++++++++++-
 data/language-specs/typescript-js-expressions.lang |   4 +-
 .../typescript-js-functions-classes.lang           |  36 ++--
 data/language-specs/typescript-js-modules.lang     |  16 +-
 data/language-specs/typescript-js-statements.lang  |  56 ++----
 data/language-specs/typescript-jsx.lang            |   6 +-
 .../typescript-type-expressions.lang               |  32 +---
 data/language-specs/typescript-type-generics.lang  |  10 +-
 data/language-specs/typescript-type-literals.lang  |  55 +++---
 data/language-specs/typescript.lang                | 139 ++++++++++++--
 16 files changed, 458 insertions(+), 323 deletions(-)
---
diff --git a/data/language-specs/javascript-expressions.lang b/data/language-specs/javascript-expressions.lang
index 772b2d61..db13c1d8 100644
--- a/data/language-specs/javascript-expressions.lang
+++ b/data/language-specs/javascript-expressions.lang
@@ -91,9 +91,7 @@
           <include>
 
             <context id="_import-meta-expression-keyword" style-ref="js:keyword" once-only="true">
-              <match extended="true">
-                \%{js:keyword-start} meta \%{js:keyword-end}
-              </match>
+              <match>\%{js:meta-keyword}</match>
             </context> <!-- /_import-meta-expression-keyword -->
 
           </include>
@@ -103,9 +101,7 @@
     </context> <!-- /_choice-import-meta-expression -->
 
     <context id="_choice-import-expression" end-parent="true">
-      <start extended="true">
-        \%{js:keyword-start} import \%{js:keyword-end}
-      </start>
+      <start>\%{js:import-keyword}</start>
       <end>\%{js:before-next-token}</end>
       <include>
         <context sub-pattern="0" where="start" style-ref="js:keyword"/>
@@ -142,9 +138,7 @@
           <include>
 
             <context id="_new-target-expression-keyword" style-ref="js:keyword" once-only="true">
-              <match extended="true">
-                \%{js:keyword-start} target \%{js:keyword-end}
-              </match>
+              <match>\%{js:target-keyword}</match>
             </context> <!-- /_new-target-expression-keyword -->
 
           </include>
@@ -169,9 +163,7 @@
     </context> <!-- /_choice-new-object-expression -->
 
     <context id="_choice-new-expression" end-parent="true">
-      <start extended="true">
-        \%{js:keyword-start} new \%{js:keyword-end}
-      </start>
+      <start>\%{js:new-keyword}</start>
       <end>\%{js:before-next-token}</end>
       <include>
         <context sub-pattern="0" where="start" style-ref="js:keyword"/>
@@ -501,7 +493,7 @@
         <!-- 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}
+            \%{js:async-keyword}
             # preceeds arrow function
             (?=
               \%{js:optional-whitespace-or-comments}
@@ -511,21 +503,19 @@
               )
             )
             # does not preceed "function" (leave to function expression)
-            (?!
-              \%{js:optional-whitespace-or-comments}
-              \%{js:keyword-start} function \%{js:keyword-end}
-            )
+            (?! \%{js:optional-whitespace-or-comments} \%{js:function-keyword} )
           </match>
         </context> <!-- /_async-keywords -->
 
+        <!-- await: ES2017 -->
         <context id="_keyword-unary-operators" style-ref="js:keyword">
-          <prefix>\%{js:keyword-start}</prefix>
-          <suffix>\%{js:keyword-end}</suffix>
-          <keyword>await</keyword> <!-- ES2017 -->
-          <keyword>delete</keyword>
-          <keyword>typeof</keyword>
-          <keyword>void</keyword>
-          <keyword>yield</keyword>
+          <match extended="true">
+            \%{js:await-keyword} |
+            \%{js:delete-keyword} |
+            \%{js:typeof-keyword} |
+            \%{js:void-keyword} |
+            \%{js:yield-keyword}
+          </match>
         </context> <!-- /_keyword-unary-operators -->
 
         <context ref="js:generator-modifier"/> <!-- for yield* -->
@@ -705,7 +695,7 @@
     <!-- # Binary operators -->
 
     <define-regex id="_keyword-binary-operator" extended="true">
-      \%{js:keyword-start} (?: instanceof | in ) \%{js:keyword-end}
+      \%{js:instanceof-keyword} | \%{js:in-keyword}
     </define-regex> <!-- /_keyword-binary-operator -->
 
     <!-- excluding comma operator -->
diff --git a/data/language-specs/javascript-functions-classes.lang 
b/data/language-specs/javascript-functions-classes.lang
index 067e5a9f..8e1307c7 100644
--- a/data/language-specs/javascript-functions-classes.lang
+++ b/data/language-specs/javascript-functions-classes.lang
@@ -44,9 +44,7 @@
     <!-- ## Function expression keyword -->
 
     <context id="_function-expression-async-keyword" style-ref="js:keyword" once-only="true">
-      <match extended="true">
-        \%{js:keyword-start} async \%{js:keyword-end}
-      </match>
+      <match>\%{js:async-keyword}</match>
     </context> <!-- /_function-expression-async-keyword -->
 
     <context id="_ordered-function-expression-async-keyword" once-only="true">
@@ -58,9 +56,7 @@
     </context> <!-- /_ordered-function-expression-async-keyword -->
 
     <context id="_function-expression-function-keyword" style-ref="js:keyword" once-only="true">
-      <match extended="true">
-        \%{js:keyword-start} function \%{js:keyword-end}
-      </match>
+      <match>\%{js:function-keyword}</match>
     </context> <!-- /_function-expression-function-keyword -->
 
     <context id="_ordered-function-expression-function-keyword" once-only="true">
@@ -242,24 +238,24 @@
           <include>
 
             <context id="_choice-method-definition-modifier-keyword" style-ref="js:keyword" 
end-parent="true">
-              <prefix>\%{js:keyword-start}</prefix>
-              <suffix>\%{js:keyword-end}</suffix>
-              <keyword>get</keyword>
-              <keyword>set</keyword>
+              <start extended="true">
+                (?= \%{js:get-keyword} | \%{js:set-keyword} )
+              </start>
+              <end extended="true">
+                \%{js:get-keyword} | \%{js:set-keyword}
+              </end>
             </context> <!-- /_choice-method-definition-modifier-keyword -->
 
             <!-- ES2017, cannot be followed by line terminator -->
             <context id="_choice-async-method-definition-modifier-keyword" style-ref="js:keyword" 
end-parent="true">
-              <match extended="true">
-                \%{js:keyword-start} async \%{js:keyword-end}
+              <start extended="true">
                 (?=
+                  \%{js:async-keyword}
                   \%{js:optional-whitespace-or-comments}
-                  (?:
-                    \%{js:identifier-start} |
-                    \%{js:generator-modifier}
-                  )
+                  (?: \%{js:identifier-start} | \%{js:generator-modifier} )
                 )
-              </match>
+              </start>
+              <end>\%{js:async-keyword}</end>
             </context> <!-- /_choice-async-method-definition-modifier-keyword -->
 
           </include>
@@ -328,9 +324,7 @@
           <include>
 
             <context id="_choice-class-optional-name-ignore-extends" end-parent="true">
-              <start extended="true">
-                (?= \%{js:keyword-start} extends \%{js:keyword-end} )
-              </start>
+              <start>(?=\%{js:extends-keyword})</start>
               <end>\%{def:always-match}</end>
             </context> <!-- /_choice-class-optional-name-ignore-extends -->
 
@@ -352,9 +346,7 @@
     <!-- ## Class extends clause -->
 
     <context id="_class-extends-clause" once-only="true">
-      <start extended="true">
-        \%{js:keyword-start} extends \%{js:keyword-end}
-      </start>
+      <start>\%{js:extends-keyword}</start>
       <end>\%{js:before-next-token}</end>
       <include>
         <context sub-pattern="0" where="start" style-ref="js:keyword"/>
@@ -391,9 +383,8 @@
           <include>
 
             <context id="_choice-class-body-member-modifier-keyword" style-ref="js:keyword" 
end-parent="true">
-              <prefix>\%{js:keyword-start}</prefix>
-              <suffix>\%{js:keyword-end}</suffix>
-              <keyword>static</keyword>
+              <start>(?=\%{js:static-keyword})</start>
+              <end>\%{js:static-keyword}</end>
             </context> <!-- /_choice-class-body-member-modifier-keyword -->
 
           </include>
@@ -455,7 +446,7 @@
 
     <!-- <ClassExpression> / <ClassDeclaration> -->
     <context id="choice-class-expression" style-ref="js:class-expression" end-parent="true">
-      <start>\%{js:class-expression-keyword}</start>
+      <start>\%{js:class-keyword}</start>
       <end>\%{js:before-next-token}</end>
       <include>
         <context sub-pattern="0" where="start" style-ref="js:keyword"/>
@@ -475,7 +466,7 @@
 
     <!-- <ClassExpression> / <ClassDeclaration> -->
     <context id="choice-class-expression-required-name" style-ref="js:class-expression" end-parent="true">
-      <start>\%{js:class-expression-keyword}</start>
+      <start>\%{js:class-keyword}</start>
       <end>\%{js:before-next-token}</end>
       <include>
         <context sub-pattern="0" where="start" style-ref="js:keyword"/>
diff --git a/data/language-specs/javascript-literals.lang b/data/language-specs/javascript-literals.lang
index c711cd71..56b11466 100644
--- a/data/language-specs/javascript-literals.lang
+++ b/data/language-specs/javascript-literals.lang
@@ -39,17 +39,14 @@
 
     <!-- <NullLiteral> -->
     <context id="null-value" style-ref="js:null-value">
-      <match extended="true">
-        \%{js:keyword-start} null \%{js:keyword-end}
-      </match>
+      <match>\%{js:null-keyword}</match>
     </context> <!-- /null-value -->
 
     <!-- <BooleanLiteral> -->
     <context id="boolean" style-ref="js:boolean">
-      <prefix>\%{js:keyword-start}</prefix>
-      <suffix>\%{js:keyword-end}</suffix>
-      <keyword>false</keyword>
-      <keyword>true</keyword>
+      <match extended="true">
+        \%{js:false-keyword} | \%{js:true-keyword}
+      </match>
     </context> <!-- /boolean -->
 
 
diff --git a/data/language-specs/javascript-modules.lang b/data/language-specs/javascript-modules.lang
index 89c93cb9..8517403a 100644
--- a/data/language-specs/javascript-modules.lang
+++ b/data/language-specs/javascript-modules.lang
@@ -43,9 +43,7 @@
     -->
 
     <context id="_from-module" once-only="true">
-      <start extended="true">
-        \%{js:keyword-start} from \%{js:keyword-end}
-      </start>
+      <start>\%{js:from-keyword}</start>
       <end>\%{js:before-next-token}</end>
       <include>
         <context sub-pattern="0" where="start" style-ref="js:keyword"/>
@@ -76,9 +74,7 @@
     -->
 
     <context id="_as-namespace" once-only="true">
-      <start extended="true">
-        \%{js:keyword-start} as \%{js:keyword-end}
-      </start>
+      <start>\%{js:as-keyword}</start>
       <end>\%{js:before-next-token}</end>
       <include>
         <context sub-pattern="0" where="start" style-ref="js:keyword"/>
@@ -140,9 +136,7 @@
           <include>
 
             <context id="_name-group-keywords" style-ref="js:keyword">
-              <prefix>\%{js:keyword-start}</prefix>
-              <suffix>\%{js:keyword-end}</suffix>
-              <keyword>default</keyword>
+              <match>\%{js:default-keyword}</match>
             </context> <!-- /_name-group-keywords -->
 
             <context ref="js:identifier"/>
@@ -153,9 +147,7 @@
     </context> <!-- /_name-group-identifier -->
 
     <context id="_name-group-as-identifier" once-only="true">
-      <start extended="true">
-        \%{js:keyword-start} as \%{js:keyword-end}
-      </start>
+      <start>\%{js:as-keyword}</start>
       <end>\%{js:before-next-token}</end>
       <include>
         <context sub-pattern="0" where="start" style-ref="js:keyword"/>
@@ -258,9 +250,7 @@
     -->
 
     <context id="_choice-export-default" end-parent="true">
-      <start extended="true">
-        \%{js:keyword-start} default \%{js:keyword-end}
-      </start>
+      <start>\%{js:default-keyword}</start>
       <end>\%{js:statement-end}</end>
       <include>
         <context sub-pattern="0" where="start" style-ref="js:keyword"/>
@@ -289,9 +279,7 @@
 
     <!-- <ExportDeclaration> -->
     <context id="export-declarations" style-ref="js:export-import-declaration">
-      <start extended="true">
-        \%{js:keyword-start} export \%{js:keyword-end}
-      </start>
+      <start>\%{js:export-keyword}</start>
       <end>\%{js:before-next-token}</end>
       <include>
         <context sub-pattern="0" where="start" style-ref="js:keyword"/>
@@ -406,9 +394,7 @@
     <!-- <ImportDeclaration> -->
     <!-- also matches import() and import.meta -->
     <context id="import-declarations" style-ref="js:export-import-declaration">
-      <start extended="true">
-        \%{js:keyword-start} import \%{js:keyword-end}
-      </start>
+      <start>\%{js:import-keyword}</start>
       <end>\%{js:before-next-token}</end>
       <include>
         <context sub-pattern="0" where="start" style-ref="js:keyword"/>
diff --git a/data/language-specs/javascript-statements.lang b/data/language-specs/javascript-statements.lang
index e37f0565..fe225f49 100644
--- a/data/language-specs/javascript-statements.lang
+++ b/data/language-specs/javascript-statements.lang
@@ -117,9 +117,7 @@
 
     <!-- <BreakStatement> -->
     <context id="_break-statements" style-ref="js:break-statement">
-      <start extended="true">
-        \%{js:keyword-start} break \%{js:keyword-end}
-      </start>
+      <start>\%{js:break-keyword}</start>
       <end>\%{js:statement-end-or-end-of-line}</end>
       <include>
         <context sub-pattern="0" where="start" style-ref="js:keyword"/>
@@ -143,7 +141,7 @@
 
     <!-- <ClassExpression> / <ClassDeclaration> -->
     <context id="_class-declarations">
-      <start>(?=\%{js:class-expression-keyword})</start>
+      <start>(?=\%{js:class-keyword})</start>
       <end>\%{js:before-next-token}</end>
       <include>
         <context ref="js:embedded-lang-hooks"/>
@@ -167,9 +165,7 @@
 
     <!-- <ContinueStatement> -->
     <context id="_continue-statements" style-ref="js:continue-statement">
-      <start extended="true">
-        \%{js:keyword-start} continue \%{js:keyword-end}
-      </start>
+      <start>\%{js:continue-keyword}</start>
       <end>\%{js:statement-end-or-end-of-line}</end>
       <include>
         <context sub-pattern="0" where="start" style-ref="js:keyword"/>
@@ -193,9 +189,7 @@
 
     <!-- <DebuggerStatement> -->
     <context id="_debugger-statements" style-ref="js:debugger-statement">
-      <start extended="true">
-        \%{js:keyword-start} debugger \%{js:keyword-end}
-      </start>
+      <start>\%{js:debugger-keyword}</start>
       <end>\%{js:statement-end}</end>
       <include>
         <context sub-pattern="0" where="start" style-ref="js:keyword"/>
@@ -250,10 +244,10 @@
         <context id="_for-statement-modifier-content">
           <include>
 
+            <!-- await: ES2018 -->
             <context id="_choice-for-statement-modifier-keyword" style-ref="js:keyword" end-parent="true">
-              <prefix>\%{js:keyword-start}</prefix>
-              <suffix>\%{js:keyword-end}</suffix>
-              <keyword>await</keyword> <!-- ES2018 -->
+              <start>(?=\%{js:await-keyword})</start>
+              <end>\%{js:await-keyword}</end>
             </context> <!-- /_choice-for-statement-modifier-keyword -->
 
           </include>
@@ -326,9 +320,7 @@
     </context> <!-- /_for-statement-test -->
 
     <context id="_for-statement-in" once-only="true">
-      <start extended="true">
-        \%{js:keyword-start} in \%{js:keyword-end}
-      </start>
+      <start>\%{js:in-keyword}</start>
       <end>\%{js:before-next-token}</end>
       <include>
         <context sub-pattern="0" where="start" style-ref="js:keyword"/>
@@ -345,9 +337,7 @@
     </context> <!-- /_for-statement-in -->
 
     <context id="_for-statement-of" once-only="true">
-      <start extended="true">
-        \%{js:keyword-start} of \%{js:keyword-end}
-      </start>
+      <start>\%{js:of-keyword}</start>
       <end>\%{js:before-next-token}</end>
       <include>
         <context sub-pattern="0" where="start" style-ref="js:keyword"/>
@@ -391,9 +381,7 @@
 
     <!-- <IterationStatement> (part of) -->
     <context id="_for-statements" style-ref="js:for-statement">
-      <start extended="true">
-        \%{js:keyword-start} for \%{js:keyword-end}
-      </start>
+      <start>\%{js:for-keyword}</start>
       <end>\%{js:before-next-token}</end>
       <include>
         <context sub-pattern="0" where="start" style-ref="js:keyword"/>
@@ -442,9 +430,7 @@
 
     <!-- <IfStatement> (part of) -->
     <context id="_if-statements" style-ref="js:if-statement">
-      <start extended="true">
-        \%{js:keyword-start} if \%{js:keyword-end}
-      </start>
+      <start>\%{js:if-keyword}</start>
       <end>\%{js:before-next-token}</end>
       <include>
         <context sub-pattern="0" where="start" style-ref="js:keyword"/>
@@ -462,9 +448,7 @@
 
     <!-- <IfStatement> (part of) -->
     <context id="_else-statements" style-ref="js:else-statement">
-      <start extended="true">
-        \%{js:keyword-start} else \%{js:keyword-end}
-      </start>
+      <start>\%{js:else-keyword}</start>
       <end>\%{js:before-next-token}</end>
       <include>
         <context sub-pattern="0" where="start" style-ref="js:keyword"/>
@@ -524,9 +508,7 @@
 
     <!-- <ReturnStatement> -->
     <context id="_return-statements" style-ref="js:return-statement">
-      <start extended="true">
-        \%{js:keyword-start} return \%{js:keyword-end}
-      </start>
+      <start>\%{js:return-keyword}</start>
       <end>\%{js:statement-end-or-end-of-line}</end>
       <include>
         <context sub-pattern="0" where="start" style-ref="js:keyword"/>
@@ -553,9 +535,7 @@
     -->
 
     <context id="_case-clauses">
-      <start extended="true">
-        \%{js:keyword-start} case \%{js:keyword-end}
-      </start>
+      <start>\%{js:case-keyword}</start>
       <end>:</end>
       <include>
         <context sub-pattern="0" where="start" style-ref="js:keyword"/>
@@ -572,9 +552,7 @@
     </context> <!-- /_case-clauses -->
 
     <context id="_default-clauses">
-      <start extended="true">
-        \%{js:keyword-start} default \%{js:keyword-end}
-      </start>
+      <start>\%{js:default-keyword}</start>
       <end>:</end>
       <include>
         <context sub-pattern="0" where="start" style-ref="js:keyword"/>
@@ -614,9 +592,7 @@
 
     <!-- <SwitchStatement> -->
     <context id="_switch-statements" style-ref="js:switch-statement">
-      <start extended="true">
-        \%{js:keyword-start} switch \%{js:keyword-end}
-      </start>
+      <start>\%{js:switch-keyword}</start>
       <end>\%{js:before-next-token}</end>
       <include>
         <context sub-pattern="0" where="start" style-ref="js:keyword"/>
@@ -641,9 +617,7 @@
 
     <!-- <ThrowStatement> -->
     <context id="_throw-statements" style-ref="js:throw-statement">
-      <start extended="true">
-        \%{js:keyword-start} throw \%{js:keyword-end}
-      </start>
+      <start>\%{js:throw-keyword}</start>
       <end>\%{js:statement-end-or-end-of-line}</end>
       <include>
         <context sub-pattern="0" where="start" style-ref="js:keyword"/>
@@ -691,9 +665,7 @@
 
     <!-- <TryStatement> -->
     <context id="_try-statements" style-ref="js:try-catch-statement">
-      <start extended="true">
-        \%{js:keyword-start} try \%{js:keyword-end}
-      </start>
+      <start>\%{js:try-keyword}</start>
       <end>\%{js:before-next-token}</end>
       <include>
         <context sub-pattern="0" where="start" style-ref="js:keyword"/>
@@ -736,9 +708,7 @@
 
     <!-- <Catch> -->
     <context id="_catch-statements" style-ref="js:try-catch-statement">
-      <start extended="true">
-        \%{js:keyword-start} catch \%{js:keyword-end}
-      </start>
+      <start>\%{js:catch-keyword}</start>
       <end>\%{js:before-next-token}</end>
       <include>
         <context sub-pattern="0" where="start" style-ref="js:keyword"/>
@@ -757,9 +727,7 @@
 
     <!-- <Finally> -->
     <context id="_finally-statements" style-ref="js:try-catch-statement">
-      <start extended="true">
-        \%{js:keyword-start} finally \%{js:keyword-end}
-      </start>
+      <start>\%{js:finally-keyword}</start>
       <end>\%{js:before-next-token}</end>
       <include>
         <context sub-pattern="0" where="start" style-ref="js:keyword"/>
@@ -784,7 +752,7 @@
     -->
 
     <define-regex id="_variable-declaration-keyword" extended="true">
-      \%{js:keyword-start} (?: const | let | var ) \%{js:keyword-end}
+      \%{js:const-keyword} | \%{js:let-keyword} | \%{js:var-keyword}
     </define-regex> <!-- /_variable-declaration-keyword -->
 
     <context id="_variable-declaration-item-content">
@@ -865,9 +833,7 @@
 
     <!-- <IterationStatement> (part of) -->
     <context id="_while-statements" style-ref="js:while-statement">
-      <start extended="true">
-        \%{js:keyword-start} while \%{js:keyword-end}
-      </start>
+      <start>\%{js:while-keyword}</start>
       <end>\%{js:statement-end}</end>
       <include>
         <context sub-pattern="0" where="start" style-ref="js:keyword"/>
@@ -885,9 +851,7 @@
 
     <!-- <IterationStatement> (part of) -->
     <context id="_do-statements" style-ref="js:while-statement">
-      <start extended="true">
-        \%{js:keyword-start} do \%{js:keyword-end}
-      </start>
+      <start>\%{js:do-keyword}</start>
       <end>\%{js:before-next-token}</end>
       <include>
         <context sub-pattern="0" where="start" style-ref="js:keyword"/>
@@ -908,9 +872,7 @@
 
     <!-- <WithStatement> -->
     <context id="_with-statements" style-ref="js:with-statement">
-      <start extended="true">
-        \%{js:keyword-start} with \%{js:keyword-end}
-      </start>
+      <start>\%{js:with-keyword}</start>
       <end>\%{js:before-next-token}</end>
       <include>
         <context sub-pattern="0" where="start" style-ref="js:keyword"/>
diff --git a/data/language-specs/javascript-values.lang b/data/language-specs/javascript-values.lang
index 4ee2b319..911a3e7c 100644
--- a/data/language-specs/javascript-values.lang
+++ b/data/language-specs/javascript-values.lang
@@ -121,13 +121,14 @@
           <keyword>WebAssembly</keyword>
         </context> <!-- /_objects -->
 
+        <!-- globalThis: ES2020 -->
         <context id="_object-keywords" style-ref="js:keyword">
-          <prefix>\%{js:keyword-start}</prefix>
-          <suffix>\%{js:keyword-end}</suffix>
-          <keyword>arguments</keyword>
-          <keyword>globalThis</keyword> <!-- ES2020 -->
-          <keyword>super</keyword>
-          <keyword>this</keyword>
+          <match extended="true">
+            \%{js:keyword-start} arguments \%{js:keyword-end} |
+            \%{js:keyword-start} globalThis \%{js:keyword-end} |
+            \%{js:super-keyword} |
+            \%{js:this-keyword}
+          </match>
         </context> <!-- /_object-keywords -->
 
       </include>
diff --git a/data/language-specs/javascript.lang b/data/language-specs/javascript.lang
index f2736729..eb63b5c6 100644
--- a/data/language-specs/javascript.lang
+++ b/data/language-specs/javascript.lang
@@ -295,20 +295,204 @@
       (?! \%{identifier-part} | \. )
     </define-regex> <!-- /number-end -->
 
+    <!-- these regexes are keywords that appear as literals in the
+         grammar -->
+
+    <define-regex id="as-keyword" extended="true">
+      \%{keyword-start} as \%{keyword-end}
+    </define-regex> <!-- /as-keyword -->
+
+    <define-regex id="async-keyword" extended="true">
+      \%{keyword-start} async \%{keyword-end}
+    </define-regex> <!-- /async-keyword -->
+
+    <define-regex id="await-keyword" extended="true">
+      \%{keyword-start} await \%{keyword-end}
+    </define-regex> <!-- /await-keyword -->
+
+    <define-regex id="break-keyword" extended="true">
+      \%{keyword-start} break \%{keyword-end}
+    </define-regex> <!-- /break-keyword -->
+
+    <define-regex id="case-keyword" extended="true">
+      \%{keyword-start} case \%{keyword-end}
+    </define-regex> <!-- /case-keyword -->
+
+    <define-regex id="catch-keyword" extended="true">
+      \%{keyword-start} catch \%{keyword-end}
+    </define-regex> <!-- /catch-keyword -->
+
+    <define-regex id="class-keyword" extended="true">
+      \%{keyword-start} class \%{keyword-end}
+    </define-regex> <!-- /class-keyword -->
+
+    <define-regex id="const-keyword" extended="true">
+      \%{keyword-start} const \%{keyword-end}
+    </define-regex> <!-- /const-keyword -->
+
+    <define-regex id="continue-keyword" extended="true">
+      \%{keyword-start} continue \%{keyword-end}
+    </define-regex> <!-- /continue-keyword -->
+
+    <define-regex id="debugger-keyword" extended="true">
+      \%{keyword-start} debugger \%{keyword-end}
+    </define-regex> <!-- /debugger-keyword -->
+
+    <define-regex id="default-keyword" extended="true">
+      \%{keyword-start} default \%{keyword-end}
+    </define-regex> <!-- /default-keyword -->
+
+    <define-regex id="delete-keyword" extended="true">
+      \%{keyword-start} delete \%{keyword-end}
+    </define-regex> <!-- /delete-keyword -->
+
+    <define-regex id="do-keyword" extended="true">
+      \%{keyword-start} do \%{keyword-end}
+    </define-regex> <!-- /do-keyword -->
+
+    <define-regex id="else-keyword" extended="true">
+      \%{keyword-start} else \%{keyword-end}
+    </define-regex> <!-- /else-keyword -->
+
+    <define-regex id="export-keyword" extended="true">
+      \%{keyword-start} export \%{keyword-end}
+    </define-regex> <!-- /export-keyword -->
+
+    <define-regex id="extends-keyword" extended="true">
+      \%{keyword-start} extends \%{keyword-end}
+    </define-regex> <!-- /extends-keyword -->
+
+    <define-regex id="false-keyword" extended="true">
+      \%{keyword-start} false \%{keyword-end}
+    </define-regex> <!-- /false-keyword -->
+
+    <define-regex id="finally-keyword" extended="true">
+      \%{keyword-start} finally \%{keyword-end}
+    </define-regex> <!-- /finally-keyword -->
+
+    <define-regex id="for-keyword" extended="true">
+      \%{keyword-start} for \%{keyword-end}
+    </define-regex> <!-- /for-keyword -->
+
+    <define-regex id="from-keyword" extended="true">
+      \%{keyword-start} from \%{keyword-end}
+    </define-regex> <!-- /from-keyword -->
+
+    <define-regex id="function-keyword" extended="true">
+      \%{keyword-start} function \%{keyword-end}
+    </define-regex> <!-- /function-keyword -->
+
+    <define-regex id="get-keyword" extended="true">
+      \%{keyword-start} get \%{keyword-end}
+    </define-regex> <!-- /get-keyword -->
+
+    <define-regex id="if-keyword" extended="true">
+      \%{keyword-start} if \%{keyword-end}
+    </define-regex> <!-- /if-keyword -->
+
+    <define-regex id="import-keyword" extended="true">
+      \%{keyword-start} import \%{keyword-end}
+    </define-regex> <!-- /import-keyword -->
+
+    <define-regex id="in-keyword" extended="true">
+      \%{keyword-start} in \%{keyword-end}
+    </define-regex> <!-- /in-keyword -->
+
+    <define-regex id="instanceof-keyword" extended="true">
+      \%{keyword-start} instanceof \%{keyword-end}
+    </define-regex> <!-- /instanceof-keyword -->
+
+    <define-regex id="let-keyword" extended="true">
+      \%{keyword-start} let \%{keyword-end}
+    </define-regex> <!-- /let-keyword -->
+
+    <define-regex id="meta-keyword" extended="true">
+      \%{keyword-start} meta \%{keyword-end}
+    </define-regex> <!-- /meta-keyword -->
+
+    <define-regex id="new-keyword" extended="true">
+      \%{keyword-start} new \%{keyword-end}
+    </define-regex> <!-- /new-keyword -->
+
+    <define-regex id="null-keyword" extended="true">
+      \%{keyword-start} null \%{keyword-end}
+    </define-regex> <!-- /null-keyword -->
+
+    <define-regex id="of-keyword" extended="true">
+      \%{keyword-start} of \%{keyword-end}
+    </define-regex> <!-- /of-keyword -->
+
+    <define-regex id="return-keyword" extended="true">
+      \%{keyword-start} return \%{keyword-end}
+    </define-regex> <!-- /return-keyword -->
+
+    <define-regex id="set-keyword" extended="true">
+      \%{keyword-start} set \%{keyword-end}
+    </define-regex> <!-- /set-keyword -->
+
+    <define-regex id="static-keyword" extended="true">
+      \%{keyword-start} static \%{keyword-end}
+    </define-regex> <!-- /static-keyword -->
+
+    <define-regex id="super-keyword" extended="true">
+      \%{keyword-start} super \%{keyword-end}
+    </define-regex> <!-- /super-keyword -->
+
+    <define-regex id="switch-keyword" extended="true">
+      \%{keyword-start} switch \%{keyword-end}
+    </define-regex> <!-- /switch-keyword -->
+
+    <define-regex id="target-keyword" extended="true">
+      \%{keyword-start} target \%{keyword-end}
+    </define-regex> <!-- /target-keyword -->
+
+    <define-regex id="this-keyword" extended="true">
+      \%{keyword-start} this \%{keyword-end}
+    </define-regex> <!-- /this-keyword -->
+
+    <define-regex id="throw-keyword" extended="true">
+      \%{keyword-start} throw \%{keyword-end}
+    </define-regex> <!-- /throw-keyword -->
+
+    <define-regex id="true-keyword" extended="true">
+      \%{keyword-start} true \%{keyword-end}
+    </define-regex> <!-- /true-keyword -->
+
+    <define-regex id="try-keyword" extended="true">
+      \%{keyword-start} try \%{keyword-end}
+    </define-regex> <!-- /try-keyword -->
+
+    <define-regex id="typeof-keyword" extended="true">
+      \%{keyword-start} typeof \%{keyword-end}
+    </define-regex> <!-- /typeof-keyword -->
+
+    <define-regex id="var-keyword" extended="true">
+      \%{keyword-start} var \%{keyword-end}
+    </define-regex> <!-- /var-keyword -->
+
+    <define-regex id="void-keyword" extended="true">
+      \%{keyword-start} void \%{keyword-end}
+    </define-regex> <!-- /void-keyword -->
+
+    <define-regex id="while-keyword" extended="true">
+      \%{keyword-start} while \%{keyword-end}
+    </define-regex> <!-- /while-keyword -->
+
+    <define-regex id="with-keyword" extended="true">
+      \%{keyword-start} with \%{keyword-end}
+    </define-regex> <!-- /with-keyword -->
+
+    <define-regex id="yield-keyword" extended="true">
+      \%{keyword-start} yield \%{keyword-end}
+    </define-regex> <!-- /yield-keyword -->
+
     <!-- async function (ES2017)
          no line terminator allowed between "async" and "function" -->
     <define-regex id="function-expression-keyword" extended="true">
-      (?:
-        \%{keyword-start} async \%{keyword-end}
-        \%{optional-whitespace-or-comments}
-      )?
-      \%{keyword-start} function \%{keyword-end}
+      (?: \%{async-keyword} \%{optional-whitespace-or-comments} )?
+      \%{function-keyword}
     </define-regex> <!-- /function-expression-keyword -->
 
-    <define-regex id="class-expression-keyword" extended="true">
-      \%{keyword-start} class \%{keyword-end}
-    </define-regex> <!-- /class-expression-keyword -->
-
     <!-- ## Embedded lang hooks
 
          a placeholder context where an embedding language (e.g. html)
diff --git a/data/language-specs/typescript-js-expressions.lang 
b/data/language-specs/typescript-js-expressions.lang
index b81a9698..407c23bf 100644
--- a/data/language-specs/typescript-js-expressions.lang
+++ b/data/language-specs/typescript-js-expressions.lang
@@ -167,9 +167,7 @@
     -->
 
     <context id="_as-operators">
-      <start extended="true">
-        \%{js:keyword-start} as \%{js:keyword-end}
-      </start>
+      <start>\%{js:as-keyword}</start>
       <end>\%{js:before-next-token}</end>
       <include>
         <context sub-pattern="0" where="start" style-ref="typescript:type-keyword"/>
diff --git a/data/language-specs/typescript-js-functions-classes.lang 
b/data/language-specs/typescript-js-functions-classes.lang
index bced506a..c16f4f9c 100644
--- a/data/language-specs/typescript-js-functions-classes.lang
+++ b/data/language-specs/typescript-js-functions-classes.lang
@@ -34,11 +34,11 @@
     <!-- # Accessibility modifier -->
 
     <context id="_accessibility-modifier" style-ref="js:keyword" once-only="true">
-      <prefix>\%{js:keyword-start}</prefix>
-      <suffix>\%{js:keyword-end}</suffix>
-      <keyword>private</keyword>
-      <keyword>protected</keyword>
-      <keyword>public</keyword>
+      <match extended="true">
+        \%{typescript:private-keyword} |
+        \%{typescript:protected-keyword} |
+        \%{typescript:public-keyword}
+      </match>
     </context> <!-- /_accessibility-modifier -->
 
     <context id="_ordered-accessibility-modifier" once-only="true">
@@ -173,9 +173,7 @@
     <!-- ## Class expression keyword -->
 
     <context id="_class-expression-abstract-keyword" style-ref="js:keyword" once-only="true">
-      <match extended="true">
-        \%{js:keyword-start} abstract \%{js:keyword-end}
-      </match>
+      <match>\%{typescript:abstract-keyword}</match>
     </context> <!-- /_class-expression-abstract-keyword -->
 
     <context id="_ordered-class-expression-abstract-keyword" once-only="true">
@@ -187,9 +185,7 @@
     </context> <!-- /_ordered-class-expression-abstract-keyword -->
 
     <context id="_class-expression-class-keyword" style-ref="js:keyword" once-only="true">
-      <match extended="true">
-        \%{js:keyword-start} class \%{js:keyword-end}
-      </match>
+      <match>\%{js:class-keyword}</match>
     </context> <!-- /_class-expression-class-keyword -->
 
     <context id="_ordered-class-expression-class-keyword" once-only="true">
@@ -207,9 +203,7 @@
       <include>
 
         <context id="_choice-class-optional-name-ignore-implements" end-parent="true">
-          <start extended="true">
-            (?= \%{js:keyword-start} implements \%{js:keyword-end} )
-          </start>
+          <start>(?=\%{typescript:implements-keyword})</start>
           <end>\%{def:always-match}</end>
         </context> <!-- /_choice-class-optional-name-ignore-implements -->
 
@@ -230,9 +224,7 @@
     <!-- ## Class implements clause -->
 
     <context id="_class-implements-clause" once-only="true">
-      <start extended="true">
-        \%{js:keyword-start} implements \%{js:keyword-end}
-      </start>
+      <start>\%{typescript:implements-keyword}</start>
       <end>\%{js:before-next-token}</end>
       <include>
         <context sub-pattern="0" where="start" style-ref="typescript:type-keyword"/>
@@ -267,11 +259,11 @@
           <include>
 
             <context id="_class-body-member-modifier-keywords" style-ref="js:keyword">
-              <prefix>\%{js:keyword-start}</prefix>
-              <suffix>\%{js:keyword-end}</suffix>
-              <keyword>abstract</keyword>
-              <keyword>declare</keyword>
-              <keyword>readonly</keyword>
+              <match extended="true">
+                \%{typescript:abstract-keyword} |
+                \%{typescript:declare-keyword} |
+                \%{typescript:readonly-keyword}
+              </match>
             </context> <!-- /_class-body-member-modifier-keywords -->
 
           </include>
diff --git a/data/language-specs/typescript-js-modules.lang b/data/language-specs/typescript-js-modules.lang
index e943160c..fa246c59 100644
--- a/data/language-specs/typescript-js-modules.lang
+++ b/data/language-specs/typescript-js-modules.lang
@@ -39,9 +39,7 @@
     -->
 
     <context id="_export-as-namespace-keyword" style-ref="js:keyword" once-only="true">
-      <match extended="true">
-        \%{js:keyword-start} namespace \%{js:keyword-end}
-      </match>
+      <match>\%{typescript:namespace-keyword}</match>
     </context> <!-- /_export-as-namespace-keyword -->
 
     <context id="_ordered-export-as-namespace-keyword" once-only="true">
@@ -53,9 +51,7 @@
     </context> <!-- /_ordered-export-as-namespace-keyword -->
 
     <context id="_choice-export-as-namespace" end-parent="true">
-      <start extended="true">
-        \%{js:keyword-start} as \%{js:keyword-end}
-      </start>
+      <start>\%{js:as-keyword}</start>
       <end>\%{js:statement-end}</end>
       <include>
         <context sub-pattern="0" where="start" style-ref="js:keyword"/>
@@ -160,9 +156,7 @@
     -->
 
     <context id="_choice-import-require" end-parent="true">
-      <start extended="true">
-        \%{js:keyword-start} require \%{js:keyword-end}
-      </start>
+      <start>\%{typescript:require-keyword}</start>
       <end>\%{js:statement-end}</end>
       <include>
         <context sub-pattern="0" where="start" style-ref="js:keyword"/>
@@ -263,9 +257,7 @@
     <!-- this is like js-mod:import-declarations but only matches import
          default (for import alias) -->
     <context id="_choice-import-default-declaration" style-ref="js:export-import-declaration" 
end-parent="true">
-      <start extended="true">
-        \%{js:keyword-start} import \%{js:keyword-end}
-      </start>
+      <start>\%{js:import-keyword}</start>
       <end>\%{js:before-next-token}</end>
       <include>
         <context sub-pattern="0" where="start" style-ref="js:keyword"/>
diff --git a/data/language-specs/typescript-js-statements.lang 
b/data/language-specs/typescript-js-statements.lang
index 1559be19..7e276b61 100644
--- a/data/language-specs/typescript-js-statements.lang
+++ b/data/language-specs/typescript-js-statements.lang
@@ -71,14 +71,8 @@
          declare global { ... }
     -->
 
-    <define-regex id="_ambient-declaration-keyword" extended="true">
-      \%{js:keyword-start} declare \%{js:keyword-end}
-    </define-regex> <!-- /_ambient-declaration-keyword -->
-
     <context id="_choice-global-augmentation" style-ref="typescript:global-augmentation" end-parent="true">
-      <start extended="true">
-        \%{js:keyword-start} global \%{js:keyword-end}
-      </start>
+      <start>\%{typescript:global-keyword}</start>
       <end>\%{js:before-next-token}</end>
       <include>
         <context sub-pattern="0" where="start" style-ref="js:keyword"/>
@@ -108,7 +102,7 @@
 
     <!-- <AmbientDeclaration> -->
     <context id="_ambient-declarations" style-ref="typescript:ambient-declaration">
-      <start>\%{_ambient-declaration-keyword}</start>
+      <start>\%{typescript:declare-keyword}</start>
       <end>\%{js:before-next-token}</end>
       <include>
         <context sub-pattern="0" where="start" style-ref="typescript:type-keyword"/>
@@ -119,7 +113,7 @@
 
     <!-- <AmbientDeclaration> -->
     <context id="choice-ambient-declaration" style-ref="typescript:ambient-declaration" end-parent="true">
-      <start>\%{_ambient-declaration-keyword}</start>
+      <start>\%{typescript:declare-keyword}</start>
       <end>\%{js:before-next-token}</end>
       <include>
         <context sub-pattern="0" where="start" style-ref="typescript:type-keyword"/>
@@ -137,10 +131,6 @@
          we need a custom const declaration to handle "const enum"
     -->
 
-    <define-regex id="_const-declaration-keyword" extended="true">
-      \%{js:keyword-start} const \%{js:keyword-end}
-    </define-regex> <!-- /_const-declaration-keyword -->
-
     <context id="_const-declaration-content">
       <include>
         <context ref="choice-enum-declaration"/>
@@ -158,7 +148,7 @@
     </context> <!-- /_const-declaration-content -->
 
     <context id="_const-declarations" style-ref="js:variable-declaration">
-      <start>\%{_const-declaration-keyword}</start>
+      <start>\%{js:const-keyword}</start>
       <end>\%{js:before-next-token}</end>
       <include>
         <context sub-pattern="0" where="start" style-ref="js:keyword"/>
@@ -168,7 +158,7 @@
     </context> <!-- /_const-declarations -->
 
     <context id="choice-const-declaration" style-ref="js:variable-declaration" end-parent="true">
-      <start>\%{_const-declaration-keyword}</start>
+      <start>\%{js:const-keyword}</start>
       <end>\%{js:before-next-token}</end>
       <include>
         <context sub-pattern="0" where="start" style-ref="js:keyword"/>
@@ -183,10 +173,6 @@
          enum Foo { A = 1, B, C }
     -->
 
-    <define-regex id="_enum-declaration-keyword" extended="true">
-      \%{js:keyword-start} enum \%{js:keyword-end}
-    </define-regex> <!-- /_enum-declaration-keyword -->
-
     <context id="_enum-member-content">
       <include>
         <context ref="typescript-type-lit:ordered-property-name"/>
@@ -244,7 +230,7 @@
 
     <!-- <EnumDeclaration> -->
     <context id="_enum-declarations" style-ref="typescript:enum-declaration">
-      <start>\%{_enum-declaration-keyword}</start>
+      <start>\%{typescript:enum-keyword}</start>
       <end>\%{js:before-next-token}</end>
       <include>
         <context sub-pattern="0" where="start" style-ref="js:keyword"/>
@@ -255,7 +241,7 @@
 
     <!-- <EnumDeclaration> -->
     <context id="choice-enum-declaration" style-ref="typescript:enum-declaration" end-parent="true">
-      <start>\%{_enum-declaration-keyword}</start>
+      <start>\%{typescript:enum-keyword}</start>
       <end>\%{js:before-next-token}</end>
       <include>
         <context sub-pattern="0" where="start" style-ref="js:keyword"/>
@@ -272,14 +258,8 @@
            AnotherThing<string, number> { ... }
     -->
 
-    <define-regex id="_interface-declaration-keyword" extended="true">
-      \%{js:keyword-start} interface \%{js:keyword-end}
-    </define-regex> <!-- /_interface-declaration-keyword -->
-
     <context id="_interface-extends-clause" once-only="true">
-      <start extended="true">
-        \%{js:keyword-start} extends \%{js:keyword-end}
-      </start>
+      <start>\%{js:extends-keyword}</start>
       <end>\%{js:before-next-token}</end>
       <include>
         <context sub-pattern="0" where="start" style-ref="typescript:type-keyword"/>
@@ -313,7 +293,7 @@
 
     <!-- <InterfaceDeclaration> -->
     <context id="_interface-declarations" style-ref="typescript:interface-declaration">
-      <start>\%{_interface-declaration-keyword}</start>
+      <start>\%{typescript:interface-keyword}</start>
       <end>\%{js:before-next-token}</end>
       <include>
         <context sub-pattern="0" where="start" style-ref="typescript:type-keyword"/>
@@ -324,7 +304,7 @@
 
     <!-- <InterfaceDeclaration> -->
     <context id="choice-interface-declaration" style-ref="typescript:interface-declaration" 
end-parent="true">
-      <start>\%{_interface-declaration-keyword}</start>
+      <start>\%{typescript:interface-keyword}</start>
       <end>\%{js:before-next-token}</end>
       <include>
         <context sub-pattern="0" where="start" style-ref="typescript:type-keyword"/>
@@ -341,10 +321,6 @@
          module "foo.bar" { ... } // "external module" for d.ts files
     -->
 
-    <define-regex id="_module-declaration-keyword" extended="true">
-      \%{js:keyword-start} module \%{js:keyword-end}
-    </define-regex> <!-- /_module-declaration-keyword -->
-
     <context id="_module-identifier-or-string" once-only="true">
       <start>\%{js:before-next-token}</start>
       <end>\%{js:before-next-token}</end>
@@ -378,7 +354,7 @@
 
     <!-- <NamespaceDeclaration> -->
     <context id="_module-declarations" style-ref="typescript:module-declaration">
-      <start>\%{_module-declaration-keyword}</start>
+      <start>\%{typescript:module-keyword}</start>
       <end>\%{js:before-next-token}</end>
       <include>
         <context sub-pattern="0" where="start" style-ref="js:keyword"/>
@@ -389,7 +365,7 @@
 
     <!-- <NamespaceDeclaration> -->
     <context id="choice-module-declaration" style-ref="typescript:module-declaration" end-parent="true">
-      <start>\%{_module-declaration-keyword}</start>
+      <start>\%{typescript:module-keyword}</start>
       <end>\%{js:before-next-token}</end>
       <include>
         <context sub-pattern="0" where="start" style-ref="js:keyword"/>
@@ -404,10 +380,6 @@
          namespace Foo.Bar { ... }
     -->
 
-    <define-regex id="_namespace-declaration-keyword" extended="true">
-      \%{js:keyword-start} namespace \%{js:keyword-end}
-    </define-regex> <!-- /_namespace-declaration-keyword -->
-
     <context id="_namespace-body" once-only="true">
       <start>{</start>
       <end>}</end>
@@ -442,7 +414,7 @@
 
     <!-- <NamespaceDeclaration> -->
     <context id="_namespace-declarations" style-ref="typescript:namespace-declaration">
-      <start>\%{_namespace-declaration-keyword}</start>
+      <start>\%{typescript:namespace-keyword}</start>
       <end>\%{js:before-next-token}</end>
       <include>
         <context sub-pattern="0" where="start" style-ref="js:keyword"/>
@@ -453,7 +425,7 @@
 
     <!-- <NamespaceDeclaration> -->
     <context id="choice-namespace-declaration" style-ref="typescript:namespace-declaration" 
end-parent="true">
-      <start>\%{_namespace-declaration-keyword}</start>
+      <start>\%{typescript:namespace-keyword}</start>
       <end>\%{js:before-next-token}</end>
       <include>
         <context sub-pattern="0" where="start" style-ref="js:keyword"/>
diff --git a/data/language-specs/typescript-jsx.lang b/data/language-specs/typescript-jsx.lang
index 1ca6ade8..635c7cea 100644
--- a/data/language-specs/typescript-jsx.lang
+++ b/data/language-specs/typescript-jsx.lang
@@ -131,11 +131,7 @@
           \%{js:optional-whitespace-or-comments}
           \%{js:identifier}
           \%{js:optional-whitespace-or-comments}
-          (?:
-            \%{js:keyword-start} extends \%{js:keyword-end} |
-            , |
-            =
-          )
+          (?: \%{js:extends-keyword} | [,=] )
         )
       </start>
       <end>\%{js:before-next-token}</end>
diff --git a/data/language-specs/typescript-type-expressions.lang 
b/data/language-specs/typescript-type-expressions.lang
index a3d6fca8..6a2f6c15 100644
--- a/data/language-specs/typescript-type-expressions.lang
+++ b/data/language-specs/typescript-type-expressions.lang
@@ -41,9 +41,7 @@
     -->
 
     <context id="_choice-infer-declaration" end-parent="true">
-      <start extended="true">
-        \%{js:keyword-start} infer \%{js:keyword-end}
-      </start>
+      <start>\%{typescript:infer-keyword}</start>
       <end>\%{js:before-next-token}</end>
       <include>
         <context sub-pattern="0" where="start" style-ref="typescript:type-keyword"/>
@@ -74,29 +72,21 @@
         <context ref="typescript-type-gen:type-parameters-list"/>
 
         <context id="_asserts-type-predicate" style-ref="typescript:type-keyword" once-only="true">
-          <match extended="true">
-            \%{js:keyword-start} asserts \%{js:keyword-end}
-          </match>
+          <match>\%{typescript:asserts-keyword}</match>
         </context> <!-- /_asserts-type-predicate -->
 
         <context id="_indexed-type-query" style-ref="typescript:type-keyword" once-only="true">
-          <match extended="true">
-            \%{js:keyword-start} keyof \%{js:keyword-end}
-          </match>
+          <match>\%{typescript:keyof-keyword}</match>
         </context> <!-- /_indexed-type-query -->
 
         <context id="_readonly-type-modifier" style-ref="typescript:type-keyword" once-only="true">
-          <match extended="true">
-            \%{js:keyword-start} readonly \%{js:keyword-end}
-          </match>
+          <match>\%{typescript:readonly-keyword}</match>
         </context> <!-- /_readonly-type-modifier -->
 
         <!-- for unique symbol subtype, can contain newlines between
              "unique" and "symbol" -->
         <context id="_unique-symbol-subtype" style-ref="typescript:basic-type" once-only="true">
-          <match extended="true">
-            \%{js:keyword-start} unique \%{js:keyword-end}
-          </match>
+          <match>\%{typescript:unique-keyword}</match>
         </context> <!-- /_unique-symbol-subtype -->
 
       </include>
@@ -291,9 +281,7 @@
 
             <!-- <TypeQuery> -->
             <context id="_choice-type-query" style-ref="typescript:type-query" end-parent="true">
-              <start extended="true">
-                \%{js:keyword-start} typeof \%{js:keyword-end}
-              </start>
+              <start>\%{js:typeof-keyword}</start>
               <end>\%{js:before-next-token}</end>
               <include>
                 <context sub-pattern="0" where="start" style-ref="typescript:type-keyword"/>
@@ -408,9 +396,7 @@
     </context> <!-- /_choice-conditional-type-operator-super-type -->
 
     <context id="_conditional-type-operators">
-      <start extended="true">
-        \%{js:keyword-start} extends \%{js:keyword-end}
-      </start>
+      <start>\%{js:extends-keyword}</start>
       <end>\%{js:before-next-token}</end>
       <include>
         <context sub-pattern="0" where="start" style-ref="typescript:type-keyword"/>
@@ -477,9 +463,7 @@
         </context> <!-- /_union-intersection-type-operators -->
 
         <context id="_type-predicate-operators">
-          <start extended="true">
-            \%{js:keyword-start} is \%{js:keyword-end}
-          </start>
+          <start>\%{typescript:is-keyword}</start>
           <end>\%{js:before-next-token}</end>
           <include>
             <context sub-pattern="0" where="start" style-ref="typescript:type-keyword"/>
diff --git a/data/language-specs/typescript-type-generics.lang 
b/data/language-specs/typescript-type-generics.lang
index d1c24001..f51fd0eb 100644
--- a/data/language-specs/typescript-type-generics.lang
+++ b/data/language-specs/typescript-type-generics.lang
@@ -39,9 +39,7 @@
 
     <!-- <Constraint> -->
     <context id="_type-parameter-constraint" once-only="true">
-      <start extended="true">
-        \%{js:keyword-start} extends \%{js:keyword-end}
-      </start>
+      <start>\%{js:extends-keyword}</start>
       <end>\%{js:before-next-token}</end>
       <include>
         <context sub-pattern="0" where="start" style-ref="typescript:type-keyword"/>
@@ -153,10 +151,8 @@
     -->
 
     <context id="const-type-assertion-keyword-end-parent" style-ref="typescript:type-keyword" 
end-parent="true">
-      <start extended="true">
-        (?= \%{js:keyword-start} const \%{js:keyword-end} )
-      </start>
-      <end>const</end>
+      <start>(?=\%{js:const-keyword})</start>
+      <end>\%{js:const-keyword}</end>
     </context> <!-- /const-type-assertion-keyword-end-parent -->
 
     <context id="_type-parameters-list-or-type-assertion-first-parameter" once-only="true">
diff --git a/data/language-specs/typescript-type-literals.lang 
b/data/language-specs/typescript-type-literals.lang
index 50f99ecb..1b1b9014 100644
--- a/data/language-specs/typescript-type-literals.lang
+++ b/data/language-specs/typescript-type-literals.lang
@@ -38,22 +38,18 @@
     -->
 
     <define-regex id="_basic-types" extended="true">
-      \%{js:keyword-start}
-      (?:
-        any |
-        bigint |
-        boolean |
-        never |
-        null |
-        number |
-        object |
-        string |
-        symbol |
-        undefined |
-        unknown |
-        void
-      )
-      \%{js:keyword-end}
+      \%{typescript:any-keyword} |
+      \%{typescript:bigint-keyword} |
+      \%{typescript:boolean-keyword} |
+      \%{typescript:never-keyword} |
+      \%{js:null-keyword} |
+      \%{typescript:number-keyword} |
+      \%{typescript:object-keyword} |
+      \%{typescript:string-keyword} |
+      \%{typescript:symbol-keyword} |
+      \%{typescript:undefined-keyword} |
+      \%{typescript:unknown-keyword} |
+      \%{js:void-keyword}
     </define-regex> <!-- /_basic-types -->
 
     <!-- <PredefinedType> -->
@@ -69,14 +65,14 @@
          false
     -->
 
-    <define-regex id="_boolean-types" extended="true">
-      \%{js:keyword-start} (?: false | true ) \%{js:keyword-end}
-    </define-regex> <!-- /_boolean-literal-types -->
-
     <!-- <PredefinedType> -->
     <context id="choice-boolean-type" style-ref="typescript:boolean-type" end-parent="true">
-      <start>(?=\%{_boolean-types})</start>
-      <end>\%{_boolean-types}</end>
+      <start extended="true">
+        (?= \%{js:false-keyword} | \%{js:true-keyword} )
+      </start>
+      <end extended="true">
+        \%{js:false-keyword} | \%{js:true-keyword}
+      </end>
     </context> <!-- /choice-boolean-type -->
 
 
@@ -107,10 +103,8 @@
 
     <!-- <ThisType> -->
     <context id="choice-this-type" style-ref="typescript:basic-type" end-parent="true">
-      <start extended="true">
-        (?= \%{js:keyword-start} this \%{js:keyword-end} )
-      </start>
-      <end>this</end>
+      <start>(?=\%{js:this-keyword})</start>
+      <end>\%{js:this-keyword}</end>
     </context> <!-- /choice-this-type -->
 
 
@@ -203,9 +197,8 @@
           <include>
 
             <context id="_choice-object-type-literal-modifier-keyword" style-ref="typescript:type-keyword" 
end-parent="true">
-              <prefix>\%{js:keyword-start}</prefix>
-              <suffix>\%{js:keyword-end}</suffix>
-              <keyword>readonly</keyword>
+              <start>(?=\%{typescript:readonly-keyword})</start>
+              <end>\%{typescript:readonly-keyword}</end>
             </context> <!-- /_choice-object-type-literal-modifier-keyword -->
 
           </include>
@@ -239,9 +232,7 @@
             <context ref="typescript:choice-type-annotation"/>
 
             <context id="_choice-mapped-type" end-parent="true">
-              <start extended="true">
-                \%{js:keyword-start} in \%{js:keyword-end}
-              </start>
+              <start>\%{js:in-keyword}</start>
               <end>\%{js:before-next-token}</end>
               <include>
                 <context sub-pattern="0" where="start" style-ref="typescript:type-keyword"/>
diff --git a/data/language-specs/typescript.lang b/data/language-specs/typescript.lang
index 1c6c3471..f2fccdff 100644
--- a/data/language-specs/typescript.lang
+++ b/data/language-specs/typescript.lang
@@ -111,21 +111,130 @@
           so we move the definitions of these regexes here
     -->
 
+    <define-regex id="abstract-keyword" extended="true">
+      \%{js:keyword-start} abstract \%{js:keyword-end}
+    </define-regex> <!-- /abstract-keyword -->
+
+    <define-regex id="any-keyword" extended="true">
+      \%{js:keyword-start} any \%{js:keyword-end}
+    </define-regex> <!-- /any-keyword -->
+
+    <define-regex id="asserts-keyword" extended="true">
+      \%{js:keyword-start} asserts \%{js:keyword-end}
+    </define-regex> <!-- /asserts-keyword -->
+
+    <define-regex id="bigint-keyword" extended="true">
+      \%{js:keyword-start} bigint \%{js:keyword-end}
+    </define-regex> <!-- /bigint-keyword -->
+
+    <define-regex id="boolean-keyword" extended="true">
+      \%{js:keyword-start} boolean \%{js:keyword-end}
+    </define-regex> <!-- /boolean-keyword -->
+
+    <define-regex id="declare-keyword" extended="true">
+      \%{js:keyword-start} declare \%{js:keyword-end}
+    </define-regex> <!-- /declare-keyword -->
+
+    <define-regex id="enum-keyword" extended="true">
+      \%{js:keyword-start} enum \%{js:keyword-end}
+    </define-regex> <!-- /enum-keyword -->
+
+    <define-regex id="global-keyword" extended="true">
+      \%{js:keyword-start} global \%{js:keyword-end}
+    </define-regex> <!-- /global-keyword -->
+
+    <define-regex id="implements-keyword" extended="true">
+      \%{js:keyword-start} implements \%{js:keyword-end}
+    </define-regex> <!-- /implements-keyword -->
+
+    <define-regex id="infer-keyword" extended="true">
+      \%{js:keyword-start} infer \%{js:keyword-end}
+    </define-regex> <!-- /infer-keyword -->
+
+    <define-regex id="interface-keyword" extended="true">
+      \%{js:keyword-start} interface \%{js:keyword-end}
+    </define-regex> <!-- /interface-keyword -->
+
+    <define-regex id="is-keyword" extended="true">
+      \%{js:keyword-start} is \%{js:keyword-end}
+    </define-regex> <!-- /is-keyword -->
+
+    <define-regex id="keyof-keyword" extended="true">
+      \%{js:keyword-start} keyof \%{js:keyword-end}
+    </define-regex> <!-- /keyof-keyword -->
+
+    <define-regex id="module-keyword" extended="true">
+      \%{js:keyword-start} module \%{js:keyword-end}
+    </define-regex> <!-- /module-keyword -->
+
+    <define-regex id="namespace-keyword" extended="true">
+      \%{js:keyword-start} namespace \%{js:keyword-end}
+    </define-regex> <!-- /namespace-keyword -->
+
+    <define-regex id="never-keyword" extended="true">
+      \%{js:keyword-start} never \%{js:keyword-end}
+    </define-regex> <!-- /never-keyword -->
+
+    <define-regex id="number-keyword" extended="true">
+      \%{js:keyword-start} number \%{js:keyword-end}
+    </define-regex> <!-- /number-keyword -->
+
+    <define-regex id="object-keyword" extended="true">
+      \%{js:keyword-start} object \%{js:keyword-end}
+    </define-regex> <!-- /object-keyword -->
+
+    <define-regex id="private-keyword" extended="true">
+      \%{js:keyword-start} private \%{js:keyword-end}
+    </define-regex> <!-- /private-keyword -->
+
+    <define-regex id="protected-keyword" extended="true">
+      \%{js:keyword-start} protected \%{js:keyword-end}
+    </define-regex> <!-- /protected-keyword -->
+
+    <define-regex id="public-keyword" extended="true">
+      \%{js:keyword-start} public \%{js:keyword-end}
+    </define-regex> <!-- /public-keyword -->
+
+    <define-regex id="readonly-keyword" extended="true">
+      \%{js:keyword-start} readonly \%{js:keyword-end}
+    </define-regex> <!-- /readonly-keyword -->
+
+    <define-regex id="require-keyword" extended="true">
+      \%{js:keyword-start} require \%{js:keyword-end}
+    </define-regex> <!-- /require-keyword -->
+
+    <define-regex id="string-keyword" extended="true">
+      \%{js:keyword-start} string \%{js:keyword-end}
+    </define-regex> <!-- /string-keyword -->
+
+    <define-regex id="symbol-keyword" extended="true">
+      \%{js:keyword-start} symbol \%{js:keyword-end}
+    </define-regex> <!-- /symbol-keyword -->
+
+    <define-regex id="type-keyword" extended="true">
+      \%{js:keyword-start} type \%{js:keyword-end}
+    </define-regex> <!-- /type-keyword -->
+
+    <define-regex id="undefined-keyword" extended="true">
+      \%{js:keyword-start} undefined \%{js:keyword-end}
+    </define-regex> <!-- /undefined-keyword -->
+
+    <define-regex id="unique-keyword" extended="true">
+      \%{js:keyword-start} unique \%{js:keyword-end}
+    </define-regex> <!-- /unique-keyword -->
+
+    <define-regex id="unknown-keyword" extended="true">
+      \%{js:keyword-start} unknown \%{js:keyword-end}
+    </define-regex> <!-- /unknown-keyword -->
+
     <!-- no line terminator allowed between "abstract" and "class"
          technically, there can be abstract class declarations but not
          abstract class expressions -->
     <define-regex id="class-expression-keyword" extended="true">
-      (?:
-        \%{js:keyword-start} abstract \%{js:keyword-end}
-        \%{js:optional-whitespace-or-comments}
-      )?
-      \%{js:keyword-start} class \%{js:keyword-end}
+      (?: \%{abstract-keyword} \%{js:optional-whitespace-or-comments} )?
+      \%{js:class-keyword}
     </define-regex> <!-- /class-expression-keyword -->
 
-    <define-regex id="type-keyword" extended="true">
-      \%{js:keyword-start} type \%{js:keyword-end}
-    </define-regex> <!-- /type-keyword -->
-
     <context id="js-ordered-string" once-only="true">
       <start>\%{js:before-next-token}</start>
       <end>\%{js:before-next-token}</end>
@@ -259,9 +368,7 @@
     <!-- ## Constructor modifier -->
 
     <context id="constructor-modifier" style-ref="type-keyword" once-only="true">
-      <prefix>\%{js:keyword-start}</prefix>
-      <suffix>\%{js:keyword-end}</suffix>
-      <keyword>new</keyword>
+      <match>\%{js:new-keyword}</match>
     </context> <!-- /constructor-modifier -->
 
     <context id="ordered-constructor-modifier" once-only="true">
@@ -323,9 +430,7 @@
           <include>
 
             <context id="_choice-this-parameter" style-ref="js:keyword" end-parent="true">
-              <match extended="true">
-                \%{js:keyword-start} this \%{js:keyword-end}
-              </match>
+              <match>\%{js:this-keyword}</match>
             </context> <!-- /_choice-this-parameter -->
 
             <context id="_js-choice-binding" end-parent="true">
@@ -552,9 +657,7 @@
     </context> <!-- /_ordered-import-type-trailing-dot -->
 
     <context id="_import-type" once-only="true">
-      <start extended="true">
-        \%{js:keyword-start} import \%{js:keyword-end}
-      </start>
+      <start>\%{js:import-keyword}</start>
       <end>\%{js:before-next-token}</end>
       <include>
         <context sub-pattern="0" where="start" style-ref="type-keyword"/>


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