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.
This commit is contained in:
Michael Davis 2022-08-03 00:09:44 -05:00 committed by GitHub
parent 69f84e2516
commit 08b442f4cc
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
20 changed files with 359 additions and 353 deletions

View file

@ -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

View file

@ -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

View file

@ -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 "^//"))

View file

@ -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

View file

@ -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

View file

@ -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 ; Function and method parameters
;------------------------------- ;-------------------------------
@ -84,174 +35,4 @@
(arrow_function (arrow_function
parameter: (identifier) @variable.parameter) parameter: (identifier) @variable.parameter)
; Function and method calls ; inherits: ecma
;--------------------------
(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

View file

@ -1,22 +1 @@
[ ; inherits: ecma
(array)
(object)
(arguments)
(formal_parameters)
(statement_block)
(object_pattern)
(class_body)
(named_imports)
(binary_expression)
(return_statement)
(template_substitution)
(export_clause)
] @indent
[
"}"
"]"
")"
] @outdent

View file

@ -1,36 +1 @@
; Parse the contents of tagged template literals using ; inherits: ecma
; 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 "^//"))

View file

@ -1,29 +1 @@
; Scopes ; inherits: ecma
;-------
[
(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

View file

@ -1,36 +1 @@
(function_declaration ; inherits: ecma
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

View file

@ -1,4 +1,4 @@
; inherits: javascript ; inherits: ecma
; Highlight component names differently ; Highlight component names differently
(jsx_opening_element ((identifier) @constructor (jsx_opening_element ((identifier) @constructor

View file

@ -1 +1 @@
; inherits: javascript ; inherits: ecma

View file

@ -1 +1 @@
; inherits: javascript ; inherits: ecma

View file

@ -1 +1 @@
; inherits: javascript ; inherits: ecma

View file

@ -1 +1 @@
; inherits: javascript ; inherits: ecma

View file

@ -1,4 +1,4 @@
; inherits: javascript ; inherits: ecma
[ [
(element) (element)

View file

@ -49,7 +49,7 @@
"readonly" "readonly"
] @keyword.storage.modifier ] @keyword.storage.modifier
; inherits: javascript ; inherits: ecma
; Types ; Types

View file

@ -1,4 +1,4 @@
; inherits: javascript ; inherits: ecma
[ [
(enum_declaration) (enum_declaration)

View file

@ -1 +1 @@
; inherits: javascript ; inherits: ecma

View file

@ -1,4 +1,4 @@
; inherits: javascript ; inherits: ecma
[ [
(interface_declaration (interface_declaration