mirror of
https://github.com/helix-editor/helix
synced 2026-08-04 14:27:07 +02:00
47 lines
1.4 KiB
Scheme
47 lines
1.4 KiB
Scheme
; Variable scopes, definitions and references for Nix.
|
|
;
|
|
; Nix `let` / `rec` bindings are recursive and lazily evaluated, so a reference
|
|
; can resolve to a binding that appears later in source order. tree-sitter's
|
|
; locals resolver is order-sensitive, so a forward reference simply keeps its
|
|
; base `@variable` highlight instead of the definition's class — a cosmetic
|
|
; limitation, never a miscolour.
|
|
|
|
; Scopes
|
|
|
|
[
|
|
(function_expression)
|
|
(let_expression)
|
|
(rec_attrset_expression)
|
|
] @local.scope
|
|
|
|
; Definitions
|
|
|
|
(formal
|
|
name: (identifier) @local.definition.variable.parameter)
|
|
|
|
; `@args:` binds the whole argument set.
|
|
(function_expression
|
|
universal: (identifier) @local.definition.variable.parameter)
|
|
|
|
; `let name = ...;` bindings. Dotted attrpaths aren't plain locals, so restrict
|
|
; to a single-attr path.
|
|
(let_expression
|
|
(binding_set
|
|
(binding
|
|
attrpath: (attrpath
|
|
attr: (identifier) @local.definition.variable) .)))
|
|
|
|
; References
|
|
|
|
; Only `variable_expression` names are variable references; a bare `identifier`
|
|
; elsewhere (attrpath members, binding names) is attribute access, not a local.
|
|
(variable_expression
|
|
name: (identifier) @local.reference)
|
|
|
|
; Discard: a variable in call position (`f x`) is highlighted `@function` by
|
|
; highlights.scm. Cancel its reference resolution here so locals doesn't recolour
|
|
; it as a plain variable.
|
|
(apply_expression
|
|
function: (variable_expression
|
|
name: (identifier) @_))
|