diff --git a/utils/vscode/carbon-check-test.tmLanguage.json b/utils/vscode/carbon-check-test.tmLanguage.json new file mode 100644 index 000000000000..ef630075533e --- /dev/null +++ b/utils/vscode/carbon-check-test.tmLanguage.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json", + "scopeName": "source.carbon-check-test", + "injectionSelector": "L:source.carbon", + "patterns": [ + { + "begin": "^(\\s*//\\s*CHECK:STDOUT:)", + "beginCaptures": { + "1": { + "name": "comment.line.carbon" + } + }, + "end": "$", + "patterns": [ + { + "include": "source.carbon-semir" + } + ] + } + ] +} diff --git a/utils/vscode/package.json b/utils/vscode/package.json index 2968ee8f6600..cb1910a668ce 100644 --- a/utils/vscode/package.json +++ b/utils/vscode/package.json @@ -27,6 +27,15 @@ ".carbon" ], "configuration": "./language-configuration.json" + }, + { + "id": "semir", + "aliases": [ + "SemIR" + ], + "extensions": [ + ".semir" + ] } ], "grammars": [ @@ -34,6 +43,18 @@ "language": "carbon", "scopeName": "source.carbon", "path": "./carbon.tmLanguage.json" + }, + { + "language": "semir", + "scopeName": "source.carbon-semir", + "path": "./semir.tmLanguage.json" + }, + { + "scopeName": "source.carbon-check-test", + "path": "./carbon-check-test.tmLanguage.json", + "injectTo": [ + "source.carbon" + ] } ], "configuration": { diff --git a/utils/vscode/semir.tmLanguage.json b/utils/vscode/semir.tmLanguage.json new file mode 100644 index 000000000000..68fe0b269b76 --- /dev/null +++ b/utils/vscode/semir.tmLanguage.json @@ -0,0 +1,95 @@ +{ + "$schema": "https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json", + "name": "semir", + "scopeName": "source.carbon-semir", + "fileTypes": ["semir"], + "patterns": [ + { + "include": "#keywords" + }, + { + "include": "#identifiers" + }, + { + "include": "#strings" + }, + { + "include": "#numbers" + }, + { + "include": "#labels" + }, + { + "include": "#punctuation" + } + ], + "repository": { + "keywords": { + "patterns": [ + { + "name": "storage.type.semir", + "match": "\\b(var|ref|init|out|type|val)\\b" + }, + { + "name": "storage.modifier.semir", + "match": "\\b(concrete)\\b" + }, + { + "name": "support.function.semir", + "match": "\\b[a-z_][a-z0-9_]+\\b" + } + ] + }, + "identifiers": { + "patterns": [ + { + "name": "entity.name.variable.semir", + "match": "(?:[a-zA-Z0-9_]+\\.)?%[a-zA-Z0-9_.]+" + }, + { + "name": "entity.name.function.semir", + "match": "@[a-zA-Z0-9_.]+" + } + ] + }, + "labels": { + "patterns": [ + { + "name": "entity.name.label.semir", + "match": "![a-zA-Z0-9_]+:" + } + ] + }, + "strings": { + "patterns": [ + { + "name": "string.quoted.double.semir", + "begin": "\"", + "end": "\"", + "patterns": [ + { + "name": "constant.character.escape.semir", + "match": "\\\\." + } + ] + } + ] + }, + "numbers": { + "patterns": [ + { + "name": "constant.numeric.semir", + "match": "\\b\\d+(\\.\\d+)?\\b" + } + ] + }, + "punctuation": { + "patterns": [ + { + "name": "keyword.operator.semir", + "match": "(=>|->|=|:)" + } + ] + } + } +}