From 08b442f4cc962fd83a41754aba41f742acd1e8dc Mon Sep 17 00:00:00 2001 From: Michael Davis Date: Wed, 3 Aug 2022 00:09:44 -0500 Subject: 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 ++++++ 5 files changed, 344 insertions(+) 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 (limited to 'runtime/queries/ecma') 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 -- cgit v1.2.3-70-g09d2