; Preprocs

(preprocessor_directive) @preproc

; Includes

"include" @include

; Keywords

[
  "assert"
  "class"
  "multiclass"
  "field"
  "let"
  "def"
  "defm"
  "defset"
  "defvar"
] @keyword

[
  "in"
] @keyword.operator

; Conditionals

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

; Repeats

[
  "foreach"
] @repeat

; Variables

(identifier) @variable

(var) @variable.builtin 

; Parameters

(template_arg (identifier) @parameter)


; Types

(type) @type

[
  "bit"
  "int"
  "string"
  "dag"
  "bits"
  "list"
  "code"
] @type.builtin

(class name: (identifier) @type)

(multiclass name: (identifier) @type)

(def name: (value (_) @type))

(defm name: (value (_) @type))

(defset name: (identifier) @type)

(parent_class_list (identifier) @type (value (_) @type)?)

(anonymous_record (identifier) @type)

(anonymous_record (value (_) @type))

((identifier) @type
  (#lua-match? @type "^_*[A-Z][A-Z0-9_]+$"))

; Fields

(instruction
  (identifier) @field)

(let_instruction
  (identifier) @field)

; Functions

([
  (bang_operator)
  (cond_operator)
] @function
  (#set! "priority" 105))

; Operators

[
  "="
  "#"
  "-"
  ":"
  "..."
] @operator

; Literals

(string) @string

(code) @string.special

(integer) @number

(boolean) @boolean

(uninitialized_value) @constant.builtin

; Punctuation

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

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

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

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

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

[
 "!"
] @punctuation.special

; Comments

[
  (comment)
  (multiline_comment)
] @comment @spell


((comment) @preproc
  (#lua-match? @preproc "^.*RUN"))

; Errors

(ERROR) @error