; Keywords
[
  "@module"
  "@package"
] @keyword.import @nospell

[
  "@class"
  "@type"
  "@param"
  "@alias"
  "@field"
  "@generic"
  "@vararg"
  "@diagnostic"
  "@cast"
  "@deprecated"
  "@meta"
  "@source"
  "@version"
  "@operator"
  "@nodiscard"
  "@overload"
  "@enum"
  "@language"
  "@see"
  "@as"
  "extends"
  (diagnostic_identifier)
] @keyword @nospell

"@async" @keyword.coroutine @nospell

(language_injection
  "@language"
  (identifier) @keyword @nospell)

(function_type
  [
    "fun"
    "function"
  ] @keyword.function @nospell)

(source_annotation
  filename: (identifier) @string.special.path @nospell
  extension: (identifier) @string.special.path @nospell)

(version_annotation
  version: _ @constant.builtin @nospell)

"@return" @keyword.return @nospell

; Qualifiers
[
  "public"
  "protected"
  "private"
  "package"
  "@public"
  "@protected"
  "@private"
  "(exact)"
  "(key)"
] @keyword.modifier @nospell

; Variables
(identifier) @variable @nospell

[
  "..."
  "self"
] @variable.builtin @nospell

; Macros
(alias_annotation
  (identifier) @function.macro @nospell)

; Parameters
(param_annotation
  (identifier) @variable.parameter @nospell)

(parameter
  (identifier) @variable.parameter @nospell)

; Fields
(field_annotation
  (identifier) @variable.member @nospell)

(table_literal_type
  field: (identifier) @variable.member @nospell)

(member_type
  [
    "#"
    "."
  ]
  .
  (identifier) @variable.member @nospell)

(member_type
  (identifier) @module @nospell)

(member_type
  (identifier) @type @nospell .)

; Types
(table_type
  "table" @type.builtin @nospell)

(builtin_type) @type.builtin @nospell

(class_annotation
  (identifier) @type @nospell)

(enum_annotation
  (identifier) @type @nospell)

((array_type
  [
    "["
    "]"
  ] @type)
  (#set! priority 105))

(type) @type

; Operators
[
  "|"
  "+"
  "-"
] @operator

; Literals
[
  (string)
  (literal_type)
  "`"
] @string

(module_annotation
  (string) @module @nospell)

[
  (number)
  (numeric_literal_type)
] @number

; Punctuation
[
  "["
  "]"
  "[["
  "]]"
  "[=["
  "]=]"
] @punctuation.bracket

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

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

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

[
  ","
  "."
  "#"
  ":"
] @punctuation.delimiter

[
  "@"
  "?"
] @punctuation.special

; Comments
(comment) @comment @spell

(at_comment
  (identifier) @type @nospell
  (_) @comment @spell)

(class_at_comment
  (identifier) @type @nospell
  ("extends"?
    (identifier)? @type @nospell)
  (_) @comment @spell)
