diff --git a/package.json b/package.json index 546bf4c8..9bbd9457 100644 --- a/package.json +++ b/package.json @@ -251,6 +251,11 @@ } ], "grammars": [ + { + "language": "bazelrc", + "scopeName": "source.bazelrc", + "path": "./syntaxes/bazelrc.tmLanguage.json" + }, { "language": "starlark", "scopeName": "source.starlark", @@ -258,6 +263,17 @@ } ], "languages": [ + { + "id": "bazelrc", + "extensions": [ + ".bazelrc" + ], + "filenames": [ + ".bazelrc", + "bazel.rc" + ], + "configuration": "./syntaxes/bazelrc.configuration.json" + }, { "id": "starlark", "aliases": [ diff --git a/syntaxes/bazelrc.configuration.json b/syntaxes/bazelrc.configuration.json new file mode 100644 index 00000000..d099cbae --- /dev/null +++ b/syntaxes/bazelrc.configuration.json @@ -0,0 +1,33 @@ +{ + "comments": { + "lineComment": "#" + }, + "autoClosingPairs": [ + { + "open": "\"", + "close": "\"", + "notIn": [ + "string", + "comment" + ] + }, + { + "open": "'", + "close": "'", + "notIn": [ + "string", + "comment" + ] + } + ], + "surroundingPairs": [ + [ + "\"", + "\"" + ], + [ + "'", + "'" + ] + ] +} \ No newline at end of file diff --git a/syntaxes/bazelrc.tmLanguage.json b/syntaxes/bazelrc.tmLanguage.json new file mode 100644 index 00000000..0686d872 --- /dev/null +++ b/syntaxes/bazelrc.tmLanguage.json @@ -0,0 +1,635 @@ +{ + "name": "bazelrc", + "scopeName": "source.bazelrc", + "fileTypes": [ + "bazelrc" + ], + "patterns": [ + { + "include": "#comment" + }, + { + "include": "#flagset" + } + ], + "repository": { + "comment": { + "patterns": [ + { + "match": "(\\#).*$", + "name": "comment.line.number-sign.shell", + "captures": { + "1": { + "name": "punctuation.definition.comment.shell" + } + } + } + ] + }, + "target": { + "comment": "Build target labels.\nOnly absolute targets (containing //) are considered, because one probably shouldn't be including other kinds in a .bazelrc.", + "patterns": [ + { + "name": "meta.class.target.wild", + "match": "(@@?(?:[a-zA-Z_][a-zA-Z0-9_-]*)?)?(//)([^-:=][^:=]*)?(:)(all)", + "captures": { + "1": { + "name": "entity.name.namespace.workspace" + }, + "2": { + "name": "entity.name.namespace.workspace punctuation.separator.slash.root" + }, + "3": { + "name": "entity.name.class.package" + }, + "4": { + "name": "entity.name.class.target punctuation.separator.colon.package" + }, + "5": { + "name": "keyword.operator.wordlike.all" + } + } + }, + { + "name": "meta.class.target.wild.recursive", + "match": "(@@?(?:[a-zA-Z_][a-zA-Z0-9_-]*)?)?(//)([^-:=][^:=]*/)?(\\.\\.\\.)", + "captures": { + "1": { + "name": "entity.name.namespace.workspace" + }, + "2": { + "name": "entity.name.namespace.workspace punctuation.separator.slash.root" + }, + "3": { + "name": "entity.name.class.package" + }, + "4": { + "name": "keyword.operator.wordlike.all.recursive" + } + } + }, + { + "name": "meta.class.target", + "match": "(@@?(?:[a-zA-Z_][a-zA-Z0-9_-]*)?)?(//)([^-:=][^:=]*)?(?:(:)([^/: =]+))?", + "captures": { + "1": { + "name": "entity.name.namespace.workspace" + }, + "2": { + "name": "entity.name.namespace.workspace punctuation.separator.slash.root" + }, + "3": { + "name": "entity.name.class.package" + }, + "4": { + "name": "entity.name.class.target punctuation.separator.colon.package" + }, + "5": { + "name": "entity.name.class.target" + } + } + } + ] + }, + "boolean": { + "patterns": [ + { + "match": "\\b(true|false|yes|no)\\b", + "name": "constant.language.boolean" + } + ] + }, + "numeric": { + "patterns": [ + { + "match": "\\b(?:[0-9]*\\.[0-9]+)|(?:[0-9]+\\.?)\\b", + "name": "constant.numeric" + } + ] + }, + "computed": { + "patterns": [ + { + "match": "\\b([A-Z_]+)\\s*(\\*)\\s*([0-9.]+)\\b", + "captures": { + "1": { + "name": "variable.language" + }, + "2": { + "name": "keyword.operator.multiply" + }, + "3": { + "patterns": [ + { + "include": "#numeric" + } + ] + } + } + } + ] + }, + "double_quoted_flag": { + "patterns": [ + { + "name": "string.quoted.double.argument", + "match": "(\")(--(?:[^\"]|\\\\\")*)(\")", + "captures": { + "1": { + "name": "punctuation.definition.quote.begin" + }, + "2": { + "patterns": [ + { + "include": "#quoted_flag" + } + ] + }, + "3": { + "name": "punctuation.definition.quote.end" + } + } + } + ] + }, + "single_quoted_flag": { + "patterns": [ + { + "name": "string.quoted.single.argument", + "match": "(')(--[^']*)(')", + "captures": { + "1": { + "name": "punctuation.definition.quote.begin" + }, + "2": { + "patterns": [ + { + "include": "#quoted_flag" + } + ] + }, + "3": { + "name": "punctuation.definition.quote.end" + } + } + } + ] + }, + "literal": { + "patterns": [ + { + "include": "#boolean" + }, + { + "include": "#numeric" + }, + { + "include": "#computed" + }, + { + "match": ".*", + "name": "string.unquoted.argument" + } + ] + }, + "unquoted_value": { + "patterns": [ + { + "match": "([a-zA-Z_-][^ =]*)(=)(.*)", + "captures": { + "1": { + "name": "support.variable" + }, + "2": { + "name": "punctuation.separator.equal" + }, + "3": { + "name": "string.unquoted.argument", + "patterns": [ + { + "include": "#unquoted_value" + } + ] + } + } + }, + { + "include": "#target" + }, + { + "include": "#literal" + } + ] + }, + "double_quoted": { + "patterns": [ + { + "name": "string.quoted.double.argument", + "match": "(\")((?:[^\"]|\\\\\")*)(\")", + "captures": { + "1": { + "name": "punctuation.definition.quote.begin" + }, + "2": { + "patterns": [ + { + "include": "#unquoted_value" + } + ] + }, + "3": { + "name": "punctuation.definition.quote.end" + } + } + } + ] + }, + "single_quoted": { + "patterns": [ + { + "name": "string.quoted.single.argument", + "match": "(')([^']*)(')", + "captures": { + "1": { + "name": "punctuation.definition.quote.begin" + }, + "2": { + "patterns": [ + { + "include": "#unquoted_value" + } + ] + }, + "3": { + "name": "punctuation.definition.quote.end" + } + } + } + ] + }, + "flag_value": { + "patterns": [ + { + "include": "#target" + }, + { + "include": "#double_quoted" + }, + { + "include": "#single_quoted" + }, + { + "include": "#unquoted_value" + } + ] + }, + "short_flag": { + "patterns": [ + { + "name": "meta.group.flag.short", + "match": "(-)([a-z])\\s+((?:\"(?:[^\"]|\\\\\")*\")|(?:'[^']*')|\\S+)", + "captures": { + "1": { + "name": "punctuation.definition.dash.flag entity.name.class.flag.short" + }, + "2": { + "name": "entity.name.class.flag.short" + }, + "3": { + "patterns": [ + { + "include": "#flag_value" + } + ] + } + } + } + ] + }, + "config_flag": { + "patterns": [ + { + "name": "meta.group.flag.config", + "match": "(--)(config)(=|\\s+)([a-zA-Z_][a-zA-Z0-9_-]*)\\b", + "captures": { + "1": { + "name": "entity.name.class.flag punctuation.definition.dash.flag" + }, + "2": { + "name": "entity.name.class.flag" + }, + "3": { + "name": "punctuation.separator.equal" + }, + "4": { + "name": "variable.other.config" + } + } + } + ] + }, + "target_flag": { + "patterns": [ + { + "name": "meta.group.flag.target.space_value", + "match": "(--)((?:@@?|//)[a-zA-Z0-9_/:-]*)\\s+((?:\"(?:(?:\\\\\"|[^\"-])(?:[^\"]|\\\\\")*)?\")|(?:'(?:[^'-][^']*)?')|(?:[^\"'-]\\S*))\\b", + "captures": { + "1": { + "name": "entity.name.class.flag punctuation.definition.dash.flag" + }, + "2": { + "name": "entity.name.class.flag.target", + "patterns": [ + { + "include": "#target" + } + ] + }, + "3": { + "name": "meta.string.flag_value", + "patterns": [ + { + "include": "#flag_value" + } + ] + } + } + }, + { + "name": "meta.group.flag.target", + "match": "(--)((?:@@?|//)[a-zA-Z0-9_/:-]*)\\b(?:(=)((?:\"(?:[^\"]|\\\\\")*\")|(?:'[^']*')|\\S*))?", + "captures": { + "1": { + "name": "entity.name.class.flag punctuation.definition.dash.flag" + }, + "2": { + "name": "entity.name.class.flag.target", + "patterns": [ + { + "include": "#target" + } + ] + }, + "3": { + "name": "punctuation.separator.equal" + }, + "4": { + "name": "meta.string.flag_value", + "patterns": [ + { + "include": "#flag_value" + } + ] + } + } + } + ] + }, + "spaced_flag": { + "comment": "Flag with a value after a space.", + "patterns": [ + { + "name": "meta.group.flag.space_value", + "match": "(--)([a-z_][a-z0-9_]*)\\s+((?:\"(?:(?:\\\\\"|[^\"-])(?:[^\"]|\\\\\")*)?\")|(?:'(?:[^'-][^']*)?')|(?:[^\"'-]\\S*))", + "captures": { + "1": { + "name": "entity.name.class.flag punctuation.definition.dash.flag" + }, + "2": { + "name": "entity.name.class.flag" + }, + "3": { + "name": "meta.string.flag_value", + "patterns": [ + { + "include": "#flag_value" + } + ] + } + } + } + ] + }, + "negated_flag": { + "patterns": [ + { + "name": "entity.name.class.flag.negated", + "match": "(--)(no)[a-z_][a-z0-9_]*", + "captures": { + "1": { + "name": "punctuation.definition.dash.flag" + }, + "2": { + "name": "keyword.control.negation" + } + } + } + ] + }, + "regex_flag": { + "patterns": [ + { + "name": "meta.group.flag.regex", + "comment": "Special case for filter regexps.", + "match": "(--)((?:(?:instrumentation|output)_filter)|(?:(?:experimental_)?remote_download_regex))(=)(?:(?:(\")([^\"]*)(\"))|(?:(')([^']*)('))|(\\S*))", + "captures": { + "1": { + "name": "entity.name.class.flag punctuation.definition.dash.flag" + }, + "2": { + "name": "entity.name.class.flag" + }, + "3": { + "name": "punctuation.separator.equal" + }, + "4": { + "name": "string.quoted.double.argument punctuation.definition.string.begin" + }, + "5": { + "name": "string.quoted.double.argument string.regexp.filter" + }, + "6": { + "name": "string.quoted.double.argument punctuation.definition.string.end" + }, + "7": { + "name": "string.quoted.single.argument punctuation.definition.string.begin" + }, + "8": { + "name": "string.quoted.single.argument string.regexp.filter" + }, + "9": { + "name": "string.quoted.single.argument punctuation.definition.string.end" + }, + "10": { + "name": "string.regexp.filter" + } + } + } + ] + }, + "flag": { + "patterns": [ + { + "include": "#config_flag" + }, + { + "include": "#target_flag" + }, + { + "include": "#negated_flag" + }, + { + "include": "#regex_flag" + }, + { + "name": "meta.group.flag.valued", + "match": "(--)([a-z_][a-z0-9_]*)\\b(=)((?:\"(?:[^\"]|\\\\\")*\")|(?:'[^']*')|\\S*)", + "captures": { + "1": { + "name": "entity.name.class.flag punctuation.definition.dash.flag" + }, + "2": { + "name": "entity.name.class.flag" + }, + "3": { + "name": "punctuation.separator.equal" + }, + "4": { + "name": "meta.string.flag_value", + "patterns": [ + { + "include": "#flag_value" + } + ] + } + } + }, + { + "name": "meta.group.flag.bare", + "match": "(--)([a-z_][a-z0-9_]*)", + "captures": { + "1": { + "name": "entity.name.class.flag punctuation.definition.dash.flag" + }, + "2": { + "name": "entity.name.class.flag" + } + } + } + ] + }, + "quoted_flag": { + "patterns": [ + { + "include": "#config_flag" + }, + { + "include": "#target_flag" + }, + { + "include": "#negated_flag" + }, + { + "include": "#regex_flag" + }, + { + "name": "meta.group.flag.valued", + "match": "(--)([a-z_][a-z0-9_]*)\\b(=)(.*)", + "captures": { + "1": { + "name": "entity.name.class.flag punctuation.definition.dash.flag" + }, + "2": { + "name": "entity.name.class.flag" + }, + "3": { + "name": "punctuation.separator.equal" + }, + "4": { + "name": "meta.string.flag_value", + "patterns": [ + { + "include": "#flag_value" + } + ] + } + } + } + ] + }, + "flagset": { + "commnet": "A single line from a .bazelrc file.", + "patterns": [ + { + "match": "^\\s*((?:try-)?import)(?:(:)([a-zA-Z_][a-zA-Z0-9_-]*))?\\s*(%workspace%)?(\\S*)\\s*$", + "comment": "Special handling for import.", + "captures": { + "1": { + "name": "keyword.control" + }, + "2": { + "name": "punctuation.separator.colon.config" + }, + "3": { + "name": "entity.name.tag.config" + }, + "4": { + "name": "support.variable" + }, + "5": { + "name": "string.value.filename" + } + } + }, + { + "begin": "^\\s*(startup|common|always|analyze-profile|aquery|build|canonicalize-flags|clean|coverage|cquery|dump|fetch|help|info|license|mobile-install|mod|print_action|query|run|shutdown|sync|test|vendor|version)(?:(:)([a-zA-Z_][a-zA-Z0-9_-]*))?\\s+", + "end": "$", + "beginCaptures": { + "1": { + "name": "keyword.control.subcommand" + }, + "2": { + "name": "punctuation.separator.colon.config" + }, + "3": { + "name": "entity.name.tag.config" + } + }, + "contentName": "meta.group.args", + "patterns": [ + { + "include": "#single_quoted_flag" + }, + { + "include": "#double_quoted_flag" + }, + { + "include": "#spaced_flag" + }, + { + "include": "#flag" + }, + { + "include": "#short_flag" + }, + { + "include": "#target" + }, + { + "match": "\\s+", + "name": "punctuation.separator.space" + }, + { + "match": "\\S*", + "name": "invalid" + } + ] + }, + { + "match": "\\S*", + "name": "invalid" + } + ] + } + } +}