Import Tint changes from Dawn

Changes:
  - 57bfe82d875cf8b15b76ba90b1b4a260554eb844 [ir] Move `image_dref_gather` and `image_gather` over to ... by dan sinclair <dsinclair@chromium.org>
  - 4fcfbbca636cdbf77c31ad9a975f6e7ebfbf4dcc spir-v writer support for subgroupBroadcast by David Neto <dneto@google.com>
  - 11653890028c6d4c35688b060d1d6d6437cb9bf1 [tint] Move WGSL-exclusive enums back to lang/wgsl by Ben Clayton <bclayton@google.com>
  - 9f1bd725eb44c9da63066842cd1fa6842d1157c8 [ir] Move `image_fetch` and `image_read` over to spirv bu... by dan sinclair <dsinclair@chromium.org>
  - c06e49ccab18ee870dbfaa1af877d48406d10ae4 subgroupBroadcast sourceLaneIndex should be unsigned by David Neto <dneto@google.com>
GitOrigin-RevId: 57bfe82d875cf8b15b76ba90b1b4a260554eb844
Change-Id: Ibb09a15886b988a6673504c395a0944732d55393
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/152201
Reviewed-by: Ben Clayton <bclayton@google.com>
Commit-Queue: Ben Clayton <bclayton@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
diff --git a/src/tint/api/BUILD.bazel b/src/tint/api/BUILD.bazel
index 950f202..00f3628 100644
--- a/src/tint/api/BUILD.bazel
+++ b/src/tint/api/BUILD.bazel
@@ -39,6 +39,7 @@
     "//src/tint/lang/core/type",
     "//src/tint/lang/hlsl/writer/common",
     "//src/tint/lang/spirv/reader/common",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/program",
     "//src/tint/lang/wgsl/reader",
diff --git a/src/tint/api/BUILD.cmake b/src/tint/api/BUILD.cmake
index 0329dcd..05e09ff 100644
--- a/src/tint/api/BUILD.cmake
+++ b/src/tint/api/BUILD.cmake
@@ -41,6 +41,7 @@
   tint_lang_core_type
   tint_lang_hlsl_writer_common
   tint_lang_spirv_reader_common
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_program
   tint_lang_wgsl_reader
diff --git a/src/tint/api/BUILD.gn b/src/tint/api/BUILD.gn
index fa28e6f..e70d3af 100644
--- a/src/tint/api/BUILD.gn
+++ b/src/tint/api/BUILD.gn
@@ -38,6 +38,7 @@
     "${tint_src_dir}/lang/core/type",
     "${tint_src_dir}/lang/hlsl/writer/common",
     "${tint_src_dir}/lang/spirv/reader/common",
+    "${tint_src_dir}/lang/wgsl",
     "${tint_src_dir}/lang/wgsl/ast",
     "${tint_src_dir}/lang/wgsl/program",
     "${tint_src_dir}/lang/wgsl/reader",
diff --git a/src/tint/cmd/bench/BUILD.bazel b/src/tint/cmd/bench/BUILD.bazel
index 450439a..7995335 100644
--- a/src/tint/cmd/bench/BUILD.bazel
+++ b/src/tint/cmd/bench/BUILD.bazel
@@ -35,6 +35,7 @@
     "//src/tint/lang/core",
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/type",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/program",
     "//src/tint/lang/wgsl/sem",
@@ -66,6 +67,7 @@
     "//src/tint/lang/core/type",
     "//src/tint/lang/core:bench",
     "//src/tint/lang/spirv/reader/common",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/program",
     "//src/tint/lang/wgsl/reader",
@@ -73,6 +75,7 @@
     "//src/tint/lang/wgsl/sem",
     "//src/tint/lang/wgsl/writer",
     "//src/tint/lang/wgsl/writer:bench",
+    "//src/tint/lang/wgsl:bench",
     "//src/tint/utils/containers",
     "//src/tint/utils/diagnostic",
     "//src/tint/utils/ice",
diff --git a/src/tint/cmd/bench/BUILD.cmake b/src/tint/cmd/bench/BUILD.cmake
index e6ec3dd..fdde451 100644
--- a/src/tint/cmd/bench/BUILD.cmake
+++ b/src/tint/cmd/bench/BUILD.cmake
@@ -34,6 +34,7 @@
   tint_lang_core
   tint_lang_core_constant
   tint_lang_core_type
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_program
   tint_lang_wgsl_sem
@@ -66,6 +67,7 @@
   tint_lang_core_type
   tint_lang_core_bench
   tint_lang_spirv_reader_common
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_program
   tint_lang_wgsl_reader
@@ -73,6 +75,7 @@
   tint_lang_wgsl_sem
   tint_lang_wgsl_writer
   tint_lang_wgsl_writer_bench
+  tint_lang_wgsl_bench
   tint_utils_containers
   tint_utils_diagnostic
   tint_utils_ice
diff --git a/src/tint/cmd/bench/BUILD.gn b/src/tint/cmd/bench/BUILD.gn
index 484acf7..e17e2de 100644
--- a/src/tint/cmd/bench/BUILD.gn
+++ b/src/tint/cmd/bench/BUILD.gn
@@ -34,6 +34,7 @@
     "${tint_src_dir}/lang/core",
     "${tint_src_dir}/lang/core/constant",
     "${tint_src_dir}/lang/core/type",
+    "${tint_src_dir}/lang/wgsl",
     "${tint_src_dir}/lang/wgsl/ast",
     "${tint_src_dir}/lang/wgsl/program",
     "${tint_src_dir}/lang/wgsl/sem",
diff --git a/src/tint/cmd/common/BUILD.bazel b/src/tint/cmd/common/BUILD.bazel
index 4215394..7cf4691 100644
--- a/src/tint/cmd/common/BUILD.bazel
+++ b/src/tint/cmd/common/BUILD.bazel
@@ -40,6 +40,7 @@
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/type",
     "//src/tint/lang/spirv/reader/common",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/inspector",
     "//src/tint/lang/wgsl/program",
@@ -86,6 +87,7 @@
     "//src/tint/lang/core",
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/type",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/program",
     "//src/tint/lang/wgsl/resolver",
diff --git a/src/tint/cmd/common/BUILD.cmake b/src/tint/cmd/common/BUILD.cmake
index 01f44f5..a10c867 100644
--- a/src/tint/cmd/common/BUILD.cmake
+++ b/src/tint/cmd/common/BUILD.cmake
@@ -39,6 +39,7 @@
   tint_lang_core_constant
   tint_lang_core_type
   tint_lang_spirv_reader_common
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_inspector
   tint_lang_wgsl_program
@@ -87,6 +88,7 @@
   tint_lang_core
   tint_lang_core_constant
   tint_lang_core_type
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_program
   tint_lang_wgsl_resolver
diff --git a/src/tint/cmd/common/BUILD.gn b/src/tint/cmd/common/BUILD.gn
index 2b10c18..b66d0ba 100644
--- a/src/tint/cmd/common/BUILD.gn
+++ b/src/tint/cmd/common/BUILD.gn
@@ -43,6 +43,7 @@
     "${tint_src_dir}/lang/core/constant",
     "${tint_src_dir}/lang/core/type",
     "${tint_src_dir}/lang/spirv/reader/common",
+    "${tint_src_dir}/lang/wgsl",
     "${tint_src_dir}/lang/wgsl/ast",
     "${tint_src_dir}/lang/wgsl/inspector",
     "${tint_src_dir}/lang/wgsl/program",
@@ -87,6 +88,7 @@
       "${tint_src_dir}/lang/core",
       "${tint_src_dir}/lang/core/constant",
       "${tint_src_dir}/lang/core/type",
+      "${tint_src_dir}/lang/wgsl",
       "${tint_src_dir}/lang/wgsl/ast",
       "${tint_src_dir}/lang/wgsl/program",
       "${tint_src_dir}/lang/wgsl/resolver",
diff --git a/src/tint/cmd/info/BUILD.bazel b/src/tint/cmd/info/BUILD.bazel
index 9e5f3b2..3b9fc16 100644
--- a/src/tint/cmd/info/BUILD.bazel
+++ b/src/tint/cmd/info/BUILD.bazel
@@ -35,6 +35,7 @@
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/type",
     "//src/tint/lang/spirv/reader/common",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/inspector",
     "//src/tint/lang/wgsl/program",
diff --git a/src/tint/cmd/info/BUILD.cmake b/src/tint/cmd/info/BUILD.cmake
index 10870a1..d15b74e 100644
--- a/src/tint/cmd/info/BUILD.cmake
+++ b/src/tint/cmd/info/BUILD.cmake
@@ -36,6 +36,7 @@
   tint_lang_core_constant
   tint_lang_core_type
   tint_lang_spirv_reader_common
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_inspector
   tint_lang_wgsl_program
diff --git a/src/tint/cmd/info/BUILD.gn b/src/tint/cmd/info/BUILD.gn
index c049a44..e9d84ce 100644
--- a/src/tint/cmd/info/BUILD.gn
+++ b/src/tint/cmd/info/BUILD.gn
@@ -35,6 +35,7 @@
     "${tint_src_dir}/lang/core/constant",
     "${tint_src_dir}/lang/core/type",
     "${tint_src_dir}/lang/spirv/reader/common",
+    "${tint_src_dir}/lang/wgsl",
     "${tint_src_dir}/lang/wgsl/ast",
     "${tint_src_dir}/lang/wgsl/inspector",
     "${tint_src_dir}/lang/wgsl/program",
diff --git a/src/tint/cmd/loopy/BUILD.bazel b/src/tint/cmd/loopy/BUILD.bazel
index 2d2910c..194e728 100644
--- a/src/tint/cmd/loopy/BUILD.bazel
+++ b/src/tint/cmd/loopy/BUILD.bazel
@@ -39,6 +39,7 @@
     "//src/tint/lang/core/type",
     "//src/tint/lang/hlsl/writer/common",
     "//src/tint/lang/spirv/reader/common",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/helpers",
     "//src/tint/lang/wgsl/inspector",
diff --git a/src/tint/cmd/loopy/BUILD.cmake b/src/tint/cmd/loopy/BUILD.cmake
index 0e12784..86eee38 100644
--- a/src/tint/cmd/loopy/BUILD.cmake
+++ b/src/tint/cmd/loopy/BUILD.cmake
@@ -40,6 +40,7 @@
   tint_lang_core_type
   tint_lang_hlsl_writer_common
   tint_lang_spirv_reader_common
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_helpers
   tint_lang_wgsl_inspector
diff --git a/src/tint/cmd/loopy/BUILD.gn b/src/tint/cmd/loopy/BUILD.gn
index fa59018..4c54f72 100644
--- a/src/tint/cmd/loopy/BUILD.gn
+++ b/src/tint/cmd/loopy/BUILD.gn
@@ -39,6 +39,7 @@
     "${tint_src_dir}/lang/core/type",
     "${tint_src_dir}/lang/hlsl/writer/common",
     "${tint_src_dir}/lang/spirv/reader/common",
+    "${tint_src_dir}/lang/wgsl",
     "${tint_src_dir}/lang/wgsl/ast",
     "${tint_src_dir}/lang/wgsl/helpers",
     "${tint_src_dir}/lang/wgsl/inspector",
diff --git a/src/tint/cmd/tint/BUILD.bazel b/src/tint/cmd/tint/BUILD.bazel
index 410ea9d..321c15e 100644
--- a/src/tint/cmd/tint/BUILD.bazel
+++ b/src/tint/cmd/tint/BUILD.bazel
@@ -39,6 +39,7 @@
     "//src/tint/lang/core/type",
     "//src/tint/lang/hlsl/writer/common",
     "//src/tint/lang/spirv/reader/common",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/ast/transform",
     "//src/tint/lang/wgsl/helpers",
diff --git a/src/tint/cmd/tint/BUILD.cmake b/src/tint/cmd/tint/BUILD.cmake
index 32fc985..1d500ac 100644
--- a/src/tint/cmd/tint/BUILD.cmake
+++ b/src/tint/cmd/tint/BUILD.cmake
@@ -40,6 +40,7 @@
   tint_lang_core_type
   tint_lang_hlsl_writer_common
   tint_lang_spirv_reader_common
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_ast_transform
   tint_lang_wgsl_helpers
diff --git a/src/tint/cmd/tint/BUILD.gn b/src/tint/cmd/tint/BUILD.gn
index b53853e..e6c897c 100644
--- a/src/tint/cmd/tint/BUILD.gn
+++ b/src/tint/cmd/tint/BUILD.gn
@@ -39,6 +39,7 @@
     "${tint_src_dir}/lang/core/type",
     "${tint_src_dir}/lang/hlsl/writer/common",
     "${tint_src_dir}/lang/spirv/reader/common",
+    "${tint_src_dir}/lang/wgsl",
     "${tint_src_dir}/lang/wgsl/ast",
     "${tint_src_dir}/lang/wgsl/ast/transform",
     "${tint_src_dir}/lang/wgsl/helpers",
diff --git a/src/tint/cmd/tint/main.cc b/src/tint/cmd/tint/main.cc
index da47439..31d7286 100644
--- a/src/tint/cmd/tint/main.cc
+++ b/src/tint/cmd/tint/main.cc
@@ -718,10 +718,10 @@
     // If subgroups are used, bump the version to 2.1.
     auto msl_version = tint::msl::validate::MslVersion::kMsl_1_2;
     for (auto* enable : program->AST().Enables()) {
-        if (enable->HasExtension(tint::core::Extension::kChromiumExperimentalSubgroups)) {
+        if (enable->HasExtension(tint::wgsl::Extension::kChromiumExperimentalSubgroups)) {
             msl_version = std::max(msl_version, tint::msl::validate::MslVersion::kMsl_2_1);
         }
-        if (enable->HasExtension(tint::core::Extension::kChromiumExperimentalPixelLocal)) {
+        if (enable->HasExtension(tint::wgsl::Extension::kChromiumExperimentalPixelLocal)) {
             msl_version = std::max(msl_version, tint::msl::validate::MslVersion::kMsl_2_3);
         }
     }
@@ -806,7 +806,7 @@
                 auto enable_list = program->AST().Enables();
                 bool dxc_require_16bit_types = false;
                 for (auto* enable : enable_list) {
-                    if (enable->HasExtension(tint::core::Extension::kF16)) {
+                    if (enable->HasExtension(tint::wgsl::Extension::kF16)) {
                         dxc_require_16bit_types = true;
                         break;
                     }
diff --git a/src/tint/fuzzers/tint_common_fuzzer.cc b/src/tint/fuzzers/tint_common_fuzzer.cc
index 421cbbc..93ec9ea 100644
--- a/src/tint/fuzzers/tint_common_fuzzer.cc
+++ b/src/tint/fuzzers/tint_common_fuzzer.cc
@@ -189,7 +189,7 @@
     }
 
     // Helper that returns `true` if the program uses the given extension.
-    auto uses_extension = [&program](tint::core::Extension extension) {
+    auto uses_extension = [&program](tint::wgsl::Extension extension) {
         for (auto* enable : program.AST().Enables()) {
             if (enable->HasExtension(extension)) {
                 return true;
@@ -301,7 +301,7 @@
 #if TINT_BUILD_SPV_WRITER
             // Skip fuzzing the SPIR-V writer when the `clamp_frag_depth` option is used with a
             // module that already contains push constants.
-            if (uses_extension(tint::core::Extension::kChromiumExperimentalPushConstant) &&
+            if (uses_extension(tint::wgsl::Extension::kChromiumExperimentalPushConstant) &&
                 options_spirv_.clamp_frag_depth) {
                 return 0;
             }
diff --git a/src/tint/fuzzers/tint_ir_roundtrip_fuzzer.cc b/src/tint/fuzzers/tint_ir_roundtrip_fuzzer.cc
index 4df9f49..74e198f 100644
--- a/src/tint/fuzzers/tint_ir_roundtrip_fuzzer.cc
+++ b/src/tint/fuzzers/tint_ir_roundtrip_fuzzer.cc
@@ -48,12 +48,12 @@
     auto is_unsupported = [](const tint::ast::Enable* enable) {
         for (auto ext : enable->extensions) {
             switch (ext->name) {
-                case tint::core::Extension::kChromiumExperimentalDp4A:
-                case tint::core::Extension::kChromiumExperimentalFullPtrParameters:
-                case tint::core::Extension::kChromiumExperimentalPixelLocal:
-                case tint::core::Extension::kChromiumExperimentalPushConstant:
-                case tint::core::Extension::kChromiumInternalDualSourceBlending:
-                case tint::core::Extension::kChromiumInternalRelaxedUniformLayout:
+                case tint::wgsl::Extension::kChromiumExperimentalDp4A:
+                case tint::wgsl::Extension::kChromiumExperimentalFullPtrParameters:
+                case tint::wgsl::Extension::kChromiumExperimentalPixelLocal:
+                case tint::wgsl::Extension::kChromiumExperimentalPushConstant:
+                case tint::wgsl::Extension::kChromiumInternalDualSourceBlending:
+                case tint::wgsl::Extension::kChromiumInternalRelaxedUniformLayout:
                     return true;
                 default:
                     break;
diff --git a/src/tint/lang/core/BUILD.bazel b/src/tint/lang/core/BUILD.bazel
index ce01f3f..8f69c1d 100644
--- a/src/tint/lang/core/BUILD.bazel
+++ b/src/tint/lang/core/BUILD.bazel
@@ -32,9 +32,6 @@
     "binary_op.cc",
     "builtin.cc",
     "builtin_value.cc",
-    "diagnostic_rule.cc",
-    "diagnostic_severity.cc",
-    "extension.cc",
     "function.cc",
     "interpolation_sampling.cc",
     "interpolation_type.cc",
@@ -50,10 +47,7 @@
     "binary_op.h",
     "builtin.h",
     "builtin_value.h",
-    "diagnostic_rule.h",
-    "diagnostic_severity.h",
     "evaluation_stage.h",
-    "extension.h",
     "fluent_types.h",
     "function.h",
     "interpolation.h",
@@ -65,14 +59,10 @@
     "unary_op.h",
   ],
   deps = [
-    "//src/tint/utils/containers",
-    "//src/tint/utils/diagnostic",
     "//src/tint/utils/ice",
     "//src/tint/utils/macros",
-    "//src/tint/utils/math",
     "//src/tint/utils/memory",
     "//src/tint/utils/result",
-    "//src/tint/utils/rtti",
     "//src/tint/utils/text",
     "//src/tint/utils/traits",
   ],
@@ -88,9 +78,6 @@
     "attribute_test.cc",
     "builtin_test.cc",
     "builtin_value_test.cc",
-    "diagnostic_rule_test.cc",
-    "diagnostic_severity_test.cc",
-    "extension_test.cc",
     "interpolation_sampling_test.cc",
     "interpolation_type_test.cc",
     "number_test.cc",
@@ -101,6 +88,7 @@
     "//src/tint/lang/core",
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/type",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/program",
     "//src/tint/lang/wgsl/sem",
@@ -130,23 +118,12 @@
     "attribute_bench.cc",
     "builtin_bench.cc",
     "builtin_value_bench.cc",
-    "diagnostic_rule_bench.cc",
-    "diagnostic_severity_bench.cc",
-    "extension_bench.cc",
     "interpolation_sampling_bench.cc",
     "interpolation_type_bench.cc",
     "texel_format_bench.cc",
   ],
   deps = [
     "//src/tint/lang/core",
-    "//src/tint/utils/containers",
-    "//src/tint/utils/diagnostic",
-    "//src/tint/utils/ice",
-    "//src/tint/utils/macros",
-    "//src/tint/utils/math",
-    "//src/tint/utils/memory",
-    "//src/tint/utils/rtti",
-    "//src/tint/utils/text",
     "//src/tint/utils/traits",
   ],
   copts = COPTS,
diff --git a/src/tint/lang/core/BUILD.cmake b/src/tint/lang/core/BUILD.cmake
index 6be18a3..5e02dac 100644
--- a/src/tint/lang/core/BUILD.cmake
+++ b/src/tint/lang/core/BUILD.cmake
@@ -43,13 +43,7 @@
   lang/core/builtin.h
   lang/core/builtin_value.cc
   lang/core/builtin_value.h
-  lang/core/diagnostic_rule.cc
-  lang/core/diagnostic_rule.h
-  lang/core/diagnostic_severity.cc
-  lang/core/diagnostic_severity.h
   lang/core/evaluation_stage.h
-  lang/core/extension.cc
-  lang/core/extension.h
   lang/core/fluent_types.h
   lang/core/function.cc
   lang/core/function.h
@@ -69,14 +63,10 @@
 )
 
 tint_target_add_dependencies(tint_lang_core lib
-  tint_utils_containers
-  tint_utils_diagnostic
   tint_utils_ice
   tint_utils_macros
-  tint_utils_math
   tint_utils_memory
   tint_utils_result
-  tint_utils_rtti
   tint_utils_text
   tint_utils_traits
 )
@@ -91,9 +81,6 @@
   lang/core/attribute_test.cc
   lang/core/builtin_test.cc
   lang/core/builtin_value_test.cc
-  lang/core/diagnostic_rule_test.cc
-  lang/core/diagnostic_severity_test.cc
-  lang/core/extension_test.cc
   lang/core/interpolation_sampling_test.cc
   lang/core/interpolation_type_test.cc
   lang/core/number_test.cc
@@ -105,6 +92,7 @@
   tint_lang_core
   tint_lang_core_constant
   tint_lang_core_type
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_program
   tint_lang_wgsl_sem
@@ -137,9 +125,6 @@
   lang/core/attribute_bench.cc
   lang/core/builtin_bench.cc
   lang/core/builtin_value_bench.cc
-  lang/core/diagnostic_rule_bench.cc
-  lang/core/diagnostic_severity_bench.cc
-  lang/core/extension_bench.cc
   lang/core/interpolation_sampling_bench.cc
   lang/core/interpolation_type_bench.cc
   lang/core/texel_format_bench.cc
@@ -147,13 +132,5 @@
 
 tint_target_add_dependencies(tint_lang_core_bench bench
   tint_lang_core
-  tint_utils_containers
-  tint_utils_diagnostic
-  tint_utils_ice
-  tint_utils_macros
-  tint_utils_math
-  tint_utils_memory
-  tint_utils_rtti
-  tint_utils_text
   tint_utils_traits
 )
diff --git a/src/tint/lang/core/BUILD.gn b/src/tint/lang/core/BUILD.gn
index d7f838f..c096493 100644
--- a/src/tint/lang/core/BUILD.gn
+++ b/src/tint/lang/core/BUILD.gn
@@ -43,13 +43,7 @@
     "builtin.h",
     "builtin_value.cc",
     "builtin_value.h",
-    "diagnostic_rule.cc",
-    "diagnostic_rule.h",
-    "diagnostic_severity.cc",
-    "diagnostic_severity.h",
     "evaluation_stage.h",
-    "extension.cc",
-    "extension.h",
     "fluent_types.h",
     "function.cc",
     "function.h",
@@ -68,14 +62,10 @@
     "unary_op.h",
   ]
   deps = [
-    "${tint_src_dir}/utils/containers",
-    "${tint_src_dir}/utils/diagnostic",
     "${tint_src_dir}/utils/ice",
     "${tint_src_dir}/utils/macros",
-    "${tint_src_dir}/utils/math",
     "${tint_src_dir}/utils/memory",
     "${tint_src_dir}/utils/result",
-    "${tint_src_dir}/utils/rtti",
     "${tint_src_dir}/utils/text",
     "${tint_src_dir}/utils/traits",
   ]
@@ -89,9 +79,6 @@
       "attribute_test.cc",
       "builtin_test.cc",
       "builtin_value_test.cc",
-      "diagnostic_rule_test.cc",
-      "diagnostic_severity_test.cc",
-      "extension_test.cc",
       "interpolation_sampling_test.cc",
       "interpolation_type_test.cc",
       "number_test.cc",
@@ -103,6 +90,7 @@
       "${tint_src_dir}/lang/core",
       "${tint_src_dir}/lang/core/constant",
       "${tint_src_dir}/lang/core/type",
+      "${tint_src_dir}/lang/wgsl",
       "${tint_src_dir}/lang/wgsl/ast",
       "${tint_src_dir}/lang/wgsl/program",
       "${tint_src_dir}/lang/wgsl/sem",
diff --git a/src/tint/lang/core/constant/BUILD.bazel b/src/tint/lang/core/constant/BUILD.bazel
index 95c577b..402a7e3 100644
--- a/src/tint/lang/core/constant/BUILD.bazel
+++ b/src/tint/lang/core/constant/BUILD.bazel
@@ -91,6 +91,7 @@
     "//src/tint/lang/core/intrinsic",
     "//src/tint/lang/core/type",
     "//src/tint/lang/core/type:test",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/program",
     "//src/tint/lang/wgsl/reader",
diff --git a/src/tint/lang/core/constant/BUILD.cmake b/src/tint/lang/core/constant/BUILD.cmake
index c8a657a..d3829a2 100644
--- a/src/tint/lang/core/constant/BUILD.cmake
+++ b/src/tint/lang/core/constant/BUILD.cmake
@@ -90,6 +90,7 @@
   tint_lang_core_intrinsic
   tint_lang_core_type
   tint_lang_core_type_test
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_program
   tint_lang_wgsl_reader
diff --git a/src/tint/lang/core/constant/BUILD.gn b/src/tint/lang/core/constant/BUILD.gn
index cbb4a13..39ae73f 100644
--- a/src/tint/lang/core/constant/BUILD.gn
+++ b/src/tint/lang/core/constant/BUILD.gn
@@ -93,6 +93,7 @@
       "${tint_src_dir}/lang/core/intrinsic",
       "${tint_src_dir}/lang/core/type",
       "${tint_src_dir}/lang/core/type:unittests",
+      "${tint_src_dir}/lang/wgsl",
       "${tint_src_dir}/lang/wgsl/ast",
       "${tint_src_dir}/lang/wgsl/program",
       "${tint_src_dir}/lang/wgsl/reader",
diff --git a/src/tint/lang/core/constant/eval_binary_op_test.cc b/src/tint/lang/core/constant/eval_binary_op_test.cc
index ed064a7..8860d48 100644
--- a/src/tint/lang/core/constant/eval_binary_op_test.cc
+++ b/src/tint/lang/core/constant/eval_binary_op_test.cc
@@ -84,7 +84,7 @@
 
 using ConstEvalBinaryOpTest = ConstEvalTestWithParam<std::tuple<core::BinaryOp, Case>>;
 TEST_P(ConstEvalBinaryOpTest, Test) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
     auto op = std::get<0>(GetParam());
     auto& c = std::get<1>(GetParam());
 
diff --git a/src/tint/lang/core/constant/eval_builtin_test.cc b/src/tint/lang/core/constant/eval_builtin_test.cc
index 7b1e198..6a31120 100644
--- a/src/tint/lang/core/constant/eval_builtin_test.cc
+++ b/src/tint/lang/core/constant/eval_builtin_test.cc
@@ -142,7 +142,7 @@
 using ConstEvalBuiltinTest = ConstEvalTestWithParam<std::tuple<core::Function, Case>>;
 
 TEST_P(ConstEvalBuiltinTest, Test) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto builtin = std::get<0>(GetParam());
     auto& c = std::get<1>(GetParam());
diff --git a/src/tint/lang/core/constant/eval_construction_test.cc b/src/tint/lang/core/constant/eval_construction_test.cc
index f9f7c29..36b5ace 100644
--- a/src/tint/lang/core/constant/eval_construction_test.cc
+++ b/src/tint/lang/core/constant/eval_construction_test.cc
@@ -98,7 +98,7 @@
 }
 
 TEST_F(ConstEvalTest, Scalar_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* expr = Expr(9.9_h);
     WrapInFunction(expr);
@@ -140,7 +140,7 @@
 }
 using ConstEvalZeroInitTest = ConstEvalTestWithParam<Case>;
 TEST_P(ConstEvalZeroInitTest, Test) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
     auto& param = GetParam();
     auto ty = param.type(*this);
     auto* expr = Call(ty);
@@ -296,7 +296,7 @@
 }
 
 TEST_F(ConstEvalTest, Vec3_ZeroInit_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* expr = Call<vec3<f16>>();
     WrapInFunction(expr);
@@ -443,7 +443,7 @@
 }
 
 TEST_F(ConstEvalTest, Vec3_Splat_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* expr = Call<vec3<f16>>(9.9_h);
     WrapInFunction(expr);
@@ -651,7 +651,7 @@
 }
 
 TEST_F(ConstEvalTest, Vec3_FullConstruct_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* expr = Call<vec3<f16>>(1_h, 2_h, 3_h);
     WrapInFunction(expr);
@@ -914,7 +914,7 @@
 }
 
 TEST_F(ConstEvalTest, Vec3_MixConstruct_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* expr = Call<vec3<f16>>(1_h, Call<vec2<f16>>(2_h, 3_h));
     WrapInFunction(expr);
@@ -945,7 +945,7 @@
 }
 
 TEST_F(ConstEvalTest, Vec3_MixConstruct_f16_all_10) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* expr = Call<vec3<f16>>(10_h, Call<vec2<f16>>(10_h, 10_h));
     WrapInFunction(expr);
@@ -976,7 +976,7 @@
 }
 
 TEST_F(ConstEvalTest, Vec3_MixConstruct_f16_all_positive_0) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* expr = Call<vec3<f16>>(0_h, Call<vec2<f16>>(0_h, 0_h));
     WrapInFunction(expr);
@@ -1007,7 +1007,7 @@
 }
 
 TEST_F(ConstEvalTest, Vec3_MixConstruct_f16_all_negative_0) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* expr = Call<vec3<f16>>(Call<vec2<f16>>(-0_h, -0_h), -0_h);
     WrapInFunction(expr);
@@ -1038,7 +1038,7 @@
 }
 
 TEST_F(ConstEvalTest, Vec3_MixConstruct_f16_mixed_sign_0) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* expr = Call<vec3<f16>>(0_h, Call<vec2<f16>>(-0_h, 0_h));
     WrapInFunction(expr);
@@ -1198,7 +1198,7 @@
 }
 
 TEST_F(ConstEvalTest, Mat2x3_ZeroInit_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* expr = Call<mat2x3<f16>>();
     WrapInFunction(expr);
@@ -1513,7 +1513,7 @@
 
 using ResolverConstEvalArrayInitTest = ConstEvalTestWithParam<Case>;
 TEST_P(ResolverConstEvalArrayInitTest, Test) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
     auto& param = GetParam();
     auto* expr = param.input.Expr(*this);
     auto* a = Const("a", expr);
@@ -1686,7 +1686,7 @@
 }
 
 TEST_F(ConstEvalTest, Struct_ZeroInit) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
     auto* s = Structure("S", Vector{
                                  Member("a", ty.i32()),
                                  Member("b", ty.u32()),
@@ -1729,7 +1729,7 @@
 }
 
 TEST_F(ConstEvalTest, Struct_Nested_ZeroInit) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
     auto* inner = Structure("Inner", Vector{
                                          Member("a", ty.i32()),
                                          Member("b", ty.u32()),
@@ -1812,7 +1812,7 @@
 }
 
 TEST_F(ConstEvalTest, Struct_MixedScalars_ZeroInit) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     Structure("S", Vector{
                        Member("m1", ty.i32()),
@@ -1924,7 +1924,7 @@
 }
 
 TEST_F(ConstEvalTest, Struct_MixedVectors_ZeroInit) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     Structure("S", Vector{
                        Member("m1", ty.vec2<i32>()),
@@ -2055,7 +2055,7 @@
 }
 
 TEST_F(ConstEvalTest, Struct_MixedScalars_Construct) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     Structure("S", Vector{
                        Member("m1", ty.i32()),
@@ -2106,7 +2106,7 @@
 }
 
 TEST_F(ConstEvalTest, Struct_MixedVectors_Construct) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     Structure("S", Vector{
                        Member("m1", ty.vec2<i32>()),
diff --git a/src/tint/lang/core/constant/eval_conversion_test.cc b/src/tint/lang/core/constant/eval_conversion_test.cc
index c55bea2..2ff6ce6 100644
--- a/src/tint/lang/core/constant/eval_conversion_test.cc
+++ b/src/tint/lang/core/constant/eval_conversion_test.cc
@@ -284,7 +284,7 @@
 }
 
 TEST_F(ConstEvalTest, Vec3_Convert_f16_to_i32) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* expr = Call<vec3<i32>>(Call<vec3<f16>>(1.1_h, 2.2_h, 3.3_h));
     WrapInFunction(expr);
@@ -315,7 +315,7 @@
 }
 
 TEST_F(ConstEvalTest, Vec3_Convert_u32_to_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* expr = Call<vec3<f16>>(Call<vec3<u32>>(10_u, 20_u, 30_u));
     WrapInFunction(expr);
@@ -404,7 +404,7 @@
 }
 
 TEST_F(ConstEvalTest, Vec3_Convert_Large_f32_to_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* expr = Call<vec3<f16>>(Source{{12, 34}}, Call<vec3<f32>>(1e10_f, 0_f, 0_f));
     WrapInFunction(expr);
@@ -414,7 +414,7 @@
 }
 
 TEST_F(ConstEvalTest, Vec3_Convert_Small_f32_to_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     // These values are chosen to force underflow when converting to f16.
     // When the result is zero, the sign bit is *not* guaranteed to be preserved.
diff --git a/src/tint/lang/core/constant/eval_indexing_test.cc b/src/tint/lang/core/constant/eval_indexing_test.cc
index 90cd759..71d7a02 100644
--- a/src/tint/lang/core/constant/eval_indexing_test.cc
+++ b/src/tint/lang/core/constant/eval_indexing_test.cc
@@ -68,7 +68,7 @@
 
 using ConstEvalSwizzleTest = ConstEvalTestWithParam<Case>;
 TEST_P(ConstEvalSwizzleTest, Test) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
     auto& param = GetParam();
     auto* expr = MemberAccessor(param.input.Expr(*this), param.swizzle);
     auto* a = Const("a", expr);
diff --git a/src/tint/lang/core/constant/eval_member_access_test.cc b/src/tint/lang/core/constant/eval_member_access_test.cc
index 4bf4001..0d7b71f 100644
--- a/src/tint/lang/core/constant/eval_member_access_test.cc
+++ b/src/tint/lang/core/constant/eval_member_access_test.cc
@@ -258,7 +258,7 @@
 
 using ConstEvalArrayAccessTest = ConstEvalTestWithParam<Case>;
 TEST_P(ConstEvalArrayAccessTest, Test) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto& param = GetParam();
     auto* expr = param.input.Expr(*this);
@@ -333,7 +333,7 @@
 
 using ConstEvalVectorAccessTest = ConstEvalTestWithParam<Case>;
 TEST_P(ConstEvalVectorAccessTest, Test) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto& param = GetParam();
     auto* expr = param.input.Expr(*this);
diff --git a/src/tint/lang/core/constant/eval_unary_op_test.cc b/src/tint/lang/core/constant/eval_unary_op_test.cc
index 668cf21..a7a7511 100644
--- a/src/tint/lang/core/constant/eval_unary_op_test.cc
+++ b/src/tint/lang/core/constant/eval_unary_op_test.cc
@@ -42,7 +42,7 @@
 using ConstEvalUnaryOpTest = ConstEvalTestWithParam<std::tuple<core::UnaryOp, Case>>;
 
 TEST_P(ConstEvalUnaryOpTest, Test) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto op = std::get<0>(GetParam());
     auto& c = std::get<1>(GetParam());
diff --git a/src/tint/lang/core/core.def b/src/tint/lang/core/core.def
index 639eba7..77b445a 100644
--- a/src/tint/lang/core/core.def
+++ b/src/tint/lang/core/core.def
@@ -46,52 +46,6 @@
   __point_size
 }
 
-// https://gpuweb.github.io/gpuweb/wgsl/#filterable-triggering-rules
-enum core_diagnostic_rule {
-  // Rules defined in the spec.
-  derivative_uniformity
-}
-
-// chromium-specific diagnostics
-enum chromium_diagnostic_rule {
-  // Chromium specific rules not defined in the spec.
-  unreachable_code
-}
-
-// https://gpuweb.github.io/gpuweb/wgsl/#syntax-severity_control_name
-enum diagnostic_severity {
-  error
-  warning
-  info
-  off
-}
-
-// https://gpuweb.github.io/gpuweb/wgsl/#extension
-enum extension {
-  // WGSL Extension "f16"
-  f16
-  // An extension for the experimental feature "chromium_experimental_dp4a".
-  // See crbug.com/tint/1497 for more details
-  chromium_experimental_dp4a
-  // A Chromium-specific extension for disabling uniformity analysis.
-  chromium_disable_uniformity_analysis
-  // A Chromium-specific extension for push constants
-  chromium_experimental_push_constant
-  // A Chromium-specific extension that enables passing of uniform, storage and workgroup
-  // address-spaced pointers as parameters, as well as pointers into sub-objects.
-  chromium_experimental_full_ptr_parameters
-  // A Chromium-specific extension that adds support for read-write storage textures.
-  chromium_experimental_read_write_storage_texture
-  // A Chromium-specific extension that adds basic subgroup functionality.
-  chromium_experimental_subgroups
-  // A Chromium-specific extension that relaxes memory layout requirements for uniform storage.
-  chromium_internal_relaxed_uniform_layout
-  // A Chromium-specific extension that enables dual source blending.
-  chromium_internal_dual_source_blending
-  // A Chromium-specific extension that enables pixel local storage.
-  chromium_experimental_pixel_local
-}
-
 // https://gpuweb.github.io/gpuweb/wgsl/#storage-class
 enum address_space {
   function
@@ -914,7 +868,7 @@
 @stage("fragment", "compute") fn atomicCompareExchangeWeak<T: iu32, S: workgroup_or_storage>(ptr<S, atomic<T>, read_write>, T, T) -> __atomic_compare_exchange_result<T>
 
 @must_use @stage("compute") fn subgroupBallot() -> vec4<u32>
-@must_use @stage("compute") fn subgroupBroadcast<T: fiu32, L: iu32>(value: T, @const sourceLaneIndex: L) -> T
+@must_use @stage("compute") fn subgroupBroadcast<T: fiu32>(value: T, @const sourceLaneIndex: u32) -> T
 
 ////////////////////////////////////////////////////////////////////////////////
 // Value constructors                                                         //
diff --git a/src/tint/lang/core/intrinsic/BUILD.bazel b/src/tint/lang/core/intrinsic/BUILD.bazel
index de13dd6..2ef3c24 100644
--- a/src/tint/lang/core/intrinsic/BUILD.bazel
+++ b/src/tint/lang/core/intrinsic/BUILD.bazel
@@ -68,6 +68,7 @@
     "//src/tint/lang/core/intrinsic/data",
     "//src/tint/lang/core/type",
     "//src/tint/lang/core/type:test",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/program",
     "//src/tint/lang/wgsl/resolver",
diff --git a/src/tint/lang/core/intrinsic/BUILD.cmake b/src/tint/lang/core/intrinsic/BUILD.cmake
index 4aa2870..713c8eb 100644
--- a/src/tint/lang/core/intrinsic/BUILD.cmake
+++ b/src/tint/lang/core/intrinsic/BUILD.cmake
@@ -69,6 +69,7 @@
   tint_lang_core_intrinsic_data
   tint_lang_core_type
   tint_lang_core_type_test
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_program
   tint_lang_wgsl_resolver
diff --git a/src/tint/lang/core/intrinsic/BUILD.gn b/src/tint/lang/core/intrinsic/BUILD.gn
index c5b985b..f66d3fe 100644
--- a/src/tint/lang/core/intrinsic/BUILD.gn
+++ b/src/tint/lang/core/intrinsic/BUILD.gn
@@ -68,6 +68,7 @@
       "${tint_src_dir}/lang/core/intrinsic/data",
       "${tint_src_dir}/lang/core/type",
       "${tint_src_dir}/lang/core/type:unittests",
+      "${tint_src_dir}/lang/wgsl",
       "${tint_src_dir}/lang/wgsl/ast",
       "${tint_src_dir}/lang/wgsl/program",
       "${tint_src_dir}/lang/wgsl/resolver",
diff --git a/src/tint/lang/core/intrinsic/data/data.cc b/src/tint/lang/core/intrinsic/data/data.cc
index 5f92989..94f9779 100644
--- a/src/tint/lang/core/intrinsic/data/data.cc
+++ b/src/tint/lang/core/intrinsic/data/data.cc
@@ -4148,7 +4148,7 @@
   {
     /* [349] */
     /* usage */ core::ParameterUsage::kSourceLaneIndex,
-    /* type_matcher_indices */ TypeMatcherIndicesIndex(21),
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(35),
     /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
   },
   {
@@ -10860,9 +10860,9 @@
     /* [460] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 2,
-    /* num_template_types */ 2,
+    /* num_template_types */ 1,
     /* num_template_numbers */ 0,
-    /* template_types */ TemplateTypeIndex(12),
+    /* template_types */ TemplateTypeIndex(0),
     /* template_numbers */ TemplateNumberIndex(/* invalid */),
     /* parameters */ ParameterIndex(348),
     /* return_type_matcher_indices */ TypeMatcherIndicesIndex(2),
@@ -11823,7 +11823,7 @@
   },
   {
     /* [115] */
-    /* fn subgroupBroadcast<T : fiu32, L : iu32>(value: T, @const sourceLaneIndex: L) -> T */
+    /* fn subgroupBroadcast<T : fiu32>(value: T, @const sourceLaneIndex: u32) -> T */
     /* num overloads */ 1,
     /* overloads */ OverloadIndex(460),
   },
diff --git a/src/tint/lang/core/type/BUILD.bazel b/src/tint/lang/core/type/BUILD.bazel
index 4103661..c36edbc 100644
--- a/src/tint/lang/core/type/BUILD.bazel
+++ b/src/tint/lang/core/type/BUILD.bazel
@@ -150,6 +150,7 @@
     "//src/tint/lang/core",
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/type",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/program",
     "//src/tint/lang/wgsl/resolver",
diff --git a/src/tint/lang/core/type/BUILD.cmake b/src/tint/lang/core/type/BUILD.cmake
index d3349e9..107db59 100644
--- a/src/tint/lang/core/type/BUILD.cmake
+++ b/src/tint/lang/core/type/BUILD.cmake
@@ -149,6 +149,7 @@
   tint_lang_core
   tint_lang_core_constant
   tint_lang_core_type
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_program
   tint_lang_wgsl_resolver
diff --git a/src/tint/lang/core/type/BUILD.gn b/src/tint/lang/core/type/BUILD.gn
index 2da1377..c80abf5 100644
--- a/src/tint/lang/core/type/BUILD.gn
+++ b/src/tint/lang/core/type/BUILD.gn
@@ -152,6 +152,7 @@
       "${tint_src_dir}/lang/core",
       "${tint_src_dir}/lang/core/constant",
       "${tint_src_dir}/lang/core/type",
+      "${tint_src_dir}/lang/wgsl",
       "${tint_src_dir}/lang/wgsl/ast",
       "${tint_src_dir}/lang/wgsl/program",
       "${tint_src_dir}/lang/wgsl/resolver",
diff --git a/src/tint/lang/glsl/writer/BUILD.bazel b/src/tint/lang/glsl/writer/BUILD.bazel
index 00cd0bd..a0e6bb2 100644
--- a/src/tint/lang/glsl/writer/BUILD.bazel
+++ b/src/tint/lang/glsl/writer/BUILD.bazel
@@ -39,6 +39,7 @@
     "//src/tint/lang/core",
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/type",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/ast/transform",
     "//src/tint/lang/wgsl/program",
@@ -79,6 +80,7 @@
     "//src/tint/lang/core",
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/type",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/program",
     "//src/tint/lang/wgsl/sem",
diff --git a/src/tint/lang/glsl/writer/BUILD.cmake b/src/tint/lang/glsl/writer/BUILD.cmake
index 3a28fff..232ff0d 100644
--- a/src/tint/lang/glsl/writer/BUILD.cmake
+++ b/src/tint/lang/glsl/writer/BUILD.cmake
@@ -44,6 +44,7 @@
   tint_lang_core
   tint_lang_core_constant
   tint_lang_core_type
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_ast_transform
   tint_lang_wgsl_program
@@ -89,6 +90,7 @@
   tint_lang_core
   tint_lang_core_constant
   tint_lang_core_type
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_program
   tint_lang_wgsl_sem
diff --git a/src/tint/lang/glsl/writer/BUILD.gn b/src/tint/lang/glsl/writer/BUILD.gn
index 96d9eb7..96574b1 100644
--- a/src/tint/lang/glsl/writer/BUILD.gn
+++ b/src/tint/lang/glsl/writer/BUILD.gn
@@ -38,6 +38,7 @@
       "${tint_src_dir}/lang/core",
       "${tint_src_dir}/lang/core/constant",
       "${tint_src_dir}/lang/core/type",
+      "${tint_src_dir}/lang/wgsl",
       "${tint_src_dir}/lang/wgsl/ast",
       "${tint_src_dir}/lang/wgsl/ast/transform",
       "${tint_src_dir}/lang/wgsl/program",
diff --git a/src/tint/lang/glsl/writer/ast_printer/BUILD.bazel b/src/tint/lang/glsl/writer/ast_printer/BUILD.bazel
index 35217ed..23ab99f 100644
--- a/src/tint/lang/glsl/writer/ast_printer/BUILD.bazel
+++ b/src/tint/lang/glsl/writer/ast_printer/BUILD.bazel
@@ -37,6 +37,7 @@
     "//src/tint/lang/core",
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/type",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/ast/transform",
     "//src/tint/lang/wgsl/helpers",
@@ -115,6 +116,7 @@
     "//src/tint/lang/core",
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/type",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/ast/transform",
     "//src/tint/lang/wgsl/ast:test",
diff --git a/src/tint/lang/glsl/writer/ast_printer/BUILD.cmake b/src/tint/lang/glsl/writer/ast_printer/BUILD.cmake
index 2addfbb..80b5a82 100644
--- a/src/tint/lang/glsl/writer/ast_printer/BUILD.cmake
+++ b/src/tint/lang/glsl/writer/ast_printer/BUILD.cmake
@@ -38,6 +38,7 @@
   tint_lang_core
   tint_lang_core_constant
   tint_lang_core_type
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_ast_transform
   tint_lang_wgsl_helpers
@@ -121,6 +122,7 @@
   tint_lang_core
   tint_lang_core_constant
   tint_lang_core_type
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_ast_transform
   tint_lang_wgsl_ast_test
diff --git a/src/tint/lang/glsl/writer/ast_printer/BUILD.gn b/src/tint/lang/glsl/writer/ast_printer/BUILD.gn
index 690ceb2..fc1c41e 100644
--- a/src/tint/lang/glsl/writer/ast_printer/BUILD.gn
+++ b/src/tint/lang/glsl/writer/ast_printer/BUILD.gn
@@ -40,6 +40,7 @@
       "${tint_src_dir}/lang/core",
       "${tint_src_dir}/lang/core/constant",
       "${tint_src_dir}/lang/core/type",
+      "${tint_src_dir}/lang/wgsl",
       "${tint_src_dir}/lang/wgsl/ast",
       "${tint_src_dir}/lang/wgsl/ast/transform",
       "${tint_src_dir}/lang/wgsl/helpers",
@@ -119,6 +120,7 @@
         "${tint_src_dir}/lang/core",
         "${tint_src_dir}/lang/core/constant",
         "${tint_src_dir}/lang/core/type",
+        "${tint_src_dir}/lang/wgsl",
         "${tint_src_dir}/lang/wgsl/ast",
         "${tint_src_dir}/lang/wgsl/ast:unittests",
         "${tint_src_dir}/lang/wgsl/ast/transform",
diff --git a/src/tint/lang/glsl/writer/ast_printer/ast_printer.cc b/src/tint/lang/glsl/writer/ast_printer/ast_printer.cc
index b99b1bd..839cdb1 100644
--- a/src/tint/lang/glsl/writer/ast_printer/ast_printer.cc
+++ b/src/tint/lang/glsl/writer/ast_printer/ast_printer.cc
@@ -280,13 +280,13 @@
     if (!tint::writer::CheckSupportedExtensions(
             "GLSL", builder_.AST(), diagnostics_,
             Vector{
-                core::Extension::kChromiumDisableUniformityAnalysis,
-                core::Extension::kChromiumExperimentalDp4A,
-                core::Extension::kChromiumExperimentalFullPtrParameters,
-                core::Extension::kChromiumInternalDualSourceBlending,
-                core::Extension::kChromiumExperimentalReadWriteStorageTexture,
-                core::Extension::kChromiumExperimentalPushConstant,
-                core::Extension::kF16,
+                wgsl::Extension::kChromiumDisableUniformityAnalysis,
+                wgsl::Extension::kChromiumExperimentalDp4A,
+                wgsl::Extension::kChromiumExperimentalFullPtrParameters,
+                wgsl::Extension::kChromiumInternalDualSourceBlending,
+                wgsl::Extension::kChromiumExperimentalReadWriteStorageTexture,
+                wgsl::Extension::kChromiumExperimentalPushConstant,
+                wgsl::Extension::kF16,
             })) {
         return false;
     }
@@ -378,11 +378,11 @@
 void ASTPrinter::RecordExtension(const ast::Enable* enable) {
     // Deal with extension node here, recording it within the generator for later emition.
 
-    if (enable->HasExtension(core::Extension::kF16)) {
+    if (enable->HasExtension(wgsl::Extension::kF16)) {
         requires_f16_extension_ = true;
     }
 
-    if (enable->HasExtension(core::Extension::kChromiumInternalDualSourceBlending)) {
+    if (enable->HasExtension(wgsl::Extension::kChromiumInternalDualSourceBlending)) {
         requires_dual_source_blending_extension_ = true;
     }
 }
diff --git a/src/tint/lang/glsl/writer/ast_printer/ast_printer_test.cc b/src/tint/lang/glsl/writer/ast_printer/ast_printer_test.cc
index e699eea..d0445c3 100644
--- a/src/tint/lang/glsl/writer/ast_printer/ast_printer_test.cc
+++ b/src/tint/lang/glsl/writer/ast_printer/ast_printer_test.cc
@@ -109,7 +109,7 @@
 }
 
 TEST_F(GlslASTPrinterTest, UnsupportedExtension) {
-    Enable(Source{{12, 34}}, core::Extension::kUndefined);
+    Enable(Source{{12, 34}}, wgsl::Extension::kUndefined);
 
     ASTPrinter& gen = Build();
 
diff --git a/src/tint/lang/glsl/writer/ast_printer/binary_test.cc b/src/tint/lang/glsl/writer/ast_printer/binary_test.cc
index f980c78..22093c5 100644
--- a/src/tint/lang/glsl/writer/ast_printer/binary_test.cc
+++ b/src/tint/lang/glsl/writer/ast_printer/binary_test.cc
@@ -76,7 +76,7 @@
         return;
     }
 
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     GlobalVar("left", ty.f16(), core::AddressSpace::kPrivate);
     GlobalVar("right", ty.f16(), core::AddressSpace::kPrivate);
@@ -178,7 +178,7 @@
 }
 
 TEST_F(GlslASTPrinterTest_Binary, Multiply_VectorScalar_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     GlobalVar("a", Call<vec3<f16>>(1_h, 1_h, 1_h), core::AddressSpace::kPrivate);
     auto* lhs = Expr("a");
@@ -214,7 +214,7 @@
 }
 
 TEST_F(GlslASTPrinterTest_Binary, Multiply_ScalarVector_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     GlobalVar("a", Call<vec3<f16>>(1_h, 1_h, 1_h), core::AddressSpace::kPrivate);
     auto* lhs = Expr(1_h);
@@ -249,7 +249,7 @@
 }
 
 TEST_F(GlslASTPrinterTest_Binary, Multiply_MatrixScalar_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     GlobalVar("mat", ty.mat3x3<f16>(), core::AddressSpace::kPrivate);
     auto* lhs = Expr("mat");
@@ -283,7 +283,7 @@
 }
 
 TEST_F(GlslASTPrinterTest_Binary, Multiply_ScalarMatrix_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     GlobalVar("mat", ty.mat3x3<f16>(), core::AddressSpace::kPrivate);
     auto* lhs = Expr(1_h);
@@ -317,7 +317,7 @@
 }
 
 TEST_F(GlslASTPrinterTest_Binary, Multiply_MatrixVector_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     GlobalVar("mat", ty.mat3x3<f16>(), core::AddressSpace::kPrivate);
     auto* lhs = Expr("mat");
@@ -351,7 +351,7 @@
 }
 
 TEST_F(GlslASTPrinterTest_Binary, Multiply_VectorMatrix_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     GlobalVar("mat", ty.mat3x3<f16>(), core::AddressSpace::kPrivate);
     auto* lhs = Call<vec3<f16>>(1_h, 1_h, 1_h);
@@ -384,7 +384,7 @@
 }
 
 TEST_F(GlslASTPrinterTest_Binary, Multiply_MatrixMatrix_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     GlobalVar("lhs", ty.mat3x3<f16>(), core::AddressSpace::kPrivate);
     GlobalVar("rhs", ty.mat3x3<f16>(), core::AddressSpace::kPrivate);
@@ -416,7 +416,7 @@
 }
 
 TEST_F(GlslASTPrinterTest_Binary, ModF16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     GlobalVar("a", ty.f16(), core::AddressSpace::kPrivate);
     GlobalVar("b", ty.f16(), core::AddressSpace::kPrivate);
@@ -448,7 +448,7 @@
 }
 
 TEST_F(GlslASTPrinterTest_Binary, ModVec3F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     GlobalVar("a", ty.vec3<f16>(), core::AddressSpace::kPrivate);
     GlobalVar("b", ty.vec3<f16>(), core::AddressSpace::kPrivate);
@@ -480,7 +480,7 @@
 }
 
 TEST_F(GlslASTPrinterTest_Binary, ModVec3F16ScalarF16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     GlobalVar("a", ty.vec3<f16>(), core::AddressSpace::kPrivate);
     GlobalVar("b", ty.f16(), core::AddressSpace::kPrivate);
@@ -512,7 +512,7 @@
 }
 
 TEST_F(GlslASTPrinterTest_Binary, ModScalarF16Vec3F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     GlobalVar("a", ty.f16(), core::AddressSpace::kPrivate);
     GlobalVar("b", ty.vec3<f16>(), core::AddressSpace::kPrivate);
@@ -572,7 +572,7 @@
 }
 
 TEST_F(GlslASTPrinterTest_Binary, ModMixedVec3ScalarF16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     GlobalVar("a", ty.vec3<f16>(), core::AddressSpace::kPrivate);
     GlobalVar("b", ty.f16(), core::AddressSpace::kPrivate);
diff --git a/src/tint/lang/glsl/writer/ast_printer/bitcast_test.cc b/src/tint/lang/glsl/writer/ast_printer/bitcast_test.cc
index 0a1de5e..f551cb7 100644
--- a/src/tint/lang/glsl/writer/ast_printer/bitcast_test.cc
+++ b/src/tint/lang/glsl/writer/ast_printer/bitcast_test.cc
@@ -66,7 +66,7 @@
 }
 
 TEST_F(GlslASTPrinterTest_Bitcast, EmitExpression_Bitcast_F16_Vec2) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* a = Let("a", Call<vec2<f16>>(1_h, 2_h));
     auto* b = Let("b", Bitcast<i32>(Expr("a")));
@@ -124,7 +124,7 @@
 }
 
 TEST_F(GlslASTPrinterTest_Bitcast, EmitExpression_Bitcast_F16_Vec4) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* a = Let("a", Call<vec4<f16>>(1_h, 2_h, 3_h, 4_h));
     auto* b = Let("b", Bitcast<vec2<i32>>(Expr("a")));
diff --git a/src/tint/lang/glsl/writer/ast_printer/builtin_test.cc b/src/tint/lang/glsl/writer/ast_printer/builtin_test.cc
index 303e78f..2694b2c 100644
--- a/src/tint/lang/glsl/writer/ast_printer/builtin_test.cc
+++ b/src/tint/lang/glsl/writer/ast_printer/builtin_test.cc
@@ -195,7 +195,7 @@
     auto param = GetParam();
 
     if (param.type == CallParamType::kF16) {
-        Enable(core::Extension::kF16);
+        Enable(wgsl::Extension::kF16);
 
         GlobalVar("h2", ty.vec2<f16>(), core::AddressSpace::kPrivate);
         GlobalVar("h3", ty.vec3<f16>(), core::AddressSpace::kPrivate);
@@ -403,7 +403,7 @@
 }
 
 TEST_F(GlslASTPrinterTest_Builtin, FMA_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     GlobalVar("a", ty.vec3<f16>(), core::AddressSpace::kPrivate);
     GlobalVar("b", ty.vec3<f16>(), core::AddressSpace::kPrivate);
@@ -457,7 +457,7 @@
 }
 
 TEST_F(GlslASTPrinterTest_Builtin, Runtime_Modf_Scalar_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     WrapInFunction(Decl(Let("f", Expr(1.5_h))),  //
                    Decl(Let("v", Call("modf", "f"))));
@@ -530,7 +530,7 @@
 }
 
 TEST_F(GlslASTPrinterTest_Builtin, Runtime_Modf_Vector_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     WrapInFunction(Decl(Let("f", Call<vec3<f16>>(1.5_h, 2.5_h, 3.5_h))),  //
                    Decl(Let("v", Call("modf", "f"))));
@@ -595,7 +595,7 @@
 }
 
 TEST_F(GlslASTPrinterTest_Builtin, Const_Modf_Scalar_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     WrapInFunction(Decl(Let("v", Call("modf", 1.5_h))));
 
@@ -652,7 +652,7 @@
 }
 
 TEST_F(GlslASTPrinterTest_Builtin, Const_Modf_Vector_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     WrapInFunction(Decl(Let("v", Call("modf", Call<vec3<f16>>(1.5_h, 2.5_h, 3.5_h)))));
 
@@ -717,7 +717,7 @@
 }
 
 TEST_F(GlslASTPrinterTest_Builtin, Runtime_Frexp_Scalar_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     WrapInFunction(Var("f", Expr(1_h)),  //
                    Var("v", Call("frexp", "f")));
@@ -790,7 +790,7 @@
 }
 
 TEST_F(GlslASTPrinterTest_Builtin, Runtime_Frexp_Vector_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     WrapInFunction(Var("f", Call<vec3<f16>>()),  //
                    Var("v", Call("frexp", "f")));
@@ -855,7 +855,7 @@
 }
 
 TEST_F(GlslASTPrinterTest_Builtin, Const_Frexp_Scalar_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     WrapInFunction(Decl(Let("v", Call("frexp", 1_h))));
 
@@ -912,7 +912,7 @@
 }
 
 TEST_F(GlslASTPrinterTest_Builtin, Const_Frexp_Vector_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     WrapInFunction(Decl(Let("v", Call("frexp", Call<vec3<f16>>()))));
 
@@ -1000,7 +1000,7 @@
 }
 
 TEST_F(GlslASTPrinterTest_Builtin, Degrees_Scalar_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* val = Var("val", ty.f16());
     auto* call = Call("degrees", val);
@@ -1032,7 +1032,7 @@
 }
 
 TEST_F(GlslASTPrinterTest_Builtin, Degrees_Vector_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* val = Var("val", ty.vec3<f16>());
     auto* call = Call("degrees", val);
@@ -1122,7 +1122,7 @@
 }
 
 TEST_F(GlslASTPrinterTest_Builtin, Radians_Scalar_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* val = Var("val", ty.f16());
     auto* call = Call("radians", val);
@@ -1154,7 +1154,7 @@
 }
 
 TEST_F(GlslASTPrinterTest_Builtin, Radians_Vector_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* val = Var("val", ty.vec3<f16>());
     auto* call = Call("radians", val);
diff --git a/src/tint/lang/glsl/writer/ast_printer/constructor_test.cc b/src/tint/lang/glsl/writer/ast_printer/constructor_test.cc
index c75cd8b..fe5faf4 100644
--- a/src/tint/lang/glsl/writer/ast_printer/constructor_test.cc
+++ b/src/tint/lang/glsl/writer/ast_printer/constructor_test.cc
@@ -62,7 +62,7 @@
 }
 
 TEST_F(GlslASTPrinterTest_Constructor, F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     // Use a number close to 1<<16 but whose decimal representation ends in 0.
     WrapInFunction(Expr(f16((1 << 15) - 8)));
@@ -83,7 +83,7 @@
 }
 
 TEST_F(GlslASTPrinterTest_Constructor, Type_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     WrapInFunction(Call<f16>(-1.2e-3_h));
 
@@ -130,7 +130,7 @@
 }
 
 TEST_F(GlslASTPrinterTest_Constructor, Type_Vec_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     WrapInFunction(Call<vec3<f16>>(1_h, 2_h, 3_h));
 
@@ -150,7 +150,7 @@
 }
 
 TEST_F(GlslASTPrinterTest_Constructor, Type_Vec_Empty_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     WrapInFunction(Call<vec3<f16>>());
 
@@ -170,7 +170,7 @@
 }
 
 TEST_F(GlslASTPrinterTest_Constructor, Type_Vec_SingleScalar_F16_Literal) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     WrapInFunction(Call<vec3<f16>>(2_h));
 
@@ -193,7 +193,7 @@
 }
 
 TEST_F(GlslASTPrinterTest_Constructor, Type_Vec_SingleScalar_F16_Var) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* var = Var("v", Expr(2_h));
     auto* cast = Call<vec3<f16>>(var);
@@ -244,7 +244,7 @@
 }
 
 TEST_F(GlslASTPrinterTest_Constructor, Type_Mat_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     WrapInFunction(
         Call<mat2x3<f16>>(Call<vec3<f16>>(1_h, 2_h, 3_h), Call<vec3<f16>>(3_h, 4_h, 5_h)));
@@ -289,7 +289,7 @@
     //     vec4<f16>(7.0h),
     //     vec4<f16>(vec4<f16>(42.0h, 21.0h, 6.0h, -5.0h)),
     //   );
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* vector_literal =
         Call<vec4<f16>>(Expr(f16(2.0)), Expr(f16(3.0)), Expr(f16(4.0)), Expr(f16(8.0)));
@@ -321,7 +321,7 @@
 }
 
 TEST_F(GlslASTPrinterTest_Constructor, Type_Mat_Empty_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     WrapInFunction(Call<mat2x3<f16>>());
 
@@ -355,7 +355,7 @@
     //     var m_2: mat4x4<f16> = mat4x4<f16>(m_1);
     // }
 
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* m_1 = Var("m_1", ty.mat4x4(ty.f16()), Call<mat4x4<f16>>());
     auto* m_2 = Var("m_2", ty.mat4x4(ty.f16()), Call<mat4x4<f16>>(m_1));
diff --git a/src/tint/lang/glsl/writer/ast_printer/module_constant_test.cc b/src/tint/lang/glsl/writer/ast_printer/module_constant_test.cc
index 32e8ace..2bf9e44 100644
--- a/src/tint/lang/glsl/writer/ast_printer/module_constant_test.cc
+++ b/src/tint/lang/glsl/writer/ast_printer/module_constant_test.cc
@@ -131,7 +131,7 @@
 }
 
 TEST_F(GlslASTPrinterTest_ModuleConstant, Emit_GlobalConst_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* var = GlobalConst("G", Expr(1_h));
     Func("f", tint::Empty, ty.void_(),
@@ -210,7 +210,7 @@
 }
 
 TEST_F(GlslASTPrinterTest_ModuleConstant, Emit_GlobalConst_vec3_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* var = GlobalConst("G", Call<vec3<f16>>(1_h, 2_h, 3_h));
     Func("f", tint::Empty, ty.void_(),
@@ -270,7 +270,7 @@
 }
 
 TEST_F(GlslASTPrinterTest_ModuleConstant, Emit_GlobalConst_mat2x3_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* var = GlobalConst("G", Call<mat2x3<f16>>(1_h, 2_h, 3_h, 4_h, 5_h, 6_h));
     Func("f", tint::Empty, ty.void_(),
diff --git a/src/tint/lang/glsl/writer/ast_printer/type_test.cc b/src/tint/lang/glsl/writer/ast_printer/type_test.cc
index 01f0738..842149a 100644
--- a/src/tint/lang/glsl/writer/ast_printer/type_test.cc
+++ b/src/tint/lang/glsl/writer/ast_printer/type_test.cc
@@ -109,7 +109,7 @@
 }
 
 TEST_F(GlslASTPrinterTest_Type, EmitType_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* f16 = create<core::type::F16>();
 
@@ -146,7 +146,7 @@
 }
 
 TEST_F(GlslASTPrinterTest_Type, EmitType_Matrix_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* f16 = create<core::type::F16>();
     auto* vec3 = create<core::type::Vector>(f16, 3u);
@@ -259,7 +259,7 @@
 }
 
 TEST_F(GlslASTPrinterTest_Type, EmitType_Vector_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* f16 = create<core::type::F16>();
     auto* vec3 = create<core::type::Vector>(f16, 3u);
diff --git a/src/tint/lang/glsl/writer/ast_printer/variable_decl_statement_test.cc b/src/tint/lang/glsl/writer/ast_printer/variable_decl_statement_test.cc
index 84f2776..d61a679 100644
--- a/src/tint/lang/glsl/writer/ast_printer/variable_decl_statement_test.cc
+++ b/src/tint/lang/glsl/writer/ast_printer/variable_decl_statement_test.cc
@@ -163,7 +163,7 @@
 }
 
 TEST_F(GlslASTPrinterTest_VariableDecl, Emit_VariableDeclStatement_Const_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* C = Const("C", Expr(1_h));
     Func("f", tint::Empty, ty.void_(),
@@ -246,7 +246,7 @@
 }
 
 TEST_F(GlslASTPrinterTest_VariableDecl, Emit_VariableDeclStatement_Const_vec3_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* C = Const("C", Call<vec3<f16>>(1_h, 2_h, 3_h));
     Func("f", tint::Empty, ty.void_(),
@@ -309,7 +309,7 @@
 }
 
 TEST_F(GlslASTPrinterTest_VariableDecl, Emit_VariableDeclStatement_Const_mat2x3_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* C = Const("C", Call<mat2x3<f16>>(1_h, 2_h, 3_h, 4_h, 5_h, 6_h));
     Func("f", tint::Empty, ty.void_(),
@@ -479,7 +479,7 @@
 }
 
 TEST_F(GlslASTPrinterTest_VariableDecl, Emit_VariableDeclStatement_Initializer_ZeroVec_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* var = Var("a", ty.vec3<f16>(), Call<vec3<f16>>());
 
@@ -508,7 +508,7 @@
 }
 
 TEST_F(GlslASTPrinterTest_VariableDecl, Emit_VariableDeclStatement_Initializer_ZeroMat_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* var = Var("a", ty.mat2x3<f16>(), Call<mat2x3<f16>>());
 
diff --git a/src/tint/lang/glsl/writer/ast_raise/BUILD.bazel b/src/tint/lang/glsl/writer/ast_raise/BUILD.bazel
index ad9c02e..a71fcf7 100644
--- a/src/tint/lang/glsl/writer/ast_raise/BUILD.bazel
+++ b/src/tint/lang/glsl/writer/ast_raise/BUILD.bazel
@@ -43,6 +43,7 @@
     "//src/tint/lang/core",
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/type",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/ast/transform",
     "//src/tint/lang/wgsl/program",
@@ -80,6 +81,7 @@
     "//src/tint/lang/core",
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/type",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/ast/transform",
     "//src/tint/lang/wgsl/ast/transform:test",
diff --git a/src/tint/lang/glsl/writer/ast_raise/BUILD.cmake b/src/tint/lang/glsl/writer/ast_raise/BUILD.cmake
index 8f3c78a..eeaa334 100644
--- a/src/tint/lang/glsl/writer/ast_raise/BUILD.cmake
+++ b/src/tint/lang/glsl/writer/ast_raise/BUILD.cmake
@@ -44,6 +44,7 @@
   tint_lang_core
   tint_lang_core_constant
   tint_lang_core_type
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_ast_transform
   tint_lang_wgsl_program
@@ -84,6 +85,7 @@
   tint_lang_core
   tint_lang_core_constant
   tint_lang_core_type
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_ast_transform
   tint_lang_wgsl_ast_transform_test
diff --git a/src/tint/lang/glsl/writer/ast_raise/BUILD.gn b/src/tint/lang/glsl/writer/ast_raise/BUILD.gn
index c0bc3b3..938e417 100644
--- a/src/tint/lang/glsl/writer/ast_raise/BUILD.gn
+++ b/src/tint/lang/glsl/writer/ast_raise/BUILD.gn
@@ -46,6 +46,7 @@
       "${tint_src_dir}/lang/core",
       "${tint_src_dir}/lang/core/constant",
       "${tint_src_dir}/lang/core/type",
+      "${tint_src_dir}/lang/wgsl",
       "${tint_src_dir}/lang/wgsl/ast",
       "${tint_src_dir}/lang/wgsl/ast/transform",
       "${tint_src_dir}/lang/wgsl/program",
@@ -84,6 +85,7 @@
         "${tint_src_dir}/lang/core",
         "${tint_src_dir}/lang/core/constant",
         "${tint_src_dir}/lang/core/type",
+        "${tint_src_dir}/lang/wgsl",
         "${tint_src_dir}/lang/wgsl/ast",
         "${tint_src_dir}/lang/wgsl/ast/transform",
         "${tint_src_dir}/lang/wgsl/ast/transform:unittests",
diff --git a/src/tint/lang/hlsl/writer/BUILD.bazel b/src/tint/lang/hlsl/writer/BUILD.bazel
index 0c9ed78..323d038 100644
--- a/src/tint/lang/hlsl/writer/BUILD.bazel
+++ b/src/tint/lang/hlsl/writer/BUILD.bazel
@@ -40,6 +40,7 @@
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/type",
     "//src/tint/lang/hlsl/writer/common",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/ast/transform",
     "//src/tint/lang/wgsl/program",
@@ -81,6 +82,7 @@
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/type",
     "//src/tint/lang/hlsl/writer/common",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/program",
     "//src/tint/lang/wgsl/sem",
diff --git a/src/tint/lang/hlsl/writer/BUILD.cmake b/src/tint/lang/hlsl/writer/BUILD.cmake
index df4dc70..887529b 100644
--- a/src/tint/lang/hlsl/writer/BUILD.cmake
+++ b/src/tint/lang/hlsl/writer/BUILD.cmake
@@ -45,6 +45,7 @@
   tint_lang_core_constant
   tint_lang_core_type
   tint_lang_hlsl_writer_common
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_ast_transform
   tint_lang_wgsl_program
@@ -91,6 +92,7 @@
   tint_lang_core_constant
   tint_lang_core_type
   tint_lang_hlsl_writer_common
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_program
   tint_lang_wgsl_sem
diff --git a/src/tint/lang/hlsl/writer/BUILD.gn b/src/tint/lang/hlsl/writer/BUILD.gn
index 62cf889..b270131 100644
--- a/src/tint/lang/hlsl/writer/BUILD.gn
+++ b/src/tint/lang/hlsl/writer/BUILD.gn
@@ -39,6 +39,7 @@
       "${tint_src_dir}/lang/core/constant",
       "${tint_src_dir}/lang/core/type",
       "${tint_src_dir}/lang/hlsl/writer/common",
+      "${tint_src_dir}/lang/wgsl",
       "${tint_src_dir}/lang/wgsl/ast",
       "${tint_src_dir}/lang/wgsl/ast/transform",
       "${tint_src_dir}/lang/wgsl/program",
diff --git a/src/tint/lang/hlsl/writer/ast_printer/BUILD.bazel b/src/tint/lang/hlsl/writer/ast_printer/BUILD.bazel
index ad2940c..ecf285b 100644
--- a/src/tint/lang/hlsl/writer/ast_printer/BUILD.bazel
+++ b/src/tint/lang/hlsl/writer/ast_printer/BUILD.bazel
@@ -38,6 +38,7 @@
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/type",
     "//src/tint/lang/hlsl/writer/common",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/ast/transform",
     "//src/tint/lang/wgsl/helpers",
@@ -110,6 +111,7 @@
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/type",
     "//src/tint/lang/hlsl/writer/common",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/ast/transform",
     "//src/tint/lang/wgsl/ast:test",
diff --git a/src/tint/lang/hlsl/writer/ast_printer/BUILD.cmake b/src/tint/lang/hlsl/writer/ast_printer/BUILD.cmake
index 5c13dec..47d9f98 100644
--- a/src/tint/lang/hlsl/writer/ast_printer/BUILD.cmake
+++ b/src/tint/lang/hlsl/writer/ast_printer/BUILD.cmake
@@ -39,6 +39,7 @@
   tint_lang_core_constant
   tint_lang_core_type
   tint_lang_hlsl_writer_common
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_ast_transform
   tint_lang_wgsl_helpers
@@ -115,6 +116,7 @@
   tint_lang_core_constant
   tint_lang_core_type
   tint_lang_hlsl_writer_common
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_ast_transform
   tint_lang_wgsl_ast_test
diff --git a/src/tint/lang/hlsl/writer/ast_printer/BUILD.gn b/src/tint/lang/hlsl/writer/ast_printer/BUILD.gn
index de41c15..017911b 100644
--- a/src/tint/lang/hlsl/writer/ast_printer/BUILD.gn
+++ b/src/tint/lang/hlsl/writer/ast_printer/BUILD.gn
@@ -41,6 +41,7 @@
       "${tint_src_dir}/lang/core/constant",
       "${tint_src_dir}/lang/core/type",
       "${tint_src_dir}/lang/hlsl/writer/common",
+      "${tint_src_dir}/lang/wgsl",
       "${tint_src_dir}/lang/wgsl/ast",
       "${tint_src_dir}/lang/wgsl/ast/transform",
       "${tint_src_dir}/lang/wgsl/helpers",
@@ -113,6 +114,7 @@
         "${tint_src_dir}/lang/core/constant",
         "${tint_src_dir}/lang/core/type",
         "${tint_src_dir}/lang/hlsl/writer/common",
+        "${tint_src_dir}/lang/wgsl",
         "${tint_src_dir}/lang/wgsl/ast",
         "${tint_src_dir}/lang/wgsl/ast:unittests",
         "${tint_src_dir}/lang/wgsl/ast/transform",
diff --git a/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc b/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc
index 1c077b1..352c4d8 100644
--- a/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc
+++ b/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc
@@ -337,14 +337,14 @@
     if (!tint::writer::CheckSupportedExtensions(
             "HLSL", builder_.AST(), diagnostics_,
             Vector{
-                core::Extension::kChromiumDisableUniformityAnalysis,
-                core::Extension::kChromiumExperimentalDp4A,
-                core::Extension::kChromiumExperimentalFullPtrParameters,
-                core::Extension::kChromiumExperimentalPushConstant,
-                core::Extension::kChromiumExperimentalReadWriteStorageTexture,
-                core::Extension::kChromiumExperimentalSubgroups,
-                core::Extension::kF16,
-                core::Extension::kChromiumInternalDualSourceBlending,
+                wgsl::Extension::kChromiumDisableUniformityAnalysis,
+                wgsl::Extension::kChromiumExperimentalDp4A,
+                wgsl::Extension::kChromiumExperimentalFullPtrParameters,
+                wgsl::Extension::kChromiumExperimentalPushConstant,
+                wgsl::Extension::kChromiumExperimentalReadWriteStorageTexture,
+                wgsl::Extension::kChromiumExperimentalSubgroups,
+                wgsl::Extension::kF16,
+                wgsl::Extension::kChromiumInternalDualSourceBlending,
             })) {
         return false;
     }
diff --git a/src/tint/lang/hlsl/writer/ast_printer/ast_printer_test.cc b/src/tint/lang/hlsl/writer/ast_printer/ast_printer_test.cc
index c8670f2..cb81bf6 100644
--- a/src/tint/lang/hlsl/writer/ast_printer/ast_printer_test.cc
+++ b/src/tint/lang/hlsl/writer/ast_printer/ast_printer_test.cc
@@ -32,7 +32,7 @@
 }
 
 TEST_F(HlslASTPrinterTest, UnsupportedExtension) {
-    Enable(Source{{12, 34}}, core::Extension::kUndefined);
+    Enable(Source{{12, 34}}, wgsl::Extension::kUndefined);
 
     ASTPrinter& gen = Build();
 
diff --git a/src/tint/lang/hlsl/writer/ast_printer/binary_test.cc b/src/tint/lang/hlsl/writer/ast_printer/binary_test.cc
index a796fbe..57494c2 100644
--- a/src/tint/lang/hlsl/writer/ast_printer/binary_test.cc
+++ b/src/tint/lang/hlsl/writer/ast_printer/binary_test.cc
@@ -84,7 +84,7 @@
         return;
     }
 
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     GlobalVar("left", ty.f16(), core::AddressSpace::kPrivate);
     GlobalVar("right", ty.f16(), core::AddressSpace::kPrivate);
@@ -192,7 +192,7 @@
 }
 
 TEST_F(HlslASTPrinterTest_Binary, Multiply_VectorScalar_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* lhs = Call<vec3<f16>>(1_h, 1_h, 1_h);
     auto* rhs = Expr(1_h);
@@ -224,7 +224,7 @@
 }
 
 TEST_F(HlslASTPrinterTest_Binary, Multiply_ScalarVector_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* lhs = Expr(1_h);
     auto* rhs = Call<vec3<f16>>(1_h, 1_h, 1_h);
@@ -256,7 +256,7 @@
 }
 
 TEST_F(HlslASTPrinterTest_Binary, Multiply_MatrixScalar_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     GlobalVar("mat", ty.mat3x3<f16>(), core::AddressSpace::kPrivate);
     auto* lhs = Expr("mat");
@@ -288,7 +288,7 @@
 }
 
 TEST_F(HlslASTPrinterTest_Binary, Multiply_ScalarMatrix_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     GlobalVar("mat", ty.mat3x3<f16>(), core::AddressSpace::kPrivate);
     auto* lhs = Expr(1_h);
@@ -320,7 +320,7 @@
 }
 
 TEST_F(HlslASTPrinterTest_Binary, Multiply_MatrixVector_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     GlobalVar("mat", ty.mat3x3<f16>(), core::AddressSpace::kPrivate);
     auto* lhs = Expr("mat");
@@ -352,7 +352,7 @@
 }
 
 TEST_F(HlslASTPrinterTest_Binary, Multiply_VectorMatrix_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     GlobalVar("mat", ty.mat3x3<f16>(), core::AddressSpace::kPrivate);
     auto* lhs = Call<vec3<f16>>(1_h, 1_h, 1_h);
@@ -383,7 +383,7 @@
 }
 
 TEST_F(HlslASTPrinterTest_Binary, Multiply_MatrixMatrix_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     GlobalVar("lhs", ty.mat3x3<f16>(), core::AddressSpace::kPrivate);
     GlobalVar("rhs", ty.mat3x3<f16>(), core::AddressSpace::kPrivate);
diff --git a/src/tint/lang/hlsl/writer/ast_printer/bitcast_test.cc b/src/tint/lang/hlsl/writer/ast_printer/bitcast_test.cc
index 5cbc27b..cf79384 100644
--- a/src/tint/lang/hlsl/writer/ast_printer/bitcast_test.cc
+++ b/src/tint/lang/hlsl/writer/ast_printer/bitcast_test.cc
@@ -62,7 +62,7 @@
 }
 
 TEST_F(HlslASTPrinterTest_Bitcast, EmitExpression_Bitcast_F16_Vec2) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* a = Let("a", Call<vec2<f16>>(1_h, 2_h));
     auto* b = Let("b", Bitcast<i32>(Expr("a")));
@@ -128,7 +128,7 @@
 }
 
 TEST_F(HlslASTPrinterTest_Bitcast, EmitExpression_Bitcast_F16_Vec4) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* a = Let("a", Call<vec4<f16>>(1_h, 2_h, 3_h, 4_h));
     auto* b = Let("b", Bitcast<vec2<i32>>(Expr("a")));
diff --git a/src/tint/lang/hlsl/writer/ast_printer/builtin_test.cc b/src/tint/lang/hlsl/writer/ast_printer/builtin_test.cc
index e673e5b..a7bbede 100644
--- a/src/tint/lang/hlsl/writer/ast_printer/builtin_test.cc
+++ b/src/tint/lang/hlsl/writer/ast_printer/builtin_test.cc
@@ -194,7 +194,7 @@
     auto param = GetParam();
 
     if (param.type == CallParamType::kF16) {
-        Enable(core::Extension::kF16);
+        Enable(wgsl::Extension::kF16);
 
         GlobalVar("h2", ty.vec2<f16>(), core::AddressSpace::kPrivate);
         GlobalVar("h3", ty.vec3<f16>(), core::AddressSpace::kPrivate);
@@ -402,7 +402,7 @@
 }
 
 TEST_F(HlslASTPrinterTest_Builtin, Runtime_Modf_Scalar_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     WrapInFunction(Decl(Let("f", Expr(1.5_h))),  //
                    Decl(Let("v", Call("modf", "f"))));
@@ -456,7 +456,7 @@
 }
 
 TEST_F(HlslASTPrinterTest_Builtin, Runtime_Modf_Vector_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     WrapInFunction(Decl(Let("f", Call<vec3<f16>>(1.5_h, 2.5_h, 3.5_h))),  //
                    Decl(Let("v", Call("modf", "f"))));
@@ -502,7 +502,7 @@
 }
 
 TEST_F(HlslASTPrinterTest_Builtin, Const_Modf_Scalar_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     WrapInFunction(Decl(Let("v", Call("modf", 1.5_h))));
 
@@ -540,7 +540,7 @@
 }
 
 TEST_F(HlslASTPrinterTest_Builtin, Const_Modf_Vector_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     WrapInFunction(Decl(Let("v", Call("modf", Call<vec3<f16>>(1.5_h, 2.5_h, 3.5_h)))));
 
@@ -613,7 +613,7 @@
 }
 
 TEST_F(HlslASTPrinterTest_Builtin, Runtime_Frexp_Scalar_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     WrapInFunction(Var("f", Expr(1_h)),  //
                    Var("v", Call("frexp", "f")));
@@ -669,7 +669,7 @@
 }
 
 TEST_F(HlslASTPrinterTest_Builtin, Runtime_Frexp_Vector_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     WrapInFunction(Var("f", Call<vec3<f16>>()),  //
                    Var("v", Call("frexp", "f")));
@@ -716,7 +716,7 @@
 }
 
 TEST_F(HlslASTPrinterTest_Builtin, Const_Frexp_Scalar_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     WrapInFunction(Decl(Let("v", Call("frexp", 1_h))));
 
@@ -754,7 +754,7 @@
 }
 
 TEST_F(HlslASTPrinterTest_Builtin, Const_Frexp_Vector_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     WrapInFunction(Decl(Let("v", Call("frexp", Call<vec3<f16>>()))));
 
@@ -842,7 +842,7 @@
 }
 
 TEST_F(HlslASTPrinterTest_Builtin, Degrees_Scalar_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* val = Var("val", ty.f16());
     auto* call = Call("degrees", val);
@@ -865,7 +865,7 @@
 }
 
 TEST_F(HlslASTPrinterTest_Builtin, Degrees_Vector_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* val = Var("val", ty.vec3<f16>());
     auto* call = Call("degrees", val);
@@ -930,7 +930,7 @@
 }
 
 TEST_F(HlslASTPrinterTest_Builtin, Radians_Scalar_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* val = Var("val", ty.f16());
     auto* call = Call("radians", val);
@@ -953,7 +953,7 @@
 }
 
 TEST_F(HlslASTPrinterTest_Builtin, Radians_Vector_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* val = Var("val", ty.vec3<f16>());
     auto* call = Call("radians", val);
@@ -1044,7 +1044,7 @@
 }
 
 TEST_F(HlslASTPrinterTest_Builtin, Sign_Scalar_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* val = Var("val", ty.f16());
     auto* call = Call("sign", val);
@@ -1063,7 +1063,7 @@
 }
 
 TEST_F(HlslASTPrinterTest_Builtin, Sign_Vector_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* val = Var("val", ty.vec3<f16>());
     auto* call = Call("sign", val);
@@ -1124,7 +1124,7 @@
 }
 
 TEST_F(HlslASTPrinterTest_Builtin, Trunc_Scalar_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* val = Var("val", ty.f16());
     auto* call = Call("trunc", val);
@@ -1147,7 +1147,7 @@
 }
 
 TEST_F(HlslASTPrinterTest_Builtin, Trunc_Vector_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* val = Var("val", ty.vec3<f16>());
     auto* call = Call("trunc", val);
@@ -1436,7 +1436,7 @@
 }
 
 TEST_F(HlslASTPrinterTest_Builtin, Dot4I8Packed) {
-    Enable(core::Extension::kChromiumExperimentalDp4A);
+    Enable(wgsl::Extension::kChromiumExperimentalDp4A);
 
     auto* val1 = Var("val1", ty.u32());
     auto* val2 = Var("val2", ty.u32());
@@ -1462,7 +1462,7 @@
 }
 
 TEST_F(HlslASTPrinterTest_Builtin, Dot4U8Packed) {
-    Enable(core::Extension::kChromiumExperimentalDp4A);
+    Enable(wgsl::Extension::kChromiumExperimentalDp4A);
 
     auto* val1 = Var("val1", ty.u32());
     auto* val2 = Var("val2", ty.u32());
diff --git a/src/tint/lang/hlsl/writer/ast_printer/constructor_test.cc b/src/tint/lang/hlsl/writer/ast_printer/constructor_test.cc
index c249b08..d4110e5 100644
--- a/src/tint/lang/hlsl/writer/ast_printer/constructor_test.cc
+++ b/src/tint/lang/hlsl/writer/ast_printer/constructor_test.cc
@@ -62,7 +62,7 @@
 }
 
 TEST_F(HlslASTPrinterTest_Constructor, F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     // Use a number close to 1<<16 but whose decimal representation ends in 0.
     WrapInFunction(Expr(f16((1 << 15) - 8)));
@@ -83,7 +83,7 @@
 }
 
 TEST_F(HlslASTPrinterTest_Constructor, Type_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     WrapInFunction(Call<f16>(-1.2e-3_h));
 
@@ -130,7 +130,7 @@
 }
 
 TEST_F(HlslASTPrinterTest_Constructor, Type_Vec_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     WrapInFunction(Call<vec3<f16>>(1_h, 2_h, 3_h));
 
@@ -152,7 +152,7 @@
 }
 
 TEST_F(HlslASTPrinterTest_Constructor, Type_Vec_Empty_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     WrapInFunction(Call<vec3<f16>>());
 
@@ -172,7 +172,7 @@
 }
 
 TEST_F(HlslASTPrinterTest_Constructor, Type_Vec_SingleScalar_F16_Literal) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     WrapInFunction(Call<vec3<f16>>(2_h));
 
@@ -195,7 +195,7 @@
 }
 
 TEST_F(HlslASTPrinterTest_Constructor, Type_Vec_SingleScalar_F16_Var) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* var = Var("v", Expr(2_h));
     auto* cast = Call<vec3<f16>>(var);
@@ -260,7 +260,7 @@
 }
 
 TEST_F(HlslASTPrinterTest_Constructor, Type_Mat_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     WrapInFunction(
         Call<mat2x3<f16>>(Call<vec3<f16>>(1_h, 2_h, 3_h), Call<vec3<f16>>(3_h, 4_h, 5_h)));
@@ -308,7 +308,7 @@
     //     vec4<f16>(7.0h),
     //     vec4<f16>(vec4<f16>(42.0h, 21.0h, 6.0h, -5.0h)),
     //   );
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* vector_literal = Call<vec4<f16>>(f16(2.0), f16(3.0), f16(4.0), f16(8.0));
     auto* vector_zero_init = Call<vec4<f16>>();
@@ -344,7 +344,7 @@
 }
 
 TEST_F(HlslASTPrinterTest_Constructor, Type_Mat_Empty_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     WrapInFunction(Call<mat2x3<f16>>());
 
@@ -380,7 +380,7 @@
     //     var m_2: mat4x4<f16> = mat4x4<f16>(m_1);
     // }
 
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* m_1 = Var("m_1", ty.mat4x4(ty.f16()), Call<mat4x4<f16>>());
     auto* m_2 = Var("m_2", ty.mat4x4(ty.f16()), Call<mat4x4<f16>>(m_1));
diff --git a/src/tint/lang/hlsl/writer/ast_printer/member_accessor_test.cc b/src/tint/lang/hlsl/writer/ast_printer/member_accessor_test.cc
index 81633c8..5c040c1 100644
--- a/src/tint/lang/hlsl/writer/ast_printer/member_accessor_test.cc
+++ b/src/tint/lang/hlsl/writer/ast_printer/member_accessor_test.cc
@@ -166,7 +166,7 @@
 
     auto p = GetParam();
 
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     SetupStorageBuffer(Vector{
         Member("a", ty.i32()),
@@ -301,7 +301,7 @@
 
     auto p = GetParam();
 
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* inner = Structure("Inner", Vector{
                                          Member("a", ty.i32()),
@@ -440,7 +440,7 @@
 
     auto p = GetParam();
 
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     SetupUniformBuffer(Vector{
         Member("a", ty.i32()),
@@ -708,7 +708,7 @@
 
     auto p = GetParam();
 
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* inner = Structure("Inner", Vector{
                                          Member("a", ty.i32()),
@@ -990,7 +990,7 @@
 
     auto p = GetParam();
 
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     SetupStorageBuffer(Vector{
         Member("a", ty.i32()),
@@ -1195,7 +1195,7 @@
     // var<storage> data : Data;
     // data.a[2i][1i];
 
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     SetupStorageBuffer(Vector{
         Member("z", ty.f16()),
@@ -1261,7 +1261,7 @@
     // var<uniform> data : Data;
     // data.a[2i][1i];
 
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     SetupUniformBuffer(Vector{
         Member("z", ty.f16()),
diff --git a/src/tint/lang/hlsl/writer/ast_printer/module_constant_test.cc b/src/tint/lang/hlsl/writer/ast_printer/module_constant_test.cc
index aa397b0..4916207 100644
--- a/src/tint/lang/hlsl/writer/ast_printer/module_constant_test.cc
+++ b/src/tint/lang/hlsl/writer/ast_printer/module_constant_test.cc
@@ -94,7 +94,7 @@
 }
 
 TEST_F(HlslASTPrinterTest_ModuleConstant, Emit_GlobalConst_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* var = GlobalConst("G", Expr(1_h));
     Func("f", tint::Empty, ty.void_(), Vector{Decl(Let("l", Expr(var)))});
@@ -152,7 +152,7 @@
 }
 
 TEST_F(HlslASTPrinterTest_ModuleConstant, Emit_GlobalConst_vec3_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* var = GlobalConst("G", Call<vec3<f16>>(1_h, 2_h, 3_h));
     Func("f", tint::Empty, ty.void_(), Vector{Decl(Let("l", Expr(var)))});
@@ -196,7 +196,7 @@
 }
 
 TEST_F(HlslASTPrinterTest_ModuleConstant, Emit_GlobalConst_mat2x3_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* var = GlobalConst("G", Call<mat2x3<f16>>(1_h, 2_h, 3_h, 4_h, 5_h, 6_h));
     Func("f", tint::Empty, ty.void_(), Vector{Decl(Let("l", Expr(var)))});
diff --git a/src/tint/lang/hlsl/writer/ast_printer/variable_decl_statement_test.cc b/src/tint/lang/hlsl/writer/ast_printer/variable_decl_statement_test.cc
index 2da3410..41821f0 100644
--- a/src/tint/lang/hlsl/writer/ast_printer/variable_decl_statement_test.cc
+++ b/src/tint/lang/hlsl/writer/ast_printer/variable_decl_statement_test.cc
@@ -156,7 +156,7 @@
 }
 
 TEST_F(HlslASTPrinterTest_VariableDecl, Emit_VariableDeclStatement_Const_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* C = Const("C", Expr(1_h));
     Func("f", tint::Empty, ty.void_(),
@@ -230,7 +230,7 @@
 }
 
 TEST_F(HlslASTPrinterTest_VariableDecl, Emit_VariableDeclStatement_Const_vec3_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* C = Const("C", Call<vec3<f16>>(1_h, 2_h, 3_h));
     Func("f", tint::Empty, ty.void_(),
@@ -286,7 +286,7 @@
 }
 
 TEST_F(HlslASTPrinterTest_VariableDecl, Emit_VariableDeclStatement_Const_mat2x3_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* C = Const("C", Call<mat2x3<f16>>(1_h, 2_h, 3_h, 4_h, 5_h, 6_h));
     Func("f", tint::Empty, ty.void_(),
@@ -384,7 +384,7 @@
 }
 
 TEST_F(HlslASTPrinterTest_VariableDecl, Emit_VariableDeclStatement_Initializer_ZeroVec_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* var = Var("a", ty.vec3<f16>(), Call<vec3<f16>>());
 
@@ -413,7 +413,7 @@
 }
 
 TEST_F(HlslASTPrinterTest_VariableDecl, Emit_VariableDeclStatement_Initializer_ZeroMat_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* var = Var("a", ty.mat2x3<f16>(), Call<mat2x3<f16>>());
 
diff --git a/src/tint/lang/hlsl/writer/ast_raise/BUILD.bazel b/src/tint/lang/hlsl/writer/ast_raise/BUILD.bazel
index 87be9ba..f6333e6 100644
--- a/src/tint/lang/hlsl/writer/ast_raise/BUILD.bazel
+++ b/src/tint/lang/hlsl/writer/ast_raise/BUILD.bazel
@@ -46,6 +46,7 @@
     "//src/tint/lang/core",
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/type",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/ast/transform",
     "//src/tint/lang/wgsl/program",
@@ -84,6 +85,7 @@
     "//src/tint/lang/core",
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/type",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/ast/transform",
     "//src/tint/lang/wgsl/ast/transform:test",
diff --git a/src/tint/lang/hlsl/writer/ast_raise/BUILD.cmake b/src/tint/lang/hlsl/writer/ast_raise/BUILD.cmake
index 6e3e1f0..d7b7107 100644
--- a/src/tint/lang/hlsl/writer/ast_raise/BUILD.cmake
+++ b/src/tint/lang/hlsl/writer/ast_raise/BUILD.cmake
@@ -47,6 +47,7 @@
   tint_lang_core
   tint_lang_core_constant
   tint_lang_core_type
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_ast_transform
   tint_lang_wgsl_program
@@ -88,6 +89,7 @@
   tint_lang_core
   tint_lang_core_constant
   tint_lang_core_type
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_ast_transform
   tint_lang_wgsl_ast_transform_test
diff --git a/src/tint/lang/hlsl/writer/ast_raise/BUILD.gn b/src/tint/lang/hlsl/writer/ast_raise/BUILD.gn
index 89f2e4b..b7e2eef 100644
--- a/src/tint/lang/hlsl/writer/ast_raise/BUILD.gn
+++ b/src/tint/lang/hlsl/writer/ast_raise/BUILD.gn
@@ -49,6 +49,7 @@
       "${tint_src_dir}/lang/core",
       "${tint_src_dir}/lang/core/constant",
       "${tint_src_dir}/lang/core/type",
+      "${tint_src_dir}/lang/wgsl",
       "${tint_src_dir}/lang/wgsl/ast",
       "${tint_src_dir}/lang/wgsl/ast/transform",
       "${tint_src_dir}/lang/wgsl/program",
@@ -88,6 +89,7 @@
         "${tint_src_dir}/lang/core",
         "${tint_src_dir}/lang/core/constant",
         "${tint_src_dir}/lang/core/type",
+        "${tint_src_dir}/lang/wgsl",
         "${tint_src_dir}/lang/wgsl/ast",
         "${tint_src_dir}/lang/wgsl/ast/transform",
         "${tint_src_dir}/lang/wgsl/ast/transform:unittests",
diff --git a/src/tint/lang/msl/validate/BUILD.bazel b/src/tint/lang/msl/validate/BUILD.bazel
index cd91a04..941ee92 100644
--- a/src/tint/lang/msl/validate/BUILD.bazel
+++ b/src/tint/lang/msl/validate/BUILD.bazel
@@ -40,6 +40,7 @@
     "//src/tint/lang/core",
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/type",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/program",
     "//src/tint/lang/wgsl/sem",
diff --git a/src/tint/lang/msl/validate/BUILD.cmake b/src/tint/lang/msl/validate/BUILD.cmake
index 9f3c0a5..e380067 100644
--- a/src/tint/lang/msl/validate/BUILD.cmake
+++ b/src/tint/lang/msl/validate/BUILD.cmake
@@ -36,6 +36,7 @@
   tint_lang_core
   tint_lang_core_constant
   tint_lang_core_type
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_program
   tint_lang_wgsl_sem
diff --git a/src/tint/lang/msl/validate/BUILD.gn b/src/tint/lang/msl/validate/BUILD.gn
index 6408a5f..c386530 100644
--- a/src/tint/lang/msl/validate/BUILD.gn
+++ b/src/tint/lang/msl/validate/BUILD.gn
@@ -34,6 +34,7 @@
       "${tint_src_dir}/lang/core",
       "${tint_src_dir}/lang/core/constant",
       "${tint_src_dir}/lang/core/type",
+      "${tint_src_dir}/lang/wgsl",
       "${tint_src_dir}/lang/wgsl/ast",
       "${tint_src_dir}/lang/wgsl/program",
       "${tint_src_dir}/lang/wgsl/sem",
diff --git a/src/tint/lang/msl/writer/BUILD.bazel b/src/tint/lang/msl/writer/BUILD.bazel
index 1d5f3c4..b3e89ef 100644
--- a/src/tint/lang/msl/writer/BUILD.bazel
+++ b/src/tint/lang/msl/writer/BUILD.bazel
@@ -41,6 +41,7 @@
     "//src/tint/lang/core/ir",
     "//src/tint/lang/core/type",
     "//src/tint/lang/msl/writer/raise",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/program",
     "//src/tint/lang/wgsl/reader/program_to_ir",
@@ -82,6 +83,7 @@
     "//src/tint/lang/core",
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/type",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/program",
     "//src/tint/lang/wgsl/sem",
diff --git a/src/tint/lang/msl/writer/BUILD.cmake b/src/tint/lang/msl/writer/BUILD.cmake
index b8bbc1d..15752d1 100644
--- a/src/tint/lang/msl/writer/BUILD.cmake
+++ b/src/tint/lang/msl/writer/BUILD.cmake
@@ -48,6 +48,7 @@
   tint_lang_core_ir
   tint_lang_core_type
   tint_lang_msl_writer_raise
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_program
   tint_lang_wgsl_reader_program_to_ir
@@ -94,6 +95,7 @@
   tint_lang_core
   tint_lang_core_constant
   tint_lang_core_type
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_program
   tint_lang_wgsl_sem
diff --git a/src/tint/lang/msl/writer/BUILD.gn b/src/tint/lang/msl/writer/BUILD.gn
index 695bc61..560486c 100644
--- a/src/tint/lang/msl/writer/BUILD.gn
+++ b/src/tint/lang/msl/writer/BUILD.gn
@@ -40,6 +40,7 @@
       "${tint_src_dir}/lang/core/ir",
       "${tint_src_dir}/lang/core/type",
       "${tint_src_dir}/lang/msl/writer/raise",
+      "${tint_src_dir}/lang/wgsl",
       "${tint_src_dir}/lang/wgsl/ast",
       "${tint_src_dir}/lang/wgsl/program",
       "${tint_src_dir}/lang/wgsl/reader/program_to_ir",
diff --git a/src/tint/lang/msl/writer/ast_printer/BUILD.bazel b/src/tint/lang/msl/writer/ast_printer/BUILD.bazel
index b061b09..4e43481 100644
--- a/src/tint/lang/msl/writer/ast_printer/BUILD.bazel
+++ b/src/tint/lang/msl/writer/ast_printer/BUILD.bazel
@@ -37,6 +37,7 @@
     "//src/tint/lang/core",
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/type",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/ast/transform",
     "//src/tint/lang/wgsl/helpers",
@@ -107,6 +108,7 @@
     "//src/tint/lang/core",
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/type",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/ast:test",
     "//src/tint/lang/wgsl/program",
diff --git a/src/tint/lang/msl/writer/ast_printer/BUILD.cmake b/src/tint/lang/msl/writer/ast_printer/BUILD.cmake
index 4db100e..40a6b6d 100644
--- a/src/tint/lang/msl/writer/ast_printer/BUILD.cmake
+++ b/src/tint/lang/msl/writer/ast_printer/BUILD.cmake
@@ -38,6 +38,7 @@
   tint_lang_core
   tint_lang_core_constant
   tint_lang_core_type
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_ast_transform
   tint_lang_wgsl_helpers
@@ -112,6 +113,7 @@
   tint_lang_core
   tint_lang_core_constant
   tint_lang_core_type
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_ast_test
   tint_lang_wgsl_program
diff --git a/src/tint/lang/msl/writer/ast_printer/BUILD.gn b/src/tint/lang/msl/writer/ast_printer/BUILD.gn
index 6622f41..072b550 100644
--- a/src/tint/lang/msl/writer/ast_printer/BUILD.gn
+++ b/src/tint/lang/msl/writer/ast_printer/BUILD.gn
@@ -40,6 +40,7 @@
       "${tint_src_dir}/lang/core",
       "${tint_src_dir}/lang/core/constant",
       "${tint_src_dir}/lang/core/type",
+      "${tint_src_dir}/lang/wgsl",
       "${tint_src_dir}/lang/wgsl/ast",
       "${tint_src_dir}/lang/wgsl/ast/transform",
       "${tint_src_dir}/lang/wgsl/helpers",
@@ -112,6 +113,7 @@
         "${tint_src_dir}/lang/core",
         "${tint_src_dir}/lang/core/constant",
         "${tint_src_dir}/lang/core/type",
+        "${tint_src_dir}/lang/wgsl",
         "${tint_src_dir}/lang/wgsl/ast",
         "${tint_src_dir}/lang/wgsl/ast:unittests",
         "${tint_src_dir}/lang/wgsl/program",
diff --git a/src/tint/lang/msl/writer/ast_printer/ast_printer.cc b/src/tint/lang/msl/writer/ast_printer/ast_printer.cc
index 22fd118..8dced2c 100644
--- a/src/tint/lang/msl/writer/ast_printer/ast_printer.cc
+++ b/src/tint/lang/msl/writer/ast_printer/ast_printer.cc
@@ -257,16 +257,16 @@
     if (!tint::writer::CheckSupportedExtensions(
             "MSL", builder_.AST(), diagnostics_,
             Vector{
-                core::Extension::kChromiumDisableUniformityAnalysis,
-                core::Extension::kChromiumExperimentalDp4A,
-                core::Extension::kChromiumExperimentalFullPtrParameters,
-                core::Extension::kChromiumExperimentalPixelLocal,
-                core::Extension::kChromiumExperimentalPushConstant,
-                core::Extension::kChromiumExperimentalReadWriteStorageTexture,
-                core::Extension::kChromiumExperimentalSubgroups,
-                core::Extension::kChromiumInternalDualSourceBlending,
-                core::Extension::kChromiumInternalRelaxedUniformLayout,
-                core::Extension::kF16,
+                wgsl::Extension::kChromiumDisableUniformityAnalysis,
+                wgsl::Extension::kChromiumExperimentalDp4A,
+                wgsl::Extension::kChromiumExperimentalFullPtrParameters,
+                wgsl::Extension::kChromiumExperimentalPixelLocal,
+                wgsl::Extension::kChromiumExperimentalPushConstant,
+                wgsl::Extension::kChromiumExperimentalReadWriteStorageTexture,
+                wgsl::Extension::kChromiumExperimentalSubgroups,
+                wgsl::Extension::kChromiumInternalDualSourceBlending,
+                wgsl::Extension::kChromiumInternalRelaxedUniformLayout,
+                wgsl::Extension::kF16,
             })) {
         return false;
     }
diff --git a/src/tint/lang/msl/writer/ast_printer/ast_printer_test.cc b/src/tint/lang/msl/writer/ast_printer/ast_printer_test.cc
index 7e21d8a..a6d092f 100644
--- a/src/tint/lang/msl/writer/ast_printer/ast_printer_test.cc
+++ b/src/tint/lang/msl/writer/ast_printer/ast_printer_test.cc
@@ -36,7 +36,7 @@
 }
 
 TEST_F(MslASTPrinterTest, UnsupportedExtension) {
-    Enable(Source{{12, 34}}, core::Extension::kUndefined);
+    Enable(Source{{12, 34}}, wgsl::Extension::kUndefined);
 
     ASTPrinter& gen = Build();
 
diff --git a/src/tint/lang/msl/writer/ast_printer/binary_test.cc b/src/tint/lang/msl/writer/ast_printer/binary_test.cc
index c0c741a..52ac50d 100644
--- a/src/tint/lang/msl/writer/ast_printer/binary_test.cc
+++ b/src/tint/lang/msl/writer/ast_printer/binary_test.cc
@@ -161,7 +161,7 @@
 }
 
 TEST_F(MslBinaryTest, ModF16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* left = Var("left", ty.f16());
     auto* right = Var("right", ty.f16());
@@ -189,7 +189,7 @@
 }
 
 TEST_F(MslBinaryTest, ModVec3F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* left = Var("left", ty.vec3<f16>());
     auto* right = Var("right", ty.vec3<f16>());
diff --git a/src/tint/lang/msl/writer/ast_printer/builtin_test.cc b/src/tint/lang/msl/writer/ast_printer/builtin_test.cc
index 67caae0..f596fd5 100644
--- a/src/tint/lang/msl/writer/ast_printer/builtin_test.cc
+++ b/src/tint/lang/msl/writer/ast_printer/builtin_test.cc
@@ -214,7 +214,7 @@
     auto param = GetParam();
 
     if (param.type == CallParamType::kF16) {
-        Enable(core::Extension::kF16);
+        Enable(wgsl::Extension::kF16);
 
         GlobalVar("h2", ty.vec2<f16>(), core::AddressSpace::kPrivate);
         GlobalVar("h3", ty.vec3<f16>(), core::AddressSpace::kPrivate);
@@ -438,7 +438,7 @@
 }
 
 TEST_F(MslASTPrinterTest, Runtime_Modf_Scalar_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     WrapInFunction(Decl(Let("f", Expr(1.5_h))),  //
                    Decl(Let("v", Call("modf", "f"))));
@@ -500,7 +500,7 @@
 }
 
 TEST_F(MslASTPrinterTest, Runtime_Modf_Vector_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     WrapInFunction(Decl(Let("f", Call<vec3<f16>>(1.5_h, 2.5_h, 3.5_h))),  //
                    Decl(Let("v", Call("modf", "f"))));
@@ -554,7 +554,7 @@
 }
 
 TEST_F(MslASTPrinterTest, Const_Modf_Scalar_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     WrapInFunction(Decl(Let("v", Call("modf", 1.5_h))));
 
@@ -600,7 +600,7 @@
 }
 
 TEST_F(MslASTPrinterTest, Const_Modf_Vector_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     WrapInFunction(Decl(Let("v", Call("modf", Call<vec3<f16>>(1.5_h, 2.5_h, 3.5_h)))));
 
@@ -654,7 +654,7 @@
 }
 
 TEST_F(MslASTPrinterTest, Runtime_Frexp_Scalar_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     WrapInFunction(Var("f", Expr(1_h)),  //
                    Var("v", Call("frexp", "f")));
@@ -716,7 +716,7 @@
 }
 
 TEST_F(MslASTPrinterTest, Runtime_Frexp_Vector_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     WrapInFunction(Var("f", Call<vec3<f16>>()),  //
                    Var("v", Call("frexp", "f")));
@@ -770,7 +770,7 @@
 }
 
 TEST_F(MslASTPrinterTest, Const_Frexp_Scalar_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     WrapInFunction(Decl(Let("v", Call("frexp", 1_h))));
 
@@ -816,7 +816,7 @@
 }
 
 TEST_F(MslASTPrinterTest, Const_Frexp_Vector_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     WrapInFunction(Decl(Let("v", Call("frexp", Call<vec3<f16>>()))));
 
@@ -890,7 +890,7 @@
 }
 
 TEST_F(MslASTPrinterTest, Degrees_Scalar_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* val = Var("val", ty.f16());
     auto* call = Call("degrees", val);
@@ -917,7 +917,7 @@
 }
 
 TEST_F(MslASTPrinterTest, Degrees_Vector_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* val = Var("val", ty.vec3<f16>());
     auto* call = Call("degrees", val);
@@ -994,7 +994,7 @@
 }
 
 TEST_F(MslASTPrinterTest, Radians_Scalar_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* val = Var("val", ty.f16());
     auto* call = Call("radians", val);
@@ -1021,7 +1021,7 @@
 }
 
 TEST_F(MslASTPrinterTest, Radians_Vector_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* val = Var("val", ty.vec3<f16>());
     auto* call = Call("radians", val);
diff --git a/src/tint/lang/msl/writer/ast_printer/constructor_test.cc b/src/tint/lang/msl/writer/ast_printer/constructor_test.cc
index 214a147..67fe95f 100644
--- a/src/tint/lang/msl/writer/ast_printer/constructor_test.cc
+++ b/src/tint/lang/msl/writer/ast_printer/constructor_test.cc
@@ -62,7 +62,7 @@
 }
 
 TEST_F(MslASTPrinterTest_Constructor, F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     // Use a number close to 1<<16 but whose decimal representation ends in 0.
     WrapInFunction(Expr(f16((1 << 15) - 8)));
@@ -83,7 +83,7 @@
 }
 
 TEST_F(MslASTPrinterTest_Constructor, Type_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     WrapInFunction(Call<f16>(-1.2e-3_h));
 
@@ -130,7 +130,7 @@
 }
 
 TEST_F(MslASTPrinterTest_Constructor, Type_Vec_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     WrapInFunction(Call<vec3<f16>>(1_h, 2_h, 3_h));
 
@@ -150,7 +150,7 @@
 }
 
 TEST_F(MslASTPrinterTest_Constructor, Type_Vec_Empty_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     WrapInFunction(Call<vec3<f16>>());
 
@@ -170,7 +170,7 @@
 }
 
 TEST_F(MslASTPrinterTest_Constructor, Type_Vec_SingleScalar_F16_Literal) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     WrapInFunction(Call<vec3<f16>>(2_h));
 
@@ -193,7 +193,7 @@
 }
 
 TEST_F(MslASTPrinterTest_Constructor, Type_Vec_SingleScalar_F16_Var) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* var = Var("v", Expr(2_h));
     auto* cast = Call<vec3<f16>>(var);
@@ -246,7 +246,7 @@
 }
 
 TEST_F(MslASTPrinterTest_Constructor, Type_Mat_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     WrapInFunction(
         Call<mat2x3<f16>>(Call<vec3<f16>>(1_h, 2_h, 3_h), Call<vec3<f16>>(3_h, 4_h, 5_h)));
@@ -292,7 +292,7 @@
     //     vec4<f16>(7.0h),
     //     vec4<f16>(vec4<f16>(42.0h, 21.0h, 6.0h, -5.0h)),
     //   );
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* vector_literal = Call<vec4<f16>>(f16(2.0), f16(3.0), f16(4.0), f16(8.0));
     auto* vector_zero_init = Call<vec4<f16>>();
@@ -325,7 +325,7 @@
 }
 
 TEST_F(MslASTPrinterTest_Constructor, Type_Mat_Empty_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     WrapInFunction(Call<mat2x3<f16>>());
 
@@ -361,7 +361,7 @@
     //     var m_2: mat4x4<f16> = mat4x4<f16>(m_1);
     // }
 
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* m_1 = Var("m_1", ty.mat4x4(ty.f16()), Call<mat4x4<f16>>());
     auto* m_2 = Var("m_2", ty.mat4x4(ty.f16()), Call<mat4x4<f16>>(m_1));
diff --git a/src/tint/lang/msl/writer/ast_printer/module_constant_test.cc b/src/tint/lang/msl/writer/ast_printer/module_constant_test.cc
index cef8f57..73e8563 100644
--- a/src/tint/lang/msl/writer/ast_printer/module_constant_test.cc
+++ b/src/tint/lang/msl/writer/ast_printer/module_constant_test.cc
@@ -114,7 +114,7 @@
 }
 
 TEST_F(MslASTPrinterTest, Emit_GlobalConst_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* var = GlobalConst("G", Expr(1_h));
     Func("f", tint::Empty, ty.void_(), Vector{Decl(Let("l", Expr(var)))});
@@ -188,7 +188,7 @@
 }
 
 TEST_F(MslASTPrinterTest, Emit_GlobalConst_vec3_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* var = GlobalConst("G", Call<vec3<f16>>(1_h, 2_h, 3_h));
     Func("f", tint::Empty, ty.void_(), Vector{Decl(Let("l", Expr(var)))});
@@ -244,7 +244,7 @@
 }
 
 TEST_F(MslASTPrinterTest, Emit_GlobalConst_mat2x3_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* var = GlobalConst("G", Call<mat2x3<f16>>(1_h, 2_h, 3_h, 4_h, 5_h, 6_h));
     Func("f", tint::Empty, ty.void_(), Vector{Decl(Let("l", Expr(var)))});
diff --git a/src/tint/lang/msl/writer/ast_printer/variable_decl_statement_test.cc b/src/tint/lang/msl/writer/ast_printer/variable_decl_statement_test.cc
index 7024032..4925919 100644
--- a/src/tint/lang/msl/writer/ast_printer/variable_decl_statement_test.cc
+++ b/src/tint/lang/msl/writer/ast_printer/variable_decl_statement_test.cc
@@ -155,7 +155,7 @@
 }
 
 TEST_F(MslASTPrinterTest, Emit_VariableDeclStatement_Const_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* C = Const("C", Expr(1_h));
     Func("f", tint::Empty, ty.void_(), Vector{Decl(C), Decl(Let("l", Expr(C)))});
@@ -229,7 +229,7 @@
 }
 
 TEST_F(MslASTPrinterTest, Emit_VariableDeclStatement_Const_vec3_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* C = Const("C", Call<vec3<f16>>(1_h, 2_h, 3_h));
     Func("f", tint::Empty, ty.void_(), Vector{Decl(C), Decl(Let("l", Expr(C)))});
@@ -285,7 +285,7 @@
 }
 
 TEST_F(MslASTPrinterTest, Emit_VariableDeclStatement_Const_mat2x3_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* C = Const("C", Call<mat2x3<f16>>(1_h, 2_h, 3_h, 4_h, 5_h, 6_h));
     Func("f", tint::Empty, ty.void_(), Vector{Decl(C), Decl(Let("l", Expr(C)))});
@@ -415,7 +415,7 @@
 }
 
 TEST_F(MslASTPrinterTest, Emit_VariableDeclStatement_Vector_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* var = Var("a", ty.vec2<f16>());
     auto* stmt = Decl(var);
@@ -444,7 +444,7 @@
 }
 
 TEST_F(MslASTPrinterTest, Emit_VariableDeclStatement_Matrix_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* var = Var("a", ty.mat3x2<f16>());
 
@@ -473,7 +473,7 @@
 }
 
 TEST_F(MslASTPrinterTest, Emit_VariableDeclStatement_Initializer_ZeroVec_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* var = Var("a", ty.vec3<f16>(), Call<vec3<f16>>());
 
@@ -502,7 +502,7 @@
 }
 
 TEST_F(MslASTPrinterTest, Emit_VariableDeclStatement_Initializer_ZeroMat_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* var = Var("a", ty.mat2x3<f16>(), Call<mat2x3<f16>>());
 
diff --git a/src/tint/lang/msl/writer/ast_raise/BUILD.bazel b/src/tint/lang/msl/writer/ast_raise/BUILD.bazel
index 0b080b5..e2b25c8 100644
--- a/src/tint/lang/msl/writer/ast_raise/BUILD.bazel
+++ b/src/tint/lang/msl/writer/ast_raise/BUILD.bazel
@@ -42,6 +42,7 @@
     "//src/tint/lang/core",
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/type",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/ast/transform",
     "//src/tint/lang/wgsl/program",
@@ -78,6 +79,7 @@
     "//src/tint/lang/core",
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/type",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/ast/transform",
     "//src/tint/lang/wgsl/ast/transform:test",
diff --git a/src/tint/lang/msl/writer/ast_raise/BUILD.cmake b/src/tint/lang/msl/writer/ast_raise/BUILD.cmake
index 56fe8bd..54b8337 100644
--- a/src/tint/lang/msl/writer/ast_raise/BUILD.cmake
+++ b/src/tint/lang/msl/writer/ast_raise/BUILD.cmake
@@ -43,6 +43,7 @@
   tint_lang_core
   tint_lang_core_constant
   tint_lang_core_type
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_ast_transform
   tint_lang_wgsl_program
@@ -82,6 +83,7 @@
   tint_lang_core
   tint_lang_core_constant
   tint_lang_core_type
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_ast_transform
   tint_lang_wgsl_ast_transform_test
diff --git a/src/tint/lang/msl/writer/ast_raise/BUILD.gn b/src/tint/lang/msl/writer/ast_raise/BUILD.gn
index f6890c2..bb16eaa 100644
--- a/src/tint/lang/msl/writer/ast_raise/BUILD.gn
+++ b/src/tint/lang/msl/writer/ast_raise/BUILD.gn
@@ -45,6 +45,7 @@
       "${tint_src_dir}/lang/core",
       "${tint_src_dir}/lang/core/constant",
       "${tint_src_dir}/lang/core/type",
+      "${tint_src_dir}/lang/wgsl",
       "${tint_src_dir}/lang/wgsl/ast",
       "${tint_src_dir}/lang/wgsl/ast/transform",
       "${tint_src_dir}/lang/wgsl/program",
@@ -82,6 +83,7 @@
         "${tint_src_dir}/lang/core",
         "${tint_src_dir}/lang/core/constant",
         "${tint_src_dir}/lang/core/type",
+        "${tint_src_dir}/lang/wgsl",
         "${tint_src_dir}/lang/wgsl/ast",
         "${tint_src_dir}/lang/wgsl/ast/transform",
         "${tint_src_dir}/lang/wgsl/ast/transform:unittests",
diff --git a/src/tint/lang/msl/writer/ast_raise/module_scope_var_to_entry_point_param.cc b/src/tint/lang/msl/writer/ast_raise/module_scope_var_to_entry_point_param.cc
index 4e529a2..ef07aa9 100644
--- a/src/tint/lang/msl/writer/ast_raise/module_scope_var_to_entry_point_param.cc
+++ b/src/tint/lang/msl/writer/ast_raise/module_scope_var_to_entry_point_param.cc
@@ -364,7 +364,7 @@
             ctx.dst->Structure(PrivateStructName(), std::move(private_struct_members));
             // Passing a pointer to a private variable will now involve passing a pointer to the
             // member of a structure, so enable the extension that allows this.
-            ctx.dst->Enable(core::Extension::kChromiumExperimentalFullPtrParameters);
+            ctx.dst->Enable(wgsl::Extension::kChromiumExperimentalFullPtrParameters);
         }
 
         // Build a list of `&ident` expressions. We'll use this later to avoid generating
diff --git a/src/tint/lang/msl/writer/ast_raise/packed_vec3.cc b/src/tint/lang/msl/writer/ast_raise/packed_vec3.cc
index cfe3c0e..d24d83f 100644
--- a/src/tint/lang/msl/writer/ast_raise/packed_vec3.cc
+++ b/src/tint/lang/msl/writer/ast_raise/packed_vec3.cc
@@ -366,7 +366,7 @@
         // bytes from the start of a structure to the start of the next member.
         // Disable these validation rules using an internal extension, as MSL does not have these
         // restrictions.
-        b.Enable(core::Extension::kChromiumInternalRelaxedUniformLayout);
+        b.Enable(wgsl::Extension::kChromiumInternalRelaxedUniformLayout);
 
         // Track expressions that need to be packed or unpacked.
         Hashset<const sem::ValueExpression*, 8> to_pack;
diff --git a/src/tint/lang/msl/writer/ast_raise/pixel_local.cc b/src/tint/lang/msl/writer/ast_raise/pixel_local.cc
index 53f6dfe..df67318 100644
--- a/src/tint/lang/msl/writer/ast_raise/pixel_local.cc
+++ b/src/tint/lang/msl/writer/ast_raise/pixel_local.cc
@@ -58,7 +58,7 @@
         // If the pixel local extension isn't enabled, then there must be no use of pixel_local
         // variables, and so there's nothing for this transform to do.
         if (!sem.Module()->Extensions().Contains(
-                core::Extension::kChromiumExperimentalPixelLocal)) {
+                wgsl::Extension::kChromiumExperimentalPixelLocal)) {
             return SkipTransform;
         }
 
diff --git a/src/tint/lang/spirv/intrinsic/data/data.cc b/src/tint/lang/spirv/intrinsic/data/data.cc
index 4add088..1212faa 100644
--- a/src/tint/lang/spirv/intrinsic/data/data.cc
+++ b/src/tint/lang/spirv/intrinsic/data/data.cc
@@ -606,6 +606,26 @@
 };
 
 
+/// TypeMatcher for 'type texture_multisampled_2d'
+constexpr TypeMatcher kTextureMultisampled2DMatcher {
+/* match */ [](MatchState& state, const Type* ty) -> const Type* {
+  const Type* T = nullptr;
+    if (!MatchTextureMultisampled2D(state, ty, T)) {
+      return nullptr;
+    }
+    T = state.Type(T);
+    if (T == nullptr) {
+      return nullptr;
+    }
+    return BuildTextureMultisampled2D(state, ty, T);
+  },
+/* string */ [](MatchState* state) -> std::string {
+  const std::string T = state->TypeName();
+    return "texture_multisampled_2d<" + T + ">";
+  }
+};
+
+
 /// TypeMatcher for 'type texture_depth_2d'
 constexpr TypeMatcher kTextureDepth2DMatcher {
 /* match */ [](MatchState& state, const Type* ty) -> const Type* {
@@ -662,6 +682,124 @@
 };
 
 
+/// TypeMatcher for 'type texture_depth_multisampled_2d'
+constexpr TypeMatcher kTextureDepthMultisampled2DMatcher {
+/* match */ [](MatchState& state, const Type* ty) -> const Type* {
+    if (!MatchTextureDepthMultisampled2D(state, ty)) {
+      return nullptr;
+    }
+    return BuildTextureDepthMultisampled2D(state, ty);
+  },
+/* string */ [](MatchState*) -> std::string {
+    return "texture_depth_multisampled_2d";
+  }
+};
+
+
+/// TypeMatcher for 'type texture_storage_1d'
+constexpr TypeMatcher kTextureStorage1DMatcher {
+/* match */ [](MatchState& state, const Type* ty) -> const Type* {
+  Number F = Number::invalid;
+  Number A = Number::invalid;
+    if (!MatchTextureStorage1D(state, ty, F, A)) {
+      return nullptr;
+    }
+    F = state.Num(F);
+    if (!F.IsValid()) {
+      return nullptr;
+    }
+    A = state.Num(A);
+    if (!A.IsValid()) {
+      return nullptr;
+    }
+    return BuildTextureStorage1D(state, ty, F, A);
+  },
+/* string */ [](MatchState* state) -> std::string {
+  const std::string F = state->NumName();
+  const std::string A = state->NumName();
+    return "texture_storage_1d<" + F + ", " + A + ">";
+  }
+};
+
+
+/// TypeMatcher for 'type texture_storage_2d'
+constexpr TypeMatcher kTextureStorage2DMatcher {
+/* match */ [](MatchState& state, const Type* ty) -> const Type* {
+  Number F = Number::invalid;
+  Number A = Number::invalid;
+    if (!MatchTextureStorage2D(state, ty, F, A)) {
+      return nullptr;
+    }
+    F = state.Num(F);
+    if (!F.IsValid()) {
+      return nullptr;
+    }
+    A = state.Num(A);
+    if (!A.IsValid()) {
+      return nullptr;
+    }
+    return BuildTextureStorage2D(state, ty, F, A);
+  },
+/* string */ [](MatchState* state) -> std::string {
+  const std::string F = state->NumName();
+  const std::string A = state->NumName();
+    return "texture_storage_2d<" + F + ", " + A + ">";
+  }
+};
+
+
+/// TypeMatcher for 'type texture_storage_2d_array'
+constexpr TypeMatcher kTextureStorage2DArrayMatcher {
+/* match */ [](MatchState& state, const Type* ty) -> const Type* {
+  Number F = Number::invalid;
+  Number A = Number::invalid;
+    if (!MatchTextureStorage2DArray(state, ty, F, A)) {
+      return nullptr;
+    }
+    F = state.Num(F);
+    if (!F.IsValid()) {
+      return nullptr;
+    }
+    A = state.Num(A);
+    if (!A.IsValid()) {
+      return nullptr;
+    }
+    return BuildTextureStorage2DArray(state, ty, F, A);
+  },
+/* string */ [](MatchState* state) -> std::string {
+  const std::string F = state->NumName();
+  const std::string A = state->NumName();
+    return "texture_storage_2d_array<" + F + ", " + A + ">";
+  }
+};
+
+
+/// TypeMatcher for 'type texture_storage_3d'
+constexpr TypeMatcher kTextureStorage3DMatcher {
+/* match */ [](MatchState& state, const Type* ty) -> const Type* {
+  Number F = Number::invalid;
+  Number A = Number::invalid;
+    if (!MatchTextureStorage3D(state, ty, F, A)) {
+      return nullptr;
+    }
+    F = state.Num(F);
+    if (!F.IsValid()) {
+      return nullptr;
+    }
+    A = state.Num(A);
+    if (!A.IsValid()) {
+      return nullptr;
+    }
+    return BuildTextureStorage3D(state, ty, F, A);
+  },
+/* string */ [](MatchState* state) -> std::string {
+  const std::string F = state->NumName();
+  const std::string A = state->NumName();
+    return "texture_storage_3d<" + F + ", " + A + ">";
+  }
+};
+
+
 /// TypeMatcher for 'type ptr'
 constexpr TypeMatcher kPtrMatcher {
 /* match */ [](MatchState& state, const Type* ty) -> const Type* {
@@ -882,52 +1020,135 @@
   }
 };
 
+/// EnumMatcher for 'match f32_texel_format'
+constexpr NumberMatcher kF32TexelFormatMatcher {
+/* match */ [](MatchState&, Number number) -> Number {
+    switch (static_cast<core::TexelFormat>(number.Value())) {
+      case core::TexelFormat::kBgra8Unorm:
+      case core::TexelFormat::kRgba8Unorm:
+      case core::TexelFormat::kRgba8Snorm:
+      case core::TexelFormat::kRgba16Float:
+      case core::TexelFormat::kR32Float:
+      case core::TexelFormat::kRg32Float:
+      case core::TexelFormat::kRgba32Float:
+        return number;
+      default:
+        return Number::invalid;
+    }
+  },
+/* string */ [](MatchState*) -> std::string {
+    return "bgra8unorm, rgba8unorm, rgba8snorm, rgba16float, r32float, rg32float or rgba32float";
+  }
+};
+
+/// EnumMatcher for 'match i32_texel_format'
+constexpr NumberMatcher kI32TexelFormatMatcher {
+/* match */ [](MatchState&, Number number) -> Number {
+    switch (static_cast<core::TexelFormat>(number.Value())) {
+      case core::TexelFormat::kRgba8Sint:
+      case core::TexelFormat::kRgba16Sint:
+      case core::TexelFormat::kR32Sint:
+      case core::TexelFormat::kRg32Sint:
+      case core::TexelFormat::kRgba32Sint:
+        return number;
+      default:
+        return Number::invalid;
+    }
+  },
+/* string */ [](MatchState*) -> std::string {
+    return "rgba8sint, rgba16sint, r32sint, rg32sint or rgba32sint";
+  }
+};
+
+/// EnumMatcher for 'match u32_texel_format'
+constexpr NumberMatcher kU32TexelFormatMatcher {
+/* match */ [](MatchState&, Number number) -> Number {
+    switch (static_cast<core::TexelFormat>(number.Value())) {
+      case core::TexelFormat::kRgba8Uint:
+      case core::TexelFormat::kRgba16Uint:
+      case core::TexelFormat::kR32Uint:
+      case core::TexelFormat::kRg32Uint:
+      case core::TexelFormat::kRgba32Uint:
+        return number;
+      default:
+        return Number::invalid;
+    }
+  },
+/* string */ [](MatchState*) -> std::string {
+    return "rgba8uint, rgba16uint, r32uint, rg32uint or rgba32uint";
+  }
+};
+
+/// EnumMatcher for 'match readable'
+constexpr NumberMatcher kReadableMatcher {
+/* match */ [](MatchState&, Number number) -> Number {
+    switch (static_cast<core::Access>(number.Value())) {
+      case core::Access::kRead:
+      case core::Access::kReadWrite:
+        return number;
+      default:
+        return Number::invalid;
+    }
+  },
+/* string */ [](MatchState*) -> std::string {
+    return "read or read_write";
+  }
+};
+
 /// Type and number matchers
 
 /// The template types, types, and type matchers
 constexpr TypeMatcher kTypeMatchers[] = {
   /* [0] */ TemplateTypeMatcher<0>::matcher,
   /* [1] */ TemplateTypeMatcher<1>::matcher,
-  /* [2] */ kBoolMatcher,
-  /* [3] */ kF32Matcher,
-  /* [4] */ kF16Matcher,
-  /* [5] */ kI32Matcher,
-  /* [6] */ kU32Matcher,
-  /* [7] */ kVec2Matcher,
-  /* [8] */ kVec3Matcher,
-  /* [9] */ kVec4Matcher,
-  /* [10] */ kMat2X2Matcher,
-  /* [11] */ kMat2X3Matcher,
-  /* [12] */ kMat2X4Matcher,
-  /* [13] */ kMat3X2Matcher,
-  /* [14] */ kMat3X3Matcher,
-  /* [15] */ kMat3X4Matcher,
-  /* [16] */ kMat4X2Matcher,
-  /* [17] */ kMat4X3Matcher,
-  /* [18] */ kMat4X4Matcher,
-  /* [19] */ kVecMatcher,
-  /* [20] */ kMatMatcher,
-  /* [21] */ kAtomicMatcher,
-  /* [22] */ kSamplerMatcher,
-  /* [23] */ kSamplerComparisonMatcher,
-  /* [24] */ kTexture1DMatcher,
-  /* [25] */ kTexture2DMatcher,
-  /* [26] */ kTexture2DArrayMatcher,
-  /* [27] */ kTexture3DMatcher,
-  /* [28] */ kTextureCubeMatcher,
-  /* [29] */ kTextureCubeArrayMatcher,
-  /* [30] */ kTextureDepth2DMatcher,
-  /* [31] */ kTextureDepth2DArrayMatcher,
-  /* [32] */ kTextureDepthCubeMatcher,
-  /* [33] */ kTextureDepthCubeArrayMatcher,
-  /* [34] */ kPtrMatcher,
-  /* [35] */ kStructWithRuntimeArrayMatcher,
-  /* [36] */ kSampledImageMatcher,
-  /* [37] */ kF32F16Matcher,
-  /* [38] */ kIu32Matcher,
-  /* [39] */ kFiu32Matcher,
-  /* [40] */ kScalarMatcher,
-  /* [41] */ kSamplersMatcher,
+  /* [2] */ TemplateTypeMatcher<2>::matcher,
+  /* [3] */ TemplateTypeMatcher<3>::matcher,
+  /* [4] */ kBoolMatcher,
+  /* [5] */ kF32Matcher,
+  /* [6] */ kF16Matcher,
+  /* [7] */ kI32Matcher,
+  /* [8] */ kU32Matcher,
+  /* [9] */ kVec2Matcher,
+  /* [10] */ kVec3Matcher,
+  /* [11] */ kVec4Matcher,
+  /* [12] */ kMat2X2Matcher,
+  /* [13] */ kMat2X3Matcher,
+  /* [14] */ kMat2X4Matcher,
+  /* [15] */ kMat3X2Matcher,
+  /* [16] */ kMat3X3Matcher,
+  /* [17] */ kMat3X4Matcher,
+  /* [18] */ kMat4X2Matcher,
+  /* [19] */ kMat4X3Matcher,
+  /* [20] */ kMat4X4Matcher,
+  /* [21] */ kVecMatcher,
+  /* [22] */ kMatMatcher,
+  /* [23] */ kAtomicMatcher,
+  /* [24] */ kSamplerMatcher,
+  /* [25] */ kSamplerComparisonMatcher,
+  /* [26] */ kTexture1DMatcher,
+  /* [27] */ kTexture2DMatcher,
+  /* [28] */ kTexture2DArrayMatcher,
+  /* [29] */ kTexture3DMatcher,
+  /* [30] */ kTextureCubeMatcher,
+  /* [31] */ kTextureCubeArrayMatcher,
+  /* [32] */ kTextureMultisampled2DMatcher,
+  /* [33] */ kTextureDepth2DMatcher,
+  /* [34] */ kTextureDepth2DArrayMatcher,
+  /* [35] */ kTextureDepthCubeMatcher,
+  /* [36] */ kTextureDepthCubeArrayMatcher,
+  /* [37] */ kTextureDepthMultisampled2DMatcher,
+  /* [38] */ kTextureStorage1DMatcher,
+  /* [39] */ kTextureStorage2DMatcher,
+  /* [40] */ kTextureStorage2DArrayMatcher,
+  /* [41] */ kTextureStorage3DMatcher,
+  /* [42] */ kPtrMatcher,
+  /* [43] */ kStructWithRuntimeArrayMatcher,
+  /* [44] */ kSampledImageMatcher,
+  /* [45] */ kF32F16Matcher,
+  /* [46] */ kIu32Matcher,
+  /* [47] */ kFiu32Matcher,
+  /* [48] */ kScalarMatcher,
+  /* [49] */ kSamplersMatcher,
 };
 
 /// The template numbers, and number matchers
@@ -938,48 +1159,83 @@
   /* [3] */ kReadWriteMatcher,
   /* [4] */ kStorageMatcher,
   /* [5] */ kWorkgroupOrStorageMatcher,
+  /* [6] */ kF32TexelFormatMatcher,
+  /* [7] */ kI32TexelFormatMatcher,
+  /* [8] */ kU32TexelFormatMatcher,
+  /* [9] */ kReadableMatcher,
 };
 
 constexpr TypeMatcherIndex kTypeMatcherIndices[] = {
-  /* [0] */ TypeMatcherIndex(34),
-  /* [1] */ TypeMatcherIndex(21),
+  /* [0] */ TypeMatcherIndex(42),
+  /* [1] */ TypeMatcherIndex(23),
   /* [2] */ TypeMatcherIndex(0),
-  /* [3] */ TypeMatcherIndex(36),
-  /* [4] */ TypeMatcherIndex(24),
+  /* [3] */ TypeMatcherIndex(44),
+  /* [4] */ TypeMatcherIndex(26),
   /* [5] */ TypeMatcherIndex(0),
-  /* [6] */ TypeMatcherIndex(36),
-  /* [7] */ TypeMatcherIndex(25),
+  /* [6] */ TypeMatcherIndex(44),
+  /* [7] */ TypeMatcherIndex(27),
   /* [8] */ TypeMatcherIndex(0),
-  /* [9] */ TypeMatcherIndex(36),
-  /* [10] */ TypeMatcherIndex(26),
+  /* [9] */ TypeMatcherIndex(44),
+  /* [10] */ TypeMatcherIndex(28),
   /* [11] */ TypeMatcherIndex(0),
-  /* [12] */ TypeMatcherIndex(36),
-  /* [13] */ TypeMatcherIndex(27),
+  /* [12] */ TypeMatcherIndex(44),
+  /* [13] */ TypeMatcherIndex(29),
   /* [14] */ TypeMatcherIndex(0),
-  /* [15] */ TypeMatcherIndex(36),
-  /* [16] */ TypeMatcherIndex(28),
+  /* [15] */ TypeMatcherIndex(44),
+  /* [16] */ TypeMatcherIndex(30),
   /* [17] */ TypeMatcherIndex(0),
-  /* [18] */ TypeMatcherIndex(36),
-  /* [19] */ TypeMatcherIndex(29),
+  /* [18] */ TypeMatcherIndex(44),
+  /* [19] */ TypeMatcherIndex(31),
   /* [20] */ TypeMatcherIndex(0),
-  /* [21] */ TypeMatcherIndex(34),
-  /* [22] */ TypeMatcherIndex(35),
-  /* [23] */ TypeMatcherIndex(19),
+  /* [21] */ TypeMatcherIndex(42),
+  /* [22] */ TypeMatcherIndex(43),
+  /* [23] */ TypeMatcherIndex(21),
   /* [24] */ TypeMatcherIndex(0),
-  /* [25] */ TypeMatcherIndex(20),
-  /* [26] */ TypeMatcherIndex(0),
-  /* [27] */ TypeMatcherIndex(36),
-  /* [28] */ TypeMatcherIndex(30),
-  /* [29] */ TypeMatcherIndex(36),
-  /* [30] */ TypeMatcherIndex(31),
-  /* [31] */ TypeMatcherIndex(36),
-  /* [32] */ TypeMatcherIndex(32),
-  /* [33] */ TypeMatcherIndex(36),
-  /* [34] */ TypeMatcherIndex(33),
-  /* [35] */ TypeMatcherIndex(19),
-  /* [36] */ TypeMatcherIndex(2),
-  /* [37] */ TypeMatcherIndex(6),
-  /* [38] */ TypeMatcherIndex(1),
+  /* [25] */ TypeMatcherIndex(11),
+  /* [26] */ TypeMatcherIndex(5),
+  /* [27] */ TypeMatcherIndex(44),
+  /* [28] */ TypeMatcherIndex(33),
+  /* [29] */ TypeMatcherIndex(9),
+  /* [30] */ TypeMatcherIndex(5),
+  /* [31] */ TypeMatcherIndex(9),
+  /* [32] */ TypeMatcherIndex(2),
+  /* [33] */ TypeMatcherIndex(44),
+  /* [34] */ TypeMatcherIndex(34),
+  /* [35] */ TypeMatcherIndex(10),
+  /* [36] */ TypeMatcherIndex(5),
+  /* [37] */ TypeMatcherIndex(44),
+  /* [38] */ TypeMatcherIndex(35),
+  /* [39] */ TypeMatcherIndex(44),
+  /* [40] */ TypeMatcherIndex(36),
+  /* [41] */ TypeMatcherIndex(11),
+  /* [42] */ TypeMatcherIndex(0),
+  /* [43] */ TypeMatcherIndex(9),
+  /* [44] */ TypeMatcherIndex(1),
+  /* [45] */ TypeMatcherIndex(10),
+  /* [46] */ TypeMatcherIndex(1),
+  /* [47] */ TypeMatcherIndex(32),
+  /* [48] */ TypeMatcherIndex(0),
+  /* [49] */ TypeMatcherIndex(9),
+  /* [50] */ TypeMatcherIndex(7),
+  /* [51] */ TypeMatcherIndex(9),
+  /* [52] */ TypeMatcherIndex(3),
+  /* [53] */ TypeMatcherIndex(11),
+  /* [54] */ TypeMatcherIndex(7),
+  /* [55] */ TypeMatcherIndex(11),
+  /* [56] */ TypeMatcherIndex(8),
+  /* [57] */ TypeMatcherIndex(9),
+  /* [58] */ TypeMatcherIndex(0),
+  /* [59] */ TypeMatcherIndex(10),
+  /* [60] */ TypeMatcherIndex(0),
+  /* [61] */ TypeMatcherIndex(22),
+  /* [62] */ TypeMatcherIndex(0),
+  /* [63] */ TypeMatcherIndex(21),
+  /* [64] */ TypeMatcherIndex(4),
+  /* [65] */ TypeMatcherIndex(37),
+  /* [66] */ TypeMatcherIndex(38),
+  /* [67] */ TypeMatcherIndex(39),
+  /* [68] */ TypeMatcherIndex(40),
+  /* [69] */ TypeMatcherIndex(41),
 };
 
 static_assert(TypeMatcherIndex::CanIndex(kTypeMatcherIndices),
@@ -989,13 +1245,13 @@
   /* [0] */ NumberMatcherIndex(4),
   /* [1] */ NumberMatcherIndex(0),
   /* [2] */ NumberMatcherIndex(3),
-  /* [3] */ NumberMatcherIndex(1),
-  /* [4] */ NumberMatcherIndex(2),
-  /* [5] */ NumberMatcherIndex(0),
-  /* [6] */ NumberMatcherIndex(2),
-  /* [7] */ NumberMatcherIndex(1),
-  /* [8] */ NumberMatcherIndex(0),
-  /* [9] */ NumberMatcherIndex(1),
+  /* [3] */ NumberMatcherIndex(0),
+  /* [4] */ NumberMatcherIndex(1),
+  /* [5] */ NumberMatcherIndex(2),
+  /* [6] */ NumberMatcherIndex(0),
+  /* [7] */ NumberMatcherIndex(2),
+  /* [8] */ NumberMatcherIndex(1),
+  /* [9] */ NumberMatcherIndex(0),
 };
 
 static_assert(NumberMatcherIndex::CanIndex(kNumberMatcherIndices),
@@ -1011,19 +1267,19 @@
   {
     /* [1] */
     /* usage */ core::ParameterUsage::kNone,
-    /* type_matcher_indices */ TypeMatcherIndicesIndex(38),
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(44),
     /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
   },
   {
     /* [2] */
     /* usage */ core::ParameterUsage::kNone,
-    /* type_matcher_indices */ TypeMatcherIndicesIndex(38),
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(44),
     /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
   },
   {
     /* [3] */
     /* usage */ core::ParameterUsage::kNone,
-    /* type_matcher_indices */ TypeMatcherIndicesIndex(38),
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(44),
     /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
   },
   {
@@ -1041,239 +1297,755 @@
   {
     /* [6] */
     /* usage */ core::ParameterUsage::kNone,
-    /* type_matcher_indices */ TypeMatcherIndicesIndex(0),
-    /* number_matcher_indices */ NumberMatcherIndicesIndex(1),
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(27),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
   },
   {
     /* [7] */
     /* usage */ core::ParameterUsage::kNone,
-    /* type_matcher_indices */ TypeMatcherIndicesIndex(38),
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(29),
     /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
   },
   {
     /* [8] */
     /* usage */ core::ParameterUsage::kNone,
-    /* type_matcher_indices */ TypeMatcherIndicesIndex(38),
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(2),
     /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
   },
   {
     /* [9] */
     /* usage */ core::ParameterUsage::kNone,
-    /* type_matcher_indices */ TypeMatcherIndicesIndex(2),
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(44),
     /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
   },
   {
     /* [10] */
     /* usage */ core::ParameterUsage::kNone,
-    /* type_matcher_indices */ TypeMatcherIndicesIndex(36),
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(31),
     /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
   },
   {
     /* [11] */
     /* usage */ core::ParameterUsage::kNone,
-    /* type_matcher_indices */ TypeMatcherIndicesIndex(2),
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(33),
     /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
   },
   {
     /* [12] */
     /* usage */ core::ParameterUsage::kNone,
-    /* type_matcher_indices */ TypeMatcherIndicesIndex(2),
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(35),
     /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
   },
   {
     /* [13] */
     /* usage */ core::ParameterUsage::kNone,
-    /* type_matcher_indices */ TypeMatcherIndicesIndex(35),
-    /* number_matcher_indices */ NumberMatcherIndicesIndex(1),
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(2),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
   },
   {
     /* [14] */
     /* usage */ core::ParameterUsage::kNone,
-    /* type_matcher_indices */ TypeMatcherIndicesIndex(23),
-    /* number_matcher_indices */ NumberMatcherIndicesIndex(1),
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(44),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
   },
   {
     /* [15] */
     /* usage */ core::ParameterUsage::kNone,
-    /* type_matcher_indices */ TypeMatcherIndicesIndex(23),
-    /* number_matcher_indices */ NumberMatcherIndicesIndex(1),
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(31),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
   },
   {
     /* [16] */
     /* usage */ core::ParameterUsage::kNone,
-    /* type_matcher_indices */ TypeMatcherIndicesIndex(25),
-    /* number_matcher_indices */ NumberMatcherIndicesIndex(7),
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(6),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
   },
   {
     /* [17] */
     /* usage */ core::ParameterUsage::kNone,
-    /* type_matcher_indices */ TypeMatcherIndicesIndex(21),
-    /* number_matcher_indices */ NumberMatcherIndicesIndex(0),
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(29),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
   },
   {
     /* [18] */
     /* usage */ core::ParameterUsage::kNone,
-    /* type_matcher_indices */ TypeMatcherIndicesIndex(2),
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(44),
     /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
   },
   {
     /* [19] */
     /* usage */ core::ParameterUsage::kNone,
-    /* type_matcher_indices */ TypeMatcherIndicesIndex(25),
-    /* number_matcher_indices */ NumberMatcherIndicesIndex(5),
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(32),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
   },
   {
     /* [20] */
     /* usage */ core::ParameterUsage::kNone,
-    /* type_matcher_indices */ TypeMatcherIndicesIndex(25),
-    /* number_matcher_indices */ NumberMatcherIndicesIndex(7),
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(49),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
   },
   {
     /* [21] */
     /* usage */ core::ParameterUsage::kNone,
-    /* type_matcher_indices */ TypeMatcherIndicesIndex(25),
-    /* number_matcher_indices */ NumberMatcherIndicesIndex(8),
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(9),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
   },
   {
     /* [22] */
     /* usage */ core::ParameterUsage::kNone,
-    /* type_matcher_indices */ TypeMatcherIndicesIndex(2),
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(35),
     /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
   },
   {
     /* [23] */
     /* usage */ core::ParameterUsage::kNone,
-    /* type_matcher_indices */ TypeMatcherIndicesIndex(25),
-    /* number_matcher_indices */ NumberMatcherIndicesIndex(8),
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(44),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
   },
   {
     /* [24] */
     /* usage */ core::ParameterUsage::kNone,
-    /* type_matcher_indices */ TypeMatcherIndicesIndex(23),
-    /* number_matcher_indices */ NumberMatcherIndicesIndex(1),
-  },
-  {
-    /* [25] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* type_matcher_indices */ TypeMatcherIndicesIndex(2),
-    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
-  },
-  {
-    /* [26] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* type_matcher_indices */ TypeMatcherIndicesIndex(4),
-    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
-  },
-  {
-    /* [27] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* type_matcher_indices */ TypeMatcherIndicesIndex(38),
-    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
-  },
-  {
-    /* [28] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* type_matcher_indices */ TypeMatcherIndicesIndex(7),
-    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
-  },
-  {
-    /* [29] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* type_matcher_indices */ TypeMatcherIndicesIndex(38),
-    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
-  },
-  {
-    /* [30] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* type_matcher_indices */ TypeMatcherIndicesIndex(10),
-    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
-  },
-  {
-    /* [31] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* type_matcher_indices */ TypeMatcherIndicesIndex(38),
-    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
-  },
-  {
-    /* [32] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* type_matcher_indices */ TypeMatcherIndicesIndex(13),
-    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
-  },
-  {
-    /* [33] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* type_matcher_indices */ TypeMatcherIndicesIndex(38),
-    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
-  },
-  {
-    /* [34] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* type_matcher_indices */ TypeMatcherIndicesIndex(16),
-    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
-  },
-  {
-    /* [35] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* type_matcher_indices */ TypeMatcherIndicesIndex(38),
-    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
-  },
-  {
-    /* [36] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* type_matcher_indices */ TypeMatcherIndicesIndex(19),
-    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
-  },
-  {
-    /* [37] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* type_matcher_indices */ TypeMatcherIndicesIndex(38),
-    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
-  },
-  {
-    /* [38] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* type_matcher_indices */ TypeMatcherIndicesIndex(28),
-    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
-  },
-  {
-    /* [39] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* type_matcher_indices */ TypeMatcherIndicesIndex(2),
-    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
-  },
-  {
-    /* [40] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* type_matcher_indices */ TypeMatcherIndicesIndex(30),
-    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
-  },
-  {
-    /* [41] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* type_matcher_indices */ TypeMatcherIndicesIndex(2),
-    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
-  },
-  {
-    /* [42] */
-    /* usage */ core::ParameterUsage::kNone,
     /* type_matcher_indices */ TypeMatcherIndicesIndex(32),
     /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
   },
   {
-    /* [43] */
+    /* [25] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(51),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [26] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(0),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(1),
+  },
+  {
+    /* [27] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(44),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [28] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(44),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [29] */
     /* usage */ core::ParameterUsage::kNone,
     /* type_matcher_indices */ TypeMatcherIndicesIndex(2),
     /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
   },
   {
+    /* [30] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(37),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [31] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(35),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [32] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(2),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [33] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(44),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [34] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(39),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [35] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(25),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [36] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(2),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [37] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(44),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [38] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(4),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [39] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(44),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [40] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(32),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [41] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(52),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [42] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(7),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [43] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(43),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
     /* [44] */
     /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(32),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [45] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(52),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [46] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(10),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [47] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(45),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [48] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(32),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [49] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(52),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [50] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(13),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [51] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(45),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [52] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(32),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [53] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(52),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [54] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(47),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [55] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(43),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [56] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(32),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [57] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(52),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [58] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(28),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [59] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(43),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [60] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(2),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [61] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(32),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [62] */
+    /* usage */ core::ParameterUsage::kNone,
     /* type_matcher_indices */ TypeMatcherIndicesIndex(34),
     /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
   },
   {
-    /* [45] */
+    /* [63] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(45),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [64] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(2),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [65] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(32),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [66] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(65),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [67] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(43),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [68] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(2),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [69] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(32),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [70] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(3),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [71] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(29),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [72] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(44),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [73] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(32),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [74] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(12),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [75] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(29),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [76] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(44),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [77] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(32),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [78] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(15),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [79] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(35),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [80] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(44),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [81] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(32),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [82] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(18),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [83] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(25),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [84] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(44),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [85] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(32),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [86] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(66),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(3),
+  },
+  {
+    /* [87] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(2),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [88] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(44),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [89] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(67),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(3),
+  },
+  {
+    /* [90] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(57),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [91] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(44),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [92] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(68),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(3),
+  },
+  {
+    /* [93] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(59),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [94] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(44),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [95] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(69),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(3),
+  },
+  {
+    /* [96] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(59),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [97] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(44),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [98] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(64),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [99] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(2),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [100] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(2),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [101] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(63),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(1),
+  },
+  {
+    /* [102] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(23),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(1),
+  },
+  {
+    /* [103] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(23),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(1),
+  },
+  {
+    /* [104] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(61),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(8),
+  },
+  {
+    /* [105] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(21),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(0),
+  },
+  {
+    /* [106] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(2),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [107] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(61),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(6),
+  },
+  {
+    /* [108] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(61),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(8),
+  },
+  {
+    /* [109] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(61),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(3),
+  },
+  {
+    /* [110] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(2),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [111] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(61),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(3),
+  },
+  {
+    /* [112] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(23),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(1),
+  },
+  {
+    /* [113] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(2),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [114] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(7),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [115] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(44),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [116] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(10),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [117] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(44),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [118] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(13),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [119] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(44),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [120] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(16),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [121] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(44),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [122] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(19),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [123] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(44),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [124] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(28),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [125] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(2),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [126] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(34),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [127] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(2),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [128] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(38),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [129] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(2),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [130] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* type_matcher_indices */ TypeMatcherIndicesIndex(40),
+    /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+  },
+  {
+    /* [131] */
     /* usage */ core::ParameterUsage::kNone,
     /* type_matcher_indices */ TypeMatcherIndicesIndex(2),
     /* number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
@@ -1287,37 +2059,112 @@
   {
     /* [0] */
     /* name */ "T",
-    /* matcher_index */ TypeMatcherIndex(38),
+    /* matcher_index */ TypeMatcherIndex(47),
   },
   {
     /* [1] */
-    /* name */ "U",
-    /* matcher_index */ TypeMatcherIndex(6),
+    /* name */ "C",
+    /* matcher_index */ TypeMatcherIndex(46),
   },
   {
     /* [2] */
-    /* name */ "T",
-    /* matcher_index */ TypeMatcherIndex(39),
+    /* name */ "I",
+    /* matcher_index */ TypeMatcherIndex(46),
   },
   {
     /* [3] */
     /* name */ "S",
-    /* matcher_index */ TypeMatcherIndex(41),
+    /* matcher_index */ TypeMatcherIndex(46),
   },
   {
     /* [4] */
-    /* name */ "I",
-    /* matcher_index */ TypeMatcherIndex(6),
+    /* name */ "T",
+    /* matcher_index */ TypeMatcherIndex(47),
   },
   {
     /* [5] */
-    /* name */ "T",
-    /* matcher_index */ TypeMatcherIndex(37),
+    /* name */ "A",
+    /* matcher_index */ TypeMatcherIndex(46),
   },
   {
     /* [6] */
+    /* name */ "B",
+    /* matcher_index */ TypeMatcherIndex(46),
+  },
+  {
+    /* [7] */
+    /* name */ "C",
+    /* matcher_index */ TypeMatcherIndex(46),
+  },
+  {
+    /* [8] */
+    /* name */ "S",
+    /* matcher_index */ TypeMatcherIndex(46),
+  },
+  {
+    /* [9] */
+    /* name */ "A",
+    /* matcher_index */ TypeMatcherIndex(5),
+  },
+  {
+    /* [10] */
+    /* name */ "B",
+    /* matcher_index */ TypeMatcherIndex(46),
+  },
+  {
+    /* [11] */
+    /* name */ "C",
+    /* matcher_index */ TypeMatcherIndex(46),
+  },
+  {
+    /* [12] */
+    /* name */ "I",
+    /* matcher_index */ TypeMatcherIndex(46),
+  },
+  {
+    /* [13] */
+    /* name */ "C",
+    /* matcher_index */ TypeMatcherIndex(46),
+  },
+  {
+    /* [14] */
+    /* name */ "S",
+    /* matcher_index */ TypeMatcherIndex(46),
+  },
+  {
+    /* [15] */
     /* name */ "T",
-    /* matcher_index */ TypeMatcherIndex(40),
+    /* matcher_index */ TypeMatcherIndex(46),
+  },
+  {
+    /* [16] */
+    /* name */ "U",
+    /* matcher_index */ TypeMatcherIndex(8),
+  },
+  {
+    /* [17] */
+    /* name */ "T",
+    /* matcher_index */ TypeMatcherIndex(47),
+  },
+  {
+    /* [18] */
+    /* name */ "S",
+    /* matcher_index */ TypeMatcherIndex(49),
+  },
+  {
+    /* [19] */
+    /* name */ "I",
+    /* matcher_index */ TypeMatcherIndex(8),
+  },
+  {
+    /* [20] */
+    /* name */ "T",
+    /* matcher_index */ TypeMatcherIndex(45),
+  },
+  {
+    /* [21] */
+    /* name */ "T",
+    /* matcher_index */ TypeMatcherIndex(48),
   },
 };
 
@@ -1342,21 +2189,51 @@
   },
   {
     /* [3] */
+    /* name */ "F",
+    /* matcher_index */ NumberMatcherIndex(6),
+  },
+  {
+    /* [4] */
+    /* name */ "A",
+    /* matcher_index */ NumberMatcherIndex(9),
+  },
+  {
+    /* [5] */
+    /* name */ "F",
+    /* matcher_index */ NumberMatcherIndex(7),
+  },
+  {
+    /* [6] */
+    /* name */ "A",
+    /* matcher_index */ NumberMatcherIndex(9),
+  },
+  {
+    /* [7] */
+    /* name */ "F",
+    /* matcher_index */ NumberMatcherIndex(8),
+  },
+  {
+    /* [8] */
+    /* name */ "A",
+    /* matcher_index */ NumberMatcherIndex(9),
+  },
+  {
+    /* [9] */
     /* name */ "N",
     /* matcher_index */ NumberMatcherIndex(/* invalid */),
   },
   {
-    /* [4] */
+    /* [10] */
     /* name */ "M",
     /* matcher_index */ NumberMatcherIndex(/* invalid */),
   },
   {
-    /* [5] */
+    /* [11] */
     /* name */ "A",
     /* matcher_index */ NumberMatcherIndex(/* invalid */),
   },
   {
-    /* [6] */
+    /* [12] */
     /* name */ "S",
     /* matcher_index */ NumberMatcherIndex(5),
   },
@@ -1369,298 +2246,818 @@
   {
     /* [0] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
-    /* num_parameters */ 2,
-    /* num_template_types */ 2,
+    /* num_parameters */ 4,
+    /* num_template_types */ 3,
     /* num_template_numbers */ 0,
-    /* template_types */ TemplateTypeIndex(2),
+    /* template_types */ TemplateTypeIndex(4),
     /* template_numbers */ TemplateNumberIndex(/* invalid */),
-    /* parameters */ ParameterIndex(26),
-    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(3),
+    /* parameters */ ParameterIndex(70),
+    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(41),
     /* return_number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
     /* [1] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
-    /* num_parameters */ 2,
-    /* num_template_types */ 2,
+    /* num_parameters */ 4,
+    /* num_template_types */ 3,
     /* num_template_numbers */ 0,
-    /* template_types */ TemplateTypeIndex(2),
+    /* template_types */ TemplateTypeIndex(4),
     /* template_numbers */ TemplateNumberIndex(/* invalid */),
-    /* parameters */ ParameterIndex(28),
-    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(6),
+    /* parameters */ ParameterIndex(16),
+    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(41),
     /* return_number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
     /* [2] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
-    /* num_parameters */ 2,
-    /* num_template_types */ 2,
+    /* num_parameters */ 5,
+    /* num_template_types */ 3,
     /* num_template_numbers */ 0,
-    /* template_types */ TemplateTypeIndex(2),
+    /* template_types */ TemplateTypeIndex(4),
     /* template_numbers */ TemplateNumberIndex(/* invalid */),
-    /* parameters */ ParameterIndex(30),
-    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(9),
+    /* parameters */ ParameterIndex(16),
+    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(41),
     /* return_number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
     /* [3] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
-    /* num_parameters */ 2,
-    /* num_template_types */ 2,
+    /* num_parameters */ 4,
+    /* num_template_types */ 3,
     /* num_template_numbers */ 0,
-    /* template_types */ TemplateTypeIndex(2),
+    /* template_types */ TemplateTypeIndex(4),
     /* template_numbers */ TemplateNumberIndex(/* invalid */),
-    /* parameters */ ParameterIndex(32),
-    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(12),
+    /* parameters */ ParameterIndex(21),
+    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(41),
     /* return_number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
     /* [4] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
-    /* num_parameters */ 2,
-    /* num_template_types */ 2,
+    /* num_parameters */ 5,
+    /* num_template_types */ 4,
     /* num_template_numbers */ 0,
-    /* template_types */ TemplateTypeIndex(2),
+    /* template_types */ TemplateTypeIndex(4),
     /* template_numbers */ TemplateNumberIndex(/* invalid */),
-    /* parameters */ ParameterIndex(34),
-    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(15),
+    /* parameters */ ParameterIndex(21),
+    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(41),
     /* return_number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
     /* [5] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
-    /* num_parameters */ 2,
-    /* num_template_types */ 2,
+    /* num_parameters */ 4,
+    /* num_template_types */ 3,
     /* num_template_numbers */ 0,
-    /* template_types */ TemplateTypeIndex(2),
+    /* template_types */ TemplateTypeIndex(4),
     /* template_numbers */ TemplateNumberIndex(/* invalid */),
-    /* parameters */ ParameterIndex(36),
-    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(18),
+    /* parameters */ ParameterIndex(74),
+    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(41),
     /* return_number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
     /* [6] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
-    /* num_parameters */ 2,
-    /* num_template_types */ 1,
+    /* num_parameters */ 4,
+    /* num_template_types */ 3,
     /* num_template_numbers */ 0,
-    /* template_types */ TemplateTypeIndex(3),
+    /* template_types */ TemplateTypeIndex(4),
     /* template_numbers */ TemplateNumberIndex(/* invalid */),
-    /* parameters */ ParameterIndex(38),
-    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(27),
+    /* parameters */ ParameterIndex(78),
+    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(41),
     /* return_number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
     /* [7] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
-    /* num_parameters */ 2,
-    /* num_template_types */ 1,
+    /* num_parameters */ 4,
+    /* num_template_types */ 3,
     /* num_template_numbers */ 0,
-    /* template_types */ TemplateTypeIndex(3),
+    /* template_types */ TemplateTypeIndex(4),
     /* template_numbers */ TemplateNumberIndex(/* invalid */),
-    /* parameters */ ParameterIndex(40),
-    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(29),
+    /* parameters */ ParameterIndex(82),
+    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(41),
     /* return_number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
     /* [8] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
-    /* num_parameters */ 2,
-    /* num_template_types */ 1,
+    /* num_parameters */ 4,
+    /* num_template_types */ 2,
     /* num_template_numbers */ 0,
-    /* template_types */ TemplateTypeIndex(3),
+    /* template_types */ TemplateTypeIndex(5),
     /* template_numbers */ TemplateNumberIndex(/* invalid */),
-    /* parameters */ ParameterIndex(42),
-    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(31),
+    /* parameters */ ParameterIndex(6),
+    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(25),
     /* return_number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
     /* [9] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
-    /* num_parameters */ 2,
-    /* num_template_types */ 1,
+    /* num_parameters */ 5,
+    /* num_template_types */ 3,
     /* num_template_numbers */ 0,
-    /* template_types */ TemplateTypeIndex(3),
+    /* template_types */ TemplateTypeIndex(5),
     /* template_numbers */ TemplateNumberIndex(/* invalid */),
-    /* parameters */ ParameterIndex(44),
-    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(33),
+    /* parameters */ ParameterIndex(6),
+    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(25),
     /* return_number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
     /* [10] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
-    /* num_parameters */ 3,
-    /* num_template_types */ 1,
+    /* num_parameters */ 4,
+    /* num_template_types */ 2,
     /* num_template_numbers */ 0,
-    /* template_types */ TemplateTypeIndex(6),
+    /* template_types */ TemplateTypeIndex(5),
     /* template_numbers */ TemplateNumberIndex(/* invalid */),
-    /* parameters */ ParameterIndex(10),
-    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(2),
+    /* parameters */ ParameterIndex(11),
+    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(25),
     /* return_number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
     /* [11] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
-    /* num_parameters */ 3,
-    /* num_template_types */ 1,
-    /* num_template_numbers */ 1,
-    /* template_types */ TemplateTypeIndex(6),
-    /* template_numbers */ TemplateNumberIndex(3),
-    /* parameters */ ParameterIndex(13),
-    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(23),
-    /* return_number_matcher_indices */ NumberMatcherIndicesIndex(1),
+    /* num_parameters */ 5,
+    /* num_template_types */ 3,
+    /* num_template_numbers */ 0,
+    /* template_types */ TemplateTypeIndex(5),
+    /* template_numbers */ TemplateNumberIndex(/* invalid */),
+    /* parameters */ ParameterIndex(11),
+    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(25),
+    /* return_number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
     /* [12] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
-    /* num_parameters */ 2,
-    /* num_template_types */ 1,
-    /* num_template_numbers */ 1,
-    /* template_types */ TemplateTypeIndex(4),
-    /* template_numbers */ TemplateNumberIndex(5),
-    /* parameters */ ParameterIndex(17),
-    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(37),
+    /* num_parameters */ 4,
+    /* num_template_types */ 2,
+    /* num_template_numbers */ 0,
+    /* template_types */ TemplateTypeIndex(5),
+    /* template_numbers */ TemplateNumberIndex(/* invalid */),
+    /* parameters */ ParameterIndex(30),
+    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(25),
     /* return_number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
     /* [13] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
     /* num_parameters */ 4,
     /* num_template_types */ 2,
-    /* num_template_numbers */ 1,
-    /* template_types */ TemplateTypeIndex(0),
-    /* template_numbers */ TemplateNumberIndex(6),
-    /* parameters */ ParameterIndex(6),
-    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(2),
+    /* num_template_numbers */ 0,
+    /* template_types */ TemplateTypeIndex(5),
+    /* template_numbers */ TemplateNumberIndex(/* invalid */),
+    /* parameters */ ParameterIndex(34),
+    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(25),
     /* return_number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
     /* [14] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
-    /* num_parameters */ 6,
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 3,
     /* num_template_types */ 2,
-    /* num_template_numbers */ 1,
-    /* template_types */ TemplateTypeIndex(0),
-    /* template_numbers */ TemplateNumberIndex(6),
-    /* parameters */ ParameterIndex(0),
-    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(2),
+    /* num_template_numbers */ 2,
+    /* template_types */ TemplateTypeIndex(7),
+    /* template_numbers */ TemplateNumberIndex(3),
+    /* parameters */ ParameterIndex(86),
+    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(25),
     /* return_number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
     /* [15] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
     /* num_parameters */ 3,
     /* num_template_types */ 2,
-    /* num_template_numbers */ 1,
-    /* template_types */ TemplateTypeIndex(0),
-    /* template_numbers */ TemplateNumberIndex(6),
-    /* parameters */ ParameterIndex(0),
-    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(2),
+    /* num_template_numbers */ 2,
+    /* template_types */ TemplateTypeIndex(7),
+    /* template_numbers */ TemplateNumberIndex(5),
+    /* parameters */ ParameterIndex(86),
+    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(53),
     /* return_number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
     /* [16] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
-    /* num_parameters */ 4,
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 3,
     /* num_template_types */ 2,
-    /* num_template_numbers */ 1,
-    /* template_types */ TemplateTypeIndex(0),
-    /* template_numbers */ TemplateNumberIndex(6),
-    /* parameters */ ParameterIndex(6),
-    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(/* invalid */),
+    /* num_template_numbers */ 2,
+    /* template_types */ TemplateTypeIndex(7),
+    /* template_numbers */ TemplateNumberIndex(7),
+    /* parameters */ ParameterIndex(86),
+    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(55),
     /* return_number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
     /* [17] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
-    /* num_parameters */ 2,
-    /* num_template_types */ 1,
-    /* num_template_numbers */ 1,
-    /* template_types */ TemplateTypeIndex(5),
+    /* num_parameters */ 3,
+    /* num_template_types */ 2,
+    /* num_template_numbers */ 2,
+    /* template_types */ TemplateTypeIndex(7),
     /* template_numbers */ TemplateNumberIndex(3),
-    /* parameters */ ParameterIndex(14),
-    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(2),
+    /* parameters */ ParameterIndex(89),
+    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(25),
     /* return_number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
     /* [18] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
-    /* num_parameters */ 2,
-    /* num_template_types */ 1,
-    /* num_template_numbers */ 3,
-    /* template_types */ TemplateTypeIndex(5),
-    /* template_numbers */ TemplateNumberIndex(0),
-    /* parameters */ ParameterIndex(19),
-    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(25),
-    /* return_number_matcher_indices */ NumberMatcherIndicesIndex(3),
+    /* num_parameters */ 3,
+    /* num_template_types */ 2,
+    /* num_template_numbers */ 2,
+    /* template_types */ TemplateTypeIndex(7),
+    /* template_numbers */ TemplateNumberIndex(5),
+    /* parameters */ ParameterIndex(89),
+    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(53),
+    /* return_number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
     /* [19] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
-    /* num_parameters */ 2,
-    /* num_template_types */ 1,
+    /* num_parameters */ 3,
+    /* num_template_types */ 2,
     /* num_template_numbers */ 2,
-    /* template_types */ TemplateTypeIndex(5),
-    /* template_numbers */ TemplateNumberIndex(3),
-    /* parameters */ ParameterIndex(21),
-    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(25),
-    /* return_number_matcher_indices */ NumberMatcherIndicesIndex(8),
+    /* template_types */ TemplateTypeIndex(7),
+    /* template_numbers */ TemplateNumberIndex(7),
+    /* parameters */ ParameterIndex(89),
+    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(55),
+    /* return_number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
     /* [20] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
-    /* num_parameters */ 2,
-    /* num_template_types */ 1,
+    /* num_parameters */ 3,
+    /* num_template_types */ 2,
     /* num_template_numbers */ 2,
-    /* template_types */ TemplateTypeIndex(5),
+    /* template_types */ TemplateTypeIndex(7),
     /* template_numbers */ TemplateNumberIndex(3),
-    /* parameters */ ParameterIndex(23),
-    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(23),
-    /* return_number_matcher_indices */ NumberMatcherIndicesIndex(3),
+    /* parameters */ ParameterIndex(92),
+    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(25),
+    /* return_number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
     /* [21] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
-    /* num_parameters */ 2,
-    /* num_template_types */ 1,
+    /* num_parameters */ 3,
+    /* num_template_types */ 2,
     /* num_template_numbers */ 2,
-    /* template_types */ TemplateTypeIndex(5),
-    /* template_numbers */ TemplateNumberIndex(3),
-    /* parameters */ ParameterIndex(15),
-    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(23),
-    /* return_number_matcher_indices */ NumberMatcherIndicesIndex(3),
+    /* template_types */ TemplateTypeIndex(7),
+    /* template_numbers */ TemplateNumberIndex(5),
+    /* parameters */ ParameterIndex(92),
+    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(53),
+    /* return_number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
     /* [22] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 3,
+    /* num_template_types */ 2,
+    /* num_template_numbers */ 2,
+    /* template_types */ TemplateTypeIndex(7),
+    /* template_numbers */ TemplateNumberIndex(7),
+    /* parameters */ ParameterIndex(92),
+    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(55),
+    /* return_number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [23] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 3,
+    /* num_template_types */ 2,
+    /* num_template_numbers */ 2,
+    /* template_types */ TemplateTypeIndex(7),
+    /* template_numbers */ TemplateNumberIndex(3),
+    /* parameters */ ParameterIndex(95),
+    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(25),
+    /* return_number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [24] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 3,
+    /* num_template_types */ 2,
+    /* num_template_numbers */ 2,
+    /* template_types */ TemplateTypeIndex(7),
+    /* template_numbers */ TemplateNumberIndex(5),
+    /* parameters */ ParameterIndex(95),
+    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(53),
+    /* return_number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [25] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 3,
+    /* num_template_types */ 2,
+    /* num_template_numbers */ 2,
+    /* template_types */ TemplateTypeIndex(7),
+    /* template_numbers */ TemplateNumberIndex(7),
+    /* parameters */ ParameterIndex(95),
+    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(55),
+    /* return_number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [26] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 2,
+    /* num_template_types */ 2,
+    /* num_template_numbers */ 0,
+    /* template_types */ TemplateTypeIndex(17),
+    /* template_numbers */ TemplateNumberIndex(/* invalid */),
+    /* parameters */ ParameterIndex(38),
+    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(3),
+    /* return_number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [27] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 2,
+    /* num_template_types */ 2,
+    /* num_template_numbers */ 0,
+    /* template_types */ TemplateTypeIndex(17),
+    /* template_numbers */ TemplateNumberIndex(/* invalid */),
+    /* parameters */ ParameterIndex(114),
+    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(6),
+    /* return_number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [28] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 2,
+    /* num_template_types */ 2,
+    /* num_template_numbers */ 0,
+    /* template_types */ TemplateTypeIndex(17),
+    /* template_numbers */ TemplateNumberIndex(/* invalid */),
+    /* parameters */ ParameterIndex(116),
+    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(9),
+    /* return_number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [29] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 2,
+    /* num_template_types */ 2,
+    /* num_template_numbers */ 0,
+    /* template_types */ TemplateTypeIndex(17),
+    /* template_numbers */ TemplateNumberIndex(/* invalid */),
+    /* parameters */ ParameterIndex(118),
+    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(12),
+    /* return_number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [30] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 2,
+    /* num_template_types */ 2,
+    /* num_template_numbers */ 0,
+    /* template_types */ TemplateTypeIndex(17),
+    /* template_numbers */ TemplateNumberIndex(/* invalid */),
+    /* parameters */ ParameterIndex(120),
+    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(15),
+    /* return_number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [31] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 2,
+    /* num_template_types */ 2,
+    /* num_template_numbers */ 0,
+    /* template_types */ TemplateTypeIndex(17),
+    /* template_numbers */ TemplateNumberIndex(/* invalid */),
+    /* parameters */ ParameterIndex(122),
+    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(18),
+    /* return_number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [32] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 2,
+    /* num_template_types */ 1,
+    /* num_template_numbers */ 0,
+    /* template_types */ TemplateTypeIndex(18),
+    /* template_numbers */ TemplateNumberIndex(/* invalid */),
+    /* parameters */ ParameterIndex(124),
+    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(27),
+    /* return_number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [33] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 2,
+    /* num_template_types */ 1,
+    /* num_template_numbers */ 0,
+    /* template_types */ TemplateTypeIndex(18),
+    /* template_numbers */ TemplateNumberIndex(/* invalid */),
+    /* parameters */ ParameterIndex(126),
+    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(33),
+    /* return_number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [34] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 2,
+    /* num_template_types */ 1,
+    /* num_template_numbers */ 0,
+    /* template_types */ TemplateTypeIndex(18),
+    /* template_numbers */ TemplateNumberIndex(/* invalid */),
+    /* parameters */ ParameterIndex(128),
+    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(37),
+    /* return_number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [35] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 2,
+    /* num_template_types */ 1,
+    /* num_template_numbers */ 0,
+    /* template_types */ TemplateTypeIndex(18),
+    /* template_numbers */ TemplateNumberIndex(/* invalid */),
+    /* parameters */ ParameterIndex(130),
+    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(39),
+    /* return_number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [36] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 4,
+    /* num_template_types */ 4,
+    /* num_template_numbers */ 0,
+    /* template_types */ TemplateTypeIndex(0),
+    /* template_numbers */ TemplateNumberIndex(/* invalid */),
+    /* parameters */ ParameterIndex(38),
+    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(41),
+    /* return_number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [37] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 4,
+    /* num_template_types */ 4,
+    /* num_template_numbers */ 0,
+    /* template_types */ TemplateTypeIndex(0),
+    /* template_numbers */ TemplateNumberIndex(/* invalid */),
+    /* parameters */ ParameterIndex(42),
+    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(41),
+    /* return_number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [38] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 4,
+    /* num_template_types */ 4,
+    /* num_template_numbers */ 0,
+    /* template_types */ TemplateTypeIndex(0),
+    /* template_numbers */ TemplateNumberIndex(/* invalid */),
+    /* parameters */ ParameterIndex(46),
+    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(41),
+    /* return_number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [39] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 4,
+    /* num_template_types */ 4,
+    /* num_template_numbers */ 0,
+    /* template_types */ TemplateTypeIndex(0),
+    /* template_numbers */ TemplateNumberIndex(/* invalid */),
+    /* parameters */ ParameterIndex(50),
+    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(41),
+    /* return_number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [40] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 4,
+    /* num_template_types */ 4,
+    /* num_template_numbers */ 0,
+    /* template_types */ TemplateTypeIndex(0),
+    /* template_numbers */ TemplateNumberIndex(/* invalid */),
+    /* parameters */ ParameterIndex(54),
+    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(41),
+    /* return_number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [41] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 4,
+    /* num_template_types */ 3,
+    /* num_template_numbers */ 0,
+    /* template_types */ TemplateTypeIndex(12),
+    /* template_numbers */ TemplateNumberIndex(/* invalid */),
+    /* parameters */ ParameterIndex(58),
+    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(25),
+    /* return_number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [42] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 4,
+    /* num_template_types */ 3,
+    /* num_template_numbers */ 0,
+    /* template_types */ TemplateTypeIndex(12),
+    /* template_numbers */ TemplateNumberIndex(/* invalid */),
+    /* parameters */ ParameterIndex(62),
+    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(25),
+    /* return_number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [43] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 4,
+    /* num_template_types */ 3,
+    /* num_template_numbers */ 0,
+    /* template_types */ TemplateTypeIndex(12),
+    /* template_numbers */ TemplateNumberIndex(/* invalid */),
+    /* parameters */ ParameterIndex(66),
+    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(25),
+    /* return_number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [44] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 4,
+    /* num_template_types */ 2,
+    /* num_template_numbers */ 0,
+    /* template_types */ TemplateTypeIndex(9),
+    /* template_numbers */ TemplateNumberIndex(/* invalid */),
+    /* parameters */ ParameterIndex(6),
+    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(25),
+    /* return_number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [45] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 5,
+    /* num_template_types */ 3,
+    /* num_template_numbers */ 0,
+    /* template_types */ TemplateTypeIndex(9),
+    /* template_numbers */ TemplateNumberIndex(/* invalid */),
+    /* parameters */ ParameterIndex(6),
+    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(25),
+    /* return_number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [46] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 4,
+    /* num_template_types */ 2,
+    /* num_template_numbers */ 0,
+    /* template_types */ TemplateTypeIndex(9),
+    /* template_numbers */ TemplateNumberIndex(/* invalid */),
+    /* parameters */ ParameterIndex(11),
+    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(25),
+    /* return_number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [47] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 5,
+    /* num_template_types */ 3,
+    /* num_template_numbers */ 0,
+    /* template_types */ TemplateTypeIndex(9),
+    /* template_numbers */ TemplateNumberIndex(/* invalid */),
+    /* parameters */ ParameterIndex(11),
+    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(25),
+    /* return_number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [48] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 4,
+    /* num_template_types */ 2,
+    /* num_template_numbers */ 0,
+    /* template_types */ TemplateTypeIndex(9),
+    /* template_numbers */ TemplateNumberIndex(/* invalid */),
+    /* parameters */ ParameterIndex(30),
+    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(25),
+    /* return_number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [49] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 4,
+    /* num_template_types */ 2,
+    /* num_template_numbers */ 0,
+    /* template_types */ TemplateTypeIndex(9),
+    /* template_numbers */ TemplateNumberIndex(/* invalid */),
+    /* parameters */ ParameterIndex(34),
+    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(25),
+    /* return_number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [50] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 3,
+    /* num_template_types */ 1,
+    /* num_template_numbers */ 0,
+    /* template_types */ TemplateTypeIndex(21),
+    /* template_numbers */ TemplateNumberIndex(/* invalid */),
+    /* parameters */ ParameterIndex(98),
+    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(2),
+    /* return_number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [51] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 3,
+    /* num_template_types */ 1,
+    /* num_template_numbers */ 1,
+    /* template_types */ TemplateTypeIndex(21),
+    /* template_numbers */ TemplateNumberIndex(9),
+    /* parameters */ ParameterIndex(101),
+    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(23),
+    /* return_number_matcher_indices */ NumberMatcherIndicesIndex(1),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [52] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
     /* num_parameters */ 2,
     /* num_template_types */ 1,
     /* num_template_numbers */ 1,
-    /* template_types */ TemplateTypeIndex(5),
-    /* template_numbers */ TemplateNumberIndex(3),
-    /* parameters */ ParameterIndex(24),
+    /* template_types */ TemplateTypeIndex(19),
+    /* template_numbers */ TemplateNumberIndex(11),
+    /* parameters */ ParameterIndex(105),
+    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(56),
+    /* return_number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [53] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 4,
+    /* num_template_types */ 2,
+    /* num_template_numbers */ 1,
+    /* template_types */ TemplateTypeIndex(15),
+    /* template_numbers */ TemplateNumberIndex(12),
+    /* parameters */ ParameterIndex(26),
+    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(2),
+    /* return_number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [54] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 6,
+    /* num_template_types */ 2,
+    /* num_template_numbers */ 1,
+    /* template_types */ TemplateTypeIndex(15),
+    /* template_numbers */ TemplateNumberIndex(12),
+    /* parameters */ ParameterIndex(0),
+    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(2),
+    /* return_number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [55] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 3,
+    /* num_template_types */ 2,
+    /* num_template_numbers */ 1,
+    /* template_types */ TemplateTypeIndex(15),
+    /* template_numbers */ TemplateNumberIndex(12),
+    /* parameters */ ParameterIndex(0),
+    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(2),
+    /* return_number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [56] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 4,
+    /* num_template_types */ 2,
+    /* num_template_numbers */ 1,
+    /* template_types */ TemplateTypeIndex(15),
+    /* template_numbers */ TemplateNumberIndex(12),
+    /* parameters */ ParameterIndex(26),
+    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(/* invalid */),
+    /* return_number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [57] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 2,
+    /* num_template_types */ 1,
+    /* num_template_numbers */ 1,
+    /* template_types */ TemplateTypeIndex(20),
+    /* template_numbers */ TemplateNumberIndex(9),
+    /* parameters */ ParameterIndex(102),
+    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(2),
+    /* return_number_matcher_indices */ NumberMatcherIndicesIndex(/* invalid */),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [58] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 2,
+    /* num_template_types */ 1,
+    /* num_template_numbers */ 3,
+    /* template_types */ TemplateTypeIndex(20),
+    /* template_numbers */ TemplateNumberIndex(0),
+    /* parameters */ ParameterIndex(107),
+    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(61),
+    /* return_number_matcher_indices */ NumberMatcherIndicesIndex(4),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [59] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 2,
+    /* num_template_types */ 1,
+    /* num_template_numbers */ 2,
+    /* template_types */ TemplateTypeIndex(20),
+    /* template_numbers */ TemplateNumberIndex(9),
+    /* parameters */ ParameterIndex(109),
+    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(61),
+    /* return_number_matcher_indices */ NumberMatcherIndicesIndex(3),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [60] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 2,
+    /* num_template_types */ 1,
+    /* num_template_numbers */ 2,
+    /* template_types */ TemplateTypeIndex(20),
+    /* template_numbers */ TemplateNumberIndex(9),
+    /* parameters */ ParameterIndex(111),
+    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(23),
+    /* return_number_matcher_indices */ NumberMatcherIndicesIndex(4),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [61] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 2,
+    /* num_template_types */ 1,
+    /* num_template_numbers */ 2,
+    /* template_types */ TemplateTypeIndex(20),
+    /* template_numbers */ TemplateNumberIndex(9),
+    /* parameters */ ParameterIndex(103),
+    /* return_type_matcher_indices */ TypeMatcherIndicesIndex(23),
+    /* return_number_matcher_indices */ NumberMatcherIndicesIndex(4),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [62] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 2,
+    /* num_template_types */ 1,
+    /* num_template_numbers */ 1,
+    /* template_types */ TemplateTypeIndex(20),
+    /* template_numbers */ TemplateNumberIndex(9),
+    /* parameters */ ParameterIndex(112),
     /* return_type_matcher_indices */ TypeMatcherIndicesIndex(23),
     /* return_number_matcher_indices */ NumberMatcherIndicesIndex(1),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
@@ -1675,112 +3072,172 @@
     /* [0] */
     /* fn array_length<I : u32, A : access>(ptr<storage, struct_with_runtime_array, A>, I) -> u32 */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(12),
+    /* overloads */ OverloadIndex(52),
   },
   {
     /* [1] */
     /* fn atomic_and<T : iu32, U : u32, S : workgroup_or_storage>(ptr<S, atomic<T>, read_write>, U, U, T) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(13),
+    /* overloads */ OverloadIndex(53),
   },
   {
     /* [2] */
     /* fn atomic_compare_exchange<T : iu32, U : u32, S : workgroup_or_storage>(ptr<S, atomic<T>, read_write>, U, U, U, T, T) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(14),
+    /* overloads */ OverloadIndex(54),
   },
   {
     /* [3] */
     /* fn atomic_exchange<T : iu32, U : u32, S : workgroup_or_storage>(ptr<S, atomic<T>, read_write>, U, U, T) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(13),
+    /* overloads */ OverloadIndex(53),
   },
   {
     /* [4] */
     /* fn atomic_iadd<T : iu32, U : u32, S : workgroup_or_storage>(ptr<S, atomic<T>, read_write>, U, U, T) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(13),
+    /* overloads */ OverloadIndex(53),
   },
   {
     /* [5] */
     /* fn atomic_isub<T : iu32, U : u32, S : workgroup_or_storage>(ptr<S, atomic<T>, read_write>, U, U, T) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(13),
+    /* overloads */ OverloadIndex(53),
   },
   {
     /* [6] */
     /* fn atomic_load<T : iu32, U : u32, S : workgroup_or_storage>(ptr<S, atomic<T>, read_write>, U, U) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(15),
+    /* overloads */ OverloadIndex(55),
   },
   {
     /* [7] */
     /* fn atomic_or<T : iu32, U : u32, S : workgroup_or_storage>(ptr<S, atomic<T>, read_write>, U, U, T) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(13),
+    /* overloads */ OverloadIndex(53),
   },
   {
     /* [8] */
     /* fn atomic_smax<T : iu32, U : u32, S : workgroup_or_storage>(ptr<S, atomic<T>, read_write>, U, U, T) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(13),
+    /* overloads */ OverloadIndex(53),
   },
   {
     /* [9] */
     /* fn atomic_smin<T : iu32, U : u32, S : workgroup_or_storage>(ptr<S, atomic<T>, read_write>, U, U, T) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(13),
+    /* overloads */ OverloadIndex(53),
   },
   {
     /* [10] */
     /* fn atomic_store<T : iu32, U : u32, S : workgroup_or_storage>(ptr<S, atomic<T>, read_write>, U, U, T) */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(16),
+    /* overloads */ OverloadIndex(56),
   },
   {
     /* [11] */
     /* fn atomic_umax<T : iu32, U : u32, S : workgroup_or_storage>(ptr<S, atomic<T>, read_write>, U, U, T) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(13),
+    /* overloads */ OverloadIndex(53),
   },
   {
     /* [12] */
     /* fn atomic_umin<T : iu32, U : u32, S : workgroup_or_storage>(ptr<S, atomic<T>, read_write>, U, U, T) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(13),
+    /* overloads */ OverloadIndex(53),
   },
   {
     /* [13] */
     /* fn atomic_xor<T : iu32, U : u32, S : workgroup_or_storage>(ptr<S, atomic<T>, read_write>, U, U, T) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(13),
+    /* overloads */ OverloadIndex(53),
   },
   {
     /* [14] */
     /* fn dot<N : num, T : f32_f16>(vec<N, T>, vec<N, T>) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(17),
+    /* overloads */ OverloadIndex(57),
   },
   {
     /* [15] */
-    /* fn matrix_times_matrix<T : f32_f16, K : num, C : num, R : num>(mat<K, R, T>, mat<C, K, T>) -> mat<C, R, T> */
-    /* num overloads */ 1,
-    /* overloads */ OverloadIndex(18),
+    /* fn image_dref_gather<A : f32, B : iu32>(sampled_image<texture_depth_2d>, vec2<f32>, A, B) -> vec4<f32> */
+    /* fn image_dref_gather<A : f32, B : iu32, C : iu32>(sampled_image<texture_depth_2d>, vec2<f32>, A, B, vec2<C>) -> vec4<f32> */
+    /* fn image_dref_gather<A : f32, B : iu32>(sampled_image<texture_depth_2d_array>, vec3<f32>, A, B) -> vec4<f32> */
+    /* fn image_dref_gather<A : f32, B : iu32, C : iu32>(sampled_image<texture_depth_2d_array>, vec3<f32>, A, B, vec2<C>) -> vec4<f32> */
+    /* fn image_dref_gather<A : f32, B : iu32>(sampled_image<texture_depth_cube>, vec3<f32>, A, B) -> vec4<f32> */
+    /* fn image_dref_gather<A : f32, B : iu32>(sampled_image<texture_depth_cube_array>, vec4<f32>, A, B) -> vec4<f32> */
+    /* num overloads */ 6,
+    /* overloads */ OverloadIndex(44),
   },
   {
     /* [16] */
-    /* fn matrix_times_scalar<T : f32_f16, N : num, M : num>(mat<N, M, T>, T) -> mat<N, M, T> */
-    /* num overloads */ 1,
-    /* overloads */ OverloadIndex(19),
+    /* fn image_fetch<T : fiu32, C : iu32, I : iu32, S : iu32>(texture_1d<T>, C, I, S) -> vec4<T> */
+    /* fn image_fetch<T : fiu32, C : iu32, I : iu32, S : iu32>(texture_2d<T>, vec2<C>, I, S) -> vec4<T> */
+    /* fn image_fetch<T : fiu32, C : iu32, I : iu32, S : iu32>(texture_2d_array<T>, vec3<C>, I, S) -> vec4<T> */
+    /* fn image_fetch<T : fiu32, C : iu32, I : iu32, S : iu32>(texture_3d<T>, vec3<C>, I, S) -> vec4<T> */
+    /* fn image_fetch<T : fiu32, C : iu32, I : iu32, S : iu32>(texture_multisampled_2d<T>, vec2<C>, I, S) -> vec4<T> */
+    /* fn image_fetch<I : iu32, C : iu32, S : iu32>(texture_depth_2d, vec2<C>, I, S) -> vec4<f32> */
+    /* fn image_fetch<I : iu32, C : iu32, S : iu32>(texture_depth_2d_array, vec3<C>, I, S) -> vec4<f32> */
+    /* fn image_fetch<I : iu32, C : iu32, S : iu32>(texture_depth_multisampled_2d, vec2<C>, I, S) -> vec4<f32> */
+    /* num overloads */ 8,
+    /* overloads */ OverloadIndex(36),
   },
   {
     /* [17] */
-    /* fn matrix_times_vector<T : f32_f16, N : num, M : num>(mat<N, M, T>, vec<N, T>) -> vec<M, T> */
-    /* num overloads */ 1,
-    /* overloads */ OverloadIndex(20),
+    /* fn image_gather<T : fiu32, A : iu32, B : iu32>(sampled_image<texture_1d<T>>, vec2<f32>, A, B) -> vec4<T> */
+    /* fn image_gather<T : fiu32, A : iu32, B : iu32>(sampled_image<texture_2d<T>>, vec2<f32>, A, B) -> vec4<T> */
+    /* fn image_gather<T : fiu32, A : iu32, B : iu32>(sampled_image<texture_2d<T>>, vec2<f32>, A, B, vec2<i32>) -> vec4<T> */
+    /* fn image_gather<T : fiu32, A : iu32, B : iu32>(sampled_image<texture_2d_array<T>>, vec3<f32>, A, B) -> vec4<T> */
+    /* fn image_gather<T : fiu32, A : iu32, B : iu32, C : iu32>(sampled_image<texture_2d_array<T>>, vec3<f32>, A, B, vec2<C>) -> vec4<T> */
+    /* fn image_gather<T : fiu32, A : iu32, B : iu32>(sampled_image<texture_3d<T>>, vec2<f32>, A, B) -> vec4<T> */
+    /* fn image_gather<T : fiu32, A : iu32, B : iu32>(sampled_image<texture_cube<T>>, vec3<f32>, A, B) -> vec4<T> */
+    /* fn image_gather<T : fiu32, A : iu32, B : iu32>(sampled_image<texture_cube_array<T>>, vec4<f32>, A, B) -> vec4<T> */
+    /* fn image_gather<A : iu32, B : iu32>(sampled_image<texture_depth_2d>, vec2<f32>, A, B) -> vec4<f32> */
+    /* fn image_gather<A : iu32, B : iu32, C : iu32>(sampled_image<texture_depth_2d>, vec2<f32>, A, B, vec2<C>) -> vec4<f32> */
+    /* fn image_gather<A : iu32, B : iu32>(sampled_image<texture_depth_2d_array>, vec3<f32>, A, B) -> vec4<f32> */
+    /* fn image_gather<A : iu32, B : iu32, C : iu32>(sampled_image<texture_depth_2d_array>, vec3<f32>, A, B, vec2<C>) -> vec4<f32> */
+    /* fn image_gather<A : iu32, B : iu32>(sampled_image<texture_depth_cube>, vec3<f32>, A, B) -> vec4<f32> */
+    /* fn image_gather<A : iu32, B : iu32>(sampled_image<texture_depth_cube_array>, vec4<f32>, A, B) -> vec4<f32> */
+    /* num overloads */ 14,
+    /* overloads */ OverloadIndex(0),
   },
   {
     /* [18] */
+    /* fn image_read<F : f32_texel_format, A : readable, C : iu32, S : iu32>(texture_storage_1d<F, A>, C, S) -> vec4<f32> */
+    /* fn image_read<F : i32_texel_format, A : readable, C : iu32, S : iu32>(texture_storage_1d<F, A>, C, S) -> vec4<i32> */
+    /* fn image_read<F : u32_texel_format, A : readable, C : iu32, S : iu32>(texture_storage_1d<F, A>, C, S) -> vec4<u32> */
+    /* fn image_read<F : f32_texel_format, A : readable, C : iu32, S : iu32>(texture_storage_2d<F, A>, vec2<C>, S) -> vec4<f32> */
+    /* fn image_read<F : i32_texel_format, A : readable, C : iu32, S : iu32>(texture_storage_2d<F, A>, vec2<C>, S) -> vec4<i32> */
+    /* fn image_read<F : u32_texel_format, A : readable, C : iu32, S : iu32>(texture_storage_2d<F, A>, vec2<C>, S) -> vec4<u32> */
+    /* fn image_read<F : f32_texel_format, A : readable, C : iu32, S : iu32>(texture_storage_2d_array<F, A>, vec3<C>, S) -> vec4<f32> */
+    /* fn image_read<F : i32_texel_format, A : readable, C : iu32, S : iu32>(texture_storage_2d_array<F, A>, vec3<C>, S) -> vec4<i32> */
+    /* fn image_read<F : u32_texel_format, A : readable, C : iu32, S : iu32>(texture_storage_2d_array<F, A>, vec3<C>, S) -> vec4<u32> */
+    /* fn image_read<F : f32_texel_format, A : readable, C : iu32, S : iu32>(texture_storage_3d<F, A>, vec3<C>, S) -> vec4<f32> */
+    /* fn image_read<F : i32_texel_format, A : readable, C : iu32, S : iu32>(texture_storage_3d<F, A>, vec3<C>, S) -> vec4<i32> */
+    /* fn image_read<F : u32_texel_format, A : readable, C : iu32, S : iu32>(texture_storage_3d<F, A>, vec3<C>, S) -> vec4<u32> */
+    /* num overloads */ 12,
+    /* overloads */ OverloadIndex(14),
+  },
+  {
+    /* [19] */
+    /* fn matrix_times_matrix<T : f32_f16, K : num, C : num, R : num>(mat<K, R, T>, mat<C, K, T>) -> mat<C, R, T> */
+    /* num overloads */ 1,
+    /* overloads */ OverloadIndex(58),
+  },
+  {
+    /* [20] */
+    /* fn matrix_times_scalar<T : f32_f16, N : num, M : num>(mat<N, M, T>, T) -> mat<N, M, T> */
+    /* num overloads */ 1,
+    /* overloads */ OverloadIndex(59),
+  },
+  {
+    /* [21] */
+    /* fn matrix_times_vector<T : f32_f16, N : num, M : num>(mat<N, M, T>, vec<N, T>) -> vec<M, T> */
+    /* num overloads */ 1,
+    /* overloads */ OverloadIndex(60),
+  },
+  {
+    /* [22] */
     /* fn sampled_image<T : fiu32, S : samplers>(texture_1d<T>, S) -> sampled_image<texture_1d<T>> */
     /* fn sampled_image<T : fiu32, S : samplers>(texture_2d<T>, S) -> sampled_image<texture_2d<T>> */
     /* fn sampled_image<T : fiu32, S : samplers>(texture_2d_array<T>, S) -> sampled_image<texture_2d_array<T>> */
@@ -1792,26 +3249,26 @@
     /* fn sampled_image<S : samplers>(texture_depth_cube, S) -> sampled_image<texture_depth_cube> */
     /* fn sampled_image<S : samplers>(texture_depth_cube_array, S) -> sampled_image<texture_depth_cube_array> */
     /* num overloads */ 10,
-    /* overloads */ OverloadIndex(0),
+    /* overloads */ OverloadIndex(26),
   },
   {
-    /* [19] */
+    /* [23] */
     /* fn select<T : scalar>(bool, T, T) -> T */
     /* fn select<N : num, T : scalar>(vec<N, bool>, vec<N, T>, vec<N, T>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ OverloadIndex(10),
+    /* overloads */ OverloadIndex(50),
   },
   {
-    /* [20] */
+    /* [24] */
     /* fn vector_times_matrix<T : f32_f16, N : num, M : num>(vec<N, T>, mat<M, N, T>) -> vec<M, T> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(21),
+    /* overloads */ OverloadIndex(61),
   },
   {
-    /* [21] */
+    /* [25] */
     /* fn vector_times_scalar<T : f32_f16, N : num>(vec<N, T>, T) -> vec<N, T> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(22),
+    /* overloads */ OverloadIndex(62),
   },
 };
 
diff --git a/src/tint/lang/spirv/intrinsic/data/type_matchers.h b/src/tint/lang/spirv/intrinsic/data/type_matchers.h
index 0f94b78..56f57fd 100644
--- a/src/tint/lang/spirv/intrinsic/data/type_matchers.h
+++ b/src/tint/lang/spirv/intrinsic/data/type_matchers.h
@@ -48,8 +48,8 @@
         T = ty;
         return true;
     }
-    if (auto* v = ty->As<core::type::SampledTexture>()) {
-        T = v->type();
+    if (auto* v = ty->As<spirv::type::SampledImage>()) {
+        T = v->Image();
         return true;
     }
     return false;
diff --git a/src/tint/lang/spirv/ir/function.cc b/src/tint/lang/spirv/ir/function.cc
index a0e4d8f..b535f1e 100644
--- a/src/tint/lang/spirv/ir/function.cc
+++ b/src/tint/lang/spirv/ir/function.cc
@@ -59,6 +59,14 @@
             return "spirv.atomic_xor";
         case Function::kDot:
             return "spirv.dot";
+        case Function::kImageDrefGather:
+            return "spirv.image_dref_gather";
+        case Function::kImageFetch:
+            return "spirv.image_fetch";
+        case Function::kImageGather:
+            return "spirv.image_gather";
+        case Function::kImageRead:
+            return "spirv.image_read";
         case Function::kMatrixTimesMatrix:
             return "spirv.matrix_times_matrix";
         case Function::kMatrixTimesScalar:
diff --git a/src/tint/lang/spirv/ir/function.h b/src/tint/lang/spirv/ir/function.h
index 50cd120..eb63425 100644
--- a/src/tint/lang/spirv/ir/function.h
+++ b/src/tint/lang/spirv/ir/function.h
@@ -49,6 +49,10 @@
     kAtomicUmin,
     kAtomicXor,
     kDot,
+    kImageDrefGather,
+    kImageFetch,
+    kImageGather,
+    kImageRead,
     kMatrixTimesMatrix,
     kMatrixTimesScalar,
     kMatrixTimesVector,
diff --git a/src/tint/lang/spirv/ir/intrinsic.cc b/src/tint/lang/spirv/ir/intrinsic.cc
index 86623ba..542ee90 100644
--- a/src/tint/lang/spirv/ir/intrinsic.cc
+++ b/src/tint/lang/spirv/ir/intrinsic.cc
@@ -29,24 +29,12 @@
 /// @param str the string to parse
 /// @returns the parsed enum, or Intrinsic::kUndefined if the string could not be parsed.
 Intrinsic ParseIntrinsic(std::string_view str) {
-    if (str == "image_dref_gather") {
-        return Intrinsic::kImageDrefGather;
-    }
-    if (str == "image_fetch") {
-        return Intrinsic::kImageFetch;
-    }
-    if (str == "image_gather") {
-        return Intrinsic::kImageGather;
-    }
     if (str == "image_query_size") {
         return Intrinsic::kImageQuerySize;
     }
     if (str == "image_query_size_lod") {
         return Intrinsic::kImageQuerySizeLod;
     }
-    if (str == "image_read") {
-        return Intrinsic::kImageRead;
-    }
     if (str == "image_sample_dref_explicit_lod") {
         return Intrinsic::kImageSampleDrefExplicitLod;
     }
@@ -69,18 +57,10 @@
     switch (value) {
         case Intrinsic::kUndefined:
             return "undefined";
-        case Intrinsic::kImageDrefGather:
-            return "image_dref_gather";
-        case Intrinsic::kImageFetch:
-            return "image_fetch";
-        case Intrinsic::kImageGather:
-            return "image_gather";
         case Intrinsic::kImageQuerySize:
             return "image_query_size";
         case Intrinsic::kImageQuerySizeLod:
             return "image_query_size_lod";
-        case Intrinsic::kImageRead:
-            return "image_read";
         case Intrinsic::kImageSampleDrefExplicitLod:
             return "image_sample_dref_explicit_lod";
         case Intrinsic::kImageSampleDrefImplicitLod:
diff --git a/src/tint/lang/spirv/ir/intrinsic.h b/src/tint/lang/spirv/ir/intrinsic.h
index a45688c..a90e848 100644
--- a/src/tint/lang/spirv/ir/intrinsic.h
+++ b/src/tint/lang/spirv/ir/intrinsic.h
@@ -34,12 +34,8 @@
 /// Intrinsic
 enum class Intrinsic : uint8_t {
     kUndefined,
-    kImageDrefGather,
-    kImageFetch,
-    kImageGather,
     kImageQuerySize,
     kImageQuerySizeLod,
-    kImageRead,
     kImageSampleDrefExplicitLod,
     kImageSampleDrefImplicitLod,
     kImageSampleExplicitLod,
@@ -65,12 +61,8 @@
 Intrinsic ParseIntrinsic(std::string_view str);
 
 constexpr const char* kIntrinsicStrings[] = {
-    "image_dref_gather",
-    "image_fetch",
-    "image_gather",
     "image_query_size",
     "image_query_size_lod",
-    "image_read",
     "image_sample_dref_explicit_lod",
     "image_sample_dref_implicit_lod",
     "image_sample_explicit_lod",
diff --git a/src/tint/lang/spirv/reader/BUILD.bazel b/src/tint/lang/spirv/reader/BUILD.bazel
index 0c153ea..3601ba5 100644
--- a/src/tint/lang/spirv/reader/BUILD.bazel
+++ b/src/tint/lang/spirv/reader/BUILD.bazel
@@ -36,6 +36,7 @@
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/type",
     "//src/tint/lang/spirv/reader/common",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/program",
     "//src/tint/lang/wgsl/sem",
diff --git a/src/tint/lang/spirv/reader/BUILD.cmake b/src/tint/lang/spirv/reader/BUILD.cmake
index 282235d..6dd4628 100644
--- a/src/tint/lang/spirv/reader/BUILD.cmake
+++ b/src/tint/lang/spirv/reader/BUILD.cmake
@@ -41,6 +41,7 @@
   tint_lang_core_constant
   tint_lang_core_type
   tint_lang_spirv_reader_common
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_program
   tint_lang_wgsl_sem
diff --git a/src/tint/lang/spirv/reader/BUILD.gn b/src/tint/lang/spirv/reader/BUILD.gn
index eeb5258..80f55cb 100644
--- a/src/tint/lang/spirv/reader/BUILD.gn
+++ b/src/tint/lang/spirv/reader/BUILD.gn
@@ -35,6 +35,7 @@
       "${tint_src_dir}/lang/core/constant",
       "${tint_src_dir}/lang/core/type",
       "${tint_src_dir}/lang/spirv/reader/common",
+      "${tint_src_dir}/lang/wgsl",
       "${tint_src_dir}/lang/wgsl/ast",
       "${tint_src_dir}/lang/wgsl/program",
       "${tint_src_dir}/lang/wgsl/sem",
diff --git a/src/tint/lang/spirv/reader/ast_lower/BUILD.bazel b/src/tint/lang/spirv/reader/ast_lower/BUILD.bazel
index 5f0918e..0a5204d 100644
--- a/src/tint/lang/spirv/reader/ast_lower/BUILD.bazel
+++ b/src/tint/lang/spirv/reader/ast_lower/BUILD.bazel
@@ -42,6 +42,7 @@
     "//src/tint/lang/core",
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/type",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/ast/transform",
     "//src/tint/lang/wgsl/program",
@@ -78,6 +79,7 @@
     "//src/tint/lang/core",
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/type",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/ast/transform",
     "//src/tint/lang/wgsl/ast/transform:test",
diff --git a/src/tint/lang/spirv/reader/ast_lower/BUILD.cmake b/src/tint/lang/spirv/reader/ast_lower/BUILD.cmake
index 29a4202..034a369 100644
--- a/src/tint/lang/spirv/reader/ast_lower/BUILD.cmake
+++ b/src/tint/lang/spirv/reader/ast_lower/BUILD.cmake
@@ -43,6 +43,7 @@
   tint_lang_core
   tint_lang_core_constant
   tint_lang_core_type
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_ast_transform
   tint_lang_wgsl_program
@@ -82,6 +83,7 @@
   tint_lang_core
   tint_lang_core_constant
   tint_lang_core_type
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_ast_transform
   tint_lang_wgsl_ast_transform_test
diff --git a/src/tint/lang/spirv/reader/ast_lower/BUILD.gn b/src/tint/lang/spirv/reader/ast_lower/BUILD.gn
index 730ff27..fee420d 100644
--- a/src/tint/lang/spirv/reader/ast_lower/BUILD.gn
+++ b/src/tint/lang/spirv/reader/ast_lower/BUILD.gn
@@ -45,6 +45,7 @@
       "${tint_src_dir}/lang/core",
       "${tint_src_dir}/lang/core/constant",
       "${tint_src_dir}/lang/core/type",
+      "${tint_src_dir}/lang/wgsl",
       "${tint_src_dir}/lang/wgsl/ast",
       "${tint_src_dir}/lang/wgsl/ast/transform",
       "${tint_src_dir}/lang/wgsl/program",
@@ -82,6 +83,7 @@
         "${tint_src_dir}/lang/core",
         "${tint_src_dir}/lang/core/constant",
         "${tint_src_dir}/lang/core/type",
+        "${tint_src_dir}/lang/wgsl",
         "${tint_src_dir}/lang/wgsl/ast",
         "${tint_src_dir}/lang/wgsl/ast/transform",
         "${tint_src_dir}/lang/wgsl/ast/transform:unittests",
diff --git a/src/tint/lang/spirv/reader/ast_parser/BUILD.bazel b/src/tint/lang/spirv/reader/ast_parser/BUILD.bazel
index ff65b46..4a97ba1 100644
--- a/src/tint/lang/spirv/reader/ast_parser/BUILD.bazel
+++ b/src/tint/lang/spirv/reader/ast_parser/BUILD.bazel
@@ -55,6 +55,7 @@
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/type",
     "//src/tint/lang/spirv/reader/common",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/ast/transform",
     "//src/tint/lang/wgsl/program",
@@ -133,6 +134,7 @@
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/type",
     "//src/tint/lang/spirv/reader/common",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/program",
     "//src/tint/lang/wgsl/sem",
diff --git a/src/tint/lang/spirv/reader/ast_parser/BUILD.cmake b/src/tint/lang/spirv/reader/ast_parser/BUILD.cmake
index 2748739..c8b5c9d 100644
--- a/src/tint/lang/spirv/reader/ast_parser/BUILD.cmake
+++ b/src/tint/lang/spirv/reader/ast_parser/BUILD.cmake
@@ -56,6 +56,7 @@
   tint_lang_core_constant
   tint_lang_core_type
   tint_lang_spirv_reader_common
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_ast_transform
   tint_lang_wgsl_program
@@ -139,6 +140,7 @@
   tint_lang_core_constant
   tint_lang_core_type
   tint_lang_spirv_reader_common
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_program
   tint_lang_wgsl_sem
diff --git a/src/tint/lang/spirv/reader/ast_parser/BUILD.gn b/src/tint/lang/spirv/reader/ast_parser/BUILD.gn
index 5c3d82b..163e8be 100644
--- a/src/tint/lang/spirv/reader/ast_parser/BUILD.gn
+++ b/src/tint/lang/spirv/reader/ast_parser/BUILD.gn
@@ -58,6 +58,7 @@
       "${tint_src_dir}/lang/core/constant",
       "${tint_src_dir}/lang/core/type",
       "${tint_src_dir}/lang/spirv/reader/common",
+      "${tint_src_dir}/lang/wgsl",
       "${tint_src_dir}/lang/wgsl/ast",
       "${tint_src_dir}/lang/wgsl/ast/transform",
       "${tint_src_dir}/lang/wgsl/program",
@@ -139,6 +140,7 @@
         "${tint_src_dir}/lang/core/constant",
         "${tint_src_dir}/lang/core/type",
         "${tint_src_dir}/lang/spirv/reader/common",
+        "${tint_src_dir}/lang/wgsl",
         "${tint_src_dir}/lang/wgsl/ast",
         "${tint_src_dir}/lang/wgsl/program",
         "${tint_src_dir}/lang/wgsl/sem",
diff --git a/src/tint/lang/spirv/reader/ast_parser/ast_parser.cc b/src/tint/lang/spirv/reader/ast_parser/ast_parser.cc
index ae45f74..eea7fce 100644
--- a/src/tint/lang/spirv/reader/ast_parser/ast_parser.cc
+++ b/src/tint/lang/spirv/reader/ast_parser/ast_parser.cc
@@ -2574,7 +2574,7 @@
             const auto access =
                 usage.IsStorageReadWriteTexture() ? core::Access::kReadWrite : core::Access::kWrite;
             if (access == core::Access::kReadWrite) {
-                Enable(core::Extension::kChromiumExperimentalReadWriteStorageTexture);
+                Enable(wgsl::Extension::kChromiumExperimentalReadWriteStorageTexture);
             }
             const auto format = enum_converter_.ToTexelFormat(image_type->format());
             if (format == core::TexelFormat::kUndefined) {
diff --git a/src/tint/lang/spirv/reader/ast_parser/ast_parser.h b/src/tint/lang/spirv/reader/ast_parser/ast_parser.h
index bf5df6b..69aa099 100644
--- a/src/tint/lang/spirv/reader/ast_parser/ast_parser.h
+++ b/src/tint/lang/spirv/reader/ast_parser/ast_parser.h
@@ -740,7 +740,7 @@
 
     /// Enable a WGSL extension, if not already enabled.
     /// @param extension the extension to enable
-    void Enable(core::Extension extension) {
+    void Enable(wgsl::Extension extension) {
         if (enabled_extensions_.Add(extension)) {
             builder_.Enable(extension);
         }
@@ -935,7 +935,7 @@
     WorkgroupSizeInfo workgroup_size_builtin_;
 
     /// Set of WGSL extensions that have been enabled.
-    Hashset<core::Extension, 4> enabled_extensions_;
+    Hashset<wgsl::Extension, 4> enabled_extensions_;
 };
 
 }  // namespace tint::spirv::reader::ast_parser
diff --git a/src/tint/lang/spirv/reader/ast_parser/function.cc b/src/tint/lang/spirv/reader/ast_parser/function.cc
index e83e959..754fff5 100644
--- a/src/tint/lang/spirv/reader/ast_parser/function.cc
+++ b/src/tint/lang/spirv/reader/ast_parser/function.cc
@@ -5312,7 +5312,7 @@
         if (memory != uint32_t(spv::Scope::Workgroup)) {
             return Fail() << "textureBarrier requires workgroup memory scope";
         }
-        parser_impl_.Enable(core::Extension::kChromiumExperimentalReadWriteStorageTexture);
+        parser_impl_.Enable(wgsl::Extension::kChromiumExperimentalReadWriteStorageTexture);
         AddStatement(builder_.CallStmt(builder_.Call("textureBarrier")));
         semantics &= ~static_cast<uint32_t>(spv::MemorySemanticsMask::ImageMemory);
     }
diff --git a/src/tint/lang/spirv/reader/ast_parser/parse.cc b/src/tint/lang/spirv/reader/ast_parser/parse.cc
index a0bee33..abef728 100644
--- a/src/tint/lang/spirv/reader/ast_parser/parse.cc
+++ b/src/tint/lang/spirv/reader/ast_parser/parse.cc
@@ -44,7 +44,7 @@
     if (options.allow_non_uniform_derivatives) {
         // Suppress errors regarding non-uniform derivative operations if requested, by adding a
         // diagnostic directive to the module.
-        builder.DiagnosticDirective(core::DiagnosticSeverity::kOff, "derivative_uniformity");
+        builder.DiagnosticDirective(wgsl::DiagnosticSeverity::kOff, "derivative_uniformity");
     }
 
     if (!options.allow_chromium_extensions) {
@@ -52,23 +52,23 @@
         for (auto* enable : builder.AST().Enables()) {
             for (auto* extension : enable->extensions) {
                 switch (extension->name) {
-                    case core::Extension::kUndefined:
-                    case core::Extension::kChromiumDisableUniformityAnalysis:
-                    case core::Extension::kChromiumExperimentalDp4A:
-                    case core::Extension::kChromiumExperimentalFullPtrParameters:
-                    case core::Extension::kChromiumExperimentalPixelLocal:
-                    case core::Extension::kChromiumExperimentalPushConstant:
-                    case core::Extension::kChromiumExperimentalReadWriteStorageTexture:
-                    case core::Extension::kChromiumExperimentalSubgroups:
-                    case core::Extension::kChromiumInternalDualSourceBlending:
-                    case core::Extension::kChromiumInternalRelaxedUniformLayout: {
+                    case wgsl::Extension::kUndefined:
+                    case wgsl::Extension::kChromiumDisableUniformityAnalysis:
+                    case wgsl::Extension::kChromiumExperimentalDp4A:
+                    case wgsl::Extension::kChromiumExperimentalFullPtrParameters:
+                    case wgsl::Extension::kChromiumExperimentalPixelLocal:
+                    case wgsl::Extension::kChromiumExperimentalPushConstant:
+                    case wgsl::Extension::kChromiumExperimentalReadWriteStorageTexture:
+                    case wgsl::Extension::kChromiumExperimentalSubgroups:
+                    case wgsl::Extension::kChromiumInternalDualSourceBlending:
+                    case wgsl::Extension::kChromiumInternalRelaxedUniformLayout: {
                         StringStream ss;
                         ss << "module requires " << ToString(extension->name)
                            << ", but 'allow-chromium-extensions' was not passed";
                         builder.Diagnostics().add_error(diag::System::Reader, ss.str());
                         return Program(std::move(builder));
                     }
-                    case core::Extension::kF16:
+                    case wgsl::Extension::kF16:
                         break;
                 }
             }
diff --git a/src/tint/lang/spirv/spirv.def b/src/tint/lang/spirv/spirv.def
index 9557909..5b858ae 100644
--- a/src/tint/lang/spirv/spirv.def
+++ b/src/tint/lang/spirv/spirv.def
@@ -47,10 +47,16 @@
 type texture_3d<T>
 type texture_cube<T>
 type texture_cube_array<T>
+type texture_multisampled_2d<T>
 type texture_depth_2d
 type texture_depth_2d_array
 type texture_depth_cube
 type texture_depth_cube_array
+type texture_depth_multisampled_2d
+type texture_storage_1d<F: texel_format, A: access>
+type texture_storage_2d<F: texel_format, A: access>
+type texture_storage_2d_array<F: texel_format, A: access>
+type texture_storage_3d<F: texel_format, A: access>
 type ptr<S: address_space, T, A: access>
 
 type struct_with_runtime_array
@@ -72,6 +78,26 @@
   read_write
 }
 
+enum texel_format {
+  bgra8unorm
+  rgba8unorm
+  rgba8snorm
+  rgba8uint
+  rgba8sint
+  rgba16uint
+  rgba16sint
+  rgba16float
+  r32uint
+  r32sint
+  r32float
+  rg32uint
+  rg32sint
+  rg32float
+  rgba32uint
+  rgba32sint
+  rgba32float
+}
+
 match f32_f16: f32 | f16
 match iu32: i32 | u32
 match fiu32: f32 | i32 | u32
@@ -88,17 +114,38 @@
   : sampler
   | sampler_comparison
 
+match f32_texel_format
+  : texel_format.bgra8unorm
+  | texel_format.rgba8unorm
+  | texel_format.rgba8snorm
+  | texel_format.rgba16float
+  | texel_format.r32float
+  | texel_format.rg32float
+  | texel_format.rgba32float
+match i32_texel_format
+  : texel_format.rgba8sint
+  | texel_format.rgba16sint
+  | texel_format.r32sint
+  | texel_format.rg32sint
+  | texel_format.rgba32sint
+match u32_texel_format
+  : texel_format.rgba8uint
+  | texel_format.rgba16uint
+  | texel_format.r32uint
+  | texel_format.rg32uint
+  | texel_format.rgba32uint
+
+match readable
+  : access.read
+  | access.read_write
+
 ////////////////////////////////////////////////////////////////////////////////
 // Enumerators                                                                //
 ////////////////////////////////////////////////////////////////////////////////
 
 enum intrinsic {
-  image_fetch
-  image_gather
-  image_dref_gather
   image_query_size
   image_query_size_lod
-  image_read
   image_sample_implicit_lod
   image_sample_explicit_lod
   image_sample_dref_implicit_lod
@@ -127,6 +174,50 @@
 
 fn dot<N: num, T: f32_f16>(vec<N, T>, vec<N, T>) -> T
 
+fn image_dref_gather<A: f32, B: iu32>(sampled_image<texture_depth_2d>, vec2<f32>, A, B) -> vec4<f32>
+fn image_dref_gather<A: f32, B: iu32, C: iu32>(sampled_image<texture_depth_2d>, vec2<f32>, A, B, vec2<C>) -> vec4<f32>
+fn image_dref_gather<A: f32, B: iu32>(sampled_image<texture_depth_2d_array>, vec3<f32>, A, B) -> vec4<f32>
+fn image_dref_gather<A: f32, B: iu32, C: iu32>(sampled_image<texture_depth_2d_array>, vec3<f32>, A, B, vec2<C>) -> vec4<f32>
+fn image_dref_gather<A: f32, B: iu32>(sampled_image<texture_depth_cube>, vec3<f32>, A, B) -> vec4<f32>
+fn image_dref_gather<A: f32, B: iu32>(sampled_image<texture_depth_cube_array>, vec4<f32>, A, B) -> vec4<f32>
+
+fn image_fetch<T: fiu32, C: iu32, I: iu32, S: iu32>(texture_1d<T>, C, I, S) -> vec4<T>
+fn image_fetch<T: fiu32, C: iu32, I: iu32, S: iu32>(texture_2d<T>, vec2<C>, I, S) -> vec4<T>
+fn image_fetch<T: fiu32, C: iu32, I: iu32, S: iu32>(texture_2d_array<T>, vec3<C>, I, S) -> vec4<T>
+fn image_fetch<T: fiu32, C: iu32, I: iu32, S: iu32>(texture_3d<T>, vec3<C>, I, S) -> vec4<T>
+fn image_fetch<T: fiu32, C: iu32, I: iu32, S: iu32>(texture_multisampled_2d<T>, vec2<C>, I, S) -> vec4<T>
+fn image_fetch<I: iu32, C: iu32, S: iu32>(texture_depth_2d, vec2<C>, I, S) -> vec4<f32>
+fn image_fetch<I: iu32, C: iu32, S: iu32>(texture_depth_2d_array, vec3<C>, I, S) -> vec4<f32>
+fn image_fetch<I: iu32, C: iu32, S: iu32>(texture_depth_multisampled_2d, vec2<C>, I, S) -> vec4<f32>
+
+fn image_gather<T: fiu32, A: iu32, B: iu32>(sampled_image<texture_1d<T> >, vec2<f32>, A, B) -> vec4<T>
+fn image_gather<T: fiu32, A: iu32, B: iu32>(sampled_image<texture_2d<T> >, vec2<f32>, A, B) -> vec4<T>
+fn image_gather<T: fiu32, A: iu32, B: iu32>(sampled_image<texture_2d<T> >, vec2<f32>, A, B, vec2<i32>) -> vec4<T>
+fn image_gather<T: fiu32, A: iu32, B: iu32>(sampled_image<texture_2d_array<T> >, vec3<f32>, A, B) -> vec4<T>
+fn image_gather<T: fiu32, A: iu32, B: iu32, C: iu32>(sampled_image<texture_2d_array<T> >, vec3<f32>, A, B, vec2<C>) -> vec4<T>
+fn image_gather<T: fiu32, A: iu32, B: iu32>(sampled_image<texture_3d<T> >, vec2<f32>, A, B) -> vec4<T>
+fn image_gather<T: fiu32, A: iu32, B: iu32>(sampled_image<texture_cube<T> >, vec3<f32>, A, B) -> vec4<T>
+fn image_gather<T: fiu32, A: iu32, B: iu32>(sampled_image<texture_cube_array<T> >, vec4<f32>, A, B) -> vec4<T>
+fn image_gather<A: iu32, B: iu32>(sampled_image<texture_depth_2d>, vec2<f32>, A, B) -> vec4<f32>
+fn image_gather<A: iu32, B: iu32, C: iu32>(sampled_image<texture_depth_2d>, vec2<f32>, A, B, vec2<C>) -> vec4<f32>
+fn image_gather<A: iu32, B: iu32>(sampled_image<texture_depth_2d_array>, vec3<f32>, A, B) -> vec4<f32>
+fn image_gather<A: iu32, B: iu32, C: iu32>(sampled_image<texture_depth_2d_array>, vec3<f32>, A, B, vec2<C>) -> vec4<f32>
+fn image_gather<A: iu32, B: iu32>(sampled_image<texture_depth_cube>, vec3<f32>, A, B) -> vec4<f32>
+fn image_gather<A: iu32, B: iu32>(sampled_image<texture_depth_cube_array>, vec4<f32>, A, B) -> vec4<f32>
+
+fn image_read<F: f32_texel_format, A: readable, C: iu32, S: iu32>(texture_storage_1d<F, A>, C, S) -> vec4<f32>
+fn image_read<F: i32_texel_format, A: readable, C: iu32, S: iu32>(texture_storage_1d<F, A>, C, S) -> vec4<i32>
+fn image_read<F: u32_texel_format, A: readable, C: iu32, S: iu32>(texture_storage_1d<F, A>, C, S) -> vec4<u32>
+fn image_read<F: f32_texel_format, A: readable, C: iu32, S: iu32>(texture_storage_2d<F, A>, vec2<C>, S) -> vec4<f32>
+fn image_read<F: i32_texel_format, A: readable, C: iu32, S: iu32>(texture_storage_2d<F, A>, vec2<C>, S) -> vec4<i32>
+fn image_read<F: u32_texel_format, A: readable, C: iu32, S: iu32>(texture_storage_2d<F, A>, vec2<C>, S) -> vec4<u32>
+fn image_read<F: f32_texel_format, A: readable, C: iu32, S: iu32>(texture_storage_2d_array<F, A>, vec3<C>, S) -> vec4<f32>
+fn image_read<F: i32_texel_format, A: readable, C: iu32, S: iu32>(texture_storage_2d_array<F, A>, vec3<C>, S) -> vec4<i32>
+fn image_read<F: u32_texel_format, A: readable, C: iu32, S: iu32>(texture_storage_2d_array<F, A>, vec3<C>, S) -> vec4<u32>
+fn image_read<F: f32_texel_format, A: readable, C: iu32, S: iu32>(texture_storage_3d<F, A>, vec3<C>, S) -> vec4<f32>
+fn image_read<F: i32_texel_format, A: readable, C: iu32, S: iu32>(texture_storage_3d<F, A>, vec3<C>, S) -> vec4<i32>
+fn image_read<F: u32_texel_format, A: readable, C: iu32, S: iu32>(texture_storage_3d<F, A>, vec3<C>, S) -> vec4<u32>
+
 fn matrix_times_matrix<T: f32_f16, K: num, C: num, R: num>(mat<K, R, T>, mat<C, K, T>) -> mat<C, R, T>
 fn matrix_times_scalar<T: f32_f16, N: num, M: num>(mat<N, M, T>, T) -> mat<N, M, T>
 fn matrix_times_vector<T: f32_f16, N: num, M: num>(mat<N, M, T>, vec<N, T>) -> vec<M, T>
diff --git a/src/tint/lang/spirv/writer/BUILD.bazel b/src/tint/lang/spirv/writer/BUILD.bazel
index f4c8091..e42bedf 100644
--- a/src/tint/lang/spirv/writer/BUILD.bazel
+++ b/src/tint/lang/spirv/writer/BUILD.bazel
@@ -44,6 +44,7 @@
     "//src/tint/lang/core/type",
     "//src/tint/lang/spirv/intrinsic/data",
     "//src/tint/lang/spirv/ir",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/program",
     "//src/tint/lang/wgsl/reader/program_to_ir",
@@ -158,6 +159,7 @@
     "//src/tint/lang/core",
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/type",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/program",
     "//src/tint/lang/wgsl/sem",
diff --git a/src/tint/lang/spirv/writer/BUILD.cmake b/src/tint/lang/spirv/writer/BUILD.cmake
index 239c5b5..b47843a 100644
--- a/src/tint/lang/spirv/writer/BUILD.cmake
+++ b/src/tint/lang/spirv/writer/BUILD.cmake
@@ -51,6 +51,7 @@
   tint_lang_core_type
   tint_lang_spirv_intrinsic_data
   tint_lang_spirv_ir
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_program
   tint_lang_wgsl_reader_program_to_ir
@@ -179,6 +180,7 @@
   tint_lang_core
   tint_lang_core_constant
   tint_lang_core_type
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_program
   tint_lang_wgsl_sem
diff --git a/src/tint/lang/spirv/writer/BUILD.gn b/src/tint/lang/spirv/writer/BUILD.gn
index 0d7c728..a3dd0b8 100644
--- a/src/tint/lang/spirv/writer/BUILD.gn
+++ b/src/tint/lang/spirv/writer/BUILD.gn
@@ -47,6 +47,7 @@
       "${tint_src_dir}/lang/core/type",
       "${tint_src_dir}/lang/spirv/intrinsic/data",
       "${tint_src_dir}/lang/spirv/ir",
+      "${tint_src_dir}/lang/wgsl",
       "${tint_src_dir}/lang/wgsl/ast",
       "${tint_src_dir}/lang/wgsl/program",
       "${tint_src_dir}/lang/wgsl/reader/program_to_ir",
diff --git a/src/tint/lang/spirv/writer/ast_printer/BUILD.bazel b/src/tint/lang/spirv/writer/ast_printer/BUILD.bazel
index b695ddb..99c7cd5 100644
--- a/src/tint/lang/spirv/writer/ast_printer/BUILD.bazel
+++ b/src/tint/lang/spirv/writer/ast_printer/BUILD.bazel
@@ -40,6 +40,7 @@
     "//src/tint/lang/core",
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/type",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/ast/transform",
     "//src/tint/lang/wgsl/helpers",
@@ -112,6 +113,7 @@
     "//src/tint/lang/core",
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/type",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/ast:test",
     "//src/tint/lang/wgsl/program",
diff --git a/src/tint/lang/spirv/writer/ast_printer/BUILD.cmake b/src/tint/lang/spirv/writer/ast_printer/BUILD.cmake
index 0a81588..46151c0 100644
--- a/src/tint/lang/spirv/writer/ast_printer/BUILD.cmake
+++ b/src/tint/lang/spirv/writer/ast_printer/BUILD.cmake
@@ -41,6 +41,7 @@
   tint_lang_core
   tint_lang_core_constant
   tint_lang_core_type
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_ast_transform
   tint_lang_wgsl_helpers
@@ -118,6 +119,7 @@
   tint_lang_core
   tint_lang_core_constant
   tint_lang_core_type
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_ast_test
   tint_lang_wgsl_program
diff --git a/src/tint/lang/spirv/writer/ast_printer/BUILD.gn b/src/tint/lang/spirv/writer/ast_printer/BUILD.gn
index 94377d4..4344f94 100644
--- a/src/tint/lang/spirv/writer/ast_printer/BUILD.gn
+++ b/src/tint/lang/spirv/writer/ast_printer/BUILD.gn
@@ -43,6 +43,7 @@
       "${tint_src_dir}/lang/core",
       "${tint_src_dir}/lang/core/constant",
       "${tint_src_dir}/lang/core/type",
+      "${tint_src_dir}/lang/wgsl",
       "${tint_src_dir}/lang/wgsl/ast",
       "${tint_src_dir}/lang/wgsl/ast/transform",
       "${tint_src_dir}/lang/wgsl/helpers",
@@ -116,6 +117,7 @@
         "${tint_src_dir}/lang/core",
         "${tint_src_dir}/lang/core/constant",
         "${tint_src_dir}/lang/core/type",
+        "${tint_src_dir}/lang/wgsl",
         "${tint_src_dir}/lang/wgsl/ast",
         "${tint_src_dir}/lang/wgsl/ast:unittests",
         "${tint_src_dir}/lang/wgsl/program",
diff --git a/src/tint/lang/spirv/writer/ast_printer/ast_builtin_test.cc b/src/tint/lang/spirv/writer/ast_printer/ast_builtin_test.cc
index fc2feba..b0c7a8d 100644
--- a/src/tint/lang/spirv/writer/ast_printer/ast_builtin_test.cc
+++ b/src/tint/lang/spirv/writer/ast_printer/ast_builtin_test.cc
@@ -135,7 +135,7 @@
 }
 
 TEST_F(BuiltinSpirvASTPrinterTest, Call_GLSLMethod_WithLoad_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* var = GlobalVar("ident", ty.f16(), core::AddressSpace::kPrivate);
     auto* expr = Call("round", "ident");
@@ -520,7 +520,7 @@
 }
 
 TEST_P(Builtin_Builder_SingleParam_Float_Test, Call_Scalar_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto param = GetParam();
     // Use a variable to prevent the function being evaluated as constant.
@@ -603,7 +603,7 @@
 }
 
 TEST_P(Builtin_Builder_SingleParam_Float_Test, Call_Vector_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto param = GetParam();
 
@@ -709,7 +709,7 @@
 }
 
 TEST_F(BuiltinSpirvASTPrinterTest, Call_Length_Scalar_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* scalar = Var("a", Expr(1_h));
     auto* expr = Call("length", scalar);
@@ -783,7 +783,7 @@
 }
 
 TEST_F(BuiltinSpirvASTPrinterTest, Call_Length_Vector_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* vec = Var("a", Call<vec2<f16>>(1_h, 1_h));
     auto* expr = Call("length", vec);
@@ -859,7 +859,7 @@
 }
 
 TEST_F(BuiltinSpirvASTPrinterTest, Call_Normalize_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* vec = Var("a", Call<vec2<f16>>(1_h, 1_h));
     auto* expr = Call("normalize", vec);
@@ -938,7 +938,7 @@
 }
 
 TEST_P(Builtin_Builder_DualParam_Float_Test, Call_Scalar_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto param = GetParam();
     auto* scalar = Var("scalar", Expr(1_h));
@@ -1020,7 +1020,7 @@
 }
 
 TEST_P(Builtin_Builder_DualParam_Float_Test, Call_Vector_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto param = GetParam();
     auto* vec = Var("vec", Call<vec2<f16>>(1_h, 1_h));
@@ -1109,7 +1109,7 @@
 }
 
 TEST_F(BuiltinSpirvASTPrinterTest, Call_Reflect_Vector_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* vec = Var("vec", Call<vec2<f16>>(1_h, 1_h));
     auto* expr = Call("reflect", vec, vec);
@@ -1185,7 +1185,7 @@
 }
 
 TEST_F(BuiltinSpirvASTPrinterTest, Call_Distance_Scalar_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* scalar = Var("scalar", Expr(1_h));
     auto* expr = Call("distance", scalar, scalar);
@@ -1261,7 +1261,7 @@
 }
 
 TEST_F(BuiltinSpirvASTPrinterTest, Call_Distance_Vector_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* vec = Var("vec", Call<vec2<f16>>(1_h, 1_h));
     auto* expr = Call("distance", vec, vec);
@@ -1339,7 +1339,7 @@
 }
 
 TEST_F(BuiltinSpirvASTPrinterTest, Call_Cross_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* vec = Var("vec", Call<vec3<f16>>(1_h, 1_h, 1_h));
     auto* expr = Call("cross", vec, vec);
@@ -1420,7 +1420,7 @@
 }
 
 TEST_P(Builtin_Builder_ThreeParam_Float_Test, Call_Scalar_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto param = GetParam();
     auto* scalar = Var("scalar", Expr(1_h));
@@ -1504,7 +1504,7 @@
 }
 
 TEST_P(Builtin_Builder_ThreeParam_Float_Test, Call_Vector_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto param = GetParam();
     auto* vec = Var("vec", Call<vec2<f16>>(1_h, 1_h));
@@ -1595,7 +1595,7 @@
 }
 
 TEST_F(BuiltinSpirvASTPrinterTest, Call_FaceForward_Vector_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* vec = Var("vec", Call<vec2<f16>>(1_h, 1_h));
     auto* expr = Call("faceForward", vec, vec, vec);
@@ -1688,7 +1688,7 @@
 }
 
 TEST_F(BuiltinSpirvASTPrinterTest, Runtime_Call_Modf_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* vec = Var("vec", Call<vec2<f16>>(1_h, 2_h));
     auto* expr = Call("modf", vec);
@@ -1790,7 +1790,7 @@
 }
 
 TEST_F(BuiltinSpirvASTPrinterTest, Const_Call_Modf_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* expr = Call("modf", Call<vec2<f16>>(1_h, 2_h));
     Func("a_func", tint::Empty, ty.void_(),
@@ -1894,7 +1894,7 @@
 }
 
 TEST_F(BuiltinSpirvASTPrinterTest, Runtime_Call_Frexp_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* vec = Var("vec", Call<vec2<f16>>(1_h, 2_h));
     auto* expr = Call("frexp", vec);
@@ -2000,7 +2000,7 @@
 }
 
 TEST_F(BuiltinSpirvASTPrinterTest, Const_Call_Frexp_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     Func("a_func", tint::Empty, ty.void_(),
          Vector{
@@ -3155,7 +3155,7 @@
 }
 
 TEST_F(BuiltinSpirvASTPrinterTest, Call_Determinant_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* var = GlobalVar("var", ty.mat3x3<f16>(), core::AddressSpace::kPrivate);
     auto* expr = Call("determinant", "var");
@@ -3228,7 +3228,7 @@
 }
 
 TEST_F(BuiltinSpirvASTPrinterTest, Call_Transpose_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* var = GlobalVar("var", ty.mat2x3<f16>(), core::AddressSpace::kPrivate);
     auto* expr = Call("transpose", "var");
@@ -3300,7 +3300,7 @@
 }
 
 TEST_F(BuiltinSpirvASTPrinterTest, Call_Dot_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* var = GlobalVar("v", ty.vec3<f16>(), core::AddressSpace::kPrivate);
     auto* expr = Call("dot", "v", "v");
@@ -4159,7 +4159,7 @@
 namespace DP4A_builtin_tests {
 
 TEST_F(BuiltinSpirvASTPrinterTest, Call_Dot4I8Packed) {
-    Enable(core::Extension::kChromiumExperimentalDp4A);
+    Enable(wgsl::Extension::kChromiumExperimentalDp4A);
 
     auto* val1 = Var("val1", ty.u32());
     auto* val2 = Var("val2", ty.u32());
@@ -4196,7 +4196,7 @@
 }
 
 TEST_F(BuiltinSpirvASTPrinterTest, Call_Dot4U8Packed) {
-    Enable(core::Extension::kChromiumExperimentalDp4A);
+    Enable(wgsl::Extension::kChromiumExperimentalDp4A);
 
     auto* val1 = Var("val1", ty.u32());
     auto* val2 = Var("val2", ty.u32());
diff --git a/src/tint/lang/spirv/writer/ast_printer/ast_printer_test.cc b/src/tint/lang/spirv/writer/ast_printer/ast_printer_test.cc
index 8fabbf2..bcf0633 100644
--- a/src/tint/lang/spirv/writer/ast_printer/ast_printer_test.cc
+++ b/src/tint/lang/spirv/writer/ast_printer/ast_printer_test.cc
@@ -31,7 +31,7 @@
 }
 
 TEST_F(SpirvASTPrinterTest, UnsupportedExtension) {
-    Enable(Source{{12, 34}}, core::Extension::kUndefined);
+    Enable(Source{{12, 34}}, wgsl::Extension::kUndefined);
 
     auto program = std::make_unique<Program>(resolver::Resolve(*this));
     auto result = Generate(program.get(), Options{});
diff --git a/src/tint/lang/spirv/writer/ast_printer/ast_type_test.cc b/src/tint/lang/spirv/writer/ast_printer/ast_type_test.cc
index a1b3ce6..d927699 100644
--- a/src/tint/lang/spirv/writer/ast_printer/ast_type_test.cc
+++ b/src/tint/lang/spirv/writer/ast_printer/ast_type_test.cc
@@ -324,7 +324,7 @@
 }
 
 TEST_F(SpirvASTPrinterTest_Type, GenerateStruct) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* s = Structure("my_struct", Vector{Member("a", ty.f32()), Member("b", ty.f16())});
 
@@ -345,7 +345,7 @@
 }
 
 TEST_F(SpirvASTPrinterTest_Type, GenerateStruct_DecoratedMembers) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* s = Structure("S", Vector{
                                  Member("a", ty.f32()),
@@ -378,7 +378,7 @@
 }
 
 TEST_F(SpirvASTPrinterTest_Type, GenerateStruct_DecoratedMembers_Matrix) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* s = Structure("S", Vector{
                                  Member("mat2x2_f32", ty.mat2x2<f32>()),
@@ -441,7 +441,7 @@
 }
 
 TEST_F(SpirvASTPrinterTest_Type, GenerateStruct_DecoratedMembers_ArraysOfMatrix) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto arr_mat2x2_f32 = ty.array(ty.mat2x2<f32>(), 1_u);  // Singly nested array
     auto arr_mat2x2_f16 = ty.array(ty.mat2x2<f16>(), 1_u);  // Singly nested array
diff --git a/src/tint/lang/spirv/writer/ast_printer/binary_expression_test.cc b/src/tint/lang/spirv/writer/ast_printer/binary_expression_test.cc
index b5c9bcb..47f27be 100644
--- a/src/tint/lang/spirv/writer/ast_printer/binary_expression_test.cc
+++ b/src/tint/lang/spirv/writer/ast_printer/binary_expression_test.cc
@@ -251,7 +251,7 @@
 
 using BinaryArithF16Test = TestParamHelper<BinaryData>;
 TEST_P(BinaryArithF16Test, Scalar) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto param = GetParam();
 
@@ -276,7 +276,7 @@
 }
 
 TEST_P(BinaryArithF16Test, Vector) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto param = GetParam();
 
@@ -546,7 +546,7 @@
 
 using BinaryCompareF16Test = TestParamHelper<BinaryData>;
 TEST_P(BinaryCompareF16Test, Scalar) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto param = GetParam();
 
@@ -572,7 +572,7 @@
 }
 
 TEST_P(BinaryCompareF16Test, Vector) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto param = GetParam();
 
@@ -632,7 +632,7 @@
 }
 
 TEST_F(SpirvASTPrinterTest, Binary_Multiply_VectorScalar_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* lhs = Call<vec3<f16>>(1_h, 1_h, 1_h);
     auto* rhs = Expr(1_h);
@@ -680,7 +680,7 @@
 }
 
 TEST_F(SpirvASTPrinterTest, Binary_Multiply_ScalarVector_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* lhs = Expr(1_h);
     auto* rhs = Call<vec3<f16>>(1_h, 1_h, 1_h);
@@ -731,7 +731,7 @@
 }
 
 TEST_F(SpirvASTPrinterTest, Binary_Multiply_MatrixScalar_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* var = Var("mat", ty.mat3x3<f16>());
     auto* expr = create<ast::BinaryExpression>(core::BinaryOp::kMultiply, Expr("mat"), Expr(1_h));
@@ -785,7 +785,7 @@
 }
 
 TEST_F(SpirvASTPrinterTest, Binary_Multiply_ScalarMatrix_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* var = Var("mat", ty.mat3x3<f16>());
     auto* expr = create<ast::BinaryExpression>(core::BinaryOp::kMultiply, Expr(1_h), Expr("mat"));
@@ -841,7 +841,7 @@
 }
 
 TEST_F(SpirvASTPrinterTest, Binary_Multiply_MatrixVector_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* var = Var("mat", ty.mat3x3<f16>());
     auto* rhs = Call<vec3<f16>>(1_h, 1_h, 1_h);
@@ -899,7 +899,7 @@
 }
 
 TEST_F(SpirvASTPrinterTest, Binary_Multiply_VectorMatrix_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* var = Var("mat", ty.mat3x3<f16>());
     auto* lhs = Call<vec3<f16>>(1_h, 1_h, 1_h);
@@ -956,7 +956,7 @@
 }
 
 TEST_F(SpirvASTPrinterTest, Binary_Multiply_MatrixMatrix_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* var = Var("mat", ty.mat3x3<f16>());
     auto* expr = create<ast::BinaryExpression>(core::BinaryOp::kMultiply, Expr("mat"), Expr("mat"));
@@ -1348,7 +1348,7 @@
     auto& param = GetParam();
 
     if (param.type == Type::f16) {
-        Enable(core::Extension::kF16);
+        Enable(wgsl::Extension::kF16);
     }
 
     const ast::Expression* lhs = MakeVectorExpr(this, param.type);
@@ -1400,7 +1400,7 @@
     auto& param = GetParam();
 
     if (param.type == Type::f16) {
-        Enable(core::Extension::kF16);
+        Enable(wgsl::Extension::kF16);
     }
 
     const ast::Expression* lhs = MakeScalarExpr(this, param.type);
@@ -1480,7 +1480,7 @@
     auto& param = GetParam();
 
     if (param.type == Type::f16) {
-        Enable(core::Extension::kF16);
+        Enable(wgsl::Extension::kF16);
     }
 
     const ast::Expression* lhs = MakeVectorExpr(this, param.type);
@@ -1528,7 +1528,7 @@
     auto& param = GetParam();
 
     if (param.type == Type::f16) {
-        Enable(core::Extension::kF16);
+        Enable(wgsl::Extension::kF16);
     }
 
     const ast::Expression* lhs = MakeScalarExpr(this, param.type);
@@ -1643,7 +1643,7 @@
     auto& param = GetParam();
 
     if (param.type == Type::f16) {
-        Enable(core::Extension::kF16);
+        Enable(wgsl::Extension::kF16);
     }
 
     const ast::Expression* lhs = MakeMat3x4Expr(this, param.type);
@@ -1706,7 +1706,7 @@
     auto& param = GetParam();
 
     if (param.type == Type::f16) {
-        Enable(core::Extension::kF16);
+        Enable(wgsl::Extension::kF16);
     }
 
     const ast::Expression* lhs = MakeMat3x4Expr(this, param.type);
diff --git a/src/tint/lang/spirv/writer/ast_printer/builder.cc b/src/tint/lang/spirv/writer/ast_printer/builder.cc
index 65a13af..9756664 100644
--- a/src/tint/lang/spirv/writer/ast_printer/builder.cc
+++ b/src/tint/lang/spirv/writer/ast_printer/builder.cc
@@ -263,14 +263,14 @@
     if (!tint::writer::CheckSupportedExtensions(
             "SPIR-V", builder_.AST(), builder_.Diagnostics(),
             Vector{
-                core::Extension::kChromiumDisableUniformityAnalysis,
-                core::Extension::kChromiumExperimentalDp4A,
-                core::Extension::kChromiumExperimentalFullPtrParameters,
-                core::Extension::kChromiumExperimentalPushConstant,
-                core::Extension::kChromiumExperimentalReadWriteStorageTexture,
-                core::Extension::kChromiumExperimentalSubgroups,
-                core::Extension::kF16,
-                core::Extension::kChromiumInternalDualSourceBlending,
+                wgsl::Extension::kChromiumDisableUniformityAnalysis,
+                wgsl::Extension::kChromiumExperimentalDp4A,
+                wgsl::Extension::kChromiumExperimentalFullPtrParameters,
+                wgsl::Extension::kChromiumExperimentalPushConstant,
+                wgsl::Extension::kChromiumExperimentalReadWriteStorageTexture,
+                wgsl::Extension::kChromiumExperimentalSubgroups,
+                wgsl::Extension::kF16,
+                wgsl::Extension::kChromiumInternalDualSourceBlending,
             })) {
         return false;
     }
@@ -334,14 +334,14 @@
     return Operand(module_.NextId());
 }
 
-bool Builder::GenerateExtension(core::Extension extension) {
+bool Builder::GenerateExtension(wgsl::Extension extension) {
     switch (extension) {
-        case core::Extension::kChromiumExperimentalDp4A:
+        case wgsl::Extension::kChromiumExperimentalDp4A:
             module_.PushExtension("SPV_KHR_integer_dot_product");
             module_.PushCapability(SpvCapabilityDotProductKHR);
             module_.PushCapability(SpvCapabilityDotProductInput4x8BitPackedKHR);
             break;
-        case core::Extension::kF16:
+        case wgsl::Extension::kF16:
             module_.PushCapability(SpvCapabilityFloat16);
             module_.PushCapability(SpvCapabilityUniformAndStorageBuffer16BitAccess);
             module_.PushCapability(SpvCapabilityStorageBuffer16BitAccess);
@@ -2574,6 +2574,19 @@
             }
             return result_id;
         }
+        case core::Function::kSubgroupBroadcast: {
+            module_.PushCapability(SpvCapabilityGroupNonUniformBallot);
+            auto first_param_id = get_arg_as_value_id(0);
+            auto second_param_id = get_arg_as_value_id(1);
+            if (!push_function_inst(
+                    spv::Op::OpGroupNonUniformBroadcast,
+                    {Operand(result_type_id), result,
+                     Operand(GenerateConstantIfNeeded(ScalarConstant::U32(SpvScopeSubgroup))),
+                     Operand(first_param_id), Operand(second_param_id)})) {
+                return 0;
+            }
+            return result_id;
+        }
         default: {
             auto inst_id = builtin_to_glsl_method(builtin);
             if (inst_id == 0) {
diff --git a/src/tint/lang/spirv/writer/ast_printer/builder.h b/src/tint/lang/spirv/writer/ast_printer/builder.h
index 0f0c84b..c736697 100644
--- a/src/tint/lang/spirv/writer/ast_printer/builder.h
+++ b/src/tint/lang/spirv/writer/ast_printer/builder.h
@@ -153,7 +153,7 @@
     /// not supported.
     /// @param ext the extension to generate
     /// @returns true on success.
-    bool GenerateExtension(core::Extension ext);
+    bool GenerateExtension(wgsl::Extension ext);
     /// Generates a label for the given id. Emits an error and returns false if
     /// we're currently outside a function.
     /// @param id the id to use for the label
diff --git a/src/tint/lang/spirv/writer/ast_printer/constructor_expression_test.cc b/src/tint/lang/spirv/writer/ast_printer/constructor_expression_test.cc
index b0618dd..30b1654 100644
--- a/src/tint/lang/spirv/writer/ast_printer/constructor_expression_test.cc
+++ b/src/tint/lang/spirv/writer/ast_printer/constructor_expression_test.cc
@@ -214,7 +214,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_F16_With_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* cast = Call<f16>(2_h);
     WrapInFunction(cast);
@@ -289,7 +289,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec2_With_F16_Literal) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* cast = Call<vec2<f16>>(2_h);
     WrapInFunction(cast);
@@ -333,7 +333,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec2_With_F16_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* var = Decl(Var("x", ty.f16(), Expr(2_h)));
     auto* cast = Call<vec2<f16>>("x", "x");
@@ -378,7 +378,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec2_With_F16_F16_Const) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* cast = Call<vec2<f16>>(1_h, 2_h);
     WrapInFunction(cast);
@@ -423,7 +423,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec2_F16_With_Vec2) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* var = Decl(Var("x", ty.vec2<f16>(), Call<vec2<f16>>(1_h, 2_h)));
     auto* cast = Call<vec2<f16>>("x");
@@ -468,7 +468,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec2_F16_With_Vec2_Const) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* cast = Call<vec2<f16>>(Call<vec2<f16>>(1_h, 2_h));
     WrapInFunction(cast);
@@ -514,7 +514,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec3_With_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* var = Decl(Var("x", ty.f16(), Expr(2_h)));
     auto* cast = Call<vec3<f16>>("x", "x", "x");
@@ -561,7 +561,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec3_With_F16_Const) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* cast = Call<vec3<f16>>(1_h, 2_h, 3_h);
     WrapInFunction(cast);
@@ -652,7 +652,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec3_With_F16_F16_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* var = Decl(Var("x", ty.f16(), Expr(2_h)));
     auto* cast = Call<vec3<f16>>("x", "x", "x");
@@ -699,7 +699,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec3_With_F16_F16_F16_Const) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* cast = Call<vec3<f16>>(1_h, 2_h, 3_h);
     WrapInFunction(cast);
@@ -750,7 +750,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec3_With_F16_Vec2) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* var = Decl(Var("x", ty.vec2<f16>(), Call<vec2<f16>>(2_h, 3_h)));
     auto* cast = Call<vec3<f16>>(1_h, "x");
@@ -801,7 +801,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec3_With_F16_Vec2_Const) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* cast = Call<vec3<f16>>(1_h, Call<vec2<f16>>(2_h, 3_h));
     WrapInFunction(cast);
@@ -852,7 +852,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec3_With_Vec2_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* var = Decl(Var("x", ty.vec2<f16>(), Call<vec2<f16>>(1_h, 2_h)));
     auto* cast = Call<vec3<f16>>("x", 3_h);
@@ -903,7 +903,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec3_With_Vec2_F16_Const) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* cast = Call<vec3<f16>>(Call<vec2<f16>>(1_h, 2_h), 3_h);
     WrapInFunction(cast);
@@ -950,7 +950,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec3_F16_With_Vec3) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* var = Decl(Var("x", ty.vec3<f16>(), Call<vec3<f16>>(1_h, 2_h, 3_h)));
     auto* cast = Call<vec3<f16>>("x");
@@ -997,7 +997,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec3_F16_With_Vec3_Const) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* cast = Call<vec3<f16>>(Call<vec3<f16>>(1_h, 2_h, 3_h));
     WrapInFunction(cast);
@@ -1083,7 +1083,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec4_With_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* var = Decl(Var("x", ty.f16(), Expr(2_h)));
     auto* cast = Call<vec4<f16>>("x");
@@ -1126,7 +1126,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec4_With_F16_Const) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* cast = Call<vec4<f16>>(2_h);
     WrapInFunction(cast);
@@ -1172,7 +1172,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec4_With_F16_F16_F16_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* var = Decl(Var("x", ty.f16(), Expr(2_h)));
     auto* cast = Call<vec4<f16>>("x", "x", "x", "x");
@@ -1221,7 +1221,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec4_With_F16_F16_F16_F16_Const) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* cast = Call<vec4<f16>>(1_h, 2_h, 3_h, 4_h);
     WrapInFunction(cast);
@@ -1272,7 +1272,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec4_With_F16_F16_Vec2) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* var = Decl(Var("x", ty.vec2<f16>(), Call<vec2<f16>>(1_h, 2_h)));
     auto* cast = Call<vec4<f16>>(1_h, 2_h, "x");
@@ -1323,7 +1323,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec4_With_F16_F16_Vec2_Const) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* cast = Call<vec4<f16>>(1_h, 2_h, Call<vec2<f16>>(3_h, 4_h));
     WrapInFunction(cast);
@@ -1376,7 +1376,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec4_With_F16_Vec2_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* var = Decl(Var("x", ty.vec2<f16>(), Call<vec2<f16>>(2_h, 3_h)));
     auto* cast = Call<vec4<f16>>(1_h, "x", 4_h);
@@ -1429,7 +1429,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec4_With_F16_Vec2_F16_Const) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* cast = Call<vec4<f16>>(1_h, Call<vec2<f16>>(2_h, 3_h), 4_h);
     WrapInFunction(cast);
@@ -1482,7 +1482,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec4_With_Vec2_F16_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* var = Decl(Var("x", ty.vec2<f16>(), Call<vec2<f16>>(1_h, 2_h)));
     auto* cast = Call<vec4<f16>>("x", 3_h, 4_h);
@@ -1535,7 +1535,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec4_With_Vec2_F16_F16_Const) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* cast = Call<vec4<f16>>(Call<vec2<f16>>(1_h, 2_h), 3_h, 4_h);
     WrapInFunction(cast);
@@ -1589,7 +1589,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec4_F16_With_Vec2_Vec2) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* var = Decl(Var("x", ty.vec2<f16>(), Call<vec2<f16>>(1_h, 2_h)));
     auto* cast = Call<vec4<f16>>("x", "x");
@@ -1641,7 +1641,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec4_F16_With_Vec2_Vec2_Const) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* cast = Call<vec4<f16>>(Call<vec2<f16>>(1_h, 2_h), Call<vec2<f16>>(1_h, 2_h));
     WrapInFunction(cast);
@@ -1690,7 +1690,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec4_With_F16_Vec3) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* var = Decl(Var("x", ty.vec3<f16>(), Call<vec3<f16>>(2_h, 2_h, 2_h)));
     auto* cast = Call<vec4<f16>>(2_h, "x");
@@ -1738,7 +1738,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec4_With_F16_Vec3_Const) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* cast = Call<vec4<f16>>(2_h, Call<vec3<f16>>(2_h, 2_h, 2_h));
     WrapInFunction(cast);
@@ -1786,7 +1786,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec4_With_Vec3_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* var = Decl(Var("x", ty.vec3<f16>(), Call<vec3<f16>>(2_h, 2_h, 2_h)));
     auto* cast = Call<vec4<f16>>("x", 2_h);
@@ -1834,7 +1834,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec4_With_Vec3_F16_Const) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* cast = Call<vec4<f16>>(Call<vec3<f16>>(2_h, 2_h, 2_h), 2_h);
     WrapInFunction(cast);
@@ -1871,7 +1871,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Vec4_F16_With_Vec4) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* value = Call<vec4<f16>>(2_h, 2_h, 2_h, 2_h);
     auto* cast = Call<vec4<f16>>(value);
@@ -1912,7 +1912,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_GlobalConst_F16_With_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* ctor = Call<f16>(2_h);
     GlobalConst("g", ty.f16(), ctor);
@@ -1952,7 +1952,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_GlobalVar_F16_With_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* ctor = Call<f16>(2_h);
     GlobalVar("g", ty.f16(), core::AddressSpace::kPrivate, ctor);
@@ -1992,7 +1992,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_GlobalConst_U32_With_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* ctor = Call<u32>(1.5_h);
     GlobalConst("g", ty.u32(), ctor);
@@ -2032,7 +2032,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_GlobalVar_U32_With_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* ctor = Call<u32>(1.5_h);
     GlobalVar("g", ty.u32(), core::AddressSpace::kPrivate, ctor);
@@ -2074,7 +2074,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_GlobalConst_Vec2_With_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* cast = Call<vec2<f16>>(2_h);
     GlobalConst("g", ty.vec2<f16>(), cast);
@@ -2115,7 +2115,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_GlobalVar_Vec2_With_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* cast = Call<vec2<f16>>(2_h);
     auto* g = GlobalVar("g", ty.vec2<f16>(), core::AddressSpace::kPrivate, cast);
@@ -2156,7 +2156,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_GlobalConst_Vec2_F16_With_Vec2) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* cast = Call<vec2<f16>>(Call<vec2<f16>>(2_h, 2_h));
     GlobalConst("g", ty.vec2<f16>(), cast);
@@ -2201,7 +2201,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_GlobalVar_Vec2_F16_With_Vec2) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* cast = Call<vec2<f16>>(Call<vec2<f16>>(2_h, 2_h));
     GlobalVar("a", ty.vec2<f16>(), core::AddressSpace::kPrivate, cast);
@@ -2246,7 +2246,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_GlobalConst_Vec3_F16_With_Vec3) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* cast = Call<vec3<f16>>(Call<vec3<f16>>(2_h, 2_h, 2_h));
     GlobalConst("g", ty.vec3<f16>(), cast);
@@ -2291,7 +2291,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_GlobalVar_Vec3_F16_With_Vec3) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* cast = Call<vec3<f16>>(Call<vec3<f16>>(2_h, 2_h, 2_h));
     GlobalVar("a", ty.vec3<f16>(), core::AddressSpace::kPrivate, cast);
@@ -2336,7 +2336,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_GlobalConst_Vec4_F16_With_Vec4) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* cast = Call<vec4<f16>>(Call<vec4<f16>>(2_h, 2_h, 2_h, 2_h));
     GlobalConst("g", ty.vec4<f16>(), cast);
@@ -2381,7 +2381,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_GlobalVar_Vec4_F16_With_Vec4) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* cast = Call<vec4<f16>>(Call<vec4<f16>>(2_h, 2_h, 2_h, 2_h));
     GlobalVar("a", ty.vec4<f16>(), core::AddressSpace::kPrivate, cast);
@@ -2426,7 +2426,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_GlobalConst_Vec3_With_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* cast = Call<vec3<f16>>(2_h);
     GlobalConst("g", ty.vec3<f16>(), cast);
@@ -2467,7 +2467,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_GlobalVar_Vec3_With_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* cast = Call<vec3<f16>>(2_h);
     auto* g = GlobalVar("g", ty.vec3<f16>(), core::AddressSpace::kPrivate, cast);
@@ -2508,7 +2508,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_GlobalConst_Vec3_With_F16_Vec2) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* cast = Call<vec3<f16>>(2_h, Call<vec2<f16>>(2_h, 2_h));
     GlobalConst("g", ty.vec3<f16>(), cast);
@@ -2549,7 +2549,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_GlobalVar_Vec3_With_F16_Vec2) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* cast = Call<vec3<f16>>(2_h, Call<vec2<f16>>(2_h, 2_h));
     auto* g = GlobalVar("g", ty.vec3<f16>(), core::AddressSpace::kPrivate, cast);
@@ -2590,7 +2590,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_GlobalConst_Vec3_With_Vec2_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* cast = Call<vec3<f16>>(Call<vec2<f16>>(2_h, 2_h), 2_h);
     GlobalConst("g", ty.vec3<f16>(), cast);
@@ -2631,7 +2631,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_GlobalVar_Vec3_With_Vec2_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* cast = Call<vec3<f16>>(Call<vec2<f16>>(2_h, 2_h), 2_h);
     auto* g = GlobalVar("g", ty.vec3<f16>(), core::AddressSpace::kPrivate, cast);
@@ -2672,7 +2672,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_GlobalConst_Vec4_With_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* cast = Call<vec4<f16>>(2_h);
     GlobalConst("g", ty.vec4<f16>(), cast);
@@ -2713,7 +2713,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_GlobalVar_Vec4_With_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* cast = Call<vec4<f16>>(2_h);
     auto* g = GlobalVar("g", ty.vec4<f16>(), core::AddressSpace::kPrivate, cast);
@@ -2754,7 +2754,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_GlobalConst_Vec4_With_F16_F16_Vec2) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* cast = Call<vec4<f16>>(2_h, 2_h, Call<vec2<f16>>(2_h, 2_h));
     GlobalConst("g", ty.vec4<f16>(), cast);
@@ -2795,7 +2795,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_GlobalVar_Vec4_With_F16_F16_Vec2) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* cast = Call<vec4<f16>>(2_h, 2_h, Call<vec2<f16>>(2_h, 2_h));
     auto* g = GlobalVar("g", ty.vec4<f16>(), core::AddressSpace::kPrivate, cast);
@@ -2836,7 +2836,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_GlobalConst_Vec4_With_F16_Vec2_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* cast = Call<vec4<f16>>(2_h, Call<vec2<f16>>(2_h, 2_h), 2_h);
     GlobalConst("g", ty.vec4<f16>(), cast);
@@ -2877,7 +2877,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_GlobalVar_Vec4_With_F16_Vec2_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* cast = Call<vec4<f16>>(2_h, Call<vec2<f16>>(2_h, 2_h), 2_h);
     auto* g = GlobalVar("g", ty.vec4<f16>(), core::AddressSpace::kPrivate, cast);
@@ -2918,7 +2918,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_GlobalConst_Vec4_With_Vec2_F16_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* cast = Call<vec4<f16>>(Call<vec2<f16>>(2_h, 2_h), 2_h, 2_h);
     GlobalConst("g", ty.vec4<f16>(), cast);
@@ -2959,7 +2959,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_GlobalVar_Vec4_With_Vec2_F16_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* cast = Call<vec4<f16>>(Call<vec2<f16>>(2_h, 2_h), 2_h, 2_h);
     auto* g = GlobalVar("g", ty.vec4<f16>(), core::AddressSpace::kPrivate, cast);
@@ -3000,7 +3000,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_GlobalConst_Vec4_F16_With_Vec2_Vec2) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* cast = Call<vec4<f16>>(Call<vec2<f16>>(2_h, 2_h), Call<vec2<f16>>(2_h, 2_h));
     GlobalConst("g", ty.vec4<f16>(), cast);
@@ -3041,7 +3041,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_GlobalVar_Vec4_F16_With_Vec2_Vec2) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* cast = Call<vec4<f16>>(Call<vec2<f16>>(2_h, 2_h), Call<vec2<f16>>(2_h, 2_h));
     auto* g = GlobalVar("g", ty.vec4<f16>(), core::AddressSpace::kPrivate, cast);
@@ -3098,7 +3098,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_GlobalVar_Vec4_With_F16_Vec3) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* cast = Call<vec4<f16>>(2_h, Call<vec3<f16>>(2_h, 2_h, 2_h));
     auto* g = GlobalVar("g", ty.vec4<f16>(), core::AddressSpace::kPrivate, cast);
@@ -3139,7 +3139,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_GlobalConst_Vec4_With_Vec3_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* cast = Call<vec4<f16>>(Call<vec3<f16>>(2_h, 2_h, 2_h), 2_h);
     GlobalConst("g", ty.vec4<f16>(), cast);
@@ -3180,7 +3180,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_GlobalVar_Vec4_With_Vec3_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* cast = Call<vec4<f16>>(Call<vec3<f16>>(2_h, 2_h, 2_h), 2_h);
     auto* g = GlobalVar("g", ty.vec4<f16>(), core::AddressSpace::kPrivate, cast);
@@ -3216,7 +3216,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Mat2x2_F16_With_Vec2_Vec2) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* cast = Call<mat2x2<f16>>(Call<vec2<f16>>(2_h, 2_h), Call<vec2<f16>>(2_h, 2_h));
     WrapInFunction(cast);
@@ -3255,7 +3255,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Mat3x2_F16_With_Vec2_Vec2_Vec2) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* cast = Call<mat3x2<f16>>(Call<vec2<f16>>(2_h, 2_h), Call<vec2<f16>>(2_h, 2_h),
                                    Call<vec2<f16>>(2_h, 2_h));
@@ -3295,7 +3295,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Mat4x2_F16_With_Vec2_Vec2_Vec2_Vec2) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* cast = Call<mat4x2<f16>>(Call<vec2<f16>>(2_h, 2_h), Call<vec2<f16>>(2_h, 2_h),
                                    Call<vec2<f16>>(2_h, 2_h), Call<vec2<f16>>(2_h, 2_h));
@@ -3334,7 +3334,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Mat2x3_F16_With_Vec3_Vec3) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* cast = Call<mat2x3<f16>>(Call<vec3<f16>>(2_h, 2_h, 2_h), Call<vec3<f16>>(2_h, 2_h, 2_h));
     WrapInFunction(cast);
@@ -3373,7 +3373,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Mat3x3_F16_With_Vec3_Vec3_Vec3) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* cast = Call<mat3x3<f16>>(Call<vec3<f16>>(2_h, 2_h, 2_h), Call<vec3<f16>>(2_h, 2_h, 2_h),
                                    Call<vec3<f16>>(2_h, 2_h, 2_h));
@@ -3413,7 +3413,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Mat4x3_F16_With_Vec3_Vec3_Vec3_Vec3) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* cast = Call<mat4x3<f16>>(Call<vec3<f16>>(2_h, 2_h, 2_h), Call<vec3<f16>>(2_h, 2_h, 2_h),
                                    Call<vec3<f16>>(2_h, 2_h, 2_h), Call<vec3<f16>>(2_h, 2_h, 2_h));
@@ -3453,7 +3453,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Mat2x4_F16_With_Vec4_Vec4) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* cast =
         Call<mat2x4<f16>>(Call<vec4<f16>>(2_h, 2_h, 2_h, 2_h), Call<vec4<f16>>(2_h, 2_h, 2_h, 2_h));
@@ -3494,7 +3494,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Mat3x4_F16_With_Vec4_Vec4_Vec4) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* cast =
         Call<mat3x4<f16>>(Call<vec4<f16>>(2_h, 2_h, 2_h, 2_h), Call<vec4<f16>>(2_h, 2_h, 2_h, 2_h),
@@ -3536,7 +3536,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Mat4x4_F16_With_Vec4_Vec4_Vec4_Vec4) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* cast =
         Call<mat4x4<f16>>(Call<vec4<f16>>(2_h, 2_h, 2_h, 2_h), Call<vec4<f16>>(2_h, 2_h, 2_h, 2_h),
@@ -3576,7 +3576,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Array_5_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* cast = Call<array<f16, 5>>(2_h, 2_h, 2_h, 2_h, 2_h);
     WrapInFunction(cast);
@@ -3618,7 +3618,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Array_2_Vec3_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* first = Call<vec3<f16>>(1_h, 2_h, 3_h);
     auto* second = Call<vec3<f16>>(1_h, 2_h, 3_h);
@@ -3747,7 +3747,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_ZeroInit_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* t = Call<f16>();
 
@@ -3854,7 +3854,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_ZeroInit_Matrix_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* t = Call<mat4x2<f16>>();
 
@@ -3961,7 +3961,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Convert_F16_To_I32) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* var = Decl(Var("x", ty.f16(), Expr(2.4_h)));
     auto* cast = Call<i32>("x");
@@ -4035,7 +4035,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Convert_F16_To_U32) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* var = Decl(Var("x", ty.f16(), Expr(2.4_h)));
     auto* cast = Call<u32>("x");
@@ -4109,7 +4109,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Convert_F16_To_F32) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* var = Decl(Var("x", ty.f16(), Expr(2_h)));
     auto* cast = Call<f32>("x");
@@ -4135,7 +4135,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Convert_I32_To_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* var = Decl(Var("x", ty.i32(), Expr(2_i)));
     auto* cast = Call<f16>("x");
@@ -4161,7 +4161,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Convert_U32_To_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* var = Decl(Var("x", ty.u32(), Expr(2_u)));
     auto* cast = Call<f16>("x");
@@ -4187,7 +4187,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Convert_F32_To_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* var = Decl(Var("x", ty.f32(), Expr(2_f)));
     auto* cast = Call<f16>("x");
@@ -4265,7 +4265,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Convert_Vectors_F16_to_I32) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* var = GlobalVar("i", ty.vec3<f16>(), core::AddressSpace::kPrivate);
 
@@ -4345,7 +4345,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Convert_Vectors_F16_to_U32) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* var = GlobalVar("i", ty.vec3<f16>(), core::AddressSpace::kPrivate);
 
@@ -4425,7 +4425,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Convert_Vectors_F16_to_F32) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* var = GlobalVar("i", ty.vec3<f16>(), core::AddressSpace::kPrivate);
 
@@ -4453,7 +4453,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Convert_Vectors_I32_to_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* var = GlobalVar("i", ty.vec3<i32>(), core::AddressSpace::kPrivate);
 
@@ -4481,7 +4481,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Convert_Vectors_U32_to_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* var = GlobalVar("i", ty.vec3<u32>(), core::AddressSpace::kPrivate);
 
@@ -4509,7 +4509,7 @@
 }
 
 TEST_F(SpvBuilderConstructorTest, Type_Convert_Vectors_F32_to_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* var = GlobalVar("i", ty.vec3<f32>(), core::AddressSpace::kPrivate);
 
diff --git a/src/tint/lang/spirv/writer/ast_printer/global_variable_test.cc b/src/tint/lang/spirv/writer/ast_printer/global_variable_test.cc
index d5d028a..97ea5db 100644
--- a/src/tint/lang/spirv/writer/ast_printer/global_variable_test.cc
+++ b/src/tint/lang/spirv/writer/ast_printer/global_variable_test.cc
@@ -120,7 +120,7 @@
 TEST_F(SpirvASTPrinterTest, GlobalConst_Vec_F16_Initializer) {
     // const c = vec3<f16>(1h, 2h, 3h);
     // var v = c;
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* c = GlobalConst("c", Call<vec3<f16>>(1_h, 2_h, 3_h));
     GlobalVar("v", core::AddressSpace::kPrivate, Expr(c));
diff --git a/src/tint/lang/spirv/writer/ast_printer/literal_test.cc b/src/tint/lang/spirv/writer/ast_printer/literal_test.cc
index 4376ce8..33dbe0f 100644
--- a/src/tint/lang/spirv/writer/ast_printer/literal_test.cc
+++ b/src/tint/lang/spirv/writer/ast_printer/literal_test.cc
@@ -164,7 +164,7 @@
 }
 
 TEST_F(SpirvASTPrinterTest, Literal_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* i = create<ast::FloatLiteralExpression>(23.245, ast::FloatLiteralExpression::Suffix::kH);
     WrapInFunction(i);
@@ -181,7 +181,7 @@
 }
 
 TEST_F(SpirvASTPrinterTest, Literal_F16_Dedup) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* i1 = create<ast::FloatLiteralExpression>(23.245, ast::FloatLiteralExpression::Suffix::kH);
     auto* i2 = create<ast::FloatLiteralExpression>(23.245, ast::FloatLiteralExpression::Suffix::kH);
diff --git a/src/tint/lang/spirv/writer/ast_raise/BUILD.bazel b/src/tint/lang/spirv/writer/ast_raise/BUILD.bazel
index 52b5e8b..4712380 100644
--- a/src/tint/lang/spirv/writer/ast_raise/BUILD.bazel
+++ b/src/tint/lang/spirv/writer/ast_raise/BUILD.bazel
@@ -46,6 +46,7 @@
     "//src/tint/lang/core",
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/type",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/ast/transform",
     "//src/tint/lang/wgsl/program",
@@ -83,6 +84,7 @@
     "//src/tint/lang/core",
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/type",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/ast/transform",
     "//src/tint/lang/wgsl/ast/transform:test",
diff --git a/src/tint/lang/spirv/writer/ast_raise/BUILD.cmake b/src/tint/lang/spirv/writer/ast_raise/BUILD.cmake
index 3ae2021..c20fa20 100644
--- a/src/tint/lang/spirv/writer/ast_raise/BUILD.cmake
+++ b/src/tint/lang/spirv/writer/ast_raise/BUILD.cmake
@@ -47,6 +47,7 @@
   tint_lang_core
   tint_lang_core_constant
   tint_lang_core_type
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_ast_transform
   tint_lang_wgsl_program
@@ -87,6 +88,7 @@
   tint_lang_core
   tint_lang_core_constant
   tint_lang_core_type
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_ast_transform
   tint_lang_wgsl_ast_transform_test
diff --git a/src/tint/lang/spirv/writer/ast_raise/BUILD.gn b/src/tint/lang/spirv/writer/ast_raise/BUILD.gn
index fbcc1cc..4c4d9f3 100644
--- a/src/tint/lang/spirv/writer/ast_raise/BUILD.gn
+++ b/src/tint/lang/spirv/writer/ast_raise/BUILD.gn
@@ -49,6 +49,7 @@
       "${tint_src_dir}/lang/core",
       "${tint_src_dir}/lang/core/constant",
       "${tint_src_dir}/lang/core/type",
+      "${tint_src_dir}/lang/wgsl",
       "${tint_src_dir}/lang/wgsl/ast",
       "${tint_src_dir}/lang/wgsl/ast/transform",
       "${tint_src_dir}/lang/wgsl/program",
@@ -87,6 +88,7 @@
         "${tint_src_dir}/lang/core",
         "${tint_src_dir}/lang/core/constant",
         "${tint_src_dir}/lang/core/type",
+        "${tint_src_dir}/lang/wgsl",
         "${tint_src_dir}/lang/wgsl/ast",
         "${tint_src_dir}/lang/wgsl/ast/transform",
         "${tint_src_dir}/lang/wgsl/ast/transform:unittests",
diff --git a/src/tint/lang/spirv/writer/ast_raise/clamp_frag_depth.cc b/src/tint/lang/spirv/writer/ast_raise/clamp_frag_depth.cc
index af4a0c5..e49c951 100644
--- a/src/tint/lang/spirv/writer/ast_raise/clamp_frag_depth.cc
+++ b/src/tint/lang/spirv/writer/ast_raise/clamp_frag_depth.cc
@@ -81,7 +81,7 @@
         //   fn clamp_frag_depth(v : f32) -> f32 {
         //       return clamp(v, frag_depth_clamp_args.min, frag_depth_clamp_args.max);
         //   }
-        b.Enable(core::Extension::kChromiumExperimentalPushConstant);
+        b.Enable(wgsl::Extension::kChromiumExperimentalPushConstant);
 
         b.Structure(b.Symbols().New("FragDepthClampArgs"),
                     Vector{b.Member("min", b.ty.f32()), b.Member("max", b.ty.f32())});
diff --git a/src/tint/lang/spirv/writer/builtin_test.cc b/src/tint/lang/spirv/writer/builtin_test.cc
index a725e1a..7e51a65 100644
--- a/src/tint/lang/spirv/writer/builtin_test.cc
+++ b/src/tint/lang/spirv/writer/builtin_test.cc
@@ -1786,6 +1786,45 @@
     EXPECT_INST("%result = OpGroupNonUniformBallot %v4uint %uint_3 %true");
 }
 
+TEST_F(SpirvWriterTest, Builtin_SubgroupBroadcastValueF32) {
+    auto* func = b.Function("foo", ty.f32());
+    b.Append(func->Block(), [&] {
+        auto* result = b.Call(ty.f32(), core::Function::kSubgroupBroadcast, 1_f, 0_u);
+        mod.SetName(result, "result");
+        b.Return(func, result);
+    });
+
+    ASSERT_TRUE(Generate()) << Error() << output_;
+    EXPECT_INST("OpCapability GroupNonUniformBallot");
+    EXPECT_INST("%result = OpGroupNonUniformBroadcast %float %uint_3 %float_1 %uint_0");
+}
+
+TEST_F(SpirvWriterTest, Builtin_SubgroupBroadcastValueI32) {
+    auto* func = b.Function("foo", ty.i32());
+    b.Append(func->Block(), [&] {
+        auto* result = b.Call(ty.i32(), core::Function::kSubgroupBroadcast, 1_i, 0_u);
+        mod.SetName(result, "result");
+        b.Return(func, result);
+    });
+
+    ASSERT_TRUE(Generate()) << Error() << output_;
+    EXPECT_INST("OpCapability GroupNonUniformBallot");
+    EXPECT_INST("%result = OpGroupNonUniformBroadcast %int %uint_3 %int_1 %uint_0");
+}
+
+TEST_F(SpirvWriterTest, Builtin_SubgroupBroadcastValueU32) {
+    auto* func = b.Function("foo", ty.u32());
+    b.Append(func->Block(), [&] {
+        auto* result = b.Call(ty.u32(), core::Function::kSubgroupBroadcast, 1_u, 0_u);
+        mod.SetName(result, "result");
+        b.Return(func, result);
+    });
+
+    ASSERT_TRUE(Generate()) << Error() << output_;
+    EXPECT_INST("OpCapability GroupNonUniformBallot");
+    EXPECT_INST("%result = OpGroupNonUniformBroadcast %uint %uint_3 %uint_1 %uint_0");
+}
+
 TEST_F(SpirvWriterTest, Builtin_ArrayLength) {
     auto* var = b.Var("var", ty.ptr(storage, ty.runtime_array(ty.i32())));
     var->SetBindingPoint(0, 0);
diff --git a/src/tint/lang/spirv/writer/printer/BUILD.bazel b/src/tint/lang/spirv/writer/printer/BUILD.bazel
index 27a6c34..672fdad 100644
--- a/src/tint/lang/spirv/writer/printer/BUILD.bazel
+++ b/src/tint/lang/spirv/writer/printer/BUILD.bazel
@@ -43,6 +43,7 @@
     "//src/tint/lang/spirv/intrinsic/data",
     "//src/tint/lang/spirv/ir",
     "//src/tint/lang/spirv/type",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/program",
     "//src/tint/lang/wgsl/sem",
diff --git a/src/tint/lang/spirv/writer/printer/BUILD.cmake b/src/tint/lang/spirv/writer/printer/BUILD.cmake
index 18d6d86..e296599 100644
--- a/src/tint/lang/spirv/writer/printer/BUILD.cmake
+++ b/src/tint/lang/spirv/writer/printer/BUILD.cmake
@@ -44,6 +44,7 @@
   tint_lang_spirv_intrinsic_data
   tint_lang_spirv_ir
   tint_lang_spirv_type
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_program
   tint_lang_wgsl_sem
diff --git a/src/tint/lang/spirv/writer/printer/BUILD.gn b/src/tint/lang/spirv/writer/printer/BUILD.gn
index 07c5fcf..fd1dd71 100644
--- a/src/tint/lang/spirv/writer/printer/BUILD.gn
+++ b/src/tint/lang/spirv/writer/printer/BUILD.gn
@@ -42,6 +42,7 @@
       "${tint_src_dir}/lang/spirv/intrinsic/data",
       "${tint_src_dir}/lang/spirv/ir",
       "${tint_src_dir}/lang/spirv/type",
+      "${tint_src_dir}/lang/wgsl",
       "${tint_src_dir}/lang/wgsl/ast",
       "${tint_src_dir}/lang/wgsl/program",
       "${tint_src_dir}/lang/wgsl/sem",
diff --git a/src/tint/lang/spirv/writer/printer/printer.cc b/src/tint/lang/spirv/writer/printer/printer.cc
index c5d07c7..137c705 100644
--- a/src/tint/lang/spirv/writer/printer/printer.cc
+++ b/src/tint/lang/spirv/writer/printer/printer.cc
@@ -1081,6 +1081,18 @@
         case spirv::ir::Function::kDot:
             op = spv::Op::OpDot;
             break;
+        case spirv::ir::Function::kImageDrefGather:
+            op = spv::Op::OpImageDrefGather;
+            break;
+        case spirv::ir::Function::kImageFetch:
+            op = spv::Op::OpImageFetch;
+            break;
+        case spirv::ir::Function::kImageGather:
+            op = spv::Op::OpImageGather;
+            break;
+        case spirv::ir::Function::kImageRead:
+            op = spv::Op::OpImageRead;
+            break;
         case spirv::ir::Function::kMatrixTimesMatrix:
             op = spv::Op::OpMatrixTimesMatrix;
             break;
@@ -1396,6 +1408,11 @@
             operands.push_back(Constant(ir_->constant_values.Get(u32(spv::Scope::Subgroup))));
             operands.push_back(Constant(ir_->constant_values.Get(true)));
             break;
+        case core::Function::kSubgroupBroadcast:
+            module_.PushCapability(SpvCapabilityGroupNonUniformBallot);
+            op = spv::Op::OpGroupNonUniformBroadcast;
+            operands.push_back(Constant(ir_->constant_values.Get(u32(spv::Scope::Subgroup))));
+            break;
         case core::Function::kTan:
             glsl_ext_inst(GLSLstd450Tan);
             break;
@@ -1566,15 +1583,6 @@
 
     spv::Op op = spv::Op::Max;
     switch (call->Kind()) {
-        case spirv::ir::Intrinsic::kImageFetch:
-            op = spv::Op::OpImageFetch;
-            break;
-        case spirv::ir::Intrinsic::kImageGather:
-            op = spv::Op::OpImageGather;
-            break;
-        case spirv::ir::Intrinsic::kImageDrefGather:
-            op = spv::Op::OpImageDrefGather;
-            break;
         case spirv::ir::Intrinsic::kImageQuerySize:
             module_.PushCapability(SpvCapabilityImageQuery);
             op = spv::Op::OpImageQuerySize;
@@ -1583,9 +1591,6 @@
             module_.PushCapability(SpvCapabilityImageQuery);
             op = spv::Op::OpImageQuerySizeLod;
             break;
-        case spirv::ir::Intrinsic::kImageRead:
-            op = spv::Op::OpImageRead;
-            break;
         case spirv::ir::Intrinsic::kImageSampleImplicitLod:
             op = spv::Op::OpImageSampleImplicitLod;
             break;
diff --git a/src/tint/lang/spirv/writer/raise/builtin_polyfill.cc b/src/tint/lang/spirv/writer/raise/builtin_polyfill.cc
index d5fd5bb..9e60294 100644
--- a/src/tint/lang/spirv/writer/raise/builtin_polyfill.cc
+++ b/src/tint/lang/spirv/writer/raise/builtin_polyfill.cc
@@ -598,17 +598,17 @@
             coords = AppendArrayIndex(coords, array_idx, builtin);
         }
 
-        // Determine which SPIR-V intrinsic to use and which optional image operands are needed.
-        enum spirv::ir::Intrinsic intrinsic;
+        // Determine which SPIR-V function to use and which optional image operands are needed.
+        enum spirv::ir::Function function;
         core::ir::Value* depth = nullptr;
         ImageOperands operands;
         switch (builtin->Func()) {
             case core::Function::kTextureGather:
-                intrinsic = spirv::ir::Intrinsic::kImageGather;
+                function = spirv::ir::Function::kImageGather;
                 operands.offset = next_arg();
                 break;
             case core::Function::kTextureGatherCompare:
-                intrinsic = spirv::ir::Intrinsic::kImageDrefGather;
+                function = spirv::ir::Function::kImageDrefGather;
                 depth = next_arg();
                 operands.offset = next_arg();
                 break;
@@ -616,25 +616,25 @@
                 return nullptr;
         }
 
-        // Start building the argument list for the intrinsic.
+        // Start building the argument list for the function.
         // The first two operands are always the sampled image and then the coordinates, followed by
         // either the depth reference or the component.
-        Vector<core::ir::Value*, 8> intrinsic_args;
-        intrinsic_args.Push(sampled_image->Result());
-        intrinsic_args.Push(coords);
+        Vector<core::ir::Value*, 8> function_args;
+        function_args.Push(sampled_image->Result());
+        function_args.Push(coords);
         if (depth) {
-            intrinsic_args.Push(depth);
+            function_args.Push(depth);
         } else {
-            intrinsic_args.Push(component);
+            function_args.Push(component);
         }
 
         // Add the optional image operands, if any.
-        AppendImageOperands(operands, intrinsic_args, builtin, /* requires_float_lod */ true);
+        AppendImageOperands(operands, function_args, builtin, /* requires_float_lod */ true);
 
-        // Call the intrinsic.
+        // Call the function.
         auto* result_ty = builtin->Result()->Type();
         auto* texture_call =
-            b.Call<spirv::ir::IntrinsicCall>(result_ty, intrinsic, std::move(intrinsic_args));
+            b.Call<spirv::ir::BuiltinCall>(result_ty, function, std::move(function_args));
         texture_call->InsertBefore(builtin);
         return texture_call->Result();
     }
@@ -659,11 +659,11 @@
             coords = AppendArrayIndex(coords, array_idx, builtin);
         }
 
-        // Start building the argument list for the intrinsic.
+        // Start building the argument list for the builtin.
         // The first two operands are always the texture and then the coordinates.
-        Vector<core::ir::Value*, 8> intrinsic_args;
-        intrinsic_args.Push(texture);
-        intrinsic_args.Push(coords);
+        Vector<core::ir::Value*, 8> builtin_args;
+        builtin_args.Push(texture);
+        builtin_args.Push(coords);
 
         // Add the optional image operands, if any.
         ImageOperands operands;
@@ -673,20 +673,19 @@
         } else {
             operands.lod = next_arg();
         }
-        AppendImageOperands(operands, intrinsic_args, builtin, /* requires_float_lod */ false);
+        AppendImageOperands(operands, builtin_args, builtin, /* requires_float_lod */ false);
 
-        // Call the intrinsic.
+        // Call the builtin.
         // The result is always a vec4 in SPIR-V.
         auto* result_ty = builtin->Result()->Type();
         bool expects_scalar_result = result_ty->Is<core::type::Scalar>();
         if (expects_scalar_result) {
             result_ty = ty.vec4(result_ty);
         }
-        auto intrinsic = texture_ty->Is<core::type::StorageTexture>()
-                             ? spirv::ir::Intrinsic::kImageRead
-                             : spirv::ir::Intrinsic::kImageFetch;
+        auto kind = texture_ty->Is<core::type::StorageTexture>() ? spirv::ir::Function::kImageRead
+                                                                 : spirv::ir::Function::kImageFetch;
         auto* texture_call =
-            b.Call<spirv::ir::IntrinsicCall>(result_ty, intrinsic, std::move(intrinsic_args));
+            b.Call<spirv::ir::BuiltinCall>(result_ty, kind, std::move(builtin_args));
         texture_call->InsertBefore(builtin);
         auto* result = texture_call->Result();
 
diff --git a/src/tint/lang/wgsl/BUILD.bazel b/src/tint/lang/wgsl/BUILD.bazel
index 44d29ff..d235e5b 100644
--- a/src/tint/lang/wgsl/BUILD.bazel
+++ b/src/tint/lang/wgsl/BUILD.bazel
@@ -24,9 +24,38 @@
 load("//src/tint:flags.bzl", "COPTS")
 load("@bazel_skylib//lib:selects.bzl", "selects")
 cc_library(
+  name = "wgsl",
+  srcs = [
+    "diagnostic_rule.cc",
+    "diagnostic_severity.cc",
+    "extension.cc",
+  ],
+  hdrs = [
+    "diagnostic_rule.h",
+    "diagnostic_severity.h",
+    "extension.h",
+  ],
+  deps = [
+    "//src/tint/utils/containers",
+    "//src/tint/utils/diagnostic",
+    "//src/tint/utils/ice",
+    "//src/tint/utils/macros",
+    "//src/tint/utils/math",
+    "//src/tint/utils/memory",
+    "//src/tint/utils/rtti",
+    "//src/tint/utils/text",
+    "//src/tint/utils/traits",
+  ],
+  copts = COPTS,
+  visibility = ["//visibility:public"],
+)
+cc_library(
   name = "test",
   alwayslink = True,
   srcs = [
+    "diagnostic_rule_test.cc",
+    "diagnostic_severity_test.cc",
+    "extension_test.cc",
     "wgsl_test.cc",
   ] + select({
     ":tint_build_wgsl_reader_and_tint_build_wgsl_writer": [
@@ -40,6 +69,7 @@
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/ir",
     "//src/tint/lang/core/type",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/helpers:test",
     "//src/tint/lang/wgsl/program",
@@ -67,6 +97,28 @@
   copts = COPTS,
   visibility = ["//visibility:public"],
 )
+cc_library(
+  name = "bench",
+  srcs = [
+    "diagnostic_rule_bench.cc",
+    "diagnostic_severity_bench.cc",
+    "extension_bench.cc",
+  ],
+  deps = [
+    "//src/tint/lang/wgsl",
+    "//src/tint/utils/containers",
+    "//src/tint/utils/diagnostic",
+    "//src/tint/utils/ice",
+    "//src/tint/utils/macros",
+    "//src/tint/utils/math",
+    "//src/tint/utils/memory",
+    "//src/tint/utils/rtti",
+    "//src/tint/utils/text",
+    "//src/tint/utils/traits",
+  ],
+  copts = COPTS,
+  visibility = ["//visibility:public"],
+)
 
 alias(
   name = "tint_build_wgsl_reader",
diff --git a/src/tint/lang/wgsl/BUILD.cmake b/src/tint/lang/wgsl/BUILD.cmake
index 64bdc34..c4ee2f3 100644
--- a/src/tint/lang/wgsl/BUILD.cmake
+++ b/src/tint/lang/wgsl/BUILD.cmake
@@ -31,10 +31,38 @@
 include(lang/wgsl/writer/BUILD.cmake)
 
 ################################################################################
+# Target:    tint_lang_wgsl
+# Kind:      lib
+################################################################################
+tint_add_target(tint_lang_wgsl lib
+  lang/wgsl/diagnostic_rule.cc
+  lang/wgsl/diagnostic_rule.h
+  lang/wgsl/diagnostic_severity.cc
+  lang/wgsl/diagnostic_severity.h
+  lang/wgsl/extension.cc
+  lang/wgsl/extension.h
+)
+
+tint_target_add_dependencies(tint_lang_wgsl lib
+  tint_utils_containers
+  tint_utils_diagnostic
+  tint_utils_ice
+  tint_utils_macros
+  tint_utils_math
+  tint_utils_memory
+  tint_utils_rtti
+  tint_utils_text
+  tint_utils_traits
+)
+
+################################################################################
 # Target:    tint_lang_wgsl_test
 # Kind:      test
 ################################################################################
 tint_add_target(tint_lang_wgsl_test test
+  lang/wgsl/diagnostic_rule_test.cc
+  lang/wgsl/diagnostic_severity_test.cc
+  lang/wgsl/extension_test.cc
   lang/wgsl/wgsl_test.cc
 )
 
@@ -44,6 +72,7 @@
   tint_lang_core_constant
   tint_lang_core_ir
   tint_lang_core_type
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_helpers_test
   tint_lang_wgsl_program
@@ -77,3 +106,26 @@
     "lang/wgsl/ir_roundtrip_test.cc"
   )
 endif(TINT_BUILD_WGSL_READER AND TINT_BUILD_WGSL_WRITER)
+
+################################################################################
+# Target:    tint_lang_wgsl_bench
+# Kind:      bench
+################################################################################
+tint_add_target(tint_lang_wgsl_bench bench
+  lang/wgsl/diagnostic_rule_bench.cc
+  lang/wgsl/diagnostic_severity_bench.cc
+  lang/wgsl/extension_bench.cc
+)
+
+tint_target_add_dependencies(tint_lang_wgsl_bench bench
+  tint_lang_wgsl
+  tint_utils_containers
+  tint_utils_diagnostic
+  tint_utils_ice
+  tint_utils_macros
+  tint_utils_math
+  tint_utils_memory
+  tint_utils_rtti
+  tint_utils_text
+  tint_utils_traits
+)
diff --git a/src/tint/lang/wgsl/BUILD.gn b/src/tint/lang/wgsl/BUILD.gn
index 67a6ed6..dafa9c3 100644
--- a/src/tint/lang/wgsl/BUILD.gn
+++ b/src/tint/lang/wgsl/BUILD.gn
@@ -28,10 +28,37 @@
 if (tint_build_unittests) {
   import("//testing/test.gni")
 }
+
+libtint_source_set("wgsl") {
+  sources = [
+    "diagnostic_rule.cc",
+    "diagnostic_rule.h",
+    "diagnostic_severity.cc",
+    "diagnostic_severity.h",
+    "extension.cc",
+    "extension.h",
+  ]
+  deps = [
+    "${tint_src_dir}/utils/containers",
+    "${tint_src_dir}/utils/diagnostic",
+    "${tint_src_dir}/utils/ice",
+    "${tint_src_dir}/utils/macros",
+    "${tint_src_dir}/utils/math",
+    "${tint_src_dir}/utils/memory",
+    "${tint_src_dir}/utils/rtti",
+    "${tint_src_dir}/utils/text",
+    "${tint_src_dir}/utils/traits",
+  ]
+}
 if (tint_build_unittests) {
   tint_unittests_source_set("unittests") {
     testonly = true
-    sources = [ "wgsl_test.cc" ]
+    sources = [
+      "diagnostic_rule_test.cc",
+      "diagnostic_severity_test.cc",
+      "extension_test.cc",
+      "wgsl_test.cc",
+    ]
     deps = [
       "${tint_src_dir}:gmock_and_gtest",
       "${tint_src_dir}/api/common",
@@ -39,6 +66,7 @@
       "${tint_src_dir}/lang/core/constant",
       "${tint_src_dir}/lang/core/ir",
       "${tint_src_dir}/lang/core/type",
+      "${tint_src_dir}/lang/wgsl",
       "${tint_src_dir}/lang/wgsl/ast",
       "${tint_src_dir}/lang/wgsl/helpers:unittests",
       "${tint_src_dir}/lang/wgsl/program",
diff --git a/src/tint/lang/wgsl/ast/BUILD.bazel b/src/tint/lang/wgsl/ast/BUILD.bazel
index ebc4a92..1674ad6 100644
--- a/src/tint/lang/wgsl/ast/BUILD.bazel
+++ b/src/tint/lang/wgsl/ast/BUILD.bazel
@@ -190,6 +190,7 @@
     "//src/tint/lang/core",
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/type",
+    "//src/tint/lang/wgsl",
     "//src/tint/utils/containers",
     "//src/tint/utils/diagnostic",
     "//src/tint/utils/ice",
@@ -280,6 +281,7 @@
     "//src/tint/lang/core",
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/type",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/ast/transform",
     "//src/tint/lang/wgsl/program",
diff --git a/src/tint/lang/wgsl/ast/BUILD.cmake b/src/tint/lang/wgsl/ast/BUILD.cmake
index 3a06809..9715482 100644
--- a/src/tint/lang/wgsl/ast/BUILD.cmake
+++ b/src/tint/lang/wgsl/ast/BUILD.cmake
@@ -191,6 +191,7 @@
   tint_lang_core
   tint_lang_core_constant
   tint_lang_core_type
+  tint_lang_wgsl
   tint_utils_containers
   tint_utils_diagnostic
   tint_utils_ice
@@ -281,6 +282,7 @@
   tint_lang_core
   tint_lang_core_constant
   tint_lang_core_type
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_ast_transform
   tint_lang_wgsl_program
diff --git a/src/tint/lang/wgsl/ast/BUILD.gn b/src/tint/lang/wgsl/ast/BUILD.gn
index d74d107..3732774 100644
--- a/src/tint/lang/wgsl/ast/BUILD.gn
+++ b/src/tint/lang/wgsl/ast/BUILD.gn
@@ -193,6 +193,7 @@
     "${tint_src_dir}/lang/core",
     "${tint_src_dir}/lang/core/constant",
     "${tint_src_dir}/lang/core/type",
+    "${tint_src_dir}/lang/wgsl",
     "${tint_src_dir}/utils/containers",
     "${tint_src_dir}/utils/diagnostic",
     "${tint_src_dir}/utils/ice",
@@ -282,6 +283,7 @@
       "${tint_src_dir}/lang/core",
       "${tint_src_dir}/lang/core/constant",
       "${tint_src_dir}/lang/core/type",
+      "${tint_src_dir}/lang/wgsl",
       "${tint_src_dir}/lang/wgsl/ast",
       "${tint_src_dir}/lang/wgsl/ast/transform",
       "${tint_src_dir}/lang/wgsl/program",
diff --git a/src/tint/lang/wgsl/ast/block_statement_test.cc b/src/tint/lang/wgsl/ast/block_statement_test.cc
index c9f0289..f4de519 100644
--- a/src/tint/lang/wgsl/ast/block_statement_test.cc
+++ b/src/tint/lang/wgsl/ast/block_statement_test.cc
@@ -45,8 +45,8 @@
     auto* d = create<DiscardStatement>();
     auto* ptr = d;
 
-    auto* attr1 = DiagnosticAttribute(core::DiagnosticSeverity::kOff, "foo");
-    auto* attr2 = DiagnosticAttribute(core::DiagnosticSeverity::kOff, "bar");
+    auto* attr1 = DiagnosticAttribute(wgsl::DiagnosticSeverity::kOff, "foo");
+    auto* attr2 = DiagnosticAttribute(wgsl::DiagnosticSeverity::kOff, "bar");
     auto* b = create<BlockStatement>(tint::Vector{d}, tint::Vector{attr1, attr2});
 
     ASSERT_EQ(b->statements.Length(), 1u);
diff --git a/src/tint/lang/wgsl/ast/builder.h b/src/tint/lang/wgsl/ast/builder.h
index e575633..72f9052 100644
--- a/src/tint/lang/wgsl/ast/builder.h
+++ b/src/tint/lang/wgsl/ast/builder.h
@@ -22,7 +22,6 @@
 #include "src/tint/api/common/override_id.h"
 
 #include "src/tint/lang/core/constant/manager.h"
-#include "src/tint/lang/core/extension.h"
 #include "src/tint/lang/core/fluent_types.h"
 #include "src/tint/lang/core/interpolation_sampling.h"
 #include "src/tint/lang/core/interpolation_type.h"
@@ -100,6 +99,7 @@
 #include "src/tint/lang/wgsl/ast/variable_decl_statement.h"
 #include "src/tint/lang/wgsl/ast/while_statement.h"
 #include "src/tint/lang/wgsl/ast/workgroup_attribute.h"
+#include "src/tint/lang/wgsl/extension.h"
 #include "src/tint/utils/id/generation_id.h"
 #include "src/tint/utils/text/string.h"
 
@@ -1586,7 +1586,7 @@
     /// Adds the extension to the list of enable directives at the top of the module.
     /// @param extension the extension to enable
     /// @return an `ast::Enable` enabling the given extension.
-    const ast::Enable* Enable(core::Extension extension) {
+    const ast::Enable* Enable(wgsl::Extension extension) {
         auto* ext = create<ast::Extension>(extension);
         auto* enable = create<ast::Enable>(Vector{ext});
         AST().AddEnable(enable);
@@ -1597,7 +1597,7 @@
     /// @param source the enable source
     /// @param extension the extension to enable
     /// @return an `ast::Enable` enabling the given extension.
-    const ast::Enable* Enable(const Source& source, core::Extension extension) {
+    const ast::Enable* Enable(const Source& source, wgsl::Extension extension) {
         auto* ext = create<ast::Extension>(source, extension);
         auto* enable = create<ast::Enable>(source, Vector{ext});
         AST().AddEnable(enable);
@@ -3350,7 +3350,7 @@
     /// @returns the diagnostic attribute pointer
     template <typename... RULE_ARGS>
     const ast::DiagnosticAttribute* DiagnosticAttribute(const Source& source,
-                                                        core::DiagnosticSeverity severity,
+                                                        wgsl::DiagnosticSeverity severity,
                                                         RULE_ARGS&&... rule_args) {
         return create<ast::DiagnosticAttribute>(
             source, ast::DiagnosticControl(
@@ -3362,7 +3362,7 @@
     /// @param rule_args the arguments used to construct the rule name
     /// @returns the diagnostic attribute pointer
     template <typename... RULE_ARGS>
-    const ast::DiagnosticAttribute* DiagnosticAttribute(core::DiagnosticSeverity severity,
+    const ast::DiagnosticAttribute* DiagnosticAttribute(wgsl::DiagnosticSeverity severity,
                                                         RULE_ARGS&&... rule_args) {
         return create<ast::DiagnosticAttribute>(
             source_, ast::DiagnosticControl(
@@ -3376,7 +3376,7 @@
     /// @returns the diagnostic directive pointer
     template <typename... RULE_ARGS>
     const ast::DiagnosticDirective* DiagnosticDirective(const Source& source,
-                                                        core::DiagnosticSeverity severity,
+                                                        wgsl::DiagnosticSeverity severity,
                                                         RULE_ARGS&&... rule_args) {
         auto* rule = DiagnosticRuleName(std::forward<RULE_ARGS>(rule_args)...);
         auto* directive =
@@ -3390,7 +3390,7 @@
     /// @param rule_args the arguments used to construct the rule name
     /// @returns the diagnostic directive pointer
     template <typename... RULE_ARGS>
-    const ast::DiagnosticDirective* DiagnosticDirective(core::DiagnosticSeverity severity,
+    const ast::DiagnosticDirective* DiagnosticDirective(wgsl::DiagnosticSeverity severity,
                                                         RULE_ARGS&&... rule_args) {
         auto* rule = DiagnosticRuleName(std::forward<RULE_ARGS>(rule_args)...);
         auto* directive =
diff --git a/src/tint/lang/wgsl/ast/diagnostic_attribute_test.cc b/src/tint/lang/wgsl/ast/diagnostic_attribute_test.cc
index 3d6744f..c9dbe56 100644
--- a/src/tint/lang/wgsl/ast/diagnostic_attribute_test.cc
+++ b/src/tint/lang/wgsl/ast/diagnostic_attribute_test.cc
@@ -21,17 +21,17 @@
 using DiagnosticAttributeTest = TestHelper;
 
 TEST_F(DiagnosticAttributeTest, Name) {
-    auto* d = DiagnosticAttribute(core::DiagnosticSeverity::kWarning, "foo");
+    auto* d = DiagnosticAttribute(wgsl::DiagnosticSeverity::kWarning, "foo");
     EXPECT_EQ(d->Name(), "diagnostic");
-    EXPECT_EQ(d->control.severity, core::DiagnosticSeverity::kWarning);
+    EXPECT_EQ(d->control.severity, wgsl::DiagnosticSeverity::kWarning);
     EXPECT_EQ(d->control.rule_name->category, nullptr);
     CheckIdentifier(d->control.rule_name->name, "foo");
 }
 
 TEST_F(DiagnosticAttributeTest, CategoryAndName) {
-    auto* d = DiagnosticAttribute(core::DiagnosticSeverity::kWarning, "foo", "bar");
+    auto* d = DiagnosticAttribute(wgsl::DiagnosticSeverity::kWarning, "foo", "bar");
     EXPECT_EQ(d->Name(), "diagnostic");
-    EXPECT_EQ(d->control.severity, core::DiagnosticSeverity::kWarning);
+    EXPECT_EQ(d->control.severity, wgsl::DiagnosticSeverity::kWarning);
     CheckIdentifier(d->control.rule_name->category, "foo");
     CheckIdentifier(d->control.rule_name->name, "bar");
 }
diff --git a/src/tint/lang/wgsl/ast/diagnostic_control.cc b/src/tint/lang/wgsl/ast/diagnostic_control.cc
index 4cec214..74935c7 100644
--- a/src/tint/lang/wgsl/ast/diagnostic_control.cc
+++ b/src/tint/lang/wgsl/ast/diagnostic_control.cc
@@ -16,15 +16,15 @@
 
 #include <string>
 
-#include "src/tint/lang/core/diagnostic_severity.h"
 #include "src/tint/lang/wgsl/ast/identifier.h"
 #include "src/tint/lang/wgsl/ast/templated_identifier.h"
+#include "src/tint/lang/wgsl/diagnostic_severity.h"
 
 namespace tint::ast {
 
 DiagnosticControl::DiagnosticControl() = default;
 
-DiagnosticControl::DiagnosticControl(core::DiagnosticSeverity sev, const DiagnosticRuleName* rule)
+DiagnosticControl::DiagnosticControl(wgsl::DiagnosticSeverity sev, const DiagnosticRuleName* rule)
     : severity(sev), rule_name(rule) {
     TINT_ASSERT(rule != nullptr);
 }
diff --git a/src/tint/lang/wgsl/ast/diagnostic_control.h b/src/tint/lang/wgsl/ast/diagnostic_control.h
index cf5cefd..c0e492b 100644
--- a/src/tint/lang/wgsl/ast/diagnostic_control.h
+++ b/src/tint/lang/wgsl/ast/diagnostic_control.h
@@ -18,7 +18,7 @@
 #include <string>
 #include <unordered_map>
 
-#include "src/tint/lang/core/diagnostic_severity.h"
+#include "src/tint/lang/wgsl/diagnostic_severity.h"
 #include "src/tint/utils/diagnostic/diagnostic.h"
 
 // Forward declarations
@@ -37,13 +37,13 @@
     /// Constructor
     /// @param sev the diagnostic severity
     /// @param rule the diagnostic rule name
-    DiagnosticControl(core::DiagnosticSeverity sev, const DiagnosticRuleName* rule);
+    DiagnosticControl(wgsl::DiagnosticSeverity sev, const DiagnosticRuleName* rule);
 
     /// Move constructor
     DiagnosticControl(DiagnosticControl&&);
 
     /// The diagnostic severity control.
-    core::DiagnosticSeverity severity = core::DiagnosticSeverity::kUndefined;
+    wgsl::DiagnosticSeverity severity = wgsl::DiagnosticSeverity::kUndefined;
 
     /// The diagnostic rule name.
     const DiagnosticRuleName* rule_name = nullptr;
diff --git a/src/tint/lang/wgsl/ast/diagnostic_control_test.cc b/src/tint/lang/wgsl/ast/diagnostic_control_test.cc
index 347a96d..b7738e6 100644
--- a/src/tint/lang/wgsl/ast/diagnostic_control_test.cc
+++ b/src/tint/lang/wgsl/ast/diagnostic_control_test.cc
@@ -15,9 +15,9 @@
 #include <string>
 
 #include "gtest/gtest-spi.h"
-#include "src/tint/lang/core/diagnostic_severity.h"
 #include "src/tint/lang/wgsl/ast/diagnostic_control.h"
 #include "src/tint/lang/wgsl/ast/helper_test.h"
+#include "src/tint/lang/wgsl/diagnostic_severity.h"
 
 namespace tint::ast {
 namespace {
@@ -28,7 +28,7 @@
     EXPECT_FATAL_FAILURE(
         {
             ProgramBuilder b;
-            DiagnosticControl control(core::DiagnosticSeverity::kWarning, nullptr);
+            DiagnosticControl control(wgsl::DiagnosticSeverity::kWarning, nullptr);
         },
         "internal compiler error");
 }
diff --git a/src/tint/lang/wgsl/ast/diagnostic_directive_test.cc b/src/tint/lang/wgsl/ast/diagnostic_directive_test.cc
index ceefeed..479bade 100644
--- a/src/tint/lang/wgsl/ast/diagnostic_directive_test.cc
+++ b/src/tint/lang/wgsl/ast/diagnostic_directive_test.cc
@@ -23,24 +23,24 @@
 
 TEST_F(DiagnosticDirectiveTest, Name) {
     auto* d =
-        DiagnosticDirective(Source{{{10, 5}, {10, 15}}}, core::DiagnosticSeverity::kWarning, "foo");
+        DiagnosticDirective(Source{{{10, 5}, {10, 15}}}, wgsl::DiagnosticSeverity::kWarning, "foo");
     EXPECT_EQ(d->source.range.begin.line, 10u);
     EXPECT_EQ(d->source.range.begin.column, 5u);
     EXPECT_EQ(d->source.range.end.line, 10u);
     EXPECT_EQ(d->source.range.end.column, 15u);
-    EXPECT_EQ(d->control.severity, core::DiagnosticSeverity::kWarning);
+    EXPECT_EQ(d->control.severity, wgsl::DiagnosticSeverity::kWarning);
     EXPECT_EQ(d->control.rule_name->category, nullptr);
     CheckIdentifier(d->control.rule_name->name, "foo");
 }
 
 TEST_F(DiagnosticDirectiveTest, CategoryAndName) {
-    auto* d = DiagnosticDirective(Source{{{10, 5}, {10, 15}}}, core::DiagnosticSeverity::kWarning,
+    auto* d = DiagnosticDirective(Source{{{10, 5}, {10, 15}}}, wgsl::DiagnosticSeverity::kWarning,
                                   "foo", "bar");
     EXPECT_EQ(d->source.range.begin.line, 10u);
     EXPECT_EQ(d->source.range.begin.column, 5u);
     EXPECT_EQ(d->source.range.end.line, 10u);
     EXPECT_EQ(d->source.range.end.column, 15u);
-    EXPECT_EQ(d->control.severity, core::DiagnosticSeverity::kWarning);
+    EXPECT_EQ(d->control.severity, wgsl::DiagnosticSeverity::kWarning);
     CheckIdentifier(d->control.rule_name->category, "foo");
     CheckIdentifier(d->control.rule_name->name, "bar");
 }
diff --git a/src/tint/lang/wgsl/ast/enable.cc b/src/tint/lang/wgsl/ast/enable.cc
index d63aaa5..688e750 100644
--- a/src/tint/lang/wgsl/ast/enable.cc
+++ b/src/tint/lang/wgsl/ast/enable.cc
@@ -26,7 +26,7 @@
 
 Enable::~Enable() = default;
 
-bool Enable::HasExtension(core::Extension ext) const {
+bool Enable::HasExtension(wgsl::Extension ext) const {
     for (auto* e : extensions) {
         if (e->name == ext) {
             return true;
diff --git a/src/tint/lang/wgsl/ast/enable.h b/src/tint/lang/wgsl/ast/enable.h
index 35afa5b..dc1cc0c 100644
--- a/src/tint/lang/wgsl/ast/enable.h
+++ b/src/tint/lang/wgsl/ast/enable.h
@@ -42,7 +42,7 @@
 
     /// @param ext the extension to search for
     /// @returns true if this Enable lists the given extension
-    bool HasExtension(core::Extension ext) const;
+    bool HasExtension(wgsl::Extension ext) const;
 
     /// Clones this node and all transitive child nodes using the `CloneContext` `ctx`.
     /// @param ctx the clone context
diff --git a/src/tint/lang/wgsl/ast/enable_test.cc b/src/tint/lang/wgsl/ast/enable_test.cc
index 667cc05..5f52c20 100644
--- a/src/tint/lang/wgsl/ast/enable_test.cc
+++ b/src/tint/lang/wgsl/ast/enable_test.cc
@@ -22,19 +22,19 @@
 using EnableTest = TestHelper;
 
 TEST_F(EnableTest, Creation) {
-    auto* ext = Enable(Source{{{20, 2}, {20, 5}}}, core::Extension::kF16);
+    auto* ext = Enable(Source{{{20, 2}, {20, 5}}}, wgsl::Extension::kF16);
     EXPECT_EQ(ext->source.range.begin.line, 20u);
     EXPECT_EQ(ext->source.range.begin.column, 2u);
     EXPECT_EQ(ext->source.range.end.line, 20u);
     EXPECT_EQ(ext->source.range.end.column, 5u);
     ASSERT_EQ(ext->extensions.Length(), 1u);
-    EXPECT_EQ(ext->extensions[0]->name, core::Extension::kF16);
+    EXPECT_EQ(ext->extensions[0]->name, wgsl::Extension::kF16);
 }
 
 TEST_F(EnableTest, HasExtension) {
-    auto* ext = Enable(Source{{{20, 2}, {20, 5}}}, core::Extension::kF16);
-    EXPECT_TRUE(ext->HasExtension(core::Extension::kF16));
-    EXPECT_FALSE(ext->HasExtension(core::Extension::kChromiumDisableUniformityAnalysis));
+    auto* ext = Enable(Source{{{20, 2}, {20, 5}}}, wgsl::Extension::kF16);
+    EXPECT_TRUE(ext->HasExtension(wgsl::Extension::kF16));
+    EXPECT_FALSE(ext->HasExtension(wgsl::Extension::kChromiumDisableUniformityAnalysis));
 }
 
 }  // namespace
diff --git a/src/tint/lang/wgsl/ast/extension.cc b/src/tint/lang/wgsl/ast/extension.cc
index 3413c9f..07251fb 100644
--- a/src/tint/lang/wgsl/ast/extension.cc
+++ b/src/tint/lang/wgsl/ast/extension.cc
@@ -18,13 +18,13 @@
 #include "src/tint/lang/wgsl/ast/clone_context.h"
 
 //! @cond Doxygen_Suppress
-// Doxygen gets confused with tint::ast::Extension and tint::core::Extension
+// Doxygen gets confused with tint::ast::Extension and tint::wgsl::Extension
 
 TINT_INSTANTIATE_TYPEINFO(tint::ast::Extension);
 
 namespace tint::ast {
 
-Extension::Extension(GenerationID pid, NodeID nid, const Source& src, core::Extension ext)
+Extension::Extension(GenerationID pid, NodeID nid, const Source& src, wgsl::Extension ext)
     : Base(pid, nid, src), name(ext) {}
 
 Extension::~Extension() = default;
diff --git a/src/tint/lang/wgsl/ast/extension.h b/src/tint/lang/wgsl/ast/extension.h
index 85e14bc..fa4566b 100644
--- a/src/tint/lang/wgsl/ast/extension.h
+++ b/src/tint/lang/wgsl/ast/extension.h
@@ -15,8 +15,8 @@
 #ifndef SRC_TINT_LANG_WGSL_AST_EXTENSION_H_
 #define SRC_TINT_LANG_WGSL_AST_EXTENSION_H_
 
-#include "src/tint/lang/core/extension.h"
 #include "src/tint/lang/wgsl/ast/node.h"
+#include "src/tint/lang/wgsl/extension.h"
 
 namespace tint::ast {
 
@@ -31,7 +31,7 @@
     /// @param nid the unique node identifier
     /// @param src the source of this node
     /// @param ext the extension
-    Extension(GenerationID pid, NodeID nid, const Source& src, core::Extension ext);
+    Extension(GenerationID pid, NodeID nid, const Source& src, wgsl::Extension ext);
 
     /// Destructor
     ~Extension() override;
@@ -43,7 +43,7 @@
     const Extension* Clone(CloneContext& ctx) const override;
 
     /// The extension name
-    const core::Extension name;
+    const wgsl::Extension name;
 };
 
 }  // namespace tint::ast
diff --git a/src/tint/lang/wgsl/ast/for_loop_statement_test.cc b/src/tint/lang/wgsl/ast/for_loop_statement_test.cc
index b1ae242..33841ac 100644
--- a/src/tint/lang/wgsl/ast/for_loop_statement_test.cc
+++ b/src/tint/lang/wgsl/ast/for_loop_statement_test.cc
@@ -52,8 +52,8 @@
 }
 
 TEST_F(ForLoopStatementTest, Creation_WithAttributes) {
-    auto* attr1 = DiagnosticAttribute(core::DiagnosticSeverity::kOff, "foo");
-    auto* attr2 = DiagnosticAttribute(core::DiagnosticSeverity::kOff, "bar");
+    auto* attr1 = DiagnosticAttribute(wgsl::DiagnosticSeverity::kOff, "foo");
+    auto* attr2 = DiagnosticAttribute(wgsl::DiagnosticSeverity::kOff, "bar");
     auto* body = Block(Return());
     auto* l = For(nullptr, nullptr, nullptr, body, tint::Vector{attr1, attr2});
 
diff --git a/src/tint/lang/wgsl/ast/if_statement_test.cc b/src/tint/lang/wgsl/ast/if_statement_test.cc
index e2bd7b8..827decc 100644
--- a/src/tint/lang/wgsl/ast/if_statement_test.cc
+++ b/src/tint/lang/wgsl/ast/if_statement_test.cc
@@ -33,8 +33,8 @@
 }
 
 TEST_F(IfStatementTest, Creation_WithAttributes) {
-    auto* attr1 = DiagnosticAttribute(core::DiagnosticSeverity::kOff, "foo");
-    auto* attr2 = DiagnosticAttribute(core::DiagnosticSeverity::kOff, "bar");
+    auto* attr1 = DiagnosticAttribute(wgsl::DiagnosticSeverity::kOff, "foo");
+    auto* attr2 = DiagnosticAttribute(wgsl::DiagnosticSeverity::kOff, "bar");
     auto* cond = Expr("cond");
     auto* stmt = If(cond, Block(), ElseStmt(), tint::Vector{attr1, attr2});
 
diff --git a/src/tint/lang/wgsl/ast/loop_statement_test.cc b/src/tint/lang/wgsl/ast/loop_statement_test.cc
index 5d75e68..bcab559 100644
--- a/src/tint/lang/wgsl/ast/loop_statement_test.cc
+++ b/src/tint/lang/wgsl/ast/loop_statement_test.cc
@@ -50,8 +50,8 @@
 }
 
 TEST_F(LoopStatementTest, Creation_WithAttributes) {
-    auto* attr1 = DiagnosticAttribute(core::DiagnosticSeverity::kOff, "foo");
-    auto* attr2 = DiagnosticAttribute(core::DiagnosticSeverity::kOff, "bar");
+    auto* attr1 = DiagnosticAttribute(wgsl::DiagnosticSeverity::kOff, "foo");
+    auto* attr2 = DiagnosticAttribute(wgsl::DiagnosticSeverity::kOff, "bar");
 
     auto* body = Block(Return());
     auto* l = create<LoopStatement>(body, nullptr, tint::Vector{attr1, attr2});
diff --git a/src/tint/lang/wgsl/ast/module_test.cc b/src/tint/lang/wgsl/ast/module_test.cc
index 37da59f..56ce163 100644
--- a/src/tint/lang/wgsl/ast/module_test.cc
+++ b/src/tint/lang/wgsl/ast/module_test.cc
@@ -132,10 +132,10 @@
 }
 
 TEST_F(ModuleTest, Directives) {
-    auto* enable_1 = Enable(core::Extension::kF16);
-    auto* diagnostic_1 = DiagnosticDirective(core::DiagnosticSeverity::kWarning, "foo");
-    auto* enable_2 = Enable(core::Extension::kChromiumExperimentalFullPtrParameters);
-    auto* diagnostic_2 = DiagnosticDirective(core::DiagnosticSeverity::kOff, "bar");
+    auto* enable_1 = Enable(wgsl::Extension::kF16);
+    auto* diagnostic_1 = DiagnosticDirective(wgsl::DiagnosticSeverity::kWarning, "foo");
+    auto* enable_2 = Enable(wgsl::Extension::kChromiumExperimentalFullPtrParameters);
+    auto* diagnostic_2 = DiagnosticDirective(wgsl::DiagnosticSeverity::kOff, "bar");
 
     Program program(std::move(*this));
     EXPECT_THAT(program.AST().GlobalDeclarations(), ::testing::ContainerEq(tint::Vector{
diff --git a/src/tint/lang/wgsl/ast/switch_statement_test.cc b/src/tint/lang/wgsl/ast/switch_statement_test.cc
index c1a4d01..242cb1b 100644
--- a/src/tint/lang/wgsl/ast/switch_statement_test.cc
+++ b/src/tint/lang/wgsl/ast/switch_statement_test.cc
@@ -46,8 +46,8 @@
 }
 
 TEST_F(SwitchStatementTest, Creation_WithAttributes) {
-    auto* attr1 = DiagnosticAttribute(core::DiagnosticSeverity::kOff, "foo");
-    auto* attr2 = DiagnosticAttribute(core::DiagnosticSeverity::kOff, "bar");
+    auto* attr1 = DiagnosticAttribute(wgsl::DiagnosticSeverity::kOff, "foo");
+    auto* attr2 = DiagnosticAttribute(wgsl::DiagnosticSeverity::kOff, "bar");
     auto* ident = Expr("ident");
     auto* stmt =
         create<SwitchStatement>(ident, tint::Empty, tint::Vector{attr1, attr2}, tint::Empty);
@@ -56,8 +56,8 @@
 }
 
 TEST_F(SwitchStatementTest, Creation_WithBodyAttributes) {
-    auto* attr1 = DiagnosticAttribute(core::DiagnosticSeverity::kOff, "foo");
-    auto* attr2 = DiagnosticAttribute(core::DiagnosticSeverity::kOff, "bar");
+    auto* attr1 = DiagnosticAttribute(wgsl::DiagnosticSeverity::kOff, "foo");
+    auto* attr2 = DiagnosticAttribute(wgsl::DiagnosticSeverity::kOff, "bar");
     auto* ident = Expr("ident");
     auto* stmt =
         create<SwitchStatement>(ident, tint::Empty, tint::Empty, tint::Vector{attr1, attr2});
diff --git a/src/tint/lang/wgsl/ast/transform/BUILD.bazel b/src/tint/lang/wgsl/ast/transform/BUILD.bazel
index d035628..6b75460 100644
--- a/src/tint/lang/wgsl/ast/transform/BUILD.bazel
+++ b/src/tint/lang/wgsl/ast/transform/BUILD.bazel
@@ -99,6 +99,7 @@
     "//src/tint/lang/core",
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/type",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/program",
     "//src/tint/lang/wgsl/resolver",
@@ -166,6 +167,7 @@
     "//src/tint/lang/core",
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/type",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/ast/transform",
     "//src/tint/lang/wgsl/ast:test",
diff --git a/src/tint/lang/wgsl/ast/transform/BUILD.cmake b/src/tint/lang/wgsl/ast/transform/BUILD.cmake
index c5ed810..a9dd202 100644
--- a/src/tint/lang/wgsl/ast/transform/BUILD.cmake
+++ b/src/tint/lang/wgsl/ast/transform/BUILD.cmake
@@ -98,6 +98,7 @@
   tint_lang_core
   tint_lang_core_constant
   tint_lang_core_type
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_program
   tint_lang_wgsl_resolver
@@ -165,6 +166,7 @@
   tint_lang_core
   tint_lang_core_constant
   tint_lang_core_type
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_ast_transform
   tint_lang_wgsl_ast_test
diff --git a/src/tint/lang/wgsl/ast/transform/BUILD.gn b/src/tint/lang/wgsl/ast/transform/BUILD.gn
index 3c49f99..22706b8 100644
--- a/src/tint/lang/wgsl/ast/transform/BUILD.gn
+++ b/src/tint/lang/wgsl/ast/transform/BUILD.gn
@@ -102,6 +102,7 @@
     "${tint_src_dir}/lang/core",
     "${tint_src_dir}/lang/core/constant",
     "${tint_src_dir}/lang/core/type",
+    "${tint_src_dir}/lang/wgsl",
     "${tint_src_dir}/lang/wgsl/ast",
     "${tint_src_dir}/lang/wgsl/program",
     "${tint_src_dir}/lang/wgsl/resolver",
@@ -168,6 +169,7 @@
       "${tint_src_dir}/lang/core",
       "${tint_src_dir}/lang/core/constant",
       "${tint_src_dir}/lang/core/type",
+      "${tint_src_dir}/lang/wgsl",
       "${tint_src_dir}/lang/wgsl/ast",
       "${tint_src_dir}/lang/wgsl/ast:unittests",
       "${tint_src_dir}/lang/wgsl/ast/transform",
diff --git a/src/tint/lang/wgsl/ast/transform/builtin_polyfill.cc b/src/tint/lang/wgsl/ast/transform/builtin_polyfill.cc
index 876f7fb..dc4ba14 100644
--- a/src/tint/lang/wgsl/ast/transform/builtin_polyfill.cc
+++ b/src/tint/lang/wgsl/ast/transform/builtin_polyfill.cc
@@ -51,7 +51,7 @@
     State(const Program* program, const Config& config) : src(program), cfg(config) {
         has_full_ptr_params = false;
         for (auto* enable : src->AST().Enables()) {
-            if (enable->HasExtension(core::Extension::kChromiumExperimentalFullPtrParameters)) {
+            if (enable->HasExtension(wgsl::Extension::kChromiumExperimentalFullPtrParameters)) {
                 has_full_ptr_params = true;
                 break;
             }
@@ -811,7 +811,7 @@
     /// @return the polyfill function name
     Symbol workgroupUniformLoad(const core::type::Type* type) {
         if (!has_full_ptr_params) {
-            b.Enable(core::Extension::kChromiumExperimentalFullPtrParameters);
+            b.Enable(wgsl::Extension::kChromiumExperimentalFullPtrParameters);
             has_full_ptr_params = true;
         }
         auto name = b.Symbols().New("tint_workgroupUniformLoad");
diff --git a/src/tint/lang/wgsl/ast/transform/direct_variable_access.cc b/src/tint/lang/wgsl/ast/transform/direct_variable_access.cc
index 30dbbb7..28db994 100644
--- a/src/tint/lang/wgsl/ast/transform/direct_variable_access.cc
+++ b/src/tint/lang/wgsl/ast/transform/direct_variable_access.cc
@@ -208,7 +208,7 @@
     /// @returns the ApplyResult
     ApplyResult Run() {
         if (!ctx.src->Sem().Module()->Extensions().Contains(
-                core::Extension::kChromiumExperimentalFullPtrParameters)) {
+                wgsl::Extension::kChromiumExperimentalFullPtrParameters)) {
             // If the 'chromium_experimental_full_ptr_parameters' extension is not enabled, then
             // there's nothing for this transform to do.
             return SkipTransform;
diff --git a/src/tint/lang/wgsl/ast/transform/disable_uniformity_analysis.cc b/src/tint/lang/wgsl/ast/transform/disable_uniformity_analysis.cc
index 3c23390..34d212b 100644
--- a/src/tint/lang/wgsl/ast/transform/disable_uniformity_analysis.cc
+++ b/src/tint/lang/wgsl/ast/transform/disable_uniformity_analysis.cc
@@ -33,13 +33,13 @@
                                                         const DataMap&,
                                                         DataMap&) const {
     if (src->Sem().Module()->Extensions().Contains(
-            core::Extension::kChromiumDisableUniformityAnalysis)) {
+            wgsl::Extension::kChromiumDisableUniformityAnalysis)) {
         return SkipTransform;
     }
 
     ProgramBuilder b;
     program::CloneContext ctx{&b, src, /* auto_clone_symbols */ true};
-    b.Enable(core::Extension::kChromiumDisableUniformityAnalysis);
+    b.Enable(wgsl::Extension::kChromiumDisableUniformityAnalysis);
 
     ctx.Clone();
     return resolver::Resolve(b);
diff --git a/src/tint/lang/wgsl/ast/transform/preserve_padding.cc b/src/tint/lang/wgsl/ast/transform/preserve_padding.cc
index 3ef5d69..25cba78 100644
--- a/src/tint/lang/wgsl/ast/transform/preserve_padding.cc
+++ b/src/tint/lang/wgsl/ast/transform/preserve_padding.cc
@@ -71,7 +71,7 @@
                 [&](const Enable* enable) {
                     // Check if the full pointer parameters extension is already enabled.
                     if (enable->HasExtension(
-                            core::Extension::kChromiumExperimentalFullPtrParameters)) {
+                            wgsl::Extension::kChromiumExperimentalFullPtrParameters)) {
                         ext_enabled = true;
                     }
                 });
@@ -220,7 +220,7 @@
     /// Enable the full pointer parameters extension, if we have not already done so.
     void EnableExtension() {
         if (!ext_enabled) {
-            b.Enable(core::Extension::kChromiumExperimentalFullPtrParameters);
+            b.Enable(wgsl::Extension::kChromiumExperimentalFullPtrParameters);
             ext_enabled = true;
         }
     }
diff --git a/src/tint/lang/wgsl/ast/while_statement_test.cc b/src/tint/lang/wgsl/ast/while_statement_test.cc
index 43c2093..d87ddf0 100644
--- a/src/tint/lang/wgsl/ast/while_statement_test.cc
+++ b/src/tint/lang/wgsl/ast/while_statement_test.cc
@@ -43,8 +43,8 @@
 }
 
 TEST_F(WhileStatementTest, Creation_WithAttributes) {
-    auto* attr1 = DiagnosticAttribute(core::DiagnosticSeverity::kOff, "foo");
-    auto* attr2 = DiagnosticAttribute(core::DiagnosticSeverity::kOff, "bar");
+    auto* attr1 = DiagnosticAttribute(wgsl::DiagnosticSeverity::kOff, "foo");
+    auto* attr2 = DiagnosticAttribute(wgsl::DiagnosticSeverity::kOff, "bar");
     auto* cond = create<BinaryExpression>(core::BinaryOp::kLessThan, Expr("i"), Expr(5_u));
     auto* body = Block(Return());
     auto* l = While(cond, body, tint::Vector{attr1, attr2});
diff --git a/src/tint/lang/core/diagnostic_rule.cc b/src/tint/lang/wgsl/diagnostic_rule.cc
similarity index 94%
rename from src/tint/lang/core/diagnostic_rule.cc
rename to src/tint/lang/wgsl/diagnostic_rule.cc
index b226240..624b2c1 100644
--- a/src/tint/lang/core/diagnostic_rule.cc
+++ b/src/tint/lang/wgsl/diagnostic_rule.cc
@@ -14,20 +14,20 @@
 
 ////////////////////////////////////////////////////////////////////////////////
 // File generated by 'tools/src/cmd/gen' using the template:
-//   src/tint/lang/core/diagnostic_rule.cc.tmpl
+//   src/tint/lang/wgsl/diagnostic_rule.cc.tmpl
 //
 // To regenerate run: './tools/run gen'
 //
 //                       Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-#include "src/tint/lang/core/diagnostic_rule.h"
+#include "src/tint/lang/wgsl/diagnostic_rule.h"
 
 #include <string>
 
 #include "src/tint/utils/traits/traits.h"
 
-namespace tint::core {
+namespace tint::wgsl {
 
 /// ParseCoreDiagnosticRule parses a CoreDiagnosticRule from a string.
 /// @param str the string to parse
@@ -70,4 +70,4 @@
     return "<unknown>";
 }
 
-}  // namespace tint::core
+}  // namespace tint::wgsl
diff --git a/src/tint/lang/core/diagnostic_rule.cc.tmpl b/src/tint/lang/wgsl/diagnostic_rule.cc.tmpl
similarity index 82%
rename from src/tint/lang/core/diagnostic_rule.cc.tmpl
rename to src/tint/lang/wgsl/diagnostic_rule.cc.tmpl
index fdde9ab..9162120 100644
--- a/src/tint/lang/core/diagnostic_rule.cc.tmpl
+++ b/src/tint/lang/wgsl/diagnostic_rule.cc.tmpl
@@ -8,16 +8,16 @@
 --------------------------------------------------------------------------------
 */ -}}
 
-{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
+{{- $I := LoadIntrinsics "src/tint/lang/wgsl/wgsl.def" -}}
 {{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 
-#include "src/tint/lang/core/diagnostic_rule.h"
+#include "src/tint/lang/wgsl/diagnostic_rule.h"
 
 #include <string>
 
 #include "src/tint/utils/traits/traits.h"
 
-namespace tint::core {
+namespace tint::wgsl {
 
 {{ Eval "ParseEnum" ($I.Sem.Enum "core_diagnostic_rule")}}
 
@@ -27,4 +27,4 @@
 
 {{ Eval "EnumOStream" ($I.Sem.Enum "chromium_diagnostic_rule")}}
 
-}  // namespace tint::core
+}  // namespace tint::wgsl
diff --git a/src/tint/lang/core/diagnostic_rule.h b/src/tint/lang/wgsl/diagnostic_rule.h
similarity index 92%
rename from src/tint/lang/core/diagnostic_rule.h
rename to src/tint/lang/wgsl/diagnostic_rule.h
index 0bc5f72..e0a71fe 100644
--- a/src/tint/lang/core/diagnostic_rule.h
+++ b/src/tint/lang/wgsl/diagnostic_rule.h
@@ -14,15 +14,15 @@
 
 ////////////////////////////////////////////////////////////////////////////////
 // File generated by 'tools/src/cmd/gen' using the template:
-//   src/tint/lang/core/diagnostic_rule.h.tmpl
+//   src/tint/lang/wgsl/diagnostic_rule.h.tmpl
 //
 // To regenerate run: './tools/run gen'
 //
 //                       Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-#ifndef SRC_TINT_LANG_CORE_DIAGNOSTIC_RULE_H_
-#define SRC_TINT_LANG_CORE_DIAGNOSTIC_RULE_H_
+#ifndef SRC_TINT_LANG_WGSL_DIAGNOSTIC_RULE_H_
+#define SRC_TINT_LANG_WGSL_DIAGNOSTIC_RULE_H_
 
 #include <cstdint>
 #include <string>
@@ -30,7 +30,7 @@
 
 #include "src/tint/utils/traits/traits.h"
 
-namespace tint::core {
+namespace tint::wgsl {
 
 /// WGSL core diagnostic rules.
 enum class CoreDiagnosticRule : uint8_t {
@@ -90,6 +90,6 @@
 /// All diagnostic rules understood by Tint.
 using DiagnosticRule = std::variant<CoreDiagnosticRule, ChromiumDiagnosticRule>;
 
-}  // namespace tint::core
+}  // namespace tint::wgsl
 
-#endif  // SRC_TINT_LANG_CORE_DIAGNOSTIC_RULE_H_
+#endif  // SRC_TINT_LANG_WGSL_DIAGNOSTIC_RULE_H_
diff --git a/src/tint/lang/core/diagnostic_rule.h.tmpl b/src/tint/lang/wgsl/diagnostic_rule.h.tmpl
similarity index 77%
rename from src/tint/lang/core/diagnostic_rule.h.tmpl
rename to src/tint/lang/wgsl/diagnostic_rule.h.tmpl
index 8bf1f0d..9948d1c 100644
--- a/src/tint/lang/core/diagnostic_rule.h.tmpl
+++ b/src/tint/lang/wgsl/diagnostic_rule.h.tmpl
@@ -8,11 +8,11 @@
 --------------------------------------------------------------------------------
 */ -}}
 
-{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
+{{- $I := LoadIntrinsics "src/tint/lang/wgsl/wgsl.def" -}}
 {{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 
-#ifndef SRC_TINT_LANG_CORE_DIAGNOSTIC_RULE_H_
-#define SRC_TINT_LANG_CORE_DIAGNOSTIC_RULE_H_
+#ifndef SRC_TINT_LANG_WGSL_DIAGNOSTIC_RULE_H_
+#define SRC_TINT_LANG_WGSL_DIAGNOSTIC_RULE_H_
 
 #include <cstdint>
 #include <string>
@@ -20,7 +20,7 @@
 
 #include "src/tint/utils/traits/traits.h"
 
-namespace tint::core {
+namespace tint::wgsl {
 
 /// WGSL core diagnostic rules.
 {{ Eval "DeclareEnum" ($I.Sem.Enum "core_diagnostic_rule") }}
@@ -31,6 +31,6 @@
 /// All diagnostic rules understood by Tint.
 using DiagnosticRule = std::variant<CoreDiagnosticRule, ChromiumDiagnosticRule>;
 
-}  // namespace tint::core
+}  // namespace tint::wgsl
 
-#endif  // SRC_TINT_LANG_CORE_DIAGNOSTIC_RULE_H_
+#endif  // SRC_TINT_LANG_WGSL_DIAGNOSTIC_RULE_H_
diff --git a/src/tint/lang/core/diagnostic_rule_bench.cc b/src/tint/lang/wgsl/diagnostic_rule_bench.cc
similarity index 92%
rename from src/tint/lang/core/diagnostic_rule_bench.cc
rename to src/tint/lang/wgsl/diagnostic_rule_bench.cc
index 4393c23..178f213 100644
--- a/src/tint/lang/core/diagnostic_rule_bench.cc
+++ b/src/tint/lang/wgsl/diagnostic_rule_bench.cc
@@ -14,20 +14,20 @@
 
 ////////////////////////////////////////////////////////////////////////////////
 // File generated by 'tools/src/cmd/gen' using the template:
-//   src/tint/lang/core/diagnostic_rule_bench.cc.tmpl
+//   src/tint/lang/wgsl/diagnostic_rule_bench.cc.tmpl
 //
 // To regenerate run: './tools/run gen'
 //
 //                       Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-#include "src/tint/lang/core/diagnostic_rule.h"
+#include "src/tint/lang/wgsl/diagnostic_rule.h"
 
 #include <array>
 
 #include "benchmark/benchmark.h"
 
-namespace tint::core {
+namespace tint::wgsl {
 namespace {
 
 void CoreDiagnosticRuleParser(::benchmark::State& state) {
@@ -62,4 +62,4 @@
 BENCHMARK(ChromiumDiagnosticRuleParser);
 
 }  // namespace
-}  // namespace tint::core
+}  // namespace tint::wgsl
diff --git a/src/tint/lang/core/diagnostic_rule_bench.cc.tmpl b/src/tint/lang/wgsl/diagnostic_rule_bench.cc.tmpl
similarity index 81%
rename from src/tint/lang/core/diagnostic_rule_bench.cc.tmpl
rename to src/tint/lang/wgsl/diagnostic_rule_bench.cc.tmpl
index 4813af5..cf1b20f 100644
--- a/src/tint/lang/core/diagnostic_rule_bench.cc.tmpl
+++ b/src/tint/lang/wgsl/diagnostic_rule_bench.cc.tmpl
@@ -8,16 +8,16 @@
 --------------------------------------------------------------------------------
 */ -}}
 
-{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
+{{- $I := LoadIntrinsics "src/tint/lang/wgsl/wgsl.def" -}}
 {{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 
-#include "src/tint/lang/core/diagnostic_rule.h"
+#include "src/tint/lang/wgsl/diagnostic_rule.h"
 
 #include <array>
 
 #include "benchmark/benchmark.h"
 
-namespace tint::core {
+namespace tint::wgsl {
 namespace {
 
 {{ Eval "BenchmarkParseEnum" ($I.Sem.Enum "core_diagnostic_rule")}}
@@ -25,4 +25,4 @@
 {{ Eval "BenchmarkParseEnum" ($I.Sem.Enum "chromium_diagnostic_rule")}}
 
 }  // namespace
-}  // namespace tint::core
+}  // namespace tint::wgsl
diff --git a/src/tint/lang/core/diagnostic_rule_test.cc b/src/tint/lang/wgsl/diagnostic_rule_test.cc
similarity index 96%
rename from src/tint/lang/core/diagnostic_rule_test.cc
rename to src/tint/lang/wgsl/diagnostic_rule_test.cc
index c20079c..5c5a393 100644
--- a/src/tint/lang/core/diagnostic_rule_test.cc
+++ b/src/tint/lang/wgsl/diagnostic_rule_test.cc
@@ -14,7 +14,7 @@
 
 ////////////////////////////////////////////////////////////////////////////////
 // File generated by 'tools/src/cmd/gen' using the template:
-//   src/tint/lang/core/diagnostic_rule_test.cc.tmpl
+//   src/tint/lang/wgsl/diagnostic_rule_test.cc.tmpl
 //
 // To regenerate run: './tools/run gen'
 //
@@ -24,10 +24,10 @@
 #include <string>
 
 #include "gtest/gtest-spi.h"
-#include "src/tint/lang/core/diagnostic_rule.h"
+#include "src/tint/lang/wgsl/diagnostic_rule.h"
 #include "src/tint/utils/text/string.h"
 
-namespace tint::core {
+namespace tint::wgsl {
 namespace {
 
 namespace core_diagnostic_rule_tests {
@@ -135,4 +135,4 @@
 }  // namespace chromium_diagnostic_rule_tests
 
 }  // namespace
-}  // namespace tint::core
+}  // namespace tint::wgsl
diff --git a/src/tint/lang/core/diagnostic_rule_test.cc.tmpl b/src/tint/lang/wgsl/diagnostic_rule_test.cc.tmpl
similarity index 84%
rename from src/tint/lang/core/diagnostic_rule_test.cc.tmpl
rename to src/tint/lang/wgsl/diagnostic_rule_test.cc.tmpl
index 40da435..d34cd75 100644
--- a/src/tint/lang/core/diagnostic_rule_test.cc.tmpl
+++ b/src/tint/lang/wgsl/diagnostic_rule_test.cc.tmpl
@@ -8,16 +8,16 @@
 --------------------------------------------------------------------------------
 */ -}}
 
-{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
+{{- $I := LoadIntrinsics "src/tint/lang/wgsl/wgsl.def" -}}
 {{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 
 #include <string>
 
 #include "gtest/gtest-spi.h"
-#include "src/tint/lang/core/diagnostic_rule.h"
+#include "src/tint/lang/wgsl/diagnostic_rule.h"
 #include "src/tint/utils/text/string.h"
 
-namespace tint::core {
+namespace tint::wgsl {
 namespace {
 
 namespace core_diagnostic_rule_tests {
@@ -33,4 +33,4 @@
 }  // namespace chromium_diagnostic_rule_tests
 
 }  // namespace
-}  // namespace tint::core
+}  // namespace tint::wgsl
diff --git a/src/tint/lang/core/diagnostic_severity.cc b/src/tint/lang/wgsl/diagnostic_severity.cc
similarity index 93%
rename from src/tint/lang/core/diagnostic_severity.cc
rename to src/tint/lang/wgsl/diagnostic_severity.cc
index 3cde694..ffb5480 100644
--- a/src/tint/lang/core/diagnostic_severity.cc
+++ b/src/tint/lang/wgsl/diagnostic_severity.cc
@@ -14,18 +14,18 @@
 
 ////////////////////////////////////////////////////////////////////////////////
 // File generated by 'tools/src/cmd/gen' using the template:
-//   src/tint/lang/core/diagnostic_severity.cc.tmpl
+//   src/tint/lang/wgsl/diagnostic_severity.cc.tmpl
 //
 // To regenerate run: './tools/run gen'
 //
 //                       Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-#include "src/tint/lang/core/diagnostic_severity.h"
+#include "src/tint/lang/wgsl/diagnostic_severity.h"
 
 #include <string>
 
-namespace tint::core {
+namespace tint::wgsl {
 
 diag::Severity ToSeverity(DiagnosticSeverity sc) {
     switch (sc) {
@@ -75,4 +75,4 @@
     return "<unknown>";
 }
 
-}  // namespace tint::core
+}  // namespace tint::wgsl
diff --git a/src/tint/lang/core/diagnostic_severity.cc.tmpl b/src/tint/lang/wgsl/diagnostic_severity.cc.tmpl
similarity index 85%
rename from src/tint/lang/core/diagnostic_severity.cc.tmpl
rename to src/tint/lang/wgsl/diagnostic_severity.cc.tmpl
index f14922a..fdc3a8d 100644
--- a/src/tint/lang/core/diagnostic_severity.cc.tmpl
+++ b/src/tint/lang/wgsl/diagnostic_severity.cc.tmpl
@@ -8,14 +8,14 @@
 --------------------------------------------------------------------------------
 */ -}}
 
-{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
+{{- $I := LoadIntrinsics "src/tint/lang/wgsl/wgsl.def" -}}
 {{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 
-#include "src/tint/lang/core/diagnostic_severity.h"
+#include "src/tint/lang/wgsl/diagnostic_severity.h"
 
 #include <string>
 
-namespace tint::core {
+namespace tint::wgsl {
 
 diag::Severity ToSeverity(DiagnosticSeverity sc) {
     switch (sc) {
@@ -34,4 +34,4 @@
 
 {{ Eval "EnumOStream" ($I.Sem.Enum "diagnostic_severity")}}
 
-}  // namespace tint::core
+}  // namespace tint::wgsl
diff --git a/src/tint/lang/core/diagnostic_severity.h b/src/tint/lang/wgsl/diagnostic_severity.h
similarity index 88%
rename from src/tint/lang/core/diagnostic_severity.h
rename to src/tint/lang/wgsl/diagnostic_severity.h
index 9a7bd91..a09d2ab 100644
--- a/src/tint/lang/core/diagnostic_severity.h
+++ b/src/tint/lang/wgsl/diagnostic_severity.h
@@ -14,24 +14,24 @@
 
 ////////////////////////////////////////////////////////////////////////////////
 // File generated by 'tools/src/cmd/gen' using the template:
-//   src/tint/lang/core/diagnostic_severity.h.tmpl
+//   src/tint/lang/wgsl/diagnostic_severity.h.tmpl
 //
 // To regenerate run: './tools/run gen'
 //
 //                       Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-#ifndef SRC_TINT_LANG_CORE_DIAGNOSTIC_SEVERITY_H_
-#define SRC_TINT_LANG_CORE_DIAGNOSTIC_SEVERITY_H_
+#ifndef SRC_TINT_LANG_WGSL_DIAGNOSTIC_SEVERITY_H_
+#define SRC_TINT_LANG_WGSL_DIAGNOSTIC_SEVERITY_H_
 
 #include <string>
 #include <unordered_map>
 
-#include "src/tint/lang/core/diagnostic_rule.h"
+#include "src/tint/lang/wgsl/diagnostic_rule.h"
 #include "src/tint/utils/diagnostic/diagnostic.h"
 #include "src/tint/utils/traits/traits.h"
 
-namespace tint::core {
+namespace tint::wgsl {
 
 /// The diagnostic severity control.
 enum class DiagnosticSeverity : uint8_t {
@@ -72,6 +72,6 @@
 /// DiagnosticRuleSeverities is a map from diagnostic rule to diagnostic severity.
 using DiagnosticRuleSeverities = std::unordered_map<DiagnosticRule, DiagnosticSeverity>;
 
-}  // namespace tint::core
+}  // namespace tint::wgsl
 
-#endif  // SRC_TINT_LANG_CORE_DIAGNOSTIC_SEVERITY_H_
+#endif  // SRC_TINT_LANG_WGSL_DIAGNOSTIC_SEVERITY_H_
diff --git a/src/tint/lang/core/diagnostic_severity.h.tmpl b/src/tint/lang/wgsl/diagnostic_severity.h.tmpl
similarity index 76%
rename from src/tint/lang/core/diagnostic_severity.h.tmpl
rename to src/tint/lang/wgsl/diagnostic_severity.h.tmpl
index fbabfaf..045591f 100644
--- a/src/tint/lang/core/diagnostic_severity.h.tmpl
+++ b/src/tint/lang/wgsl/diagnostic_severity.h.tmpl
@@ -8,20 +8,20 @@
 --------------------------------------------------------------------------------
 */ -}}
 
-{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
+{{- $I := LoadIntrinsics "src/tint/lang/wgsl/wgsl.def" -}}
 {{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 
-#ifndef SRC_TINT_LANG_CORE_DIAGNOSTIC_SEVERITY_H_
-#define SRC_TINT_LANG_CORE_DIAGNOSTIC_SEVERITY_H_
+#ifndef SRC_TINT_LANG_WGSL_DIAGNOSTIC_SEVERITY_H_
+#define SRC_TINT_LANG_WGSL_DIAGNOSTIC_SEVERITY_H_
 
 #include <string>
 #include <unordered_map>
 
 #include "src/tint/utils/traits/traits.h"
-#include "src/tint/lang/core/diagnostic_rule.h"
+#include "src/tint/lang/wgsl/diagnostic_rule.h"
 #include "src/tint/utils/diagnostic/diagnostic.h"
 
-namespace tint::core {
+namespace tint::wgsl {
 
 /// The diagnostic severity control.
 {{ Eval "DeclareEnum" ($I.Sem.Enum "diagnostic_severity") }}
@@ -32,6 +32,6 @@
 /// DiagnosticRuleSeverities is a map from diagnostic rule to diagnostic severity.
 using DiagnosticRuleSeverities = std::unordered_map<DiagnosticRule, DiagnosticSeverity>;
 
-}  // namespace tint::core
+}  // namespace tint::wgsl
 
-#endif  // SRC_TINT_LANG_CORE_DIAGNOSTIC_SEVERITY_H_
+#endif  // SRC_TINT_LANG_WGSL_DIAGNOSTIC_SEVERITY_H_
diff --git a/src/tint/lang/core/diagnostic_severity_bench.cc b/src/tint/lang/wgsl/diagnostic_severity_bench.cc
similarity index 91%
rename from src/tint/lang/core/diagnostic_severity_bench.cc
rename to src/tint/lang/wgsl/diagnostic_severity_bench.cc
index 50a4f11..52e5736 100644
--- a/src/tint/lang/core/diagnostic_severity_bench.cc
+++ b/src/tint/lang/wgsl/diagnostic_severity_bench.cc
@@ -14,20 +14,20 @@
 
 ////////////////////////////////////////////////////////////////////////////////
 // File generated by 'tools/src/cmd/gen' using the template:
-//   src/tint/lang/core/diagnostic_severity_bench.cc.tmpl
+//   src/tint/lang/wgsl/diagnostic_severity_bench.cc.tmpl
 //
 // To regenerate run: './tools/run gen'
 //
 //                       Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-#include "src/tint/lang/core/diagnostic_severity.h"
+#include "src/tint/lang/wgsl/diagnostic_severity.h"
 
 #include <array>
 
 #include "benchmark/benchmark.h"
 
-namespace tint::core {
+namespace tint::wgsl {
 namespace {
 
 void DiagnosticSeverityParser(::benchmark::State& state) {
@@ -48,4 +48,4 @@
 BENCHMARK(DiagnosticSeverityParser);
 
 }  // namespace
-}  // namespace tint::core
+}  // namespace tint::wgsl
diff --git a/src/tint/lang/core/diagnostic_severity_bench.cc.tmpl b/src/tint/lang/wgsl/diagnostic_severity_bench.cc.tmpl
similarity index 79%
rename from src/tint/lang/core/diagnostic_severity_bench.cc.tmpl
rename to src/tint/lang/wgsl/diagnostic_severity_bench.cc.tmpl
index 9bbb401..a925938 100644
--- a/src/tint/lang/core/diagnostic_severity_bench.cc.tmpl
+++ b/src/tint/lang/wgsl/diagnostic_severity_bench.cc.tmpl
@@ -8,19 +8,19 @@
 --------------------------------------------------------------------------------
 */ -}}
 
-{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
+{{- $I := LoadIntrinsics "src/tint/lang/wgsl/wgsl.def" -}}
 {{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 
-#include "src/tint/lang/core/diagnostic_severity.h"
+#include "src/tint/lang/wgsl/diagnostic_severity.h"
 
 #include <array>
 
 #include "benchmark/benchmark.h"
 
-namespace tint::core {
+namespace tint::wgsl {
 namespace {
 
 {{ Eval "BenchmarkParseEnum" ($I.Sem.Enum "diagnostic_severity")}}
 
 }  // namespace
-}  // namespace tint::core
+}  // namespace tint::wgsl
diff --git a/src/tint/lang/core/diagnostic_severity_test.cc b/src/tint/lang/wgsl/diagnostic_severity_test.cc
similarity index 94%
rename from src/tint/lang/core/diagnostic_severity_test.cc
rename to src/tint/lang/wgsl/diagnostic_severity_test.cc
index 78c1d75..960569f 100644
--- a/src/tint/lang/core/diagnostic_severity_test.cc
+++ b/src/tint/lang/wgsl/diagnostic_severity_test.cc
@@ -14,7 +14,7 @@
 
 ////////////////////////////////////////////////////////////////////////////////
 // File generated by 'tools/src/cmd/gen' using the template:
-//   src/tint/lang/core/diagnostic_severity_test.cc.tmpl
+//   src/tint/lang/wgsl/diagnostic_severity_test.cc.tmpl
 //
 // To regenerate run: './tools/run gen'
 //
@@ -24,10 +24,10 @@
 #include <string>
 
 #include "gtest/gtest-spi.h"
-#include "src/tint/lang/core/diagnostic_severity.h"
+#include "src/tint/lang/wgsl/diagnostic_severity.h"
 #include "src/tint/utils/text/string.h"
 
-namespace tint::core {
+namespace tint::wgsl {
 namespace {
 
 namespace diagnostic_severity_tests {
@@ -87,4 +87,4 @@
 }  // namespace diagnostic_severity_tests
 
 }  // namespace
-}  // namespace tint::core
+}  // namespace tint::wgsl
diff --git a/src/tint/lang/core/diagnostic_severity_test.cc.tmpl b/src/tint/lang/wgsl/diagnostic_severity_test.cc.tmpl
similarity index 81%
rename from src/tint/lang/core/diagnostic_severity_test.cc.tmpl
rename to src/tint/lang/wgsl/diagnostic_severity_test.cc.tmpl
index e2db82e..48a7542 100644
--- a/src/tint/lang/core/diagnostic_severity_test.cc.tmpl
+++ b/src/tint/lang/wgsl/diagnostic_severity_test.cc.tmpl
@@ -8,16 +8,16 @@
 --------------------------------------------------------------------------------
 */ -}}
 
-{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
+{{- $I := LoadIntrinsics "src/tint/lang/wgsl/wgsl.def" -}}
 {{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 
 #include <string>
 
 #include "gtest/gtest-spi.h"
-#include "src/tint/lang/core/diagnostic_severity.h"
+#include "src/tint/lang/wgsl/diagnostic_severity.h"
 #include "src/tint/utils/text/string.h"
 
-namespace tint::core {
+namespace tint::wgsl {
 namespace {
 
 namespace diagnostic_severity_tests {
@@ -27,4 +27,4 @@
 }  // namespace diagnostic_severity_tests
 
 }  // namespace
-}  // namespace tint::core
+}  // namespace tint::wgsl
diff --git a/src/tint/lang/core/extension.cc b/src/tint/lang/wgsl/extension.cc
similarity index 96%
rename from src/tint/lang/core/extension.cc
rename to src/tint/lang/wgsl/extension.cc
index 102d612..96598a7 100644
--- a/src/tint/lang/core/extension.cc
+++ b/src/tint/lang/wgsl/extension.cc
@@ -14,16 +14,16 @@
 
 ////////////////////////////////////////////////////////////////////////////////
 // File generated by 'tools/src/cmd/gen' using the template:
-//   src/tint/lang/core/extension.cc.tmpl
+//   src/tint/lang/wgsl/extension.cc.tmpl
 //
 // To regenerate run: './tools/run gen'
 //
 //                       Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-#include "src/tint/lang/core/extension.h"
+#include "src/tint/lang/wgsl/extension.h"
 
-namespace tint::core {
+namespace tint::wgsl {
 
 /// ParseExtension parses a Extension from a string.
 /// @param str the string to parse
@@ -90,4 +90,4 @@
     return "<unknown>";
 }
 
-}  // namespace tint::core
+}  // namespace tint::wgsl
diff --git a/src/tint/lang/core/extension.cc.tmpl b/src/tint/lang/wgsl/extension.cc.tmpl
similarity index 78%
rename from src/tint/lang/core/extension.cc.tmpl
rename to src/tint/lang/wgsl/extension.cc.tmpl
index 37c9e1b..cbe975b 100644
--- a/src/tint/lang/core/extension.cc.tmpl
+++ b/src/tint/lang/wgsl/extension.cc.tmpl
@@ -8,16 +8,16 @@
 --------------------------------------------------------------------------------
 */ -}}
 
-{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
+{{- $I := LoadIntrinsics "src/tint/lang/wgsl/wgsl.def" -}}
 {{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 {{- $enum := ($I.Sem.Enum "extension") -}}
 
-#include "src/tint/lang/core/extension.h"
+#include "src/tint/lang/wgsl/extension.h"
 
-namespace tint::core {
+namespace tint::wgsl {
 
 {{ Eval "ParseEnum" $enum}}
 
 {{ Eval "EnumOStream" $enum}}
 
-}  // namespace tint::core
+}  // namespace tint::wgsl
diff --git a/src/tint/lang/core/extension.h b/src/tint/lang/wgsl/extension.h
similarity index 92%
rename from src/tint/lang/core/extension.h
rename to src/tint/lang/wgsl/extension.h
index 7672ee0..0f401c9 100644
--- a/src/tint/lang/core/extension.h
+++ b/src/tint/lang/wgsl/extension.h
@@ -14,20 +14,20 @@
 
 ////////////////////////////////////////////////////////////////////////////////
 // File generated by 'tools/src/cmd/gen' using the template:
-//   src/tint/lang/core/extension.h.tmpl
+//   src/tint/lang/wgsl/extension.h.tmpl
 //
 // To regenerate run: './tools/run gen'
 //
 //                       Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-#ifndef SRC_TINT_LANG_CORE_EXTENSION_H_
-#define SRC_TINT_LANG_CORE_EXTENSION_H_
+#ifndef SRC_TINT_LANG_WGSL_EXTENSION_H_
+#define SRC_TINT_LANG_WGSL_EXTENSION_H_
 
 #include "src/tint/utils/containers/unique_vector.h"
 #include "src/tint/utils/traits/traits.h"
 
-namespace tint::core {
+namespace tint::wgsl {
 
 /// An enumerator of WGSL extensions
 /// @see src/tint/lang/wgsl/intrinsics.def for extension descriptions
@@ -73,6 +73,6 @@
 // A unique vector of extensions
 using Extensions = UniqueVector<Extension, 4>;
 
-}  // namespace tint::core
+}  // namespace tint::wgsl
 
-#endif  // SRC_TINT_LANG_CORE_EXTENSION_H_
+#endif  // SRC_TINT_LANG_WGSL_EXTENSION_H_
diff --git a/src/tint/lang/core/extension.h.tmpl b/src/tint/lang/wgsl/extension.h.tmpl
similarity index 77%
rename from src/tint/lang/core/extension.h.tmpl
rename to src/tint/lang/wgsl/extension.h.tmpl
index 0637395..1c69ee1 100644
--- a/src/tint/lang/core/extension.h.tmpl
+++ b/src/tint/lang/wgsl/extension.h.tmpl
@@ -8,17 +8,17 @@
 --------------------------------------------------------------------------------
 */ -}}
 
-{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
+{{- $I := LoadIntrinsics "src/tint/lang/wgsl/wgsl.def" -}}
 {{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 {{- $enum := ($I.Sem.Enum "extension") -}}
 
-#ifndef SRC_TINT_LANG_CORE_EXTENSION_H_
-#define SRC_TINT_LANG_CORE_EXTENSION_H_
+#ifndef SRC_TINT_LANG_WGSL_EXTENSION_H_
+#define SRC_TINT_LANG_WGSL_EXTENSION_H_
 
 #include "src/tint/utils/traits/traits.h"
 #include "src/tint/utils/containers/unique_vector.h"
 
-namespace tint::core {
+namespace tint::wgsl {
 
 /// An enumerator of WGSL extensions
 /// @see src/tint/lang/wgsl/intrinsics.def for extension descriptions
@@ -27,6 +27,6 @@
 // A unique vector of extensions
 using Extensions = UniqueVector<Extension, 4>;
 
-}  // namespace tint::core
+}  // namespace tint::wgsl
 
-#endif  // SRC_TINT_LANG_CORE_EXTENSION_H_
+#endif  // SRC_TINT_LANG_WGSL_EXTENSION_H_
diff --git a/src/tint/lang/core/extension_bench.cc b/src/tint/lang/wgsl/extension_bench.cc
similarity index 96%
rename from src/tint/lang/core/extension_bench.cc
rename to src/tint/lang/wgsl/extension_bench.cc
index b0602c7..50d3ea9 100644
--- a/src/tint/lang/core/extension_bench.cc
+++ b/src/tint/lang/wgsl/extension_bench.cc
@@ -14,20 +14,20 @@
 
 ////////////////////////////////////////////////////////////////////////////////
 // File generated by 'tools/src/cmd/gen' using the template:
-//   src/tint/lang/core/extension_bench.cc.tmpl
+//   src/tint/lang/wgsl/extension_bench.cc.tmpl
 //
 // To regenerate run: './tools/run gen'
 //
 //                       Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-#include "src/tint/lang/core/extension.h"
+#include "src/tint/lang/wgsl/extension.h"
 
 #include <array>
 
 #include "benchmark/benchmark.h"
 
-namespace tint::core {
+namespace tint::wgsl {
 namespace {
 
 void ExtensionParser(::benchmark::State& state) {
@@ -114,4 +114,4 @@
 BENCHMARK(ExtensionParser);
 
 }  // namespace
-}  // namespace tint::core
+}  // namespace tint::wgsl
diff --git a/src/tint/lang/core/extension_bench.cc.tmpl b/src/tint/lang/wgsl/extension_bench.cc.tmpl
similarity index 80%
rename from src/tint/lang/core/extension_bench.cc.tmpl
rename to src/tint/lang/wgsl/extension_bench.cc.tmpl
index eeff261..7fc8c5c 100644
--- a/src/tint/lang/core/extension_bench.cc.tmpl
+++ b/src/tint/lang/wgsl/extension_bench.cc.tmpl
@@ -8,20 +8,20 @@
 --------------------------------------------------------------------------------
 */ -}}
 
-{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
+{{- $I := LoadIntrinsics "src/tint/lang/wgsl/wgsl.def" -}}
 {{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 {{- $enum := ($I.Sem.Enum "extension") -}}
 
-#include "src/tint/lang/core/extension.h"
+#include "src/tint/lang/wgsl/extension.h"
 
 #include <array>
 
 #include "benchmark/benchmark.h"
 
-namespace tint::core {
+namespace tint::wgsl {
 namespace {
 
 {{ Eval "BenchmarkParseEnum" $enum }}
 
 }  // namespace
-}  // namespace tint::core
+}  // namespace tint::wgsl
diff --git a/src/tint/lang/core/extension_test.cc b/src/tint/lang/wgsl/extension_test.cc
similarity index 96%
rename from src/tint/lang/core/extension_test.cc
rename to src/tint/lang/wgsl/extension_test.cc
index 32149f6..d46393d 100644
--- a/src/tint/lang/core/extension_test.cc
+++ b/src/tint/lang/wgsl/extension_test.cc
@@ -14,14 +14,14 @@
 
 ////////////////////////////////////////////////////////////////////////////////
 // File generated by 'tools/src/cmd/gen' using the template:
-//   src/tint/lang/core/extension_test.cc.tmpl
+//   src/tint/lang/wgsl/extension_test.cc.tmpl
 //
 // To regenerate run: './tools/run gen'
 //
 //                       Do not modify this file directly
 ////////////////////////////////////////////////////////////////////////////////
 
-#include "src/tint/lang/core/extension.h"
+#include "src/tint/lang/wgsl/extension.h"
 
 #include <gtest/gtest.h>
 
@@ -29,7 +29,7 @@
 
 #include "src/tint/utils/text/string.h"
 
-namespace tint::core {
+namespace tint::wgsl {
 namespace {
 
 namespace parse_print_tests {
@@ -115,4 +115,4 @@
 }  // namespace parse_print_tests
 
 }  // namespace
-}  // namespace tint::core
+}  // namespace tint::wgsl
diff --git a/src/tint/lang/core/extension_test.cc.tmpl b/src/tint/lang/wgsl/extension_test.cc.tmpl
similarity index 81%
rename from src/tint/lang/core/extension_test.cc.tmpl
rename to src/tint/lang/wgsl/extension_test.cc.tmpl
index b993082..0e6d498 100644
--- a/src/tint/lang/core/extension_test.cc.tmpl
+++ b/src/tint/lang/wgsl/extension_test.cc.tmpl
@@ -8,11 +8,11 @@
 --------------------------------------------------------------------------------
 */ -}}
 
-{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
+{{- $I := LoadIntrinsics "src/tint/lang/wgsl/wgsl.def" -}}
 {{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 {{- $enum := ($I.Sem.Enum "extension") -}}
 
-#include "src/tint/lang/core/extension.h"
+#include "src/tint/lang/wgsl/extension.h"
 
 #include <gtest/gtest.h>
 
@@ -20,10 +20,10 @@
 
 #include "src/tint/utils/text/string.h"
 
-namespace tint::core {
+namespace tint::wgsl {
 namespace {
 
 {{ Eval "TestParsePrintEnum" $enum}}
 
 }  // namespace
-}  // namespace tint::core
+}  // namespace tint::wgsl
diff --git a/src/tint/lang/wgsl/helpers/BUILD.bazel b/src/tint/lang/wgsl/helpers/BUILD.bazel
index 3dada81..c9687b0 100644
--- a/src/tint/lang/wgsl/helpers/BUILD.bazel
+++ b/src/tint/lang/wgsl/helpers/BUILD.bazel
@@ -40,6 +40,7 @@
     "//src/tint/lang/core",
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/type",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/ast/transform",
     "//src/tint/lang/wgsl/inspector",
@@ -78,6 +79,7 @@
     "//src/tint/lang/core/intrinsic",
     "//src/tint/lang/core/ir",
     "//src/tint/lang/core/type",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/ast:test",
     "//src/tint/lang/wgsl/helpers",
diff --git a/src/tint/lang/wgsl/helpers/BUILD.cmake b/src/tint/lang/wgsl/helpers/BUILD.cmake
index 085c869..8cf2e47 100644
--- a/src/tint/lang/wgsl/helpers/BUILD.cmake
+++ b/src/tint/lang/wgsl/helpers/BUILD.cmake
@@ -39,6 +39,7 @@
   tint_lang_core
   tint_lang_core_constant
   tint_lang_core_type
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_ast_transform
   tint_lang_wgsl_inspector
@@ -77,6 +78,7 @@
   tint_lang_core_intrinsic
   tint_lang_core_ir
   tint_lang_core_type
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_ast_test
   tint_lang_wgsl_helpers
diff --git a/src/tint/lang/wgsl/helpers/BUILD.gn b/src/tint/lang/wgsl/helpers/BUILD.gn
index b676822..be773f2 100644
--- a/src/tint/lang/wgsl/helpers/BUILD.gn
+++ b/src/tint/lang/wgsl/helpers/BUILD.gn
@@ -43,6 +43,7 @@
     "${tint_src_dir}/lang/core",
     "${tint_src_dir}/lang/core/constant",
     "${tint_src_dir}/lang/core/type",
+    "${tint_src_dir}/lang/wgsl",
     "${tint_src_dir}/lang/wgsl/ast",
     "${tint_src_dir}/lang/wgsl/ast/transform",
     "${tint_src_dir}/lang/wgsl/inspector",
@@ -80,6 +81,7 @@
       "${tint_src_dir}/lang/core/intrinsic",
       "${tint_src_dir}/lang/core/ir",
       "${tint_src_dir}/lang/core/type",
+      "${tint_src_dir}/lang/wgsl",
       "${tint_src_dir}/lang/wgsl/ast",
       "${tint_src_dir}/lang/wgsl/ast:unittests",
       "${tint_src_dir}/lang/wgsl/helpers",
diff --git a/src/tint/lang/wgsl/helpers/check_supported_extensions.cc b/src/tint/lang/wgsl/helpers/check_supported_extensions.cc
index 4e9c329..ece9b37 100644
--- a/src/tint/lang/wgsl/helpers/check_supported_extensions.cc
+++ b/src/tint/lang/wgsl/helpers/check_supported_extensions.cc
@@ -26,8 +26,8 @@
 bool CheckSupportedExtensions(std::string_view writer_name,
                               const ast::Module& module,
                               diag::List& diags,
-                              VectorRef<core::Extension> supported) {
-    Hashset<core::Extension, 32> set;
+                              VectorRef<wgsl::Extension> supported) {
+    Hashset<wgsl::Extension, 32> set;
     for (auto ext : supported) {
         set.Add(ext);
     }
diff --git a/src/tint/lang/wgsl/helpers/check_supported_extensions.h b/src/tint/lang/wgsl/helpers/check_supported_extensions.h
index e9642dd..b2f09f3 100644
--- a/src/tint/lang/wgsl/helpers/check_supported_extensions.h
+++ b/src/tint/lang/wgsl/helpers/check_supported_extensions.h
@@ -15,7 +15,7 @@
 #ifndef SRC_TINT_LANG_WGSL_HELPERS_CHECK_SUPPORTED_EXTENSIONS_H_
 #define SRC_TINT_LANG_WGSL_HELPERS_CHECK_SUPPORTED_EXTENSIONS_H_
 
-#include "src/tint/lang/core/extension.h"
+#include "src/tint/lang/wgsl/extension.h"
 #include "src/tint/utils/containers/vector.h"
 
 namespace tint::ast {
@@ -36,7 +36,7 @@
 bool CheckSupportedExtensions(std::string_view writer_name,
                               const ast::Module& module,
                               diag::List& diags,
-                              VectorRef<core::Extension> supported);
+                              VectorRef<wgsl::Extension> supported);
 
 }  // namespace tint::writer
 
diff --git a/src/tint/lang/wgsl/helpers/check_supported_extensions_test.cc b/src/tint/lang/wgsl/helpers/check_supported_extensions_test.cc
index 29f4c9f..0d90851 100644
--- a/src/tint/lang/wgsl/helpers/check_supported_extensions_test.cc
+++ b/src/tint/lang/wgsl/helpers/check_supported_extensions_test.cc
@@ -24,21 +24,21 @@
 class CheckSupportedExtensionsTest : public ::testing::Test, public ProgramBuilder {};
 
 TEST_F(CheckSupportedExtensionsTest, Supported) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     ASSERT_TRUE(CheckSupportedExtensions("writer", AST(), Diagnostics(),
                                          Vector{
-                                             core::Extension::kF16,
-                                             core::Extension::kChromiumExperimentalDp4A,
+                                             wgsl::Extension::kF16,
+                                             wgsl::Extension::kChromiumExperimentalDp4A,
                                          }));
 }
 
 TEST_F(CheckSupportedExtensionsTest, Unsupported) {
-    Enable(Source{{12, 34}}, core::Extension::kF16);
+    Enable(Source{{12, 34}}, wgsl::Extension::kF16);
 
     ASSERT_FALSE(CheckSupportedExtensions("writer", AST(), Diagnostics(),
                                           Vector{
-                                              core::Extension::kChromiumExperimentalDp4A,
+                                              wgsl::Extension::kChromiumExperimentalDp4A,
                                           }));
     EXPECT_EQ(Diagnostics().str(), "12:34 error: writer backend does not support extension 'f16'");
 }
diff --git a/src/tint/lang/wgsl/inspector/BUILD.bazel b/src/tint/lang/wgsl/inspector/BUILD.bazel
index 79a0b76..86f9897 100644
--- a/src/tint/lang/wgsl/inspector/BUILD.bazel
+++ b/src/tint/lang/wgsl/inspector/BUILD.bazel
@@ -42,6 +42,7 @@
     "//src/tint/lang/core",
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/type",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/program",
     "//src/tint/lang/wgsl/sem",
@@ -77,6 +78,7 @@
     "//src/tint/lang/core",
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/type",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/inspector",
     "//src/tint/lang/wgsl/program",
diff --git a/src/tint/lang/wgsl/inspector/BUILD.cmake b/src/tint/lang/wgsl/inspector/BUILD.cmake
index e5b36a0..5c0e910 100644
--- a/src/tint/lang/wgsl/inspector/BUILD.cmake
+++ b/src/tint/lang/wgsl/inspector/BUILD.cmake
@@ -41,6 +41,7 @@
   tint_lang_core
   tint_lang_core_constant
   tint_lang_core_type
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_program
   tint_lang_wgsl_sem
@@ -76,6 +77,7 @@
   tint_lang_core
   tint_lang_core_constant
   tint_lang_core_type
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_inspector
   tint_lang_wgsl_program
diff --git a/src/tint/lang/wgsl/inspector/BUILD.gn b/src/tint/lang/wgsl/inspector/BUILD.gn
index 5fea9d0..00feb25 100644
--- a/src/tint/lang/wgsl/inspector/BUILD.gn
+++ b/src/tint/lang/wgsl/inspector/BUILD.gn
@@ -45,6 +45,7 @@
     "${tint_src_dir}/lang/core",
     "${tint_src_dir}/lang/core/constant",
     "${tint_src_dir}/lang/core/type",
+    "${tint_src_dir}/lang/wgsl",
     "${tint_src_dir}/lang/wgsl/ast",
     "${tint_src_dir}/lang/wgsl/program",
     "${tint_src_dir}/lang/wgsl/sem",
@@ -79,6 +80,7 @@
       "${tint_src_dir}/lang/core",
       "${tint_src_dir}/lang/core/constant",
       "${tint_src_dir}/lang/core/type",
+      "${tint_src_dir}/lang/wgsl",
       "${tint_src_dir}/lang/wgsl/ast",
       "${tint_src_dir}/lang/wgsl/inspector",
       "${tint_src_dir}/lang/wgsl/program",
diff --git a/src/tint/lang/wgsl/inspector/inspector.cc b/src/tint/lang/wgsl/inspector/inspector.cc
index 7688ece..48cc3b7 100644
--- a/src/tint/lang/wgsl/inspector/inspector.cc
+++ b/src/tint/lang/wgsl/inspector/inspector.cc
@@ -18,7 +18,6 @@
 #include <utility>
 
 #include "src/tint/lang/core/builtin_value.h"
-#include "src/tint/lang/core/extension.h"
 #include "src/tint/lang/core/fluent_types.h"
 #include "src/tint/lang/core/interpolation_sampling.h"
 #include "src/tint/lang/core/interpolation_type.h"
@@ -48,6 +47,7 @@
 #include "src/tint/lang/wgsl/ast/module.h"
 #include "src/tint/lang/wgsl/ast/override.h"
 #include "src/tint/lang/wgsl/ast/var.h"
+#include "src/tint/lang/wgsl/extension.h"
 #include "src/tint/lang/wgsl/sem/builtin_enum_expression.h"
 #include "src/tint/lang/wgsl/sem/call.h"
 #include "src/tint/lang/wgsl/sem/function.h"
diff --git a/src/tint/lang/wgsl/inspector/inspector_test.cc b/src/tint/lang/wgsl/inspector/inspector_test.cc
index ad171bd..f2099b5 100644
--- a/src/tint/lang/wgsl/inspector/inspector_test.cc
+++ b/src/tint/lang/wgsl/inspector/inspector_test.cc
@@ -402,7 +402,7 @@
     std::function<ast::Type()> tint_type = GetTypeFunction(component, composition);
 
     if (component == ComponentType::kF16) {
-        Enable(core::Extension::kF16);
+        Enable(wgsl::Extension::kF16);
     }
 
     auto* in_var = Param("in_var", tint_type(),
@@ -1021,7 +1021,7 @@
 }
 
 TEST_F(InspectorGetEntryPointTest, OverrideTypes) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     Override("bool_var", ty.bool_());
     Override("float_var", ty.f32());
@@ -1540,7 +1540,7 @@
     // var<pixel_local> pls : Ure;
     // @fragment fn foo() {  _ = pls; }
 
-    Enable(core::Extension::kChromiumExperimentalPixelLocal);
+    Enable(wgsl::Extension::kChromiumExperimentalPixelLocal);
     Structure("Ure", Vector{
                          Member("toto", ty.u32()),
                          Member("titi", ty.f32()),
@@ -1777,7 +1777,7 @@
 }
 
 TEST_F(InspectorGetOverrideDefaultValuesTest, F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     Override("a", ty.f16(), Id(1_a));
     Override("b", ty.f16(), Expr(0_h), Id(20_a));
@@ -3087,11 +3087,11 @@
             expectedResourceType = ResourceBinding::ResourceType::kWriteOnlyStorageTexture;
             break;
         case core::Access::kRead:
-            Enable(core::Extension::kChromiumExperimentalReadWriteStorageTexture);
+            Enable(wgsl::Extension::kChromiumExperimentalReadWriteStorageTexture);
             expectedResourceType = ResourceBinding::ResourceType::kReadOnlyStorageTexture;
             break;
         case core::Access::kReadWrite:
-            Enable(core::Extension::kChromiumExperimentalReadWriteStorageTexture);
+            Enable(wgsl::Extension::kChromiumExperimentalReadWriteStorageTexture);
             expectedResourceType = ResourceBinding::ResourceType::kReadWriteStorageTexture;
             break;
         case core::Access::kUndefined:
diff --git a/src/tint/lang/wgsl/program/BUILD.bazel b/src/tint/lang/wgsl/program/BUILD.bazel
index aefd945..1fcc0d5 100644
--- a/src/tint/lang/wgsl/program/BUILD.bazel
+++ b/src/tint/lang/wgsl/program/BUILD.bazel
@@ -40,6 +40,7 @@
     "//src/tint/lang/core",
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/type",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/sem",
     "//src/tint/utils/containers",
@@ -72,6 +73,7 @@
     "//src/tint/lang/core",
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/type",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/ast:test",
     "//src/tint/lang/wgsl/program",
diff --git a/src/tint/lang/wgsl/program/BUILD.cmake b/src/tint/lang/wgsl/program/BUILD.cmake
index bae5dda..05bfcdb 100644
--- a/src/tint/lang/wgsl/program/BUILD.cmake
+++ b/src/tint/lang/wgsl/program/BUILD.cmake
@@ -39,6 +39,7 @@
   tint_lang_core
   tint_lang_core_constant
   tint_lang_core_type
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_sem
   tint_utils_containers
@@ -71,6 +72,7 @@
   tint_lang_core
   tint_lang_core_constant
   tint_lang_core_type
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_ast_test
   tint_lang_wgsl_program
diff --git a/src/tint/lang/wgsl/program/BUILD.gn b/src/tint/lang/wgsl/program/BUILD.gn
index 784b43c..ea3bd1b 100644
--- a/src/tint/lang/wgsl/program/BUILD.gn
+++ b/src/tint/lang/wgsl/program/BUILD.gn
@@ -43,6 +43,7 @@
     "${tint_src_dir}/lang/core",
     "${tint_src_dir}/lang/core/constant",
     "${tint_src_dir}/lang/core/type",
+    "${tint_src_dir}/lang/wgsl",
     "${tint_src_dir}/lang/wgsl/ast",
     "${tint_src_dir}/lang/wgsl/sem",
     "${tint_src_dir}/utils/containers",
@@ -74,6 +75,7 @@
       "${tint_src_dir}/lang/core",
       "${tint_src_dir}/lang/core/constant",
       "${tint_src_dir}/lang/core/type",
+      "${tint_src_dir}/lang/wgsl",
       "${tint_src_dir}/lang/wgsl/ast",
       "${tint_src_dir}/lang/wgsl/ast:unittests",
       "${tint_src_dir}/lang/wgsl/program",
diff --git a/src/tint/lang/wgsl/program/program_builder.h b/src/tint/lang/wgsl/program/program_builder.h
index 9daac97..81fdfc7 100644
--- a/src/tint/lang/wgsl/program/program_builder.h
+++ b/src/tint/lang/wgsl/program/program_builder.h
@@ -22,7 +22,6 @@
 #include "src/tint/api/common/override_id.h"
 
 #include "src/tint/lang/core/constant/manager.h"
-#include "src/tint/lang/core/extension.h"
 #include "src/tint/lang/core/fluent_types.h"
 #include "src/tint/lang/core/interpolation_sampling.h"
 #include "src/tint/lang/core/interpolation_type.h"
@@ -45,6 +44,7 @@
 #include "src/tint/lang/core/type/vector.h"
 #include "src/tint/lang/core/type/void.h"
 #include "src/tint/lang/wgsl/ast/builder.h"
+#include "src/tint/lang/wgsl/extension.h"
 #include "src/tint/lang/wgsl/program/program.h"
 #include "src/tint/lang/wgsl/sem/array_count.h"
 #include "src/tint/lang/wgsl/sem/struct.h"
diff --git a/src/tint/lang/wgsl/reader/BUILD.bazel b/src/tint/lang/wgsl/reader/BUILD.bazel
index 4e8ffe5..43922a8 100644
--- a/src/tint/lang/wgsl/reader/BUILD.bazel
+++ b/src/tint/lang/wgsl/reader/BUILD.bazel
@@ -36,6 +36,7 @@
     "//src/tint/lang/core",
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/type",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/program",
     "//src/tint/lang/wgsl/reader/parser",
@@ -68,6 +69,7 @@
     "//src/tint/lang/core",
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/type",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/program",
     "//src/tint/lang/wgsl/reader",
diff --git a/src/tint/lang/wgsl/reader/BUILD.cmake b/src/tint/lang/wgsl/reader/BUILD.cmake
index 2c84e0b..9848c4b 100644
--- a/src/tint/lang/wgsl/reader/BUILD.cmake
+++ b/src/tint/lang/wgsl/reader/BUILD.cmake
@@ -38,6 +38,7 @@
   tint_lang_core
   tint_lang_core_constant
   tint_lang_core_type
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_program
   tint_lang_wgsl_reader_parser
@@ -71,6 +72,7 @@
   tint_lang_core
   tint_lang_core_constant
   tint_lang_core_type
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_program
   tint_lang_wgsl_reader
diff --git a/src/tint/lang/wgsl/reader/BUILD.gn b/src/tint/lang/wgsl/reader/BUILD.gn
index e26cd97..7c450ca 100644
--- a/src/tint/lang/wgsl/reader/BUILD.gn
+++ b/src/tint/lang/wgsl/reader/BUILD.gn
@@ -35,6 +35,7 @@
     "${tint_src_dir}/lang/core",
     "${tint_src_dir}/lang/core/constant",
     "${tint_src_dir}/lang/core/type",
+    "${tint_src_dir}/lang/wgsl",
     "${tint_src_dir}/lang/wgsl/ast",
     "${tint_src_dir}/lang/wgsl/program",
     "${tint_src_dir}/lang/wgsl/reader/parser",
diff --git a/src/tint/lang/wgsl/reader/parser/BUILD.bazel b/src/tint/lang/wgsl/reader/parser/BUILD.bazel
index fdb4446..d1d9b22 100644
--- a/src/tint/lang/wgsl/reader/parser/BUILD.bazel
+++ b/src/tint/lang/wgsl/reader/parser/BUILD.bazel
@@ -43,6 +43,7 @@
     "//src/tint/lang/core",
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/type",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/program",
     "//src/tint/lang/wgsl/resolver",
@@ -142,6 +143,7 @@
     "//src/tint/lang/core",
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/type",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/ast:test",
     "//src/tint/lang/wgsl/program",
diff --git a/src/tint/lang/wgsl/reader/parser/BUILD.cmake b/src/tint/lang/wgsl/reader/parser/BUILD.cmake
index e53c99c..453af11 100644
--- a/src/tint/lang/wgsl/reader/parser/BUILD.cmake
+++ b/src/tint/lang/wgsl/reader/parser/BUILD.cmake
@@ -42,6 +42,7 @@
   tint_lang_core
   tint_lang_core_constant
   tint_lang_core_type
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_program
   tint_lang_wgsl_resolver
@@ -141,6 +142,7 @@
   tint_lang_core
   tint_lang_core_constant
   tint_lang_core_type
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_ast_test
   tint_lang_wgsl_program
diff --git a/src/tint/lang/wgsl/reader/parser/BUILD.gn b/src/tint/lang/wgsl/reader/parser/BUILD.gn
index 36c9f43..f765960 100644
--- a/src/tint/lang/wgsl/reader/parser/BUILD.gn
+++ b/src/tint/lang/wgsl/reader/parser/BUILD.gn
@@ -46,6 +46,7 @@
     "${tint_src_dir}/lang/core",
     "${tint_src_dir}/lang/core/constant",
     "${tint_src_dir}/lang/core/type",
+    "${tint_src_dir}/lang/wgsl",
     "${tint_src_dir}/lang/wgsl/ast",
     "${tint_src_dir}/lang/wgsl/program",
     "${tint_src_dir}/lang/wgsl/resolver",
@@ -144,6 +145,7 @@
       "${tint_src_dir}/lang/core",
       "${tint_src_dir}/lang/core/constant",
       "${tint_src_dir}/lang/core/type",
+      "${tint_src_dir}/lang/wgsl",
       "${tint_src_dir}/lang/wgsl/ast",
       "${tint_src_dir}/lang/wgsl/ast:unittests",
       "${tint_src_dir}/lang/wgsl/program",
diff --git a/src/tint/lang/wgsl/reader/parser/diagnostic_attribute_test.cc b/src/tint/lang/wgsl/reader/parser/diagnostic_attribute_test.cc
index 120f5ac..88b1a20 100644
--- a/src/tint/lang/wgsl/reader/parser/diagnostic_attribute_test.cc
+++ b/src/tint/lang/wgsl/reader/parser/diagnostic_attribute_test.cc
@@ -27,7 +27,7 @@
     EXPECT_TRUE(a.matched);
     auto* d = a.value->As<ast::DiagnosticAttribute>();
     ASSERT_NE(d, nullptr);
-    EXPECT_EQ(d->control.severity, core::DiagnosticSeverity::kOff);
+    EXPECT_EQ(d->control.severity, wgsl::DiagnosticSeverity::kOff);
     auto* r = d->control.rule_name;
     ASSERT_NE(r, nullptr);
     EXPECT_EQ(r->category, nullptr);
@@ -41,7 +41,7 @@
     EXPECT_TRUE(a.matched);
     auto* d = a.value->As<ast::DiagnosticAttribute>();
     ASSERT_NE(d, nullptr);
-    EXPECT_EQ(d->control.severity, core::DiagnosticSeverity::kOff);
+    EXPECT_EQ(d->control.severity, wgsl::DiagnosticSeverity::kOff);
     auto* r = d->control.rule_name;
     ASSERT_NE(r, nullptr);
     ast::CheckIdentifier(r->category, "foo");
diff --git a/src/tint/lang/wgsl/reader/parser/diagnostic_control_test.cc b/src/tint/lang/wgsl/reader/parser/diagnostic_control_test.cc
index f89dfb5..4adeab6 100644
--- a/src/tint/lang/wgsl/reader/parser/diagnostic_control_test.cc
+++ b/src/tint/lang/wgsl/reader/parser/diagnostic_control_test.cc
@@ -20,7 +20,7 @@
 namespace tint::wgsl::reader {
 namespace {
 
-using SeverityPair = std::pair<std::string, core::DiagnosticSeverity>;
+using SeverityPair = std::pair<std::string, wgsl::DiagnosticSeverity>;
 class DiagnosticControlParserTest : public WGSLParserTestWithParam<SeverityPair> {};
 
 TEST_P(DiagnosticControlParserTest, DiagnosticControl_Name) {
@@ -51,18 +51,18 @@
 }
 INSTANTIATE_TEST_SUITE_P(DiagnosticControlParserTest,
                          DiagnosticControlParserTest,
-                         testing::Values(SeverityPair{"error", core::DiagnosticSeverity::kError},
+                         testing::Values(SeverityPair{"error", wgsl::DiagnosticSeverity::kError},
                                          SeverityPair{"warning",
-                                                      core::DiagnosticSeverity::kWarning},
-                                         SeverityPair{"info", core::DiagnosticSeverity::kInfo},
-                                         SeverityPair{"off", core::DiagnosticSeverity::kOff}));
+                                                      wgsl::DiagnosticSeverity::kWarning},
+                                         SeverityPair{"info", wgsl::DiagnosticSeverity::kInfo},
+                                         SeverityPair{"off", wgsl::DiagnosticSeverity::kOff}));
 
 TEST_F(WGSLParserTest, DiagnosticControl_Name_TrailingComma) {
     auto p = parser("(error, foo,)");
     auto e = p->expect_diagnostic_control();
     EXPECT_FALSE(e.errored);
     EXPECT_FALSE(p->has_error()) << p->error();
-    EXPECT_EQ(e->severity, core::DiagnosticSeverity::kError);
+    EXPECT_EQ(e->severity, wgsl::DiagnosticSeverity::kError);
 
     auto* r = e->rule_name;
     ASSERT_NE(r, nullptr);
@@ -75,7 +75,7 @@
     auto e = p->expect_diagnostic_control();
     EXPECT_FALSE(e.errored);
     EXPECT_FALSE(p->has_error()) << p->error();
-    EXPECT_EQ(e->severity, core::DiagnosticSeverity::kError);
+    EXPECT_EQ(e->severity, wgsl::DiagnosticSeverity::kError);
 
     auto* r = e->rule_name;
     ASSERT_NE(r, nullptr);
diff --git a/src/tint/lang/wgsl/reader/parser/diagnostic_directive_test.cc b/src/tint/lang/wgsl/reader/parser/diagnostic_directive_test.cc
index 0e10e4c..6ba4f8d 100644
--- a/src/tint/lang/wgsl/reader/parser/diagnostic_directive_test.cc
+++ b/src/tint/lang/wgsl/reader/parser/diagnostic_directive_test.cc
@@ -27,7 +27,7 @@
     auto& ast = p->builder().AST();
     ASSERT_EQ(ast.DiagnosticDirectives().Length(), 1u);
     auto* directive = ast.DiagnosticDirectives()[0];
-    EXPECT_EQ(directive->control.severity, core::DiagnosticSeverity::kOff);
+    EXPECT_EQ(directive->control.severity, wgsl::DiagnosticSeverity::kOff);
     ASSERT_EQ(ast.GlobalDeclarations().Length(), 1u);
     EXPECT_EQ(ast.GlobalDeclarations()[0], directive);
 
@@ -44,7 +44,7 @@
     auto& ast = p->builder().AST();
     ASSERT_EQ(ast.DiagnosticDirectives().Length(), 1u);
     auto* directive = ast.DiagnosticDirectives()[0];
-    EXPECT_EQ(directive->control.severity, core::DiagnosticSeverity::kOff);
+    EXPECT_EQ(directive->control.severity, wgsl::DiagnosticSeverity::kOff);
     ASSERT_EQ(ast.GlobalDeclarations().Length(), 1u);
     EXPECT_EQ(ast.GlobalDeclarations()[0], directive);
 
diff --git a/src/tint/lang/wgsl/reader/parser/enable_directive_test.cc b/src/tint/lang/wgsl/reader/parser/enable_directive_test.cc
index 9f71c25..4897ab6 100644
--- a/src/tint/lang/wgsl/reader/parser/enable_directive_test.cc
+++ b/src/tint/lang/wgsl/reader/parser/enable_directive_test.cc
@@ -35,7 +35,7 @@
     EXPECT_EQ(enable->source.range.end.line, 1u);
     EXPECT_EQ(enable->source.range.end.column, 12u);
     ASSERT_EQ(enable->extensions.Length(), 1u);
-    EXPECT_EQ(enable->extensions[0]->name, core::Extension::kF16);
+    EXPECT_EQ(enable->extensions[0]->name, wgsl::Extension::kF16);
     EXPECT_EQ(enable->extensions[0]->source.range.begin.line, 1u);
     EXPECT_EQ(enable->extensions[0]->source.range.begin.column, 8u);
     EXPECT_EQ(enable->extensions[0]->source.range.end.line, 1u);
@@ -58,7 +58,7 @@
     EXPECT_EQ(enable->source.range.end.line, 1u);
     EXPECT_EQ(enable->source.range.end.column, 14u);
     ASSERT_EQ(enable->extensions.Length(), 1u);
-    EXPECT_EQ(enable->extensions[0]->name, core::Extension::kF16);
+    EXPECT_EQ(enable->extensions[0]->name, wgsl::Extension::kF16);
     EXPECT_EQ(enable->extensions[0]->source.range.begin.line, 1u);
     EXPECT_EQ(enable->extensions[0]->source.range.begin.column, 8u);
     EXPECT_EQ(enable->extensions[0]->source.range.end.line, 1u);
@@ -78,17 +78,17 @@
     ASSERT_EQ(ast.Enables().Length(), 1u);
     auto* enable = ast.Enables()[0];
     ASSERT_EQ(enable->extensions.Length(), 3u);
-    EXPECT_EQ(enable->extensions[0]->name, core::Extension::kF16);
+    EXPECT_EQ(enable->extensions[0]->name, wgsl::Extension::kF16);
     EXPECT_EQ(enable->extensions[0]->source.range.begin.line, 1u);
     EXPECT_EQ(enable->extensions[0]->source.range.begin.column, 8u);
     EXPECT_EQ(enable->extensions[0]->source.range.end.line, 1u);
     EXPECT_EQ(enable->extensions[0]->source.range.end.column, 11u);
-    EXPECT_EQ(enable->extensions[1]->name, core::Extension::kChromiumDisableUniformityAnalysis);
+    EXPECT_EQ(enable->extensions[1]->name, wgsl::Extension::kChromiumDisableUniformityAnalysis);
     EXPECT_EQ(enable->extensions[1]->source.range.begin.line, 1u);
     EXPECT_EQ(enable->extensions[1]->source.range.begin.column, 13u);
     EXPECT_EQ(enable->extensions[1]->source.range.end.line, 1u);
     EXPECT_EQ(enable->extensions[1]->source.range.end.column, 49u);
-    EXPECT_EQ(enable->extensions[2]->name, core::Extension::kChromiumExperimentalDp4A);
+    EXPECT_EQ(enable->extensions[2]->name, wgsl::Extension::kChromiumExperimentalDp4A);
     EXPECT_EQ(enable->extensions[2]->source.range.begin.line, 1u);
     EXPECT_EQ(enable->extensions[2]->source.range.begin.column, 51u);
     EXPECT_EQ(enable->extensions[2]->source.range.end.line, 1u);
@@ -108,17 +108,17 @@
     ASSERT_EQ(ast.Enables().Length(), 1u);
     auto* enable = ast.Enables()[0];
     ASSERT_EQ(enable->extensions.Length(), 3u);
-    EXPECT_EQ(enable->extensions[0]->name, core::Extension::kF16);
+    EXPECT_EQ(enable->extensions[0]->name, wgsl::Extension::kF16);
     EXPECT_EQ(enable->extensions[0]->source.range.begin.line, 1u);
     EXPECT_EQ(enable->extensions[0]->source.range.begin.column, 8u);
     EXPECT_EQ(enable->extensions[0]->source.range.end.line, 1u);
     EXPECT_EQ(enable->extensions[0]->source.range.end.column, 11u);
-    EXPECT_EQ(enable->extensions[1]->name, core::Extension::kChromiumDisableUniformityAnalysis);
+    EXPECT_EQ(enable->extensions[1]->name, wgsl::Extension::kChromiumDisableUniformityAnalysis);
     EXPECT_EQ(enable->extensions[1]->source.range.begin.line, 1u);
     EXPECT_EQ(enable->extensions[1]->source.range.begin.column, 13u);
     EXPECT_EQ(enable->extensions[1]->source.range.end.line, 1u);
     EXPECT_EQ(enable->extensions[1]->source.range.end.column, 49u);
-    EXPECT_EQ(enable->extensions[2]->name, core::Extension::kChromiumExperimentalDp4A);
+    EXPECT_EQ(enable->extensions[2]->name, wgsl::Extension::kChromiumExperimentalDp4A);
     EXPECT_EQ(enable->extensions[2]->source.range.begin.line, 1u);
     EXPECT_EQ(enable->extensions[2]->source.range.begin.column, 51u);
     EXPECT_EQ(enable->extensions[2]->source.range.end.line, 1u);
@@ -141,13 +141,13 @@
     auto* enable_a = ast.Enables()[0];
     auto* enable_b = ast.Enables()[1];
     ASSERT_EQ(enable_a->extensions.Length(), 1u);
-    EXPECT_EQ(enable_a->extensions[0]->name, core::Extension::kF16);
+    EXPECT_EQ(enable_a->extensions[0]->name, wgsl::Extension::kF16);
     EXPECT_EQ(enable_a->extensions[0]->source.range.begin.line, 2u);
     EXPECT_EQ(enable_a->extensions[0]->source.range.begin.column, 8u);
     EXPECT_EQ(enable_a->extensions[0]->source.range.end.line, 2u);
     EXPECT_EQ(enable_a->extensions[0]->source.range.end.column, 11u);
     ASSERT_EQ(enable_b->extensions.Length(), 1u);
-    EXPECT_EQ(enable_b->extensions[0]->name, core::Extension::kF16);
+    EXPECT_EQ(enable_b->extensions[0]->name, wgsl::Extension::kF16);
     EXPECT_EQ(enable_b->extensions[0]->source.range.begin.line, 3u);
     EXPECT_EQ(enable_b->extensions[0]->source.range.begin.column, 8u);
     EXPECT_EQ(enable_b->extensions[0]->source.range.end.line, 3u);
@@ -272,7 +272,7 @@
     ASSERT_EQ(ast.Enables().Length(), 1u);
     auto* enable = ast.Enables()[0];
     ASSERT_EQ(enable->extensions.Length(), 1u);
-    EXPECT_EQ(enable->extensions[0]->name, core::Extension::kF16);
+    EXPECT_EQ(enable->extensions[0]->name, wgsl::Extension::kF16);
     EXPECT_EQ(enable->extensions[0]->source.range.begin.line, 3u);
     EXPECT_EQ(enable->extensions[0]->source.range.begin.column, 8u);
     EXPECT_EQ(enable->extensions[0]->source.range.end.line, 3u);
@@ -297,7 +297,7 @@
     ASSERT_EQ(ast.Enables().Length(), 1u);
     auto* enable = ast.Enables()[0];
     ASSERT_EQ(enable->extensions.Length(), 1u);
-    EXPECT_EQ(enable->extensions[0]->name, core::Extension::kF16);
+    EXPECT_EQ(enable->extensions[0]->name, wgsl::Extension::kF16);
     EXPECT_EQ(enable->extensions[0]->source.range.begin.line, 3u);
     EXPECT_EQ(enable->extensions[0]->source.range.begin.column, 8u);
     EXPECT_EQ(enable->extensions[0]->source.range.end.line, 3u);
diff --git a/src/tint/lang/wgsl/reader/parser/parser.cc b/src/tint/lang/wgsl/reader/parser/parser.cc
index 3905e3e..49defa2 100644
--- a/src/tint/lang/wgsl/reader/parser/parser.cc
+++ b/src/tint/lang/wgsl/reader/parser/parser.cc
@@ -416,7 +416,7 @@
         Vector<const ast::Extension*, 4> extensions;
         while (continue_parsing()) {
             Source ext_src = peek().source();
-            auto ext = expect_enum("extension", core::ParseExtension, core::kExtensionStrings);
+            auto ext = expect_enum("extension", wgsl::ParseExtension, wgsl::kExtensionStrings);
             if (ext.errored) {
                 return Failure::kErrored;
             }
@@ -3142,9 +3142,9 @@
 //   | 'warning'
 //   | 'info'
 //   | 'off'
-Expect<core::DiagnosticSeverity> Parser::expect_severity_control_name() {
-    return expect_enum("severity control", core::ParseDiagnosticSeverity,
-                       core::kDiagnosticSeverityStrings);
+Expect<wgsl::DiagnosticSeverity> Parser::expect_severity_control_name() {
+    return expect_enum("severity control", wgsl::ParseDiagnosticSeverity,
+                       wgsl::kDiagnosticSeverityStrings);
 }
 
 // diagnostic_control
diff --git a/src/tint/lang/wgsl/reader/parser/parser.h b/src/tint/lang/wgsl/reader/parser/parser.h
index 4c3f2b4..f61d74b 100644
--- a/src/tint/lang/wgsl/reader/parser/parser.h
+++ b/src/tint/lang/wgsl/reader/parser/parser.h
@@ -644,7 +644,7 @@
     Expect<const ast::Attribute*> expect_attribute();
     /// Parses a severity_control_name grammar element.
     /// @return the parsed severity control name.
-    Expect<core::DiagnosticSeverity> expect_severity_control_name();
+    Expect<wgsl::DiagnosticSeverity> expect_severity_control_name();
     /// Parses a diagnostic_control grammar element.
     /// @return the parsed diagnostic control.
     Expect<ast::DiagnosticControl> expect_diagnostic_control();
diff --git a/src/tint/lang/wgsl/reader/program_to_ir/BUILD.bazel b/src/tint/lang/wgsl/reader/program_to_ir/BUILD.bazel
index b78023b..17ea099 100644
--- a/src/tint/lang/wgsl/reader/program_to_ir/BUILD.bazel
+++ b/src/tint/lang/wgsl/reader/program_to_ir/BUILD.bazel
@@ -39,6 +39,7 @@
     "//src/tint/lang/core/intrinsic/data",
     "//src/tint/lang/core/ir",
     "//src/tint/lang/core/type",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/program",
     "//src/tint/lang/wgsl/sem",
@@ -83,6 +84,7 @@
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/ir",
     "//src/tint/lang/core/type",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/helpers:test",
     "//src/tint/lang/wgsl/program",
diff --git a/src/tint/lang/wgsl/reader/program_to_ir/BUILD.cmake b/src/tint/lang/wgsl/reader/program_to_ir/BUILD.cmake
index ee5707d..39a7619 100644
--- a/src/tint/lang/wgsl/reader/program_to_ir/BUILD.cmake
+++ b/src/tint/lang/wgsl/reader/program_to_ir/BUILD.cmake
@@ -38,6 +38,7 @@
   tint_lang_core_intrinsic_data
   tint_lang_core_ir
   tint_lang_core_type
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_program
   tint_lang_wgsl_sem
@@ -82,6 +83,7 @@
   tint_lang_core_constant
   tint_lang_core_ir
   tint_lang_core_type
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_helpers_test
   tint_lang_wgsl_program
diff --git a/src/tint/lang/wgsl/reader/program_to_ir/BUILD.gn b/src/tint/lang/wgsl/reader/program_to_ir/BUILD.gn
index 6b6d958..a2de875 100644
--- a/src/tint/lang/wgsl/reader/program_to_ir/BUILD.gn
+++ b/src/tint/lang/wgsl/reader/program_to_ir/BUILD.gn
@@ -42,6 +42,7 @@
     "${tint_src_dir}/lang/core/intrinsic/data",
     "${tint_src_dir}/lang/core/ir",
     "${tint_src_dir}/lang/core/type",
+    "${tint_src_dir}/lang/wgsl",
     "${tint_src_dir}/lang/wgsl/ast",
     "${tint_src_dir}/lang/wgsl/program",
     "${tint_src_dir}/lang/wgsl/sem",
@@ -85,6 +86,7 @@
       "${tint_src_dir}/lang/core/constant",
       "${tint_src_dir}/lang/core/ir",
       "${tint_src_dir}/lang/core/type",
+      "${tint_src_dir}/lang/wgsl",
       "${tint_src_dir}/lang/wgsl/ast",
       "${tint_src_dir}/lang/wgsl/helpers:unittests",
       "${tint_src_dir}/lang/wgsl/program",
diff --git a/src/tint/lang/wgsl/reader/program_to_ir/literal_test.cc b/src/tint/lang/wgsl/reader/program_to_ir/literal_test.cc
index 688399c..52a5fa2 100644
--- a/src/tint/lang/wgsl/reader/program_to_ir/literal_test.cc
+++ b/src/tint/lang/wgsl/reader/program_to_ir/literal_test.cc
@@ -143,7 +143,7 @@
 }
 
 TEST_F(ProgramToIRLiteralTest, EmitLiteral_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
     auto* expr = Expr(1.2_h);
     GlobalVar("a", ty.f16(), core::AddressSpace::kPrivate, expr);
 
@@ -158,7 +158,7 @@
 }
 
 TEST_F(ProgramToIRLiteralTest, EmitLiteral_F16_Deduped) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
     GlobalVar("a", ty.f16(), core::AddressSpace::kPrivate, Expr(1.2_h));
     GlobalVar("b", ty.f16(), core::AddressSpace::kPrivate, Expr(1.25_h));
     GlobalVar("c", ty.f16(), core::AddressSpace::kPrivate, Expr(1.2_h));
diff --git a/src/tint/lang/wgsl/resolver/BUILD.bazel b/src/tint/lang/wgsl/resolver/BUILD.bazel
index d9cf277..ffcbc6c 100644
--- a/src/tint/lang/wgsl/resolver/BUILD.bazel
+++ b/src/tint/lang/wgsl/resolver/BUILD.bazel
@@ -48,6 +48,7 @@
     "//src/tint/lang/core/intrinsic",
     "//src/tint/lang/core/intrinsic/data",
     "//src/tint/lang/core/type",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/program",
     "//src/tint/lang/wgsl/sem",
@@ -137,6 +138,7 @@
     "//src/tint/lang/core/intrinsic",
     "//src/tint/lang/core/type",
     "//src/tint/lang/core/type:test",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/ast/transform",
     "//src/tint/lang/wgsl/ast:test",
diff --git a/src/tint/lang/wgsl/resolver/BUILD.cmake b/src/tint/lang/wgsl/resolver/BUILD.cmake
index a2e516c..bd4bf3b 100644
--- a/src/tint/lang/wgsl/resolver/BUILD.cmake
+++ b/src/tint/lang/wgsl/resolver/BUILD.cmake
@@ -47,6 +47,7 @@
   tint_lang_core_intrinsic
   tint_lang_core_intrinsic_data
   tint_lang_core_type
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_program
   tint_lang_wgsl_sem
@@ -136,6 +137,7 @@
   tint_lang_core_intrinsic
   tint_lang_core_type
   tint_lang_core_type_test
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_ast_transform
   tint_lang_wgsl_ast_test
diff --git a/src/tint/lang/wgsl/resolver/BUILD.gn b/src/tint/lang/wgsl/resolver/BUILD.gn
index 319ea05..ef3752b 100644
--- a/src/tint/lang/wgsl/resolver/BUILD.gn
+++ b/src/tint/lang/wgsl/resolver/BUILD.gn
@@ -51,6 +51,7 @@
     "${tint_src_dir}/lang/core/intrinsic",
     "${tint_src_dir}/lang/core/intrinsic/data",
     "${tint_src_dir}/lang/core/type",
+    "${tint_src_dir}/lang/wgsl",
     "${tint_src_dir}/lang/wgsl/ast",
     "${tint_src_dir}/lang/wgsl/program",
     "${tint_src_dir}/lang/wgsl/sem",
@@ -139,6 +140,7 @@
       "${tint_src_dir}/lang/core/intrinsic",
       "${tint_src_dir}/lang/core/type",
       "${tint_src_dir}/lang/core/type:unittests",
+      "${tint_src_dir}/lang/wgsl",
       "${tint_src_dir}/lang/wgsl/ast",
       "${tint_src_dir}/lang/wgsl/ast:unittests",
       "${tint_src_dir}/lang/wgsl/ast/transform",
diff --git a/src/tint/lang/wgsl/resolver/address_space_layout_validation_test.cc b/src/tint/lang/wgsl/resolver/address_space_layout_validation_test.cc
index 632683b..43c646a 100644
--- a/src/tint/lang/wgsl/resolver/address_space_layout_validation_test.cc
+++ b/src/tint/lang/wgsl/resolver/address_space_layout_validation_test.cc
@@ -372,7 +372,7 @@
     // @group(0) @binding(0)
     // var<uniform> a : ScalarPackedAtEndOfVec3;
 
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     Structure("ScalarPackedAtEndOfVec3", Vector{
                                              Member("v", ty.vec3(ty.f16())),
@@ -569,7 +569,7 @@
     //     @align(1) b : f32;
     // };
     // var<push_constant> a : S;
-    Enable(core::Extension::kChromiumExperimentalPushConstant);
+    Enable(wgsl::Extension::kChromiumExperimentalPushConstant);
     Structure(Source{{12, 34}}, "S",
               Vector{Member("a", ty.f32(), Vector{MemberSize(5_a)}),
                      Member(Source{{34, 56}}, "b", ty.f32(), Vector{MemberAlign(1_i)})});
@@ -595,7 +595,7 @@
     //     @align(4) b : f32;
     // };
     // var<push_constant> a : S;
-    Enable(core::Extension::kChromiumExperimentalPushConstant);
+    Enable(wgsl::Extension::kChromiumExperimentalPushConstant);
     Structure("S", Vector{Member("a", ty.f32(), Vector{MemberSize(5_a)}),
                           Member("b", ty.f32(), Vector{MemberAlign(4_i)})});
     GlobalVar("a", ty("S"), core::AddressSpace::kPushConstant);
@@ -618,7 +618,7 @@
     // @group(0) @binding(0)
     // var<uniform> a : Outer;
 
-    Enable(core::Extension::kChromiumInternalRelaxedUniformLayout);
+    Enable(wgsl::Extension::kChromiumInternalRelaxedUniformLayout);
 
     Structure(Source{{12, 34}}, "Inner",
               Vector{
@@ -650,7 +650,7 @@
     // @group(0) @binding(0)
     // var<uniform> a : Outer;
 
-    Enable(core::Extension::kChromiumInternalRelaxedUniformLayout);
+    Enable(wgsl::Extension::kChromiumInternalRelaxedUniformLayout);
 
     Alias("Inner", ty.array<f32, 10>(Vector{Stride(16)}));
 
@@ -681,7 +681,7 @@
     // @group(0) @binding(0)
     // var<uniform> a : Outer;
 
-    Enable(core::Extension::kChromiumInternalRelaxedUniformLayout);
+    Enable(wgsl::Extension::kChromiumInternalRelaxedUniformLayout);
 
     Structure(Source{{12, 34}}, "Inner",
               Vector{
@@ -710,7 +710,7 @@
     // @group(0) @binding(0)
     // var<uniform> a : Outer;
 
-    Enable(core::Extension::kChromiumInternalRelaxedUniformLayout);
+    Enable(wgsl::Extension::kChromiumInternalRelaxedUniformLayout);
 
     Structure(Source{{12, 34}}, "Outer",
               Vector{
@@ -734,8 +734,8 @@
     // @group(0) @binding(0)
     // var<uniform> a : Outer;
 
-    Enable(core::Extension::kF16);
-    Enable(core::Extension::kChromiumInternalRelaxedUniformLayout);
+    Enable(wgsl::Extension::kF16);
+    Enable(wgsl::Extension::kChromiumInternalRelaxedUniformLayout);
 
     Structure(Source{{12, 34}}, "Outer",
               Vector{
diff --git a/src/tint/lang/wgsl/resolver/address_space_validation_test.cc b/src/tint/lang/wgsl/resolver/address_space_validation_test.cc
index 917a546..1d4f390 100644
--- a/src/tint/lang/wgsl/resolver/address_space_validation_test.cc
+++ b/src/tint/lang/wgsl/resolver/address_space_validation_test.cc
@@ -245,7 +245,7 @@
 TEST_F(ResolverAddressSpaceValidationTest, GlobalVariable_Storage_F16) {
     // enable f16;
     // var<storage> g : f16;
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     GlobalVar("g", ty.f16(), core::AddressSpace::kStorage, Binding(0_a), Group(0_a));
 
@@ -255,7 +255,7 @@
 TEST_F(ResolverAddressSpaceValidationTest, PointerAlias_Storage_F16) {
     // enable f16;
     // type t = ptr<storage, f16>;
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     Alias("t", ty.ptr<storage, f16>());
 
@@ -266,7 +266,7 @@
     // enable f16;
     // type a = f16;
     // var<storage, read> g : a;
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     Alias("a", ty.f16());
     GlobalVar("g", ty("a"), core::AddressSpace::kStorage, Binding(0_a), Group(0_a));
@@ -278,7 +278,7 @@
     // enable f16;
     // type a = f16;
     // type t = ptr<storage, a>;
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     Alias("a", ty.f16());
     Alias("t", ty.ptr<storage>(ty("a")));
@@ -302,7 +302,7 @@
 
 TEST_F(ResolverAddressSpaceValidationTest, GlobalVariable_Storage_VectorF16) {
     // var<storage> g : vec4<f16>;
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
     GlobalVar("g", ty.vec(ty.f16(), 4u), core::AddressSpace::kStorage, Binding(0_a), Group(0_a));
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -310,7 +310,7 @@
 
 TEST_F(ResolverAddressSpaceValidationTest, PointerAlias_Storage_VectorF16) {
     // type t = ptr<storage, vec4<f16>>;
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
     Alias("t", ty.ptr<storage, vec4<f32>>());
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -339,7 +339,7 @@
     // enable f16;
     // struct S{ a : f16 };
     // var<storage, read> g : array<S, 3u>;
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     Structure("S", Vector{Member("a", ty.f16())});
     GlobalVar("g", ty.array(ty("S"), 3_u), core::AddressSpace::kStorage, core::Access::kRead,
@@ -352,7 +352,7 @@
     // enable f16;
     // struct S{ a : f16 };
     // type t = ptr<storage, array<S, 3u>, read>;
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     Structure("S", Vector{Member("a", ty.f16())});
     Alias("t", ty.ptr<storage, read>(ty.array(ty("S"), 3_u)));
@@ -407,7 +407,7 @@
 TEST_F(ResolverAddressSpaceValidationTest, GlobalVariable_Storage_StructF16) {
     // struct S { x : f16 };
     // var<storage, read> g : S;
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     Structure("S", Vector{Member("x", ty.f16())});
     GlobalVar("g", ty("S"), core::AddressSpace::kStorage, core::Access::kRead, Binding(0_a),
@@ -419,7 +419,7 @@
 TEST_F(ResolverAddressSpaceValidationTest, PointerAlias_Storage_StructF16) {
     // struct S { x : f16 };
     // type t = ptr<storage, S, read>;
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     Structure("S", Vector{Member("x", ty.f16())});
     Alias("t", ty.ptr<storage, read>(ty("S")));
@@ -431,7 +431,7 @@
     // struct S { x : f16 };
     // type a1 = S;
     // var<storage, read> g : a1;
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     Structure("S", Vector{Member("x", ty.f16())});
     Alias("a1", ty("S"));
@@ -446,7 +446,7 @@
     // struct S { x : f16 };
     // type a1 = S;
     // type t = ptr<storage, a1, read>;
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     Structure("S", Vector{Member("x", ty.f16())});
     Alias("a1", ty("S"));
@@ -661,7 +661,7 @@
 TEST_F(ResolverAddressSpaceValidationTest, GlobalVariable_UniformBufferF16) {
     // enable f16;
     // var<uniform> g : f16;
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     GlobalVar("g", ty.f16(), core::AddressSpace::kUniform, Binding(0_a), Group(0_a));
 
@@ -671,7 +671,7 @@
 TEST_F(ResolverAddressSpaceValidationTest, PointerAlias_UniformBufferF16) {
     // enable f16;
     // type t = ptr<uniform, f16>;
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     Alias("t", ty.ptr<uniform, f16>());
 
@@ -695,7 +695,7 @@
 TEST_F(ResolverAddressSpaceValidationTest, GlobalVariable_UniformBufferVectorF16) {
     // enable f16;
     // var<uniform> g : vec4<f16>;
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     GlobalVar("g", ty.vec4<f16>(), core::AddressSpace::kUniform, Binding(0_a), Group(0_a));
 
@@ -705,7 +705,7 @@
 TEST_F(ResolverAddressSpaceValidationTest, PointerAlias_UniformBufferVectorF16) {
     // enable f16;
     // type t = ptr<uniform, vec4<f16>>;
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     Alias("t", ty.ptr<uniform, f16>());
 
@@ -740,7 +740,7 @@
     //   @size(16) f : f16;
     // }
     // var<uniform> g : array<S, 3u>;
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     Structure("S", Vector{Member("a", ty.f16(), Vector{MemberSize(16_a)})});
     GlobalVar("g", ty.array(ty("S"), 3_u), core::AddressSpace::kUniform, Binding(0_a), Group(0_a));
@@ -754,7 +754,7 @@
     //   @size(16) f : f16;
     // }
     // type t = ptr<uniform, array<S, 3u>>;
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     Structure("S", Vector{Member("a", ty.f16(), Vector{MemberSize(16_a)})});
     Alias("t", ty.ptr<uniform>(ty.array(ty("S"), 3_u)));
@@ -806,7 +806,7 @@
     // enable f16;
     // struct S { x : f16 };
     // var<uniform> g : S;
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     Structure("S", Vector{Member("x", ty.f16())});
     GlobalVar("g", ty("S"), core::AddressSpace::kUniform, Binding(0_a), Group(0_a));
@@ -818,7 +818,7 @@
     // enable f16;
     // struct S { x : f16 };
     // type t = ptr<uniform, S>;
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     Structure("S", Vector{Member("x", ty.f16())});
     Alias("t", ty.ptr<uniform>(ty("S")));
@@ -831,7 +831,7 @@
     // struct S { x : f16 };
     // type a1 = S;
     // var<uniform> g : a1;
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     Structure("S", Vector{Member("x", ty.f16())});
     Alias("a1", ty("S"));
@@ -845,7 +845,7 @@
     // struct S { x : f16 };
     // type a1 = S;
     // type t = ptr<uniform, a1>;
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     Structure("S", Vector{Member("x", ty.f16())});
     Alias("a1", ty("S"));
@@ -857,7 +857,7 @@
 TEST_F(ResolverAddressSpaceValidationTest, GlobalVariable_PushConstantBool) {
     // enable chromium_experimental_push_constant;
     // var<push_constant> g : bool;
-    Enable(core::Extension::kChromiumExperimentalPushConstant);
+    Enable(wgsl::Extension::kChromiumExperimentalPushConstant);
     GlobalVar(Source{{56, 78}}, "g", ty.bool_(Source{{12, 34}}), core::AddressSpace::kPushConstant);
 
     ASSERT_FALSE(r()->Resolve());
@@ -870,7 +870,7 @@
 TEST_F(ResolverAddressSpaceValidationTest, PointerAlias_PushConstantBool) {
     // enable chromium_experimental_push_constant;
     // type t = ptr<push_constant, bool>;
-    Enable(core::Extension::kChromiumExperimentalPushConstant);
+    Enable(wgsl::Extension::kChromiumExperimentalPushConstant);
     Alias(Source{{56, 78}}, "t", ty.ptr<push_constant>(ty.bool_(Source{{12, 34}})));
 
     ASSERT_FALSE(r()->Resolve());
@@ -884,8 +884,8 @@
     // enable f16;
     // enable chromium_experimental_push_constant;
     // var<push_constant> g : f16;
-    Enable(core::Extension::kF16);
-    Enable(core::Extension::kChromiumExperimentalPushConstant);
+    Enable(wgsl::Extension::kF16);
+    Enable(wgsl::Extension::kChromiumExperimentalPushConstant);
     GlobalVar("g", ty.f16(Source{{56, 78}}), core::AddressSpace::kPushConstant);
 
     ASSERT_FALSE(r()->Resolve());
@@ -897,8 +897,8 @@
     // enable f16;
     // enable chromium_experimental_push_constant;
     // type t = ptr<push_constant, f16>;
-    Enable(core::Extension::kF16);
-    Enable(core::Extension::kChromiumExperimentalPushConstant);
+    Enable(wgsl::Extension::kF16);
+    Enable(wgsl::Extension::kChromiumExperimentalPushConstant);
     Alias("t", ty.ptr<push_constant>(ty.f16(Source{{56, 78}})));
 
     ASSERT_FALSE(r()->Resolve());
@@ -909,7 +909,7 @@
 TEST_F(ResolverAddressSpaceValidationTest, GlobalVariable_PushConstantPointer) {
     // enable chromium_experimental_push_constant;
     // var<push_constant> g : ptr<private, f32>;
-    Enable(core::Extension::kChromiumExperimentalPushConstant);
+    Enable(wgsl::Extension::kChromiumExperimentalPushConstant);
     GlobalVar(Source{{56, 78}}, "g", ty.ptr<private_, f32>(Source{{12, 34}}),
               core::AddressSpace::kPushConstant);
 
@@ -923,7 +923,7 @@
 TEST_F(ResolverAddressSpaceValidationTest, PointerAlias_PushConstantPointer) {
     // enable chromium_experimental_push_constant;
     // type t = ptr<push_constant, ptr<private, f32>>;
-    Enable(core::Extension::kChromiumExperimentalPushConstant);
+    Enable(wgsl::Extension::kChromiumExperimentalPushConstant);
     Alias(Source{{56, 78}}, "t", ty.ptr<push_constant>(ty.ptr<private_, f32>(Source{{12, 34}})));
 
     ASSERT_FALSE(r()->Resolve());
@@ -936,7 +936,7 @@
 TEST_F(ResolverAddressSpaceValidationTest, GlobalVariable_PushConstantIntScalar) {
     // enable chromium_experimental_push_constant;
     // var<push_constant> g : i32;
-    Enable(core::Extension::kChromiumExperimentalPushConstant);
+    Enable(wgsl::Extension::kChromiumExperimentalPushConstant);
     GlobalVar("g", ty.i32(), core::AddressSpace::kPushConstant);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -945,7 +945,7 @@
 TEST_F(ResolverAddressSpaceValidationTest, PointerAlias_PushConstantIntScalar) {
     // enable chromium_experimental_push_constant;
     // type t = ptr<push_constant, i32>;
-    Enable(core::Extension::kChromiumExperimentalPushConstant);
+    Enable(wgsl::Extension::kChromiumExperimentalPushConstant);
     Alias("t", ty.ptr<push_constant, i32>());
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -954,7 +954,7 @@
 TEST_F(ResolverAddressSpaceValidationTest, GlobalVariable_PushConstantVectorF32) {
     // enable chromium_experimental_push_constant;
     // var<push_constant> g : vec4<f32>;
-    Enable(core::Extension::kChromiumExperimentalPushConstant);
+    Enable(wgsl::Extension::kChromiumExperimentalPushConstant);
     GlobalVar("g", ty.vec4<f32>(), core::AddressSpace::kPushConstant);
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -963,7 +963,7 @@
 TEST_F(ResolverAddressSpaceValidationTest, PointerAlias_PushConstantVectorF32) {
     // enable chromium_experimental_push_constant;
     // var<push_constant> g : vec4<f32>;
-    Enable(core::Extension::kChromiumExperimentalPushConstant);
+    Enable(wgsl::Extension::kChromiumExperimentalPushConstant);
     Alias("t", ty.ptr<push_constant, vec4<f32>>());
 
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -973,7 +973,7 @@
     // enable chromium_experimental_push_constant;
     // struct S { a : f32}
     // var<push_constant> g : array<S, 3u>;
-    Enable(core::Extension::kChromiumExperimentalPushConstant);
+    Enable(wgsl::Extension::kChromiumExperimentalPushConstant);
     Structure("S", Vector{Member("a", ty.f32())});
     GlobalVar("g", ty.array(ty("S"), 3_u), core::AddressSpace::kPushConstant);
 
@@ -984,7 +984,7 @@
     // enable chromium_experimental_push_constant;
     // struct S { a : f32}
     // type t = ptr<push_constant, array<S, 3u>>;
-    Enable(core::Extension::kChromiumExperimentalPushConstant);
+    Enable(wgsl::Extension::kChromiumExperimentalPushConstant);
     Structure("S", Vector{Member("a", ty.f32())});
     Alias("t", ty.ptr<push_constant>(ty.array(ty("S"), 3_u)));
 
diff --git a/src/tint/lang/wgsl/resolver/attribute_validation_test.cc b/src/tint/lang/wgsl/resolver/attribute_validation_test.cc
index 5e1a8db..706d974 100644
--- a/src/tint/lang/wgsl/resolver/attribute_validation_test.cc
+++ b/src/tint/lang/wgsl/resolver/attribute_validation_test.cc
@@ -80,7 +80,7 @@
 struct TestWithParams : ResolverTestWithParam<TestParams> {
     void EnableExtensionIfNecessary(AttributeKind attributeKind) {
         if (attributeKind == AttributeKind::kIndex) {
-            Enable(core::Extension::kChromiumInternalDualSourceBlending);
+            Enable(wgsl::Extension::kChromiumInternalDualSourceBlending);
         }
     }
 };
@@ -96,7 +96,7 @@
         case AttributeKind::kBuiltin:
             return {builder.Builtin(source, core::BuiltinValue::kPosition)};
         case AttributeKind::kDiagnostic:
-            return {builder.DiagnosticAttribute(source, core::DiagnosticSeverity::kInfo, "chromium",
+            return {builder.DiagnosticAttribute(source, wgsl::DiagnosticSeverity::kInfo, "chromium",
                                                 "unreachable_code")};
         case AttributeKind::kGroup:
             return {builder.Group(source, 1_a)};
diff --git a/src/tint/lang/wgsl/resolver/bitcast_validation_test.cc b/src/tint/lang/wgsl/resolver/bitcast_validation_test.cc
index 92756c2..2913165 100644
--- a/src/tint/lang/wgsl/resolver/bitcast_validation_test.cc
+++ b/src/tint/lang/wgsl/resolver/bitcast_validation_test.cc
@@ -108,7 +108,7 @@
     auto dst = std::get<1>(GetParam());
 
     if (src.used_f16 || dst.used_f16) {
-        Enable(core::Extension::kF16);
+        Enable(wgsl::Extension::kF16);
     }
 
     auto* cast = Bitcast(dst.ast(*this), src.expr(*this, 0));
@@ -151,7 +151,7 @@
     auto dst = std::get<1>(GetParam());
 
     if (src.used_f16 || dst.used_f16) {
-        Enable(core::Extension::kF16);
+        Enable(wgsl::Extension::kF16);
     }
 
     auto* cast = Bitcast(dst.ast(*this), Expr(Source{{12, 34}}, "src"));
@@ -196,7 +196,7 @@
     auto dst = std::get<1>(GetParam());
 
     if (src.used_f16 || dst.used_f16) {
-        Enable(core::Extension::kF16);
+        Enable(wgsl::Extension::kF16);
     }
 
     // Use an alias so we can put a Source on the bitcast type
@@ -242,7 +242,7 @@
     auto dst = std::get<1>(GetParam());
 
     if (src.used_f16 || dst.used_f16) {
-        Enable(core::Extension::kF16);
+        Enable(wgsl::Extension::kF16);
     }
 
     WrapInFunction(Bitcast(Source{{12, 34}}, dst.ast(*this), src.expr(*this, 0)));
@@ -379,7 +379,7 @@
 ////////////////////////////////////////////////////////////////////////////////
 using ResolverBitcastValidationTestInvalidConst = tint::resolver::ResolverTest;
 TEST_F(ResolverBitcastValidationTestInvalidConst, ConstBitcastToF16NaN) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     // Lower 16 bits of const u32 0x7e10 is NaN in f16.
     auto* a = Const("a", Expr(u32(0x00007e10)));
@@ -393,7 +393,7 @@
 }
 
 TEST_F(ResolverBitcastValidationTestInvalidConst, ConstBitcastToF16Inf) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     // 0xfc00 is -Inf in f16.
     auto* a = Const("a", Call<vec2<u32>>(u32(0x00007010), u32(0xfc008000)));
@@ -417,7 +417,7 @@
 }
 
 TEST_F(ResolverBitcastValidationTestInvalidConst, ConstBitcastToF32Inf) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     // 0x7f800000 is Inf in f32.
     auto* a = Const("a", Call<vec3<u32>>(u32(0xA0008000), u32(0x7f800000), u32(0x40000000)));
diff --git a/src/tint/lang/wgsl/resolver/builtin_enum_test.cc b/src/tint/lang/wgsl/resolver/builtin_enum_test.cc
index 26749b2..3f73a5d 100644
--- a/src/tint/lang/wgsl/resolver/builtin_enum_test.cc
+++ b/src/tint/lang/wgsl/resolver/builtin_enum_test.cc
@@ -57,7 +57,7 @@
 TEST_P(ResolverAddressSpaceUsedWithTemplateArgs, Test) {
     // fn f(p : ptr<ADDRESS_SPACE<T>, f32) {}
 
-    Enable(core::Extension::kChromiumExperimentalFullPtrParameters);
+    Enable(wgsl::Extension::kChromiumExperimentalFullPtrParameters);
     auto* tmpl = Ident(Source{{12, 34}}, GetParam(), "T");
     Func("f", Vector{Param("p", ty("ptr", tmpl, ty.f32()))}, ty.void_(), tint::Empty);
     EXPECT_FALSE(r()->Resolve());
diff --git a/src/tint/lang/wgsl/resolver/builtin_structs_test.cc b/src/tint/lang/wgsl/resolver/builtin_structs_test.cc
index 0696559..409b238 100644
--- a/src/tint/lang/wgsl/resolver/builtin_structs_test.cc
+++ b/src/tint/lang/wgsl/resolver/builtin_structs_test.cc
@@ -28,7 +28,7 @@
 using ResolverBuiltinStructs = ResolverTestWithParam<core::Builtin>;
 
 TEST_P(ResolverBuiltinStructs, Resolve) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     // var<private> p : NAME;
     auto* var = GlobalVar("p", ty(GetParam()), core::AddressSpace::kPrivate);
diff --git a/src/tint/lang/wgsl/resolver/builtin_test.cc b/src/tint/lang/wgsl/resolver/builtin_test.cc
index 3bb9c95..1ec3b5f 100644
--- a/src/tint/lang/wgsl/resolver/builtin_test.cc
+++ b/src/tint/lang/wgsl/resolver/builtin_test.cc
@@ -492,7 +492,7 @@
 TEST_P(ResolverBuiltinTest_FloatBuiltin_IdenticalType, OneParam_Scalar_f16) {
     auto param = GetParam();
 
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto val = 0.5_h;
     if (param.name == std::string("acosh")) {
@@ -520,7 +520,7 @@
 TEST_P(ResolverBuiltinTest_FloatBuiltin_IdenticalType, OneParam_Vector_f16) {
     auto param = GetParam();
 
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto val = param.name == std::string("acosh") ? Call<vec3<f16>>(1.0_h, 2.0_h, 3.0_h)
                                                   : Call<vec3<f16>>(0.5_h, 0.5_h, 0.8_h);
@@ -549,7 +549,7 @@
 TEST_P(ResolverBuiltinTest_FloatBuiltin_IdenticalType, TwoParams_Scalar_f16) {
     auto param = GetParam();
 
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* call = Call(param.name, 1_h, 1_h);
     WrapInFunction(call);
@@ -572,7 +572,7 @@
 TEST_P(ResolverBuiltinTest_FloatBuiltin_IdenticalType, TwoParams_Vector_f16) {
     auto param = GetParam();
 
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* call = Call(param.name, Call<vec3<f16>>(1_h, 1_h, 3_h), Call<vec3<f16>>(1_h, 1_h, 3_h));
     WrapInFunction(call);
@@ -598,7 +598,7 @@
 TEST_P(ResolverBuiltinTest_FloatBuiltin_IdenticalType, ThreeParams_Scalar_f16) {
     auto param = GetParam();
 
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* call = Call(param.name, 0_h, 1_h, 2_h);
     WrapInFunction(call);
@@ -621,7 +621,7 @@
 TEST_P(ResolverBuiltinTest_FloatBuiltin_IdenticalType, ThreeParams_Vector_f16) {
     auto param = GetParam();
 
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* call = Call(param.name, Call<vec3<f16>>(0_h, 0_h, 0_h), Call<vec3<f16>>(1_h, 1_h, 1_h),
                       Call<vec3<f16>>(2_h, 2_h, 2_h));
@@ -649,7 +649,7 @@
 TEST_P(ResolverBuiltinTest_FloatBuiltin_IdenticalType, FourParams_Scalar_f16) {
     auto param = GetParam();
 
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* call = Call(param.name, 1_h, 1_h, 1_h, 1_h);
     WrapInFunction(call);
@@ -672,7 +672,7 @@
 TEST_P(ResolverBuiltinTest_FloatBuiltin_IdenticalType, FourParams_Vector_f16) {
     auto param = GetParam();
 
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* call = Call(param.name, Call<vec3<f16>>(1_h, 1_h, 3_h), Call<vec3<f16>>(1_h, 1_h, 3_h),
                       Call<vec3<f16>>(1_h, 1_h, 3_h), Call<vec3<f16>>(1_h, 1_h, 3_h));
@@ -766,7 +766,7 @@
 }
 
 TEST_F(ResolverBuiltinFloatTest, Cross_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* call = Call("cross", Call<vec3<f16>>(1_h, 2_h, 3_h), Call<vec3<f16>>(1_h, 2_h, 3_h));
     WrapInFunction(call);
@@ -863,7 +863,7 @@
 }
 
 TEST_F(ResolverBuiltinFloatTest, Distance_Scalar_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* call = Call("distance", 1_h, 1_h);
     WrapInFunction(call);
@@ -885,7 +885,7 @@
 }
 
 TEST_F(ResolverBuiltinFloatTest, Distance_Vector_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* call = Call("distance", Call<vec3<f16>>(1_h, 1_h, 3_h), Call<vec3<f16>>(1_h, 1_h, 3_h));
     WrapInFunction(call);
@@ -971,7 +971,7 @@
 }
 
 TEST_F(ResolverBuiltinFloatTest, FrexpScalar_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* call = Call("frexp", 1_h);
     WrapInFunction(call);
@@ -1035,7 +1035,7 @@
 }
 
 TEST_F(ResolverBuiltinFloatTest, FrexpVector_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* call = Call("frexp", Call<vec3<f16>>());
     WrapInFunction(call);
@@ -1097,7 +1097,7 @@
 }
 
 TEST_F(ResolverBuiltinFloatTest, Length_Scalar_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* call = Call("length", 1_h);
     WrapInFunction(call);
@@ -1119,7 +1119,7 @@
 }
 
 TEST_F(ResolverBuiltinFloatTest, Length_FloatVector_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* call = Call("length", Call<vec3<f16>>(1_h, 1_h, 3_h));
     WrapInFunction(call);
@@ -1174,7 +1174,7 @@
 }
 
 TEST_F(ResolverBuiltinFloatTest, Mix_VectorScalar_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* call = Call("mix", Call<vec3<f16>>(1_h, 1_h, 1_h), Call<vec3<f16>>(1_h, 1_h, 1_h), 4_h);
     WrapInFunction(call);
@@ -1220,7 +1220,7 @@
 }
 
 TEST_F(ResolverBuiltinFloatTest, ModfScalar_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* call = Call("modf", 1_h);
     WrapInFunction(call);
@@ -1284,7 +1284,7 @@
 }
 
 TEST_F(ResolverBuiltinFloatTest, ModfVector_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* call = Call("modf", Call<vec3<f16>>());
     WrapInFunction(call);
@@ -1394,7 +1394,7 @@
 }
 
 TEST_F(ResolverBuiltinFloatTest, Normalize_Vector_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* call = Call("normalize", Call<vec3<f16>>(1_h, 1_h, 3_h));
     WrapInFunction(call);
@@ -1857,7 +1857,7 @@
 }
 
 TEST_F(ResolverBuiltinTest, Determinant_2x2_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     GlobalVar("var", ty.mat2x2<f16>(), core::AddressSpace::kPrivate);
 
@@ -1883,7 +1883,7 @@
 }
 
 TEST_F(ResolverBuiltinTest, Determinant_3x3_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     GlobalVar("var", ty.mat3x3<f16>(), core::AddressSpace::kPrivate);
 
@@ -1909,7 +1909,7 @@
 }
 
 TEST_F(ResolverBuiltinTest, Determinant_4x4_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     GlobalVar("var", ty.mat4x4<f16>(), core::AddressSpace::kPrivate);
 
@@ -1970,7 +1970,7 @@
 }
 
 TEST_F(ResolverBuiltinTest, Dot_Vec2_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     GlobalVar("my_var", ty.vec2<f16>(), core::AddressSpace::kPrivate);
 
diff --git a/src/tint/lang/wgsl/resolver/builtin_validation_test.cc b/src/tint/lang/wgsl/resolver/builtin_validation_test.cc
index ee29c45..86e4f4c 100644
--- a/src/tint/lang/wgsl/resolver/builtin_validation_test.cc
+++ b/src/tint/lang/wgsl/resolver/builtin_validation_test.cc
@@ -537,7 +537,7 @@
 TEST_F(ResolverDP4aExtensionValidationTest, Dot4I8PackedWithExtension) {
     // enable chromium_experimental_dp4a;
     // fn func { return dot4I8Packed(1u, 2u); }
-    Enable(core::Extension::kChromiumExperimentalDp4A);
+    Enable(wgsl::Extension::kChromiumExperimentalDp4A);
 
     Func("func", tint::Empty, ty.i32(),
          Vector{
@@ -565,7 +565,7 @@
 TEST_F(ResolverDP4aExtensionValidationTest, Dot4U8PackedWithExtension) {
     // enable chromium_experimental_dp4a;
     // fn func { return dot4U8Packed(1u, 2u); }
-    Enable(core::Extension::kChromiumExperimentalDp4A);
+    Enable(wgsl::Extension::kChromiumExperimentalDp4A);
 
     Func("func", tint::Empty, ty.u32(),
          Vector{
@@ -670,7 +670,7 @@
 TEST_F(ResolverBuiltinValidationTest, SubgroupBallotWithExtension) {
     // enable chromium_experimental_subgroups;
     // fn func -> vec4<u32> { return subgroupBallot(); }
-    Enable(core::Extension::kChromiumExperimentalSubgroups);
+    Enable(wgsl::Extension::kChromiumExperimentalSubgroups);
 
     Func("func", tint::Empty, ty.vec4<u32>(),
          Vector{
@@ -684,7 +684,7 @@
     // fn func -> i32 { return subgroupBroadcast(1,0); }
     Func("func", tint::Empty, ty.i32(),
          Vector{
-             Return(Call(Source{{12, 34}}, "subgroupBroadcast", 1_i, 0_i)),
+             Return(Call(Source{{12, 34}}, "subgroupBroadcast", 1_i, 0_u)),
          });
 
     EXPECT_FALSE(r()->Resolve());
@@ -696,11 +696,11 @@
 TEST_F(ResolverBuiltinValidationTest, SubgroupBroadcastWithExtension) {
     // enable chromium_experimental_subgroups;
     // fn func -> i32 { return subgroupBroadcast(1,0); }
-    Enable(core::Extension::kChromiumExperimentalSubgroups);
+    Enable(wgsl::Extension::kChromiumExperimentalSubgroups);
 
     Func("func", tint::Empty, ty.i32(),
          Vector{
-             Return(Call("subgroupBroadcast", 1_i, 0_i)),
+             Return(Call("subgroupBroadcast", 1_i, 0_u)),
          });
 
     EXPECT_TRUE(r()->Resolve());
@@ -709,7 +709,7 @@
 TEST_F(ResolverBuiltinValidationTest, SubroupBroadcastInComputeStage) {
     // @vertex fn func { dpdx(1.0); }
 
-    Enable(core::Extension::kChromiumExperimentalSubgroups);
+    Enable(wgsl::Extension::kChromiumExperimentalSubgroups);
 
     auto* call = Call("subgroupBroadcast", 1_f, 0_u);
     Func(Source{{1, 2}}, "func", tint::Empty, ty.void_(), Vector{Ignore(call)},
@@ -724,7 +724,7 @@
 TEST_F(ResolverBuiltinValidationTest, SubroupBroadcastInVertexStageIsError) {
     // @vertex fn func { dpdx(1.0); }
 
-    Enable(core::Extension::kChromiumExperimentalSubgroups);
+    Enable(wgsl::Extension::kChromiumExperimentalSubgroups);
 
     auto* call = Call(Source{{3, 4}}, "subgroupBroadcast", 1_f, 0_u);
     Func("func", tint::Empty, ty.vec4<f32>(), Vector{Ignore(call), Return(Call(ty.vec4<f32>()))},
@@ -740,7 +740,7 @@
 TEST_F(ResolverBuiltinValidationTest, SubroupBroadcastInFragmentStageIsError) {
     // @vertex fn func { dpdx(1.0); }
 
-    Enable(core::Extension::kChromiumExperimentalSubgroups);
+    Enable(wgsl::Extension::kChromiumExperimentalSubgroups);
 
     auto* call = Call(Source{{3, 4}}, "subgroupBroadcast", 1_f, 0_u);
     Func("func",
@@ -754,125 +754,35 @@
     EXPECT_EQ(r()->error(), "3:4 error: built-in cannot be used by fragment pipeline stage");
 }
 
-TEST_F(ResolverBuiltinValidationTest, SubgroupBroadcastTooFewArgs) {
-    // enable chromium_experimental_subgroups;
-    // fn func -> i32 { return subgroupBroadcast(1); }
-    Enable(core::Extension::kChromiumExperimentalSubgroups);
-
-    Func("func", tint::Empty, ty.i32(),
-         Vector{
-             Return(Call(Source{Source::Location{12, 34}}, "subgroupBroadcast", 1_i)),
-         });
-
-    EXPECT_FALSE(r()->Resolve());
-    EXPECT_EQ(r()->error(),
-              R"(12:34 error: no matching call to subgroupBroadcast(i32)
-
-1 candidate function:
-  subgroupBroadcast(value: T, sourceLaneIndex: L) -> T  where: T is f32, i32 or u32, L is i32 or u32
-)");
-}
-
-TEST_F(ResolverBuiltinValidationTest, SubgroupBroadcastTooManyArgs) {
-    // enable chromium_experimental_subgroups;
-    // fn func -> i32 { return subgroupBroadcast(1,1,1); }
-    Enable(core::Extension::kChromiumExperimentalSubgroups);
-
-    Func("func", tint::Empty, ty.i32(),
-         Vector{
-             Return(Call(Source{{12, 34}}, "subgroupBroadcast", 1_i, 1_i, 1_i)),
-         });
-
-    EXPECT_FALSE(r()->Resolve());
-    EXPECT_EQ(r()->error(),
-              R"(12:34 error: no matching call to subgroupBroadcast(i32, i32, i32)
-
-1 candidate function:
-  subgroupBroadcast(value: T, sourceLaneIndex: L) -> T  where: T is f32, i32 or u32, L is i32 or u32
-)");
-}
-
 TEST_F(ResolverBuiltinValidationTest, SubgroupBroadcastValueF32) {
-    Enable(core::Extension::kChromiumExperimentalSubgroups);
+    Enable(wgsl::Extension::kChromiumExperimentalSubgroups);
     Func("func", tint::Empty, ty.f32(),
          Vector{
-             Return(Call("subgroupBroadcast", 1_f, 0_i)),
+             Return(Call("subgroupBroadcast", 1_f, 0_u)),
          });
     EXPECT_TRUE(r()->Resolve());
 }
 
 TEST_F(ResolverBuiltinValidationTest, SubgroupBroadcastValueI32) {
-    Enable(core::Extension::kChromiumExperimentalSubgroups);
+    Enable(wgsl::Extension::kChromiumExperimentalSubgroups);
     Func("func", tint::Empty, ty.i32(),
          Vector{
-             Return(Call("subgroupBroadcast", 1_i, 0_i)),
+             Return(Call("subgroupBroadcast", 1_i, 0_u)),
          });
     EXPECT_TRUE(r()->Resolve());
 }
 
 TEST_F(ResolverBuiltinValidationTest, SubgroupBroadcastValueU32) {
-    Enable(core::Extension::kChromiumExperimentalSubgroups);
+    Enable(wgsl::Extension::kChromiumExperimentalSubgroups);
     Func("func", tint::Empty, ty.u32(),
          Vector{
-             Return(Call("subgroupBroadcast", 1_u, 0_i)),
+             Return(Call("subgroupBroadcast", 1_u, 0_u)),
          });
     EXPECT_TRUE(r()->Resolve());
 }
 
-TEST_F(ResolverBuiltinValidationTest, SubgroupBroadcastValueBoolIsError) {
-    Enable(core::Extension::kChromiumExperimentalSubgroups);
-    const bool value = false;  // could be true too
-    Func("func", tint::Empty, ty.bool_(),
-         Vector{
-             Return(Call(Source{{12, 34}}, "subgroupBroadcast", value, 0_i)),
-         });
-    EXPECT_FALSE(r()->Resolve());
-    EXPECT_EQ(r()->error(),
-              R"(12:34 error: no matching call to subgroupBroadcast(bool, i32)
-
-1 candidate function:
-  subgroupBroadcast(value: T, sourceLaneIndex: L) -> T  where: T is f32, i32 or u32, L is i32 or u32
-)");
-}
-
-TEST_F(ResolverBuiltinValidationTest, SubgroupBroadcastValueF32ResultTypeDifferentIsError) {
-    Enable(core::Extension::kChromiumExperimentalSubgroups);
-    Func("func", tint::Empty, ty.i32(),
-         Vector{
-             Return(Source{{12, 34}}, Call("subgroupBroadcast", 1_f, 0_i)),
-         });
-    EXPECT_FALSE(r()->Resolve());
-    EXPECT_EQ(
-        r()->error(),
-        R"(12:34 error: return statement type must match its function return type, returned 'f32', expected 'i32')");
-}
-
-TEST_F(ResolverBuiltinValidationTest, SubgroupBroadcastValueI32ResultTypeDifferentIsError) {
-    Enable(core::Extension::kChromiumExperimentalSubgroups);
-    Func("func", tint::Empty, ty.u32(),
-         Vector{
-             Return(Source{{12, 34}}, Call("subgroupBroadcast", 1_i, 0_i)),
-         });
-    EXPECT_FALSE(r()->Resolve());
-    EXPECT_EQ(
-        r()->error(),
-        R"(12:34 error: return statement type must match its function return type, returned 'i32', expected 'u32')");
-}
-
-TEST_F(ResolverBuiltinValidationTest, SubgroupBroadcastValueU32ResultTypeDifferentIsError) {
-    Enable(core::Extension::kChromiumExperimentalSubgroups);
-    Func("func", tint::Empty, ty.f32(),
-         Vector{
-             Return(Source{{12, 34}}, Call("subgroupBroadcast", 1_u, 0_i)),
-         });
-    EXPECT_FALSE(r()->Resolve());
-    EXPECT_EQ(
-        r()->error(),
-        R"(12:34 error: return statement type must match its function return type, returned 'u32', expected 'f32')");
-}
-
 TEST_F(ResolverBuiltinValidationTest, SubgroupBroadcastLaneArgMustBeConst) {
-    Enable(core::Extension::kChromiumExperimentalSubgroups);
+    Enable(wgsl::Extension::kChromiumExperimentalSubgroups);
     Func("func", tint::Empty, ty.void_(),
          Vector{
              Decl(Let("lane", Expr(1_u))),
@@ -884,57 +794,6 @@
         R"(12:34 error: the sourceLaneIndex argument of subgroupBroadcast must be a const-expression)");
 }
 
-TEST_F(ResolverBuiltinValidationTest, SubgroupBroadcastLaneArgI32) {
-    Enable(core::Extension::kChromiumExperimentalSubgroups);
-    Func("func", tint::Empty, ty.void_(),
-         Vector{
-             Ignore(Call("subgroupBroadcast", 1_f, 0_i)),
-         });
-    EXPECT_TRUE(r()->Resolve());
-}
-
-TEST_F(ResolverBuiltinValidationTest, SubgroupBroadcastLaneArgU32) {
-    Enable(core::Extension::kChromiumExperimentalSubgroups);
-    Func("func", tint::Empty, ty.void_(),
-         Vector{
-             Ignore(Call("subgroupBroadcast", 1_f, 0_u)),
-         });
-    EXPECT_TRUE(r()->Resolve());
-}
-
-TEST_F(ResolverBuiltinValidationTest, SubgroupBroadcastLaneArgF32IsError) {
-    Enable(core::Extension::kChromiumExperimentalSubgroups);
-    Func("func", tint::Empty, ty.void_(),
-         Vector{
-             Decl(Let("lane", Expr(1_u))),
-             Ignore(Call(Source{{12, 34}}, "subgroupBroadcast", 1_f, 0_f)),
-         });
-    EXPECT_FALSE(r()->Resolve());
-    EXPECT_EQ(r()->error(),
-              R"(12:34 error: no matching call to subgroupBroadcast(f32, f32)
-
-1 candidate function:
-  subgroupBroadcast(value: T, sourceLaneIndex: L) -> T  where: T is f32, i32 or u32, L is i32 or u32
-)");
-}
-
-TEST_F(ResolverBuiltinValidationTest, SubgroupBroadcastLaneArgBoolIsError) {
-    Enable(core::Extension::kChromiumExperimentalSubgroups);
-    const bool value = false;  // could be true too
-    Func("func", tint::Empty, ty.void_(),
-         Vector{
-             Decl(Let("lane", Expr(1_u))),
-             Ignore(Call(Source{{12, 34}}, "subgroupBroadcast", 1_f, value)),
-         });
-    EXPECT_FALSE(r()->Resolve());
-    EXPECT_EQ(r()->error(),
-              R"(12:34 error: no matching call to subgroupBroadcast(f32, bool)
-
-1 candidate function:
-  subgroupBroadcast(value: T, sourceLaneIndex: L) -> T  where: T is f32, i32 or u32, L is i32 or u32
-)");
-}
-
 TEST_F(ResolverBuiltinValidationTest, TextureBarrierWithoutExtension) {
     // fn func { textureBarrier(); }
     Func("func", tint::Empty, ty.void_(),
@@ -951,7 +810,7 @@
 TEST_F(ResolverBuiltinValidationTest, TextureBarrierWithExtension) {
     // enable chromium_experimental_read_write_storage_texture;
     // fn func { textureBarrier(); }
-    Enable(core::Extension::kChromiumExperimentalReadWriteStorageTexture);
+    Enable(wgsl::Extension::kChromiumExperimentalReadWriteStorageTexture);
 
     Func("func", tint::Empty, ty.void_(),
          Vector{
diff --git a/src/tint/lang/wgsl/resolver/call_test.cc b/src/tint/lang/wgsl/resolver/call_test.cc
index 961fe98..669b087 100644
--- a/src/tint/lang/wgsl/resolver/call_test.cc
+++ b/src/tint/lang/wgsl/resolver/call_test.cc
@@ -64,7 +64,7 @@
 };
 
 TEST_F(ResolverCallTest, Valid) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     Vector<const ast::Parameter*, 4> params;
     Vector<const ast::Expression*, 4> args;
diff --git a/src/tint/lang/wgsl/resolver/call_validation_test.cc b/src/tint/lang/wgsl/resolver/call_validation_test.cc
index b26816c..b665d0d 100644
--- a/src/tint/lang/wgsl/resolver/call_validation_test.cc
+++ b/src/tint/lang/wgsl/resolver/call_validation_test.cc
@@ -166,7 +166,7 @@
     //   var v : S;
     //   foo(&v.m);
     // }
-    Enable(core::Extension::kChromiumExperimentalFullPtrParameters);
+    Enable(wgsl::Extension::kChromiumExperimentalFullPtrParameters);
     auto* S = Structure("S", Vector{
                                  Member("m", ty.i32()),
                              });
@@ -346,7 +346,7 @@
     //   let p: ptr<function, i32> = &(v[0]);
     //   x(p);
     // }
-    Enable(core::Extension::kChromiumExperimentalFullPtrParameters);
+    Enable(wgsl::Extension::kChromiumExperimentalFullPtrParameters);
     Func("foo",
          Vector{
              Param("p", ty.ptr<function, i32>()),
@@ -436,7 +436,7 @@
     //   let p3 = &(*p2)[0];
     //   foo(&*p);
     // }
-    Enable(core::Extension::kChromiumExperimentalFullPtrParameters);
+    Enable(wgsl::Extension::kChromiumExperimentalFullPtrParameters);
     Func("foo",
          Vector{
              Param("p", ty.ptr<function, i32>()),
diff --git a/src/tint/lang/wgsl/resolver/dependency_graph_test.cc b/src/tint/lang/wgsl/resolver/dependency_graph_test.cc
index 508ac34..a22669f 100644
--- a/src/tint/lang/wgsl/resolver/dependency_graph_test.cc
+++ b/src/tint/lang/wgsl/resolver/dependency_graph_test.cc
@@ -1106,9 +1106,9 @@
     // a transform may produce such a AST tree that has some declarations before directive nodes.
     // DependencyGraph should deal with these cases.
     auto* var_1 = GlobalVar("SYMBOL1", ty.i32());
-    auto* enable = Enable(core::Extension::kF16);
+    auto* enable = Enable(wgsl::Extension::kF16);
     auto* var_2 = GlobalVar("SYMBOL2", ty.f32());
-    auto* diagnostic = DiagnosticDirective(core::DiagnosticSeverity::kWarning, "foo");
+    auto* diagnostic = DiagnosticDirective(wgsl::DiagnosticSeverity::kWarning, "foo");
 
     EXPECT_THAT(AST().GlobalDeclarations(), ElementsAre(var_1, enable, var_2, diagnostic));
     EXPECT_THAT(Build().ordered_globals, ElementsAre(enable, diagnostic, var_1, var_2));
diff --git a/src/tint/lang/wgsl/resolver/diagnostic_control_test.cc b/src/tint/lang/wgsl/resolver/diagnostic_control_test.cc
index 43bea18..971eb23 100644
--- a/src/tint/lang/wgsl/resolver/diagnostic_control_test.cc
+++ b/src/tint/lang/wgsl/resolver/diagnostic_control_test.cc
@@ -32,7 +32,7 @@
 }
 
 TEST_F(ResolverDiagnosticControlTest, UnreachableCode_ErrorViaDirective) {
-    DiagnosticDirective(core::DiagnosticSeverity::kError, "chromium", "unreachable_code");
+    DiagnosticDirective(wgsl::DiagnosticSeverity::kError, "chromium", "unreachable_code");
 
     auto stmts = Vector{Return(), Return()};
     Func("foo", {}, ty.void_(), stmts);
@@ -42,7 +42,7 @@
 }
 
 TEST_F(ResolverDiagnosticControlTest, UnreachableCode_WarningViaDirective) {
-    DiagnosticDirective(core::DiagnosticSeverity::kWarning, "chromium", "unreachable_code");
+    DiagnosticDirective(wgsl::DiagnosticSeverity::kWarning, "chromium", "unreachable_code");
 
     auto stmts = Vector{Return(), Return()};
     Func("foo", {}, ty.void_(), stmts);
@@ -52,7 +52,7 @@
 }
 
 TEST_F(ResolverDiagnosticControlTest, UnreachableCode_InfoViaDirective) {
-    DiagnosticDirective(core::DiagnosticSeverity::kInfo, "chromium", "unreachable_code");
+    DiagnosticDirective(wgsl::DiagnosticSeverity::kInfo, "chromium", "unreachable_code");
 
     auto stmts = Vector{Return(), Return()};
     Func("foo", {}, ty.void_(), stmts);
@@ -62,7 +62,7 @@
 }
 
 TEST_F(ResolverDiagnosticControlTest, UnreachableCode_OffViaDirective) {
-    DiagnosticDirective(core::DiagnosticSeverity::kOff, "chromium", "unreachable_code");
+    DiagnosticDirective(wgsl::DiagnosticSeverity::kOff, "chromium", "unreachable_code");
 
     auto stmts = Vector{Return(), Return()};
     Func("foo", {}, ty.void_(), stmts);
@@ -73,7 +73,7 @@
 
 TEST_F(ResolverDiagnosticControlTest, UnreachableCode_ErrorViaAttribute) {
     auto* attr =
-        DiagnosticAttribute(core::DiagnosticSeverity::kError, "chromium", "unreachable_code");
+        DiagnosticAttribute(wgsl::DiagnosticSeverity::kError, "chromium", "unreachable_code");
 
     auto stmts = Vector{Return(), Return()};
     Func("foo", {}, ty.void_(), stmts, Vector{attr});
@@ -84,7 +84,7 @@
 
 TEST_F(ResolverDiagnosticControlTest, UnreachableCode_WarningViaAttribute) {
     auto* attr =
-        DiagnosticAttribute(core::DiagnosticSeverity::kWarning, "chromium", "unreachable_code");
+        DiagnosticAttribute(wgsl::DiagnosticSeverity::kWarning, "chromium", "unreachable_code");
 
     auto stmts = Vector{Return(), Return()};
     Func("foo", {}, ty.void_(), stmts, Vector{attr});
@@ -95,7 +95,7 @@
 
 TEST_F(ResolverDiagnosticControlTest, UnreachableCode_InfoViaAttribute) {
     auto* attr =
-        DiagnosticAttribute(core::DiagnosticSeverity::kInfo, "chromium", "unreachable_code");
+        DiagnosticAttribute(wgsl::DiagnosticSeverity::kInfo, "chromium", "unreachable_code");
 
     auto stmts = Vector{Return(), Return()};
     Func("foo", {}, ty.void_(), stmts, Vector{attr});
@@ -106,7 +106,7 @@
 
 TEST_F(ResolverDiagnosticControlTest, UnreachableCode_OffViaAttribute) {
     auto* attr =
-        DiagnosticAttribute(core::DiagnosticSeverity::kOff, "chromium", "unreachable_code");
+        DiagnosticAttribute(wgsl::DiagnosticSeverity::kOff, "chromium", "unreachable_code");
 
     auto stmts = Vector{Return(), Return()};
     Func("foo", {}, ty.void_(), stmts, Vector{attr});
@@ -122,9 +122,9 @@
     //   return;
     //   return; // Should produce a warning
     // }
-    DiagnosticDirective(core::DiagnosticSeverity::kError, "chromium", "unreachable_code");
+    DiagnosticDirective(wgsl::DiagnosticSeverity::kError, "chromium", "unreachable_code");
     auto* attr =
-        DiagnosticAttribute(core::DiagnosticSeverity::kWarning, "chromium", "unreachable_code");
+        DiagnosticAttribute(wgsl::DiagnosticSeverity::kWarning, "chromium", "unreachable_code");
 
     auto stmts = Vector{Return(), Return()};
     Func("foo", {}, ty.void_(), stmts, Vector{attr});
@@ -150,7 +150,7 @@
     // }
     {
         auto* attr =
-            DiagnosticAttribute(core::DiagnosticSeverity::kOff, "chromium", "unreachable_code");
+            DiagnosticAttribute(wgsl::DiagnosticSeverity::kOff, "chromium", "unreachable_code");
         Func("foo", {}, ty.void_(),
              Vector{
                  Return(),
@@ -167,7 +167,7 @@
     }
     {
         auto* attr =
-            DiagnosticAttribute(core::DiagnosticSeverity::kInfo, "chromium", "unreachable_code");
+            DiagnosticAttribute(wgsl::DiagnosticSeverity::kInfo, "chromium", "unreachable_code");
         Func("zoo", {}, ty.void_(),
              Vector{
                  Return(),
@@ -218,22 +218,22 @@
                                     Return(),
                                     Return(Source{{34, 43}}),
                                 },
-                                attr(core::DiagnosticSeverity::kInfo)),
+                                attr(wgsl::DiagnosticSeverity::kInfo)),
                             Else(Block(Vector{
                                 While(Expr(true), Block(
                                                       Vector{
                                                           Return(),
                                                           Return(Source{{56, 65}}),
                                                       },
-                                                      attr(core::DiagnosticSeverity::kOff))),
+                                                      attr(wgsl::DiagnosticSeverity::kOff))),
                                 Return(),
                                 Return(Source{{78, 87}}),
                             }))),
                      },
-                     attr(core::DiagnosticSeverity::kWarning)),
+                     attr(wgsl::DiagnosticSeverity::kWarning)),
              }),
          },
-         attr(core::DiagnosticSeverity::kOff));
+         attr(wgsl::DiagnosticSeverity::kOff));
 
     EXPECT_TRUE(r()->Resolve()) << r()->error();
     EXPECT_EQ(r()->error(), R"(34:43 note: code is unreachable
@@ -241,7 +241,7 @@
 }
 
 TEST_F(ResolverDiagnosticControlTest, UnrecognizedCoreRuleName_Directive) {
-    DiagnosticDirective(core::DiagnosticSeverity::kError,
+    DiagnosticDirective(wgsl::DiagnosticSeverity::kError,
                         DiagnosticRuleName(Source{{12, 34}}, "derivative_uniform"));
     EXPECT_TRUE(r()->Resolve()) << r()->error();
     EXPECT_EQ(r()->error(),
@@ -251,7 +251,7 @@
 }
 
 TEST_F(ResolverDiagnosticControlTest, UnrecognizedCoreRuleName_Attribute) {
-    auto* attr = DiagnosticAttribute(core::DiagnosticSeverity::kError,
+    auto* attr = DiagnosticAttribute(wgsl::DiagnosticSeverity::kError,
                                      DiagnosticRuleName(Source{{12, 34}}, "derivative_uniform"));
     Func("foo", {}, ty.void_(), {}, Vector{attr});
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -262,7 +262,7 @@
 }
 
 TEST_F(ResolverDiagnosticControlTest, UnrecognizedChromiumRuleName_Directive) {
-    DiagnosticDirective(core::DiagnosticSeverity::kError,
+    DiagnosticDirective(wgsl::DiagnosticSeverity::kError,
                         DiagnosticRuleName(Source{{12, 34}}, "chromium", "unreachable_cod"));
     EXPECT_TRUE(r()->Resolve()) << r()->error();
     EXPECT_EQ(r()->error(),
@@ -273,7 +273,7 @@
 
 TEST_F(ResolverDiagnosticControlTest, UnrecognizedChromiumRuleName_Attribute) {
     auto* attr =
-        DiagnosticAttribute(core::DiagnosticSeverity::kError,
+        DiagnosticAttribute(wgsl::DiagnosticSeverity::kError,
                             DiagnosticRuleName(Source{{12, 34}}, "chromium", "unreachable_cod"));
     Func("foo", {}, ty.void_(), {}, Vector{attr});
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -284,7 +284,7 @@
 }
 
 TEST_F(ResolverDiagnosticControlTest, UnrecognizedOtherRuleName_Directive) {
-    DiagnosticDirective(core::DiagnosticSeverity::kError,
+    DiagnosticDirective(wgsl::DiagnosticSeverity::kError,
                         DiagnosticRuleName(Source{{12, 34}}, "unknown", "unreachable_cod"));
     EXPECT_TRUE(r()->Resolve()) << r()->error();
     EXPECT_EQ(r()->error(), "");
@@ -292,7 +292,7 @@
 
 TEST_F(ResolverDiagnosticControlTest, UnrecognizedOtherRuleName_Attribute) {
     auto* attr =
-        DiagnosticAttribute(core::DiagnosticSeverity::kError,
+        DiagnosticAttribute(wgsl::DiagnosticSeverity::kError,
                             DiagnosticRuleName(Source{{12, 34}}, "unknown", "unreachable_cod"));
     Func("foo", {}, ty.void_(), {}, Vector{attr});
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -300,17 +300,17 @@
 }
 
 TEST_F(ResolverDiagnosticControlTest, Conflict_SameNameSameSeverity_Directive) {
-    DiagnosticDirective(core::DiagnosticSeverity::kError,
+    DiagnosticDirective(wgsl::DiagnosticSeverity::kError,
                         DiagnosticRuleName(Source{{12, 34}}, "chromium", "unreachable_code"));
-    DiagnosticDirective(core::DiagnosticSeverity::kError,
+    DiagnosticDirective(wgsl::DiagnosticSeverity::kError,
                         DiagnosticRuleName(Source{{56, 78}}, "chromium", "unreachable_code"));
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 }
 
 TEST_F(ResolverDiagnosticControlTest, Conflict_SameNameDifferentSeverity_Directive) {
-    DiagnosticDirective(core::DiagnosticSeverity::kError,
+    DiagnosticDirective(wgsl::DiagnosticSeverity::kError,
                         DiagnosticRuleName(Source{{12, 34}}, "chromium", "unreachable_code"));
-    DiagnosticDirective(core::DiagnosticSeverity::kOff,
+    DiagnosticDirective(wgsl::DiagnosticSeverity::kOff,
                         DiagnosticRuleName(Source{{56, 78}}, "chromium", "unreachable_code"));
     EXPECT_FALSE(r()->Resolve());
     EXPECT_EQ(r()->error(),
@@ -319,9 +319,9 @@
 }
 
 TEST_F(ResolverDiagnosticControlTest, Conflict_SameUnknownNameDifferentSeverity_Directive) {
-    DiagnosticDirective(core::DiagnosticSeverity::kError,
+    DiagnosticDirective(wgsl::DiagnosticSeverity::kError,
                         DiagnosticRuleName(Source{{12, 34}}, "chromium", "unreachable_codes"));
-    DiagnosticDirective(core::DiagnosticSeverity::kOff,
+    DiagnosticDirective(wgsl::DiagnosticSeverity::kOff,
                         DiagnosticRuleName(Source{{56, 78}}, "chromium", "unreachable_codes"));
     EXPECT_FALSE(r()->Resolve());
     EXPECT_EQ(r()->error(),
@@ -336,17 +336,17 @@
 }
 
 TEST_F(ResolverDiagnosticControlTest, Conflict_DifferentUnknownNameDifferentSeverity_Directive) {
-    DiagnosticDirective(core::DiagnosticSeverity::kError, "chromium", "unreachable_codes");
-    DiagnosticDirective(core::DiagnosticSeverity::kOff, "chromium", "unreachable_codex");
+    DiagnosticDirective(wgsl::DiagnosticSeverity::kError, "chromium", "unreachable_codes");
+    DiagnosticDirective(wgsl::DiagnosticSeverity::kOff, "chromium", "unreachable_codex");
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 }
 
 TEST_F(ResolverDiagnosticControlTest, Conflict_SameNameSameSeverity_Attribute) {
     auto* attr1 =
-        DiagnosticAttribute(core::DiagnosticSeverity::kError,
+        DiagnosticAttribute(wgsl::DiagnosticSeverity::kError,
                             DiagnosticRuleName(Source{{12, 34}}, "chromium", "unreachable_code"));
     auto* attr2 =
-        DiagnosticAttribute(core::DiagnosticSeverity::kError,
+        DiagnosticAttribute(wgsl::DiagnosticSeverity::kError,
                             DiagnosticRuleName(Source{{56, 78}}, "chromium", "unreachable_code"));
     Func("foo", {}, ty.void_(), {}, Vector{attr1, attr2});
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -354,10 +354,10 @@
 
 TEST_F(ResolverDiagnosticControlTest, Conflict_SameNameDifferentSeverity_Attribute) {
     auto* attr1 =
-        DiagnosticAttribute(core::DiagnosticSeverity::kError,
+        DiagnosticAttribute(wgsl::DiagnosticSeverity::kError,
                             DiagnosticRuleName(Source{{12, 34}}, "chromium", "unreachable_code"));
     auto* attr2 =
-        DiagnosticAttribute(core::DiagnosticSeverity::kOff,
+        DiagnosticAttribute(wgsl::DiagnosticSeverity::kOff,
                             DiagnosticRuleName(Source{{56, 78}}, "chromium", "unreachable_code"));
     Func("foo", {}, ty.void_(), {}, Vector{attr1, attr2});
     EXPECT_FALSE(r()->Resolve());
@@ -368,10 +368,10 @@
 
 TEST_F(ResolverDiagnosticControlTest, Conflict_SameUnknownNameDifferentSeverity_Attribute) {
     auto* attr1 =
-        DiagnosticAttribute(core::DiagnosticSeverity::kError,
+        DiagnosticAttribute(wgsl::DiagnosticSeverity::kError,
                             DiagnosticRuleName(Source{{12, 34}}, "chromium", "unreachable_codes"));
     auto* attr2 =
-        DiagnosticAttribute(core::DiagnosticSeverity::kOff,
+        DiagnosticAttribute(wgsl::DiagnosticSeverity::kOff,
                             DiagnosticRuleName(Source{{56, 78}}, "chromium", "unreachable_codes"));
     Func("foo", {}, ty.void_(), {}, Vector{attr1, attr2});
     EXPECT_FALSE(r()->Resolve());
@@ -388,9 +388,9 @@
 
 TEST_F(ResolverDiagnosticControlTest, Conflict_DifferentUnknownNameDifferentSeverity_Attribute) {
     auto* attr1 =
-        DiagnosticAttribute(core::DiagnosticSeverity::kError, "chromium", "unreachable_codes");
+        DiagnosticAttribute(wgsl::DiagnosticSeverity::kError, "chromium", "unreachable_codes");
     auto* attr2 =
-        DiagnosticAttribute(core::DiagnosticSeverity::kOff, "chromium", "unreachable_codex");
+        DiagnosticAttribute(wgsl::DiagnosticSeverity::kOff, "chromium", "unreachable_codex");
     Func("foo", {}, ty.void_(), {}, Vector{attr1, attr2});
     EXPECT_TRUE(r()->Resolve()) << r()->error();
 }
diff --git a/src/tint/lang/wgsl/resolver/dual_source_blending_extension_test.cc b/src/tint/lang/wgsl/resolver/dual_source_blending_extension_test.cc
index bd6bb4b..6fe1a48 100644
--- a/src/tint/lang/wgsl/resolver/dual_source_blending_extension_test.cc
+++ b/src/tint/lang/wgsl/resolver/dual_source_blending_extension_test.cc
@@ -42,7 +42,7 @@
 class DualSourceBlendingExtensionTests : public ResolverTest {
   public:
     DualSourceBlendingExtensionTests() {
-        Enable(core::Extension::kChromiumInternalDualSourceBlending);
+        Enable(wgsl::Extension::kChromiumInternalDualSourceBlending);
     }
 };
 
@@ -148,7 +148,7 @@
 class DualSourceBlendingExtensionTestWithParams : public ResolverTestWithParam<int> {
   public:
     DualSourceBlendingExtensionTestWithParams() {
-        Enable(core::Extension::kChromiumInternalDualSourceBlending);
+        Enable(wgsl::Extension::kChromiumInternalDualSourceBlending);
     }
 };
 
diff --git a/src/tint/lang/wgsl/resolver/entry_point_validation_test.cc b/src/tint/lang/wgsl/resolver/entry_point_validation_test.cc
index 4b09e58..a14d4f4 100644
--- a/src/tint/lang/wgsl/resolver/entry_point_validation_test.cc
+++ b/src/tint/lang/wgsl/resolver/entry_point_validation_test.cc
@@ -435,7 +435,7 @@
 TEST_F(ResolverEntryPointValidationTest, PushConstantAllowedWithEnable) {
     // enable chromium_experimental_push_constant;
     // var<push_constant> a : u32;
-    Enable(core::Extension::kChromiumExperimentalPushConstant);
+    Enable(wgsl::Extension::kChromiumExperimentalPushConstant);
     GlobalVar("a", ty.u32(), core::AddressSpace::kPushConstant);
 
     EXPECT_TRUE(r()->Resolve());
@@ -465,7 +465,7 @@
     // @compute @workgroup_size(1) fn main() {
     //   _ = a;
     // }
-    Enable(core::Extension::kChromiumExperimentalPushConstant);
+    Enable(wgsl::Extension::kChromiumExperimentalPushConstant);
     GlobalVar("a", ty.u32(), core::AddressSpace::kPushConstant);
 
     Func("main", {}, ty.void_(), Vector{Assign(Phony(), "a")},
@@ -482,7 +482,7 @@
     //   _ = a;
     //   _ = b;
     // }
-    Enable(core::Extension::kChromiumExperimentalPushConstant);
+    Enable(wgsl::Extension::kChromiumExperimentalPushConstant);
     GlobalVar(Source{{1, 2}}, "a", ty.u32(), core::AddressSpace::kPushConstant);
     GlobalVar(Source{{3, 4}}, "b", ty.u32(), core::AddressSpace::kPushConstant);
 
@@ -511,7 +511,7 @@
     //   uses_a();
     //   uses_b();
     // }
-    Enable(core::Extension::kChromiumExperimentalPushConstant);
+    Enable(wgsl::Extension::kChromiumExperimentalPushConstant);
     GlobalVar(Source{{1, 2}}, "a", ty.u32(), core::AddressSpace::kPushConstant);
     GlobalVar(Source{{3, 4}}, "b", ty.u32(), core::AddressSpace::kPushConstant);
 
@@ -543,7 +543,7 @@
     // @compute @workgroup_size(1) fn uses_b() {
     //   _ = a;
     // }
-    Enable(core::Extension::kChromiumExperimentalPushConstant);
+    Enable(wgsl::Extension::kChromiumExperimentalPushConstant);
     GlobalVar("a", ty.u32(), core::AddressSpace::kPushConstant);
     GlobalVar("b", ty.u32(), core::AddressSpace::kPushConstant);
 
@@ -598,7 +598,7 @@
     // fn main(@location(0) @interpolate(flat) a : *) {}
     auto params = GetParam();
 
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* a = Param("a", params.create_ast_type(*this),
                     Vector{
@@ -629,7 +629,7 @@
     // fn main(a : Input) {}
     auto params = GetParam();
 
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* input = Structure(
         "Input", Vector{
@@ -659,7 +659,7 @@
     // }
     auto params = GetParam();
 
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     Func(Source{{12, 34}}, "main", tint::Empty, params.create_ast_type(*this),
          Vector{
@@ -689,7 +689,7 @@
     // }
     auto params = GetParam();
 
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* output =
         Structure("Output", Vector{
diff --git a/src/tint/lang/wgsl/resolver/expression_kind_test.cc b/src/tint/lang/wgsl/resolver/expression_kind_test.cc
index a1e98ba..aad7671 100644
--- a/src/tint/lang/wgsl/resolver/expression_kind_test.cc
+++ b/src/tint/lang/wgsl/resolver/expression_kind_test.cc
@@ -291,7 +291,7 @@
             GlobalVar("v", ty("texture_storage_2d", "rgba8unorm", expr), Group(0_u), Binding(0_u));
             break;
         case Use::kAddressSpace:
-            Enable(core::Extension::kChromiumExperimentalFullPtrParameters);
+            Enable(wgsl::Extension::kChromiumExperimentalFullPtrParameters);
             Func(Symbols().New(), Vector{Param("p", ty("ptr", expr, ty.f32()))}, ty.void_(),
                  tint::Empty);
             break;
diff --git a/src/tint/lang/wgsl/resolver/f16_extension_test.cc b/src/tint/lang/wgsl/resolver/f16_extension_test.cc
index d6848aa..3ebf7f7 100644
--- a/src/tint/lang/wgsl/resolver/f16_extension_test.cc
+++ b/src/tint/lang/wgsl/resolver/f16_extension_test.cc
@@ -28,7 +28,7 @@
 TEST_F(ResolverF16ExtensionTest, TypeUsedWithExtension) {
     // enable f16;
     // var<private> v : f16;
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     GlobalVar("v", ty.f16(), core::AddressSpace::kPrivate);
 
@@ -46,7 +46,7 @@
 TEST_F(ResolverF16ExtensionTest, Vec2TypeUsedWithExtension) {
     // enable f16;
     // var<private> v : vec2<f16>;
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     GlobalVar("v", ty.vec2<f16>(), core::AddressSpace::kPrivate);
 
@@ -64,7 +64,7 @@
 TEST_F(ResolverF16ExtensionTest, Vec2TypeInitUsedWithExtension) {
     // enable f16;
     // var<private> v = vec2<f16>();
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     GlobalVar("v", Call<vec2<f16>>(), core::AddressSpace::kPrivate);
 
@@ -82,7 +82,7 @@
 TEST_F(ResolverF16ExtensionTest, Vec2TypeConvUsedWithExtension) {
     // enable f16;
     // var<private> v = vec2<f16>(vec2<f32>());
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     GlobalVar("v", Call<vec2<f16>>(Call<vec2<f32>>()), core::AddressSpace::kPrivate);
 
@@ -101,7 +101,7 @@
 TEST_F(ResolverF16ExtensionTest, F16LiteralUsedWithExtension) {
     // enable f16;
     // var<private> v = 16h;
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     GlobalVar("v", Expr(16_h), core::AddressSpace::kPrivate);
 
@@ -121,7 +121,7 @@
 TEST_P(ResolverF16ExtensionBuiltinTypeAliasTest, Vec2hTypeUsedWithExtension) {
     // enable f16;
     // var<private> v : vec2h;
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     GlobalVar("v", ty(Source{{12, 34}}, GetParam()), core::AddressSpace::kPrivate);
 
diff --git a/src/tint/lang/wgsl/resolver/function_validation_test.cc b/src/tint/lang/wgsl/resolver/function_validation_test.cc
index e1d479a..ac2383d 100644
--- a/src/tint/lang/wgsl/resolver/function_validation_test.cc
+++ b/src/tint/lang/wgsl/resolver/function_validation_test.cc
@@ -1054,7 +1054,7 @@
     Func("f", Vector{arg}, ty.void_(), tint::Empty);
 
     if (param.address_space == core::AddressSpace::kPixelLocal) {
-        Enable(core::Extension::kChromiumExperimentalPixelLocal);
+        Enable(wgsl::Extension::kChromiumExperimentalPixelLocal);
     }
 
     if (param.expectation == Expectation::kAlwaysPass) {
@@ -1080,11 +1080,11 @@
     Structure("S", Vector{Member("a", ty.i32())});
     auto ptr_type = ty("ptr", Ident(Source{{12, 34}}, param.address_space), ty("S"));
     auto* arg = Param(Source{{12, 34}}, "p", ptr_type);
-    Enable(core::Extension::kChromiumExperimentalFullPtrParameters);
+    Enable(wgsl::Extension::kChromiumExperimentalFullPtrParameters);
     Func("f", Vector{arg}, ty.void_(), tint::Empty);
 
     if (param.address_space == core::AddressSpace::kPixelLocal) {
-        Enable(core::Extension::kChromiumExperimentalPixelLocal);
+        Enable(wgsl::Extension::kChromiumExperimentalPixelLocal);
     }
 
     if (param.expectation == Expectation::kAlwaysPass ||
diff --git a/src/tint/lang/wgsl/resolver/host_shareable_validation_test.cc b/src/tint/lang/wgsl/resolver/host_shareable_validation_test.cc
index 473d84a..fcc6543 100644
--- a/src/tint/lang/wgsl/resolver/host_shareable_validation_test.cc
+++ b/src/tint/lang/wgsl/resolver/host_shareable_validation_test.cc
@@ -97,7 +97,7 @@
 }
 
 TEST_F(ResolverHostShareableValidationTest, NoError) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* i1 = Structure("I1", Vector{
                                    Member(Source{{1, 1}}, "w1", ty.f32()),
diff --git a/src/tint/lang/wgsl/resolver/materialize_test.cc b/src/tint/lang/wgsl/resolver/materialize_test.cc
index 1c8655e..a8fed54 100644
--- a/src/tint/lang/wgsl/resolver/materialize_test.cc
+++ b/src/tint/lang/wgsl/resolver/materialize_test.cc
@@ -318,7 +318,7 @@
     MaterializeTest<std::tuple<Expectation, Method, Data>>;
 
 TEST_P(MaterializeAbstractNumericToConcreteType, Test) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     const auto& param = GetParam();
     const auto& expectation = std::get<0>(param);
@@ -1303,7 +1303,7 @@
 TEST_F(MaterializeAbstractStructure, Modf_Scalar_ExplicitType) {
     // var v = modf(1_h); // v is __modf_result_f16
     // v = modf(1);       // __modf_result_f16 <- __modf_result_abstract
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
     auto* call = Call("modf", 1_a);
     WrapInFunction(Decl(Var("v", Call("modf", 1_h))),  //
                    Assign("v", call));
@@ -1322,7 +1322,7 @@
 TEST_F(MaterializeAbstractStructure, Modf_Vector_ExplicitType) {
     // var v = modf(vec2(1_h)); // v is __modf_result_vec2_f16
     // v = modf(vec2(1));       // __modf_result_vec2_f16 <- __modf_result_vec2_abstract
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
     auto* call = Call("modf", Call<vec2<Infer>>(1_a));
     WrapInFunction(Decl(Var("v", Call("modf", Call<vec2<Infer>>(1_h)))), Assign("v", call));
     ASSERT_TRUE(r()->Resolve()) << r()->error();
@@ -1405,7 +1405,7 @@
 TEST_F(MaterializeAbstractStructure, Frexp_Scalar_ExplicitType) {
     // var v = frexp(1_h); // v is __frexp_result_f16
     // v = frexp(1);       // __frexp_result_f16 <- __frexp_result_abstract
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
     auto* call = Call("frexp", 1_a);
     WrapInFunction(Decl(Var("v", Call("frexp", 1_h))),  //
                    Assign("v", call));
@@ -1426,7 +1426,7 @@
 TEST_F(MaterializeAbstractStructure, Frexp_Vector_ExplicitType) {
     // var v = frexp(vec2(1_h)); // v is __frexp_result_vec2_f16
     // v = frexp(vec2(1));       // __frexp_result_vec2_f16 <- __frexp_result_vec2_abstract
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
     auto* call = Call("frexp", Call<vec2<Infer>>(1_a));
     WrapInFunction(Decl(Var("v", Call("frexp", Call<vec2<Infer>>(1_h)))), Assign("v", call));
     ASSERT_TRUE(r()->Resolve()) << r()->error();
diff --git a/src/tint/lang/wgsl/resolver/override_test.cc b/src/tint/lang/wgsl/resolver/override_test.cc
index 1e0a533..f575a4f 100644
--- a/src/tint/lang/wgsl/resolver/override_test.cc
+++ b/src/tint/lang/wgsl/resolver/override_test.cc
@@ -66,7 +66,7 @@
 }
 
 TEST_F(ResolverOverrideTest, WithAndWithoutIds) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* a = Override("a", ty.f32(), Expr(1_f));
     auto* b = Override("b", ty.f16(), Expr(1_h));
diff --git a/src/tint/lang/wgsl/resolver/pixel_local_extension_test.cc b/src/tint/lang/wgsl/resolver/pixel_local_extension_test.cc
index 2c97b5d..2937d70 100644
--- a/src/tint/lang/wgsl/resolver/pixel_local_extension_test.cc
+++ b/src/tint/lang/wgsl/resolver/pixel_local_extension_test.cc
@@ -29,7 +29,7 @@
     // enable chromium_experimental_pixel_local;
     // struct S { a : i32 }
     // var<pixel_local> v : S;
-    Enable(Source{{12, 34}}, core::Extension::kChromiumExperimentalPixelLocal);
+    Enable(Source{{12, 34}}, wgsl::Extension::kChromiumExperimentalPixelLocal);
 
     Structure("S", Vector{Member("a", ty.i32())});
 
@@ -67,7 +67,7 @@
     //   _ = a.i;
     //   _ = b.i;
     // }
-    Enable(core::Extension::kChromiumExperimentalPixelLocal);
+    Enable(wgsl::Extension::kChromiumExperimentalPixelLocal);
     Structure("S", Vector{Member("i", ty.i32())});
     GlobalVar(Source{{1, 2}}, "a", ty("S"), core::AddressSpace::kPixelLocal);
     GlobalVar(Source{{3, 4}}, "b", ty("S"), core::AddressSpace::kPixelLocal);
@@ -99,7 +99,7 @@
     //   uses_a();
     //   uses_b();
     // }
-    Enable(core::Extension::kChromiumExperimentalPixelLocal);
+    Enable(wgsl::Extension::kChromiumExperimentalPixelLocal);
     Structure("S", Vector{Member("i", ty.i32())});
     GlobalVar(Source{{1, 2}}, "a", ty("S"), core::AddressSpace::kPixelLocal);
     GlobalVar(Source{{3, 4}}, "b", ty("S"), core::AddressSpace::kPixelLocal);
@@ -132,7 +132,7 @@
     //   v.i = 42;
     //   return vec4f();
     // }
-    Enable(core::Extension::kChromiumExperimentalPixelLocal);
+    Enable(wgsl::Extension::kChromiumExperimentalPixelLocal);
     Structure("S", Vector{Member("i", ty.i32())});
     GlobalVar(Source{{56, 78}}, "v", ty("S"), core::AddressSpace::kPixelLocal);
     Func("F", Empty, ty.vec4<f32>(),
@@ -157,7 +157,7 @@
     // @compute @workgroup_size(1) fn F() {
     //   v.i = 42;
     // }
-    Enable(core::Extension::kChromiumExperimentalPixelLocal);
+    Enable(wgsl::Extension::kChromiumExperimentalPixelLocal);
     Structure("S", Vector{Member("i", ty.i32())});
     GlobalVar(Source{{56, 78}}, "v", ty("S"), core::AddressSpace::kPixelLocal);
     Func("F", Empty, ty.void_(),
@@ -178,7 +178,7 @@
     // @fragment fn F() {
     //   v.i = 42;
     // }
-    Enable(core::Extension::kChromiumExperimentalPixelLocal);
+    Enable(wgsl::Extension::kChromiumExperimentalPixelLocal);
     Structure("S", Vector{Member("i", ty.i32())});
     GlobalVar(Source{{56, 78}}, "v", ty("S"), core::AddressSpace::kPixelLocal);
     Func("F", Empty, ty.void_(),
@@ -198,7 +198,7 @@
     //   X();
     //   return vec4f();
     // }
-    Enable(core::Extension::kChromiumExperimentalPixelLocal);
+    Enable(wgsl::Extension::kChromiumExperimentalPixelLocal);
     Structure("S", Vector{Member("i", ty.i32())});
     GlobalVar(Source{{3, 4}}, "v", ty("S"), core::AddressSpace::kPixelLocal);
     Func(Source{{5, 6}}, "X", Empty, ty.void_(),
@@ -231,7 +231,7 @@
     // @compute @workgroup_size(1) fn F() {
     //   Y();
     // }
-    Enable(core::Extension::kChromiumExperimentalPixelLocal);
+    Enable(wgsl::Extension::kChromiumExperimentalPixelLocal);
     Structure("S", Vector{Member("i", ty.i32())});
     GlobalVar(Source{{3, 4}}, "v", ty("S"), core::AddressSpace::kPixelLocal);
     Func(Source{{5, 6}}, "X", Empty, ty.void_(),
@@ -259,7 +259,7 @@
     // @fragment fn F() {
     //   Y();
     // }
-    Enable(core::Extension::kChromiumExperimentalPixelLocal);
+    Enable(wgsl::Extension::kChromiumExperimentalPixelLocal);
     Structure("S", Vector{Member("i", ty.i32())});
     GlobalVar(Source{{3, 4}}, "v", ty("S"), core::AddressSpace::kPixelLocal);
     Func(Source{{5, 6}}, "X", Empty, ty.void_(),
@@ -297,7 +297,7 @@
 TEST_P(ResolverPixelLocalExtensionTest_Types, Direct) {
     // var<pixel_local> v : <type>;
 
-    Enable(core::Extension::kChromiumExperimentalPixelLocal);
+    Enable(wgsl::Extension::kChromiumExperimentalPixelLocal);
     GlobalVar(Source{{12, 34}}, "v", GetParam().type(*this), core::AddressSpace::kPixelLocal);
 
     EXPECT_FALSE(r()->Resolve());
@@ -312,7 +312,7 @@
     // }
     // var<pixel_local> v : S;
 
-    Enable(core::Extension::kChromiumExperimentalPixelLocal);
+    Enable(wgsl::Extension::kChromiumExperimentalPixelLocal);
     Structure("S", Vector{
                        Member("a", ty.i32()),
                        Member(Source{{12, 34}}, "m", GetParam().type(*this)),
diff --git a/src/tint/lang/wgsl/resolver/resolver.cc b/src/tint/lang/wgsl/resolver/resolver.cc
index df0c53d..3552a7c 100644
--- a/src/tint/lang/wgsl/resolver/resolver.cc
+++ b/src/tint/lang/wgsl/resolver/resolver.cc
@@ -155,7 +155,7 @@
     builder_->Sem().SetModule(mod);
 
     const bool disable_uniformity_analysis =
-        enabled_extensions_.Contains(core::Extension::kChromiumDisableUniformityAnalysis);
+        enabled_extensions_.Contains(wgsl::Extension::kChromiumDisableUniformityAnalysis);
     if (result && !disable_uniformity_analysis) {
         // Run the uniformity analysis, which requires a complete semantic module.
         if (!AnalyzeUniformity(builder_, dependencies_)) {
@@ -1606,10 +1606,10 @@
     }
     if (TINT_UNLIKELY(
             address_space_expr->Value() == core::AddressSpace::kPixelLocal &&
-            !enabled_extensions_.Contains(core::Extension::kChromiumExperimentalPixelLocal))) {
+            !enabled_extensions_.Contains(wgsl::Extension::kChromiumExperimentalPixelLocal))) {
         StringStream err;
         err << "'pixel_local' address space requires the '"
-            << core::Extension::kChromiumExperimentalPixelLocal << "' extension enabled";
+            << wgsl::Extension::kChromiumExperimentalPixelLocal << "' extension enabled";
         AddError(err.str(), expr->source);
         return nullptr;
     }
@@ -3973,28 +3973,28 @@
     if (control.rule_name->category) {
         Mark(control.rule_name->category);
         if (control.rule_name->category->symbol.Name() == "chromium") {
-            auto rule = core::ParseChromiumDiagnosticRule(name);
-            if (rule != core::ChromiumDiagnosticRule::kUndefined) {
+            auto rule = wgsl::ParseChromiumDiagnosticRule(name);
+            if (rule != wgsl::ChromiumDiagnosticRule::kUndefined) {
                 validator_.DiagnosticFilters().Set(rule, control.severity);
             } else {
                 StringStream ss;
                 ss << "unrecognized diagnostic rule 'chromium." << name << "'\n";
                 tint::SuggestAlternativeOptions opts;
                 opts.prefix = "chromium.";
-                tint::SuggestAlternatives(name, core::kChromiumDiagnosticRuleStrings, ss, opts);
+                tint::SuggestAlternatives(name, wgsl::kChromiumDiagnosticRuleStrings, ss, opts);
                 AddWarning(ss.str(), control.rule_name->source);
             }
         }
         return true;
     }
 
-    auto rule = core::ParseCoreDiagnosticRule(name);
-    if (rule != core::CoreDiagnosticRule::kUndefined) {
+    auto rule = wgsl::ParseCoreDiagnosticRule(name);
+    if (rule != wgsl::CoreDiagnosticRule::kUndefined) {
         validator_.DiagnosticFilters().Set(rule, control.severity);
     } else {
         StringStream ss;
         ss << "unrecognized diagnostic rule '" << name << "'\n";
-        tint::SuggestAlternatives(name, core::kCoreDiagnosticRuleStrings, ss);
+        tint::SuggestAlternatives(name, wgsl::kCoreDiagnosticRuleStrings, ss);
         AddWarning(ss.str(), control.rule_name->source);
     }
     return true;
diff --git a/src/tint/lang/wgsl/resolver/resolver.h b/src/tint/lang/wgsl/resolver/resolver.h
index 506beae..77b5d9e 100644
--- a/src/tint/lang/wgsl/resolver/resolver.h
+++ b/src/tint/lang/wgsl/resolver/resolver.h
@@ -616,7 +616,7 @@
     DependencyGraph dependencies_;
     SemHelper sem_;
     Validator validator_;
-    core::Extensions enabled_extensions_;
+    wgsl::Extensions enabled_extensions_;
     Vector<sem::Function*, 8> entry_points_;
     Hashmap<const core::type::Type*, const Source*, 8> atomic_composite_info_;
     tint::Bitset<0> marked_;
diff --git a/src/tint/lang/wgsl/resolver/side_effects_test.cc b/src/tint/lang/wgsl/resolver/side_effects_test.cc
index cb3602c..ea3a68a 100644
--- a/src/tint/lang/wgsl/resolver/side_effects_test.cc
+++ b/src/tint/lang/wgsl/resolver/side_effects_test.cc
@@ -16,10 +16,10 @@
 
 #include "gtest/gtest.h"
 #include "src/tint/lang/core/address_space.h"
-#include "src/tint/lang/core/extension.h"
 #include "src/tint/lang/core/fluent_types.h"
 #include "src/tint/lang/core/texel_format.h"
 #include "src/tint/lang/core/type/texture_dimension.h"
+#include "src/tint/lang/wgsl/extension.h"
 #include "src/tint/lang/wgsl/resolver/resolver_helper_test.h"
 #include "src/tint/lang/wgsl/sem/index_accessor_expression.h"
 #include "src/tint/lang/wgsl/sem/member_accessor_expression.h"
@@ -167,7 +167,7 @@
 using SideEffectsBuiltinTest = resolver::ResolverTestWithParam<Case>;
 
 TEST_P(SideEffectsBuiltinTest, Test) {
-    Enable(tint::core::Extension::kChromiumExperimentalDp4A);
+    Enable(tint::wgsl::Extension::kChromiumExperimentalDp4A);
     auto& c = GetParam();
 
     uint32_t next_binding = 0;
diff --git a/src/tint/lang/wgsl/resolver/struct_layout_test.cc b/src/tint/lang/wgsl/resolver/struct_layout_test.cc
index 529f673..a7904ab 100644
--- a/src/tint/lang/wgsl/resolver/struct_layout_test.cc
+++ b/src/tint/lang/wgsl/resolver/struct_layout_test.cc
@@ -57,7 +57,7 @@
 }
 
 TEST_F(ResolverStructLayoutTest, ScalarsWithF16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* s = Structure("S", Vector{
                                  Member("a", ty.f32()),
@@ -136,7 +136,7 @@
 }
 
 TEST_F(ResolverStructLayoutTest, ImplicitStrideArrayStaticSize) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* s = Structure("S", Vector{
                                  Member("a", ty.array<i32, 3>()),
@@ -176,7 +176,7 @@
 }
 
 TEST_F(ResolverStructLayoutTest, ExplicitStrideArrayStaticSize) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* s = Structure("S", Vector{
                                  Member("a", ty.array<i32, 3>(Vector{Stride(8)})),
@@ -337,7 +337,7 @@
 }
 
 TEST_F(ResolverStructLayoutTest, Matrix) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* s = Structure("S", Vector{
                                  Member("a_1", ty.mat2x2<f32>()),
diff --git a/src/tint/lang/wgsl/resolver/subgroups_extension_test.cc b/src/tint/lang/wgsl/resolver/subgroups_extension_test.cc
index b3f9c00..2a4ba1b 100644
--- a/src/tint/lang/wgsl/resolver/subgroups_extension_test.cc
+++ b/src/tint/lang/wgsl/resolver/subgroups_extension_test.cc
@@ -54,7 +54,7 @@
 
 // Using an i32 for a subgroup_size builtin input should fail.
 TEST_F(ResolverSubgroupsExtensionTest, SubgroupSizeI32Error) {
-    Enable(core::Extension::kChromiumExperimentalSubgroups);
+    Enable(wgsl::Extension::kChromiumExperimentalSubgroups);
     Structure("Inputs",
               Vector{
                   Member("a", ty.i32(), Vector{Builtin(core::BuiltinValue::kSubgroupSize)}),
@@ -66,7 +66,7 @@
 
 // Using an i32 for a subgroup_invocation_id builtin input should fail.
 TEST_F(ResolverSubgroupsExtensionTest, SubgroupInvocationIdI32Error) {
-    Enable(core::Extension::kChromiumExperimentalSubgroups);
+    Enable(wgsl::Extension::kChromiumExperimentalSubgroups);
     Structure("Inputs",
               Vector{
                   Member("a", ty.i32(), Vector{Builtin(core::BuiltinValue::kSubgroupInvocationId)}),
@@ -78,7 +78,7 @@
 
 // Using builtin(subgroup_size) for anything other than a compute shader input should fail.
 TEST_F(ResolverSubgroupsExtensionTest, SubgroupSizeFragmentShader) {
-    Enable(core::Extension::kChromiumExperimentalSubgroups);
+    Enable(wgsl::Extension::kChromiumExperimentalSubgroups);
     Func("main",
          Vector{Param("size", ty.u32(), Vector{Builtin(core::BuiltinValue::kSubgroupSize)})},
          ty.void_(), Empty, Vector{Stage(ast::PipelineStage::kFragment)});
@@ -90,7 +90,7 @@
 
 // Using builtin(subgroup_invocation_id) for anything other than a compute shader input should fail.
 TEST_F(ResolverSubgroupsExtensionTest, SubgroupInvocationIdFragmentShader) {
-    Enable(core::Extension::kChromiumExperimentalSubgroups);
+    Enable(wgsl::Extension::kChromiumExperimentalSubgroups);
     Func("main",
          Vector{Param("id", ty.u32(), Vector{Builtin(core::BuiltinValue::kSubgroupInvocationId)})},
          ty.void_(), Empty, Vector{Stage(ast::PipelineStage::kFragment)});
diff --git a/src/tint/lang/wgsl/resolver/type_validation_test.cc b/src/tint/lang/wgsl/resolver/type_validation_test.cc
index bdc168c..46284e1 100644
--- a/src/tint/lang/wgsl/resolver/type_validation_test.cc
+++ b/src/tint/lang/wgsl/resolver/type_validation_test.cc
@@ -977,7 +977,7 @@
 using SampledTextureTypeTest = ResolverTestWithParam<TypeParams>;
 TEST_P(SampledTextureTypeTest, All) {
     auto& params = GetParam();
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
     GlobalVar("a",
               ty.sampled_texture(Source{{12, 34}}, core::type::TextureDimension::k2d,
                                  params.type_func(*this)),
@@ -997,7 +997,7 @@
 using MultisampledTextureTypeTest = ResolverTestWithParam<TypeParams>;
 TEST_P(MultisampledTextureTypeTest, All) {
     auto& params = GetParam();
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
     GlobalVar("a",
               ty.multisampled_texture(Source{{12, 34}}, core::type::TextureDimension::k2d,
                                       params.type_func(*this)),
@@ -1175,7 +1175,7 @@
     // @group(0) @binding(0)
     // var a : texture_storage_1d<r32uint, read>;
 
-    Enable(core::Extension::kChromiumExperimentalReadWriteStorageTexture);
+    Enable(wgsl::Extension::kChromiumExperimentalReadWriteStorageTexture);
     auto st = ty.storage_texture(Source{{12, 34}}, core::type::TextureDimension::k1d,
                                  core::TexelFormat::kR32Uint, core::Access::kRead);
 
@@ -1204,7 +1204,7 @@
     // @group(0) @binding(0)
     // var a : texture_storage_1d<r32uint, read_write>;
 
-    Enable(core::Extension::kChromiumExperimentalReadWriteStorageTexture);
+    Enable(wgsl::Extension::kChromiumExperimentalReadWriteStorageTexture);
     auto st = ty.storage_texture(Source{{12, 34}}, core::type::TextureDimension::k1d,
                                  core::TexelFormat::kR32Uint, core::Access::kReadWrite);
 
@@ -1233,7 +1233,7 @@
     // var a : matNxM<EL_TY>;
     auto& params = GetParam();
 
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     ast::Type el_ty = params.elem_ty(*this);
 
@@ -1273,7 +1273,7 @@
     // var a : matNxM<EL_TY>;
     auto& params = GetParam();
 
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     ast::Type el_ty = params.elem_ty(*this);
 
@@ -1318,7 +1318,7 @@
     // var a : vecN<EL_TY>;
     auto& params = GetParam();
 
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     GlobalVar("a", ty.vec(params.elem_ty(*this), params.width), core::AddressSpace::kPrivate);
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -1352,7 +1352,7 @@
     // var a : vecN<EL_TY>;
     auto& params = GetParam();
 
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     GlobalVar("a", ty.vec(Source{{12, 34}}, params.elem_ty(*this), params.width),
               core::AddressSpace::kPrivate);
@@ -1390,7 +1390,7 @@
     // explicit = aliased;
     auto& params = GetParam();
 
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     WrapInFunction(Decl(Var("aliased", ty(params.alias))),
                    Decl(Var("explicit", params.type(*this))),  //
@@ -1402,7 +1402,7 @@
     // var v : vecN<T> = vecTN();
     auto& params = GetParam();
 
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     WrapInFunction(Decl(Var("v", params.type(*this), Call(params.alias))));
     EXPECT_TRUE(r()->Resolve()) << r()->error();
@@ -1450,7 +1450,7 @@
     // enable f16;
     // var<private> v : f32<true>;
 
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
     GlobalVar("v", core::AddressSpace::kPrivate, ty(Source{{12, 34}}, GetParam(), true));
 
     EXPECT_FALSE(r()->Resolve());
@@ -1463,7 +1463,7 @@
     // alias A = f32;
     // var<private> v : A<true>;
 
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
     Alias(Source{{56, 78}}, "A", ty(GetParam()));
     GlobalVar("v", core::AddressSpace::kPrivate, ty(Source{{12, 34}}, "A", true));
 
diff --git a/src/tint/lang/wgsl/resolver/uniformity.cc b/src/tint/lang/wgsl/resolver/uniformity.cc
index 5550687..9b8385b 100644
--- a/src/tint/lang/wgsl/resolver/uniformity.cc
+++ b/src/tint/lang/wgsl/resolver/uniformity.cc
@@ -78,7 +78,7 @@
         CallSiteRequiredToBeUniform,
         CallSiteNoRestriction,
     } tag;
-    core::DiagnosticSeverity severity = core::DiagnosticSeverity::kUndefined;
+    wgsl::DiagnosticSeverity severity = wgsl::DiagnosticSeverity::kUndefined;
 };
 
 /// FunctionTag describes a functions effects on uniformity.
@@ -94,7 +94,7 @@
         ParameterContentsRequiredToBeUniform,
         ParameterNoRestriction,
     } tag;
-    core::DiagnosticSeverity severity = core::DiagnosticSeverity::kUndefined;
+    wgsl::DiagnosticSeverity severity = wgsl::DiagnosticSeverity::kUndefined;
 };
 
 /// Node represents a node in the graph of control flow and value nodes within the analysis of a
@@ -264,13 +264,13 @@
     };
 
     /// @returns the RequiredToBeUniform node that corresponds to `severity`
-    Node* RequiredToBeUniform(core::DiagnosticSeverity severity) {
+    Node* RequiredToBeUniform(wgsl::DiagnosticSeverity severity) {
         switch (severity) {
-            case core::DiagnosticSeverity::kError:
+            case wgsl::DiagnosticSeverity::kError:
                 return required_to_be_uniform_error;
-            case core::DiagnosticSeverity::kWarning:
+            case wgsl::DiagnosticSeverity::kWarning:
                 return required_to_be_uniform_warning;
-            case core::DiagnosticSeverity::kInfo:
+            case wgsl::DiagnosticSeverity::kInfo:
                 return required_to_be_uniform_info;
             default:
                 TINT_UNREACHABLE() << "unhandled severity";
@@ -460,7 +460,7 @@
         // Look at which nodes are reachable from "RequiredToBeUniform".
         {
             UniqueVector<Node*, 4> reachable;
-            auto traverse = [&](core::DiagnosticSeverity severity) {
+            auto traverse = [&](wgsl::DiagnosticSeverity severity) {
                 Traverse(current_function_->RequiredToBeUniform(severity), &reachable);
                 if (reachable.Contains(current_function_->may_be_non_uniform)) {
                     MakeError(*current_function_, current_function_->may_be_non_uniform, severity);
@@ -483,11 +483,11 @@
                 }
                 return true;
             };
-            if (!traverse(core::DiagnosticSeverity::kError)) {
+            if (!traverse(wgsl::DiagnosticSeverity::kError)) {
                 return false;
             } else {
-                if (traverse(core::DiagnosticSeverity::kWarning)) {
-                    traverse(core::DiagnosticSeverity::kInfo);
+                if (traverse(wgsl::DiagnosticSeverity::kWarning)) {
+                    traverse(wgsl::DiagnosticSeverity::kInfo);
                 }
             }
         }
@@ -1537,8 +1537,8 @@
         result->type = Node::kFunctionCallReturnValue;
         Node* cf_after = CreateNode({"CF_after_", name}, call);
 
-        auto default_severity = kUniformityFailuresAsError ? core::DiagnosticSeverity::kError
-                                                           : core::DiagnosticSeverity::kWarning;
+        auto default_severity = kUniformityFailuresAsError ? wgsl::DiagnosticSeverity::kError
+                                                           : wgsl::DiagnosticSeverity::kWarning;
 
         // Get tags for the callee.
         CallSiteTag callsite_tag = {CallSiteTag::CallSiteNoRestriction};
@@ -1560,8 +1560,8 @@
                            builtin->Type() == core::Function::kTextureSampleCompare) {
                     // Get the severity of derivative uniformity violations in this context.
                     auto severity = sem_.DiagnosticSeverity(
-                        call, core::CoreDiagnosticRule::kDerivativeUniformity);
-                    if (severity != core::DiagnosticSeverity::kOff) {
+                        call, wgsl::CoreDiagnosticRule::kDerivativeUniformity);
+                    if (severity != wgsl::DiagnosticSeverity::kOff) {
                         callsite_tag = {CallSiteTag::CallSiteRequiredToBeUniform, severity};
                     }
                     function_tag = ReturnValueMayBeNonUniform;
@@ -1734,7 +1734,7 @@
     /// order to find a call to a builtin function that requires uniformity with the given severity.
     const ast::CallExpression* FindBuiltinThatRequiresUniformity(
         const ast::CallExpression* call,
-        core::DiagnosticSeverity severity) {
+        wgsl::DiagnosticSeverity severity) {
         auto* target = SemCall(call)->Target();
         if (target->Is<sem::Builtin>()) {
             // This is a call to a builtin, so we must be done.
@@ -1893,11 +1893,11 @@
     /// @param function the function that the diagnostic is being produced for
     /// @param source_node the node that has caused a uniformity issue in `function`
     /// @param severity the severity of the diagnostic
-    void MakeError(FunctionInfo& function, Node* source_node, core::DiagnosticSeverity severity) {
+    void MakeError(FunctionInfo& function, Node* source_node, wgsl::DiagnosticSeverity severity) {
         // Helper to produce a diagnostic message, as a note or with the global failure severity.
         auto report = [&](Source source, std::string msg, bool note) {
             diag::Diagnostic error{};
-            error.severity = note ? diag::Severity::Note : core::ToSeverity(severity);
+            error.severity = note ? diag::Severity::Note : wgsl::ToSeverity(severity);
             error.system = diag::System::Resolver;
             error.source = source;
             error.message = msg;
diff --git a/src/tint/lang/wgsl/resolver/uniformity_test.cc b/src/tint/lang/wgsl/resolver/uniformity_test.cc
index e7b7337..36568e9 100644
--- a/src/tint/lang/wgsl/resolver/uniformity_test.cc
+++ b/src/tint/lang/wgsl/resolver/uniformity_test.cc
@@ -8329,16 +8329,16 @@
 
 class UniformityAnalysisDiagnosticFilterTest
     : public UniformityAnalysisTestBase,
-      public ::testing::TestWithParam<core::DiagnosticSeverity> {
+      public ::testing::TestWithParam<wgsl::DiagnosticSeverity> {
   protected:
     // TODO(jrprice): Remove this in favour of tint::ToString() when we change "note" to "info".
-    const char* ToStr(core::DiagnosticSeverity severity) {
+    const char* ToStr(wgsl::DiagnosticSeverity severity) {
         switch (severity) {
-            case core::DiagnosticSeverity::kError:
+            case wgsl::DiagnosticSeverity::kError:
                 return "error";
-            case core::DiagnosticSeverity::kWarning:
+            case wgsl::DiagnosticSeverity::kWarning:
                 return "warning";
-            case core::DiagnosticSeverity::kInfo:
+            case wgsl::DiagnosticSeverity::kInfo:
                 return "note";
             default:
                 return "<undefined>";
@@ -8362,9 +8362,9 @@
 }
 )";
 
-    RunTest(ss.str(), param != core::DiagnosticSeverity::kError);
+    RunTest(ss.str(), param != wgsl::DiagnosticSeverity::kError);
 
-    if (param == core::DiagnosticSeverity::kOff) {
+    if (param == wgsl::DiagnosticSeverity::kOff) {
         EXPECT_TRUE(error_.empty());
     } else {
         StringStream err;
@@ -8390,8 +8390,8 @@
 }
 )";
 
-    RunTest(ss.str(), param != core::DiagnosticSeverity::kError);
-    if (param == core::DiagnosticSeverity::kOff) {
+    RunTest(ss.str(), param != wgsl::DiagnosticSeverity::kError);
+    if (param == wgsl::DiagnosticSeverity::kOff) {
         EXPECT_TRUE(error_.empty());
     } else {
         StringStream err;
@@ -8416,8 +8416,8 @@
 }
 )";
 
-    RunTest(ss.str(), param != core::DiagnosticSeverity::kError);
-    if (param == core::DiagnosticSeverity::kOff) {
+    RunTest(ss.str(), param != wgsl::DiagnosticSeverity::kError);
+    if (param == wgsl::DiagnosticSeverity::kOff) {
         EXPECT_TRUE(error_.empty());
     } else {
         StringStream err;
@@ -8439,8 +8439,8 @@
 }
 )";
 
-    RunTest(ss.str(), param != core::DiagnosticSeverity::kError);
-    if (param == core::DiagnosticSeverity::kOff) {
+    RunTest(ss.str(), param != wgsl::DiagnosticSeverity::kError);
+    if (param == wgsl::DiagnosticSeverity::kOff) {
         EXPECT_TRUE(error_.empty());
     } else {
         StringStream err;
@@ -8462,8 +8462,8 @@
 }
 )";
 
-    RunTest(ss.str(), param != core::DiagnosticSeverity::kError);
-    if (param == core::DiagnosticSeverity::kOff) {
+    RunTest(ss.str(), param != wgsl::DiagnosticSeverity::kError);
+    if (param == wgsl::DiagnosticSeverity::kOff) {
         EXPECT_TRUE(error_.empty());
     } else {
         StringStream err;
@@ -8485,8 +8485,8 @@
 }
 )";
 
-    RunTest(ss.str(), param != core::DiagnosticSeverity::kError);
-    if (param == core::DiagnosticSeverity::kOff) {
+    RunTest(ss.str(), param != wgsl::DiagnosticSeverity::kError);
+    if (param == wgsl::DiagnosticSeverity::kOff) {
         EXPECT_TRUE(error_.empty());
     } else {
         StringStream err;
@@ -8511,8 +8511,8 @@
 }
 )";
 
-    RunTest(ss.str(), param != core::DiagnosticSeverity::kError);
-    if (param == core::DiagnosticSeverity::kOff) {
+    RunTest(ss.str(), param != wgsl::DiagnosticSeverity::kError);
+    if (param == wgsl::DiagnosticSeverity::kOff) {
         EXPECT_TRUE(error_.empty());
     } else {
         StringStream err;
@@ -8534,8 +8534,8 @@
 }
 )";
 
-    RunTest(ss.str(), param != core::DiagnosticSeverity::kError);
-    if (param == core::DiagnosticSeverity::kOff) {
+    RunTest(ss.str(), param != wgsl::DiagnosticSeverity::kError);
+    if (param == wgsl::DiagnosticSeverity::kOff) {
         EXPECT_TRUE(error_.empty());
     } else {
         StringStream err;
@@ -8560,8 +8560,8 @@
 }
 )";
 
-    RunTest(ss.str(), param != core::DiagnosticSeverity::kError);
-    if (param == core::DiagnosticSeverity::kOff) {
+    RunTest(ss.str(), param != wgsl::DiagnosticSeverity::kError);
+    if (param == wgsl::DiagnosticSeverity::kOff) {
         EXPECT_TRUE(error_.empty());
     } else {
         StringStream err;
@@ -8587,8 +8587,8 @@
 }
 )";
 
-    RunTest(ss.str(), param != core::DiagnosticSeverity::kError);
-    if (param == core::DiagnosticSeverity::kOff) {
+    RunTest(ss.str(), param != wgsl::DiagnosticSeverity::kError);
+    if (param == wgsl::DiagnosticSeverity::kOff) {
         EXPECT_TRUE(error_.empty());
     } else {
         StringStream err;
@@ -8614,8 +8614,8 @@
 }
 )";
 
-    RunTest(ss.str(), param != core::DiagnosticSeverity::kError);
-    if (param == core::DiagnosticSeverity::kOff) {
+    RunTest(ss.str(), param != wgsl::DiagnosticSeverity::kError);
+    if (param == wgsl::DiagnosticSeverity::kOff) {
         EXPECT_TRUE(error_.empty());
     } else {
         StringStream err;
@@ -8641,8 +8641,8 @@
 }
 )";
 
-    RunTest(ss.str(), param != core::DiagnosticSeverity::kError);
-    if (param == core::DiagnosticSeverity::kOff) {
+    RunTest(ss.str(), param != wgsl::DiagnosticSeverity::kError);
+    if (param == wgsl::DiagnosticSeverity::kOff) {
         EXPECT_TRUE(error_.empty());
     } else {
         StringStream err;
@@ -8668,8 +8668,8 @@
 }
 )";
 
-    RunTest(ss.str(), param != core::DiagnosticSeverity::kError);
-    if (param == core::DiagnosticSeverity::kOff) {
+    RunTest(ss.str(), param != wgsl::DiagnosticSeverity::kError);
+    if (param == wgsl::DiagnosticSeverity::kOff) {
         EXPECT_TRUE(error_.empty());
     } else {
         StringStream err;
@@ -8695,8 +8695,8 @@
 }
 )";
 
-    RunTest(ss.str(), param != core::DiagnosticSeverity::kError);
-    if (param == core::DiagnosticSeverity::kOff) {
+    RunTest(ss.str(), param != wgsl::DiagnosticSeverity::kError);
+    if (param == wgsl::DiagnosticSeverity::kOff) {
         EXPECT_TRUE(error_.empty());
     } else {
         StringStream err;
@@ -8722,8 +8722,8 @@
 }
 )";
 
-    RunTest(ss.str(), param != core::DiagnosticSeverity::kError);
-    if (param == core::DiagnosticSeverity::kOff) {
+    RunTest(ss.str(), param != wgsl::DiagnosticSeverity::kError);
+    if (param == wgsl::DiagnosticSeverity::kOff) {
         EXPECT_TRUE(error_.empty());
     } else {
         StringStream err;
@@ -8746,8 +8746,8 @@
 }
 )";
 
-    RunTest(ss.str(), param != core::DiagnosticSeverity::kError);
-    if (param == core::DiagnosticSeverity::kOff) {
+    RunTest(ss.str(), param != wgsl::DiagnosticSeverity::kError);
+    if (param == wgsl::DiagnosticSeverity::kOff) {
         EXPECT_TRUE(error_.empty());
     } else {
         StringStream err;
@@ -8774,8 +8774,8 @@
 }
 )";
 
-    RunTest(ss.str(), param != core::DiagnosticSeverity::kError);
-    if (param == core::DiagnosticSeverity::kOff) {
+    RunTest(ss.str(), param != wgsl::DiagnosticSeverity::kError);
+    if (param == wgsl::DiagnosticSeverity::kOff) {
         EXPECT_TRUE(error_.empty());
     } else {
         StringStream err;
@@ -8802,8 +8802,8 @@
 }
 )";
 
-    RunTest(ss.str(), param != core::DiagnosticSeverity::kError);
-    if (param == core::DiagnosticSeverity::kOff) {
+    RunTest(ss.str(), param != wgsl::DiagnosticSeverity::kError);
+    if (param == wgsl::DiagnosticSeverity::kOff) {
         EXPECT_TRUE(error_.empty());
     } else {
         StringStream err;
@@ -8825,8 +8825,8 @@
 }
 )";
 
-    RunTest(ss.str(), param != core::DiagnosticSeverity::kError);
-    if (param == core::DiagnosticSeverity::kOff) {
+    RunTest(ss.str(), param != wgsl::DiagnosticSeverity::kError);
+    if (param == wgsl::DiagnosticSeverity::kOff) {
         EXPECT_TRUE(error_.empty());
     } else {
         StringStream err;
@@ -8851,8 +8851,8 @@
 }
 )";
 
-    RunTest(ss.str(), param != core::DiagnosticSeverity::kError);
-    if (param == core::DiagnosticSeverity::kOff) {
+    RunTest(ss.str(), param != wgsl::DiagnosticSeverity::kError);
+    if (param == wgsl::DiagnosticSeverity::kOff) {
         EXPECT_TRUE(error_.empty());
     } else {
         StringStream err;
@@ -8863,10 +8863,10 @@
 
 INSTANTIATE_TEST_SUITE_P(UniformityAnalysisTest,
                          UniformityAnalysisDiagnosticFilterTest,
-                         ::testing::Values(core::DiagnosticSeverity::kError,
-                                           core::DiagnosticSeverity::kWarning,
-                                           core::DiagnosticSeverity::kInfo,
-                                           core::DiagnosticSeverity::kOff));
+                         ::testing::Values(wgsl::DiagnosticSeverity::kError,
+                                           wgsl::DiagnosticSeverity::kWarning,
+                                           wgsl::DiagnosticSeverity::kInfo,
+                                           wgsl::DiagnosticSeverity::kOff));
 
 TEST_F(UniformityAnalysisDiagnosticFilterTest, AttributeOnFunction_CalledByAnotherFunction) {
     std::string src = R"(
diff --git a/src/tint/lang/wgsl/resolver/validator.cc b/src/tint/lang/wgsl/resolver/validator.cc
index 235c625..c21c6d1 100644
--- a/src/tint/lang/wgsl/resolver/validator.cc
+++ b/src/tint/lang/wgsl/resolver/validator.cc
@@ -151,7 +151,7 @@
 Validator::Validator(
     ProgramBuilder* builder,
     SemHelper& sem,
-    const core::Extensions& enabled_extensions,
+    const wgsl::Extensions& enabled_extensions,
     const Hashmap<const core::type::Type*, const Source*, 8>& atomic_composite_info,
     Hashset<TypeAndAddressSpace, 8>& valid_type_storage_layouts)
     : symbols_(builder->Symbols()),
@@ -161,10 +161,10 @@
       atomic_composite_info_(atomic_composite_info),
       valid_type_storage_layouts_(valid_type_storage_layouts) {
     // Set default severities for filterable diagnostic rules.
-    diagnostic_filters_.Set(core::CoreDiagnosticRule::kDerivativeUniformity,
-                            core::DiagnosticSeverity::kError);
-    diagnostic_filters_.Set(core::ChromiumDiagnosticRule::kUnreachableCode,
-                            core::DiagnosticSeverity::kWarning);
+    diagnostic_filters_.Set(wgsl::CoreDiagnosticRule::kDerivativeUniformity,
+                            wgsl::DiagnosticSeverity::kError);
+    diagnostic_filters_.Set(wgsl::ChromiumDiagnosticRule::kUnreachableCode,
+                            wgsl::DiagnosticSeverity::kWarning);
 }
 
 Validator::~Validator() = default;
@@ -181,18 +181,18 @@
     diagnostics_.add_note(diag::System::Resolver, msg, source);
 }
 
-bool Validator::AddDiagnostic(core::DiagnosticRule rule,
+bool Validator::AddDiagnostic(wgsl::DiagnosticRule rule,
                               const std::string& msg,
                               const Source& source) const {
     auto severity = diagnostic_filters_.Get(rule);
-    if (severity != core::DiagnosticSeverity::kOff) {
+    if (severity != wgsl::DiagnosticSeverity::kOff) {
         diag::Diagnostic d{};
         d.severity = ToSeverity(severity);
         d.system = diag::System::Resolver;
         d.source = source;
         d.message = msg;
         diagnostics_.add(std::move(d));
-        if (severity == core::DiagnosticSeverity::kError) {
+        if (severity == wgsl::DiagnosticSeverity::kError) {
             return false;
         }
     }
@@ -315,7 +315,7 @@
     switch (t->access()) {
         case core::Access::kRead:
             if (!enabled_extensions_.Contains(
-                    core::Extension::kChromiumExperimentalReadWriteStorageTexture)) {
+                    wgsl::Extension::kChromiumExperimentalReadWriteStorageTexture)) {
                 AddError(
                     "read-only storage textures require the "
                     "chromium_experimental_read_write_storage_texture extension to be enabled",
@@ -325,7 +325,7 @@
             break;
         case core::Access::kReadWrite:
             if (!enabled_extensions_.Contains(
-                    core::Extension::kChromiumExperimentalReadWriteStorageTexture)) {
+                    wgsl::Extension::kChromiumExperimentalReadWriteStorageTexture)) {
                 AddError(
                     "read-write storage textures require the "
                     "chromium_experimental_read_write_storage_texture extension to be enabled",
@@ -472,7 +472,7 @@
             // Validate that member is at a valid byte offset
             if (m->Offset() % required_align != 0 &&
                 !enabled_extensions_.Contains(
-                    core::Extension::kChromiumInternalRelaxedUniformLayout)) {
+                    wgsl::Extension::kChromiumInternalRelaxedUniformLayout)) {
                 AddError("the offset of a struct member of type '" +
                              m->Type()->UnwrapRef()->FriendlyName() + "' in address space '" +
                              tint::ToString(address_space) + "' must be a multiple of " +
@@ -500,7 +500,7 @@
                 const uint32_t prev_to_curr_offset = m->Offset() - prev_member->Offset();
                 if (prev_to_curr_offset % 16 != 0 &&
                     !enabled_extensions_.Contains(
-                        core::Extension::kChromiumInternalRelaxedUniformLayout)) {
+                        wgsl::Extension::kChromiumInternalRelaxedUniformLayout)) {
                     AddError(
                         "uniform storage requires that the number of bytes between the start of "
                         "the previous member of type struct and the current member be a multiple "
@@ -533,7 +533,7 @@
         }
 
         if (address_space == core::AddressSpace::kUniform &&
-            !enabled_extensions_.Contains(core::Extension::kChromiumInternalRelaxedUniformLayout)) {
+            !enabled_extensions_.Contains(wgsl::Extension::kChromiumInternalRelaxedUniformLayout)) {
             // We already validated that this array member is itself aligned to 16 bytes above, so
             // we only need to validate that stride is a multiple of 16 bytes.
             if (arr->Stride() % 16 != 0) {
@@ -803,7 +803,7 @@
                 case core::AddressSpace::kUniform:
                 case core::AddressSpace::kWorkgroup:
                     ok = enabled_extensions_.Contains(
-                        core::Extension::kChromiumExperimentalFullPtrParameters);
+                        wgsl::Extension::kChromiumExperimentalFullPtrParameters);
                     break;
                 default:
                     break;
@@ -947,7 +947,7 @@
             break;
         case core::BuiltinValue::kSubgroupInvocationId:
         case core::BuiltinValue::kSubgroupSize:
-            if (!enabled_extensions_.Contains(core::Extension::kChromiumExperimentalSubgroups)) {
+            if (!enabled_extensions_.Contains(wgsl::Extension::kChromiumExperimentalSubgroups)) {
                 StringStream err;
                 err << "use of @builtin(" << builtin
                     << ") attribute requires enabling extension 'chromium_experimental_subgroups'";
@@ -1434,7 +1434,7 @@
 bool Validator::Statements(VectorRef<const ast::Statement*> stmts) const {
     for (auto* stmt : stmts) {
         if (!sem_.Get(stmt)->IsReachable()) {
-            if (!AddDiagnostic(core::ChromiumDiagnosticRule::kUnreachableCode,
+            if (!AddDiagnostic(wgsl::ChromiumDiagnosticRule::kUnreachableCode,
                                "code is unreachable", stmt->source)) {
                 return false;
             }
@@ -1740,7 +1740,7 @@
     }
 
     const auto extension = builtin->RequiredExtension();
-    if (extension == core::Extension::kUndefined) {
+    if (extension == wgsl::Extension::kUndefined) {
         return true;
     }
 
@@ -1756,7 +1756,7 @@
 
 bool Validator::CheckF16Enabled(const Source& source) const {
     // Validate if f16 type is allowed.
-    if (!enabled_extensions_.Contains(core::Extension::kF16)) {
+    if (!enabled_extensions_.Contains(wgsl::Extension::kF16)) {
         AddError("f16 type used without 'f16' extension enabled", source);
         return false;
     }
@@ -1807,7 +1807,7 @@
 
         if (param_type->Is<core::type::Pointer>() &&
             !enabled_extensions_.Contains(
-                core::Extension::kChromiumExperimentalFullPtrParameters)) {
+                wgsl::Extension::kChromiumExperimentalFullPtrParameters)) {
             // https://gpuweb.github.io/gpuweb/wgsl/#function-restriction
             // Each argument of pointer type to a user-defined function must have the same memory
             // view as its root identifier.
@@ -2294,7 +2294,7 @@
 
 bool Validator::IndexAttribute(const ast::IndexAttribute* index_attr,
                                ast::PipelineStage stage) const {
-    if (!enabled_extensions_.Contains(core::Extension::kChromiumInternalDualSourceBlending)) {
+    if (!enabled_extensions_.Contains(wgsl::Extension::kChromiumInternalDualSourceBlending)) {
         AddError(
             "use of '@index' attribute requires enabling extension "
             "'chromium_internal_dual_source_blending'",
@@ -2658,7 +2658,7 @@
             break;
         case core::AddressSpace::kPushConstant:
             if (TINT_UNLIKELY(!enabled_extensions_.Contains(
-                                  core::Extension::kChromiumExperimentalPushConstant) &&
+                                  wgsl::Extension::kChromiumExperimentalPushConstant) &&
                               IsValidationEnabled(attributes,
                                                   ast::DisabledValidation::kIgnoreAddressSpace))) {
                 AddError(
diff --git a/src/tint/lang/wgsl/resolver/validator.h b/src/tint/lang/wgsl/resolver/validator.h
index a4035a3..8e80916 100644
--- a/src/tint/lang/wgsl/resolver/validator.h
+++ b/src/tint/lang/wgsl/resolver/validator.h
@@ -85,7 +85,7 @@
 };
 
 /// DiagnosticFilterStack is a scoped stack of diagnostic filters.
-using DiagnosticFilterStack = ScopeStack<core::DiagnosticRule, core::DiagnosticSeverity>;
+using DiagnosticFilterStack = ScopeStack<wgsl::DiagnosticRule, wgsl::DiagnosticSeverity>;
 
 /// Validation logic for various ast nodes. The validations in general should
 /// be shallow and depend on the resolver to call on children. The validations
@@ -101,7 +101,7 @@
     /// @param valid_type_storage_layouts a set of validated type layouts by address space
     Validator(ProgramBuilder* builder,
               SemHelper& helper,
-              const core::Extensions& enabled_extensions,
+              const wgsl::Extensions& enabled_extensions,
               const Hashmap<const core::type::Type*, const Source*, 8>& atomic_composite_info,
               Hashset<TypeAndAddressSpace, 8>& valid_type_storage_layouts);
     ~Validator();
@@ -126,7 +126,7 @@
     /// @param msg the diagnostic message
     /// @param source the diagnostic source
     /// @returns false if the diagnostic is an error for the given trigger rule
-    bool AddDiagnostic(core::DiagnosticRule rule,
+    bool AddDiagnostic(wgsl::DiagnosticRule rule,
                        const std::string& msg,
                        const Source& source) const;
 
@@ -566,7 +566,7 @@
     diag::List& diagnostics_;
     SemHelper& sem_;
     DiagnosticFilterStack diagnostic_filters_;
-    const core::Extensions& enabled_extensions_;
+    const wgsl::Extensions& enabled_extensions_;
     const Hashmap<const core::type::Type*, const Source*, 8>& atomic_composite_info_;
     Hashset<TypeAndAddressSpace, 8>& valid_type_storage_layouts_;
 };
diff --git a/src/tint/lang/wgsl/resolver/value_constructor_validation_test.cc b/src/tint/lang/wgsl/resolver/value_constructor_validation_test.cc
index 63fe3b1..0dcd3a1 100644
--- a/src/tint/lang/wgsl/resolver/value_constructor_validation_test.cc
+++ b/src/tint/lang/wgsl/resolver/value_constructor_validation_test.cc
@@ -79,7 +79,7 @@
     // }
     auto& params = GetParam();
 
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* initializer_expr = params.create_rhs_ast_value(*this, 0);
 
@@ -180,7 +180,7 @@
     // }
     auto& params = GetParam();
 
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     Func("foo", tint::Empty, params.create_rhs_ast_type(*this),
          Vector{Return(Call(params.create_rhs_ast_type(*this)))}, {});
@@ -337,7 +337,7 @@
 TEST_P(ConversionConstructorValidTest, All) {
     auto& params = GetParam();
 
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     // var a : <lhs_type1> = <lhs_type2>(<rhs_type>(<rhs_value_expr>));
     auto lhs_type1 = params.lhs_type(*this);
@@ -443,7 +443,7 @@
        << FriendlyName(rhs_type) << "(<rhs value expr>))";
     SCOPED_TRACE(ss.str());
 
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* a = Var("a", lhs_type1, Call(lhs_type2, Call(rhs_type, rhs_value_expr)));
 
@@ -944,7 +944,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, F16_Success) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* expr = Call<f16>(Expr(1.5_h));
     WrapInFunction(expr);
@@ -1000,7 +1000,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Convert_u32_to_f16_Success) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* expr = Call<f16>(123_u);
     WrapInFunction(expr);
@@ -1020,7 +1020,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Convert_f16_to_f32_Success) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* expr = Call<f32>(123_h);
     WrapInFunction(expr);
@@ -1052,7 +1052,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec2F16_Error_ScalarArgumentTypeMismatch) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     WrapInFunction(Call<vec2<f16>>(Source{{12, 34}}, 1_h, 2_f));
 
@@ -1175,7 +1175,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec2F16_Success_Scalar) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* tc = Call<vec2<f16>>(1_h, 1_h);
     WrapInFunction(tc);
@@ -1309,7 +1309,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec3F16_Error_ScalarArgumentTypeMismatch) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     WrapInFunction(Call<vec3<f16>>(Source{{12, 34}}, 1_h, 2_h, 3_f));
 
@@ -1451,7 +1451,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec3F16_Success_Scalar) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* tc = Call<vec3<f16>>(1_h, 1_h, 1_h);
     WrapInFunction(tc);
@@ -1632,7 +1632,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec4F16_Error_ScalarArgumentTypeMismatch) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     WrapInFunction(Call<vec4<f16>>(Source{{12, 34}}, 1_h, 1_h, 1_f, 1_h));
 
@@ -1800,7 +1800,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, Vec4F16_Success_Scalar) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* tc = Call<vec4<f16>>(1_h, 1_h, 1_h, 1_h);
     WrapInFunction(tc);
@@ -2036,7 +2036,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, InferVec2ElementTypeFromScalars) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* vec2_bool = Call<vec2<Infer>>(true, false);
     auto* vec2_i32 = Call<vec2<Infer>>(1_i, 2_i);
@@ -2065,7 +2065,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, InferVec2ElementTypeFromVec2) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* vec2_bool = Call<vec2<Infer>>(Call<vec2<bool>>(true, false));
     auto* vec2_i32 = Call<vec2<Infer>>(Call<vec2<i32>>(1_i, 2_i));
@@ -2094,7 +2094,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, InferVec3ElementTypeFromScalars) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* vec3_bool = Call<vec3<Infer>>(true, false, true);
     auto* vec3_i32 = Call<vec3<Infer>>(1_i, 2_i, 3_i);
@@ -2123,7 +2123,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, InferVec3ElementTypeFromVec3) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* vec3_bool = Call<vec3<Infer>>(Call<vec3<bool>>(true, false, true));
     auto* vec3_i32 = Call<vec3<Infer>>(Call<vec3<i32>>(1_i, 2_i, 3_i));
@@ -2152,7 +2152,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, InferVec3ElementTypeFromScalarAndVec2) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* vec3_bool = Call<vec3<Infer>>(true, Call<vec2<bool>>(false, true));
     auto* vec3_i32 = Call<vec3<Infer>>(1_i, Call<vec2<i32>>(2_i, 3_i));
@@ -2181,7 +2181,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, InferVec4ElementTypeFromScalars) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* vec4_bool = Call<vec4<Infer>>(true, false, true, false);
     auto* vec4_i32 = Call<vec4<Infer>>(1_i, 2_i, 3_i, 4_i);
@@ -2210,7 +2210,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, InferVec4ElementTypeFromVec4) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* vec4_bool = Call<vec4<Infer>>(Call<vec4<bool>>(true, false, true, false));
     auto* vec4_i32 = Call<vec4<Infer>>(Call<vec4<i32>>(1_i, 2_i, 3_i, 4_i));
@@ -2239,7 +2239,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, InferVec4ElementTypeFromScalarAndVec3) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* vec4_bool = Call<vec4<Infer>>(true, Call<vec3<bool>>(false, true, false));
     auto* vec4_i32 = Call<vec4<Infer>>(1_i, Call<vec3<i32>>(2_i, 3_i, 4_i));
@@ -2268,7 +2268,7 @@
 }
 
 TEST_F(ResolverValueConstructorValidationTest, InferVec4ElementTypeFromVec2AndVec2) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* vec4_bool =
         Call<vec4<Infer>>(Call<vec2<bool>>(true, false), Call<vec2<bool>>(true, false));
@@ -2425,7 +2425,7 @@
 
     const auto param = GetParam();
 
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     const std::string element_type_name = param.get_element_type_name();
     StringStream args_tys;
@@ -2454,7 +2454,7 @@
 
     const auto param = GetParam();
 
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     const std::string element_type_name = param.get_element_type_name();
     StringStream args_tys;
@@ -2482,7 +2482,7 @@
 
     const auto param = GetParam();
 
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     const std::string element_type_name = param.get_element_type_name();
     StringStream args_tys;
@@ -2511,7 +2511,7 @@
 
     const auto param = GetParam();
 
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     const std::string element_type_name = param.get_element_type_name();
     StringStream args_tys;
@@ -2539,7 +2539,7 @@
 
     const auto param = GetParam();
 
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     StringStream args_tys;
     Vector<const ast::Expression*, 8> args;
@@ -2567,7 +2567,7 @@
 
     const auto param = GetParam();
 
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     StringStream args_tys;
     Vector<const ast::Expression*, 8> args;
@@ -2599,7 +2599,7 @@
         return;
     }
 
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     const std::string element_type_name = param.get_element_type_name();
     StringStream args_tys;
@@ -2637,7 +2637,7 @@
         return;
     }
 
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     const std::string element_type_name = param.get_element_type_name();
     StringStream args_tys;
@@ -2669,7 +2669,7 @@
 
     const auto param = GetParam();
 
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     ast::Type matrix_type = param.create_mat_ast_type(*this);
     auto* tc = Call(Source{{12, 40}}, matrix_type);
@@ -2684,7 +2684,7 @@
 
     const auto param = GetParam();
 
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     Vector<const ast::Expression*, 4> args;
     for (uint32_t i = 0; i < param.columns; i++) {
@@ -2705,7 +2705,7 @@
 
     const auto param = GetParam();
 
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     Vector<const ast::Expression*, 16> args;
     for (uint32_t i = 0; i < param.columns * param.rows; i++) {
@@ -2725,7 +2725,7 @@
 
     const auto param = GetParam();
 
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* elem_type_alias = Alias("ElemType", param.create_element_ast_type(*this));
 
@@ -2755,7 +2755,7 @@
 
     const auto param = GetParam();
 
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* elem_type_alias = Alias("ElemType", param.create_element_ast_type(*this));
 
@@ -2786,7 +2786,7 @@
 TEST_P(MatrixConstructorTest, ArgumentTypeAlias_Success) {
     const auto param = GetParam();
 
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     ast::Type matrix_type = param.create_mat_ast_type(*this);
     ast::Type vec_type = param.create_column_ast_type(*this);
@@ -2806,7 +2806,7 @@
 TEST_P(MatrixConstructorTest, ArgumentElementTypeAlias_Error) {
     const auto param = GetParam();
 
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     ast::Type matrix_type = param.create_mat_ast_type(*this);
     auto* u32_type_alias = Alias("UnsignedInt", ty.u32());
@@ -2833,7 +2833,7 @@
 TEST_P(MatrixConstructorTest, ArgumentElementTypeAlias_Success) {
     const auto param = GetParam();
 
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* elem_type_alias = Alias("ElemType", param.create_element_ast_type(*this));
 
@@ -2853,7 +2853,7 @@
 TEST_P(MatrixConstructorTest, InferElementTypeFromVectors) {
     const auto param = GetParam();
 
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     Vector<const ast::Expression*, 8> args;
     for (uint32_t i = 0; i < param.columns; i++) {
@@ -2870,7 +2870,7 @@
 TEST_P(MatrixConstructorTest, InferElementTypeFromScalars) {
     const auto param = GetParam();
 
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     Vector<const ast::Expression*, 8> args;
     for (uint32_t i = 0; i < param.rows * param.columns; i++) {
@@ -2886,7 +2886,7 @@
 TEST_P(MatrixConstructorTest, CannotInferElementTypeFromVectors_Mismatch) {
     const auto param = GetParam();
 
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     StringStream err;
     err << "12:34 error: no matching constructor for mat" << param.columns << "x" << param.rows
@@ -2917,7 +2917,7 @@
 TEST_P(MatrixConstructorTest, CannotInferElementTypeFromScalars_Mismatch) {
     const auto param = GetParam();
 
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     StringStream err;
     err << "12:34 error: no matching constructor for mat" << param.columns << "x" << param.rows
@@ -3001,7 +3001,7 @@
     auto& str_params = std::get<0>(param);
     uint32_t N = std::get<1>(param);
 
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     Vector<const ast::StructMember*, 16> members;
     Vector<const ast::Expression*, 16> values;
@@ -3026,7 +3026,7 @@
     auto& str_params = std::get<0>(param);
     uint32_t N = std::get<1>(param);
 
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     Vector<const ast::StructMember*, 16> members;
     Vector<const ast::Expression*, 8> values;
@@ -3059,7 +3059,7 @@
     auto& ctor_params = std::get<1>(param);
     uint32_t N = std::get<2>(param);
 
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     if (str_params.ast == ctor_params.ast) {
         return;
diff --git a/src/tint/lang/wgsl/resolver/variable_test.cc b/src/tint/lang/wgsl/resolver/variable_test.cc
index 5951865..3e80a5e 100644
--- a/src/tint/lang/wgsl/resolver/variable_test.cc
+++ b/src/tint/lang/wgsl/resolver/variable_test.cc
@@ -42,7 +42,7 @@
     //   var a : A;
     // }
 
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* S = Structure("S", Vector{Member("i", ty.i32())});
     auto* A = Alias("A", ty.Of(S));
@@ -107,7 +107,7 @@
     //   var a : A = A(1);
     // }
 
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* S = Structure("S", Vector{Member("i", ty.i32())});
     auto* A = Alias("A", ty.Of(S));
@@ -400,7 +400,7 @@
     //   let p : pointer<function, i32> = &v;
     // }
 
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* S = Structure("S", Vector{Member("i", ty.i32())});
     auto* A = Alias("A", ty.Of(S));
diff --git a/src/tint/lang/wgsl/resolver/variable_validation_test.cc b/src/tint/lang/wgsl/resolver/variable_validation_test.cc
index 68d7b1e..cfcc146 100644
--- a/src/tint/lang/wgsl/resolver/variable_validation_test.cc
+++ b/src/tint/lang/wgsl/resolver/variable_validation_test.cc
@@ -506,7 +506,7 @@
 TEST_F(ResolverVariableValidationTest, GlobalVariable_PushConstantWithInitializer) {
     // enable chromium_experimental_push_constant;
     // var<push_constant> a : u32 = 0u;
-    Enable(core::Extension::kChromiumExperimentalPushConstant);
+    Enable(wgsl::Extension::kChromiumExperimentalPushConstant);
     GlobalVar(Source{{1u, 2u}}, "a", ty.u32(), core::AddressSpace::kPushConstant,
               Expr(Source{{3u, 4u}}, u32(0)));
 
diff --git a/src/tint/lang/wgsl/sem/BUILD.bazel b/src/tint/lang/wgsl/sem/BUILD.bazel
index a8d4579..75b0dae 100644
--- a/src/tint/lang/wgsl/sem/BUILD.bazel
+++ b/src/tint/lang/wgsl/sem/BUILD.bazel
@@ -99,6 +99,7 @@
     "//src/tint/lang/core",
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/type",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/utils/containers",
     "//src/tint/utils/diagnostic",
@@ -132,6 +133,7 @@
     "//src/tint/lang/core",
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/type",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/program",
     "//src/tint/lang/wgsl/resolver",
diff --git a/src/tint/lang/wgsl/sem/BUILD.cmake b/src/tint/lang/wgsl/sem/BUILD.cmake
index 11238c5..306ba36 100644
--- a/src/tint/lang/wgsl/sem/BUILD.cmake
+++ b/src/tint/lang/wgsl/sem/BUILD.cmake
@@ -98,6 +98,7 @@
   tint_lang_core
   tint_lang_core_constant
   tint_lang_core_type
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_utils_containers
   tint_utils_diagnostic
@@ -131,6 +132,7 @@
   tint_lang_core
   tint_lang_core_constant
   tint_lang_core_type
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_program
   tint_lang_wgsl_resolver
diff --git a/src/tint/lang/wgsl/sem/BUILD.gn b/src/tint/lang/wgsl/sem/BUILD.gn
index ae039c1..87f0a99 100644
--- a/src/tint/lang/wgsl/sem/BUILD.gn
+++ b/src/tint/lang/wgsl/sem/BUILD.gn
@@ -102,6 +102,7 @@
     "${tint_src_dir}/lang/core",
     "${tint_src_dir}/lang/core/constant",
     "${tint_src_dir}/lang/core/type",
+    "${tint_src_dir}/lang/wgsl",
     "${tint_src_dir}/lang/wgsl/ast",
     "${tint_src_dir}/utils/containers",
     "${tint_src_dir}/utils/diagnostic",
@@ -134,6 +135,7 @@
       "${tint_src_dir}/lang/core",
       "${tint_src_dir}/lang/core/constant",
       "${tint_src_dir}/lang/core/type",
+      "${tint_src_dir}/lang/wgsl",
       "${tint_src_dir}/lang/wgsl/ast",
       "${tint_src_dir}/lang/wgsl/program",
       "${tint_src_dir}/lang/wgsl/resolver",
diff --git a/src/tint/lang/wgsl/sem/builtin.cc b/src/tint/lang/wgsl/sem/builtin.cc
index 3845778..a3e5fa5 100644
--- a/src/tint/lang/wgsl/sem/builtin.cc
+++ b/src/tint/lang/wgsl/sem/builtin.cc
@@ -92,17 +92,17 @@
     return core::HasSideEffects(type_);
 }
 
-core::Extension Builtin::RequiredExtension() const {
+wgsl::Extension Builtin::RequiredExtension() const {
     if (IsDP4a()) {
-        return core::Extension::kChromiumExperimentalDp4A;
+        return wgsl::Extension::kChromiumExperimentalDp4A;
     }
     if (IsSubgroup()) {
-        return core::Extension::kChromiumExperimentalSubgroups;
+        return wgsl::Extension::kChromiumExperimentalSubgroups;
     }
     if (type_ == core::Function::kTextureBarrier) {
-        return core::Extension::kChromiumExperimentalReadWriteStorageTexture;
+        return wgsl::Extension::kChromiumExperimentalReadWriteStorageTexture;
     }
-    return core::Extension::kUndefined;
+    return wgsl::Extension::kUndefined;
 }
 
 }  // namespace tint::sem
diff --git a/src/tint/lang/wgsl/sem/builtin.h b/src/tint/lang/wgsl/sem/builtin.h
index 64ee5c2..1d0ce97 100644
--- a/src/tint/lang/wgsl/sem/builtin.h
+++ b/src/tint/lang/wgsl/sem/builtin.h
@@ -18,8 +18,8 @@
 #include <string>
 #include <vector>
 
-#include "src/tint/lang/core/extension.h"
 #include "src/tint/lang/core/function.h"
+#include "src/tint/lang/wgsl/extension.h"
 #include "src/tint/lang/wgsl/sem/call_target.h"
 #include "src/tint/lang/wgsl/sem/pipeline_stage_set.h"
 #include "src/tint/utils/math/hash.h"
@@ -101,8 +101,8 @@
     bool HasSideEffects() const;
 
     /// @returns the required extension of this builtin function. Returns
-    /// core::Extension::kNone if no extension is required.
-    core::Extension RequiredExtension() const;
+    /// wgsl::Extension::kNone if no extension is required.
+    wgsl::Extension RequiredExtension() const;
 
   private:
     const core::Function type_;
diff --git a/src/tint/lang/wgsl/sem/diagnostic_severity_test.cc b/src/tint/lang/wgsl/sem/diagnostic_severity_test.cc
index 3a464e9..adb17f2 100644
--- a/src/tint/lang/wgsl/sem/diagnostic_severity_test.cc
+++ b/src/tint/lang/wgsl/sem/diagnostic_severity_test.cc
@@ -27,7 +27,7 @@
     /// using an attribute. Test that we correctly track the severity of the filter for the
     /// functions and the statements with them.
     /// @param global_severity the global severity of the "chromium.unreachable_code" filter
-    void Run(core::DiagnosticSeverity global_severity) {
+    void Run(wgsl::DiagnosticSeverity global_severity) {
         // @diagnostic(off, chromium.unreachable_code)
         // fn foo() {
         //   @diagnostic(info, chromium.unreachable_code) {
@@ -74,22 +74,22 @@
         // fn bar() {
         //   return;
         // }
-        auto rule = core::ChromiumDiagnosticRule::kUnreachableCode;
-        auto func_severity = core::DiagnosticSeverity::kOff;
-        auto block_severity = core::DiagnosticSeverity::kInfo;
-        auto if_severity = core::DiagnosticSeverity::kError;
-        auto if_body_severity = core::DiagnosticSeverity::kWarning;
-        auto else_body_severity = core::DiagnosticSeverity::kInfo;
-        auto switch_severity = core::DiagnosticSeverity::kError;
-        auto switch_body_severity = core::DiagnosticSeverity::kOff;
-        auto case_severity = core::DiagnosticSeverity::kWarning;
-        auto for_severity = core::DiagnosticSeverity::kError;
-        auto for_body_severity = core::DiagnosticSeverity::kWarning;
-        auto loop_severity = core::DiagnosticSeverity::kWarning;
-        auto loop_body_severity = core::DiagnosticSeverity::kOff;
-        auto continuing_severity = core::DiagnosticSeverity::kInfo;
-        auto while_severity = core::DiagnosticSeverity::kError;
-        auto while_body_severity = core::DiagnosticSeverity::kWarning;
+        auto rule = wgsl::ChromiumDiagnosticRule::kUnreachableCode;
+        auto func_severity = wgsl::DiagnosticSeverity::kOff;
+        auto block_severity = wgsl::DiagnosticSeverity::kInfo;
+        auto if_severity = wgsl::DiagnosticSeverity::kError;
+        auto if_body_severity = wgsl::DiagnosticSeverity::kWarning;
+        auto else_body_severity = wgsl::DiagnosticSeverity::kInfo;
+        auto switch_severity = wgsl::DiagnosticSeverity::kError;
+        auto switch_body_severity = wgsl::DiagnosticSeverity::kOff;
+        auto case_severity = wgsl::DiagnosticSeverity::kWarning;
+        auto for_severity = wgsl::DiagnosticSeverity::kError;
+        auto for_body_severity = wgsl::DiagnosticSeverity::kWarning;
+        auto loop_severity = wgsl::DiagnosticSeverity::kWarning;
+        auto loop_body_severity = wgsl::DiagnosticSeverity::kOff;
+        auto continuing_severity = wgsl::DiagnosticSeverity::kInfo;
+        auto while_severity = wgsl::DiagnosticSeverity::kError;
+        auto while_body_severity = wgsl::DiagnosticSeverity::kWarning;
         auto attr = [&](auto severity) {
             return tint::Vector{DiagnosticAttribute(severity, "chromium", "unreachable_code")};
         };
@@ -173,12 +173,12 @@
 };
 
 TEST_F(DiagnosticSeverityTest, WithDirective) {
-    DiagnosticDirective(core::DiagnosticSeverity::kError, "chromium", "unreachable_code");
-    Run(core::DiagnosticSeverity::kError);
+    DiagnosticDirective(wgsl::DiagnosticSeverity::kError, "chromium", "unreachable_code");
+    Run(wgsl::DiagnosticSeverity::kError);
 }
 
 TEST_F(DiagnosticSeverityTest, WithoutDirective) {
-    Run(core::DiagnosticSeverity::kWarning);
+    Run(wgsl::DiagnosticSeverity::kWarning);
 }
 
 }  // namespace
diff --git a/src/tint/lang/wgsl/sem/function.h b/src/tint/lang/wgsl/sem/function.h
index 5638dbd..c21a76e 100644
--- a/src/tint/lang/wgsl/sem/function.h
+++ b/src/tint/lang/wgsl/sem/function.h
@@ -266,12 +266,12 @@
     /// Modifies the severity of a specific diagnostic rule for this function.
     /// @param rule the diagnostic rule
     /// @param severity the new diagnostic severity
-    void SetDiagnosticSeverity(core::DiagnosticRule rule, core::DiagnosticSeverity severity) {
+    void SetDiagnosticSeverity(wgsl::DiagnosticRule rule, wgsl::DiagnosticSeverity severity) {
         diagnostic_severities_[rule] = severity;
     }
 
     /// @returns the diagnostic severity modifications applied to this function
-    const core::DiagnosticRuleSeverities& DiagnosticSeverities() const {
+    const wgsl::DiagnosticRuleSeverities& DiagnosticSeverities() const {
         return diagnostic_severities_;
     }
 
@@ -295,7 +295,7 @@
     std::vector<const Function*> ancestor_entry_points_;
     const Statement* discard_stmt_ = nullptr;
     sem::Behaviors behaviors_{sem::Behavior::kNext};
-    core::DiagnosticRuleSeverities diagnostic_severities_;
+    wgsl::DiagnosticRuleSeverities diagnostic_severities_;
 
     std::optional<uint32_t> return_location_;
     std::optional<uint32_t> return_index_;
diff --git a/src/tint/lang/wgsl/sem/info.cc b/src/tint/lang/wgsl/sem/info.cc
index 9ecc02d..f4bd839 100644
--- a/src/tint/lang/wgsl/sem/info.cc
+++ b/src/tint/lang/wgsl/sem/info.cc
@@ -30,8 +30,8 @@
 
 Info& Info::operator=(Info&&) = default;
 
-core::DiagnosticSeverity Info::DiagnosticSeverity(const ast::Node* ast_node,
-                                                  core::DiagnosticRule rule) const {
+wgsl::DiagnosticSeverity Info::DiagnosticSeverity(const ast::Node* ast_node,
+                                                  wgsl::DiagnosticRule rule) const {
     // Get the diagnostic severity modification for a node.
     auto check = [&](auto* node) {
         auto& severities = node->DiagnosticSeverities();
@@ -39,13 +39,13 @@
         if (itr != severities.end()) {
             return itr->second;
         }
-        return core::DiagnosticSeverity::kUndefined;
+        return wgsl::DiagnosticSeverity::kUndefined;
     };
 
     // Get the diagnostic severity modification for a function.
     auto check_func = [&](const sem::Function* func) {
         auto severity = check(func);
-        if (severity != core::DiagnosticSeverity::kUndefined) {
+        if (severity != wgsl::DiagnosticSeverity::kUndefined) {
             return severity;
         }
 
@@ -58,7 +58,7 @@
         // Walk up the statement hierarchy, checking for diagnostic severity modifications.
         while (true) {
             auto severity = check(stmt);
-            if (severity != core::DiagnosticSeverity::kUndefined) {
+            if (severity != wgsl::DiagnosticSeverity::kUndefined) {
                 return severity;
             }
             if (!stmt->Parent()) {
@@ -83,7 +83,7 @@
             // Use the global severity set on the module.
             return check(module_);
         });
-    TINT_ASSERT(severity != core::DiagnosticSeverity::kUndefined);
+    TINT_ASSERT(severity != wgsl::DiagnosticSeverity::kUndefined);
     return severity;
 }
 
diff --git a/src/tint/lang/wgsl/sem/info.h b/src/tint/lang/wgsl/sem/info.h
index 3cdbc9a..5a41a3f 100644
--- a/src/tint/lang/wgsl/sem/info.h
+++ b/src/tint/lang/wgsl/sem/info.h
@@ -161,8 +161,8 @@
     /// @param ast_node the AST node
     /// @param rule the diagnostic rule
     /// @returns the severity of the rule for that AST node
-    core::DiagnosticSeverity DiagnosticSeverity(const ast::Node* ast_node,
-                                                core::DiagnosticRule rule) const;
+    wgsl::DiagnosticSeverity DiagnosticSeverity(const ast::Node* ast_node,
+                                                wgsl::DiagnosticRule rule) const;
 
   private:
     // AST node index to semantic node
diff --git a/src/tint/lang/wgsl/sem/module.cc b/src/tint/lang/wgsl/sem/module.cc
index 29b2c70..8da89c8 100644
--- a/src/tint/lang/wgsl/sem/module.cc
+++ b/src/tint/lang/wgsl/sem/module.cc
@@ -21,7 +21,7 @@
 
 namespace tint::sem {
 
-Module::Module(VectorRef<const ast::Node*> dep_ordered_decls, core::Extensions extensions)
+Module::Module(VectorRef<const ast::Node*> dep_ordered_decls, wgsl::Extensions extensions)
     : dep_ordered_decls_(std::move(dep_ordered_decls)), extensions_(std::move(extensions)) {}
 
 Module::~Module() = default;
diff --git a/src/tint/lang/wgsl/sem/module.h b/src/tint/lang/wgsl/sem/module.h
index d1cae6c..25b86db 100644
--- a/src/tint/lang/wgsl/sem/module.h
+++ b/src/tint/lang/wgsl/sem/module.h
@@ -15,8 +15,8 @@
 #ifndef SRC_TINT_LANG_WGSL_SEM_MODULE_H_
 #define SRC_TINT_LANG_WGSL_SEM_MODULE_H_
 
-#include "src/tint/lang/core/extension.h"
 #include "src/tint/lang/wgsl/ast/diagnostic_control.h"
+#include "src/tint/lang/wgsl/extension.h"
 #include "src/tint/lang/wgsl/sem/node.h"
 #include "src/tint/utils/containers/vector.h"
 
@@ -34,7 +34,7 @@
     /// Constructor
     /// @param dep_ordered_decls the dependency-ordered module-scope declarations
     /// @param extensions the list of enabled extensions in the module
-    Module(VectorRef<const ast::Node*> dep_ordered_decls, core::Extensions extensions);
+    Module(VectorRef<const ast::Node*> dep_ordered_decls, wgsl::Extensions extensions);
 
     /// Destructor
     ~Module() override;
@@ -43,24 +43,24 @@
     VectorRef<const ast::Node*> DependencyOrderedDeclarations() const { return dep_ordered_decls_; }
 
     /// @returns the list of enabled extensions in the module
-    const core::Extensions& Extensions() const { return extensions_; }
+    const wgsl::Extensions& Extensions() const { return extensions_; }
 
     /// Modifies the severity of a specific diagnostic rule for this module.
     /// @param rule the diagnostic rule
     /// @param severity the new diagnostic severity
-    void SetDiagnosticSeverity(core::DiagnosticRule rule, core::DiagnosticSeverity severity) {
+    void SetDiagnosticSeverity(wgsl::DiagnosticRule rule, wgsl::DiagnosticSeverity severity) {
         diagnostic_severities_[rule] = severity;
     }
 
     /// @returns the diagnostic severity modifications applied to this module
-    const core::DiagnosticRuleSeverities& DiagnosticSeverities() const {
+    const wgsl::DiagnosticRuleSeverities& DiagnosticSeverities() const {
         return diagnostic_severities_;
     }
 
   private:
     const tint::Vector<const ast::Node*, 64> dep_ordered_decls_;
-    core::Extensions extensions_;
-    core::DiagnosticRuleSeverities diagnostic_severities_;
+    wgsl::Extensions extensions_;
+    wgsl::DiagnosticRuleSeverities diagnostic_severities_;
 };
 
 }  // namespace tint::sem
diff --git a/src/tint/lang/wgsl/sem/statement.h b/src/tint/lang/wgsl/sem/statement.h
index 133d00b..446ca8e 100644
--- a/src/tint/lang/wgsl/sem/statement.h
+++ b/src/tint/lang/wgsl/sem/statement.h
@@ -113,12 +113,12 @@
     /// Modifies the severity of a specific diagnostic rule for this statement.
     /// @param rule the diagnostic rule
     /// @param severity the new diagnostic severity
-    void SetDiagnosticSeverity(core::DiagnosticRule rule, core::DiagnosticSeverity severity) {
+    void SetDiagnosticSeverity(wgsl::DiagnosticRule rule, wgsl::DiagnosticSeverity severity) {
         diagnostic_severities_[rule] = severity;
     }
 
     /// @returns the diagnostic severity modifications applied to this statement
-    const core::DiagnosticRuleSeverities& DiagnosticSeverities() const {
+    const wgsl::DiagnosticRuleSeverities& DiagnosticSeverities() const {
         return diagnostic_severities_;
     }
 
@@ -128,7 +128,7 @@
     const sem::Function* const function_;
     sem::Behaviors behaviors_{sem::Behavior::kNext};
     bool is_reachable_ = true;
-    core::DiagnosticRuleSeverities diagnostic_severities_;
+    wgsl::DiagnosticRuleSeverities diagnostic_severities_;
 };
 
 /// CompoundStatement is the base class of statements that can hold other
diff --git a/src/tint/lang/wgsl/wgsl.def b/src/tint/lang/wgsl/wgsl.def
new file mode 100644
index 0000000..0a40a81
--- /dev/null
+++ b/src/tint/lang/wgsl/wgsl.def
@@ -0,0 +1,74 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// WGSL builtin definition file                                               //
+//                                                                            //
+// This file is used to generate parts of the Tint BuiltinTable, various      //
+// enum definition files, as well as test .wgsl files.                        //
+//                                                                            //
+// After modifying this file, run:                                            //
+//    tools/run gen                                                           //
+// from the Dawn source directory.                                            //
+////////////////////////////////////////////////////////////////////////////////
+
+////////////////////////////////////////////////////////////////////////////////
+// Enumerators                                                                //
+////////////////////////////////////////////////////////////////////////////////
+
+// https://gpuweb.github.io/gpuweb/wgsl/#filterable-triggering-rules
+enum core_diagnostic_rule {
+  // Rules defined in the spec.
+  derivative_uniformity
+}
+
+// chromium-specific diagnostics
+enum chromium_diagnostic_rule {
+  // Chromium specific rules not defined in the spec.
+  unreachable_code
+}
+
+// https://gpuweb.github.io/gpuweb/wgsl/#syntax-severity_control_name
+enum diagnostic_severity {
+  error
+  warning
+  info
+  off
+}
+
+// https://gpuweb.github.io/gpuweb/wgsl/#extension
+enum extension {
+  // WGSL Extension "f16"
+  f16
+  // An extension for the experimental feature "chromium_experimental_dp4a".
+  // See crbug.com/tint/1497 for more details
+  chromium_experimental_dp4a
+  // A Chromium-specific extension for disabling uniformity analysis.
+  chromium_disable_uniformity_analysis
+  // A Chromium-specific extension for push constants
+  chromium_experimental_push_constant
+  // A Chromium-specific extension that enables passing of uniform, storage and workgroup
+  // address-spaced pointers as parameters, as well as pointers into sub-objects.
+  chromium_experimental_full_ptr_parameters
+  // A Chromium-specific extension that adds support for read-write storage textures.
+  chromium_experimental_read_write_storage_texture
+  // A Chromium-specific extension that adds basic subgroup functionality.
+  chromium_experimental_subgroups
+  // A Chromium-specific extension that relaxes memory layout requirements for uniform storage.
+  chromium_internal_relaxed_uniform_layout
+  // A Chromium-specific extension that enables dual source blending.
+  chromium_internal_dual_source_blending
+  // A Chromium-specific extension that enables pixel local storage.
+  chromium_experimental_pixel_local
+}
diff --git a/src/tint/lang/wgsl/writer/BUILD.bazel b/src/tint/lang/wgsl/writer/BUILD.bazel
index 850e260..570230f 100644
--- a/src/tint/lang/wgsl/writer/BUILD.bazel
+++ b/src/tint/lang/wgsl/writer/BUILD.bazel
@@ -39,6 +39,7 @@
     "//src/tint/lang/core",
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/type",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/program",
     "//src/tint/lang/wgsl/sem",
@@ -72,6 +73,7 @@
     "//src/tint/lang/core",
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/type",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/program",
     "//src/tint/lang/wgsl/sem",
diff --git a/src/tint/lang/wgsl/writer/BUILD.cmake b/src/tint/lang/wgsl/writer/BUILD.cmake
index 0fdab06..4802da7 100644
--- a/src/tint/lang/wgsl/writer/BUILD.cmake
+++ b/src/tint/lang/wgsl/writer/BUILD.cmake
@@ -42,6 +42,7 @@
   tint_lang_core
   tint_lang_core_constant
   tint_lang_core_type
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_program
   tint_lang_wgsl_sem
@@ -76,6 +77,7 @@
   tint_lang_core
   tint_lang_core_constant
   tint_lang_core_type
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_program
   tint_lang_wgsl_sem
diff --git a/src/tint/lang/wgsl/writer/BUILD.gn b/src/tint/lang/wgsl/writer/BUILD.gn
index cb47dbc..1bbf405 100644
--- a/src/tint/lang/wgsl/writer/BUILD.gn
+++ b/src/tint/lang/wgsl/writer/BUILD.gn
@@ -38,6 +38,7 @@
     "${tint_src_dir}/lang/core",
     "${tint_src_dir}/lang/core/constant",
     "${tint_src_dir}/lang/core/type",
+    "${tint_src_dir}/lang/wgsl",
     "${tint_src_dir}/lang/wgsl/ast",
     "${tint_src_dir}/lang/wgsl/program",
     "${tint_src_dir}/lang/wgsl/sem",
diff --git a/src/tint/lang/wgsl/writer/ast_printer/BUILD.bazel b/src/tint/lang/wgsl/writer/ast_printer/BUILD.bazel
index 64c5a7b3..b80b144 100644
--- a/src/tint/lang/wgsl/writer/ast_printer/BUILD.bazel
+++ b/src/tint/lang/wgsl/writer/ast_printer/BUILD.bazel
@@ -35,6 +35,7 @@
     "//src/tint/lang/core",
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/type",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/program",
     "//src/tint/lang/wgsl/sem",
@@ -97,6 +98,7 @@
     "//src/tint/lang/core",
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/type",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/program",
     "//src/tint/lang/wgsl/resolver",
diff --git a/src/tint/lang/wgsl/writer/ast_printer/BUILD.cmake b/src/tint/lang/wgsl/writer/ast_printer/BUILD.cmake
index 8004d94..96beb17 100644
--- a/src/tint/lang/wgsl/writer/ast_printer/BUILD.cmake
+++ b/src/tint/lang/wgsl/writer/ast_printer/BUILD.cmake
@@ -34,6 +34,7 @@
   tint_lang_core
   tint_lang_core_constant
   tint_lang_core_type
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_program
   tint_lang_wgsl_sem
@@ -96,6 +97,7 @@
   tint_lang_core
   tint_lang_core_constant
   tint_lang_core_type
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_program
   tint_lang_wgsl_resolver
diff --git a/src/tint/lang/wgsl/writer/ast_printer/BUILD.gn b/src/tint/lang/wgsl/writer/ast_printer/BUILD.gn
index 7e2c123..dcdec55 100644
--- a/src/tint/lang/wgsl/writer/ast_printer/BUILD.gn
+++ b/src/tint/lang/wgsl/writer/ast_printer/BUILD.gn
@@ -38,6 +38,7 @@
     "${tint_src_dir}/lang/core",
     "${tint_src_dir}/lang/core/constant",
     "${tint_src_dir}/lang/core/type",
+    "${tint_src_dir}/lang/wgsl",
     "${tint_src_dir}/lang/wgsl/ast",
     "${tint_src_dir}/lang/wgsl/program",
     "${tint_src_dir}/lang/wgsl/sem",
@@ -99,6 +100,7 @@
       "${tint_src_dir}/lang/core",
       "${tint_src_dir}/lang/core/constant",
       "${tint_src_dir}/lang/core/type",
+      "${tint_src_dir}/lang/wgsl",
       "${tint_src_dir}/lang/wgsl/ast",
       "${tint_src_dir}/lang/wgsl/program",
       "${tint_src_dir}/lang/wgsl/resolver",
diff --git a/src/tint/lang/wgsl/writer/ast_printer/cast_test.cc b/src/tint/lang/wgsl/writer/ast_printer/cast_test.cc
index 93361dc..cfb6ae5 100644
--- a/src/tint/lang/wgsl/writer/ast_printer/cast_test.cc
+++ b/src/tint/lang/wgsl/writer/ast_printer/cast_test.cc
@@ -38,7 +38,7 @@
 }
 
 TEST_F(WgslASTPrinterTest, EmitExpression_Cast_Scalar_F16_From_I32) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* cast = Call<f16>(1_i);
     WrapInFunction(cast);
@@ -64,7 +64,7 @@
 }
 
 TEST_F(WgslASTPrinterTest, EmitExpression_Cast_Vector_F16_From_I32) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* cast = Call<vec3<f16>>(Call<vec3<i32>>(1_i, 2_i, 3_i));
     WrapInFunction(cast);
diff --git a/src/tint/lang/wgsl/writer/ast_printer/constructor_test.cc b/src/tint/lang/wgsl/writer/ast_printer/constructor_test.cc
index 38026b9..260c3a7 100644
--- a/src/tint/lang/wgsl/writer/ast_printer/constructor_test.cc
+++ b/src/tint/lang/wgsl/writer/ast_printer/constructor_test.cc
@@ -65,7 +65,7 @@
 }
 
 TEST_F(WgslASTPrinterTest_Constructor, F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     // Use a number close to 1<<16 but whose decimal representation ends in 0.
     WrapInFunction(Expr(f16((1 << 15) - 8)));
@@ -88,7 +88,7 @@
 }
 
 TEST_F(WgslASTPrinterTest_Constructor, Type_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     WrapInFunction(Call<f16>(Expr(-1.2e-5_h)));
 
@@ -140,7 +140,7 @@
 }
 
 TEST_F(WgslASTPrinterTest_Constructor, Type_Vec_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     WrapInFunction(Call<vec3<f16>>(1_h, 2_h, 3_h));
 
@@ -164,7 +164,7 @@
 }
 
 TEST_F(WgslASTPrinterTest_Constructor, Type_Mat_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     WrapInFunction(
         Call<mat2x3<f16>>(Call<vec3<f16>>(1_h, 2_h, 3_h), Call<vec3<f16>>(3_h, 4_h, 5_h)));
diff --git a/src/tint/lang/wgsl/writer/ast_printer/diagnostic_test.cc b/src/tint/lang/wgsl/writer/ast_printer/diagnostic_test.cc
index df2b9cc..105a7b7 100644
--- a/src/tint/lang/wgsl/writer/ast_printer/diagnostic_test.cc
+++ b/src/tint/lang/wgsl/writer/ast_printer/diagnostic_test.cc
@@ -22,7 +22,7 @@
 using WgslASTPrinterTest = TestHelper;
 
 TEST_F(WgslASTPrinterTest, Emit_DiagnosticDirective) {
-    DiagnosticDirective(core::DiagnosticSeverity::kError, "chromium", "unreachable_code");
+    DiagnosticDirective(wgsl::DiagnosticSeverity::kError, "chromium", "unreachable_code");
 
     ASTPrinter& gen = Build();
     gen.Generate();
@@ -34,7 +34,7 @@
 
 TEST_F(WgslASTPrinterTest, Emit_DiagnosticAttribute) {
     auto* attr =
-        DiagnosticAttribute(core::DiagnosticSeverity::kError, "chromium", "unreachable_code");
+        DiagnosticAttribute(wgsl::DiagnosticSeverity::kError, "chromium", "unreachable_code");
     Func("foo", {}, ty.void_(), {}, Vector{attr});
 
     ASTPrinter& gen = Build();
diff --git a/src/tint/lang/wgsl/writer/ast_printer/enable_test.cc b/src/tint/lang/wgsl/writer/ast_printer/enable_test.cc
index 319db97..3791c99 100644
--- a/src/tint/lang/wgsl/writer/ast_printer/enable_test.cc
+++ b/src/tint/lang/wgsl/writer/ast_printer/enable_test.cc
@@ -22,7 +22,7 @@
 using WgslASTPrinterTest = TestHelper;
 
 TEST_F(WgslASTPrinterTest, Emit_Enable) {
-    auto* enable = Enable(core::Extension::kF16);
+    auto* enable = Enable(wgsl::Extension::kF16);
 
     ASTPrinter& gen = Build();
 
diff --git a/src/tint/lang/wgsl/writer/ast_printer/literal_test.cc b/src/tint/lang/wgsl/writer/ast_printer/literal_test.cc
index 670d5eb..00378c7 100644
--- a/src/tint/lang/wgsl/writer/ast_printer/literal_test.cc
+++ b/src/tint/lang/wgsl/writer/ast_printer/literal_test.cc
@@ -160,7 +160,7 @@
 using WgslGenerator_F16LiteralTest = TestParamHelper<F16Data>;
 
 TEST_P(WgslGenerator_F16LiteralTest, Emit) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* v = Expr(GetParam().value);
 
diff --git a/src/tint/lang/wgsl/writer/ast_printer/type_test.cc b/src/tint/lang/wgsl/writer/ast_printer/type_test.cc
index 6723673..cd2b55d 100644
--- a/src/tint/lang/wgsl/writer/ast_printer/type_test.cc
+++ b/src/tint/lang/wgsl/writer/ast_printer/type_test.cc
@@ -98,7 +98,7 @@
 }
 
 TEST_F(WgslASTPrinterTest, EmitType_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto type = Alias("make_type_reachable", ty.f16())->type;
 
@@ -133,7 +133,7 @@
 }
 
 TEST_F(WgslASTPrinterTest, EmitType_Matrix_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto type = Alias("make_type_reachable", ty.mat2x3<f16>())->type;
 
@@ -388,7 +388,7 @@
 }
 
 TEST_F(WgslASTPrinterTest, EmitType_Vector_F16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto type = Alias("make_type_reachable", ty.vec3<f16>())->type;
 
diff --git a/src/tint/lang/wgsl/writer/ast_printer/variable_decl_statement_test.cc b/src/tint/lang/wgsl/writer/ast_printer/variable_decl_statement_test.cc
index fdc7339..5382fd6 100644
--- a/src/tint/lang/wgsl/writer/ast_printer/variable_decl_statement_test.cc
+++ b/src/tint/lang/wgsl/writer/ast_printer/variable_decl_statement_test.cc
@@ -146,7 +146,7 @@
 }
 
 TEST_F(WgslASTPrinterTest, Emit_VariableDeclStatement_Const_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* C = Const("C", Expr(1_h));
     Func("f", tint::Empty, ty.void_(),
@@ -222,7 +222,7 @@
 }
 
 TEST_F(WgslASTPrinterTest, Emit_VariableDeclStatement_Const_vec3_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* C = Const("C", Call<vec3<f16>>(1_h, 2_h, 3_h));
     Func("f", tint::Empty, ty.void_(),
@@ -280,7 +280,7 @@
 }
 
 TEST_F(WgslASTPrinterTest, Emit_VariableDeclStatement_Const_mat2x3_f16) {
-    Enable(core::Extension::kF16);
+    Enable(wgsl::Extension::kF16);
 
     auto* C = Const("C", Call<mat2x3<f16>>(1_h, 2_h, 3_h, 4_h, 5_h, 6_h));
     Func("f", tint::Empty, ty.void_(),
diff --git a/src/tint/lang/wgsl/writer/ir_to_program/BUILD.bazel b/src/tint/lang/wgsl/writer/ir_to_program/BUILD.bazel
index 0db88d9..09671ed 100644
--- a/src/tint/lang/wgsl/writer/ir_to_program/BUILD.bazel
+++ b/src/tint/lang/wgsl/writer/ir_to_program/BUILD.bazel
@@ -41,6 +41,7 @@
     "//src/tint/lang/core/intrinsic/data",
     "//src/tint/lang/core/ir",
     "//src/tint/lang/core/type",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/program",
     "//src/tint/lang/wgsl/resolver",
@@ -80,6 +81,7 @@
     "//src/tint/lang/core/ir",
     "//src/tint/lang/core/ir:test",
     "//src/tint/lang/core/type",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/program",
     "//src/tint/lang/wgsl/sem",
diff --git a/src/tint/lang/wgsl/writer/ir_to_program/BUILD.cmake b/src/tint/lang/wgsl/writer/ir_to_program/BUILD.cmake
index ef8913c..4ac6bd8 100644
--- a/src/tint/lang/wgsl/writer/ir_to_program/BUILD.cmake
+++ b/src/tint/lang/wgsl/writer/ir_to_program/BUILD.cmake
@@ -40,6 +40,7 @@
   tint_lang_core_intrinsic_data
   tint_lang_core_ir
   tint_lang_core_type
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_program
   tint_lang_wgsl_resolver
@@ -79,6 +80,7 @@
   tint_lang_core_ir
   tint_lang_core_ir_test
   tint_lang_core_type
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_program
   tint_lang_wgsl_sem
diff --git a/src/tint/lang/wgsl/writer/ir_to_program/BUILD.gn b/src/tint/lang/wgsl/writer/ir_to_program/BUILD.gn
index 5dc5e9a..584fa6c 100644
--- a/src/tint/lang/wgsl/writer/ir_to_program/BUILD.gn
+++ b/src/tint/lang/wgsl/writer/ir_to_program/BUILD.gn
@@ -44,6 +44,7 @@
     "${tint_src_dir}/lang/core/intrinsic/data",
     "${tint_src_dir}/lang/core/ir",
     "${tint_src_dir}/lang/core/type",
+    "${tint_src_dir}/lang/wgsl",
     "${tint_src_dir}/lang/wgsl/ast",
     "${tint_src_dir}/lang/wgsl/program",
     "${tint_src_dir}/lang/wgsl/resolver",
@@ -82,6 +83,7 @@
       "${tint_src_dir}/lang/core/ir",
       "${tint_src_dir}/lang/core/ir:unittests",
       "${tint_src_dir}/lang/core/type",
+      "${tint_src_dir}/lang/wgsl",
       "${tint_src_dir}/lang/wgsl/ast",
       "${tint_src_dir}/lang/wgsl/program",
       "${tint_src_dir}/lang/wgsl/sem",
diff --git a/src/tint/lang/wgsl/writer/ir_to_program/ir_to_program.cc b/src/tint/lang/wgsl/writer/ir_to_program/ir_to_program.cc
index b32e60e..169ca8b 100644
--- a/src/tint/lang/wgsl/writer/ir_to_program/ir_to_program.cc
+++ b/src/tint/lang/wgsl/writer/ir_to_program/ir_to_program.cc
@@ -176,7 +176,7 @@
     Hashset<core::ir::Value*, 64> can_inline_;
 
     /// Set of enable directives emitted.
-    Hashset<core::Extension, 4> enables_;
+    Hashset<wgsl::Extension, 4> enables_;
 
     /// Map of struct to output program name.
     Hashmap<const core::type::Struct*, Symbol, 8> structs_;
@@ -581,8 +581,8 @@
             [&](core::ir::CoreBuiltinCall* c) {
                 if (!disabled_derivative_uniformity_ && RequiresDerivativeUniformity(c->Func())) {
                     // TODO(crbug.com/tint/1985): Be smarter about disabling derivative uniformity.
-                    b.DiagnosticDirective(core::DiagnosticSeverity::kOff,
-                                          core::CoreDiagnosticRule::kDerivativeUniformity);
+                    b.DiagnosticDirective(wgsl::DiagnosticSeverity::kOff,
+                                          wgsl::CoreDiagnosticRule::kDerivativeUniformity);
                     disabled_derivative_uniformity_ = true;
                 }
 
@@ -826,7 +826,7 @@
             [&](const core::type::U32*) { return b.Expr(c->ValueAs<u32>()); },
             [&](const core::type::F32*) { return b.Expr(c->ValueAs<f32>()); },
             [&](const core::type::F16*) {
-                Enable(core::Extension::kF16);
+                Enable(wgsl::Extension::kF16);
                 return b.Expr(c->ValueAs<f16>());
             },
             [&](const core::type::Bool*) { return b.Expr(c->ValueAs<bool>()); },
@@ -840,7 +840,7 @@
             });
     }
 
-    void Enable(core::Extension ext) {
+    void Enable(wgsl::Extension ext) {
         if (enables_.Add(ext)) {
             b.Enable(ext);
         }
@@ -866,7 +866,7 @@
             [&](const core::type::I32*) { return b.ty.i32(); },    //
             [&](const core::type::U32*) { return b.ty.u32(); },    //
             [&](const core::type::F16*) {
-                Enable(core::Extension::kF16);
+                Enable(wgsl::Extension::kF16);
                 return b.ty.f16();
             },
             [&](const core::type::F32*) { return b.ty.f32(); },  //
@@ -954,7 +954,7 @@
                     ast_attrs.Push(b.Location(u32(*location)));
                 }
                 if (auto index = ir_attrs.index) {
-                    Enable(core::Extension::kChromiumInternalDualSourceBlending);
+                    Enable(wgsl::Extension::kChromiumInternalDualSourceBlending);
                     ast_attrs.Push(b.Index(u32(*index)));
                 }
                 if (auto builtin = ir_attrs.builtin) {
diff --git a/src/tint/lang/wgsl/writer/syntax_tree_printer/BUILD.bazel b/src/tint/lang/wgsl/writer/syntax_tree_printer/BUILD.bazel
index 6ec7c13..8009138 100644
--- a/src/tint/lang/wgsl/writer/syntax_tree_printer/BUILD.bazel
+++ b/src/tint/lang/wgsl/writer/syntax_tree_printer/BUILD.bazel
@@ -35,6 +35,7 @@
     "//src/tint/lang/core",
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/type",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/program",
     "//src/tint/lang/wgsl/sem",
diff --git a/src/tint/lang/wgsl/writer/syntax_tree_printer/BUILD.cmake b/src/tint/lang/wgsl/writer/syntax_tree_printer/BUILD.cmake
index 0a46c6e..d9353a4 100644
--- a/src/tint/lang/wgsl/writer/syntax_tree_printer/BUILD.cmake
+++ b/src/tint/lang/wgsl/writer/syntax_tree_printer/BUILD.cmake
@@ -34,6 +34,7 @@
   tint_lang_core
   tint_lang_core_constant
   tint_lang_core_type
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_program
   tint_lang_wgsl_sem
diff --git a/src/tint/lang/wgsl/writer/syntax_tree_printer/BUILD.gn b/src/tint/lang/wgsl/writer/syntax_tree_printer/BUILD.gn
index 0b604d8..16b77ae 100644
--- a/src/tint/lang/wgsl/writer/syntax_tree_printer/BUILD.gn
+++ b/src/tint/lang/wgsl/writer/syntax_tree_printer/BUILD.gn
@@ -34,6 +34,7 @@
     "${tint_src_dir}/lang/core",
     "${tint_src_dir}/lang/core/constant",
     "${tint_src_dir}/lang/core/type",
+    "${tint_src_dir}/lang/wgsl",
     "${tint_src_dir}/lang/wgsl/ast",
     "${tint_src_dir}/lang/wgsl/program",
     "${tint_src_dir}/lang/wgsl/sem",
diff --git a/src/tint/utils/containers/BUILD.bazel b/src/tint/utils/containers/BUILD.bazel
index c64b88a..c571f729 100644
--- a/src/tint/utils/containers/BUILD.bazel
+++ b/src/tint/utils/containers/BUILD.bazel
@@ -78,6 +78,7 @@
     "//src/tint/lang/core",
     "//src/tint/lang/core/constant",
     "//src/tint/lang/core/type",
+    "//src/tint/lang/wgsl",
     "//src/tint/lang/wgsl/ast",
     "//src/tint/lang/wgsl/program",
     "//src/tint/lang/wgsl/sem",
diff --git a/src/tint/utils/containers/BUILD.cmake b/src/tint/utils/containers/BUILD.cmake
index 2cb4ff8..eaf1266 100644
--- a/src/tint/utils/containers/BUILD.cmake
+++ b/src/tint/utils/containers/BUILD.cmake
@@ -77,6 +77,7 @@
   tint_lang_core
   tint_lang_core_constant
   tint_lang_core_type
+  tint_lang_wgsl
   tint_lang_wgsl_ast
   tint_lang_wgsl_program
   tint_lang_wgsl_sem
diff --git a/src/tint/utils/containers/BUILD.gn b/src/tint/utils/containers/BUILD.gn
index a912cce..b7cbe13 100644
--- a/src/tint/utils/containers/BUILD.gn
+++ b/src/tint/utils/containers/BUILD.gn
@@ -80,6 +80,7 @@
       "${tint_src_dir}/lang/core",
       "${tint_src_dir}/lang/core/constant",
       "${tint_src_dir}/lang/core/type",
+      "${tint_src_dir}/lang/wgsl",
       "${tint_src_dir}/lang/wgsl/ast",
       "${tint_src_dir}/lang/wgsl/program",
       "${tint_src_dir}/lang/wgsl/sem",