; Variables

(identifier) @variable

; Includes

"include" @include

(include_statement (identifier) @type)

(include_statement (class_identifier (identifier) @type . ))

; Keywords

[
  "class"
  "inherits"
  "node"
  "type"
  "tag"
] @keyword

[
  "define"
  "function"
] @keyword.function

[
  "if"
  "elsif"
  "else"
  "unless"
  "case"
] @conditional

(default_case "default" @conditional)

; Properties

(attribute name: (identifier) @property)
(attribute name: (variable (identifier) @property))

; Parameters

(lambda (variable (identifier) @parameter))

(parameter (variable (identifier) @parameter))

(function_call (identifier) @parameter)

(method_call (identifier) @parameter)

; Functions

(function_declaration
  "function" . (identifier) @function)

(function_call
  (identifier) @function.call "(")

(defined_resource_type
  "define" . (identifier) @function)

; Methods

(function_declaration
  "function" . (class_identifier (identifier) @method . ))

(function_call
  (class_identifier (identifier) @method.call . ))

(defined_resource_type
  "define" . (class_identifier (identifier) @method . ))

(method_call
  "." . (identifier) @method.call)

; Types

(type) @type

(builtin_type) @type.builtin

(class_definition
  (identifier) @type)
(class_definition
  (class_identifier (identifier) @type . ))

(class_inherits (identifier) @type)
(class_inherits (class_identifier (identifier) @type . ))

(resource_declaration
  (identifier) @type)
(resource_declaration
  (class_identifier (identifier) @type . ))

(node_definition (node_name (identifier) @type))

((identifier) @type
  (#lua-match? @type "^[A-Z]"))

((identifier) @type.builtin
  (#any-of? @type.builtin "Boolean" "Integer" "Float" "String" "Array" "Hash" "Regexp" "Variant" "Data" "Undef" "Default" "File"))

; "Namespaces"

(class_identifier . (identifier) @namespace)

; Operators

[
  "or"
  "and"
  "in"
] @keyword.operator

[
  "="
  "+="
  "->"
  "~>"
  "<<|"
  "<|"
  "|>"
  "|>>"
  "?"
  ">"
  ">="
  "<="
  "<"
  "=="
  "!="
  "<<"
  ">>"
  "+"
  "-"
  "*"
  "/"
  "%"
  "=~"
  "!~"
] @operator

; Punctuation

[
  "|"
  "."
  ","
  ";"
  ":"
  "::"
  "=>"
] @punctuation.delimiter

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

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

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

(interpolation [ "${" "}" ] @punctuation.special)

[
  "$"
  "@"
  "@@"
] @punctuation.special

; Literals

(number) @number

(float) @float

(string) @string

(escape_sequence) @string.escape

(regex) @string.regex

(boolean) @boolean

[
  (undef)
  (default)
] @variable.builtin

; Comments

(comment) @comment @spell

; Errors

(ERROR) @error