Make our TextMate bundle actually work in TextMate. (#7386)

TextMate doesn't support JSON grammars, so convert our JSON grammar to a
plist automatically as a pre-commit check. Fix malformed info.plist
file. Add missing uuid to grammar file.

Assisted-by: Gemini via Antigravity
This commit is contained in:
Richard Smith authored and GitHub committed 2026-06-18 21:06:24 +00:00
1 parent 6fd7c84a89
commit 974850788c
6 files changed
+1610 -540

No files matched your search

+7 -1
View File
@@ -141,6 +141,12 @@ repos:
# This also renames files, invalidating the list of files provided to
# subsequent checks so we fail-fast if this makes changes.
fail_fast: true
- id: build-textmate-grammar
name: Build TextMate grammar
entry: scripts/update_tm_language.py
language: system
files: ^utils/vscode/carbon\.tmLanguage\.json$
pass_filenames: false
- id: check-toolchain-diagnostics
name: Check toolchain diagnostics
entry: toolchain/diagnostics/check_diagnostics.py
@@ -202,7 +208,7 @@ repos:
- ''
- '*/'
- --custom_format
- '\.(plist)$'
- '\.(plist|tmLanguage)$'
- '<!--'
- ''
- '\-->'
+62
View File
@@ -0,0 +1,62 @@
#!/usr/bin/env -S uv run --script
# /// script
# requires-python = ">=3.12"
# ///
"""Updates the TextMate plist grammar from the VS Code JSON grammar."""
__copyright__ = """
Part of the Carbon Language project, under the Apache License v2.0 with LLVM
Exceptions. See /LICENSE for license information.
SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
"""
import json
import plistlib
from pathlib import Path
def main() -> None:
# Find repository root.
repo_root = Path(__file__).resolve().parents[1]
json_path = repo_root / "utils" / "vscode" / "carbon.tmLanguage.json"
plist_path = (
repo_root / "utils" / "textmate" / "Syntaxes" / "carbon.tmLanguage"
)
# Read and parse the JSON grammar.
with open(json_path, "r", encoding="utf-8") as f:
grammar_data = json.load(f)
# Generate plist bytes.
plist_bytes = plistlib.dumps(grammar_data, fmt=plistlib.FMT_XML)
# Replace the file header.
file_header = b"""<?xml version="1.0" encoding="UTF-8"?>
<!--
Part of the Carbon Language project, under the Apache License v2.0 with LLVM
Exceptions. See /LICENSE for license information.
SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-->
<!--
THIS FILE IS AUTOGENERATED FROM carbon.tmLanguage.json. DO NOT EDIT.
-->
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
"""
(_, body) = plist_bytes.split(b"<plist", 1)
plist_bytes = file_header + b"<plist" + body
# Write the plist grammar.
with open(plist_path, "wb") as f:
f.write(plist_bytes)
print(f"Successfully generated {plist_path.relative_to(repo_root)}")
if __name__ == "__main__":
main()
+1000
View File
@@ -0,0 +1,1000 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Part of the Carbon Language project, under the Apache License v2.0 with LLVM
Exceptions. See /LICENSE for license information.
SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-->
<!--
THIS FILE IS AUTOGENERATED FROM carbon.tmLanguage.json. DO NOT EDIT.
-->
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>$schema</key>
<string>https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json</string>
<key>fileTypes</key>
<array>
<string>carbon</string>
</array>
<key>foldingStartMarker</key>
<string>\{\s*$</string>
<key>foldingStopMarker</key>
<string>^\s*\}</string>
<key>name</key>
<string>carbon</string>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#comments</string>
</dict>
<dict>
<key>include</key>
<string>#cpp-inline</string>
</dict>
<dict>
<key>include</key>
<string>#strings</string>
</dict>
<dict>
<key>include</key>
<string>#types</string>
</dict>
<dict>
<key>include</key>
<string>#functions</string>
</dict>
<dict>
<key>include</key>
<string>#variables</string>
</dict>
<dict>
<key>include</key>
<string>#operators</string>
</dict>
<dict>
<key>include</key>
<string>#special-keywords</string>
</dict>
<dict>
<key>include</key>
<string>#introducer-keywords</string>
</dict>
<dict>
<key>include</key>
<string>#modifier-keywords</string>
</dict>
<dict>
<key>include</key>
<string>#misc-keywords</string>
</dict>
<dict>
<key>include</key>
<string>#self-keywords</string>
</dict>
<dict>
<key>include</key>
<string>#underscore</string>
</dict>
<dict>
<key>include</key>
<string>#true-false</string>
</dict>
<dict>
<key>include</key>
<string>#type-literals</string>
</dict>
<dict>
<key>include</key>
<string>#numbers</string>
</dict>
<dict>
<key>include</key>
<string>#parameter-bindings</string>
</dict>
<dict>
<key>include</key>
<string>#customs</string>
</dict>
</array>
<key>repository</key>
<dict>
<key>comments</key>
<dict>
<key>patterns</key>
<array>
<dict>
<key>match</key>
<string>^\s*(?=//\s).*$</string>
<key>name</key>
<string>comment.line.carbon</string>
</dict>
<dict>
<key>match</key>
<string>^\s*//@dump-sem-ir-(begin|end)\s*$</string>
<key>name</key>
<string>comment.line.carbon</string>
</dict>
<dict>
<key>match</key>
<string>^\s*//@include-in-dumps\s*$</string>
<key>name</key>
<string>comment.line.carbon</string>
</dict>
</array>
</dict>
<key>common</key>
<dict>
<key>comments</key>
<array>
<string>For including comments, operators, keywords, literals, and language constants </string>
<string>in other rules that use begin/end. This way we do not accidentally override their </string>
<string>highlighting in complex rules.</string>
</array>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#comments</string>
</dict>
<dict>
<key>include</key>
<string>#strings</string>
</dict>
<dict>
<key>include</key>
<string>#operators</string>
</dict>
<dict>
<key>include</key>
<string>#special-keywords</string>
</dict>
<dict>
<key>include</key>
<string>#introducer-keywords</string>
</dict>
<dict>
<key>include</key>
<string>#modifier-keywords</string>
</dict>
<dict>
<key>include</key>
<string>#misc-keywords</string>
</dict>
<dict>
<key>include</key>
<string>#self-keywords</string>
</dict>
<dict>
<key>include</key>
<string>#true-false</string>
</dict>
<dict>
<key>include</key>
<string>#type-literals</string>
</dict>
<dict>
<key>include</key>
<string>#numbers</string>
</dict>
</array>
</dict>
<key>cpp-inline</key>
<dict>
<key>patterns</key>
<array>
<dict>
<key>begin</key>
<string>\b(import)\b\s+\b(Cpp)\b\s+\b(inline)\b\s*(''')([^\s'#]*\n)?</string>
<key>beginCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>storage.type.carbon</string>
</dict>
<key>2</key>
<dict>
<key>name</key>
<string>support.type.property-name.carbon</string>
</dict>
<key>3</key>
<dict>
<key>name</key>
<string>storage.type.carbon</string>
</dict>
<key>4</key>
<dict>
<key>name</key>
<string>string.quoted.triple.carbon</string>
</dict>
<key>5</key>
<dict>
<key>name</key>
<string>constant.character.escape.carbon</string>
</dict>
</dict>
<key>comment</key>
<string>C++ inline import (triple-quoted)</string>
<key>contentName</key>
<string>meta.embedded.block.cpp</string>
<key>end</key>
<string>(''')\s*(;)</string>
<key>endCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>string.quoted.triple.carbon</string>
</dict>
<key>2</key>
<dict>
<key>name</key>
<string>punctuation.terminator.carbon</string>
</dict>
</dict>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>source.cpp</string>
</dict>
</array>
</dict>
<dict>
<key>begin</key>
<string>\b(import)\b\s+\b(Cpp)\b\s+\b(inline)\b\s*(")</string>
<key>beginCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>storage.type.carbon</string>
</dict>
<key>2</key>
<dict>
<key>name</key>
<string>support.type.property-name.carbon</string>
</dict>
<key>3</key>
<dict>
<key>name</key>
<string>storage.type.carbon</string>
</dict>
<key>4</key>
<dict>
<key>name</key>
<string>string.quoted.double.carbon</string>
</dict>
</dict>
<key>comment</key>
<string>C++ inline import (double-quoted)</string>
<key>contentName</key>
<string>meta.embedded.inline.cpp</string>
<key>end</key>
<string>(")\s*(;)</string>
<key>endCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>string.quoted.double.carbon</string>
</dict>
<key>2</key>
<dict>
<key>name</key>
<string>punctuation.terminator.carbon</string>
</dict>
</dict>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>source.cpp</string>
</dict>
</array>
</dict>
<dict>
<key>begin</key>
<string>\b(inline)\b\s+\b(Cpp)\b\s*(''')([^\s'#]*\n)?</string>
<key>beginCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>storage.type.carbon</string>
</dict>
<key>2</key>
<dict>
<key>name</key>
<string>support.type.property-name.carbon</string>
</dict>
<key>3</key>
<dict>
<key>name</key>
<string>string.quoted.triple.carbon</string>
</dict>
<key>4</key>
<dict>
<key>name</key>
<string>constant.character.escape.carbon</string>
</dict>
</dict>
<key>comment</key>
<string>C++ inline block (triple-quoted)</string>
<key>contentName</key>
<string>meta.embedded.block.cpp</string>
<key>end</key>
<string>(''')\s*(;)</string>
<key>endCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>string.quoted.triple.carbon</string>
</dict>
<key>2</key>
<dict>
<key>name</key>
<string>punctuation.terminator.carbon</string>
</dict>
</dict>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>source.cpp</string>
</dict>
</array>
</dict>
<dict>
<key>begin</key>
<string>\b(inline)\b\s+\b(Cpp)\b\s*(")</string>
<key>beginCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>storage.type.carbon</string>
</dict>
<key>2</key>
<dict>
<key>name</key>
<string>support.type.property-name.carbon</string>
</dict>
<key>3</key>
<dict>
<key>name</key>
<string>string.quoted.double.carbon</string>
</dict>
</dict>
<key>comment</key>
<string>C++ inline block (double-quoted)</string>
<key>contentName</key>
<string>meta.embedded.inline.cpp</string>
<key>end</key>
<string>(")\s*(;)</string>
<key>endCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>string.quoted.double.carbon</string>
</dict>
<key>2</key>
<dict>
<key>name</key>
<string>punctuation.terminator.carbon</string>
</dict>
</dict>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>source.cpp</string>
</dict>
</array>
</dict>
</array>
</dict>
<key>customs</key>
<dict>
<key>comment</key>
<string>For rules that should be checked last.</string>
<key>patterns</key>
<array>
<dict>
<key>match</key>
<string>(?&lt;=\bpackage\s)\w+</string>
<key>name</key>
<string>support.class.carbon</string>
</dict>
<dict>
<key>match</key>
<string>(?&lt;=\bCore\s)\w+</string>
<key>name</key>
<string>support.class.carbon</string>
</dict>
<dict>
<key>match</key>
<string>(?&lt;=\bimport\s)\w+</string>
<key>name</key>
<string>support.type.property-name.carbon</string>
</dict>
<dict>
<key>comment</key>
<string>Matches function calls.</string>
<key>match</key>
<string>\b\w+\s*\(</string>
<key>name</key>
<string>support.function.carbon</string>
</dict>
<dict>
<key>comment</key>
<string>Matches unidentified words as variables.</string>
<key>match</key>
<string>\b\w+\b</string>
<key>name</key>
<string>support.variable.carbon</string>
</dict>
</array>
</dict>
<key>functions</key>
<dict>
<key>name</key>
<string>meta.function.carbon</string>
<key>patterns</key>
<array>
<dict>
<key>begin</key>
<string>\bfn\b</string>
<key>beginCaptures</key>
<dict>
<key>0</key>
<dict>
<key>name</key>
<string>storage.type.carbon</string>
</dict>
</dict>
<key>comment</key>
<string>Matches function declarations.</string>
<key>end</key>
<string>(?=[\[\(])</string>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#common</string>
</dict>
<dict>
<key>match</key>
<string>\w+</string>
<key>name</key>
<string>support.function.carbon</string>
</dict>
</array>
</dict>
</array>
</dict>
<key>introducer-keywords</key>
<dict>
<key>patterns</key>
<array>
<dict>
<key>match</key>
<string>\b(adapt|alias|choice|class|constraint|fn|import|inline|interface|let|library|namespace|var)\b</string>
<key>name</key>
<string>storage.type.carbon</string>
</dict>
<dict>
<key>match</key>
<string>\b(base)\b(?!\s*class\b)</string>
<key>name</key>
<string>storage.type.carbon</string>
</dict>
<dict>
<key>match</key>
<string>\b(export)\b(?!\s*import\b)</string>
<key>name</key>
<string>storage.type.carbon</string>
</dict>
<dict>
<key>match</key>
<string>\b(impl)\b(?!\s*(fn|library|package)\b)</string>
<key>name</key>
<string>storage.type.carbon</string>
</dict>
<dict>
<key>match</key>
<string>\b(package)\b(?!\.)</string>
<key>name</key>
<string>storage.type.carbon</string>
</dict>
</array>
</dict>
<key>misc-keywords</key>
<dict>
<key>patterns</key>
<array>
<dict>
<key>match</key>
<string>\b(auto|destructor|forall|friend|observe|override|require)\b</string>
<key>name</key>
<string>keyword.other.carbon</string>
</dict>
<dict>
<key>match</key>
<string>(?&lt;=\.)\b(base)\b</string>
<key>name</key>
<string>keyword.other.carbon</string>
</dict>
</array>
</dict>
<key>modifier-keywords</key>
<dict>
<key>patterns</key>
<array>
<dict>
<key>match</key>
<string>\b(abstract|const|extend|extern|final|private|protected|static|virtual)\b</string>
<key>name</key>
<string>storage.modifier.carbon</string>
</dict>
<dict>
<key>match</key>
<string>\b(base)\b(?=\s*class\b)</string>
<key>name</key>
<string>storage.modifier.carbon</string>
</dict>
<dict>
<key>match</key>
<string>\b(default)\b(?!\s*=&gt;)</string>
<key>name</key>
<string>storage.modifier.carbon</string>
</dict>
<dict>
<key>match</key>
<string>\b(export)\b(?=\s*import\b)</string>
<key>name</key>
<string>storage.modifier.carbon</string>
</dict>
<dict>
<key>match</key>
<string>\b(impl)\b(?=\s*(fn|library|package)\b)</string>
<key>name</key>
<string>storage.modifier.carbon</string>
</dict>
</array>
</dict>
<key>numbers</key>
<dict>
<key>comment</key>
<string>Invalid formats are also highlighted. Language server handles error highlighting</string>
<key>patterns</key>
<array>
<dict>
<key>match</key>
<string>0x[_0-9a-fA-F]*(\.[_0-9a-fA-F]+(p[-+]?[0-9]+)?)?</string>
<key>name</key>
<string>constant.numeric.carbon</string>
</dict>
<dict>
<key>match</key>
<string>0b[_01]*</string>
<key>name</key>
<string>constant.numeric.carbon</string>
</dict>
<dict>
<key>match</key>
<string>[0-9][_0-9]*(\.[_0-9]+(e[-+]?[0-9]+)?)?</string>
<key>name</key>
<string>constant.numeric.carbon</string>
</dict>
</array>
</dict>
<key>operators</key>
<dict>
<key>patterns</key>
<array>
<dict>
<key>match</key>
<string>\b(&gt;&gt;=|&lt;=&gt;|&lt;&lt;=|\&amp;=|==|!=|&gt;=|&gt;&gt;|&lt;=|&lt;&lt;|-=|-&gt;|--|%=|\|=|\+=|\+\+|/=|\*=|\&amp;|\^|=|&gt;|&lt;|-|%|\.|\||\+|/|\*)\b</string>
<key>name</key>
<string>keyword.operator.carbon</string>
</dict>
<dict>
<key>match</key>
<string>\b(and|as|impls|in|like|not|or|partial|ref|template|where)\b</string>
<key>name</key>
<string>keyword.control.carbon</string>
</dict>
</array>
</dict>
<key>parameter-bindings</key>
<dict>
<key>patterns</key>
<array>
<dict>
<key>captures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>support.variable.carbon</string>
</dict>
</dict>
<key>comment</key>
<string>Matches parameter bindings.</string>
<key>match</key>
<string>\b(\w+)\s*(?=:)</string>
</dict>
</array>
</dict>
<key>self-keywords</key>
<dict>
<key>patterns</key>
<array>
<dict>
<key>match</key>
<string>\b(self|Self)\b</string>
<key>name</key>
<string>variable.language.carbon</string>
</dict>
</array>
</dict>
<key>special-keywords</key>
<dict>
<key>patterns</key>
<array>
<dict>
<key>match</key>
<string>\b(break|case|continue|else|if|for|match|return|returned|then|while)\b</string>
<key>name</key>
<string>keyword.control.carbon</string>
</dict>
<dict>
<key>match</key>
<string>\b(default)\b(?=\s*=&gt;)</string>
<key>name</key>
<string>keyword.control.carbon</string>
</dict>
</array>
</dict>
<key>string_escapes</key>
<dict>
<key>patterns</key>
<array>
<dict>
<key>match</key>
<string>\\([tnr'"0\0]|x[0-9A-F]{2}|u\{[0-9A-F]{4,}\})</string>
<key>name</key>
<string>constant.character.escape.carbon</string>
</dict>
</array>
</dict>
<key>strings</key>
<dict>
<key>patterns</key>
<array>
<dict>
<key>begin</key>
<string>'''([^\s'#]*\n)?</string>
<key>beginCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>constant.character.escape.carbon</string>
</dict>
</dict>
<key>end</key>
<string>'''</string>
<key>name</key>
<string>string.quoted.triple.carbon</string>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#string_escapes</string>
</dict>
</array>
</dict>
<dict>
<key>begin</key>
<string>"</string>
<key>end</key>
<string>"</string>
<key>name</key>
<string>string.quoted.double.carbon</string>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#string_escapes</string>
</dict>
</array>
</dict>
</array>
</dict>
<key>true-false</key>
<dict>
<key>patterns</key>
<array>
<dict>
<key>match</key>
<string>\b(true|false)\b</string>
<key>name</key>
<string>constant.language.carbon</string>
</dict>
</array>
</dict>
<key>type-literals</key>
<dict>
<key>patterns</key>
<array>
<dict>
<key>match</key>
<string>\b(array|bool|char|str|type)\b</string>
<key>name</key>
<string>constant.language.carbon</string>
</dict>
<dict>
<key>comment</key>
<string>Match common numeric type literals. Language server should highlight other valid literals.</string>
<key>match</key>
<string>\b[iuf](8|16|32|64|128)\b</string>
<key>name</key>
<string>constant.language.carbon</string>
</dict>
</array>
</dict>
<key>types</key>
<dict>
<key>name</key>
<string>meta.type.carbon</string>
<key>patterns</key>
<array>
<dict>
<key>begin</key>
<string>\b((adapt|alias|class|constraint|interface|impl)|(as|impls))\b</string>
<key>beginCaptures</key>
<dict>
<key>2</key>
<dict>
<key>name</key>
<string>storage.type.carbon</string>
</dict>
<key>3</key>
<dict>
<key>name</key>
<string>keyword.control.carbon</string>
</dict>
</dict>
<key>comment</key>
<string>Matches type, constraint, and implementation declarations, and explicit casts.</string>
<key>end</key>
<string>(?=[;{])</string>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#common</string>
</dict>
<dict>
<key>include</key>
<string>#parameter-bindings</string>
</dict>
<dict>
<key>match</key>
<string>\w+</string>
<key>name</key>
<string>support.type.carbon</string>
</dict>
</array>
</dict>
<dict>
<key>begin</key>
<string>:!?</string>
<key>comment</key>
<string>Matches types in bindings.</string>
<key>end</key>
<string>(?=([;{=]|-&gt;|in|where))</string>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#common</string>
</dict>
<dict>
<key>include</key>
<string>#variables</string>
</dict>
<dict>
<key>include</key>
<string>#parameter-bindings</string>
</dict>
<dict>
<key>match</key>
<string>\w+</string>
<key>name</key>
<string>support.type.carbon</string>
</dict>
</array>
</dict>
<dict>
<key>begin</key>
<string>-&gt;</string>
<key>comment</key>
<string>Matches function return types.</string>
<key>end</key>
<string>(?=([;{]|=&gt;))</string>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#common</string>
</dict>
<dict>
<key>match</key>
<string>\w+</string>
<key>name</key>
<string>support.type.carbon</string>
</dict>
</array>
</dict>
<dict>
<key>begin</key>
<string>\bwhere\b</string>
<key>beginCaptures</key>
<dict>
<key>0</key>
<dict>
<key>name</key>
<string>keyword.control.carbon</string>
</dict>
</dict>
<key>comment</key>
<string>Matches types in where clause.</string>
<key>end</key>
<string>(?=[;{])</string>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#common</string>
</dict>
<dict>
<key>include</key>
<string>#variables</string>
</dict>
<dict>
<key>include</key>
<string>#parameter-bindings</string>
</dict>
<dict>
<key>match</key>
<string>\w+</string>
<key>name</key>
<string>support.type.carbon</string>
</dict>
</array>
</dict>
<dict>
<key>begin</key>
<string>\bchoice\b</string>
<key>beginCaptures</key>
<dict>
<key>0</key>
<dict>
<key>name</key>
<string>storage.type.carbon</string>
</dict>
</dict>
<key>comment</key>
<string>Matches choices.</string>
<key>end</key>
<string>(?=[;}])</string>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#common</string>
</dict>
<dict>
<key>include</key>
<string>#variables</string>
</dict>
<dict>
<key>include</key>
<string>#parameter-bindings</string>
</dict>
<dict>
<key>match</key>
<string>\w+</string>
<key>name</key>
<string>support.type.carbon</string>
</dict>
<dict>
<key>begin</key>
<string>\{</string>
<key>comment</key>
<string>Matches the choice values.</string>
<key>end</key>
<string>(?=})</string>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#common</string>
</dict>
<dict>
<key>match</key>
<string>\w+</string>
<key>name</key>
<string>variable.other.enummember.carbon</string>
</dict>
</array>
</dict>
</array>
</dict>
</array>
</dict>
<key>underscore</key>
<dict>
<key>patterns</key>
<array>
<dict>
<key>match</key>
<string>\b(_)\b</string>
<key>name</key>
<string>variable.language.carbon</string>
</dict>
</array>
</dict>
<key>variables</key>
<dict>
<key>name</key>
<string>meta.variable.carbon</string>
<key>patterns</key>
<array>
<dict>
<key>begin</key>
<string>\b(var|let)\b</string>
<key>beginCaptures</key>
<dict>
<key>0</key>
<dict>
<key>name</key>
<string>storage.type.carbon</string>
</dict>
</dict>
<key>comment</key>
<string>Matches variable declarations.</string>
<key>end</key>
<string>(?=:)</string>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#common</string>
</dict>
<dict>
<key>match</key>
<string>\w+</string>
<key>name</key>
<string>support.variable.carbon</string>
</dict>
</array>
</dict>
</array>
</dict>
</dict>
<key>scopeName</key>
<string>source.carbon</string>
<key>uuid</key>
<string>4568a54d-9a79-41ac-a36b-05916252763b</string>
</dict>
</plist>
@@ -1,537 +0,0 @@
{
"$schema": "https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json",
"name": "carbon",
"scopeName": "source.carbon",
"foldingStartMarker": "\\{\\s*$",
"foldingStopMarker": "^\\s*\\}",
"fileTypes": ["carbon"],
"patterns": [
{
"include": "#comments"
},
{
"include": "#cpp-inline"
},
{
"include": "#strings"
},
{
"include": "#types"
},
{
"include": "#functions"
},
{
"include": "#variables"
},
{
"include": "#operators"
},
{
"include": "#special-keywords"
},
{
"include": "#introducer-keywords"
},
{
"include": "#modifier-keywords"
},
{
"include": "#misc-keywords"
},
{
"include": "#self-keywords"
},
{
"include": "#underscore"
},
{
"include": "#true-false"
},
{
"include": "#type-literals"
},
{
"include": "#numbers"
},
{
"include": "#parameter-bindings"
},
{
"include": "#customs"
}
],
"repository": {
"cpp-inline": {
"patterns": [
{
"comment": "C++ inline import (triple-quoted)",
"begin": "\\b(import)\\b\\s+\\b(Cpp)\\b\\s+\\b(inline)\\b\\s*(''')([^\\s'#]*\\n)?",
"beginCaptures": {
"1": { "name": "storage.type.carbon" },
"2": { "name": "support.type.property-name.carbon" },
"3": { "name": "storage.type.carbon" },
"4": { "name": "string.quoted.triple.carbon" },
"5": { "name": "constant.character.escape.carbon" }
},
"end": "(''')\\s*(;)",
"endCaptures": {
"1": { "name": "string.quoted.triple.carbon" },
"2": { "name": "punctuation.terminator.carbon" }
},
"contentName": "meta.embedded.block.cpp",
"patterns": [
{
"include": "source.cpp"
}
]
},
{
"comment": "C++ inline import (double-quoted)",
"begin": "\\b(import)\\b\\s+\\b(Cpp)\\b\\s+\\b(inline)\\b\\s*(\")",
"beginCaptures": {
"1": { "name": "storage.type.carbon" },
"2": { "name": "support.type.property-name.carbon" },
"3": { "name": "storage.type.carbon" },
"4": { "name": "string.quoted.double.carbon" }
},
"end": "(\")\\s*(;)",
"endCaptures": {
"1": { "name": "string.quoted.double.carbon" },
"2": { "name": "punctuation.terminator.carbon" }
},
"contentName": "meta.embedded.inline.cpp",
"patterns": [
{
"include": "source.cpp"
}
]
},
{
"comment": "C++ inline block (triple-quoted)",
"begin": "\\b(inline)\\b\\s+\\b(Cpp)\\b\\s*(''')([^\\s'#]*\\n)?",
"beginCaptures": {
"1": { "name": "storage.type.carbon" },
"2": { "name": "support.type.property-name.carbon" },
"3": { "name": "string.quoted.triple.carbon" },
"4": { "name": "constant.character.escape.carbon" }
},
"end": "(''')\\s*(;)",
"endCaptures": {
"1": { "name": "string.quoted.triple.carbon" },
"2": { "name": "punctuation.terminator.carbon" }
},
"contentName": "meta.embedded.block.cpp",
"patterns": [
{
"include": "source.cpp"
}
]
},
{
"comment": "C++ inline block (double-quoted)",
"begin": "\\b(inline)\\b\\s+\\b(Cpp)\\b\\s*(\")",
"beginCaptures": {
"1": { "name": "storage.type.carbon" },
"2": { "name": "support.type.property-name.carbon" },
"3": { "name": "string.quoted.double.carbon" }
},
"end": "(\")\\s*(;)",
"endCaptures": {
"1": { "name": "string.quoted.double.carbon" },
"2": { "name": "punctuation.terminator.carbon" }
},
"contentName": "meta.embedded.inline.cpp",
"patterns": [
{
"include": "source.cpp"
}
]
}
]
},
"comments": {
"patterns": [
{
"name": "comment.line.carbon",
"match": "^\\s*(?=//\\s).*$"
},
{
"name": "comment.line.carbon",
"match": "^\\s*//@dump-sem-ir-(begin|end)\\s*$"
},
{
"name": "comment.line.carbon",
"match": "^\\s*//@include-in-dumps\\s*$"
}
]
},
"string_escapes": {
"patterns": [
{
"name": "constant.character.escape.carbon",
"match": "\\\\([tnr'\"0\\0]|x[0-9A-F]{2}|u\\{[0-9A-F]{4,}\\})"
}
]
},
"strings": {
"patterns": [
{
"name": "string.quoted.triple.carbon",
"begin": "'''([^\\s'#]*\\n)?",
"end": "'''",
"beginCaptures": {
"1": {
"name": "constant.character.escape.carbon"
}
},
"patterns": [
{
"include": "#string_escapes"
}
]
},
{
"name": "string.quoted.double.carbon",
"begin": "\"",
"end": "\"",
"patterns": [
{
"include": "#string_escapes"
}
]
}
]
},
"types": {
"name": "meta.type.carbon",
"patterns": [
{
"comment": "Matches type, constraint, and implementation declarations, and explicit casts.",
"begin": "\\b((adapt|alias|class|constraint|interface|impl)|(as|impls))\\b",
"beginCaptures": {
"2": { "name": "storage.type.carbon" },
"3": { "name": "keyword.control.carbon" }
},
"end": "(?=[;{])",
"patterns": [
{ "include": "#common" },
{ "include": "#parameter-bindings" },
{
"name": "support.type.carbon",
"match": "\\w+"
}
]
},
{
"comment": "Matches types in bindings.",
"begin": ":!?",
"end": "(?=([;{=]|->|in|where))",
"patterns": [
{ "include": "#common" },
{ "include": "#variables" },
{ "include": "#parameter-bindings" },
{
"name": "support.type.carbon",
"match": "\\w+"
}
]
},
{
"comment": "Matches function return types.",
"begin": "->",
"end": "(?=([;{]|=>))",
"patterns": [
{ "include": "#common" },
{
"name": "support.type.carbon",
"match": "\\w+"
}
]
},
{
"comment": "Matches types in where clause.",
"begin": "\\bwhere\\b",
"beginCaptures": {
"0": { "name": "keyword.control.carbon" }
},
"end": "(?=[;{])",
"patterns": [
{ "include": "#common" },
{ "include": "#variables" },
{ "include": "#parameter-bindings" },
{
"name": "support.type.carbon",
"match": "\\w+"
}
]
},
{
"comment": "Matches choices.",
"begin": "\\bchoice\\b",
"beginCaptures": {
"0": { "name": "storage.type.carbon" }
},
"end": "(?=[;}])",
"patterns": [
{ "include": "#common" },
{ "include": "#variables" },
{ "include": "#parameter-bindings" },
{
"name": "support.type.carbon",
"match": "\\w+"
},
{
"comment": "Matches the choice values.",
"begin": "\\{",
"end": "(?=})",
"patterns": [
{ "include": "#common" },
{
"name": "variable.other.enummember.carbon",
"match": "\\w+"
}
]
}
]
}
]
},
"functions": {
"name": "meta.function.carbon",
"patterns": [
{
"comment": "Matches function declarations.",
"begin": "\\bfn\\b",
"beginCaptures": {
"0": { "name": "storage.type.carbon" }
},
"end": "(?=[\\[\\(])",
"patterns": [
{ "include": "#common" },
{
"name": "support.function.carbon",
"match": "\\w+"
}
]
}
]
},
"variables": {
"name": "meta.variable.carbon",
"patterns": [
{
"comment": "Matches variable declarations.",
"begin": "\\b(var|let)\\b",
"beginCaptures": {
"0": { "name": "storage.type.carbon" }
},
"end": "(?=:)",
"patterns": [
{ "include": "#common" },
{
"name": "support.variable.carbon",
"match": "\\w+"
}
]
}
]
},
"operators": {
"patterns": [
{
"name": "keyword.operator.carbon",
"match": "\\b(>>=|<=>|<<=|\\&=|==|!=|>=|>>|<=|<<|-=|->|--|%=|\\|=|\\+=|\\+\\+|/=|\\*=|\\&|\\^|=|>|<|-|%|\\.|\\||\\+|/|\\*)\\b"
},
{
"name": "keyword.control.carbon",
"match": "\\b(and|as|impls|in|like|not|or|partial|ref|template|where)\\b"
}
]
},
"special-keywords": {
"patterns": [
{
"name": "keyword.control.carbon",
"match": "\\b(break|case|continue|else|if|for|match|return|returned|then|while)\\b"
},
{
"name": "keyword.control.carbon",
"match": "\\b(default)\\b(?=\\s*=>)"
}
]
},
"introducer-keywords": {
"patterns": [
{
"name": "storage.type.carbon",
"match": "\\b(adapt|alias|choice|class|constraint|fn|import|inline|interface|let|library|namespace|var)\\b"
},
{
"name": "storage.type.carbon",
"match": "\\b(base)\\b(?!\\s*class\\b)"
},
{
"name": "storage.type.carbon",
"match": "\\b(export)\\b(?!\\s*import\\b)"
},
{
"name": "storage.type.carbon",
"match": "\\b(impl)\\b(?!\\s*(fn|library|package)\\b)"
},
{
"name": "storage.type.carbon",
"match": "\\b(package)\\b(?!\\.)"
}
]
},
"modifier-keywords": {
"patterns": [
{
"name": "storage.modifier.carbon",
"match": "\\b(abstract|const|extend|extern|final|private|protected|static|virtual)\\b"
},
{
"name": "storage.modifier.carbon",
"match": "\\b(base)\\b(?=\\s*class\\b)"
},
{
"name": "storage.modifier.carbon",
"match": "\\b(default)\\b(?!\\s*=>)"
},
{
"name": "storage.modifier.carbon",
"match": "\\b(export)\\b(?=\\s*import\\b)"
},
{
"name": "storage.modifier.carbon",
"match": "\\b(impl)\\b(?=\\s*(fn|library|package)\\b)"
}
]
},
"misc-keywords": {
"patterns": [
{
"name": "keyword.other.carbon",
"match": "\\b(auto|destructor|forall|friend|observe|override|require)\\b"
},
{
"name": "keyword.other.carbon",
"match": "(?<=\\.)\\b(base)\\b"
}
]
},
"self-keywords": {
"patterns": [
{
"name": "variable.language.carbon",
"match": "\\b(self|Self)\\b"
}
]
},
"underscore": {
"patterns": [
{
"name": "variable.language.carbon",
"match": "\\b(_)\\b"
}
]
},
"true-false": {
"patterns": [
{
"name": "constant.language.carbon",
"match": "\\b(true|false)\\b"
}
]
},
"type-literals": {
"patterns": [
{
"name": "constant.language.carbon",
"match": "\\b(array|bool|char|str|type)\\b"
},
{
"name": "constant.language.carbon",
"comment": "Match common numeric type literals. Language server should highlight other valid literals.",
"match": "\\b[iuf](8|16|32|64|128)\\b"
}
]
},
"numbers": {
"comment": "Invalid formats are also highlighted. Language server handles error highlighting",
"patterns": [
{
"name": "constant.numeric.carbon",
"match": "0x[_0-9a-fA-F]*(\\.[_0-9a-fA-F]+(p[-+]?[0-9]+)?)?"
},
{
"name": "constant.numeric.carbon",
"match": "0b[_01]*"
},
{
"name": "constant.numeric.carbon",
"match": "[0-9][_0-9]*(\\.[_0-9]+(e[-+]?[0-9]+)?)?"
}
]
},
"parameter-bindings": {
"patterns": [
{
"comment": "Matches parameter bindings.",
"match": "\\b(\\w+)\\s*(?=:)",
"captures": {
"1": { "name": "support.variable.carbon" }
}
}
]
},
"customs": {
"comment": "For rules that should be checked last.",
"patterns": [
{
"name": "support.class.carbon",
"match": "(?<=\\bpackage\\s)\\w+"
},
{
"name": "support.class.carbon",
"match": "(?<=\\bCore\\s)\\w+"
},
{
"name": "support.type.property-name.carbon",
"match": "(?<=\\bimport\\s)\\w+"
},
{
"comment": "Matches function calls.",
"name": "support.function.carbon",
"match": "\\b\\w+\\s*\\("
},
{
"comment": "Matches unidentified words as variables.",
"name": "support.variable.carbon",
"match": "\\b\\w+\\b"
}
]
},
"common": {
"comments": [
"For including comments, operators, keywords, literals, and language constants ",
"in other rules that use begin/end. This way we do not accidentally override their ",
"highlighting in complex rules."
],
"patterns": [
{ "include": "#comments" },
{ "include": "#strings" },
{ "include": "#operators" },
{ "include": "#special-keywords" },
{ "include": "#introducer-keywords" },
{ "include": "#modifier-keywords" },
{ "include": "#misc-keywords" },
{ "include": "#self-keywords" },
{ "include": "#true-false" },
{ "include": "#type-literals" },
{ "include": "#numbers" }
]
}
}
}
+3 -1
View File
@@ -8,6 +8,7 @@ SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>contactName</key>
<string>Carbon Developers</string>
@@ -15,7 +16,7 @@ SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
<string>Support for Carbon Language</string>
<key>name</key>
<string>carbon</string>
<string>Carbon</string>
<key>ordering</key>
<array>
@@ -24,4 +25,5 @@ SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
<key>uuid</key>
<string>6152A817-84AE-47A8-96DB-0B50DF2EEC10</string>
</dict>
</plist>
-1
View File
@@ -1 +0,0 @@
../textmate/Syntaxes/carbon.tmLanguage.json
+538
View File
@@ -0,0 +1,538 @@
{
"$schema": "https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json",
"uuid": "4568a54d-9a79-41ac-a36b-05916252763b",
"name": "carbon",
"scopeName": "source.carbon",
"foldingStartMarker": "\\{\\s*$",
"foldingStopMarker": "^\\s*\\}",
"fileTypes": ["carbon"],
"patterns": [
{
"include": "#comments"
},
{
"include": "#cpp-inline"
},
{
"include": "#strings"
},
{
"include": "#types"
},
{
"include": "#functions"
},
{
"include": "#variables"
},
{
"include": "#operators"
},
{
"include": "#special-keywords"
},
{
"include": "#introducer-keywords"
},
{
"include": "#modifier-keywords"
},
{
"include": "#misc-keywords"
},
{
"include": "#self-keywords"
},
{
"include": "#underscore"
},
{
"include": "#true-false"
},
{
"include": "#type-literals"
},
{
"include": "#numbers"
},
{
"include": "#parameter-bindings"
},
{
"include": "#customs"
}
],
"repository": {
"cpp-inline": {
"patterns": [
{
"comment": "C++ inline import (triple-quoted)",
"begin": "\\b(import)\\b\\s+\\b(Cpp)\\b\\s+\\b(inline)\\b\\s*(''')([^\\s'#]*\\n)?",
"beginCaptures": {
"1": { "name": "storage.type.carbon" },
"2": { "name": "support.type.property-name.carbon" },
"3": { "name": "storage.type.carbon" },
"4": { "name": "string.quoted.triple.carbon" },
"5": { "name": "constant.character.escape.carbon" }
},
"end": "(''')\\s*(;)",
"endCaptures": {
"1": { "name": "string.quoted.triple.carbon" },
"2": { "name": "punctuation.terminator.carbon" }
},
"contentName": "meta.embedded.block.cpp",
"patterns": [
{
"include": "source.cpp"
}
]
},
{
"comment": "C++ inline import (double-quoted)",
"begin": "\\b(import)\\b\\s+\\b(Cpp)\\b\\s+\\b(inline)\\b\\s*(\")",
"beginCaptures": {
"1": { "name": "storage.type.carbon" },
"2": { "name": "support.type.property-name.carbon" },
"3": { "name": "storage.type.carbon" },
"4": { "name": "string.quoted.double.carbon" }
},
"end": "(\")\\s*(;)",
"endCaptures": {
"1": { "name": "string.quoted.double.carbon" },
"2": { "name": "punctuation.terminator.carbon" }
},
"contentName": "meta.embedded.inline.cpp",
"patterns": [
{
"include": "source.cpp"
}
]
},
{
"comment": "C++ inline block (triple-quoted)",
"begin": "\\b(inline)\\b\\s+\\b(Cpp)\\b\\s*(''')([^\\s'#]*\\n)?",
"beginCaptures": {
"1": { "name": "storage.type.carbon" },
"2": { "name": "support.type.property-name.carbon" },
"3": { "name": "string.quoted.triple.carbon" },
"4": { "name": "constant.character.escape.carbon" }
},
"end": "(''')\\s*(;)",
"endCaptures": {
"1": { "name": "string.quoted.triple.carbon" },
"2": { "name": "punctuation.terminator.carbon" }
},
"contentName": "meta.embedded.block.cpp",
"patterns": [
{
"include": "source.cpp"
}
]
},
{
"comment": "C++ inline block (double-quoted)",
"begin": "\\b(inline)\\b\\s+\\b(Cpp)\\b\\s*(\")",
"beginCaptures": {
"1": { "name": "storage.type.carbon" },
"2": { "name": "support.type.property-name.carbon" },
"3": { "name": "string.quoted.double.carbon" }
},
"end": "(\")\\s*(;)",
"endCaptures": {
"1": { "name": "string.quoted.double.carbon" },
"2": { "name": "punctuation.terminator.carbon" }
},
"contentName": "meta.embedded.inline.cpp",
"patterns": [
{
"include": "source.cpp"
}
]
}
]
},
"comments": {
"patterns": [
{
"name": "comment.line.carbon",
"match": "^\\s*(?=//\\s).*$"
},
{
"name": "comment.line.carbon",
"match": "^\\s*//@dump-sem-ir-(begin|end)\\s*$"
},
{
"name": "comment.line.carbon",
"match": "^\\s*//@include-in-dumps\\s*$"
}
]
},
"string_escapes": {
"patterns": [
{
"name": "constant.character.escape.carbon",
"match": "\\\\([tnr'\"0\\0]|x[0-9A-F]{2}|u\\{[0-9A-F]{4,}\\})"
}
]
},
"strings": {
"patterns": [
{
"name": "string.quoted.triple.carbon",
"begin": "'''([^\\s'#]*\\n)?",
"end": "'''",
"beginCaptures": {
"1": {
"name": "constant.character.escape.carbon"
}
},
"patterns": [
{
"include": "#string_escapes"
}
]
},
{
"name": "string.quoted.double.carbon",
"begin": "\"",
"end": "\"",
"patterns": [
{
"include": "#string_escapes"
}
]
}
]
},
"types": {
"name": "meta.type.carbon",
"patterns": [
{
"comment": "Matches type, constraint, and implementation declarations, and explicit casts.",
"begin": "\\b((adapt|alias|class|constraint|interface|impl)|(as|impls))\\b",
"beginCaptures": {
"2": { "name": "storage.type.carbon" },
"3": { "name": "keyword.control.carbon" }
},
"end": "(?=[;{])",
"patterns": [
{ "include": "#common" },
{ "include": "#parameter-bindings" },
{
"name": "support.type.carbon",
"match": "\\w+"
}
]
},
{
"comment": "Matches types in bindings.",
"begin": ":!?",
"end": "(?=([;{=]|->|in|where))",
"patterns": [
{ "include": "#common" },
{ "include": "#variables" },
{ "include": "#parameter-bindings" },
{
"name": "support.type.carbon",
"match": "\\w+"
}
]
},
{
"comment": "Matches function return types.",
"begin": "->",
"end": "(?=([;{]|=>))",
"patterns": [
{ "include": "#common" },
{
"name": "support.type.carbon",
"match": "\\w+"
}
]
},
{
"comment": "Matches types in where clause.",
"begin": "\\bwhere\\b",
"beginCaptures": {
"0": { "name": "keyword.control.carbon" }
},
"end": "(?=[;{])",
"patterns": [
{ "include": "#common" },
{ "include": "#variables" },
{ "include": "#parameter-bindings" },
{
"name": "support.type.carbon",
"match": "\\w+"
}
]
},
{
"comment": "Matches choices.",
"begin": "\\bchoice\\b",
"beginCaptures": {
"0": { "name": "storage.type.carbon" }
},
"end": "(?=[;}])",
"patterns": [
{ "include": "#common" },
{ "include": "#variables" },
{ "include": "#parameter-bindings" },
{
"name": "support.type.carbon",
"match": "\\w+"
},
{
"comment": "Matches the choice values.",
"begin": "\\{",
"end": "(?=})",
"patterns": [
{ "include": "#common" },
{
"name": "variable.other.enummember.carbon",
"match": "\\w+"
}
]
}
]
}
]
},
"functions": {
"name": "meta.function.carbon",
"patterns": [
{
"comment": "Matches function declarations.",
"begin": "\\bfn\\b",
"beginCaptures": {
"0": { "name": "storage.type.carbon" }
},
"end": "(?=[\\[\\(])",
"patterns": [
{ "include": "#common" },
{
"name": "support.function.carbon",
"match": "\\w+"
}
]
}
]
},
"variables": {
"name": "meta.variable.carbon",
"patterns": [
{
"comment": "Matches variable declarations.",
"begin": "\\b(var|let)\\b",
"beginCaptures": {
"0": { "name": "storage.type.carbon" }
},
"end": "(?=:)",
"patterns": [
{ "include": "#common" },
{
"name": "support.variable.carbon",
"match": "\\w+"
}
]
}
]
},
"operators": {
"patterns": [
{
"name": "keyword.operator.carbon",
"match": "\\b(>>=|<=>|<<=|\\&=|==|!=|>=|>>|<=|<<|-=|->|--|%=|\\|=|\\+=|\\+\\+|/=|\\*=|\\&|\\^|=|>|<|-|%|\\.|\\||\\+|/|\\*)\\b"
},
{
"name": "keyword.control.carbon",
"match": "\\b(and|as|impls|in|like|not|or|partial|ref|template|where)\\b"
}
]
},
"special-keywords": {
"patterns": [
{
"name": "keyword.control.carbon",
"match": "\\b(break|case|continue|else|if|for|match|return|returned|then|while)\\b"
},
{
"name": "keyword.control.carbon",
"match": "\\b(default)\\b(?=\\s*=>)"
}
]
},
"introducer-keywords": {
"patterns": [
{
"name": "storage.type.carbon",
"match": "\\b(adapt|alias|choice|class|constraint|fn|import|inline|interface|let|library|namespace|var)\\b"
},
{
"name": "storage.type.carbon",
"match": "\\b(base)\\b(?!\\s*class\\b)"
},
{
"name": "storage.type.carbon",
"match": "\\b(export)\\b(?!\\s*import\\b)"
},
{
"name": "storage.type.carbon",
"match": "\\b(impl)\\b(?!\\s*(fn|library|package)\\b)"
},
{
"name": "storage.type.carbon",
"match": "\\b(package)\\b(?!\\.)"
}
]
},
"modifier-keywords": {
"patterns": [
{
"name": "storage.modifier.carbon",
"match": "\\b(abstract|const|extend|extern|final|private|protected|static|virtual)\\b"
},
{
"name": "storage.modifier.carbon",
"match": "\\b(base)\\b(?=\\s*class\\b)"
},
{
"name": "storage.modifier.carbon",
"match": "\\b(default)\\b(?!\\s*=>)"
},
{
"name": "storage.modifier.carbon",
"match": "\\b(export)\\b(?=\\s*import\\b)"
},
{
"name": "storage.modifier.carbon",
"match": "\\b(impl)\\b(?=\\s*(fn|library|package)\\b)"
}
]
},
"misc-keywords": {
"patterns": [
{
"name": "keyword.other.carbon",
"match": "\\b(auto|destructor|forall|friend|observe|override|require)\\b"
},
{
"name": "keyword.other.carbon",
"match": "(?<=\\.)\\b(base)\\b"
}
]
},
"self-keywords": {
"patterns": [
{
"name": "variable.language.carbon",
"match": "\\b(self|Self)\\b"
}
]
},
"underscore": {
"patterns": [
{
"name": "variable.language.carbon",
"match": "\\b(_)\\b"
}
]
},
"true-false": {
"patterns": [
{
"name": "constant.language.carbon",
"match": "\\b(true|false)\\b"
}
]
},
"type-literals": {
"patterns": [
{
"name": "constant.language.carbon",
"match": "\\b(array|bool|char|str|type)\\b"
},
{
"name": "constant.language.carbon",
"comment": "Match common numeric type literals. Language server should highlight other valid literals.",
"match": "\\b[iuf](8|16|32|64|128)\\b"
}
]
},
"numbers": {
"comment": "Invalid formats are also highlighted. Language server handles error highlighting",
"patterns": [
{
"name": "constant.numeric.carbon",
"match": "0x[_0-9a-fA-F]*(\\.[_0-9a-fA-F]+(p[-+]?[0-9]+)?)?"
},
{
"name": "constant.numeric.carbon",
"match": "0b[_01]*"
},
{
"name": "constant.numeric.carbon",
"match": "[0-9][_0-9]*(\\.[_0-9]+(e[-+]?[0-9]+)?)?"
}
]
},
"parameter-bindings": {
"patterns": [
{
"comment": "Matches parameter bindings.",
"match": "\\b(\\w+)\\s*(?=:)",
"captures": {
"1": { "name": "support.variable.carbon" }
}
}
]
},
"customs": {
"comment": "For rules that should be checked last.",
"patterns": [
{
"name": "support.class.carbon",
"match": "(?<=\\bpackage\\s)\\w+"
},
{
"name": "support.class.carbon",
"match": "(?<=\\bCore\\s)\\w+"
},
{
"name": "support.type.property-name.carbon",
"match": "(?<=\\bimport\\s)\\w+"
},
{
"comment": "Matches function calls.",
"name": "support.function.carbon",
"match": "\\b\\w+\\s*\\("
},
{
"comment": "Matches unidentified words as variables.",
"name": "support.variable.carbon",
"match": "\\b\\w+\\b"
}
]
},
"common": {
"comments": [
"For including comments, operators, keywords, literals, and language constants ",
"in other rules that use begin/end. This way we do not accidentally override their ",
"highlighting in complex rules."
],
"patterns": [
{ "include": "#comments" },
{ "include": "#strings" },
{ "include": "#operators" },
{ "include": "#special-keywords" },
{ "include": "#introducer-keywords" },
{ "include": "#modifier-keywords" },
{ "include": "#misc-keywords" },
{ "include": "#self-keywords" },
{ "include": "#true-false" },
{ "include": "#type-literals" },
{ "include": "#numbers" }
]
}
}
}