diff --git a/book/src/generated/lang-support.md b/book/src/generated/lang-support.md index de2995442..f866c4b4a 100644 --- a/book/src/generated/lang-support.md +++ b/book/src/generated/lang-support.md @@ -249,6 +249,7 @@ | wat | ✓ | | | `wat_server` | | webc | ✓ | | | | | werk | ✓ | | | | +| wesl | ✓ | ✓ | | | | wgsl | ✓ | | | `wgsl-analyzer` | | wit | ✓ | | ✓ | | | wren | ✓ | ✓ | ✓ | | diff --git a/languages.toml b/languages.toml index 0d9cb59a0..400018e6d 100644 --- a/languages.toml +++ b/languages.toml @@ -1625,6 +1625,18 @@ injection-regex = "comment" name = "comment" source = { git = "https://github.com/stsewd/tree-sitter-comment", rev = "aefcc2813392eb6ffe509aa0fc8b4e9b57413ee1" } +[[language]] +name = "wesl" +scope = "source.wesl" +file-types = ["wesl"] +comment-token = "//" +block-comment-tokens = { start = "/*", end = "*/" } +indent = { tab-width = 4, unit = " " } + +[[grammar]] +name = "wesl" +source = { git = "https://github.com/wgsl-tooling-wg/tree-sitter-wesl", rev = "94ee6122680ef8ce2173853ca7c99f7aaeeda8ce" } + [[language]] name = "wgsl" scope = "source.wgsl" diff --git a/runtime/queries/wesl/highlights.scm b/runtime/queries/wesl/highlights.scm new file mode 100644 index 000000000..1bb5fdeed --- /dev/null +++ b/runtime/queries/wesl/highlights.scm @@ -0,0 +1,176 @@ +; reserved: must not be used in source code. https://www.w3.org/TR/WGSL/#reserved-words + +; ((identifier) @special +; (#any-of? @special +; "NULL" "Self" "abstract" "active" "alignas" "alignof" "as" "asm" +; "asm_fragment" "async" "attribute" "auto" "await" "become" "binding_array" +; "cast" "catch" "class" "co_await" "co_return" "co_yield" "coherent" +; "column_major" "common" "compile" "compile_fragment" "concept" "const_cast" +; "consteval" "constexpr" "constinit" "crate" "debugger" "decltype" "delete" +; "demote" "demote_to_helper" "do" "dynamic_cast" "enum" "explicit" "export" +; "extends" "extern" "external" "fallthrough" "filter" "final" "finally" "friend" +; "from" "fxgroup" "get" "goto" "groupshared" "highp" "impl" "implements" "import" +; "inline" "instanceof" "interface" "layout" "lowp" "macro" "macro_rules" "match" +; "mediump" "meta" "mod" "module" "move" "mut" "mutable" "namespace" "new" +; "nil" "noexcept" "noinline" "nointerpolation" "non_coherent" "noncoherent" +; "noperspective" "null" "nullptr" "of" "operator" "package" "packoffset" +; "partition" "pass" "patch" "pixelfragment" "precise" "precision" "premerge" +; "priv" "protected" "pub" "public" "readonly" "ref" "regardless" "register" +; "reinterpret_cast" "require" "resource" "restrict" "self" "set" "shared" +; "sizeof" "smooth" "snorm" "static" "static_assert" "static_cast" "std" +; "subroutine" "super" "target" "template" "this" "thread_local" "throw" "trait" +; "try" "type" "typedef" "typeid" "typename" "typeof" "union" "unless" "unorm" +; "unsafe" "unsized" "use" "using" "varying" "virtual" "volatile" "wgsl" "where" +; "with" "writeonly" "yield")) + +; comments + +(line_comment) @comment.line +(block_comment) @comment.block + +; imports (WESL extension) + +(import_item (identifier) @type + (#match? @type "^[A-Z]")) + +(import_item (identifier) @constant + (#match? @constant "^[A-Z0-9_]+$")) + +(import_item (identifier) @namespace) + +(import_path (identifier) @namespace) + +(ident_path (identifier) @namespace) + +; types + +((identifier) @constant + (#match? @constant "^[A-Z0-9_]+$")) + +((identifier) @type + (#match? @type "^[A-Z]")) + +(type_specifier + (identifier) @type) + +; functions + +(function_decl + (function_header + (identifier) @function)) + +(call_expression + (identifier) @function) + +; templates + +(template_list) @punctuation + +(variable_decl ; this is var et.al + (template_list + (identifier) @keyword.storage.modifier)) + +(type_specifier + (template_list + (identifier) @type)) + +(template_list + (template_list + (identifier) @type)) + +; attributes + +(attribute + (identifier) @attribute) @attribute + +(attribute + (identifier) @attr-name + (argument_list + (identifier) @variable.builtin) + (#eq? @attr-name "builtin")) + +; variables, names + +(param + (identifier) @variable.parameter) +(variable_decl + (identifier) @variable) +(const_assert_statement) @variable + +(struct_decl + (identifier) @type) + +(struct_member + name: (_) @variable.other.member) + +(named_component_expression + component: (_) @variable.other.member) + +(identifier) @variable + +; literals + +(bool_literal) @constant.builtin.boolean +(int_literal) @constant.numeric.integer +(float_literal) @constant.numeric.float + + +; keywords + +[ + "if" + "else" +] @keyword.control.conditional +[ + "loop" + "for" + "while" + "break" + "continue" +] @keyword.control.repeat +[ + "return" +] @keyword.control.return +[ + "switch" + "case" + "default" + "discard" +] @keyword.control +[ ; WESL import extension + "import" + "as" +] @keyword.control.import +[ + "fn" +] @keyword.function +[ + "var" + "let" + "const" + "struct" +] @keyword.storage.type +[ + "alias" + "virtual" ; Bevy / naga_oil extension + "override" ; Bevy / naga_oil extension +] @keyword + +; expressions + +[ + "-" "!" "~" "*" "&" ; unary + "^" "|" "/" "%" "+" (shift_left) (shift_right) ; binary + (less_than) (greater_than) (less_than_equal) (greater_than_equal) "==" "!=" ; relational + "+=" "-=" "*=" "/=" "%=" "|=" "^=" "++" "--" "=" ; assign + "->" ; return +] @operator + +; punctuation + +[ "(" ")" "[" "]" "{" "}" ] @punctuation.bracket +[ "," "." ":" ";" ] @punctuation.delimiter + +; preprocessor + +[ (preproc_directive) "#import" ] @keyword.directive diff --git a/runtime/queries/wesl/injections.scm b/runtime/queries/wesl/injections.scm new file mode 100644 index 000000000..e4509a5fd --- /dev/null +++ b/runtime/queries/wesl/injections.scm @@ -0,0 +1,2 @@ +([(line_comment) (block_comment)] @injection.content + (#set! injection.language "comment")) diff --git a/runtime/queries/wesl/locals.scm b/runtime/queries/wesl/locals.scm new file mode 100644 index 000000000..9aade0e3e --- /dev/null +++ b/runtime/queries/wesl/locals.scm @@ -0,0 +1,18 @@ +; Scopes + +[ + (global_decl) + (switch_body) + (compound_statement) +] @local.scope + +; Definitions + +(param + (identifier) @local.definition) + +; References + +(identifier) @local.reference +; (type_specifier) @local.reference + diff --git a/runtime/queries/wesl/textobjects.scm b/runtime/queries/wesl/textobjects.scm new file mode 100644 index 000000000..c5b3f93e6 --- /dev/null +++ b/runtime/queries/wesl/textobjects.scm @@ -0,0 +1,23 @@ +(function_decl + body: (_) @function.inside) @function.around + +(struct_decl + body: (_) @class.inside) @class.around + +(param_list + ((_) @parameter.inside . ","? @parameter.around) @parameter.around) + +(argument_list + ((_) @parameter.inside . ","? @parameter.around) @parameter.around) + +(template_list + ((_) @parameter.inside . ","? @parameter.around) @parameter.around) + +[ + (line_comment) + (block_comment) +] @comment.inside + +(line_comment)+ @comment.around + +(block_comment) @comment.around