diff --git a/.gitmodules b/.gitmodules index 5144482d..7c8a7724 100644 --- a/.gitmodules +++ b/.gitmodules @@ -257,3 +257,6 @@ [submodule "assets/syntaxes/02_Extra/NSIS"] path = assets/syntaxes/02_Extra/NSIS url = https://github.com/SublimeText/NSIS +[submodule "assets/syntaxes/02_Extra/vscode-wgsl"] + path = assets/syntaxes/02_Extra/vscode-wgsl + url = https://github.com/PolyMeilex/vscode-wgsl.git diff --git a/CHANGELOG.md b/CHANGELOG.md index d921f9bb..dd4afeb4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ - Replaced quotes with double quotes so fzf integration example script works on windows and linux. see #2095 (@johnmatthiggins) - Associate `ksh` files with `bash` syntax, see #2633 (@johnmatthiggins) - Associate `ron` files with `rust` syntax, see #2427 (@YeungOnion) +- Add support for [WebGPU Shader Language](https://www.w3.org/TR/WGSL/), see #2692 (@rhysd) ## Themes diff --git a/assets/acknowledgements.bin b/assets/acknowledgements.bin index 3e6c0376..578a4f82 100644 Binary files a/assets/acknowledgements.bin and b/assets/acknowledgements.bin differ diff --git a/assets/syntaxes.bin b/assets/syntaxes.bin index 04e7eefe..9e0d02d3 100644 Binary files a/assets/syntaxes.bin and b/assets/syntaxes.bin differ diff --git a/assets/syntaxes/02_Extra/vscode-wgsl b/assets/syntaxes/02_Extra/vscode-wgsl new file mode 160000 index 00000000..acf26718 --- /dev/null +++ b/assets/syntaxes/02_Extra/vscode-wgsl @@ -0,0 +1 @@ +Subproject commit acf26718d7a327377641e31d8f9a9dab376efa84 diff --git a/assets/syntaxes/02_Extra/wgsl.sublime-syntax b/assets/syntaxes/02_Extra/wgsl.sublime-syntax new file mode 100644 index 00000000..4a526114 --- /dev/null +++ b/assets/syntaxes/02_Extra/wgsl.sublime-syntax @@ -0,0 +1,198 @@ +%YAML 1.2 +--- +# http://www.sublimetext.com/docs/syntax.html +name: WGSL +file_extensions: + - wgsl +scope: source.wgsl +contexts: + main: + - include: line_comments + - include: block_comments + - include: keywords + - include: attributes + - include: functions + - include: function_calls + - include: constants + - include: types + - include: variables + - include: punctuation + attributes: + - match: '(@)([A-Za-z_]+)' + comment: attribute declaration + scope: meta.attribute.wgsl + captures: + 1: keyword.operator.attribute.at + 2: entity.name.attribute.wgsl + block_comments: + - match: /\*\*/ + comment: empty block comments + scope: comment.block.wgsl + - match: /\*\* + comment: block documentation comments + push: + - meta_scope: comment.block.documentation.wgsl + - match: \*/ + pop: true + - include: block_comments + - match: /\*(?!\*) + comment: block comments + push: + - meta_scope: comment.block.wgsl + - match: \*/ + pop: true + - include: block_comments + constants: + - match: '(-?\b[0-9][0-9]*\.[0-9][0-9]*)([eE][+-]?[0-9]+)?\b' + comment: decimal float literal + scope: constant.numeric.float.wgsl + - match: '-?\b0x[0-9a-fA-F]+\b|\b0\b|-?\b[1-9][0-9]*\b' + comment: int literal + scope: constant.numeric.decimal.wgsl + - match: '\b0x[0-9a-fA-F]+u\b|\b0u\b|\b[1-9][0-9]*u\b' + comment: uint literal + scope: constant.numeric.decimal.wgsl + - match: \b(true|false)\b + comment: boolean constant + scope: constant.language.boolean.wgsl + function_calls: + - match: '([A-Za-z0-9_]+)(\()' + comment: function/method calls + captures: + 1: entity.name.function.wgsl + 2: punctuation.brackets.round.wgsl + push: + - meta_scope: meta.function.call.wgsl + - match: \) + captures: + 0: punctuation.brackets.round.wgsl + pop: true + - include: line_comments + - include: block_comments + - include: keywords + - include: attributes + - include: function_calls + - include: constants + - include: types + - include: variables + - include: punctuation + functions: + - match: '\b(fn)\s+([A-Za-z0-9_]+)((\()|(<))' + comment: function definition + captures: + 1: keyword.other.fn.wgsl + 2: entity.name.function.wgsl + 4: punctuation.brackets.round.wgsl + push: + - meta_scope: meta.function.definition.wgsl + - match: '\{' + captures: + 0: punctuation.brackets.curly.wgsl + pop: true + - include: line_comments + - include: block_comments + - include: keywords + - include: attributes + - include: function_calls + - include: constants + - include: types + - include: variables + - include: punctuation + keywords: + - match: \b(bitcast|block|break|case|continue|continuing|default|discard|else|elseif|enable|fallthrough|for|function|if|loop|private|read|read_write|return|storage|switch|uniform|while|workgroup|write)\b + comment: other keywords + scope: keyword.control.wgsl + - match: \b(asm|const|do|enum|handle|mat|premerge|regardless|typedef|unless|using|vec|void)\b + comment: reserved keywords + scope: keyword.control.wgsl + - match: \b(let|var)\b + comment: storage keywords + scope: keyword.other.wgsl storage.type.wgsl + - match: \b(type)\b + comment: type keyword + scope: keyword.declaration.type.wgsl storage.type.wgsl + - match: \b(enum)\b + comment: enum keyword + scope: keyword.declaration.enum.wgsl storage.type.wgsl + - match: \b(struct)\b + comment: struct keyword + scope: keyword.declaration.struct.wgsl storage.type.wgsl + - match: \bfn\b + comment: fn + scope: keyword.other.fn.wgsl + - match: (\^|\||\|\||&&|<<|>>|!)(?!=) + comment: logical operators + scope: keyword.operator.logical.wgsl + - match: '&(?![&=])' + comment: logical AND, borrow references + scope: keyword.operator.borrow.and.wgsl + - match: (\+=|-=|\*=|/=|%=|\^=|&=|\|=|<<=|>>=) + comment: assignment operators + scope: keyword.operator.assignment.wgsl + - match: '(?])=(?!=|>)' + comment: single equal + scope: keyword.operator.assignment.equal.wgsl + - match: (=(=)?(?!>)|!=|<=|(?=) + comment: comparison operators + scope: keyword.operator.comparison.wgsl + - match: '(([+%]|(\*(?!\w)))(?!=))|(-(?!>))|(/(?!/))' + comment: math operators + scope: keyword.operator.math.wgsl + - match: \.(?!\.) + comment: dot access + scope: keyword.operator.access.dot.wgsl + - match: '->' + comment: dashrocket, skinny arrow + scope: keyword.operator.arrow.skinny.wgsl + line_comments: + - match: \s*//.* + comment: single line comment + scope: comment.line.double-slash.wgsl + punctuation: + - match: ',' + comment: comma + scope: punctuation.comma.wgsl + - match: '[{}]' + comment: curly braces + scope: punctuation.brackets.curly.wgsl + - match: '[()]' + comment: parentheses, round brackets + scope: punctuation.brackets.round.wgsl + - match: ; + comment: semicolon + scope: punctuation.semi.wgsl + - match: '[\[\]]' + comment: square brackets + scope: punctuation.brackets.square.wgsl + - match: '(?]' + comment: angle brackets + scope: punctuation.brackets.angle.wgsl + types: + - match: \b(bool|i32|u32|f32)\b + comment: scalar Types + scope: storage.type.wgsl + - match: \b(i64|u64|f64)\b + comment: reserved scalar Types + scope: storage.type.wgsl + - match: \b(vec2i|vec3i|vec4i|vec2u|vec3u|vec4u|vec2f|vec3f|vec4f|vec2h|vec3h|vec4h)\b + comment: vector type aliasses + scope: storage.type.wgsl + - match: \b(mat2x2f|mat2x3f|mat2x4f|mat3x2f|mat3x3f|mat3x4f|mat4x2f|mat4x3f|mat4x4f|mat2x2h|mat2x3h|mat2x4h|mat3x2h|mat3x3h|mat3x4h|mat4x2h|mat4x3h|mat4x4h)\b + comment: matrix type aliasses + scope: storage.type.wgsl + - match: '\b(vec[2-4]|mat[2-4]x[2-4])\b' + comment: vector/matrix types + scope: storage.type.wgsl + - match: \b(atomic)\b + comment: atomic types + scope: storage.type.wgsl + - match: \b(array)\b + comment: array types + scope: storage.type.wgsl + - match: '\b([A-Z][A-Za-z0-9]*)\b' + comment: Custom type + scope: entity.name.type.wgsl + variables: + - match: '\b(? removed `task` file type. * `Robot.sublime_syntax` => changed name to "Robot Framework", added `.resource` extension. * `SML.sublime_syntax` => removed `ml` file type. +* `wgsl.sublime-syntax` => added `wgsl` file extension. ### Non-submodule additions diff --git a/tests/syntax-tests/highlighted/WGSL/test.wgsl b/tests/syntax-tests/highlighted/WGSL/test.wgsl new file mode 100644 index 00000000..9ebcd5d0 --- /dev/null +++ b/tests/syntax-tests/highlighted/WGSL/test.wgsl @@ -0,0 +1,20 @@ +struct VertexOut { + @builtin(position) position : vec4f, + @location(0) color : vec4f +} + +@vertex +fn vertex_main(@location(0) position: vec4f, + @location(1) color: vec4f) -> VertexOut +{ + var output : VertexOut; + output.position = position; + output.color = color; + return output; +} + +@fragment +fn fragment_main(fragData: VertexOut) -> @location(0) vec4f +{ + return fragData.color; +} diff --git a/tests/syntax-tests/source/WGSL/LICENSE.md b/tests/syntax-tests/source/WGSL/LICENSE.md new file mode 100644 index 00000000..da812527 --- /dev/null +++ b/tests/syntax-tests/source/WGSL/LICENSE.md @@ -0,0 +1,5 @@ +The `test.wgsl` file has been added from https://developer.mozilla.org/en-US/docs/Web/API/WebGPU_API under the following license: + +``` +Any copyright is dedicated to the Public Domain: https://creativecommons.org/publicdomain/zero/1.0/ +``` diff --git a/tests/syntax-tests/source/WGSL/test.wgsl b/tests/syntax-tests/source/WGSL/test.wgsl new file mode 100644 index 00000000..796a94e8 --- /dev/null +++ b/tests/syntax-tests/source/WGSL/test.wgsl @@ -0,0 +1,20 @@ +struct VertexOut { + @builtin(position) position : vec4f, + @location(0) color : vec4f +} + +@vertex +fn vertex_main(@location(0) position: vec4f, + @location(1) color: vec4f) -> VertexOut +{ + var output : VertexOut; + output.position = position; + output.color = color; + return output; +} + +@fragment +fn fragment_main(fragData: VertexOut) -> @location(0) vec4f +{ + return fragData.color; +}