Add high-precedence macro token to prevent @for matching in @format!

This commit is contained in:
Michael Netshipise 2026-01-19 22:40:55 +02:00
parent eeb333acbd
commit ce7162699f
3 changed files with 40 additions and 32 deletions

View File

@ -211,7 +211,12 @@ module.exports = grammar({
template_expression: ($) =>
choice($.simple_expression, $.complex_expression, $.safe_expression),
simple_expression: ($) => seq("@", $.expression_path),
// High-precedence token to match @identifier before @for/@if etc keywords
simple_expression: ($) =>
choice(
token(prec(2, /@[a-zA-Z_][a-zA-Z0-9_]*!/)), // Macro calls: @format!
seq("@", $.expression_path), // Regular expressions: @foo.bar
),
complex_expression: ($) => seq("@", "(", $.expression, ")"),

View File

@ -8,32 +8,19 @@
(raw_block) @string.special
; Keywords - only in proper syntactic contexts
(use_statement "@" @keyword)
(use_statement "use" @keyword)
(import_statement "@" @keyword)
(import_statement "import" @keyword)
(struct_definition "@" @keyword)
(struct_definition "struct" @keyword)
(enum_definition "@" @keyword)
(enum_definition "enum" @keyword)
(function_definition "@" @keyword)
(function_definition "fn" @keyword)
(let_statement "@" @keyword)
(let_statement "let" @keyword)
(if_statement "@" @keyword)
(if_statement "if" @keyword)
(for_loop "@" @keyword)
(for_loop "for" @keyword)
(match_statement "@" @keyword)
(match_statement "match" @keyword)
(break_statement "@" @keyword)
(break_statement "break" @keyword)
(continue_statement "@" @keyword)
(continue_statement "continue" @keyword)
(attribute_if_statement "@" @keyword)
(attribute_if_statement "if" @keyword)
(attribute_for_loop "@" @keyword)
(attribute_for_loop "for" @keyword)
(use_statement "@use" @keyword)
(import_statement "@import" @keyword)
(struct_definition "@struct" @keyword)
(enum_definition "@enum" @keyword)
(function_definition "@fn" @keyword)
(let_statement "@let" @keyword)
(if_statement "@if" @keyword)
(for_loop "@for" @keyword)
(match_statement "@match" @keyword)
(break_statement "@break" @keyword)
(continue_statement "@continue" @keyword)
(attribute_if_statement "@if" @keyword)
(attribute_for_loop "@for" @keyword)
(else_if_branch "else" @keyword)
(else_if_branch "if" @keyword)
(else_branch "else" @keyword)

View File

@ -1023,6 +1023,20 @@
]
},
"simple_expression": {
"type": "CHOICE",
"members": [
{
"type": "TOKEN",
"content": {
"type": "PREC",
"value": 2,
"content": {
"type": "PATTERN",
"value": "@[a-zA-Z_][a-zA-Z0-9_]*!"
}
}
},
{
"type": "SEQ",
"members": [
{
@ -1034,6 +1048,8 @@
"name": "expression_path"
}
]
}
]
},
"complex_expression": {
"type": "SEQ",