{ "name": "Groovy", "scopeName": "source.groovy", "patterns": [ { "name": "comment.line.hashbang.groovy", "match": "^(#!).+$\\n", "captures": { "1": { "name": "punctuation.definition.comment.groovy" } } }, { "name": "meta.package.groovy", "match": "^\\s*(package)\\b(?:\\s*([^ ;$]+)\\s*(;)?)?", "captures": { "1": { "name": "keyword.other.package.groovy" }, "2": { "name": "storage.modifier.package.groovy" }, "3": { "name": "punctuation.terminator.groovy" } } }, { "name": "meta.import.groovy", "contentName": "storage.modifier.import.groovy", "begin": "(import static)\\b\\s*", "end": "\\s*(?:$|(?=%\u003e)(;))", "patterns": [ { "name": "punctuation.separator.groovy", "match": "\\." }, { "name": "invalid.illegal.character_not_allowed_here.groovy", "match": "\\s" } ], "captures": { "1": { "name": "keyword.other.import.groovy" }, "2": { "name": "storage.modifier.import.groovy" }, "3": { "name": "punctuation.terminator.groovy" } }, "beginCaptures": { "1": { "name": "keyword.other.import.static.groovy" } }, "endCaptures": { "1": { "name": "punctuation.terminator.groovy" } } }, { "name": "meta.import.groovy", "contentName": "storage.modifier.import.groovy", "begin": "(import)\\b\\s*", "end": "\\s*(?:$|(?=%\u003e)|(;))", "patterns": [ { "name": "punctuation.separator.groovy", "match": "\\." }, { "name": "invalid.illegal.character_not_allowed_here.groovy", "match": "\\s" } ], "captures": { "1": { "name": "keyword.other.import.groovy" }, "2": { "name": "storage.modifier.import.groovy" }, "3": { "name": "punctuation.terminator.groovy" } }, "beginCaptures": { "1": { "name": "keyword.other.import.groovy" } }, "endCaptures": { "1": { "name": "punctuation.terminator.groovy" } } }, { "name": "meta.import.groovy", "match": "^\\s*(import)(?:\\s+(static)\\s+)\\b(?:\\s*([^ ;$]+)\\s*(;)?)?", "captures": { "1": { "name": "keyword.other.import.groovy" }, "2": { "name": "keyword.other.import.static.groovy" }, "3": { "name": "storage.modifier.import.groovy" }, "4": { "name": "punctuation.terminator.groovy" } } }, { "include": "#groovy" } ], "repository": { "annotations": { "patterns": [ { "name": "meta.declaration.annotation.groovy", "begin": "(?\u003c!\\.)(@[^ (]+)(\\()", "end": "(\\))", "patterns": [ { "match": "(\\w*)\\s*(=)", "captures": { "1": { "name": "constant.other.key.groovy" }, "2": { "name": "keyword.operator.assignment.groovy" } } }, { "include": "#values" }, { "name": "punctuation.definition.seperator.groovy", "match": "," } ], "beginCaptures": { "1": { "name": "storage.type.annotation.groovy" }, "2": { "name": "punctuation.definition.annotation-arguments.begin.groovy" } }, "endCaptures": { "1": { "name": "punctuation.definition.annotation-arguments.end.groovy" } } }, { "name": "storage.type.annotation.groovy", "match": "(?\u003c!\\.)@\\S+" } ] }, "anonymous-classes-and-new": { "begin": "\\bnew\\b", "end": "(?\u003c=\\)|\\])(?!\\s*{)|(?\u003c=})|(?=[;])|$", "patterns": [ { "begin": "(\\w+)\\s*(?=\\[)", "end": "}|(?=\\s*(?:,|;|\\)))|$", "patterns": [ { "begin": "\\[", "end": "\\]", "patterns": [ { "include": "#groovy" } ] }, { "begin": "{", "end": "(?=})", "patterns": [ { "include": "#groovy" } ] } ], "beginCaptures": { "1": { "name": "storage.type.groovy" } } }, { "begin": "(?=\\w.*\\(?)", "end": "(?\u003c=\\))|$", "patterns": [ { "include": "#object-types" }, { "begin": "\\(", "end": "\\)", "patterns": [ { "include": "#groovy" } ], "beginCaptures": { "1": { "name": "storage.type.groovy" } } } ] }, { "name": "meta.inner-class.groovy", "begin": "{", "end": "}", "patterns": [ { "include": "#class-body" } ] } ], "beginCaptures": { "0": { "name": "keyword.control.new.groovy" } } }, "braces": { "begin": "\\{", "end": "\\}", "patterns": [ { "include": "#groovy-code" } ] }, "class": { "name": "meta.definition.class.groovy", "begin": "(?=\\w?[\\w\\s]*(?:class|(?:@)?interface|enum)\\s+\\w+)", "end": "}", "patterns": [ { "include": "#storage-modifiers" }, { "include": "#comments" }, { "name": "meta.class.identifier.groovy", "match": "(class|(?:@)?interface|enum)\\s+(\\w+)", "captures": { "1": { "name": "storage.modifier.groovy" }, "2": { "name": "entity.name.type.class.groovy" } } }, { "name": "meta.definition.class.inherited.classes.groovy", "begin": "extends", "end": "(?={|implements)", "patterns": [ { "include": "#object-types-inherited" }, { "include": "#comments" } ], "beginCaptures": { "0": { "name": "storage.modifier.extends.groovy" } } }, { "name": "meta.definition.class.implemented.interfaces.groovy", "begin": "(implements)\\s", "end": "(?=\\s*extends|\\{)", "patterns": [ { "include": "#object-types-inherited" }, { "include": "#comments" } ], "beginCaptures": { "1": { "name": "storage.modifier.implements.groovy" } } }, { "name": "meta.class.body.groovy", "begin": "{", "end": "(?=})", "patterns": [ { "include": "#class-body" } ] } ], "endCaptures": { "0": { "name": "punctuation.section.class.end.groovy" } } }, "class-body": { "patterns": [ { "include": "#enum-values" }, { "include": "#constructors" }, { "include": "#groovy" } ] }, "closures": { "begin": "\\{(?=.*?-\u003e)", "end": "\\}", "patterns": [ { "begin": "(?\u003c=\\{)(?=[^\\}]*?-\u003e)", "end": "-\u003e", "patterns": [ { "name": "meta.closure.parameters.groovy", "begin": "(?!-\u003e)", "end": "(?=-\u003e)", "patterns": [ { "name": "meta.closure.parameter.groovy", "begin": "(?!,|-\u003e)", "end": "(?=,|-\u003e)", "patterns": [ { "name": "meta.parameter.default.groovy", "begin": "=", "end": "(?=,|-\u003e)", "patterns": [ { "include": "#groovy-code" } ], "beginCaptures": { "0": { "name": "keyword.operator.assignment.groovy" } } }, { "include": "#parameters" } ] } ] } ], "endCaptures": { "0": { "name": "keyword.operator.groovy" } } }, { "begin": "(?=[^}])", "end": "(?=\\})", "patterns": [ { "include": "#groovy-code" } ] } ] }, "comment-block": { "name": "comment.block.groovy", "begin": "/\\*", "end": "\\*/", "captures": { "0": { "name": "punctuation.definition.comment.groovy" } } }, "comments": { "patterns": [ { "name": "comment.block.empty.groovy", "match": "/\\*\\*/", "captures": { "0": { "name": "punctuation.definition.comment.groovy" } } }, { "include": "text.html.javadoc" }, { "include": "#comment-block" }, { "name": "comment.line.double-slash.groovy", "match": "(//).*$\\n?", "captures": { "1": { "name": "punctuation.definition.comment.groovy" } } } ] }, "constants": { "patterns": [ { "name": "constant.other.groovy", "match": "\\b([A-Z][A-Z0-9_]+)\\b" }, { "name": "constant.language.groovy", "match": "\\b(true|false|null)\\b" } ] }, "constructors": { "begin": "(?\u003c=;|^)(?=\\s*(?:(?:private|protected|public|native|synchronized|abstract|threadsafe|transient|static|final)\\s+)*[A-Z]\\w*\\()", "end": "}", "patterns": [ { "include": "#method-content" } ], "applyEndPatternLast": true }, "enum-values": { "patterns": [ { "begin": "(?\u003c=;|^)\\s*\\b([A-Z0-9_]+)(?=\\s*(?:,|;|}|\\(|$))", "end": ",|;|(?=})|^(?!\\s*\\w+\\s*(?:,|$))", "patterns": [ { "name": "meta.enum.value.groovy", "begin": "\\(", "end": "\\)", "patterns": [ { "name": "punctuation.definition.seperator.parameter.groovy", "match": "," }, { "include": "#groovy-code" } ] } ], "beginCaptures": { "1": { "name": "constant.enum.name.groovy" } } } ] }, "groovy": { "patterns": [ { "include": "#comments" }, { "include": "#class" }, { "include": "#variables" }, { "include": "#methods" }, { "include": "#annotations" }, { "include": "#groovy-code" } ] }, "groovy-code": { "patterns": [ { "include": "#groovy-code-minus-map-keys" }, { "include": "#map-keys" } ] }, "groovy-code-minus-map-keys": { "patterns": [ { "include": "#comments" }, { "include": "#annotations" }, { "include": "#support-functions" }, { "include": "#keyword-language" }, { "include": "#values" }, { "include": "#anonymous-classes-and-new" }, { "include": "#keyword-operator" }, { "include": "#types" }, { "include": "#storage-modifiers" }, { "include": "#parens" }, { "include": "#closures" }, { "include": "#braces" } ] }, "keyword": { "patterns": [ { "include": "#keyword-operator" }, { "include": "#keyword-language" } ] }, "keyword-language": { "patterns": [ { "name": "keyword.control.exception.groovy", "match": "\\b(try|catch|finally|throw)\\b" }, { "name": "keyword.control.groovy", "match": "\\b((?\u003c!\\.)(?:return|break|continue|default|do|while|for|switch|if|else))\\b" }, { "name": "meta.case.groovy", "begin": "\\bcase\\b", "end": ":", "patterns": [ { "include": "#groovy-code-minus-map-keys" } ], "beginCaptures": { "0": { "name": "keyword.control.groovy" } }, "endCaptures": { "0": { "name": "punctuation.definition.case-terminator.groovy" } } }, { "name": "meta.declaration.assertion.groovy", "begin": "\\b(assert)\\s", "end": "$|;|}", "patterns": [ { "name": "keyword.operator.assert.expression-seperator.groovy", "match": ":" }, { "include": "#groovy-code-minus-map-keys" } ], "beginCaptures": { "1": { "name": "keyword.control.assert.groovy" } } }, { "name": "keyword.other.throws.groovy", "match": "\\b(throws)\\b" } ] }, "keyword-operator": { "patterns": [ { "name": "keyword.operator.as.groovy", "match": "\\b(as)\\b" }, { "name": "keyword.operator.in.groovy", "match": "\\b(in)\\b" }, { "name": "keyword.operator.elvis.groovy", "match": "\\?\\:" }, { "name": "keyword.operator.spreadmap.groovy", "match": "\\*\\:" }, { "name": "keyword.operator.range.groovy", "match": "\\.\\." }, { "name": "keyword.operator.arrow.groovy", "match": "\\-\u003e" }, { "name": "keyword.operator.leftshift.groovy", "match": "\u003c\u003c" }, { "name": "keyword.operator.navigation.groovy", "match": "(?\u003c=\\S)\\.(?=\\S)" }, { "name": "keyword.operator.safe-navigation.groovy", "match": "(?\u003c=\\S)\\?\\.(?=\\S)" }, { "name": "meta.evaluation.ternary.groovy", "begin": "\\?", "end": "(?=$|\\)|}|])", "patterns": [ { "name": "keyword.operator.ternary.expression-seperator.groovy", "match": ":" }, { "include": "#groovy-code-minus-map-keys" } ], "beginCaptures": { "0": { "name": "keyword.operator.ternary.groovy" } } }, { "name": "keyword.operator.match.groovy", "match": "==~" }, { "name": "keyword.operator.find.groovy", "match": "=~" }, { "name": "keyword.operator.instanceof.groovy", "match": "\\b(instanceof)\\b" }, { "name": "keyword.operator.comparison.groovy", "match": "(===|==|!=|\u003c=|\u003e=|\u003c=\u003e|\u003c\u003e|\u003c|\u003e|\u003c\u003c)" }, { "name": "keyword.operator.assignment.groovy", "match": "=" }, { "name": "keyword.operator.increment-decrement.groovy", "match": "(\\-\\-|\\+\\+)" }, { "name": "keyword.operator.arithmetic.groovy", "match": "(\\-|\\+|\\*|\\/|%)" }, { "name": "keyword.operator.logical.groovy", "match": "(!|\u0026\u0026|\\|\\|)" } ] }, "language-variables": { "patterns": [ { "name": "variable.language.groovy", "match": "\\b(this|super)\\b" } ] }, "map-keys": { "patterns": [ { "match": "(\\w+)\\s*(:)", "captures": { "1": { "name": "constant.other.key.groovy" }, "2": { "name": "punctuation.definition.seperator.key-value.groovy" } } } ] }, "method-call": { "name": "meta.method-call.groovy", "begin": "([\\w$]+)(\\()", "end": "\\)", "patterns": [ { "name": "punctuation.definition.seperator.parameter.groovy", "match": "," }, { "include": "#groovy-code" } ], "beginCaptures": { "1": { "name": "meta.method.groovy" }, "2": { "name": "punctuation.definition.method-parameters.begin.groovy" } }, "endCaptures": { "0": { "name": "punctuation.definition.method-parameters.end.groovy" } } }, "method-content": { "patterns": [ { "match": "\\s" }, { "include": "#annotations" }, { "name": "meta.method.return-type.java", "begin": "(?=(?:\\w|\u003c)[^\\(]*\\s+(?:[\\w$]|\u003c)+\\s*\\()", "end": "(?=[\\w$]+\\s*\\()", "patterns": [ { "include": "#storage-modifiers" }, { "include": "#types" } ] }, { "name": "meta.definition.method.signature.java", "begin": "([\\w$]+)\\s*\\(", "end": "\\)", "patterns": [ { "name": "meta.method.parameters.groovy", "begin": "(?=[^)])", "end": "(?=\\))", "patterns": [ { "name": "meta.method.parameter.groovy", "begin": "(?=[^,)])", "end": "(?=,|\\))", "patterns": [ { "name": "punctuation.definition.separator.groovy", "match": "," }, { "name": "meta.parameter.default.groovy", "begin": "=", "end": "(?=,|\\))", "patterns": [ { "include": "#groovy-code" } ], "beginCaptures": { "0": { "name": "keyword.operator.assignment.groovy" } } }, { "include": "#parameters" } ] } ] } ], "beginCaptures": { "1": { "name": "entity.name.function.java" } } }, { "name": "meta.method.paramerised-type.groovy", "begin": "(?=\u003c)", "end": "(?=\\s)", "patterns": [ { "name": "storage.type.parameters.groovy", "begin": "\u003c", "end": "\u003e", "patterns": [ { "include": "#types" }, { "name": "punctuation.definition.seperator.groovy", "match": "," } ] } ] }, { "name": "meta.throwables.groovy", "begin": "throws", "end": "(?={|;)|^(?=\\s*(?:[^{\\s]|$))", "patterns": [ { "include": "#object-types" } ], "beginCaptures": { "0": { "name": "storage.modifier.groovy" } } }, { "name": "meta.method.body.java", "begin": "{", "end": "(?=})", "patterns": [ { "include": "#groovy-code" } ] } ] }, "methods": { "name": "meta.definition.method.groovy", "begin": "(?x:(?\u003c=;|^|{)(?=\\s*\n (?:\n (?:private|protected|public|native|synchronized|abstract|threadsafe|transient|static|final) # visibility/modifier\n |\n (?:def)\n |\n (?:\n (?:\n (?:void|boolean|byte|char|short|int|float|long|double)\n |\n (?:@?(?:[a-zA-Z]\\w*\\.)*[A-Z]+\\w*) # object type\n )\n [\\[\\]]*\n (?:\u003c.*\u003e)?\n ) \n \n )\n \\s+\n ([^=]+\\s+)?\\w+\\s*\\(\n\t\t\t))", "end": "}|(?=[^{])", "patterns": [ { "include": "#method-content" } ], "applyEndPatternLast": true }, "nest_curly": { "begin": "\\{", "end": "\\}", "patterns": [ { "include": "#nest_curly" } ], "captures": { "0": { "name": "punctuation.section.scope.groovy" } } }, "numbers": { "patterns": [ { "name": "constant.numeric.groovy", "match": "((0(x|X)[0-9a-fA-F]*)|(\\+|-)?\\b(([0-9]+\\.?[0-9]*)|(\\.[0-9]+))((e|E)(\\+|-)?[0-9]+)?)([LlFfUuDdg]|UL|ul)?\\b" } ] }, "object-types": { "patterns": [ { "name": "storage.type.generic.groovy", "begin": "\\b((?:[a-z]\\w*\\.)*(?:[A-Z]+\\w*[a-z]+\\w*|UR[LI]))\u003c", "end": "\u003e|[^\\w\\s,\\?\u003c\\[\\]]", "patterns": [ { "include": "#object-types" }, { "name": "storage.type.generic.groovy", "begin": "\u003c", "end": "\u003e|[^\\w\\s,\\[\\]\u003c]" } ] }, { "name": "storage.type.object.array.groovy", "begin": "\\b((?:[a-z]\\w*\\.)*[A-Z]+\\w*[a-z]+\\w*)(?=\\[)", "end": "(?=[^\\]\\s])", "patterns": [ { "begin": "\\[", "end": "\\]", "patterns": [ { "include": "#groovy" } ] } ] }, { "name": "storage.type.groovy", "match": "\\b(?:[a-zA-Z]\\w*\\.)*(?:[A-Z]+\\w*[a-z]+\\w*|UR[LI])\\b" } ] }, "object-types-inherited": { "patterns": [ { "name": "entity.other.inherited-class.groovy", "begin": "\\b((?:[a-zA-Z]\\w*\\.)*[A-Z]+\\w*[a-z]+\\w*)\u003c", "end": "\u003e|[^\\w\\s,\\?\u003c\\[\\]]", "patterns": [ { "include": "#object-types-inherited" }, { "name": "storage.type.generic.groovy", "begin": "\u003c", "end": "\u003e|[^\\w\\s,\\[\\]\u003c]" } ] }, { "name": "entity.other.inherited-class.groovy", "match": "\\b(?:[a-zA-Z]\\w*(\\.))*[A-Z]+\\w*[a-z]+\\w*\\b", "captures": { "1": { "name": "keyword.operator.dereference.groovy" } } } ] }, "parameters": { "patterns": [ { "include": "#annotations" }, { "include": "#storage-modifiers" }, { "include": "#types" }, { "name": "variable.parameter.method.groovy", "match": "\\w+" } ] }, "parens": { "begin": "\\(", "end": "\\)", "patterns": [ { "include": "#groovy-code" } ] }, "primitive-arrays": { "patterns": [ { "name": "storage.type.primitive.array.groovy", "match": "\\b(?:void|boolean|byte|char|short|int|float|long|double)(\\[\\])*\\b" } ] }, "primitive-types": { "patterns": [ { "name": "storage.type.primitive.groovy", "match": "\\b(?:void|boolean|byte|char|short|int|float|long|double)\\b" } ] }, "regexp": { "patterns": [ { "name": "string.regexp.groovy", "begin": "/(?=[^/]+/([^\u003e]|$))", "end": "/", "patterns": [ { "name": "constant.character.escape.groovy", "match": "\\\\." } ], "beginCaptures": { "0": { "name": "punctuation.definition.string.regexp.begin.groovy" } }, "endCaptures": { "0": { "name": "punctuation.definition.string.regexp.end.groovy" } } }, { "name": "string.regexp.compiled.groovy", "begin": "~\"", "end": "\"", "patterns": [ { "name": "constant.character.escape.groovy", "match": "\\\\." } ], "beginCaptures": { "0": { "name": "punctuation.definition.string.regexp.begin.groovy" } }, "endCaptures": { "0": { "name": "punctuation.definition.string.regexp.end.groovy" } } } ] }, "storage-modifiers": { "patterns": [ { "name": "storage.modifier.access-control.groovy", "match": "\\b(private|protected|public)\\b" }, { "name": "storage.modifier.static.groovy", "match": "\\b(static)\\b" }, { "name": "storage.modifier.final.groovy", "match": "\\b(final)\\b" }, { "name": "storage.modifier.other.groovy", "match": "\\b(native|synchronized|abstract|threadsafe|transient)\\b" } ] }, "string-quoted-double": { "name": "string.quoted.double.groovy", "begin": "\"", "end": "\"", "patterns": [ { "include": "#string-quoted-double-contents" } ], "beginCaptures": { "0": { "name": "punctuation.definition.string.begin.groovy" } }, "endCaptures": { "0": { "name": "punctuation.definition.string.end.groovy" } } }, "string-quoted-double-contents": { "patterns": [ { "name": "constant.character.escape.groovy", "match": "\\\\." }, { "name": "variable.other.interpolated.groovy", "begin": "\\$\\w", "end": "(?=\\W)", "patterns": [ { "name": "variable.other.interpolated.groovy", "match": "\\w" }, { "name": "keyword.other.dereference.groovy", "match": "\\." } ], "applyEndPatternLast": true }, { "name": "source.groovy.embedded.source", "begin": "\\$\\{", "end": "\\}", "patterns": [ { "include": "#nest_curly" } ], "captures": { "0": { "name": "punctuation.section.embedded.groovy" } } } ] }, "string-quoted-double-multiline": { "name": "string.quoted.double.multiline.groovy", "begin": "\"\"\"", "end": "\"\"\"", "patterns": [ { "include": "#string-quoted-double-contents" } ], "beginCaptures": { "0": { "name": "punctuation.definition.string.begin.groovy" } }, "endCaptures": { "0": { "name": "punctuation.definition.string.end.groovy" } } }, "string-quoted-single": { "name": "string.quoted.single.groovy", "begin": "'", "end": "'", "patterns": [ { "include": "#string-quoted-single-contents" } ], "beginCaptures": { "0": { "name": "punctuation.definition.string.begin.groovy" } }, "endCaptures": { "0": { "name": "punctuation.definition.string.end.groovy" } } }, "string-quoted-single-contents": { "patterns": [ { "name": "constant.character.escape.groovy", "match": "\\\\." } ] }, "string-quoted-single-multiline": { "name": "string.quoted.single.multiline.groovy", "begin": "'''", "end": "'''", "patterns": [ { "include": "#string-quoted-single-contents" } ], "beginCaptures": { "0": { "name": "punctuation.definition.string.begin.groovy" } }, "endCaptures": { "0": { "name": "punctuation.definition.string.end.groovy" } } }, "strings": { "patterns": [ { "include": "#string-quoted-double-multiline" }, { "include": "#string-quoted-single-multiline" }, { "include": "#string-quoted-double" }, { "include": "#string-quoted-single" }, { "include": "#regexp" } ] }, "structures": { "name": "meta.structure.groovy", "begin": "\\[", "end": "\\]", "patterns": [ { "include": "#groovy-code" }, { "name": "punctuation.definition.separator.groovy", "match": "," } ], "beginCaptures": { "0": { "name": "punctuation.definition.structure.begin.groovy" } }, "endCaptures": { "0": { "name": "punctuation.definition.structure.end.groovy" } } }, "support-functions": { "patterns": [ { "name": "support.function.print.groovy", "match": "(?x)\\b(?:sprintf|print(?:f|ln)?)\\b" }, { "name": "support.function.testing.groovy", "match": "(?x)\\b(?:shouldFail|fail(?:NotEquals)?|ass(?:ume|ert(?:S(?:cript|ame)|N(?:ot(?:Same|\n\t\t\t\t\tNull)|ull)|Contains|T(?:hat|oString|rue)|Inspect|Equals|False|Length|\n\t\t\t\t\tArrayEquals)))\\b" } ] }, "types": { "patterns": [ { "name": "storage.type.def.groovy", "match": "\\b(def)\\b" }, { "include": "#primitive-types" }, { "include": "#primitive-arrays" }, { "include": "#object-types" } ] }, "values": { "patterns": [ { "include": "#language-variables" }, { "include": "#strings" }, { "include": "#numbers" }, { "include": "#constants" }, { "include": "#types" }, { "include": "#structures" }, { "include": "#method-call" } ] }, "variables": { "patterns": [ { "name": "meta.definition.variable.groovy", "begin": "(?x:(?=\n (?:\n (?:private|protected|public|native|synchronized|abstract|threadsafe|transient|static|final) # visibility/modifier\n |\n (?:def)\n |\n (?:void|boolean|byte|char|short|int|float|long|double)\n |\n (?:(?:[a-z]\\w*\\.)*[A-Z]+\\w*) # object type\n )\n \\s+\n [\\w\\d_\u003c\u003e\\[\\],\\s]+\n (?:=|$)\n \n \t\t\t))", "end": ";|$", "patterns": [ { "match": "\\s" }, { "match": "([A-Z_0-9]+)\\s+(?=\\=)", "captures": { "1": { "name": "constant.variable.groovy" } } }, { "match": "(\\w[^\\s,]*)\\s+(?=\\=)", "captures": { "1": { "name": "meta.definition.variable.name.groovy" } } }, { "begin": "=", "end": "$", "patterns": [ { "include": "#groovy-code" } ], "beginCaptures": { "0": { "name": "keyword.operator.assignment.groovy" } } }, { "match": "(\\w[^\\s=]*)(?=\\s*($|;))", "captures": { "1": { "name": "meta.definition.variable.name.groovy" } } }, { "include": "#groovy-code" } ] } ], "applyEndPatternLast": true } } }