; Comments and documentation markers
(line_comment) @comment
(block_comment) @comment
((line_comment) @comment.todo
  (#match? @comment.todo "(TODO|FIXME|XXX|NOTE)"))
((block_comment) @comment.todo
  (#match? @comment.todo "(TODO|FIXME|XXX|NOTE)"))

; Literals
(string_literal) @string
(c_string_literal) @string.special
(character_literal) @character
(escape_sequence) @string.escape
(integer_literal) @number
(float_literal) @number.float
(boolean_literal) @boolean
(nil_literal) @constant.builtin
(no_initializer) @constant.builtin

; Declarations
(module_declaration name: (module_path) @module)
(import_spec path: (module_path) @module)
(import_spec alias: (identifier) @module)
(type_definition name: (type_identifier) @type.definition)
(type_parameter name: (type_identifier) @type.parameter)
(captured_type name: (type_identifier) @type.parameter)
(function_name function: (identifier) @function)
(function_name method: (identifier) @function.method)
(function_name owner: (identifier) @type)
(binding_declaration name: (identifier) @variable)
(multi_binding_declaration name: (identifier) @variable)
(parameter_name name: (identifier) @variable.parameter)
(lambda_parameter_name name: (identifier) @variable.parameter)
(trait_parameter name: (identifier) @variable.parameter)
(match_expression binding: (identifier) @variable)
(pattern_binding name: (identifier) @variable)
(for_each_clause element: (identifier) @variable)
(for_each_destructure binding: (identifier) @variable)
(for_each_clause index: (identifier) @variable)

; Types and members
(type_identifier) @type
(struct_field name: (identifier) @property)
(union_field name: (identifier) @property)
(payload_field name: (identifier) @property)
(enum_member name: (identifier) @constant)
(flags_member name: (identifier) @constant)
(union_variant name: (identifier) @constructor)
(field_initializer field: (identifier) @property)
(flag_initializer member: (identifier) @constant)
(field_expression field: (identifier) @property)
(enum_literal variant: (identifier) @constructor)
(variant_pattern variant: (identifier) @constructor)

; Calls and compiler facilities
(call_expression function: (identifier) @function.call)
(call_expression
  function: (field_expression field: (identifier) @function.method.call))
(builtin_name) @function.builtin
(attribute_name) @attribute
(link_kind) @keyword
(assembly_keyword) @keyword

; Language words
[
  "let"
  "mut"
  "pub"
  "module"
  "import"
] @keyword

"$" @keyword.modifier

[
  "type"
  "alias"
  "struct"
  "union"
  "enum"
  "trait"
  "dyn"
] @keyword.type

(type_keyword) @keyword.type
(opaque_type) @keyword.type

[
  "if"
  "else"
  "when"
  "match"
] @keyword.conditional

[
  "for"
  "in"
] @keyword.repeat

[
  "return"
  "defer"
] @keyword.return

(break_statement) @keyword.return
(continue_statement) @keyword.return

"as" @keyword.operator

; Operators and punctuation
[
  "="
  "+="
  "-="
  "*="
  "/="
  "%="
  "&="
  "|="
  "^="
  "<<="
  ">>="
  "=="
  "!="
  "<"
  ">"
  "<="
  ">="
  "+"
  "-"
  "*"
  "/"
  "%"
  "&"
  "|"
  "^"
  "~"
  "!"
  "&&"
  "||"
  ".."
  "=>"
] @operator

[
  "("
  ")"
  "["
  "]"
  "{"
  "}"
] @punctuation.bracket

(type_arguments
  ["(" ")"] @punctuation.bracket
  (#set! priority 105))

[
  ","
  ";"
  ":"
  "."
] @punctuation.delimiter