(ty
  (id)) @type

(package_decl
  (id) @module)

(version) @string.special

(use_path
  [
    "@"
    "/"
  ] @punctuation.delimiter)

(package_decl
  [
    "@"
    "/"
  ] @punctuation.delimiter)

; feature gates with leading `@`
(_
  .
  "@" @punctuation.special
  .
  [
    "since"
    "unstable"
    "deprecated"
  ] @attribute.builtin)

(unstable_gate
  feature: (id) @string)

(world_item
  name: (id) @module)

(interface_item
  name: (id) @module)

(import_item
  name: (id) @module
  (extern_type
    (body)))

(import_item
  name: (id) @function
  (extern_type
    (func_type)))

(export_item
  name: (id) @module
  (extern_type
    (body)))

(export_item
  name: (id) @function
  (extern_type
    (func_type)))

(type_item
  alias: (id) @type.definition)

(func_item
  name: (id) @function.method)

(handle
  (id) @type)

(named_type
  name: (id) @variable.parameter)

(record_item
  name: (id) @type)

(record_field
  name: (id) @variable.member)

(flags_items
  name: (id) @type)

(flags_field) @variable.member

(variant_items
  name: (id) @type)

(variant_case
  name: (id) @constant)

(enum_items
  name: (id) @type)

(enum_case) @constant

(resource_item
  name: (id) @type)

(resource_method
  (id) @function.method)

(resource_method
  "constructor" @constructor)

(toplevel_use_item
  "use" @keyword.import)

(toplevel_use_item
  alias: (id) @module)

(use_item
  "use" @keyword.import)

(use_path
  (id) @module)

(alias_item
  (id) @module)

(use_names_item
  (id) @module)

"func" @keyword.function

[
  "type"
  "interface"
  "world"
  "package"
  "resource"
  "record"
  "enum"
  "flags"
  "variant"
] @keyword.type

"static" @keyword.modifier

"async" @keyword.coroutine

(uint) @constant

[
  "include"
  "import"
  "export"
  "as"
  "with"
] @keyword.import

[
  "u8"
  "u16"
  "u32"
  "u64"
  "s8"
  "s16"
  "s32"
  "s64"
  "f32"
  "f64"
  "char"
  "bool"
  "string"
] @type.builtin

[
  "tuple"
  "list"
  "option"
  "result"
  "borrow"
  "future"
  "stream"
] @type

"_" @variable.parameter.builtin

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

(use_path
  "/" @punctuation.delimiter)

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

"=" @operator

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

(line_comment
  (doc_comment)) @comment.documentation

(block_comment
  (doc_comment)) @comment.documentation
