From e21cbdb71431399e7419797f663dfbf5c8a50332 Mon Sep 17 00:00:00 2001 From: Benedikt Ritter Date: Tue, 20 Feb 2024 16:05:12 +0100 Subject: [PATCH] Extend groovy support Use more complete parser introduced in nvm-treesitter in https://github.com/nvim-treesitter/nvim-treesitter/commit/d4dac523d2546afc266eb9b5a7986690b5319c41 --- book/src/generated/lang-support.md | 2 +- languages.toml | 2 +- runtime/queries/groovy/folds.scm | 6 + runtime/queries/groovy/highlights.scm | 330 ++++++++++++++++++++------ runtime/queries/groovy/indents.scm | 35 +++ runtime/queries/groovy/injections.scm | 7 +- runtime/queries/groovy/locals.scm | 6 + 7 files changed, 305 insertions(+), 83 deletions(-) create mode 100644 runtime/queries/groovy/folds.scm create mode 100644 runtime/queries/groovy/indents.scm create mode 100644 runtime/queries/groovy/locals.scm diff --git a/book/src/generated/lang-support.md b/book/src/generated/lang-support.md index 7aec37778080b..1592d1039b2b7 100644 --- a/book/src/generated/lang-support.md +++ b/book/src/generated/lang-support.md @@ -65,7 +65,7 @@ | gotmpl | ✓ | | | `gopls` | | gowork | ✓ | | | `gopls` | | graphql | ✓ | | | `graphql-lsp` | -| groovy | ✓ | | | | +| groovy | ✓ | | ✓ | | | hare | ✓ | | | | | haskell | ✓ | ✓ | | `haskell-language-server-wrapper` | | haskell-persistent | ✓ | | | | diff --git a/languages.toml b/languages.toml index 1c4c612673af2..02f3383d3bcb0 100644 --- a/languages.toml +++ b/languages.toml @@ -3137,4 +3137,4 @@ indent = { tab-width = 2, unit = " " } [[grammar]] name = "groovy" -source = { git = "https://github.com/Decodetalkers/tree-sitter-groovy", rev = "7e023227f46fee428b16a0288eeb0f65ee2523ec" } +source = { git = "https://github.com/murtaza64/tree-sitter-groovy", rev = "235009aad0f580211fc12014bb0846c3910130c1" } diff --git a/runtime/queries/groovy/folds.scm b/runtime/queries/groovy/folds.scm new file mode 100644 index 0000000000000..354861a611057 --- /dev/null +++ b/runtime/queries/groovy/folds.scm @@ -0,0 +1,6 @@ +[ + (argument_list) + (closure) + (list) + (map) +] @fold diff --git a/runtime/queries/groovy/highlights.scm b/runtime/queries/groovy/highlights.scm index 4e94ccd3a1ee5..aadd04fe453ac 100644 --- a/runtime/queries/groovy/highlights.scm +++ b/runtime/queries/groovy/highlights.scm @@ -1,96 +1,268 @@ -(unit - (identifier) @variable) +[ + "!instanceof" + "assert" + "class" + "extends" + "instanceof" + "package" +] @keyword -(string - (identifier) @variable) +[ + "!in" + "as" + "in" +] @keyword.operator + +[ + "case" + "default" + "else" + "if" + "switch" +] @keyword.conditional -(escape_sequence) @constant.character.escape +[ + "catch" + "finally" + "try" +] @keyword.exception -(block - (unit - (identifier) @namespace)) +"def" @keyword.function -(func - (identifier) @function) +"import" @keyword.import -(number) @constant.numeric +[ + "for" + "while" + (break) + (continue) +] @keyword.repeat -((identifier) @constant.builtin.boolean - (#any-of? @constant.builtin.boolean "true" "false")) +"return" @keyword.return -((identifier) @constant - (#match? @constant "^[A-Z][A-Z\\d_]*$")) - -((identifier) @constant.builtin - (#eq? @constant.builtin "null")) - -((identifier) @type - (#any-of? @type - "String" - "Map" - "Object" - "Boolean" - "Integer" - "List")) - -((identifier) @function.builtin - (#any-of? @function.builtin - "void" - "id" - "version" - "apply" - "implementation" - "testImplementation" - "androidTestImplementation" - "debugImplementation")) - -((identifier) @keyword.storage.modifier - (#eq? @keyword.storage.modifier "static")) - -((identifier) @keyword.storage.type - (#any-of? @keyword.storage.type "class" "def" "interface")) - -((identifier) @keyword - (#any-of? @keyword - "assert" - "new" - "extends" - "implements" - "instanceof")) - -((identifier) @keyword.control.import - (#any-of? @keyword.control.import "import" "package")) - -((identifier) @keyword.storage.modifier - (#any-of? @keyword.storage.modifier - "abstract" - "protected" - "private" - "public")) - -((identifier) @keyword.control.exception - (#any-of? @keyword.control.exception - "throw" - "finally" - "try" - "catch")) +[ + "true" + "false" +] @boolean + +(null) @constant.builtin + +"this" @variable.builtin + +[ + "int" + "char" + "short" + "long" + "boolean" + "float" + "double" + "void" +] @type.builtin + +[ + "final" + "private" + "protected" + "public" + "static" + "synchronized" +] @type.qualifier + +(comment) @comment @spell + +(shebang) @keyword.directive (string) @string +(string + (escape_sequence) @string.escape) + +(string + (interpolation + "$" @punctuation.special)) + +[ + "(" + ")" + "[" + "]" + "{" + "}" +] @punctuation.bracket + [ - (line_comment) - (block_comment) -] @comment + ":" + "," + "." +] @punctuation.delimiter + +(number_literal) @number -((block_comment) @comment.block.documentation - (#match? @comment.block.documentation "^/[*][*][^*](?s:.)*[*]/$")) +(identifier) @variable -((line_comment) @comment.block.documentation - (#match? @comment.block.documentation "^///[^/]*.*$")) +((identifier) @constant + (#match? @constant "^[A-Z][A-Z_]+")) [ - (operators) - (leading_key) + "%" + "*" + "/" + "+" + "-" + "<<" + ">>" + ">>>" + ".." + "..<" + "<..<" + "<.." + "<" + "<=" + ">" + ">=" + "==" + "!=" + "<=>" + "===" + "!==" + "=~" + "==~" + "&" + "^" + "|" + "&&" + "||" + "?:" + "+" + "*" + ".&" + ".@" + "?." + "*." + "*" + "*:" + "++" + "--" + "!" ] @operator -["(" ")" "[" "]" "{" "}"] @punctuation.bracket +(string + "/" @string) + +(ternary_op + ([ + "?" + ":" + ]) @keyword.conditional.ternary) + +(map + (map_item + key: (identifier) @variable.parameter)) + +(parameter + type: (identifier) @type + name: (identifier) @variable.parameter) + +(generic_param + name: (identifier) @variable.parameter) + +(declaration + type: (identifier) @type) + +(function_definition + type: (identifier) @type) + +(function_declaration + type: (identifier) @type) + +(class_definition + name: (identifier) @type) + +(class_definition + superclass: (identifier) @type) + +(generic_param + superclass: (identifier) @type) + +(type_with_generics + (identifier) @type) + +(type_with_generics + (generics + (identifier) @type)) + +(generics + [ + "<" + ">" + ] @punctuation.bracket) + +(generic_parameters + [ + "<" + ">" + ] @punctuation.bracket) + +; TODO: Class literals with PascalCase +(declaration + "=" @operator) + +(assignment + "=" @operator) + +(function_call + function: (identifier) @function) + +(function_call + function: + (dotted_identifier + (identifier) @function .)) + +(function_call + (argument_list + (map_item + key: (identifier) @variable.parameter))) + +(juxt_function_call + function: (identifier) @function) + +(juxt_function_call + function: + (dotted_identifier + (identifier) @function .)) + +(juxt_function_call + (argument_list + (map_item + key: (identifier) @variable.parameter))) + +(function_definition + function: (identifier) @function) + +(function_declaration + function: (identifier) @function) + +(annotation) @function.macro + +(annotation + (identifier) @function.macro) + +"@interface" @function.macro + +(groovy_doc) @comment.documentation @spell + +(groovy_doc + [ + (groovy_doc_param) + (groovy_doc_throws) + (groovy_doc_tag) + ] @string.special @nospell) + +(groovy_doc + (groovy_doc_param + (identifier) @variable.parameter) @nospell) + +(groovy_doc + (groovy_doc_throws + (identifier) @type @nospell)) diff --git a/runtime/queries/groovy/indents.scm b/runtime/queries/groovy/indents.scm new file mode 100644 index 0000000000000..888d5010785ef --- /dev/null +++ b/runtime/queries/groovy/indents.scm @@ -0,0 +1,35 @@ +[ + (closure) + (map) + (list) + (argument_list) + (parameter_list) + (for_parameters) +] @indent.begin + +; (function_definition "(" @indent.begin) +(closure + "}" @indent.end) + +(argument_list + ")" @indent.end) + +(for_parameters + ")" @indent.end) + +((for_loop + body: (_) @_body) @indent.begin + (#not-has-type? @_body closure)) + +; TODO: while, try +(list + "]" @indent.end) + +(map + "]" @indent.end) + +[ + "}" + ")" + "]" +] @indent.branch diff --git a/runtime/queries/groovy/injections.scm b/runtime/queries/groovy/injections.scm index e4509a5fd317b..1c04c65fbb437 100644 --- a/runtime/queries/groovy/injections.scm +++ b/runtime/queries/groovy/injections.scm @@ -1,2 +1,5 @@ -([(line_comment) (block_comment)] @injection.content - (#set! injection.language "comment")) +((comment) @injection.content + (#set! injection.language "comment")) + +((groovy_doc) @injection.content + (#set! injection.language "comment")) diff --git a/runtime/queries/groovy/locals.scm b/runtime/queries/groovy/locals.scm new file mode 100644 index 0000000000000..23cb5f0cb7e9f --- /dev/null +++ b/runtime/queries/groovy/locals.scm @@ -0,0 +1,6 @@ +(function_definition) @local.scope + +(parameter + name: (identifier) @local.definition.parameter) + +(identifier) @local.reference