From 08b442f4cc962fd83a41754aba41f742acd1e8dc Mon Sep 17 00:00:00 2001
From: Michael Davis <mcarsondavis@gmail.com>
Date: Wed, 3 Aug 2022 00:09:44 -0500
Subject: [PATCH] Inherit javascript/typescript from common 'ecma' queries
 (#3301)

JavaScript queries now contain a few lines that prevent them from
being used whole-sale in typescript with `; inherits: javascript`.
Here we follow nvim-treesitter's way of using a fake 'ecma' language
as a common base for JavaScript and TypeScript to share as much as
we can.
---
 runtime/queries/ecma/highlights.scm        | 221 +++++++++++++++++++++
 runtime/queries/ecma/indents.scm           |  22 ++
 runtime/queries/ecma/injections.scm        |  36 ++++
 runtime/queries/ecma/locals.scm            |  29 +++
 runtime/queries/ecma/textobjects.scm       |  36 ++++
 runtime/queries/javascript/highlights.scm  | 221 +--------------------
 runtime/queries/javascript/indents.scm     |  23 +--
 runtime/queries/javascript/injections.scm  |  37 +---
 runtime/queries/javascript/locals.scm      |  30 +--
 runtime/queries/javascript/textobjects.scm |  37 +---
 runtime/queries/jsx/highlights.scm         |   2 +-
 runtime/queries/jsx/indents.scm            |   2 +-
 runtime/queries/jsx/injections.scm         |   2 +-
 runtime/queries/jsx/locals.scm             |   2 +-
 runtime/queries/jsx/textobjects.scm        |   2 +-
 runtime/queries/svelte/indents.scm         |   2 +-
 runtime/queries/typescript/highlights.scm  |   2 +-
 runtime/queries/typescript/indents.scm     |   2 +-
 runtime/queries/typescript/injections.scm  |   2 +-
 runtime/queries/typescript/textobjects.scm |   2 +-
 20 files changed, 359 insertions(+), 353 deletions(-)
 create mode 100644 runtime/queries/ecma/highlights.scm
 create mode 100644 runtime/queries/ecma/indents.scm
 create mode 100644 runtime/queries/ecma/injections.scm
 create mode 100644 runtime/queries/ecma/locals.scm
 create mode 100644 runtime/queries/ecma/textobjects.scm

diff --git a/runtime/queries/ecma/highlights.scm b/runtime/queries/ecma/highlights.scm
new file mode 100644
index 00000000..212bb875
--- /dev/null
+++ b/runtime/queries/ecma/highlights.scm
@@ -0,0 +1,221 @@
+; Special identifiers
+;--------------------
+
+([
+    (identifier)
+    (shorthand_property_identifier)
+    (shorthand_property_identifier_pattern)
+ ] @constant
+ (#match? @constant "^[A-Z_][A-Z\\d_]+$"))
+
+
+((identifier) @constructor
+ (#match? @constructor "^[A-Z]"))
+
+((identifier) @variable.builtin
+ (#match? @variable.builtin "^(arguments|module|console|window|document)$")
+ (#is-not? local))
+
+((identifier) @function.builtin
+ (#eq? @function.builtin "require")
+ (#is-not? local))
+
+; Function and method definitions
+;--------------------------------
+
+(function
+  name: (identifier) @function)
+(function_declaration
+  name: (identifier) @function)
+(method_definition
+  name: (property_identifier) @function.method)
+
+(pair
+  key: (property_identifier) @function.method
+  value: [(function) (arrow_function)])
+
+(assignment_expression
+  left: (member_expression
+    property: (property_identifier) @function.method)
+  right: [(function) (arrow_function)])
+
+(variable_declarator
+  name: (identifier) @function
+  value: [(function) (arrow_function)])
+
+(assignment_expression
+  left: (identifier) @function
+  right: [(function) (arrow_function)])
+  
+
+; Function and method calls
+;--------------------------
+
+(call_expression
+  function: (identifier) @function)
+
+(call_expression
+  function: (member_expression
+    property: (property_identifier) @function.method))
+
+; Variables
+;----------
+
+(identifier) @variable
+
+; Properties
+;-----------
+
+(property_identifier) @variable.other.member
+(shorthand_property_identifier) @variable.other.member
+(shorthand_property_identifier_pattern) @variable.other.member
+
+; Literals
+;---------
+
+(this) @variable.builtin
+(super) @variable.builtin
+
+[
+  (true)
+  (false)
+  (null)
+  (undefined)
+] @constant.builtin
+
+(comment) @comment
+
+[
+  (string)
+  (template_string)
+] @string
+
+(regex) @string.regexp
+(number) @constant.numeric.integer
+
+; Tokens
+;-------
+
+(template_substitution
+  "${" @punctuation.special
+  "}" @punctuation.special) @embedded
+
+[
+  ";"
+  "?."
+  "."
+  ","
+] @punctuation.delimiter
+
+[
+  "-"
+  "--"
+  "-="
+  "+"
+  "++"
+  "+="
+  "*"
+  "*="
+  "**"
+  "**="
+  "/"
+  "/="
+  "%"
+  "%="
+  "<"
+  "<="
+  "<<"
+  "<<="
+  "="
+  "=="
+  "==="
+  "!"
+  "!="
+  "!=="
+  "=>"
+  ">"
+  ">="
+  ">>"
+  ">>="
+  ">>>"
+  ">>>="
+  "~"
+  "^"
+  "&"
+  "|"
+  "^="
+  "&="
+  "|="
+  "&&"
+  "||"
+  "??"
+  "&&="
+  "||="
+  "??="
+  "..."
+] @operator
+
+(ternary_expression ["?" ":"] @operator)
+
+[
+  "("
+  ")"
+  "["
+  "]"
+  "{"
+  "}"
+]  @punctuation.bracket
+
+[
+  "as"
+  "async"
+  "debugger"
+  "delete"
+  "extends"
+  "from"
+  "function"
+  "get"
+  "in"
+  "instanceof"
+  "new"
+  "of"
+  "set"
+  "static"
+  "target"
+  "try"
+  "typeof"
+  "void"
+  "with"
+] @keyword
+
+[
+  "class"
+  "let"
+  "const"
+  "var"
+] @keyword.storage.type
+
+[
+  "switch"
+  "case"
+  "default"
+  "if"
+  "else"
+  "yield"
+  "throw"
+  "finally"
+  "return"
+  "catch"
+  "continue"
+  "while"
+  "break"
+  "for"
+  "do"
+  "await"
+] @keyword.control
+
+[
+  "import"
+  "export"
+] @keyword.control.import 
+
diff --git a/runtime/queries/ecma/indents.scm b/runtime/queries/ecma/indents.scm
new file mode 100644
index 00000000..a4237e59
--- /dev/null
+++ b/runtime/queries/ecma/indents.scm
@@ -0,0 +1,22 @@
+[
+  (array)
+  (object)
+  (arguments)
+  (formal_parameters)
+
+  (statement_block)
+  (object_pattern)
+  (class_body)
+  (named_imports)
+
+  (binary_expression)
+  (return_statement)
+  (template_substitution)
+  (export_clause)
+] @indent
+
+[
+  "}"
+  "]"
+  ")"
+] @outdent
diff --git a/runtime/queries/ecma/injections.scm b/runtime/queries/ecma/injections.scm
new file mode 100644
index 00000000..af3aef10
--- /dev/null
+++ b/runtime/queries/ecma/injections.scm
@@ -0,0 +1,36 @@
+; Parse the contents of tagged template literals using
+; a language inferred from the tag.
+
+(call_expression
+  function: [
+    (identifier) @injection.language
+    (member_expression
+      property: (property_identifier) @injection.language)
+  ]
+  arguments: (template_string) @injection.content)
+
+; Parse the contents of gql template literals
+
+((call_expression
+   function: (identifier) @_template_function_name
+   arguments: (template_string) @injection.content)
+ (#eq? @_template_function_name "gql")
+ (#set! injection.language "graphql"))
+
+; Parse regex syntax within regex literals
+
+((regex_pattern) @injection.content
+ (#set! injection.language "regex"))
+
+; Parse JSDoc annotations in multiline comments
+
+((comment) @injection.content
+ (#set! injection.language "jsdoc")
+ (#match? @injection.content "^/\\*+"))
+
+; Parse general tags in single line comments
+
+((comment) @injection.content
+ (#set! injection.language "comment")
+ (#match? @injection.content "^//"))
+
diff --git a/runtime/queries/ecma/locals.scm b/runtime/queries/ecma/locals.scm
new file mode 100644
index 00000000..cc5f2e14
--- /dev/null
+++ b/runtime/queries/ecma/locals.scm
@@ -0,0 +1,29 @@
+; Scopes
+;-------
+
+[
+  (statement_block)
+  (function)
+  (arrow_function)
+  (function_declaration)
+  (method_definition)
+] @local.scope
+
+; Definitions
+;------------
+
+(pattern/identifier) @local.definition
+
+(pattern/rest_pattern 
+  (identifier) @local.definition)
+  
+(arrow_function
+  parameter: (identifier) @local.definition)
+
+(variable_declarator
+  name: (identifier) @local.definition)
+
+; References
+;------------
+
+(identifier) @local.reference
diff --git a/runtime/queries/ecma/textobjects.scm b/runtime/queries/ecma/textobjects.scm
new file mode 100644
index 00000000..c80dc81b
--- /dev/null
+++ b/runtime/queries/ecma/textobjects.scm
@@ -0,0 +1,36 @@
+(function_declaration
+  body: (_) @function.inside) @function.around
+
+(function
+  body: (_) @function.inside) @function.around
+
+(arrow_function
+  body: (_) @function.inside) @function.around
+
+(method_definition
+  body: (_) @function.inside) @function.around
+
+(generator_function_declaration
+  body: (_) @function.inside) @function.around
+
+(class_declaration
+  body: (class_body) @class.inside) @class.around
+
+(class
+  (class_body) @class.inside) @class.around
+
+(export_statement
+  declaration: [
+    (function_declaration) @function.around
+    (class_declaration) @class.around 
+  ])
+
+(formal_parameters
+  ((_) @parameter.inside . ","? @parameter.around) @parameter.around)
+
+(arguments
+  ((_) @parameter.inside . ","? @parameter.around) @parameter.around)
+
+(comment) @comment.inside
+
+(comment)+ @comment.around
diff --git a/runtime/queries/javascript/highlights.scm b/runtime/queries/javascript/highlights.scm
index 9e30d0e7..58843479 100644
--- a/runtime/queries/javascript/highlights.scm
+++ b/runtime/queries/javascript/highlights.scm
@@ -1,52 +1,3 @@
-; Special identifiers
-;--------------------
-
-([
-    (identifier)
-    (shorthand_property_identifier)
-    (shorthand_property_identifier_pattern)
- ] @constant
- (#match? @constant "^[A-Z_][A-Z\\d_]+$"))
-
-
-((identifier) @constructor
- (#match? @constructor "^[A-Z]"))
-
-((identifier) @variable.builtin
- (#match? @variable.builtin "^(arguments|module|console|window|document)$")
- (#is-not? local))
-
-((identifier) @function.builtin
- (#eq? @function.builtin "require")
- (#is-not? local))
-
-; Function and method definitions
-;--------------------------------
-
-(function
-  name: (identifier) @function)
-(function_declaration
-  name: (identifier) @function)
-(method_definition
-  name: (property_identifier) @function.method)
-
-(pair
-  key: (property_identifier) @function.method
-  value: [(function) (arrow_function)])
-
-(assignment_expression
-  left: (member_expression
-    property: (property_identifier) @function.method)
-  right: [(function) (arrow_function)])
-
-(variable_declarator
-  name: (identifier) @function
-  value: [(function) (arrow_function)])
-
-(assignment_expression
-  left: (identifier) @function
-  right: [(function) (arrow_function)])
-  
 ; Function and method parameters
 ;-------------------------------
 
@@ -84,174 +35,4 @@
 (arrow_function
   parameter: (identifier) @variable.parameter)
 
-; Function and method calls
-;--------------------------
-
-(call_expression
-  function: (identifier) @function)
-
-(call_expression
-  function: (member_expression
-    property: (property_identifier) @function.method))
-
-; Variables
-;----------
-
-(identifier) @variable
-
-; Properties
-;-----------
-
-(property_identifier) @variable.other.member
-(shorthand_property_identifier) @variable.other.member
-(shorthand_property_identifier_pattern) @variable.other.member
-
-; Literals
-;---------
-
-(this) @variable.builtin
-(super) @variable.builtin
-
-[
-  (true)
-  (false)
-  (null)
-  (undefined)
-] @constant.builtin
-
-(comment) @comment
-
-[
-  (string)
-  (template_string)
-] @string
-
-(regex) @string.regexp
-(number) @constant.numeric.integer
-
-; Tokens
-;-------
-
-(template_substitution
-  "${" @punctuation.special
-  "}" @punctuation.special) @embedded
-
-[
-  ";"
-  "?."
-  "."
-  ","
-] @punctuation.delimiter
-
-[
-  "-"
-  "--"
-  "-="
-  "+"
-  "++"
-  "+="
-  "*"
-  "*="
-  "**"
-  "**="
-  "/"
-  "/="
-  "%"
-  "%="
-  "<"
-  "<="
-  "<<"
-  "<<="
-  "="
-  "=="
-  "==="
-  "!"
-  "!="
-  "!=="
-  "=>"
-  ">"
-  ">="
-  ">>"
-  ">>="
-  ">>>"
-  ">>>="
-  "~"
-  "^"
-  "&"
-  "|"
-  "^="
-  "&="
-  "|="
-  "&&"
-  "||"
-  "??"
-  "&&="
-  "||="
-  "??="
-  "..."
-] @operator
-
-(ternary_expression ["?" ":"] @operator)
-
-[
-  "("
-  ")"
-  "["
-  "]"
-  "{"
-  "}"
-]  @punctuation.bracket
-
-[
-  "as"
-  "async"
-  "debugger"
-  "delete"
-  "extends"
-  "from"
-  "function"
-  "get"
-  "in"
-  "instanceof"
-  "new"
-  "of"
-  "set"
-  "static"
-  "target"
-  "try"
-  "typeof"
-  "void"
-  "with"
-] @keyword
-
-[
-  "class"
-  "let"
-  "const"
-  "var"
-] @keyword.storage.type
-
-[
-  "switch"
-  "case"
-  "default"
-  "if"
-  "else"
-  "yield"
-  "throw"
-  "finally"
-  "return"
-  "catch"
-  "continue"
-  "while"
-  "break"
-  "for"
-  "do"
-  "await"
-] @keyword.control
-
-[
-  "import"
-  "export"
-] @keyword.control.import 
-
+; inherits: ecma
diff --git a/runtime/queries/javascript/indents.scm b/runtime/queries/javascript/indents.scm
index a4237e59..04328f09 100644
--- a/runtime/queries/javascript/indents.scm
+++ b/runtime/queries/javascript/indents.scm
@@ -1,22 +1 @@
-[
-  (array)
-  (object)
-  (arguments)
-  (formal_parameters)
-
-  (statement_block)
-  (object_pattern)
-  (class_body)
-  (named_imports)
-
-  (binary_expression)
-  (return_statement)
-  (template_substitution)
-  (export_clause)
-] @indent
-
-[
-  "}"
-  "]"
-  ")"
-] @outdent
+; inherits: ecma
diff --git a/runtime/queries/javascript/injections.scm b/runtime/queries/javascript/injections.scm
index af3aef10..04328f09 100644
--- a/runtime/queries/javascript/injections.scm
+++ b/runtime/queries/javascript/injections.scm
@@ -1,36 +1 @@
-; Parse the contents of tagged template literals using
-; a language inferred from the tag.
-
-(call_expression
-  function: [
-    (identifier) @injection.language
-    (member_expression
-      property: (property_identifier) @injection.language)
-  ]
-  arguments: (template_string) @injection.content)
-
-; Parse the contents of gql template literals
-
-((call_expression
-   function: (identifier) @_template_function_name
-   arguments: (template_string) @injection.content)
- (#eq? @_template_function_name "gql")
- (#set! injection.language "graphql"))
-
-; Parse regex syntax within regex literals
-
-((regex_pattern) @injection.content
- (#set! injection.language "regex"))
-
-; Parse JSDoc annotations in multiline comments
-
-((comment) @injection.content
- (#set! injection.language "jsdoc")
- (#match? @injection.content "^/\\*+"))
-
-; Parse general tags in single line comments
-
-((comment) @injection.content
- (#set! injection.language "comment")
- (#match? @injection.content "^//"))
-
+; inherits: ecma
diff --git a/runtime/queries/javascript/locals.scm b/runtime/queries/javascript/locals.scm
index cc5f2e14..04328f09 100644
--- a/runtime/queries/javascript/locals.scm
+++ b/runtime/queries/javascript/locals.scm
@@ -1,29 +1 @@
-; Scopes
-;-------
-
-[
-  (statement_block)
-  (function)
-  (arrow_function)
-  (function_declaration)
-  (method_definition)
-] @local.scope
-
-; Definitions
-;------------
-
-(pattern/identifier) @local.definition
-
-(pattern/rest_pattern 
-  (identifier) @local.definition)
-  
-(arrow_function
-  parameter: (identifier) @local.definition)
-
-(variable_declarator
-  name: (identifier) @local.definition)
-
-; References
-;------------
-
-(identifier) @local.reference
+; inherits: ecma
diff --git a/runtime/queries/javascript/textobjects.scm b/runtime/queries/javascript/textobjects.scm
index c80dc81b..04328f09 100644
--- a/runtime/queries/javascript/textobjects.scm
+++ b/runtime/queries/javascript/textobjects.scm
@@ -1,36 +1 @@
-(function_declaration
-  body: (_) @function.inside) @function.around
-
-(function
-  body: (_) @function.inside) @function.around
-
-(arrow_function
-  body: (_) @function.inside) @function.around
-
-(method_definition
-  body: (_) @function.inside) @function.around
-
-(generator_function_declaration
-  body: (_) @function.inside) @function.around
-
-(class_declaration
-  body: (class_body) @class.inside) @class.around
-
-(class
-  (class_body) @class.inside) @class.around
-
-(export_statement
-  declaration: [
-    (function_declaration) @function.around
-    (class_declaration) @class.around 
-  ])
-
-(formal_parameters
-  ((_) @parameter.inside . ","? @parameter.around) @parameter.around)
-
-(arguments
-  ((_) @parameter.inside . ","? @parameter.around) @parameter.around)
-
-(comment) @comment.inside
-
-(comment)+ @comment.around
+; inherits: ecma
diff --git a/runtime/queries/jsx/highlights.scm b/runtime/queries/jsx/highlights.scm
index 9be5f517..d7054336 100644
--- a/runtime/queries/jsx/highlights.scm
+++ b/runtime/queries/jsx/highlights.scm
@@ -1,4 +1,4 @@
-; inherits: javascript
+; inherits: ecma
 
 ; Highlight component names differently
 (jsx_opening_element ((identifier) @constructor
diff --git a/runtime/queries/jsx/indents.scm b/runtime/queries/jsx/indents.scm
index ff0ddfac..04328f09 100644
--- a/runtime/queries/jsx/indents.scm
+++ b/runtime/queries/jsx/indents.scm
@@ -1 +1 @@
-; inherits: javascript
+; inherits: ecma
diff --git a/runtime/queries/jsx/injections.scm b/runtime/queries/jsx/injections.scm
index ff0ddfac..04328f09 100644
--- a/runtime/queries/jsx/injections.scm
+++ b/runtime/queries/jsx/injections.scm
@@ -1 +1 @@
-; inherits: javascript
+; inherits: ecma
diff --git a/runtime/queries/jsx/locals.scm b/runtime/queries/jsx/locals.scm
index ff0ddfac..04328f09 100644
--- a/runtime/queries/jsx/locals.scm
+++ b/runtime/queries/jsx/locals.scm
@@ -1 +1 @@
-; inherits: javascript
+; inherits: ecma
diff --git a/runtime/queries/jsx/textobjects.scm b/runtime/queries/jsx/textobjects.scm
index ff0ddfac..04328f09 100644
--- a/runtime/queries/jsx/textobjects.scm
+++ b/runtime/queries/jsx/textobjects.scm
@@ -1 +1 @@
-; inherits: javascript
+; inherits: ecma
diff --git a/runtime/queries/svelte/indents.scm b/runtime/queries/svelte/indents.scm
index ef494397..99720bac 100644
--- a/runtime/queries/svelte/indents.scm
+++ b/runtime/queries/svelte/indents.scm
@@ -1,4 +1,4 @@
-; inherits: javascript
+; inherits: ecma
 
 [
   (element)
diff --git a/runtime/queries/typescript/highlights.scm b/runtime/queries/typescript/highlights.scm
index b89aa8c4..7c15cf3d 100644
--- a/runtime/queries/typescript/highlights.scm
+++ b/runtime/queries/typescript/highlights.scm
@@ -49,7 +49,7 @@
   "readonly"
 ] @keyword.storage.modifier
 
-; inherits: javascript
+; inherits: ecma
 
 ; Types
 
diff --git a/runtime/queries/typescript/indents.scm b/runtime/queries/typescript/indents.scm
index 055e170b..34db2741 100644
--- a/runtime/queries/typescript/indents.scm
+++ b/runtime/queries/typescript/indents.scm
@@ -1,4 +1,4 @@
-; inherits: javascript
+; inherits: ecma
 
 [
   (enum_declaration) 
diff --git a/runtime/queries/typescript/injections.scm b/runtime/queries/typescript/injections.scm
index ff0ddfac..04328f09 100644
--- a/runtime/queries/typescript/injections.scm
+++ b/runtime/queries/typescript/injections.scm
@@ -1 +1 @@
-; inherits: javascript
+; inherits: ecma
diff --git a/runtime/queries/typescript/textobjects.scm b/runtime/queries/typescript/textobjects.scm
index 8564236b..57be8b5f 100644
--- a/runtime/queries/typescript/textobjects.scm
+++ b/runtime/queries/typescript/textobjects.scm
@@ -1,4 +1,4 @@
-; inherits: javascript
+; inherits: ecma
 
 [
   (interface_declaration