Files
carbon-lang/utils/textmate/Syntaxes/carbon.tmLanguage
Chandler Carruth fccb349af4 Improve the TextMate grammar scopes and precision (again) (#7914)
This is a re-do of #7888

Outside a call, the grammar scoped a name as a type or a variable by its
capitalization. A theme could not distinguish a type from a value with
the same spelling, or a parameter, a member, or an implemented interface
from any other name. Pointer member access `->` was scoped as a result
arrow, which scoped `Lookup` in `regions->Lookup(x)` as a type.

`entity.name.type` now applies only in a type position (after `:`, `->`,
`as`, `adapt`, or `require`, or in an `impl`) and to the name a nominal
declaration declares. A qualifier, in a declared name like `fn N.Base(T:
type).F()` or in a type, is `entity.name.scope-resolution` nested in
`entity.name.type`. As in the parser, a name is a qualifier when its
parameter lists are followed by `.`. Parameters, `let` bindings, choice
alternatives, members, implemented interfaces, primitive types,
`import`, and the strings naming a builtin or a library have their own
scopes, and brackets use the C++ grammar's scopes. A `->` written
directly after its operand is member access; no result arrow in the
repository is written that way.

The sample palette renders each scope that depends on context
differently, and `tmlanguage.py` now supports nested captures.

In 17 of the 19 themes measured, the VS Code built-ins plus One Dark
Pro, Night Owl, Tokyo Night, and Nord, 13% to 27% of the characters in
hand-written Carbon change color or style. A theme loses a color where
`.` is now punctuation, where word operators like `as` are no longer
control-flow keywords, or where a name outside a type position is no
longer a type.

Assisted-by: Claude Code
2026-10-06 23:21:43 +00:00

2424 lines
63 KiB
Plaintext

<?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>#builtin-functions</string>
</dict>
<dict>
<key>include</key>
<string>#choice-definitions</string>
</dict>
<dict>
<key>include</key>
<string>#declarations</string>
</dict>
<dict>
<key>include</key>
<string>#inheritance</string>
</dict>
<dict>
<key>include</key>
<string>#type-annotation</string>
</dict>
<dict>
<key>include</key>
<string>#keywords</string>
</dict>
<dict>
<key>include</key>
<string>#literals</string>
</dict>
<dict>
<key>include</key>
<string>#numbers</string>
</dict>
<dict>
<key>include</key>
<string>#operators</string>
</dict>
<dict>
<key>include</key>
<string>#identifiers</string>
</dict>
<dict>
<key>include</key>
<string>#punctuation</string>
</dict>
</array>
<key>repository</key>
<dict>
<key>bindings</key>
<dict>
<key>patterns</key>
<array>
<dict>
<key>captures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>punctuation.definition.raw-identifier.carbon</string>
</dict>
<key>2</key>
<dict>
<key>name</key>
<string>variable.parameter.carbon</string>
</dict>
</dict>
<key>comment</key>
<string>Parameter bindings (`name: Type` when not preceded by `let` or `var`), with `variable.parameter` nested inside `variable.other`.</string>
<key>match</key>
<string>(?&lt;!\.)(?&lt;!-&gt;)\b(r#)?([A-Za-z_][A-Za-z0-9_]*)(?=\s*:(?![=!?]))</string>
<key>name</key>
<string>variable.other.carbon</string>
</dict>
</array>
</dict>
<key>builtin-functions</key>
<dict>
<key>patterns</key>
<array>
<dict>
<key>begin</key>
<string>\b(fn)\b(?=[^"/;]*=\s*")</string>
<key>beginCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>storage.type.carbon</string>
</dict>
</dict>
<key>comment</key>
<string>A builtin function declaration (`fn ... = "..."`), scoping the string contents as `support.function.builtin`.</string>
<key>end</key>
<string>(?=;)|$</string>
<key>patterns</key>
<array>
<dict>
<key>captures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>keyword.operator.carbon</string>
</dict>
<key>2</key>
<dict>
<key>name</key>
<string>string.quoted.double.carbon</string>
</dict>
<key>3</key>
<dict>
<key>name</key>
<string>punctuation.definition.string.begin.carbon</string>
</dict>
<key>4</key>
<dict>
<key>name</key>
<string>support.function.builtin.carbon</string>
</dict>
<key>5</key>
<dict>
<key>name</key>
<string>punctuation.definition.string.end.carbon</string>
</dict>
</dict>
<key>match</key>
<string>(=)\s*((")([^"\\\n]*)("))</string>
</dict>
<dict>
<key>include</key>
<string>#declarations</string>
</dict>
<dict>
<key>include</key>
<string>#comments</string>
</dict>
<dict>
<key>include</key>
<string>#strings</string>
</dict>
<dict>
<key>include</key>
<string>#type-annotation</string>
</dict>
<dict>
<key>include</key>
<string>#keywords</string>
</dict>
<dict>
<key>include</key>
<string>#literals</string>
</dict>
<dict>
<key>include</key>
<string>#numbers</string>
</dict>
<dict>
<key>include</key>
<string>#operators</string>
</dict>
<dict>
<key>include</key>
<string>#identifiers</string>
</dict>
<dict>
<key>include</key>
<string>#punctuation</string>
</dict>
</array>
</dict>
</array>
</dict>
<key>choice-definitions</key>
<dict>
<key>patterns</key>
<array>
<dict>
<key>begin</key>
<string>\b(choice)\b</string>
<key>beginCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>storage.type.carbon</string>
</dict>
</dict>
<key>comment</key>
<string>A `choice` declaration, scoping names in its body as enum members and closing immediately if there is no body.</string>
<key>end</key>
<string>(?&lt;=\})|(?=[^\s({])</string>
<key>patterns</key>
<array>
<dict>
<key>begin</key>
<string>(?&lt;=\bchoice)\s+(?=(?:r#)?[A-Za-z_])</string>
<key>end</key>
<string>((?:r#)?[A-Za-z_][A-Za-z0-9_]*)\b(?!\s*(?:\[[^\[\]]*\]\s*)?(?:\([^()]*(?:\([^()]*(?:\([^()]*\)[^()]*)*\)[^()]*)*\)\s*)?\.)|(?=[^\sA-Za-z_])|$</string>
<key>endCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>entity.name.type.carbon</string>
</dict>
</dict>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#declared-name-qualifier</string>
</dict>
</array>
</dict>
<dict>
<key>include</key>
<string>#comments</string>
</dict>
<dict>
<key>begin</key>
<string>\(</string>
<key>beginCaptures</key>
<dict>
<key>0</key>
<dict>
<key>name</key>
<string>punctuation.section.parens.begin.bracket.round.carbon</string>
</dict>
</dict>
<key>comment</key>
<string>Choice parameters.</string>
<key>end</key>
<string>(\))|$</string>
<key>endCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>punctuation.section.parens.end.bracket.round.carbon</string>
</dict>
</dict>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#choice-parameters</string>
</dict>
</array>
</dict>
<dict>
<key>begin</key>
<string>\{</string>
<key>beginCaptures</key>
<dict>
<key>0</key>
<dict>
<key>name</key>
<string>punctuation.section.block.begin.bracket.curly.carbon</string>
</dict>
</dict>
<key>comment</key>
<string>Choice body.</string>
<key>end</key>
<string>(\})|(?=[;=])</string>
<key>endCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>punctuation.section.block.end.bracket.curly.carbon</string>
</dict>
</dict>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#comments</string>
</dict>
<dict>
<key>begin</key>
<string>\(</string>
<key>beginCaptures</key>
<dict>
<key>0</key>
<dict>
<key>name</key>
<string>punctuation.section.parens.begin.bracket.round.carbon</string>
</dict>
</dict>
<key>comment</key>
<string>Alternative parameters.</string>
<key>end</key>
<string>(\))|$</string>
<key>endCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>punctuation.section.parens.end.bracket.round.carbon</string>
</dict>
</dict>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#choice-parameters</string>
</dict>
</array>
</dict>
<dict>
<key>begin</key>
<string>\[</string>
<key>beginCaptures</key>
<dict>
<key>0</key>
<dict>
<key>name</key>
<string>punctuation.section.brackets.begin.bracket.square.carbon</string>
</dict>
</dict>
<key>comment</key>
<string>Invalid implicit parameter list on an alternative, matched so its contents are not scoped as enum members.</string>
<key>end</key>
<string>(\])|$</string>
<key>endCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>punctuation.section.brackets.end.bracket.square.carbon</string>
</dict>
</dict>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#choice-parameters</string>
</dict>
</array>
</dict>
<dict>
<key>include</key>
<string>#keywords</string>
</dict>
<dict>
<key>include</key>
<string>#literals</string>
</dict>
<dict>
<key>match</key>
<string>\b(?:r#)?[A-Za-z_][A-Za-z0-9_]*\b</string>
<key>name</key>
<string>variable.other.enummember.carbon</string>
</dict>
<dict>
<key>include</key>
<string>#numbers</string>
</dict>
<dict>
<key>include</key>
<string>#operators</string>
</dict>
<dict>
<key>include</key>
<string>#punctuation</string>
</dict>
</array>
</dict>
</array>
</dict>
</array>
</dict>
<key>choice-parameters</key>
<dict>
<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>#inheritance</string>
</dict>
<dict>
<key>include</key>
<string>#type-annotation</string>
</dict>
<dict>
<key>include</key>
<string>#keywords</string>
</dict>
<dict>
<key>include</key>
<string>#literals</string>
</dict>
<dict>
<key>include</key>
<string>#numbers</string>
</dict>
<dict>
<key>include</key>
<string>#operators</string>
</dict>
<dict>
<key>include</key>
<string>#identifiers</string>
</dict>
<dict>
<key>include</key>
<string>#punctuation</string>
</dict>
</array>
</dict>
<key>comments</key>
<dict>
<key>patterns</key>
<array>
<dict>
<key>captures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>comment.line.double-slash.carbon</string>
</dict>
<key>2</key>
<dict>
<key>name</key>
<string>punctuation.definition.comment.carbon</string>
</dict>
<key>3</key>
<dict>
<key>name</key>
<string>keyword.other.directive.carbon</string>
</dict>
</dict>
<key>comment</key>
<string>Toolchain directives. The comment scope sits on a capture rather than on the rule, to leave the leading indentation outside it.</string>
<key>match</key>
<string>^\s*((//)(@(?:dump-sem-ir-(?:begin|end)|include-in-dumps)))$</string>
</dict>
<dict>
<key>captures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>punctuation.definition.comment.carbon</string>
</dict>
</dict>
<key>match</key>
<string>(//).*$</string>
<key>name</key>
<string>comment.line.double-slash.carbon</string>
</dict>
</array>
</dict>
<key>cpp-inline</key>
<dict>
<key>patterns</key>
<array>
<dict>
<key>begin</key>
<string>\b(?:(import)\s+(Cpp)\s+(inline)|(inline)\s+(Cpp))\s*(''')([^\s'\"#]*)(?:[ \t]*((//)(?:[ \t][^\n]*)?)$)?</string>
<key>beginCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>keyword.control.import.carbon</string>
</dict>
<key>2</key>
<dict>
<key>name</key>
<string>support.class.carbon</string>
</dict>
<key>3</key>
<dict>
<key>name</key>
<string>storage.type.carbon</string>
</dict>
<key>4</key>
<dict>
<key>name</key>
<string>storage.type.carbon</string>
</dict>
<key>5</key>
<dict>
<key>name</key>
<string>support.class.carbon</string>
</dict>
<key>6</key>
<dict>
<key>name</key>
<string>punctuation.definition.string.begin.carbon</string>
</dict>
<key>7</key>
<dict>
<key>name</key>
<string>entity.name.tag.language.carbon</string>
</dict>
<key>8</key>
<dict>
<key>name</key>
<string>comment.line.double-slash.carbon</string>
</dict>
<key>9</key>
<dict>
<key>name</key>
<string>punctuation.definition.comment.carbon</string>
</dict>
</dict>
<key>comment</key>
<string>Inline C++, block form.</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>punctuation.definition.string.end.carbon</string>
</dict>
<key>2</key>
<dict>
<key>name</key>
<string>punctuation.terminator.statement.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)\s+(Cpp)\s+(inline)|(inline)\s+(Cpp))\s*(")</string>
<key>beginCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>keyword.control.import.carbon</string>
</dict>
<key>2</key>
<dict>
<key>name</key>
<string>support.class.carbon</string>
</dict>
<key>3</key>
<dict>
<key>name</key>
<string>storage.type.carbon</string>
</dict>
<key>4</key>
<dict>
<key>name</key>
<string>storage.type.carbon</string>
</dict>
<key>5</key>
<dict>
<key>name</key>
<string>support.class.carbon</string>
</dict>
<key>6</key>
<dict>
<key>name</key>
<string>punctuation.definition.string.begin.carbon</string>
</dict>
</dict>
<key>comment</key>
<string>Inline C++, single-line form.</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>punctuation.definition.string.end.carbon</string>
</dict>
<key>2</key>
<dict>
<key>name</key>
<string>punctuation.terminator.statement.carbon</string>
</dict>
</dict>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>source.cpp</string>
</dict>
</array>
</dict>
</array>
</dict>
<key>declarations</key>
<dict>
<key>patterns</key>
<array>
<dict>
<key>begin</key>
<string>(?&lt;=\bfn)\s+(?=(?:r#)?[A-Za-z_])</string>
<key>comment</key>
<string>The name a function declaration declares, after any qualifiers, or the `destroy` keyword.</string>
<key>end</key>
<string>(?:(destroy)|((?:r#)?[A-Za-z_][A-Za-z0-9_]*))\b(?!\s*(?:\[[^\[\]]*\]\s*)?(?:\([^()]*(?:\([^()]*(?:\([^()]*\)[^()]*)*\)[^()]*)*\)\s*)?\.)|(?=[^\sA-Za-z_])|$</string>
<key>endCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>keyword.other.carbon</string>
</dict>
<key>2</key>
<dict>
<key>name</key>
<string>entity.name.function.definition.carbon</string>
</dict>
</dict>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#declared-name-qualifier</string>
</dict>
</array>
</dict>
<dict>
<key>begin</key>
<string>(?&lt;=\bclass)\s+(?=(?:r#)?[A-Za-z_])</string>
<key>comment</key>
<string>The name a class declaration declares, given `entity.name.type.class` for themes that color classes apart from other types.</string>
<key>end</key>
<string>((?:r#)?[A-Za-z_][A-Za-z0-9_]*)\b(?!\s*(?:\[[^\[\]]*\]\s*)?(?:\([^()]*(?:\([^()]*(?:\([^()]*\)[^()]*)*\)[^()]*)*\)\s*)?\.)|(?=[^\sA-Za-z_])|$</string>
<key>endCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>entity.name.type.class.carbon</string>
</dict>
</dict>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#declared-name-qualifier</string>
</dict>
</array>
</dict>
<dict>
<key>begin</key>
<string>(?:(?&lt;=\balias)|(?&lt;=\bconstraint)|(?&lt;=\binterface))\s+(?=(?:r#)?[A-Za-z_])</string>
<key>comment</key>
<string>The name the other nominal type declarations declare.</string>
<key>end</key>
<string>((?:r#)?[A-Za-z_][A-Za-z0-9_]*)\b(?!\s*(?:\[[^\[\]]*\]\s*)?(?:\([^()]*(?:\([^()]*(?:\([^()]*\)[^()]*)*\)[^()]*)*\)\s*)?\.)|(?=[^\sA-Za-z_])|$</string>
<key>endCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>entity.name.type.carbon</string>
</dict>
</dict>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#declared-name-qualifier</string>
</dict>
</array>
</dict>
<dict>
<key>captures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>storage.type.carbon</string>
</dict>
<key>2</key>
<dict>
<key>name</key>
<string>storage.modifier.carbon</string>
</dict>
<key>3</key>
<dict>
<key>name</key>
<string>punctuation.definition.raw-identifier.carbon</string>
</dict>
<key>4</key>
<dict>
<key>name</key>
<string>variable.other.constant.carbon</string>
</dict>
</dict>
<key>comment</key>
<string>`let` and `var` bindings, with optional modifiers before the name. `_` and `self` are left to `#literals`.</string>
<key>match</key>
<string>\b(let)\s+((?:(?:generic|ref|template|unused|var)\s+)*)(?!_\s*:)(r#)?([A-Za-z_][A-Za-z0-9_]*)(?=\s*:(?![=!?]))</string>
</dict>
<dict>
<key>captures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>storage.type.carbon</string>
</dict>
<key>2</key>
<dict>
<key>name</key>
<string>storage.modifier.carbon</string>
</dict>
<key>3</key>
<dict>
<key>name</key>
<string>punctuation.definition.raw-identifier.carbon</string>
</dict>
<key>4</key>
<dict>
<key>name</key>
<string>variable.other.carbon</string>
</dict>
</dict>
<key>match</key>
<string>\b(var)\s+((?:(?:generic|ref|template|unused)\s+)*)(?!(?:_|self)\s*:)(r#)?([A-Za-z_][A-Za-z0-9_]*)(?=\s*:(?![=!?]))</string>
</dict>
<dict>
<key>captures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>keyword.control.import.carbon</string>
</dict>
<key>2</key>
<dict>
<key>name</key>
<string>entity.name.namespace.carbon</string>
</dict>
</dict>
<key>comment</key>
<string>Package, namespace, and import names, excluding keywords (`library`, `inline`) and `Core` and `Cpp`.</string>
<key>match</key>
<string>\b(import)\s+(?!(?:library|inline|Core|Cpp)\b)((?:r#)?[A-Za-z_][A-Za-z0-9_]*)</string>
</dict>
<dict>
<key>captures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>storage.type.carbon</string>
</dict>
<key>2</key>
<dict>
<key>name</key>
<string>entity.name.namespace.carbon</string>
</dict>
</dict>
<key>match</key>
<string>\b(package|namespace)\s+(?!(?:library|Core|Cpp)\b)((?:r#)?[A-Za-z_][A-Za-z0-9_]*)</string>
</dict>
<dict>
<key>captures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>storage.type.carbon</string>
</dict>
<key>2</key>
<dict>
<key>name</key>
<string>string.quoted.double.carbon</string>
</dict>
<key>3</key>
<dict>
<key>name</key>
<string>punctuation.definition.string.begin.carbon</string>
</dict>
<key>4</key>
<dict>
<key>name</key>
<string>entity.name.namespace.library.carbon</string>
</dict>
<key>5</key>
<dict>
<key>name</key>
<string>punctuation.definition.string.end.carbon</string>
</dict>
</dict>
<key>comment</key>
<string>A library name, written as a string, with `entity.name.namespace.library` nested inside the string scope.</string>
<key>match</key>
<string>\b(library)\s+((")((?:\\.|[^"\\\n])*)("))</string>
</dict>
</array>
</dict>
<key>declared-name-qualifier</key>
<dict>
<key>patterns</key>
<array>
<dict>
<key>begin</key>
<string>(((?:r#)?[A-Za-z_][A-Za-z0-9_]*))\b(?=\s*(?:\[[^\[\]]*\]\s*)?(?:\([^()]*(?:\([^()]*(?:\([^()]*\)[^()]*)*\)[^()]*)*\)\s*)?\.)</string>
<key>beginCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>entity.name.type.carbon</string>
</dict>
<key>2</key>
<dict>
<key>name</key>
<string>entity.name.scope-resolution.carbon</string>
</dict>
</dict>
<key>comment</key>
<string>One qualifier on a declared name, such as `N.` or `Base(T: type).`, matched when followed by `.` after any parameter lists. `entity.name.scope-resolution` is nested inside `entity.name.type` so themes without a scope-resolution rule fall back to the type color.</string>
<key>end</key>
<string>(\.)</string>
<key>endCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>punctuation.separator.dot-access.carbon</string>
</dict>
</dict>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#type-body</string>
</dict>
</array>
</dict>
</array>
</dict>
<key>expression-parens</key>
<dict>
<key>patterns</key>
<array>
<dict>
<key>begin</key>
<string>\(</string>
<key>beginCaptures</key>
<dict>
<key>0</key>
<dict>
<key>name</key>
<string>punctuation.section.parens.begin.bracket.round.carbon</string>
</dict>
</dict>
<key>comment</key>
<string>Parentheses nested in an expression that sits inside a type, so that only the matching `)` ends the expression.</string>
<key>end</key>
<string>(\))|$</string>
<key>endCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>punctuation.section.parens.end.bracket.round.carbon</string>
</dict>
</dict>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#expression-parens</string>
</dict>
<dict>
<key>include</key>
<string>$self</string>
</dict>
</array>
</dict>
</array>
</dict>
<key>identifiers</key>
<dict>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#bindings</string>
</dict>
<dict>
<key>captures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>punctuation.definition.raw-identifier.carbon</string>
</dict>
</dict>
<key>comment</key>
<string>Raw identifiers.</string>
<key>match</key>
<string>\b(r#)([A-Za-z_][A-Za-z0-9_]*)</string>
<key>name</key>
<string>variable.other.carbon</string>
</dict>
<dict>
<key>comment</key>
<string>Member function call.</string>
<key>match</key>
<string>(?:(?&lt;=\.)|(?&lt;=\-&gt;))[A-Za-z_][A-Za-z0-9_]*(?=\s*\()</string>
<key>name</key>
<string>entity.name.function.member.carbon</string>
</dict>
<dict>
<key>comment</key>
<string>Member access via `.` or `-&gt;`.</string>
<key>match</key>
<string>(?:(?&lt;=\.)|(?&lt;=\-&gt;))[A-Za-z_][A-Za-z0-9_]*\b</string>
<key>name</key>
<string>variable.other.property.carbon</string>
</dict>
<dict>
<key>comment</key>
<string>Function call.</string>
<key>match</key>
<string>\b[A-Za-z_][A-Za-z0-9_]*(?=\s*\()</string>
<key>name</key>
<string>entity.name.function.call.carbon</string>
</dict>
<dict>
<key>match</key>
<string>\b[A-Za-z_][A-Za-z0-9_]*\b</string>
<key>name</key>
<string>variable.other.carbon</string>
</dict>
</array>
</dict>
<key>impls-clause</key>
<dict>
<key>patterns</key>
<array>
<dict>
<key>begin</key>
<string>\b(impls)\b</string>
<key>beginCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>keyword.operator.expression.impls.carbon</string>
</dict>
</dict>
<key>end</key>
<string>(?=[,;={}\)\]]|[-+/%!&lt;&gt;|^~?@\\]|//|\b(?:in|and|or|not|as|impls)\b|$)</string>
<key>name</key>
<string>meta.inheritance-clause.carbon</string>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#inheritance-body</string>
</dict>
</array>
</dict>
</array>
</dict>
<key>inheritance</key>
<dict>
<key>patterns</key>
<array>
<dict>
<key>begin</key>
<string>\b(impl)\b(?!\s*(?:adapt|alias|base|choice|class|constraint|export|fn|impl|import|interface|let|library|match_first|namespace|observe|package|require|var)\b)</string>
<key>beginCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>storage.type.carbon</string>
</dict>
</dict>
<key>comment</key>
<string>An `impl` declaration (when `impl` does not precede another declaration keyword), scoping the type before `as` with `#type-body` and the interface after `as` with `#inheritance-body`.</string>
<key>end</key>
<string>(?=[;{]|$)</string>
<key>name</key>
<string>meta.type.annotation.carbon</string>
<key>patterns</key>
<array>
<dict>
<key>begin</key>
<string>\b(as)\b</string>
<key>beginCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>keyword.operator.expression.as.carbon</string>
</dict>
</dict>
<key>end</key>
<string>(?=[,;={}\)\]]|[-+/%!&lt;&gt;|^~?@\\]|//|\b(?:in|and|or|not|as|impls)\b|$)</string>
<key>name</key>
<string>meta.inheritance-clause.carbon</string>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#inheritance-body</string>
</dict>
</array>
</dict>
<dict>
<key>include</key>
<string>#type-body</string>
</dict>
</array>
</dict>
<dict>
<key>begin</key>
<string>(?&lt;!\.)\b(base)\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>keyword.operator.type.annotation.carbon</string>
</dict>
</dict>
<key>comment</key>
<string>A `base:` declaration, excluding `.base` member access and `base class`.</string>
<key>end</key>
<string>(?=[,;={}\)\]]|[-+/%!&lt;&gt;|^~?@\\]|//|\b(?:in|and|or|not|as|impls)\b|$)</string>
<key>name</key>
<string>meta.inheritance-clause.carbon</string>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#inheritance-body</string>
</dict>
</array>
</dict>
<dict>
<key>include</key>
<string>#impls-clause</string>
</dict>
</array>
</dict>
<key>inheritance-body</key>
<dict>
<key>patterns</key>
<array>
<dict>
<key>begin</key>
<string>(?&lt;=[A-Za-z0-9_\]])\(</string>
<key>beginCaptures</key>
<dict>
<key>0</key>
<dict>
<key>name</key>
<string>punctuation.section.parens.begin.bracket.round.carbon</string>
</dict>
</dict>
<key>comment</key>
<string>Only the interface itself is scoped as `entity.other.inherited-class`; its argument list switches to expression scoping.</string>
<key>end</key>
<string>(\))|$</string>
<key>endCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>punctuation.section.parens.end.bracket.round.carbon</string>
</dict>
</dict>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#expression-parens</string>
</dict>
<dict>
<key>include</key>
<string>$self</string>
</dict>
</array>
</dict>
<dict>
<key>begin</key>
<string>\(</string>
<key>beginCaptures</key>
<dict>
<key>0</key>
<dict>
<key>name</key>
<string>punctuation.section.parens.begin.bracket.round.carbon</string>
</dict>
</dict>
<key>comment</key>
<string>Grouping parentheses around an interface name stay in `#inheritance-body`.</string>
<key>end</key>
<string>(\))|$</string>
<key>endCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>punctuation.section.parens.end.bracket.round.carbon</string>
</dict>
</dict>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#inheritance-body</string>
</dict>
</array>
</dict>
<dict>
<key>begin</key>
<string>\b(where)\b</string>
<key>beginCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>keyword.other.where.carbon</string>
</dict>
</dict>
<key>comment</key>
<string>A `where` clause switches to expression scoping and ends at a `)` or `]` it did not open.</string>
<key>end</key>
<string>(?=[;{}\)\]]|$)</string>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#expression-parens</string>
</dict>
<dict>
<key>include</key>
<string>$self</string>
</dict>
</array>
</dict>
<dict>
<key>include</key>
<string>#keywords</string>
</dict>
<dict>
<key>include</key>
<string>#literals</string>
</dict>
<dict>
<key>comment</key>
<string>The final identifier of the interface or base class name; any preceding qualifiers fall through to `#type-body`.</string>
<key>match</key>
<string>\b(?:r#)?[A-Za-z_][A-Za-z0-9_]*\b(?!\s*\.)</string>
<key>name</key>
<string>entity.other.inherited-class.carbon</string>
</dict>
<dict>
<key>include</key>
<string>#type-body</string>
</dict>
</array>
</dict>
<key>keywords</key>
<dict>
<key>patterns</key>
<array>
<dict>
<key>comment</key>
<string>`.base` member access, matched before `base` as an introducer.</string>
<key>match</key>
<string>(?&lt;=\.)\b(base)\b</string>
<key>name</key>
<string>keyword.other.base.carbon</string>
</dict>
<dict>
<key>match</key>
<string>\b(import)\b</string>
<key>name</key>
<string>keyword.control.import.carbon</string>
</dict>
<dict>
<key>match</key>
<string>\b(adapt|alias|choice|class|constraint|fn|inline|interface|let|library|match_first|namespace|observe|require|var)\b</string>
<key>name</key>
<string>storage.type.carbon</string>
</dict>
<dict>
<key>comment</key>
<string>`base` as an introducer (not `base class`).</string>
<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*(adapt|alias|base|choice|class|constraint|export|fn|impl|import|interface|let|library|match_first|namespace|observe|package|require|var)\b)</string>
<key>name</key>
<string>storage.type.carbon</string>
</dict>
<dict>
<key>comment</key>
<string>`package` as an introducer (not `package.`).</string>
<key>match</key>
<string>\b(package)\b(?!\.)</string>
<key>name</key>
<string>storage.type.carbon</string>
</dict>
<dict>
<key>match</key>
<string>\b(abstract|const|eval|extend|extern|final|generic|musteval|override|partial|private|protected|ref|runtime|static|template|unsafe|unused|val|virtual)\b</string>
<key>name</key>
<string>storage.modifier.carbon</string>
</dict>
<dict>
<key>comment</key>
<string>`default` as a modifier (not `default =&gt;`).</string>
<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(base)\b(?=\s*class\b)</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*(adapt|alias|base|choice|class|constraint|export|fn|impl|import|interface|let|library|match_first|namespace|observe|package|require|var)\b)</string>
<key>name</key>
<string>storage.modifier.carbon</string>
</dict>
<dict>
<key>match</key>
<string>\b(break|case|continue|else|for|if|match|return|returned|then|while)\b</string>
<key>name</key>
<string>keyword.control.carbon</string>
</dict>
<dict>
<key>comment</key>
<string>`default` in a `match` clause.</string>
<key>match</key>
<string>\b(default)\b(?=\s*=&gt;)</string>
<key>name</key>
<string>keyword.control.carbon</string>
</dict>
<dict>
<key>match</key>
<string>\b(and|or)\b</string>
<key>name</key>
<string>keyword.control.carbon</string>
</dict>
<dict>
<key>match</key>
<string>\b(not)\b</string>
<key>name</key>
<string>keyword.operator.expression.not.carbon</string>
</dict>
<dict>
<key>comment</key>
<string>Fallback when not matched by `#type-annotation` or `#inheritance`.</string>
<key>match</key>
<string>\b(as)\b</string>
<key>name</key>
<string>keyword.operator.expression.as.carbon</string>
</dict>
<dict>
<key>match</key>
<string>\b(impls)\b</string>
<key>name</key>
<string>keyword.operator.expression.impls.carbon</string>
</dict>
<dict>
<key>match</key>
<string>\b(in)\b</string>
<key>name</key>
<string>keyword.operator.expression.in.carbon</string>
</dict>
<dict>
<key>match</key>
<string>\b(like)\b</string>
<key>name</key>
<string>keyword.operator.expression.like.carbon</string>
</dict>
<dict>
<key>match</key>
<string>\b(typeof)\b</string>
<key>name</key>
<string>keyword.operator.expression.typeof.carbon</string>
</dict>
<dict>
<key>match</key>
<string>\b(where)\b</string>
<key>name</key>
<string>keyword.other.where.carbon</string>
</dict>
<dict>
<key>match</key>
<string>\b(destroy|each|expand|forall|form|friend)\b</string>
<key>name</key>
<string>keyword.other.carbon</string>
</dict>
</array>
</dict>
<key>literals</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>
<dict>
<key>comment</key>
<string>The wildcard pattern.</string>
<key>match</key>
<string>\b(_)\b</string>
<key>name</key>
<string>variable.language.carbon</string>
</dict>
<dict>
<key>comment</key>
<string>Built-in package names.</string>
<key>match</key>
<string>\b(Core|Cpp)\b</string>
<key>name</key>
<string>support.class.carbon</string>
</dict>
<dict>
<key>comment</key>
<string>`package` as a qualifier.</string>
<key>match</key>
<string>\b(package)\b(?=\.)</string>
<key>name</key>
<string>variable.language.carbon</string>
</dict>
<dict>
<key>match</key>
<string>\b(true|false)\b</string>
<key>name</key>
<string>constant.language.carbon</string>
</dict>
<dict>
<key>match</key>
<string>\b(array|auto|type)\b</string>
<key>name</key>
<string>support.type.builtin.carbon</string>
</dict>
<dict>
<key>match</key>
<string>\b(bool|char|str)\b</string>
<key>name</key>
<string>support.type.primitive.carbon</string>
</dict>
<dict>
<key>comment</key>
<string>Integer and floating-point type literals.</string>
<key>match</key>
<string>\b[iuf][1-9][0-9]*\b</string>
<key>name</key>
<string>support.type.primitive.carbon</string>
</dict>
</array>
</dict>
<key>numbers</key>
<dict>
<key>patterns</key>
<array>
<dict>
<key>captures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>keyword.other.unit.hexadecimal.carbon</string>
</dict>
</dict>
<key>comment</key>
<string>Each numeric rule matches a full alphanumeric word starting with a digit so a malformed suffix is not split into an identifier. Real literals exclude a leading `.` or `-&gt;` so tuple access like `t.0.1` is not matched as a real.</string>
<key>match</key>
<string>(?&lt;!\.)(?&lt;!-&gt;)\b(0x)[_0-9A-Za-z]*\.[0-9A-Za-z][_0-9A-Za-z]*(?:(?&lt;=[a-z])[-+][0-9A-Za-z][_0-9A-Za-z]*)?</string>
<key>name</key>
<string>constant.numeric.hex.carbon</string>
</dict>
<dict>
<key>captures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>keyword.other.unit.hexadecimal.carbon</string>
</dict>
</dict>
<key>match</key>
<string>\b(0x)[_0-9A-Za-z]*</string>
<key>name</key>
<string>constant.numeric.hex.carbon</string>
</dict>
<dict>
<key>captures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>keyword.other.unit.octal.carbon</string>
</dict>
</dict>
<key>match</key>
<string>\b(0o)[_0-9A-Za-z]*</string>
<key>name</key>
<string>constant.numeric.octal.carbon</string>
</dict>
<dict>
<key>captures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>keyword.other.unit.binary.carbon</string>
</dict>
</dict>
<key>match</key>
<string>\b(0b)[_0-9A-Za-z]*</string>
<key>name</key>
<string>constant.numeric.binary.carbon</string>
</dict>
<dict>
<key>match</key>
<string>(?&lt;!\.)(?&lt;!-&gt;)\b[0-9][_0-9A-Za-z]*\.[0-9A-Za-z][_0-9A-Za-z]*(?:(?&lt;=[a-z])[-+][0-9A-Za-z][_0-9A-Za-z]*)?</string>
<key>name</key>
<string>constant.numeric.decimal.carbon</string>
</dict>
<dict>
<key>match</key>
<string>\b[0-9][_0-9A-Za-z]*</string>
<key>name</key>
<string>constant.numeric.decimal.carbon</string>
</dict>
<dict>
<key>comment</key>
<string>Positional parameter, as used in lambdas.</string>
<key>match</key>
<string>\$[0-9]+</string>
<key>name</key>
<string>variable.parameter.carbon</string>
</dict>
</array>
</dict>
<key>operators</key>
<dict>
<key>patterns</key>
<array>
<dict>
<key>match</key>
<string>:!</string>
<key>name</key>
<string>keyword.operator.type.annotation.symbolic.carbon</string>
</dict>
<dict>
<key>match</key>
<string>:\?</string>
<key>name</key>
<string>keyword.operator.type.annotation.form.carbon</string>
</dict>
<dict>
<key>match</key>
<string>:(?![=!?])</string>
<key>name</key>
<string>keyword.operator.type.annotation.carbon</string>
</dict>
<dict>
<key>comment</key>
<string>`-&gt;` directly after an operand is pointer member access rather than a return type arrow.</string>
<key>match</key>
<string>(?&lt;=[A-Za-z0-9_)\]}])\-&gt;(?!\?)</string>
<key>name</key>
<string>punctuation.separator.pointer-access.carbon</string>
</dict>
<dict>
<key>match</key>
<string>\-&gt;\?</string>
<key>name</key>
<string>keyword.operator.function-result.form.carbon</string>
</dict>
<dict>
<key>match</key>
<string>\-&gt;(?!\?)</string>
<key>name</key>
<string>keyword.operator.function-result.carbon</string>
</dict>
<dict>
<key>match</key>
<string>=&gt;</string>
<key>name</key>
<string>keyword.operator.arrow.fat.carbon</string>
</dict>
<dict>
<key>match</key>
<string>&lt;=&gt;|&lt;&lt;=|&gt;&gt;=|==|!=|&lt;=|&gt;=|&lt;&lt;|&gt;&gt;|\+\+|--|\+=|-=|\*=|/=|%=|&amp;=|\|=|\^=|~=|:=|&lt;-|&lt;&gt;|[-+*/%&amp;|^~!&lt;&gt;=@?\\]</string>
<key>name</key>
<string>keyword.operator.carbon</string>
</dict>
</array>
</dict>
<key>punctuation</key>
<dict>
<key>patterns</key>
<array>
<dict>
<key>match</key>
<string>\(</string>
<key>name</key>
<string>punctuation.section.parens.begin.bracket.round.carbon</string>
</dict>
<dict>
<key>match</key>
<string>\)</string>
<key>name</key>
<string>punctuation.section.parens.end.bracket.round.carbon</string>
</dict>
<dict>
<key>match</key>
<string>\{</string>
<key>name</key>
<string>punctuation.section.block.begin.bracket.curly.carbon</string>
</dict>
<dict>
<key>match</key>
<string>\}</string>
<key>name</key>
<string>punctuation.section.block.end.bracket.curly.carbon</string>
</dict>
<dict>
<key>match</key>
<string>\[</string>
<key>name</key>
<string>punctuation.section.brackets.begin.bracket.square.carbon</string>
</dict>
<dict>
<key>match</key>
<string>\]</string>
<key>name</key>
<string>punctuation.section.brackets.end.bracket.square.carbon</string>
</dict>
<dict>
<key>match</key>
<string>\.</string>
<key>name</key>
<string>punctuation.separator.dot-access.carbon</string>
</dict>
<dict>
<key>match</key>
<string>,</string>
<key>name</key>
<string>punctuation.separator.comma.carbon</string>
</dict>
<dict>
<key>match</key>
<string>;</string>
<key>name</key>
<string>punctuation.terminator.statement.carbon</string>
</dict>
</array>
</dict>
<key>string-escapes</key>
<dict>
<key>patterns</key>
<array>
<dict>
<key>match</key>
<string>\\(?:[tnr0'\"\\]|x[0-9A-F]{2}|u\{[0-9A-F]+\})</string>
<key>name</key>
<string>constant.character.escape.carbon</string>
</dict>
</array>
</dict>
<key>string-escapes-1</key>
<dict>
<key>patterns</key>
<array>
<dict>
<key>match</key>
<string>\\#(?:[tnr0'\"\\]|x[0-9A-F]{2}|u\{[0-9A-F]+\})</string>
<key>name</key>
<string>constant.character.escape.carbon</string>
</dict>
</array>
</dict>
<key>string-escapes-2</key>
<dict>
<key>patterns</key>
<array>
<dict>
<key>match</key>
<string>\\##(?:[tnr0'\"\\]|x[0-9A-F]{2}|u\{[0-9A-F]+\})</string>
<key>name</key>
<string>constant.character.escape.carbon</string>
</dict>
</array>
</dict>
<key>string-escapes-raw</key>
<dict>
<key>patterns</key>
<array>
<dict>
<key>match</key>
<string>\\#{3,}(?:[tnr0'\"\\]|x[0-9A-F]{2}|u\{[0-9A-F]+\})</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>(#{3,})(''')([^\s'\"#]*)(?:[ \t]*((//)(?:[ \t][^\n]*)?)$)?</string>
<key>beginCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>punctuation.definition.string.begin.carbon</string>
</dict>
<key>2</key>
<dict>
<key>name</key>
<string>punctuation.definition.string.begin.carbon</string>
</dict>
<key>3</key>
<dict>
<key>name</key>
<string>entity.name.tag.language.carbon</string>
</dict>
<key>4</key>
<dict>
<key>name</key>
<string>comment.line.double-slash.carbon</string>
</dict>
<key>5</key>
<dict>
<key>name</key>
<string>punctuation.definition.comment.carbon</string>
</dict>
</dict>
<key>comment</key>
<string>Block string literal, with an optional file type indicator, raw at `###` level.</string>
<key>end</key>
<string>(''')\1</string>
<key>endCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>punctuation.definition.string.end.carbon</string>
</dict>
</dict>
<key>name</key>
<string>string.quoted.triple.carbon</string>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#string-escapes-raw</string>
</dict>
</array>
</dict>
<dict>
<key>begin</key>
<string>(##)(''')([^\s'\"#]*)(?:[ \t]*((//)(?:[ \t][^\n]*)?)$)?</string>
<key>beginCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>punctuation.definition.string.begin.carbon</string>
</dict>
<key>2</key>
<dict>
<key>name</key>
<string>punctuation.definition.string.begin.carbon</string>
</dict>
<key>3</key>
<dict>
<key>name</key>
<string>entity.name.tag.language.carbon</string>
</dict>
<key>4</key>
<dict>
<key>name</key>
<string>comment.line.double-slash.carbon</string>
</dict>
<key>5</key>
<dict>
<key>name</key>
<string>punctuation.definition.comment.carbon</string>
</dict>
</dict>
<key>comment</key>
<string>Block string literal, with an optional file type indicator, raw at `##` level.</string>
<key>end</key>
<string>('''##)</string>
<key>endCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>punctuation.definition.string.end.carbon</string>
</dict>
</dict>
<key>name</key>
<string>string.quoted.triple.carbon</string>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#string-escapes-2</string>
</dict>
</array>
</dict>
<dict>
<key>begin</key>
<string>(#)(''')([^\s'\"#]*)(?:[ \t]*((//)(?:[ \t][^\n]*)?)$)?</string>
<key>beginCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>punctuation.definition.string.begin.carbon</string>
</dict>
<key>2</key>
<dict>
<key>name</key>
<string>punctuation.definition.string.begin.carbon</string>
</dict>
<key>3</key>
<dict>
<key>name</key>
<string>entity.name.tag.language.carbon</string>
</dict>
<key>4</key>
<dict>
<key>name</key>
<string>comment.line.double-slash.carbon</string>
</dict>
<key>5</key>
<dict>
<key>name</key>
<string>punctuation.definition.comment.carbon</string>
</dict>
</dict>
<key>comment</key>
<string>Block string literal, with an optional file type indicator, raw at `#` level.</string>
<key>end</key>
<string>('''#)</string>
<key>endCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>punctuation.definition.string.end.carbon</string>
</dict>
</dict>
<key>name</key>
<string>string.quoted.triple.carbon</string>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#string-escapes-1</string>
</dict>
</array>
</dict>
<dict>
<key>begin</key>
<string>(''')([^\s'\"#]*)(?:[ \t]*((//)(?:[ \t][^\n]*)?)$)?</string>
<key>beginCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>punctuation.definition.string.begin.carbon</string>
</dict>
<key>2</key>
<dict>
<key>name</key>
<string>entity.name.tag.language.carbon</string>
</dict>
<key>3</key>
<dict>
<key>name</key>
<string>comment.line.double-slash.carbon</string>
</dict>
<key>4</key>
<dict>
<key>name</key>
<string>punctuation.definition.comment.carbon</string>
</dict>
</dict>
<key>comment</key>
<string>Block string literal, with an optional file type indicator.</string>
<key>end</key>
<string>(''')</string>
<key>endCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>punctuation.definition.string.end.carbon</string>
</dict>
</dict>
<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>(""")([^\s'\"#]*)(?:[ \t]*((//)(?:[ \t][^\n]*)?)$)?</string>
<key>beginCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>punctuation.definition.string.begin.carbon</string>
</dict>
<key>2</key>
<dict>
<key>name</key>
<string>entity.name.tag.language.carbon</string>
</dict>
<key>3</key>
<dict>
<key>name</key>
<string>comment.line.double-slash.carbon</string>
</dict>
<key>4</key>
<dict>
<key>name</key>
<string>punctuation.definition.comment.carbon</string>
</dict>
</dict>
<key>comment</key>
<string>A `"""` block is always an error, but highlighting it as a block string keeps the rest of the file readable.</string>
<key>end</key>
<string>(""")</string>
<key>endCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>punctuation.definition.string.end.carbon</string>
</dict>
</dict>
<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>(#{3,})(")</string>
<key>beginCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>punctuation.definition.string.begin.carbon</string>
</dict>
<key>2</key>
<dict>
<key>name</key>
<string>punctuation.definition.string.begin.carbon</string>
</dict>
</dict>
<key>comment</key>
<string>Single-line string literal, raw at `###` level.</string>
<key>end</key>
<string>(")\1|$</string>
<key>endCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>punctuation.definition.string.end.carbon</string>
</dict>
</dict>
<key>name</key>
<string>string.quoted.double.carbon</string>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#string-escapes-raw</string>
</dict>
</array>
</dict>
<dict>
<key>begin</key>
<string>(##)(")</string>
<key>beginCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>punctuation.definition.string.begin.carbon</string>
</dict>
<key>2</key>
<dict>
<key>name</key>
<string>punctuation.definition.string.begin.carbon</string>
</dict>
</dict>
<key>comment</key>
<string>Single-line string literal, raw at `##` level.</string>
<key>end</key>
<string>("##)|$</string>
<key>endCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>punctuation.definition.string.end.carbon</string>
</dict>
</dict>
<key>name</key>
<string>string.quoted.double.carbon</string>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#string-escapes-2</string>
</dict>
</array>
</dict>
<dict>
<key>begin</key>
<string>(#)(")</string>
<key>beginCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>punctuation.definition.string.begin.carbon</string>
</dict>
<key>2</key>
<dict>
<key>name</key>
<string>punctuation.definition.string.begin.carbon</string>
</dict>
</dict>
<key>comment</key>
<string>Single-line string literal, raw at `#` level.</string>
<key>end</key>
<string>("#)|$</string>
<key>endCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>punctuation.definition.string.end.carbon</string>
</dict>
</dict>
<key>name</key>
<string>string.quoted.double.carbon</string>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#string-escapes-1</string>
</dict>
</array>
</dict>
<dict>
<key>begin</key>
<string>(")</string>
<key>beginCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>punctuation.definition.string.begin.carbon</string>
</dict>
</dict>
<key>comment</key>
<string>Single-line string literal.</string>
<key>end</key>
<string>(")|$</string>
<key>endCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>punctuation.definition.string.end.carbon</string>
</dict>
</dict>
<key>name</key>
<string>string.quoted.double.carbon</string>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#string-escapes</string>
</dict>
</array>
</dict>
<dict>
<key>begin</key>
<string>(')</string>
<key>beginCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>punctuation.definition.string.begin.carbon</string>
</dict>
</dict>
<key>comment</key>
<string>Character literal.</string>
<key>end</key>
<string>(')|$</string>
<key>endCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>punctuation.definition.string.end.carbon</string>
</dict>
</dict>
<key>name</key>
<string>string.quoted.single.carbon</string>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#string-escapes</string>
</dict>
</array>
</dict>
</array>
</dict>
<key>type-annotation</key>
<dict>
<key>patterns</key>
<array>
<dict>
<key>begin</key>
<string>(:!)|(:\?)|(:(?![=!?]))|((?&lt;![A-Za-z0-9_)\]}])\-&gt;\?)|((?&lt;![A-Za-z0-9_)\]}])\-&gt;(?!\?))|\b(as)\b|\b(adapt)\b|\b(require)\b</string>
<key>beginCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>keyword.operator.type.annotation.symbolic.carbon</string>
</dict>
<key>2</key>
<dict>
<key>name</key>
<string>keyword.operator.type.annotation.form.carbon</string>
</dict>
<key>3</key>
<dict>
<key>name</key>
<string>keyword.operator.type.annotation.carbon</string>
</dict>
<key>4</key>
<dict>
<key>name</key>
<string>keyword.operator.function-result.form.carbon</string>
</dict>
<key>5</key>
<dict>
<key>name</key>
<string>keyword.operator.function-result.carbon</string>
</dict>
<key>6</key>
<dict>
<key>name</key>
<string>keyword.operator.expression.as.carbon</string>
</dict>
<key>7</key>
<dict>
<key>name</key>
<string>storage.type.carbon</string>
</dict>
<key>8</key>
<dict>
<key>name</key>
<string>storage.type.carbon</string>
</dict>
</dict>
<key>comment</key>
<string>A type expression, from the token that introduces it to the first token that cannot continue one.</string>
<key>end</key>
<string>(?=[,;={}\)\]]|[-+/%!&lt;&gt;|^~?@\\]|//|\b(?:in|and|or|not|as|impls)\b|$)</string>
<key>name</key>
<string>meta.type.annotation.carbon</string>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#type-body</string>
</dict>
</array>
</dict>
</array>
</dict>
<key>type-body</key>
<dict>
<key>patterns</key>
<array>
<dict>
<key>begin</key>
<string>\(</string>
<key>beginCaptures</key>
<dict>
<key>0</key>
<dict>
<key>name</key>
<string>punctuation.section.parens.begin.bracket.round.carbon</string>
</dict>
</dict>
<key>comment</key>
<string>Argument and grouping parentheses, which nest rather than ending the type.</string>
<key>end</key>
<string>(\))|$</string>
<key>endCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>punctuation.section.parens.end.bracket.round.carbon</string>
</dict>
</dict>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#type-body</string>
</dict>
</array>
</dict>
<dict>
<key>begin</key>
<string>\[</string>
<key>beginCaptures</key>
<dict>
<key>0</key>
<dict>
<key>name</key>
<string>punctuation.section.brackets.begin.bracket.square.carbon</string>
</dict>
</dict>
<key>end</key>
<string>(\])|$</string>
<key>endCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>punctuation.section.brackets.end.bracket.square.carbon</string>
</dict>
</dict>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#type-body</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.other.where.carbon</string>
</dict>
</dict>
<key>comment</key>
<string>A `where` clause switches to expression scoping so `=` does not end the enclosing type as an initializer, and ends at a `)` or `]` it did not open.</string>
<key>end</key>
<string>(?=[;{}\)\]]|$)</string>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#expression-parens</string>
</dict>
<dict>
<key>include</key>
<string>$self</string>
</dict>
</array>
</dict>
<dict>
<key>include</key>
<string>#impls-clause</string>
</dict>
<dict>
<key>include</key>
<string>#comments</string>
</dict>
<dict>
<key>include</key>
<string>#strings</string>
</dict>
<dict>
<key>begin</key>
<string>\b(typeof)\s*(\()</string>
<key>beginCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>keyword.operator.expression.typeof.carbon</string>
</dict>
<key>2</key>
<dict>
<key>name</key>
<string>punctuation.section.parens.begin.bracket.round.carbon</string>
</dict>
</dict>
<key>comment</key>
<string>`typeof` takes an expression operand, switching out of `#type-body`.</string>
<key>end</key>
<string>(\))|$</string>
<key>endCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>punctuation.section.parens.end.bracket.round.carbon</string>
</dict>
</dict>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#expression-parens</string>
</dict>
<dict>
<key>include</key>
<string>$self</string>
</dict>
</array>
</dict>
<dict>
<key>include</key>
<string>#keywords</string>
</dict>
<dict>
<key>include</key>
<string>#literals</string>
</dict>
<dict>
<key>include</key>
<string>#numbers</string>
</dict>
<dict>
<key>comment</key>
<string>Pointer `*`, written directly after the pointee type.</string>
<key>match</key>
<string>(?&lt;=[A-Za-z0-9_)\]*])\*(?!=)</string>
<key>name</key>
<string>keyword.operator.type.pointer.carbon</string>
</dict>
<dict>
<key>include</key>
<string>#operators</string>
</dict>
<dict>
<key>include</key>
<string>#bindings</string>
</dict>
<dict>
<key>captures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>entity.name.scope-resolution.carbon</string>
</dict>
</dict>
<key>comment</key>
<string>A qualifier in a type, which `#declared-name-qualifier` scopes the same way on a declared name.</string>
<key>match</key>
<string>(?:(?&lt;=[A-Za-z0-9_)\]]\.)|(?&lt;!\.))\b((?:r#)?[A-Za-z_][A-Za-z0-9_]*)\b(?=\s*(?:\[[^\[\]]*\]\s*)?(?:\([^()]*(?:\([^()]*(?:\([^()]*\)[^()]*)*\)[^()]*)*\)\s*)?\.)</string>
<key>name</key>
<string>entity.name.type.carbon</string>
</dict>
<dict>
<key>captures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>punctuation.definition.raw-identifier.carbon</string>
</dict>
</dict>
<key>comment</key>
<string>Unqualified names and qualified member names in a type context. A `.` with no preceding qualifier (such as a struct field `.x`) is left to `#identifiers`.</string>
<key>match</key>
<string>(?:(?&lt;=[A-Za-z0-9_)\]]\.)|(?&lt;!\.))\b(r#)?[A-Za-z_][A-Za-z0-9_]*\b</string>
<key>name</key>
<string>entity.name.type.carbon</string>
</dict>
<dict>
<key>include</key>
<string>#identifiers</string>
</dict>
<dict>
<key>include</key>
<string>#punctuation</string>
</dict>
</array>
</dict>
</dict>
<key>scopeName</key>
<string>source.carbon</string>
<key>uuid</key>
<string>4568a54d-9a79-41ac-a36b-05916252763b</string>
</dict>
</plist>