; Identifier naming conventions

(
  (identifier) @constant 
  (#match? @constant "^[A-Z][A-Z\\d_]+$"))

; class
(class_name_statement (name) @type)
(class_definition (name) @type)


; Function calls

(attribute_call (identifier) @function)
(base_call (identifier) @function)
(call (identifier) @function)

; Function definitions

(function_definition 
  name: (name) @function
  parameters: (parameters) @variable.parameter )
(constructor_definition "_init" @function)
(lambda (parameters) @variable.parameter)


;; Literals
(comment) @comment
(string) @string

(type) @type
(expression_statement (array (identifier) @type))
(binary_operator (identifier) @type)
(enum_definition (name) @type.enum)
(enumerator (identifier) @type.enum.variant)
[
  (null)
  (underscore)
] @type.builtin


(variable_statement (identifier) @variable)
(attribute 
  (identifier) 
  (identifier) @variable.other.member)
(attribute 
  (identifier) @type.builtin
  (#match? @type.builtin "^(AABB|Array|Basis|bool|Callable|Color|Dictionary|float|int|NodePath|Object|Packed(Byte|Color|String)Array|PackedFloat(32|64)Array|PackedInt(32|64)Array|PackedVector(2|3)Array|Plane|Projection|Quaternion|Rect2([i]{0,1})|RID|Signal|String|StringName|Transform(2|3)D|Variant|Vector(2|3|4)([i]{0,1}))$"))

[
  (string_name)
  (node_path)
  (get_node)
] @label
(signal_statement (name) @label)

(const_statement (name) @constant)
(integer) @constant.numeric.integer
(float) @constant.numeric.float
(escape_sequence) @constant.character.escape
[
  (true)
  (false)
] @constant.builtin.boolean

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

(annotation (identifier) @keyword.storage.modifier)

[
  "if"
  "else"
  "elif"
  "match"
] @keyword.control.conditional

[
  "while"
  "for"
] @keyword.control.repeat

[
  "return"
  "pass"
  "break"
  "continue"
] @keyword.control.return

[
  "func"
] @keyword.control.function

[
  "export"
] @keyword.control.import

[
  "in"
  "is"
  "as"
  "and"
  "or"
  "not"
] @keyword.operator

[
  "var"
  "class"
  "class_name"
  "enum"
] @keyword.storage.type


[
  (remote_keyword)
  (static_keyword)
  "const"
  "signal"
  "@"
] @keyword.storage.modifier

[
  "setget"
  "onready"
  "extends"
  "set"
  "get"
  "await"
] @keyword