;; Misc

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

((line_comment) @comment.documentation
  (#lua-match? @comment.documentation "^///[^/]"))
((line_comment) @comment.documentation
  (#lua-match? @comment.documentation "^///$"))

((block_comment) @comment.documentation
  (#lua-match? @comment.documentation "^/[*][*][^*].*[*]/$"))

((nesting_block_comment) @comment.documentation
  (#lua-match? @comment.documentation "^/[+][+][^+].*[+]/$"))

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

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

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

;; Constants

[
  "__FILE_FULL_PATH__"
  "__FILE__"
  "__FUNCTION__"
  "__LINE__"
  "__MODULE__"
  "__PRETTY_FUNCTION__"
] @constant.macro

[
  (wysiwyg_string)
  (alternate_wysiwyg_string)
  (double_quoted_string)
  (hex_string)
  (delimited_string)
  (token_string)
] @string

(character_literal) @character

(integer_literal) @number

(float_literal) @float

[
  "true"
  "false"
] @boolean

;; Functions

(func_declarator
  (identifier) @function
)

[
  "__traits"
  "__vector"
  "assert"
  "is"
  "mixin"
  "pragma"
  "typeid"
] @function.builtin

(import_expression
  "import" @function.builtin
)

(parameter
  (var_declarator
    (identifier) @parameter
  )
)

(function_literal
  (identifier) @parameter
)

(constructor
  "this" @constructor
)

(destructor
  "this" @constructor
)

;; Keywords

[
  "case"
  "default"
  "else"
  "if"
  "switch"
] @conditional

[
  "break"
  "continue"
  "do"
  "for"
  "foreach"
  "foreach_reverse"
  "while"
] @repeat

[
  "__parameters"
  "alias"
  "align"
  "asm"
  "auto"
  "body"
  "class"
  "debug"
  "enum"
  "export"
  "goto"
  "interface"
  "invariant"
  "macro"
  "out"
  "override"
  "package"
  "static"
  "struct"
  "template"
  "union"
  "unittest"
  "version"
  "with"
] @keyword

[
  "delegate"
  "function"
] @keyword.function

"return" @keyword.return

[
  "cast"
  "new"
] @keyword.operator

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

[
  "catch"
  "finally"
  "throw"
  "try"
] @exception

"null" @constant.builtin

[
  "__gshared"
  "const"
  "immutable"
  "shared"
] @storageclass

[
  "abstract"
  "deprecated"
  "extern"
  "final"
  "inout"
  "lazy"
  "nothrow"
  "private"
  "protected"
  "public"
  "pure"
  "ref"
  "scope"
  "synchronized"
] @type.qualifier

(alias_assignment
  . (identifier) @type.definition)

(module_declaration
  "module" @include
)

(import_declaration
  "import" @include
)

(type) @type

(catch_parameter
  (qualified_identifier) @type
)

(var_declarations
  (qualified_identifier) @type
)

(func_declaration
  (qualified_identifier) @type
)

(parameter
  (qualified_identifier) @type
)

(class_declaration
  (identifier) @type
)

(fundamental_type) @type.builtin

(module_fully_qualified_name (packages (package_name) @namespace))
(module_name) @namespace

(at_attribute) @attribute

(user_defined_attribute
  "@" @attribute
)

;; Variables

(primary_expression
  "this" @variable.builtin
)