;; Text

;; Imports

(missing_import) @include

(local_import) @string.special.path

(http_import) @string @text.uri

[
  (env_variable)
  (import_hash)
] @string.special

[ (import_as_location) (import_as_text) ] @type

;; Types

([
  (let_binding (label) @type)
  (union_type_entry (label) @type)
] (#lua-match? @type "^%u"))

((primitive_expression
  (identifier (label) @type)
  (selector (label) @type)) @variable
  (#lua-match? @variable "^[A-Z][^.]*$"))

;; Parameters

(lambda_expression label: (label) @parameter)

;; Variables

(label) @variable

(identifier [
  (label) @variable
  (de_bruijn_index) @operator
])

(let_binding label: (label) @variable)

; Fields

(record_literal_entry (label) @field)

(record_type_entry (label) @field)

(selector
  (selector_dot)
  (_) @field)

;; Keywords

(env_import) @keyword

[
  "let"
  "in"
  "assert"
] @keyword

[
  "using"
  "as"
  "with"
] @keyword.operator

;; Operators

[
  (type_operator)
  (assign_operator)
  (lambda_operator)
  (arrow_operator)
  (infix_operator)
  (completion_operator)
  (assert_operator)
  (forall_operator)
  (empty_record_literal)
] @operator

;; Builtins

(builtin_function) @function.builtin
(builtin [
  "Natural"
  "Natural/build"
  "Natural/fold"
  "Natural/isZero"
  "Natural/even"
  "Natural/odd"
  "Natural/subtract"
  "Natural/toInteger"
  "Natural/show"
  "Integer"
  "Integer/toDouble"
  "Integer/show"
  "Integer/negate"
  "Integer/clamp"
  "Double"
  "Double/show"
  "List"
  "List/build"
  "List/fold"
  "List/length"
  "List/head"
  "List/last"
  "List/indexed"
  "List/reverse"
  "Text"
  "Text/show"
  "Text/replace"
  "Optional"
  "Date"
  "Time"
  "TimeZone"
  "Type"
  "Kind"
  "Sort"
] @type.builtin)

;; Punctuation

[ "," "|" ] @punctuation.delimiter
(selector_dot) @punctuation.delimiter

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

[ "[" "]" ] @punctuation.bracket

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

[ "<" ">" ] @punctuation.bracket

;; Conditionals

[
  "if"
  "then"
  "else"
] @conditional

;; Literals

(text_literal) @string
(interpolation "}" @string)
[
  (double_quote_escaped)
  (single_quote_escaped)
] @string.escape

[
  (integer_literal)
  (natural_literal)
] @number

(double_literal) @float

(boolean_literal) @boolean

(builtin "None") @constant.builtin

;; Comments

[
  (line_comment)
  (block_comment)
] @comment @spell
