From ffaa1b93795fc02b556672350c0fb67ef6dc156b Mon Sep 17 00:00:00 2001
From: Sergey Borovikov <48716255+foretoo@users.noreply.github.com>
Date: Fri, 10 Jul 2026 12:45:13 +0100
Subject: [PATCH] javascript, typescript: Inject GLSL and WGSL syntax in
comment-labeled template literals (#55341)
Extends the existing ECMAScript comment-label injection system to
support GLSL and WGSL shader languages inside JS/TS strings and template
literals.
The pattern `/* language */` before a string is already used for `html`,
`sql`, `graphql`, and `css`. This adds the same support for two shader
languages commonly embedded as strings in WebGL/WebGPU code:
before:
after:
Syntax highlighting activates when the corresponding extension is
installed:
- GLSL: the built-in `glsl` extension
- WGSL: the community extension
[`wgsl-wesl-zed`](https://github.com/lucascompython/wgsl-wesl-zed)
(language name `WGSL/WESL`)
Both `/*glsl*/` and `/* glsl */` forms are accepted (same behavior as
the existing patterns).
Release Notes:
- Added `/*glsl*/` and `/*wgsl*/` comment-label syntax injection for
JavaScript and TypeScript template literals
---
crates/grammars/src/javascript/injections.scm | 22 +++++++++++++++++++
crates/grammars/src/typescript/injections.scm | 22 +++++++++++++++++++
2 files changed, 44 insertions(+)
diff --git a/crates/grammars/src/javascript/injections.scm b/crates/grammars/src/javascript/injections.scm
index 8ccfc5028d..9d07511f95 100644
--- a/crates/grammars/src/javascript/injections.scm
+++ b/crates/grammars/src/javascript/injections.scm
@@ -142,3 +142,25 @@
])
(#match? @_ecma_comment "^\\/\\*\\s*(css)\\s*\\*\\/")
(#set! injection.language "css"))
+
+; '/* glsl */' or '/*glsl*/'
+(((comment) @_ecma_comment
+ [
+ (string
+ (string_fragment) @injection.content)
+ (template_string
+ (string_fragment) @injection.content)
+ ])
+ (#match? @_ecma_comment "^\\/\\*\\s*glsl\\s*\\*\\/")
+ (#set! injection.language "glsl"))
+
+; '/* wgsl */' or '/*wgsl*/'
+(((comment) @_ecma_comment
+ [
+ (string
+ (string_fragment) @injection.content)
+ (template_string
+ (string_fragment) @injection.content)
+ ])
+ (#match? @_ecma_comment "^\\/\\*\\s*wgsl\\s*\\*\\/")
+ (#set! injection.language "WGSL/WESL"))
diff --git a/crates/grammars/src/typescript/injections.scm b/crates/grammars/src/typescript/injections.scm
index a8cf9a41b5..19ffe69791 100644
--- a/crates/grammars/src/typescript/injections.scm
+++ b/crates/grammars/src/typescript/injections.scm
@@ -197,3 +197,25 @@
])
(#match? @_ecma_comment "^\\/\\*\\s*(css)\\s*\\*\\/")
(#set! injection.language "css"))
+
+; '/* glsl */' or '/*glsl*/'
+(((comment) @_ecma_comment
+ [
+ (string
+ (string_fragment) @injection.content)
+ (template_string
+ (string_fragment) @injection.content)
+ ])
+ (#match? @_ecma_comment "^\\/\\*\\s*glsl\\s*\\*\\/")
+ (#set! injection.language "glsl"))
+
+; '/* wgsl */' or '/*wgsl*/'
+(((comment) @_ecma_comment
+ [
+ (string
+ (string_fragment) @injection.content)
+ (template_string
+ (string_fragment) @injection.content)
+ ])
+ (#match? @_ecma_comment "^\\/\\*\\s*wgsl\\s*\\*\\/")
+ (#set! injection.language "WGSL/WESL"))