Files
flux/vscode-flux/syntaxes/flux.tmLanguage.json
Jooris Hadeler 53c66a3d03 Feat: update VSCode extension with compound assignment and shift operators
Add compound assignment operators (+=, -=, *=, /=, %=, &=, |=, ^=,
<<=, >>=) and shift operators (<<, >>) to the tmLanguage syntax
highlighting grammar. Patterns are ordered longest-first to prevent
shorter tokens from shadowing multi-character operators. Also update
fibonacci example to use += compound assignment.
2026-03-11 10:11:01 +01:00

210 lines
6.4 KiB
JSON

{
"$schema": "https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json",
"name": "Flux",
"scopeName": "source.flux",
"fileTypes": ["flux"],
"patterns": [
{ "include": "#line-comment" },
{ "include": "#block-comment" },
{ "include": "#string" },
{ "include": "#char" },
{ "include": "#number" },
{ "include": "#fn-def" },
{ "include": "#struct-def" },
{ "include": "#control-keywords" },
{ "include": "#decl-keywords" },
{ "include": "#type-keywords" },
{ "include": "#boolean-literals" },
{ "include": "#operator-keywords" },
{ "include": "#operators" },
{ "include": "#punctuation" }
],
"repository": {
"line-comment": {
"name": "comment.line.double-slash.flux",
"match": "//.*$"
},
"block-comment": {
"name": "comment.block.flux",
"begin": "/\\*",
"end": "\\*/",
"beginCaptures": { "0": { "name": "punctuation.definition.comment.begin.flux" } },
"endCaptures": { "0": { "name": "punctuation.definition.comment.end.flux" } }
},
"string": {
"name": "string.quoted.double.flux",
"begin": "\"",
"end": "\"",
"beginCaptures": { "0": { "name": "punctuation.definition.string.begin.flux" } },
"endCaptures": { "0": { "name": "punctuation.definition.string.end.flux" } },
"patterns": [ { "include": "#escape-sequence" } ]
},
"char": {
"name": "string.quoted.single.flux",
"begin": "'",
"end": "'",
"beginCaptures": { "0": { "name": "punctuation.definition.string.begin.flux" } },
"endCaptures": { "0": { "name": "punctuation.definition.string.end.flux" } },
"patterns": [ { "include": "#escape-sequence" } ]
},
"escape-sequence": {
"name": "constant.character.escape.flux",
"match": "\\\\([nrt\\\\\"'0]|u\\{[0-9a-fA-F]{1,6}\\})"
},
"number": {
"patterns": [
{
"comment": "Floating-point: 3.14, 1.0e-9, 2e4",
"name": "constant.numeric.float.flux",
"match": "\\b\\d[\\d_]*\\.\\d[\\d_]*(?:[eE][+-]?\\d[\\d_]*)?\\b|\\b\\d[\\d_]*[eE][+-]?\\d[\\d_]*\\b"
},
{
"comment": "Hexadecimal integer: 0xFF, 0xDEAD_BEEF",
"name": "constant.numeric.integer.hex.flux",
"match": "\\b0x[0-9a-fA-F][0-9a-fA-F_]*\\b"
},
{
"comment": "Octal integer: 0o77",
"name": "constant.numeric.integer.octal.flux",
"match": "\\b0o[0-7][0-7_]*\\b"
},
{
"comment": "Binary integer: 0b1010",
"name": "constant.numeric.integer.binary.flux",
"match": "\\b0b[01][01_]*\\b"
},
{
"comment": "Decimal integer: 42, 1_000_000",
"name": "constant.numeric.integer.decimal.flux",
"match": "\\b\\d[\\d_]*\\b"
}
]
},
"fn-def": {
"comment": "Highlight function name after `fn`",
"match": "\\b(fn)\\s+([a-zA-Z_][a-zA-Z0-9_]*)",
"captures": {
"1": { "name": "keyword.declaration.function.flux" },
"2": { "name": "entity.name.function.flux" }
}
},
"struct-def": {
"comment": "Highlight struct name after `struct`",
"match": "\\b(struct)\\s+([a-zA-Z_][a-zA-Z0-9_]*)",
"captures": {
"1": { "name": "keyword.declaration.type.flux" },
"2": { "name": "entity.name.type.struct.flux" }
}
},
"control-keywords": {
"name": "keyword.control.flux",
"match": "\\b(if|else|while|loop|break|continue|return)\\b"
},
"decl-keywords": {
"patterns": [
{
"name": "keyword.other.let.flux",
"match": "\\blet\\b"
},
{
"name": "storage.modifier.mut.flux",
"match": "\\bmut\\b"
}
]
},
"type-keywords": {
"patterns": [
{
"comment": "Primitive numeric types",
"name": "support.type.primitive.flux",
"match": "\\b(u8|u16|u32|u64|i8|i16|i32|i64|f32|f64)\\b"
},
{
"comment": "Other primitive types",
"name": "support.type.primitive.flux",
"match": "\\b(bool|char)\\b"
},
{
"comment": "Opaque pointer keyword",
"name": "support.type.opaque.flux",
"match": "\\bopaque\\b"
}
]
},
"boolean-literals": {
"name": "constant.language.boolean.flux",
"match": "\\b(true|false)\\b"
},
"operator-keywords": {
"name": "keyword.operator.logical.flux",
"match": "\\b(and|or)\\b"
},
"operators": {
"patterns": [
{
"comment": "Arrow (return type separator) — must precede - and -=",
"name": "keyword.operator.arrow.flux",
"match": "->"
},
{
"comment": "Compound assignment operators — must precede shift, comparison, and arithmetic",
"name": "keyword.operator.assignment.compound.flux",
"match": "<<=|>>=|\\+=|-=|\\*=|/=|%=|&=|\\|=|\\^="
},
{
"comment": "Shift operators — must precede < and >",
"name": "keyword.operator.bitwise.shift.flux",
"match": "<<|>>"
},
{
"comment": "Comparison operators",
"name": "keyword.operator.comparison.flux",
"match": "==|!=|<=|>=|<|>"
},
{
"comment": "Assignment — negative lookbehind excludes all compound-assign prefixes",
"name": "keyword.operator.assignment.flux",
"match": "(?<![=!<>+\\-*/%&|^])=(?!=)"
},
{
"comment": "Arithmetic: + - * / %",
"name": "keyword.operator.arithmetic.flux",
"match": "[+\\-*/%]"
},
{
"comment": "Bitwise and unary: & | ^ ~ !",
"name": "keyword.operator.bitwise.flux",
"match": "[&|^~!]"
}
]
},
"punctuation": {
"patterns": [
{ "name": "punctuation.terminator.statement.flux", "match": ";" },
{ "name": "punctuation.separator.comma.flux", "match": "," },
{ "name": "punctuation.accessor.dot.flux", "match": "\\." },
{ "name": "punctuation.separator.colon.flux", "match": ":" },
{ "name": "punctuation.brackets.round.flux", "match": "[()]" },
{ "name": "punctuation.brackets.square.flux", "match": "[\\[\\]]" },
{ "name": "punctuation.brackets.curly.flux", "match": "[{}]" }
]
}
}
}