From 08b442f4cc962fd83a41754aba41f742acd1e8dc Mon Sep 17 00:00:00 2001 From: Michael Davis 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