tint/ast: Remove ast::Sampler

Instead use ast::TypeName.

Bug: tint:1810
Change-Id: Ia2641d661cab70d110c975d5f0d0e76628816cb0
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/119120
Reviewed-by: Dan Sinclair <dsinclair@chromium.org>
Commit-Queue: Ben Clayton <bclayton@chromium.org>
Kokoro: Ben Clayton <bclayton@chromium.org>
diff --git a/src/tint/BUILD.gn b/src/tint/BUILD.gn
index ba10dfe..ae9f9ae 100644
--- a/src/tint/BUILD.gn
+++ b/src/tint/BUILD.gn
@@ -302,7 +302,6 @@
     "ast/pointer.h",
     "ast/return_statement.h",
     "ast/sampled_texture.h",
-    "ast/sampler.h",
     "ast/stage_attribute.h",
     "ast/statement.h",
     "ast/storage_texture.h",
@@ -671,8 +670,6 @@
     "ast/return_statement.h",
     "ast/sampled_texture.cc",
     "ast/sampled_texture.h",
-    "ast/sampler.cc",
-    "ast/sampler.h",
     "ast/stage_attribute.cc",
     "ast/stage_attribute.h",
     "ast/statement.cc",
@@ -1345,7 +1342,6 @@
       "ast/pointer_test.cc",
       "ast/return_statement_test.cc",
       "ast/sampled_texture_test.cc",
-      "ast/sampler_test.cc",
       "ast/stage_attribute_test.cc",
       "ast/storage_texture_test.cc",
       "ast/stride_attribute_test.cc",
diff --git a/src/tint/CMakeLists.txt b/src/tint/CMakeLists.txt
index 56f81d5..cbd9a3e 100644
--- a/src/tint/CMakeLists.txt
+++ b/src/tint/CMakeLists.txt
@@ -203,8 +203,6 @@
   ast/return_statement.h
   ast/sampled_texture.cc
   ast/sampled_texture.h
-  ast/sampler.cc
-  ast/sampler.h
   ast/stage_attribute.cc
   ast/stage_attribute.h
   ast/statement.cc
@@ -866,7 +864,6 @@
     ast/pointer_test.cc
     ast/return_statement_test.cc
     ast/sampled_texture_test.cc
-    ast/sampler_test.cc
     ast/stage_attribute_test.cc
     ast/storage_texture_test.cc
     ast/stride_attribute_test.cc
diff --git a/src/tint/ast/alias_test.cc b/src/tint/ast/alias_test.cc
index d2fa755..b35fb1a 100644
--- a/src/tint/ast/alias_test.cc
+++ b/src/tint/ast/alias_test.cc
@@ -16,7 +16,6 @@
 #include "src/tint/ast/array.h"
 #include "src/tint/ast/matrix.h"
 #include "src/tint/ast/pointer.h"
-#include "src/tint/ast/sampler.h"
 #include "src/tint/ast/struct.h"
 #include "src/tint/ast/test_helper.h"
 #include "src/tint/ast/texture.h"
diff --git a/src/tint/ast/builtin_texture_helper_test.cc b/src/tint/ast/builtin_texture_helper_test.cc
index d25ec0d..df09f11 100644
--- a/src/tint/ast/builtin_texture_helper_test.cc
+++ b/src/tint/ast/builtin_texture_helper_test.cc
@@ -149,25 +149,25 @@
     switch (texture_kind) {
         case ast::builtin::test::TextureKind::kRegular:
             return b->GlobalVar(
-                "texture",
+                kTextureName,
                 b->ty.sampled_texture(texture_dimension, BuildResultVectorComponentType(b)), attrs);
 
         case ast::builtin::test::TextureKind::kDepth:
-            return b->GlobalVar("texture", b->ty.depth_texture(texture_dimension), attrs);
+            return b->GlobalVar(kTextureName, b->ty.depth_texture(texture_dimension), attrs);
 
         case ast::builtin::test::TextureKind::kDepthMultisampled:
-            return b->GlobalVar("texture", b->ty.depth_multisampled_texture(texture_dimension),
+            return b->GlobalVar(kTextureName, b->ty.depth_multisampled_texture(texture_dimension),
                                 attrs);
 
         case ast::builtin::test::TextureKind::kMultisampled:
             return b->GlobalVar(
-                "texture",
+                kTextureName,
                 b->ty.multisampled_texture(texture_dimension, BuildResultVectorComponentType(b)),
                 attrs);
 
         case ast::builtin::test::TextureKind::kStorage: {
             auto* st = b->ty.storage_texture(texture_dimension, texel_format, access);
-            return b->GlobalVar("texture", st, attrs);
+            return b->GlobalVar(kTextureName, st, attrs);
         }
     }
 
@@ -177,7 +177,7 @@
 
 const ast::Variable* TextureOverloadCase::BuildSamplerVariable(ProgramBuilder* b) const {
     utils::Vector attrs = {b->Group(0_a), b->Binding(1_a)};
-    return b->GlobalVar("sampler", b->ty.sampler(sampler_kind), attrs);
+    return b->GlobalVar(kSamplerName, b->ty.sampler(sampler_kind), attrs);
 }
 
 std::vector<TextureOverloadCase> TextureOverloadCase::ValidCases() {
@@ -190,7 +190,7 @@
             type::TextureDimension::k1d,
             TextureDataType::kF32,
             "textureDimensions",
-            [](ProgramBuilder* b) { return b->ExprList("texture"); },
+            [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
         },
         {
             ValidTextureOverload::kDimensions2d,
@@ -200,7 +200,7 @@
             type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureDimensions",
-            [](ProgramBuilder* b) { return b->ExprList("texture"); },
+            [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
         },
         {
             ValidTextureOverload::kDimensions2dLevel,
@@ -211,7 +211,7 @@
             type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureDimensions",
-            [](ProgramBuilder* b) { return b->ExprList("texture", 1_i); },
+            [](ProgramBuilder* b) { return b->ExprList(kTextureName, 1_i); },
         },
         {
             ValidTextureOverload::kDimensions2dArray,
@@ -221,7 +221,7 @@
             type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureDimensions",
-            [](ProgramBuilder* b) { return b->ExprList("texture"); },
+            [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
         },
         {
             ValidTextureOverload::kDimensions2dArrayLevel,
@@ -232,7 +232,7 @@
             type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureDimensions",
-            [](ProgramBuilder* b) { return b->ExprList("texture", 1_i); },
+            [](ProgramBuilder* b) { return b->ExprList(kTextureName, 1_i); },
         },
         {
             ValidTextureOverload::kDimensions3d,
@@ -242,7 +242,7 @@
             type::TextureDimension::k3d,
             TextureDataType::kF32,
             "textureDimensions",
-            [](ProgramBuilder* b) { return b->ExprList("texture"); },
+            [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
         },
         {
             ValidTextureOverload::kDimensions3dLevel,
@@ -253,7 +253,7 @@
             type::TextureDimension::k3d,
             TextureDataType::kF32,
             "textureDimensions",
-            [](ProgramBuilder* b) { return b->ExprList("texture", 1_i); },
+            [](ProgramBuilder* b) { return b->ExprList(kTextureName, 1_i); },
         },
         {
             ValidTextureOverload::kDimensionsCube,
@@ -263,7 +263,7 @@
             type::TextureDimension::kCube,
             TextureDataType::kF32,
             "textureDimensions",
-            [](ProgramBuilder* b) { return b->ExprList("texture"); },
+            [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
         },
         {
             ValidTextureOverload::kDimensionsCubeLevel,
@@ -274,7 +274,7 @@
             type::TextureDimension::kCube,
             TextureDataType::kF32,
             "textureDimensions",
-            [](ProgramBuilder* b) { return b->ExprList("texture", 1_i); },
+            [](ProgramBuilder* b) { return b->ExprList(kTextureName, 1_i); },
         },
         {
             ValidTextureOverload::kDimensionsCubeArray,
@@ -284,7 +284,7 @@
             type::TextureDimension::kCubeArray,
             TextureDataType::kF32,
             "textureDimensions",
-            [](ProgramBuilder* b) { return b->ExprList("texture"); },
+            [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
         },
         {
             ValidTextureOverload::kDimensionsCubeArrayLevel,
@@ -295,7 +295,7 @@
             type::TextureDimension::kCubeArray,
             TextureDataType::kF32,
             "textureDimensions",
-            [](ProgramBuilder* b) { return b->ExprList("texture", 1_i); },
+            [](ProgramBuilder* b) { return b->ExprList(kTextureName, 1_i); },
         },
         {
             ValidTextureOverload::kDimensionsMultisampled2d,
@@ -305,7 +305,7 @@
             type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureDimensions",
-            [](ProgramBuilder* b) { return b->ExprList("texture"); },
+            [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
         },
         {
             ValidTextureOverload::kDimensionsDepth2d,
@@ -315,7 +315,7 @@
             type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureDimensions",
-            [](ProgramBuilder* b) { return b->ExprList("texture"); },
+            [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
         },
         {
             ValidTextureOverload::kDimensionsDepth2dLevel,
@@ -326,7 +326,7 @@
             type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureDimensions",
-            [](ProgramBuilder* b) { return b->ExprList("texture", 1_i); },
+            [](ProgramBuilder* b) { return b->ExprList(kTextureName, 1_i); },
         },
         {
             ValidTextureOverload::kDimensionsDepth2dArray,
@@ -336,7 +336,7 @@
             type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureDimensions",
-            [](ProgramBuilder* b) { return b->ExprList("texture"); },
+            [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
         },
         {
             ValidTextureOverload::kDimensionsDepth2dArrayLevel,
@@ -347,7 +347,7 @@
             type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureDimensions",
-            [](ProgramBuilder* b) { return b->ExprList("texture", 1_i); },
+            [](ProgramBuilder* b) { return b->ExprList(kTextureName, 1_i); },
         },
         {
             ValidTextureOverload::kDimensionsDepthCube,
@@ -357,7 +357,7 @@
             type::TextureDimension::kCube,
             TextureDataType::kF32,
             "textureDimensions",
-            [](ProgramBuilder* b) { return b->ExprList("texture"); },
+            [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
         },
         {
             ValidTextureOverload::kDimensionsDepthCubeLevel,
@@ -368,7 +368,7 @@
             type::TextureDimension::kCube,
             TextureDataType::kF32,
             "textureDimensions",
-            [](ProgramBuilder* b) { return b->ExprList("texture", 1_i); },
+            [](ProgramBuilder* b) { return b->ExprList(kTextureName, 1_i); },
         },
         {
             ValidTextureOverload::kDimensionsDepthCubeArray,
@@ -378,7 +378,7 @@
             type::TextureDimension::kCubeArray,
             TextureDataType::kF32,
             "textureDimensions",
-            [](ProgramBuilder* b) { return b->ExprList("texture"); },
+            [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
         },
         {
             ValidTextureOverload::kDimensionsDepthCubeArrayLevel,
@@ -389,7 +389,7 @@
             type::TextureDimension::kCubeArray,
             TextureDataType::kF32,
             "textureDimensions",
-            [](ProgramBuilder* b) { return b->ExprList("texture", 1_i); },
+            [](ProgramBuilder* b) { return b->ExprList(kTextureName, 1_i); },
         },
         {
             ValidTextureOverload::kDimensionsDepthMultisampled2d,
@@ -399,7 +399,7 @@
             type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureDimensions",
-            [](ProgramBuilder* b) { return b->ExprList("texture"); },
+            [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
         },
         {
             ValidTextureOverload::kDimensionsStorageWO1d,
@@ -409,7 +409,7 @@
             type::TextureDimension::k1d,
             TextureDataType::kF32,
             "textureDimensions",
-            [](ProgramBuilder* b) { return b->ExprList("texture"); },
+            [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
         },
         {
             ValidTextureOverload::kDimensionsStorageWO2d,
@@ -419,7 +419,7 @@
             type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureDimensions",
-            [](ProgramBuilder* b) { return b->ExprList("texture"); },
+            [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
         },
         {
             ValidTextureOverload::kDimensionsStorageWO2dArray,
@@ -429,7 +429,7 @@
             type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureDimensions",
-            [](ProgramBuilder* b) { return b->ExprList("texture"); },
+            [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
         },
         {
             ValidTextureOverload::kDimensionsStorageWO3d,
@@ -439,7 +439,7 @@
             type::TextureDimension::k3d,
             TextureDataType::kF32,
             "textureDimensions",
-            [](ProgramBuilder* b) { return b->ExprList("texture"); },
+            [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
         },
 
         {
@@ -455,8 +455,8 @@
             "textureGather",
             [](ProgramBuilder* b) {
                 return b->ExprList(0_i,                      // component
-                                   "texture",                // t
-                                   "sampler",                // s
+                                   kTextureName,             // t
+                                   kSamplerName,             // s
                                    b->vec2<f32>(1_f, 2_f));  // coords
             },
         },
@@ -474,8 +474,8 @@
             "textureGather",
             [](ProgramBuilder* b) {
                 return b->ExprList(0_u,                      // component
-                                   "texture",                // t
-                                   "sampler",                // s
+                                   kTextureName,             // t
+                                   kSamplerName,             // s
                                    b->vec2<f32>(1_f, 2_f),   // coords
                                    b->vec2<i32>(3_i, 4_i));  // offset
             },
@@ -494,8 +494,8 @@
             "textureGather",
             [](ProgramBuilder* b) {
                 return b->ExprList(0_i,                     // component
-                                   "texture",               // t
-                                   "sampler",               // s
+                                   kTextureName,            // t
+                                   kSamplerName,            // s
                                    b->vec2<f32>(1_f, 2_f),  // coords
                                    3_i);                    // array index
             },
@@ -515,8 +515,8 @@
             "textureGather",
             [](ProgramBuilder* b) {
                 return b->ExprList(0_u,                      // component
-                                   "texture",                // t
-                                   "sampler",                // s
+                                   kTextureName,             // t
+                                   kSamplerName,             // s
                                    b->vec2<f32>(1_f, 2_f),   // coords
                                    3_u,                      // array_index
                                    b->vec2<i32>(4_i, 5_i));  // offset
@@ -535,8 +535,8 @@
             "textureGather",
             [](ProgramBuilder* b) {
                 return b->ExprList(0_i,                           // component
-                                   "texture",                     // t
-                                   "sampler",                     // s
+                                   kTextureName,                  // t
+                                   kSamplerName,                  // s
                                    b->vec3<f32>(1_f, 2_f, 3_f));  // coords
             },
         },
@@ -554,8 +554,8 @@
             "textureGather",
             [](ProgramBuilder* b) {
                 return b->ExprList(0_u,                          // component
-                                   "texture",                    // t
-                                   "sampler",                    // s
+                                   kTextureName,                 // t
+                                   kSamplerName,                 // s
                                    b->vec3<f32>(1_f, 2_f, 3_f),  // coords
                                    4_u);                         // array_index
             },
@@ -571,8 +571,8 @@
             TextureDataType::kF32,
             "textureGather",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",                // t
-                                   "sampler",                // s
+                return b->ExprList(kTextureName,             // t
+                                   kSamplerName,             // s
                                    b->vec2<f32>(1_f, 2_f));  // coords
             },
         },
@@ -588,8 +588,8 @@
             TextureDataType::kF32,
             "textureGather",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",                // t
-                                   "sampler",                // s
+                return b->ExprList(kTextureName,             // t
+                                   kSamplerName,             // s
                                    b->vec2<f32>(1_f, 2_f),   // coords
                                    b->vec2<i32>(3_i, 4_i));  // offset
             },
@@ -606,8 +606,8 @@
             TextureDataType::kF32,
             "textureGather",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",               // t
-                                   "sampler",               // s
+                return b->ExprList(kTextureName,            // t
+                                   kSamplerName,            // s
                                    b->vec2<f32>(1_f, 2_f),  // coords
                                    3_u);                    // array_index
             },
@@ -625,8 +625,8 @@
             TextureDataType::kF32,
             "textureGather",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",                // t
-                                   "sampler",                // s
+                return b->ExprList(kTextureName,             // t
+                                   kSamplerName,             // s
                                    b->vec2<f32>(1_f, 2_f),   // coords
                                    3_i,                      // array_index
                                    b->vec2<i32>(4_i, 5_i));  // offset
@@ -643,8 +643,8 @@
             TextureDataType::kF32,
             "textureGather",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",                     // t
-                                   "sampler",                     // s
+                return b->ExprList(kTextureName,                  // t
+                                   kSamplerName,                  // s
                                    b->vec3<f32>(1_f, 2_f, 3_f));  // coords
             },
         },
@@ -660,8 +660,8 @@
             TextureDataType::kF32,
             "textureGather",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",                    // t
-                                   "sampler",                    // s
+                return b->ExprList(kTextureName,                 // t
+                                   kSamplerName,                 // s
                                    b->vec3<f32>(1_f, 2_f, 3_f),  // coords
                                    4_u);                         // array_index
             },
@@ -678,8 +678,8 @@
             TextureDataType::kF32,
             "textureGatherCompare",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",               // t
-                                   "sampler",               // s
+                return b->ExprList(kTextureName,            // t
+                                   kSamplerName,            // s
                                    b->vec2<f32>(1_f, 2_f),  // coords
                                    3_f);                    // depth_ref
             },
@@ -697,8 +697,8 @@
             TextureDataType::kF32,
             "textureGatherCompare",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",                // t
-                                   "sampler",                // s
+                return b->ExprList(kTextureName,             // t
+                                   kSamplerName,             // s
                                    b->vec2<f32>(1_f, 2_f),   // coords
                                    3_f,                      // depth_ref
                                    b->vec2<i32>(4_i, 5_i));  // offset
@@ -717,8 +717,8 @@
             TextureDataType::kF32,
             "textureGatherCompare",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",               // t
-                                   "sampler",               // s
+                return b->ExprList(kTextureName,            // t
+                                   kSamplerName,            // s
                                    b->vec2<f32>(1_f, 2_f),  // coords
                                    3_i,                     // array_index
                                    4_f);                    // depth_ref
@@ -738,8 +738,8 @@
             TextureDataType::kF32,
             "textureGatherCompare",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",                // t
-                                   "sampler",                // s
+                return b->ExprList(kTextureName,             // t
+                                   kSamplerName,             // s
                                    b->vec2<f32>(1_f, 2_f),   // coords
                                    3_i,                      // array_index
                                    4_f,                      // depth_ref
@@ -758,8 +758,8 @@
             TextureDataType::kF32,
             "textureGatherCompare",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",                    // t
-                                   "sampler",                    // s
+                return b->ExprList(kTextureName,                 // t
+                                   kSamplerName,                 // s
                                    b->vec3<f32>(1_f, 2_f, 3_f),  // coords
                                    4_f);                         // depth_ref
             },
@@ -777,8 +777,8 @@
             TextureDataType::kF32,
             "textureGatherCompare",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",                    // t
-                                   "sampler",                    // s
+                return b->ExprList(kTextureName,                 // t
+                                   kSamplerName,                 // s
                                    b->vec3<f32>(1_f, 2_f, 3_f),  // coords
                                    4_u,                          // array_index
                                    5_f);                         // depth_ref
@@ -792,7 +792,7 @@
             type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureNumLayers",
-            [](ProgramBuilder* b) { return b->ExprList("texture"); },
+            [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
         },
         {
             ValidTextureOverload::kNumLayersCubeArray,
@@ -802,7 +802,7 @@
             type::TextureDimension::kCubeArray,
             TextureDataType::kF32,
             "textureNumLayers",
-            [](ProgramBuilder* b) { return b->ExprList("texture"); },
+            [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
         },
         {
             ValidTextureOverload::kNumLayersDepth2dArray,
@@ -812,7 +812,7 @@
             type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureNumLayers",
-            [](ProgramBuilder* b) { return b->ExprList("texture"); },
+            [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
         },
         {
             ValidTextureOverload::kNumLayersDepthCubeArray,
@@ -822,7 +822,7 @@
             type::TextureDimension::kCubeArray,
             TextureDataType::kF32,
             "textureNumLayers",
-            [](ProgramBuilder* b) { return b->ExprList("texture"); },
+            [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
         },
         {
             ValidTextureOverload::kNumLayersStorageWO2dArray,
@@ -832,7 +832,7 @@
             type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureNumLayers",
-            [](ProgramBuilder* b) { return b->ExprList("texture"); },
+            [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
         },
         {
             ValidTextureOverload::kNumLevels2d,
@@ -842,7 +842,7 @@
             type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureNumLevels",
-            [](ProgramBuilder* b) { return b->ExprList("texture"); },
+            [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
         },
         {
             ValidTextureOverload::kNumLevels2dArray,
@@ -852,7 +852,7 @@
             type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureNumLevels",
-            [](ProgramBuilder* b) { return b->ExprList("texture"); },
+            [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
         },
         {
             ValidTextureOverload::kNumLevels3d,
@@ -862,7 +862,7 @@
             type::TextureDimension::k3d,
             TextureDataType::kF32,
             "textureNumLevels",
-            [](ProgramBuilder* b) { return b->ExprList("texture"); },
+            [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
         },
         {
             ValidTextureOverload::kNumLevelsCube,
@@ -872,7 +872,7 @@
             type::TextureDimension::kCube,
             TextureDataType::kF32,
             "textureNumLevels",
-            [](ProgramBuilder* b) { return b->ExprList("texture"); },
+            [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
         },
         {
             ValidTextureOverload::kNumLevelsCubeArray,
@@ -882,7 +882,7 @@
             type::TextureDimension::kCubeArray,
             TextureDataType::kF32,
             "textureNumLevels",
-            [](ProgramBuilder* b) { return b->ExprList("texture"); },
+            [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
         },
         {
             ValidTextureOverload::kNumLevelsDepth2d,
@@ -892,7 +892,7 @@
             type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureNumLevels",
-            [](ProgramBuilder* b) { return b->ExprList("texture"); },
+            [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
         },
         {
             ValidTextureOverload::kNumLevelsDepth2dArray,
@@ -902,7 +902,7 @@
             type::TextureDimension::k2dArray,
             TextureDataType::kF32,
             "textureNumLevels",
-            [](ProgramBuilder* b) { return b->ExprList("texture"); },
+            [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
         },
         {
             ValidTextureOverload::kNumLevelsDepthCube,
@@ -912,7 +912,7 @@
             type::TextureDimension::kCube,
             TextureDataType::kF32,
             "textureNumLevels",
-            [](ProgramBuilder* b) { return b->ExprList("texture"); },
+            [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
         },
         {
             ValidTextureOverload::kNumLevelsDepthCubeArray,
@@ -922,7 +922,7 @@
             type::TextureDimension::kCubeArray,
             TextureDataType::kF32,
             "textureNumLevels",
-            [](ProgramBuilder* b) { return b->ExprList("texture"); },
+            [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
         },
         {
             ValidTextureOverload::kNumSamplesMultisampled2d,
@@ -932,7 +932,7 @@
             type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureNumSamples",
-            [](ProgramBuilder* b) { return b->ExprList("texture"); },
+            [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
         },
         {
             ValidTextureOverload::kNumSamplesDepthMultisampled2d,
@@ -942,7 +942,7 @@
             type::TextureDimension::k2d,
             TextureDataType::kF32,
             "textureNumSamples",
-            [](ProgramBuilder* b) { return b->ExprList("texture"); },
+            [](ProgramBuilder* b) { return b->ExprList(kTextureName); },
         },
         {
             ValidTextureOverload::kSample1dF32,
@@ -955,9 +955,9 @@
             TextureDataType::kF32,
             "textureSample",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",  // t
-                                   "sampler",  // s
-                                   1_f);       // coords
+                return b->ExprList(kTextureName,  // t
+                                   kSamplerName,  // s
+                                   1_f);          // coords
             },
         },
         {
@@ -971,8 +971,8 @@
             TextureDataType::kF32,
             "textureSample",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",                // t
-                                   "sampler",                // s
+                return b->ExprList(kTextureName,             // t
+                                   kSamplerName,             // s
                                    b->vec2<f32>(1_f, 2_f));  // coords
             },
         },
@@ -988,8 +988,8 @@
             TextureDataType::kF32,
             "textureSample",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",                // t
-                                   "sampler",                // s
+                return b->ExprList(kTextureName,             // t
+                                   kSamplerName,             // s
                                    b->vec2<f32>(1_f, 2_f),   // coords
                                    b->vec2<i32>(3_i, 4_i));  // offset
             },
@@ -1006,8 +1006,8 @@
             TextureDataType::kF32,
             "textureSample",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",               // t
-                                   "sampler",               // s
+                return b->ExprList(kTextureName,            // t
+                                   kSamplerName,            // s
                                    b->vec2<f32>(1_f, 2_f),  // coords
                                    3_i);                    // array_index
             },
@@ -1025,8 +1025,8 @@
             TextureDataType::kF32,
             "textureSample",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",                // t
-                                   "sampler",                // s
+                return b->ExprList(kTextureName,             // t
+                                   kSamplerName,             // s
                                    b->vec2<f32>(1_f, 2_f),   // coords
                                    3_u,                      // array_index
                                    b->vec2<i32>(4_i, 5_i));  // offset
@@ -1043,8 +1043,8 @@
             TextureDataType::kF32,
             "textureSample",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",                     // t
-                                   "sampler",                     // s
+                return b->ExprList(kTextureName,                  // t
+                                   kSamplerName,                  // s
                                    b->vec3<f32>(1_f, 2_f, 3_f));  // coords
             },
         },
@@ -1060,8 +1060,8 @@
             TextureDataType::kF32,
             "textureSample",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",                     // t
-                                   "sampler",                     // s
+                return b->ExprList(kTextureName,                  // t
+                                   kSamplerName,                  // s
                                    b->vec3<f32>(1_f, 2_f, 3_f),   // coords
                                    b->vec3<i32>(4_i, 5_i, 6_i));  // offset
             },
@@ -1077,8 +1077,8 @@
             TextureDataType::kF32,
             "textureSample",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",                     // t
-                                   "sampler",                     // s
+                return b->ExprList(kTextureName,                  // t
+                                   kSamplerName,                  // s
                                    b->vec3<f32>(1_f, 2_f, 3_f));  // coords
             },
         },
@@ -1094,8 +1094,8 @@
             TextureDataType::kF32,
             "textureSample",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",                    // t
-                                   "sampler",                    // s
+                return b->ExprList(kTextureName,                 // t
+                                   kSamplerName,                 // s
                                    b->vec3<f32>(1_f, 2_f, 3_f),  // coords
                                    4_i);                         // array_index
             },
@@ -1111,8 +1111,8 @@
             TextureDataType::kF32,
             "textureSample",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",                // t
-                                   "sampler",                // s
+                return b->ExprList(kTextureName,             // t
+                                   kSamplerName,             // s
                                    b->vec2<f32>(1_f, 2_f));  // coords
             },
         },
@@ -1128,8 +1128,8 @@
             TextureDataType::kF32,
             "textureSample",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",                // t
-                                   "sampler",                // s
+                return b->ExprList(kTextureName,             // t
+                                   kSamplerName,             // s
                                    b->vec2<f32>(1_f, 2_f),   // coords
                                    b->vec2<i32>(3_i, 4_i));  // offset
             },
@@ -1146,8 +1146,8 @@
             TextureDataType::kF32,
             "textureSample",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",               // t
-                                   "sampler",               // s
+                return b->ExprList(kTextureName,            // t
+                                   kSamplerName,            // s
                                    b->vec2<f32>(1_f, 2_f),  // coords
                                    3_i);                    // array_index
             },
@@ -1165,8 +1165,8 @@
             TextureDataType::kF32,
             "textureSample",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",                // t
-                                   "sampler",                // s
+                return b->ExprList(kTextureName,             // t
+                                   kSamplerName,             // s
                                    b->vec2<f32>(1_f, 2_f),   // coords
                                    3_i,                      // array_index
                                    b->vec2<i32>(4_i, 5_i));  // offset
@@ -1183,8 +1183,8 @@
             TextureDataType::kF32,
             "textureSample",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",                     // t
-                                   "sampler",                     // s
+                return b->ExprList(kTextureName,                  // t
+                                   kSamplerName,                  // s
                                    b->vec3<f32>(1_f, 2_f, 3_f));  // coords
             },
         },
@@ -1200,8 +1200,8 @@
             TextureDataType::kF32,
             "textureSample",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",                    // t
-                                   "sampler",                    // s
+                return b->ExprList(kTextureName,                 // t
+                                   kSamplerName,                 // s
                                    b->vec3<f32>(1_f, 2_f, 3_f),  // coords
                                    4_u);                         // array_index
             },
@@ -1218,8 +1218,8 @@
             TextureDataType::kF32,
             "textureSampleBias",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",               // t
-                                   "sampler",               // s
+                return b->ExprList(kTextureName,            // t
+                                   kSamplerName,            // s
                                    b->vec2<f32>(1_f, 2_f),  // coords
                                    3_f);                    // bias
             },
@@ -1237,8 +1237,8 @@
             TextureDataType::kF32,
             "textureSampleBias",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",                // t
-                                   "sampler",                // s
+                return b->ExprList(kTextureName,             // t
+                                   kSamplerName,             // s
                                    b->vec2<f32>(1_f, 2_f),   // coords
                                    3_f,                      // bias
                                    b->vec2<i32>(4_i, 5_i));  // offset
@@ -1257,8 +1257,8 @@
             TextureDataType::kF32,
             "textureSampleBias",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",               // t
-                                   "sampler",               // s
+                return b->ExprList(kTextureName,            // t
+                                   kSamplerName,            // s
                                    b->vec2<f32>(1_f, 2_f),  // coords
                                    4_u,                     // array_index
                                    3_f);                    // bias
@@ -1278,8 +1278,8 @@
             TextureDataType::kF32,
             "textureSampleBias",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",                // t
-                                   "sampler",                // s
+                return b->ExprList(kTextureName,             // t
+                                   kSamplerName,             // s
                                    b->vec2<f32>(1_f, 2_f),   // coords
                                    3_i,                      // array_index
                                    4_f,                      // bias
@@ -1298,8 +1298,8 @@
             TextureDataType::kF32,
             "textureSampleBias",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",                    // t
-                                   "sampler",                    // s
+                return b->ExprList(kTextureName,                 // t
+                                   kSamplerName,                 // s
                                    b->vec3<f32>(1_f, 2_f, 3_f),  // coords
                                    4_f);                         // bias
             },
@@ -1317,8 +1317,8 @@
             TextureDataType::kF32,
             "textureSampleBias",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",                     // t
-                                   "sampler",                     // s
+                return b->ExprList(kTextureName,                  // t
+                                   kSamplerName,                  // s
                                    b->vec3<f32>(1_f, 2_f, 3_f),   // coords
                                    4_f,                           // bias
                                    b->vec3<i32>(5_i, 6_i, 7_i));  // offset
@@ -1336,8 +1336,8 @@
             TextureDataType::kF32,
             "textureSampleBias",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",                    // t
-                                   "sampler",                    // s
+                return b->ExprList(kTextureName,                 // t
+                                   kSamplerName,                 // s
                                    b->vec3<f32>(1_f, 2_f, 3_f),  // coords
                                    4_f);                         // bias
             },
@@ -1355,8 +1355,8 @@
             TextureDataType::kF32,
             "textureSampleBias",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",                    // t
-                                   "sampler",                    // s
+                return b->ExprList(kTextureName,                 // t
+                                   kSamplerName,                 // s
                                    b->vec3<f32>(1_f, 2_f, 3_f),  // coords
                                    3_i,                          // array_index
                                    4_f);                         // bias
@@ -1374,8 +1374,8 @@
             TextureDataType::kF32,
             "textureSampleLevel",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",               // t
-                                   "sampler",               // s
+                return b->ExprList(kTextureName,            // t
+                                   kSamplerName,            // s
                                    b->vec2<f32>(1_f, 2_f),  // coords
                                    3_f);                    // level
             },
@@ -1393,8 +1393,8 @@
             TextureDataType::kF32,
             "textureSampleLevel",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",                // t
-                                   "sampler",                // s
+                return b->ExprList(kTextureName,             // t
+                                   kSamplerName,             // s
                                    b->vec2<f32>(1_f, 2_f),   // coords
                                    3_f,                      // level
                                    b->vec2<i32>(4_i, 5_i));  // offset
@@ -1413,8 +1413,8 @@
             TextureDataType::kF32,
             "textureSampleLevel",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",               // t
-                                   "sampler",               // s
+                return b->ExprList(kTextureName,            // t
+                                   kSamplerName,            // s
                                    b->vec2<f32>(1_f, 2_f),  // coords
                                    3_i,                     // array_index
                                    4_f);                    // level
@@ -1434,8 +1434,8 @@
             TextureDataType::kF32,
             "textureSampleLevel",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",                // t
-                                   "sampler",                // s
+                return b->ExprList(kTextureName,             // t
+                                   kSamplerName,             // s
                                    b->vec2<f32>(1_f, 2_f),   // coords
                                    3_i,                      // array_index
                                    4_f,                      // level
@@ -1454,8 +1454,8 @@
             TextureDataType::kF32,
             "textureSampleLevel",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",                    // t
-                                   "sampler",                    // s
+                return b->ExprList(kTextureName,                 // t
+                                   kSamplerName,                 // s
                                    b->vec3<f32>(1_f, 2_f, 3_f),  // coords
                                    4_f);                         // level
             },
@@ -1473,8 +1473,8 @@
             TextureDataType::kF32,
             "textureSampleLevel",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",                     // t
-                                   "sampler",                     // s
+                return b->ExprList(kTextureName,                  // t
+                                   kSamplerName,                  // s
                                    b->vec3<f32>(1_f, 2_f, 3_f),   // coords
                                    4_f,                           // level
                                    b->vec3<i32>(5_i, 6_i, 7_i));  // offset
@@ -1492,8 +1492,8 @@
             TextureDataType::kF32,
             "textureSampleLevel",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",                    // t
-                                   "sampler",                    // s
+                return b->ExprList(kTextureName,                 // t
+                                   kSamplerName,                 // s
                                    b->vec3<f32>(1_f, 2_f, 3_f),  // coords
                                    4_f);                         // level
             },
@@ -1511,8 +1511,8 @@
             TextureDataType::kF32,
             "textureSampleLevel",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",                    // t
-                                   "sampler",                    // s
+                return b->ExprList(kTextureName,                 // t
+                                   kSamplerName,                 // s
                                    b->vec3<f32>(1_f, 2_f, 3_f),  // coords
                                    4_i,                          // array_index
                                    5_f);                         // level
@@ -1530,8 +1530,8 @@
             TextureDataType::kF32,
             "textureSampleLevel",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",               // t
-                                   "sampler",               // s
+                return b->ExprList(kTextureName,            // t
+                                   kSamplerName,            // s
                                    b->vec2<f32>(1_f, 2_f),  // coords
                                    3_u);                    // level
             },
@@ -1549,8 +1549,8 @@
             TextureDataType::kF32,
             "textureSampleLevel",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",                // t
-                                   "sampler",                // s
+                return b->ExprList(kTextureName,             // t
+                                   kSamplerName,             // s
                                    b->vec2<f32>(1_f, 2_f),   // coords
                                    3_i,                      // level
                                    b->vec2<i32>(4_i, 5_i));  // offset
@@ -1569,8 +1569,8 @@
             TextureDataType::kF32,
             "textureSampleLevel",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",               // t
-                                   "sampler",               // s
+                return b->ExprList(kTextureName,            // t
+                                   kSamplerName,            // s
                                    b->vec2<f32>(1_f, 2_f),  // coords
                                    3_u,                     // array_index
                                    4_u);                    // level
@@ -1590,8 +1590,8 @@
             TextureDataType::kF32,
             "textureSampleLevel",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",                // t
-                                   "sampler",                // s
+                return b->ExprList(kTextureName,             // t
+                                   kSamplerName,             // s
                                    b->vec2<f32>(1_f, 2_f),   // coords
                                    3_u,                      // array_index
                                    4_u,                      // level
@@ -1610,8 +1610,8 @@
             TextureDataType::kF32,
             "textureSampleLevel",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",                    // t
-                                   "sampler",                    // s
+                return b->ExprList(kTextureName,                 // t
+                                   kSamplerName,                 // s
                                    b->vec3<f32>(1_f, 2_f, 3_f),  // coords
                                    4_i);                         // level
             },
@@ -1629,8 +1629,8 @@
             TextureDataType::kF32,
             "textureSampleLevel",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",                    // t
-                                   "sampler",                    // s
+                return b->ExprList(kTextureName,                 // t
+                                   kSamplerName,                 // s
                                    b->vec3<f32>(1_f, 2_f, 3_f),  // coords
                                    4_i,                          // array_index
                                    5_i);                         // level
@@ -1649,8 +1649,8 @@
             TextureDataType::kF32,
             "textureSampleGrad",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",                // t
-                                   "sampler",                // s
+                return b->ExprList(kTextureName,             // t
+                                   kSamplerName,             // s
                                    b->vec2<f32>(1_f, 2_f),   // coords
                                    b->vec2<f32>(3_f, 4_f),   // ddx
                                    b->vec2<f32>(5_f, 6_f));  // ddy
@@ -1670,8 +1670,8 @@
             TextureDataType::kF32,
             "textureSampleGrad",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",                // t
-                                   "sampler",                // s
+                return b->ExprList(kTextureName,             // t
+                                   kSamplerName,             // s
                                    b->vec2<f32>(1_f, 2_f),   // coords
                                    b->vec2<f32>(3_f, 4_f),   // ddx
                                    b->vec2<f32>(5_f, 6_f),   // ddy
@@ -1692,8 +1692,8 @@
             TextureDataType::kF32,
             "textureSampleGrad",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",                // t
-                                   "sampler",                // s
+                return b->ExprList(kTextureName,             // t
+                                   kSamplerName,             // s
                                    b->vec2<f32>(1_f, 2_f),   // coords
                                    3_i,                      // array_index
                                    b->vec2<f32>(4_f, 5_f),   // ddx
@@ -1715,8 +1715,8 @@
             TextureDataType::kF32,
             "textureSampleGrad",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",                // t
-                                   "sampler",                // s
+                return b->ExprList(kTextureName,             // t
+                                   kSamplerName,             // s
                                    b->vec2<f32>(1_f, 2_f),   // coords
                                    3_u,                      // array_index
                                    b->vec2<f32>(4_f, 5_f),   // ddx
@@ -1737,8 +1737,8 @@
             TextureDataType::kF32,
             "textureSampleGrad",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",                     // t
-                                   "sampler",                     // s
+                return b->ExprList(kTextureName,                  // t
+                                   kSamplerName,                  // s
                                    b->vec3<f32>(1_f, 2_f, 3_f),   // coords
                                    b->vec3<f32>(4_f, 5_f, 6_f),   // ddx
                                    b->vec3<f32>(7_f, 8_f, 9_f));  // ddy
@@ -1758,8 +1758,8 @@
             TextureDataType::kF32,
             "textureSampleGrad",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",                     // t
-                                   "sampler",                     // s
+                return b->ExprList(kTextureName,                  // t
+                                   kSamplerName,                  // s
                                    b->vec3<f32>(1_f, 2_f, 3_f),   // coords
                                    b->vec3<f32>(4_f, 5_f, 6_f),   // ddx
                                    b->vec3<f32>(7_f, 8_f, 9_f),   // ddy
@@ -1779,8 +1779,8 @@
             TextureDataType::kF32,
             "textureSampleGrad",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",                     // t
-                                   "sampler",                     // s
+                return b->ExprList(kTextureName,                  // t
+                                   kSamplerName,                  // s
                                    b->vec3<f32>(1_f, 2_f, 3_f),   // coords
                                    b->vec3<f32>(4_f, 5_f, 6_f),   // ddx
                                    b->vec3<f32>(7_f, 8_f, 9_f));  // ddy
@@ -1800,8 +1800,8 @@
             TextureDataType::kF32,
             "textureSampleGrad",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",                      // t
-                                   "sampler",                      // s
+                return b->ExprList(kTextureName,                   // t
+                                   kSamplerName,                   // s
                                    b->vec3<f32>(1_f, 2_f, 3_f),    // coords
                                    4_u,                            // array_index
                                    b->vec3<f32>(5_f, 6_f, 7_f),    // ddx
@@ -1820,8 +1820,8 @@
             TextureDataType::kF32,
             "textureSampleCompare",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",               // t
-                                   "sampler",               // s
+                return b->ExprList(kTextureName,            // t
+                                   kSamplerName,            // s
                                    b->vec2<f32>(1_f, 2_f),  // coords
                                    3_f);                    // depth_ref
             },
@@ -1839,8 +1839,8 @@
             TextureDataType::kF32,
             "textureSampleCompare",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",                // t
-                                   "sampler",                // s
+                return b->ExprList(kTextureName,             // t
+                                   kSamplerName,             // s
                                    b->vec2<f32>(1_f, 2_f),   // coords
                                    3_f,                      // depth_ref
                                    b->vec2<i32>(4_i, 5_i));  // offset
@@ -1859,8 +1859,8 @@
             TextureDataType::kF32,
             "textureSampleCompare",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",               // t
-                                   "sampler",               // s
+                return b->ExprList(kTextureName,            // t
+                                   kSamplerName,            // s
                                    b->vec2<f32>(1_f, 2_f),  // coords
                                    4_i,                     // array_index
                                    3_f);                    // depth_ref
@@ -1880,8 +1880,8 @@
             TextureDataType::kF32,
             "textureSampleCompare",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",                // t
-                                   "sampler",                // s
+                return b->ExprList(kTextureName,             // t
+                                   kSamplerName,             // s
                                    b->vec2<f32>(1_f, 2_f),   // coords
                                    4_u,                      // array_index
                                    3_f,                      // depth_ref
@@ -1900,8 +1900,8 @@
             TextureDataType::kF32,
             "textureSampleCompare",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",                    // t
-                                   "sampler",                    // s
+                return b->ExprList(kTextureName,                 // t
+                                   kSamplerName,                 // s
                                    b->vec3<f32>(1_f, 2_f, 3_f),  // coords
                                    4_f);                         // depth_ref
             },
@@ -1919,8 +1919,8 @@
             TextureDataType::kF32,
             "textureSampleCompare",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",                    // t
-                                   "sampler",                    // s
+                return b->ExprList(kTextureName,                 // t
+                                   kSamplerName,                 // s
                                    b->vec3<f32>(1_f, 2_f, 3_f),  // coords
                                    4_i,                          // array_index
                                    5_f);                         // depth_ref
@@ -1938,8 +1938,8 @@
             TextureDataType::kF32,
             "textureSampleCompareLevel",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",               // t
-                                   "sampler",               // s
+                return b->ExprList(kTextureName,            // t
+                                   kSamplerName,            // s
                                    b->vec2<f32>(1_f, 2_f),  // coords
                                    3_f);                    // depth_ref
             },
@@ -1957,8 +1957,8 @@
             TextureDataType::kF32,
             "textureSampleCompareLevel",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",                // t
-                                   "sampler",                // s
+                return b->ExprList(kTextureName,             // t
+                                   kSamplerName,             // s
                                    b->vec2<f32>(1_f, 2_f),   // coords
                                    3_f,                      // depth_ref
                                    b->vec2<i32>(4_i, 5_i));  // offset
@@ -1977,8 +1977,8 @@
             TextureDataType::kF32,
             "textureSampleCompareLevel",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",               // t
-                                   "sampler",               // s
+                return b->ExprList(kTextureName,            // t
+                                   kSamplerName,            // s
                                    b->vec2<f32>(1_f, 2_f),  // coords
                                    3_i,                     // array_index
                                    4_f);                    // depth_ref
@@ -1998,8 +1998,8 @@
             TextureDataType::kF32,
             "textureSampleCompareLevel",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",                // t
-                                   "sampler",                // s
+                return b->ExprList(kTextureName,             // t
+                                   kSamplerName,             // s
                                    b->vec2<f32>(1_f, 2_f),   // coords
                                    3_i,                      // array_index
                                    4_f,                      // depth_ref
@@ -2018,8 +2018,8 @@
             TextureDataType::kF32,
             "textureSampleCompareLevel",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",                    // t
-                                   "sampler",                    // s
+                return b->ExprList(kTextureName,                 // t
+                                   kSamplerName,                 // s
                                    b->vec3<f32>(1_f, 2_f, 3_f),  // coords
                                    4_f);                         // depth_ref
             },
@@ -2037,8 +2037,8 @@
             TextureDataType::kF32,
             "textureSampleCompareLevel",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",                    // t
-                                   "sampler",                    // s
+                return b->ExprList(kTextureName,                 // t
+                                   kSamplerName,                 // s
                                    b->vec3<f32>(1_f, 2_f, 3_f),  // coords
                                    4_i,                          // array_index
                                    5_f);                         // depth_ref
@@ -2054,9 +2054,9 @@
             TextureDataType::kF32,
             "textureLoad",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",  // t
-                                   1_u,        // coords
-                                   3_u);       // level
+                return b->ExprList(kTextureName,  // t
+                                   1_u,           // coords
+                                   3_u);          // level
             },
         },
         {
@@ -2069,9 +2069,9 @@
             TextureDataType::kU32,
             "textureLoad",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",  // t
-                                   1_i,        // coords
-                                   3_i);       // level
+                return b->ExprList(kTextureName,  // t
+                                   1_i,           // coords
+                                   3_i);          // level
             },
         },
         {
@@ -2084,9 +2084,9 @@
             TextureDataType::kI32,
             "textureLoad",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",  // t
-                                   1_i,        // coords
-                                   3_i);       // level
+                return b->ExprList(kTextureName,  // t
+                                   1_i,           // coords
+                                   3_i);          // level
             },
         },
         {
@@ -2099,7 +2099,7 @@
             TextureDataType::kF32,
             "textureLoad",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",               // t
+                return b->ExprList(kTextureName,            // t
                                    b->vec2<u32>(1_u, 2_u),  // coords
                                    3_u);                    // level
             },
@@ -2114,7 +2114,7 @@
             TextureDataType::kU32,
             "textureLoad",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",               // t
+                return b->ExprList(kTextureName,            // t
                                    b->vec2<i32>(1_i, 2_i),  // coords
                                    3_i);                    // level
             },
@@ -2129,7 +2129,7 @@
             TextureDataType::kI32,
             "textureLoad",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",               // t
+                return b->ExprList(kTextureName,            // t
                                    b->vec2<u32>(1_u, 2_u),  // coords
                                    3_u);                    // level
             },
@@ -2145,7 +2145,7 @@
             TextureDataType::kF32,
             "textureLoad",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",               // t
+                return b->ExprList(kTextureName,            // t
                                    b->vec2<i32>(1_i, 2_i),  // coords
                                    3_i,                     // array_index
                                    4_i);                    // level
@@ -2162,7 +2162,7 @@
             TextureDataType::kU32,
             "textureLoad",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",               // t
+                return b->ExprList(kTextureName,            // t
                                    b->vec2<i32>(1_i, 2_i),  // coords
                                    3_i,                     // array_index
                                    4_i);                    // level
@@ -2179,7 +2179,7 @@
             TextureDataType::kI32,
             "textureLoad",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",               // t
+                return b->ExprList(kTextureName,            // t
                                    b->vec2<u32>(1_u, 2_u),  // coords
                                    3_u,                     // array_index
                                    4_u);                    // level
@@ -2195,7 +2195,7 @@
             TextureDataType::kF32,
             "textureLoad",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",                    // t
+                return b->ExprList(kTextureName,                 // t
                                    b->vec3<i32>(1_i, 2_i, 3_i),  // coords
                                    4_i);                         // level
             },
@@ -2210,7 +2210,7 @@
             TextureDataType::kU32,
             "textureLoad",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",                    // t
+                return b->ExprList(kTextureName,                 // t
                                    b->vec3<i32>(1_i, 2_i, 3_i),  // coords
                                    4_i);                         // level
             },
@@ -2225,7 +2225,7 @@
             TextureDataType::kI32,
             "textureLoad",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",                    // t
+                return b->ExprList(kTextureName,                 // t
                                    b->vec3<u32>(1_u, 2_u, 3_u),  // coords
                                    4_u);                         // level
             },
@@ -2240,7 +2240,7 @@
             TextureDataType::kF32,
             "textureLoad",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",               // t
+                return b->ExprList(kTextureName,            // t
                                    b->vec2<i32>(1_i, 2_i),  // coords
                                    3_i);                    // sample_index
             },
@@ -2255,7 +2255,7 @@
             TextureDataType::kU32,
             "textureLoad",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",               // t
+                return b->ExprList(kTextureName,            // t
                                    b->vec2<i32>(1_i, 2_i),  // coords
                                    3_i);                    // sample_index
             },
@@ -2270,7 +2270,7 @@
             TextureDataType::kI32,
             "textureLoad",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",               // t
+                return b->ExprList(kTextureName,            // t
                                    b->vec2<u32>(1_u, 2_u),  // coords
                                    3_u);                    // sample_index
             },
@@ -2285,7 +2285,7 @@
             TextureDataType::kF32,
             "textureLoad",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",               // t
+                return b->ExprList(kTextureName,            // t
                                    b->vec2<i32>(1_i, 2_i),  // coords
                                    3_i);                    // level
             },
@@ -2301,7 +2301,7 @@
             TextureDataType::kF32,
             "textureLoad",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",               // t
+                return b->ExprList(kTextureName,            // t
                                    b->vec2<u32>(1_u, 2_u),  // coords
                                    3_u,                     // array_index
                                    4_u);                    // level
@@ -2317,7 +2317,7 @@
             TextureDataType::kF32,
             "textureLoad",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",               // t
+                return b->ExprList(kTextureName,            // t
                                    b->vec2<u32>(1_u, 2_u),  // coords
                                    3_u);                    // sample_index
             },
@@ -2333,7 +2333,7 @@
             TextureDataType::kF32,
             "textureStore",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",                          // t
+                return b->ExprList(kTextureName,                       // t
                                    1_i,                                // coords
                                    b->vec4<f32>(2_f, 3_f, 4_f, 5_f));  // value
             },
@@ -2349,7 +2349,7 @@
             TextureDataType::kF32,
             "textureStore",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",                          // t
+                return b->ExprList(kTextureName,                       // t
                                    b->vec2<i32>(1_i, 2_i),             // coords
                                    b->vec4<f32>(3_f, 4_f, 5_f, 6_f));  // value
             },
@@ -2366,7 +2366,7 @@
             TextureDataType::kF32,
             "textureStore",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",                          // t
+                return b->ExprList(kTextureName,                       // t
                                    b->vec2<u32>(1_u, 2_u),             // coords
                                    3_u,                                // array_index
                                    b->vec4<f32>(4_f, 5_f, 6_f, 7_f));  // value
@@ -2383,7 +2383,7 @@
             TextureDataType::kF32,
             "textureStore",
             [](ProgramBuilder* b) {
-                return b->ExprList("texture",                          // t
+                return b->ExprList(kTextureName,                       // t
                                    b->vec3<u32>(1_u, 2_u, 3_u),        // coords
                                    b->vec4<f32>(4_f, 5_f, 6_f, 7_f));  // value
             },
diff --git a/src/tint/ast/builtin_texture_helper_test.h b/src/tint/ast/builtin_texture_helper_test.h
index 7391e8c..7130b9a 100644
--- a/src/tint/ast/builtin_texture_helper_test.h
+++ b/src/tint/ast/builtin_texture_helper_test.h
@@ -24,6 +24,12 @@
 
 namespace tint::ast::builtin::test {
 
+/// The name of the texture global variable used by the tests.
+static constexpr const char* kTextureName = "Texture";
+
+/// The name of the sampler global variable used by the tests.
+static constexpr const char* kSamplerName = "Sampler";
+
 enum class TextureKind { kRegular, kDepth, kDepthMultisampled, kMultisampled, kStorage };
 enum class TextureDataType { kF32, kU32, kI32 };
 
diff --git a/src/tint/ast/builtin_value_bench.cc b/src/tint/ast/builtin_value_bench.cc
index b323b6b..879b0a5 100644
--- a/src/tint/ast/builtin_value_bench.cc
+++ b/src/tint/ast/builtin_value_bench.cc
@@ -30,7 +30,7 @@
 namespace {
 
 void BuiltinValueParser(::benchmark::State& state) {
-    std::array kStrings{
+    const char* kStrings[] = {
         "fragdeccth",
         "flaget3",
         "fVag_depth",
@@ -117,7 +117,7 @@
         "hrkgYooup_d",
     };
     for (auto _ : state) {
-        for (auto& str : kStrings) {
+        for (auto* str : kStrings) {
             auto result = ParseBuiltinValue(str);
             benchmark::DoNotOptimize(result);
         }
diff --git a/src/tint/ast/diagnostic_control_bench.cc b/src/tint/ast/diagnostic_control_bench.cc
index faf354e..6fb5014 100644
--- a/src/tint/ast/diagnostic_control_bench.cc
+++ b/src/tint/ast/diagnostic_control_bench.cc
@@ -30,14 +30,14 @@
 namespace {
 
 void DiagnosticSeverityParser(::benchmark::State& state) {
-    std::array kStrings{
+    const char* kStrings[] = {
         "erccr",    "3o",        "eVror",   "error",   "erro1",  "qqrJr",  "errll7r",
         "ppqnfH",   "c",         "iGf",     "info",    "invii",  "inWWo",  "Mxxo",
         "ogg",      "X",         "3ff",     "off",     "oEf",    "oPTT",   "dxxf",
         "w44rning", "waSSniVVg", "RarR22g", "warning", "wFni9g", "waring", "VOORRHng",
     };
     for (auto _ : state) {
-        for (auto& str : kStrings) {
+        for (auto* str : kStrings) {
             auto result = ParseDiagnosticSeverity(str);
             benchmark::DoNotOptimize(result);
         }
@@ -47,7 +47,7 @@
 BENCHMARK(DiagnosticSeverityParser);
 
 void DiagnosticRuleParser(::benchmark::State& state) {
-    std::array kStrings{
+    const char* kStrings[] = {
         "hromium_unyeachable_code",   "chrorrillmGunnreachable_c77de", "chromium_unreachable4cod00",
         "chromium_unreachable_code",  "chromium_unracaboo_code",       "chromium_unrzzchabl_code",
         "ciipp11ium_unreachable_cod", "derivXXtive_uniformity",        "55erivativeIIunifonn99ity",
@@ -55,7 +55,7 @@
         "jerivaive_uniforRgty",       "derivatbve_unformiy",
     };
     for (auto _ : state) {
-        for (auto& str : kStrings) {
+        for (auto* str : kStrings) {
             auto result = ParseDiagnosticRule(str);
             benchmark::DoNotOptimize(result);
         }
diff --git a/src/tint/ast/extension_bench.cc b/src/tint/ast/extension_bench.cc
index 5f175cc..3bf35f6 100644
--- a/src/tint/ast/extension_bench.cc
+++ b/src/tint/ast/extension_bench.cc
@@ -30,7 +30,7 @@
 namespace {
 
 void ExtensionParser(::benchmark::State& state) {
-    std::array kStrings{
+    const char* kStrings[] = {
         "chromium_disableuniformiccy_analysis",
         "chromil3_disable_unifority_analss",
         "chromium_disable_Vniformity_analysis",
@@ -68,7 +68,7 @@
         "f",
     };
     for (auto _ : state) {
-        for (auto& str : kStrings) {
+        for (auto* str : kStrings) {
             auto result = ParseExtension(str);
             benchmark::DoNotOptimize(result);
         }
diff --git a/src/tint/ast/interpolate_attribute_bench.cc b/src/tint/ast/interpolate_attribute_bench.cc
index 6382139..722cb06 100644
--- a/src/tint/ast/interpolate_attribute_bench.cc
+++ b/src/tint/ast/interpolate_attribute_bench.cc
@@ -30,7 +30,7 @@
 namespace {
 
 void InterpolationTypeParser(::benchmark::State& state) {
-    std::array kStrings{
+    const char* kStrings[] = {
         "ccat",         "3",           "fVat",        "flat",        "1lat",
         "fqaJ",         "flla77",      "lippeHHr",    "cin",         "lbGea",
         "linear",       "liveaii",     "liWWe8r",     "xxiner",      "perggpctXve",
@@ -38,7 +38,7 @@
         "pxxdrspectve",
     };
     for (auto _ : state) {
-        for (auto& str : kStrings) {
+        for (auto* str : kStrings) {
             auto result = ParseInterpolationType(str);
             benchmark::DoNotOptimize(result);
         }
@@ -48,13 +48,13 @@
 BENCHMARK(InterpolationTypeParser);
 
 void InterpolationSamplingParser(::benchmark::State& state) {
-    std::array kStrings{
+    const char* kStrings[] = {
         "44enter", "cSSVVter",     "centRr",     "center",   "ent9r",  "cente",   "VentORr",
         "cenyroi", "77errtrllnid", "04entroid",  "centroid", "enooid", "centzzd", "ceiippr1i",
         "saXXple", "55IImpnn99",   "aHHrrmplSS", "sample",   "kkle",   "jagRR",   "smbe",
     };
     for (auto _ : state) {
-        for (auto& str : kStrings) {
+        for (auto* str : kStrings) {
             auto result = ParseInterpolationSampling(str);
             benchmark::DoNotOptimize(result);
         }
diff --git a/src/tint/ast/matrix_test.cc b/src/tint/ast/matrix_test.cc
index 5d58294..2199f78 100644
--- a/src/tint/ast/matrix_test.cc
+++ b/src/tint/ast/matrix_test.cc
@@ -16,7 +16,6 @@
 #include "src/tint/ast/alias.h"
 #include "src/tint/ast/array.h"
 #include "src/tint/ast/pointer.h"
-#include "src/tint/ast/sampler.h"
 #include "src/tint/ast/struct.h"
 #include "src/tint/ast/test_helper.h"
 #include "src/tint/ast/texture.h"
diff --git a/src/tint/ast/multisampled_texture_test.cc b/src/tint/ast/multisampled_texture_test.cc
index 1bf0187..adcb790 100644
--- a/src/tint/ast/multisampled_texture_test.cc
+++ b/src/tint/ast/multisampled_texture_test.cc
@@ -20,7 +20,6 @@
 #include "src/tint/ast/matrix.h"
 #include "src/tint/ast/pointer.h"
 #include "src/tint/ast/sampled_texture.h"
-#include "src/tint/ast/sampler.h"
 #include "src/tint/ast/storage_texture.h"
 #include "src/tint/ast/struct.h"
 #include "src/tint/ast/test_helper.h"
diff --git a/src/tint/ast/sampler.cc b/src/tint/ast/sampler.cc
deleted file mode 100644
index 28bba36..0000000
--- a/src/tint/ast/sampler.cc
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2020 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.
-
-#include "src/tint/ast/sampler.h"
-
-#include "src/tint/program_builder.h"
-
-TINT_INSTANTIATE_TYPEINFO(tint::ast::Sampler);
-
-namespace tint::ast {
-
-Sampler::Sampler(ProgramID pid, NodeID nid, const Source& src, type::SamplerKind k)
-    : Base(pid, nid, src), kind(k) {}
-
-Sampler::Sampler(Sampler&&) = default;
-
-Sampler::~Sampler() = default;
-
-std::string Sampler::FriendlyName(const SymbolTable&) const {
-    return kind == type::SamplerKind::kSampler ? "sampler" : "sampler_comparison";
-}
-
-const Sampler* Sampler::Clone(CloneContext* ctx) const {
-    auto src = ctx->Clone(source);
-    return ctx->dst->create<Sampler>(src, kind);
-}
-
-}  // namespace tint::ast
diff --git a/src/tint/ast/sampler.h b/src/tint/ast/sampler.h
deleted file mode 100644
index 4227612..0000000
--- a/src/tint/ast/sampler.h
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2020 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.
-
-#ifndef SRC_TINT_AST_SAMPLER_H_
-#define SRC_TINT_AST_SAMPLER_H_
-
-#include <string>
-
-#include "src/tint/ast/type.h"
-#include "src/tint/type/sampler_kind.h"
-
-namespace tint::ast {
-
-/// A sampler type.
-class Sampler final : public Castable<Sampler, Type> {
-  public:
-    /// Constructor
-    /// @param pid the identifier of the program that owns this node
-    /// @param nid the unique node identifier
-    /// @param src the source of this node
-    /// @param kind the kind of sampler
-    Sampler(ProgramID pid, NodeID nid, const Source& src, type::SamplerKind kind);
-    /// Move constructor
-    Sampler(Sampler&&);
-    ~Sampler() override;
-
-    /// @returns true if this is a comparison sampler
-    bool IsComparison() const { return kind == type::SamplerKind::kComparisonSampler; }
-
-    /// @param symbols the program's symbol table
-    /// @returns the name for this type that closely resembles how it would be
-    /// declared in WGSL.
-    std::string FriendlyName(const SymbolTable& symbols) const override;
-
-    /// Clones this type and all transitive types using the `CloneContext` `ctx`.
-    /// @param ctx the clone context
-    /// @return the newly cloned type
-    const Sampler* Clone(CloneContext* ctx) const override;
-
-    /// The sampler type
-    const type::SamplerKind kind;
-};
-
-}  // namespace tint::ast
-
-#endif  // SRC_TINT_AST_SAMPLER_H_
diff --git a/src/tint/ast/sampler_test.cc b/src/tint/ast/sampler_test.cc
deleted file mode 100644
index a9d5103..0000000
--- a/src/tint/ast/sampler_test.cc
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2020 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.
-
-#include "src/tint/ast/sampler.h"
-
-#include "src/tint/ast/test_helper.h"
-
-namespace tint::ast {
-namespace {
-
-using AstSamplerTest = TestHelper;
-
-TEST_F(AstSamplerTest, Creation) {
-    auto* s = create<Sampler>(type::SamplerKind::kSampler);
-    EXPECT_EQ(s->kind, type::SamplerKind::kSampler);
-}
-
-TEST_F(AstSamplerTest, Creation_ComparisonSampler) {
-    auto* s = create<Sampler>(type::SamplerKind::kComparisonSampler);
-    EXPECT_EQ(s->kind, type::SamplerKind::kComparisonSampler);
-    EXPECT_TRUE(s->IsComparison());
-}
-
-TEST_F(AstSamplerTest, FriendlyNameSampler) {
-    auto* s = create<Sampler>(type::SamplerKind::kSampler);
-    EXPECT_EQ(s->FriendlyName(Symbols()), "sampler");
-}
-
-TEST_F(AstSamplerTest, FriendlyNameComparisonSampler) {
-    auto* s = create<Sampler>(type::SamplerKind::kComparisonSampler);
-    EXPECT_EQ(s->FriendlyName(Symbols()), "sampler_comparison");
-}
-
-}  // namespace
-}  // namespace tint::ast
diff --git a/src/tint/ast/struct_test.cc b/src/tint/ast/struct_test.cc
index ac73b03..072a197 100644
--- a/src/tint/ast/struct_test.cc
+++ b/src/tint/ast/struct_test.cc
@@ -18,7 +18,6 @@
 #include "src/tint/ast/array.h"
 #include "src/tint/ast/matrix.h"
 #include "src/tint/ast/pointer.h"
-#include "src/tint/ast/sampler.h"
 #include "src/tint/ast/test_helper.h"
 #include "src/tint/ast/texture.h"
 #include "src/tint/ast/vector.h"
diff --git a/src/tint/ast/texture_test.cc b/src/tint/ast/texture_test.cc
index 9c19963..e1cd4f6 100644
--- a/src/tint/ast/texture_test.cc
+++ b/src/tint/ast/texture_test.cc
@@ -18,7 +18,6 @@
 #include "src/tint/ast/array.h"
 #include "src/tint/ast/matrix.h"
 #include "src/tint/ast/pointer.h"
-#include "src/tint/ast/sampler.h"
 #include "src/tint/ast/struct.h"
 #include "src/tint/ast/test_helper.h"
 #include "src/tint/ast/vector.h"
diff --git a/src/tint/ast/type.cc b/src/tint/ast/type.cc
index cc6c4d8..6408596 100644
--- a/src/tint/ast/type.cc
+++ b/src/tint/ast/type.cc
@@ -17,7 +17,6 @@
 #include "src/tint/ast/alias.h"
 #include "src/tint/ast/matrix.h"
 #include "src/tint/ast/pointer.h"
-#include "src/tint/ast/sampler.h"
 #include "src/tint/ast/texture.h"
 #include "src/tint/ast/vector.h"
 #include "src/tint/symbol_table.h"
diff --git a/src/tint/inspector/test_inspector_builder.cc b/src/tint/inspector/test_inspector_builder.cc
index 96139e2..677f9c1 100644
--- a/src/tint/inspector/test_inspector_builder.cc
+++ b/src/tint/inspector/test_inspector_builder.cc
@@ -171,13 +171,15 @@
 }
 
 void InspectorBuilder::AddSampler(const std::string& name, uint32_t group, uint32_t binding) {
-    GlobalVar(name, sampler_type(), Binding(AInt(binding)), Group(AInt(group)));
+    GlobalVar(name, ty.sampler(type::SamplerKind::kSampler), Binding(AInt(binding)),
+              Group(AInt(group)));
 }
 
 void InspectorBuilder::AddComparisonSampler(const std::string& name,
                                             uint32_t group,
                                             uint32_t binding) {
-    GlobalVar(name, comparison_sampler_type(), Binding(AInt(binding)), Group(AInt(group)));
+    GlobalVar(name, ty.sampler(type::SamplerKind::kComparisonSampler), Binding(AInt(binding)),
+              Group(AInt(group)));
 }
 
 void InspectorBuilder::AddResource(const std::string& name,
diff --git a/src/tint/inspector/test_inspector_builder.h b/src/tint/inspector/test_inspector_builder.h
index 03d2727..8b32529 100644
--- a/src/tint/inspector/test_inspector_builder.h
+++ b/src/tint/inspector/test_inspector_builder.h
@@ -332,14 +332,6 @@
     /// @returns a reference to the Inspector for the built Program.
     Inspector& Build();
 
-    /// @returns the type for a SamplerKind::kSampler
-    const ast::Sampler* sampler_type() { return ty.sampler(type::SamplerKind::kSampler); }
-
-    /// @returns the type for a SamplerKind::kComparison
-    const ast::Sampler* comparison_sampler_type() {
-        return ty.sampler(type::SamplerKind::kComparisonSampler);
-    }
-
   protected:
     /// Program built by this builder.
     std::unique_ptr<Program> program_;
diff --git a/src/tint/intrinsics.def b/src/tint/intrinsics.def
index d1b8cb3..e76a48e 100644
--- a/src/tint/intrinsics.def
+++ b/src/tint/intrinsics.def
@@ -167,6 +167,9 @@
   vec4h
   vec4i
   vec4u
+  // https://www.w3.org/TR/WGSL/#sampler-type
+  sampler
+  sampler_comparison
 }
 
 ////////////////////////////////////////////////////////////////////////////////
diff --git a/src/tint/program_builder.h b/src/tint/program_builder.h
index 116c5a9..7ba1a3b 100644
--- a/src/tint/program_builder.h
+++ b/src/tint/program_builder.h
@@ -70,7 +70,6 @@
 #include "src/tint/ast/pointer.h"
 #include "src/tint/ast/return_statement.h"
 #include "src/tint/ast/sampled_texture.h"
-#include "src/tint/ast/sampler.h"
 #include "src/tint/ast/stage_attribute.h"
 #include "src/tint/ast/storage_texture.h"
 #include "src/tint/ast/stride_attribute.h"
@@ -105,6 +104,7 @@
 #include "src/tint/type/multisampled_texture.h"
 #include "src/tint/type/pointer.h"
 #include "src/tint/type/sampled_texture.h"
+#include "src/tint/type/sampler_kind.h"
 #include "src/tint/type/storage_texture.h"
 #include "src/tint/type/texture_dimension.h"
 #include "src/tint/type/u32.h"
@@ -961,16 +961,23 @@
         }
 
         /// @param kind the kind of sampler
-        /// @returns the sampler
-        const ast::Sampler* sampler(type::SamplerKind kind) const {
-            return builder->create<ast::Sampler>(kind);
+        /// @returns the sampler typename
+        const ast::TypeName* sampler(type::SamplerKind kind) const {
+            return sampler(builder->source_, kind);
         }
 
         /// @param source the Source of the node
         /// @param kind the kind of sampler
-        /// @returns the sampler
-        const ast::Sampler* sampler(const Source& source, type::SamplerKind kind) const {
-            return builder->create<ast::Sampler>(source, kind);
+        /// @returns the sampler typename
+        const ast::TypeName* sampler(const Source& source, type::SamplerKind kind) const {
+            switch (kind) {
+                case type::SamplerKind::kSampler:
+                    return (*this)(source, "sampler");
+                case type::SamplerKind::kComparisonSampler:
+                    return (*this)(source, "sampler_comparison");
+            }
+            TINT_ICE(ProgramBuilder, builder->Diagnostics()) << "invalid sampler kind " << kind;
+            return nullptr;
         }
 
         /// @param dims the dimensionality of the texture
diff --git a/src/tint/reader/spirv/parser_type.h b/src/tint/reader/spirv/parser_type.h
index bf36af9..33f7e05 100644
--- a/src/tint/reader/spirv/parser_type.h
+++ b/src/tint/reader/spirv/parser_type.h
@@ -19,11 +19,11 @@
 #include <string>
 #include <vector>
 
-#include "src/tint/ast/sampler.h"
 #include "src/tint/ast/storage_texture.h"
 #include "src/tint/castable.h"
 #include "src/tint/type/access.h"
 #include "src/tint/type/address_space.h"
+#include "src/tint/type/sampler_kind.h"
 #include "src/tint/type/texture_dimension.h"
 #include "src/tint/utils/block_allocator.h"
 
diff --git a/src/tint/reader/wgsl/parser_impl_sampler_test.cc b/src/tint/reader/wgsl/parser_impl_sampler_test.cc
index bd3c2d3..c1869ea 100644
--- a/src/tint/reader/wgsl/parser_impl_sampler_test.cc
+++ b/src/tint/reader/wgsl/parser_impl_sampler_test.cc
@@ -32,8 +32,8 @@
     EXPECT_TRUE(t.matched);
     EXPECT_FALSE(t.errored);
     ASSERT_NE(t.value, nullptr);
-    ASSERT_TRUE(t->Is<ast::Sampler>());
-    EXPECT_FALSE(t->As<ast::Sampler>()->IsComparison());
+    EXPECT_EQ(p->builder().Symbols().NameFor(t.value->As<ast::TypeName>()->name->symbol),
+              "sampler");
     EXPECT_FALSE(p->has_error());
     EXPECT_EQ(t.value->source.range, (Source::Range{{1u, 1u}, {1u, 8u}}));
 }
@@ -44,8 +44,8 @@
     EXPECT_TRUE(t.matched);
     EXPECT_FALSE(t.errored);
     ASSERT_NE(t.value, nullptr);
-    ASSERT_TRUE(t->Is<ast::Sampler>());
-    EXPECT_TRUE(t->As<ast::Sampler>()->IsComparison());
+    EXPECT_EQ(p->builder().Symbols().NameFor(t.value->As<ast::TypeName>()->name->symbol),
+              "sampler_comparison");
     EXPECT_FALSE(p->has_error());
     EXPECT_EQ(t.value->source.range, (Source::Range{{1u, 1u}, {1u, 19u}}));
 }
diff --git a/src/tint/reader/wgsl/parser_impl_texture_sampler_test.cc b/src/tint/reader/wgsl/parser_impl_texture_sampler_test.cc
index 636e539..90a2516 100644
--- a/src/tint/reader/wgsl/parser_impl_texture_sampler_test.cc
+++ b/src/tint/reader/wgsl/parser_impl_texture_sampler_test.cc
@@ -37,8 +37,8 @@
     EXPECT_TRUE(t.matched);
     EXPECT_FALSE(t.errored);
     ASSERT_NE(t.value, nullptr);
-    ASSERT_TRUE(t->Is<ast::Sampler>());
-    ASSERT_FALSE(t->As<ast::Sampler>()->IsComparison());
+    EXPECT_EQ(p->builder().Symbols().NameFor(t.value->As<ast::TypeName>()->name->symbol),
+              "sampler");
     EXPECT_EQ(t.value->source.range, (Source::Range{{1u, 1u}, {1u, 8u}}));
 }
 
@@ -49,8 +49,8 @@
     EXPECT_TRUE(t.matched);
     EXPECT_FALSE(t.errored);
     ASSERT_NE(t.value, nullptr);
-    ASSERT_TRUE(t->Is<ast::Sampler>());
-    ASSERT_TRUE(t->As<ast::Sampler>()->IsComparison());
+    EXPECT_EQ(p->builder().Symbols().NameFor(t.value->As<ast::TypeName>()->name->symbol),
+              "sampler_comparison");
     EXPECT_EQ(t.value->source.range, (Source::Range{{1u, 1u}, {1u, 19u}}));
 }
 
diff --git a/src/tint/reader/wgsl/parser_impl_type_decl_test.cc b/src/tint/reader/wgsl/parser_impl_type_decl_test.cc
index 373f9b7..612e102 100644
--- a/src/tint/reader/wgsl/parser_impl_type_decl_test.cc
+++ b/src/tint/reader/wgsl/parser_impl_type_decl_test.cc
@@ -15,7 +15,6 @@
 #include "src/tint/ast/alias.h"
 #include "src/tint/ast/array.h"
 #include "src/tint/ast/matrix.h"
-#include "src/tint/ast/sampler.h"
 #include "src/tint/reader/wgsl/parser_impl_test_helper.h"
 #include "src/tint/type/sampled_texture.h"
 
@@ -689,8 +688,8 @@
     EXPECT_TRUE(t.matched);
     EXPECT_FALSE(t.errored);
     ASSERT_NE(t.value, nullptr) << p->error();
-    ASSERT_TRUE(t.value->Is<ast::Sampler>());
-    ASSERT_FALSE(t.value->As<ast::Sampler>()->IsComparison());
+    EXPECT_EQ(p->builder().Symbols().NameFor(t.value->As<ast::TypeName>()->name->symbol),
+              "sampler");
     EXPECT_EQ(t.value->source.range, (Source::Range{{1u, 1u}, {1u, 8u}}));
 }
 
diff --git a/src/tint/reader/wgsl/parser_impl_type_decl_without_ident_test.cc b/src/tint/reader/wgsl/parser_impl_type_decl_without_ident_test.cc
index f3cec74..ba2fe61 100644
--- a/src/tint/reader/wgsl/parser_impl_type_decl_without_ident_test.cc
+++ b/src/tint/reader/wgsl/parser_impl_type_decl_without_ident_test.cc
@@ -15,7 +15,6 @@
 #include "src/tint/ast/alias.h"
 #include "src/tint/ast/array.h"
 #include "src/tint/ast/matrix.h"
-#include "src/tint/ast/sampler.h"
 #include "src/tint/reader/wgsl/parser_impl_test_helper.h"
 #include "src/tint/type/sampled_texture.h"
 
@@ -682,8 +681,8 @@
     EXPECT_TRUE(t.matched);
     EXPECT_FALSE(t.errored);
     ASSERT_NE(t.value, nullptr) << p->error();
-    ASSERT_TRUE(t.value->Is<ast::Sampler>());
-    ASSERT_FALSE(t.value->As<ast::Sampler>()->IsComparison());
+    EXPECT_EQ(p->builder().Symbols().NameFor(t.value->As<ast::TypeName>()->name->symbol),
+              "sampler");
     EXPECT_EQ(t.value->source.range, (Source::Range{{1u, 1u}, {1u, 8u}}));
 }
 
diff --git a/src/tint/resolver/builtin_test.cc b/src/tint/resolver/builtin_test.cc
index 7be6162..007154e 100644
--- a/src/tint/resolver/builtin_test.cc
+++ b/src/tint/resolver/builtin_test.cc
@@ -37,6 +37,7 @@
 #include "src/tint/type/sampled_texture.h"
 #include "src/tint/type/test_helper.h"
 #include "src/tint/type/texture_dimension.h"
+#include "src/tint/utils/string.h"
 
 using ::testing::ElementsAre;
 using ::testing::HasSubstr;
@@ -2114,9 +2115,15 @@
     }
 
     void add_call_param(std::string name, const ast::Type* type, ExpressionList* call_params) {
-        if (type->IsAnyOf<ast::Texture, ast::Sampler>()) {
-            GlobalVar(name, type, Binding(0_a), Group(0_a));
+        if (auto* type_name = type->As<ast::TypeName>()) {
+            if (utils::HasPrefix(Symbols().NameFor(type_name->name->symbol), "sampler")) {
+                GlobalVar(name, type, Binding(0_a), Group(0_a));
+                return;
+            }
+        }
 
+        if (type->Is<ast::Texture>()) {
+            GlobalVar(name, type, Binding(0_a), Group(0_a));
         } else {
             GlobalVar(name, type, type::AddressSpace::kPrivate);
         }
diff --git a/src/tint/resolver/dependency_graph.cc b/src/tint/resolver/dependency_graph.cc
index d9c3038..262fbd6 100644
--- a/src/tint/resolver/dependency_graph.cc
+++ b/src/tint/resolver/dependency_graph.cc
@@ -50,7 +50,6 @@
 #include "src/tint/ast/pointer.h"
 #include "src/tint/ast/return_statement.h"
 #include "src/tint/ast/sampled_texture.h"
-#include "src/tint/ast/sampler.h"
 #include "src/tint/ast/stage_attribute.h"
 #include "src/tint/ast/storage_texture.h"
 #include "src/tint/ast/stride_attribute.h"
@@ -407,7 +406,7 @@
             },
             [&](Default) {
                 if (!ty->IsAnyOf<ast::DepthTexture, ast::DepthMultisampledTexture,
-                                 ast::ExternalTexture, ast::Sampler>()) {
+                                 ast::ExternalTexture>()) {
                     UnhandledNode(diagnostics_, ty);
                 }
             });
diff --git a/src/tint/resolver/resolver.cc b/src/tint/resolver/resolver.cc
index 538d151..8c889bb 100644
--- a/src/tint/resolver/resolver.cc
+++ b/src/tint/resolver/resolver.cc
@@ -41,7 +41,6 @@
 #include "src/tint/ast/pointer.h"
 #include "src/tint/ast/return_statement.h"
 #include "src/tint/ast/sampled_texture.h"
-#include "src/tint/ast/sampler.h"
 #include "src/tint/ast/storage_texture.h"
 #include "src/tint/ast/switch_statement.h"
 #include "src/tint/ast/traverse_expressions.h"
@@ -289,7 +288,6 @@
             }
             return nullptr;
         },
-        [&](const ast::Sampler* t) { return builder_->create<type::Sampler>(t->kind); },
         [&](const ast::SampledTexture* t) -> type::SampledTexture* {
             if (auto* el = Type(t->type)) {
                 auto* sem = builder_->create<type::SampledTexture>(t->dim, el);
@@ -2525,6 +2523,10 @@
             return vec(u32(), 3u);
         case type::Builtin::kVec4U:
             return vec(u32(), 4u);
+        case type::Builtin::kSampler:
+            return builder_->create<type::Sampler>(type::SamplerKind::kSampler);
+        case type::Builtin::kSamplerComparison:
+            return builder_->create<type::Sampler>(type::SamplerKind::kComparisonSampler);
         case type::Builtin::kUndefined:
             break;
     }
diff --git a/src/tint/resolver/validator.cc b/src/tint/resolver/validator.cc
index eb9133a..0da542d 100644
--- a/src/tint/resolver/validator.cc
+++ b/src/tint/resolver/validator.cc
@@ -38,7 +38,6 @@
 #include "src/tint/ast/pointer.h"
 #include "src/tint/ast/return_statement.h"
 #include "src/tint/ast/sampled_texture.h"
-#include "src/tint/ast/sampler.h"
 #include "src/tint/ast/storage_texture.h"
 #include "src/tint/ast/switch_statement.h"
 #include "src/tint/ast/traverse_expressions.h"
diff --git a/src/tint/templates/enums.tmpl.inc b/src/tint/templates/enums.tmpl.inc
index 756abb0..ab08163 100644
--- a/src/tint/templates/enums.tmpl.inc
+++ b/src/tint/templates/enums.tmpl.inc
@@ -173,7 +173,7 @@
 {{- /* ------------------------------------------------------------------ */ -}}
 {{- $enum := Eval "EnumName" $ -}}
 void {{$enum}}Parser(::benchmark::State& state) {
-    std::array kStrings{
+    const char* kStrings[] = {
 {{-   $exclude := $.NameSet -}}
 {{-   range $entry := $.PublicEntries }}
         "{{Scramble $entry.Name $exclude}}",
@@ -186,7 +186,7 @@
 {{-   end }}
     };
     for (auto _ : state) {
-        for (auto& str : kStrings) {
+        for (auto* str : kStrings) {
             auto result = Parse{{$enum}}(str);
             benchmark::DoNotOptimize(result);
         }
diff --git a/src/tint/transform/transform.cc b/src/tint/transform/transform.cc
index ebf72aa..12deb03 100644
--- a/src/tint/transform/transform.cc
+++ b/src/tint/transform/transform.cc
@@ -167,7 +167,7 @@
                                                     CreateASTTypeFor(ctx, t->type()), t->access());
     }
     if (auto* s = ty->As<type::Sampler>()) {
-        return ctx.dst->create<ast::Sampler>(s->kind());
+        return ctx.dst->ty.sampler(s->kind());
     }
     TINT_UNREACHABLE(Transform, ctx.dst->Diagnostics())
         << "Unhandled type: " << ty->TypeInfo().name;
diff --git a/src/tint/type/access_bench.cc b/src/tint/type/access_bench.cc
index 6b16317..ab578eb 100644
--- a/src/tint/type/access_bench.cc
+++ b/src/tint/type/access_bench.cc
@@ -30,7 +30,7 @@
 namespace {
 
 void AccessParser(::benchmark::State& state) {
-    std::array kStrings{
+    const char* kStrings[] = {
         "ccad",       "3",           "rVad",         "read",       "1ead",
         "rqaJ",       "rlla77",      "reqqdppriHHe", "rv_wcit",    "reabGwrte",
         "read_write", "read_vriite", "re8d_wriWWe",  "Meadxxrite", "wggte",
@@ -38,7 +38,7 @@
         "wxxidd",
     };
     for (auto _ : state) {
-        for (auto& str : kStrings) {
+        for (auto* str : kStrings) {
             auto result = ParseAccess(str);
             benchmark::DoNotOptimize(result);
         }
diff --git a/src/tint/type/address_space_bench.cc b/src/tint/type/address_space_bench.cc
index 6a6e4c8..ecd3ccf 100644
--- a/src/tint/type/address_space_bench.cc
+++ b/src/tint/type/address_space_bench.cc
@@ -30,7 +30,7 @@
 namespace {
 
 void AddressSpaceParser(::benchmark::State& state) {
-    std::array kStrings{
+    const char* kStrings[] = {
         "fccnctin",       "ucti3",         "functVon",      "function",      "1unction",
         "unJtqqon",       "llun77tion",    "ppqqivtHH",     "prcv",          "bivaGe",
         "private",        "priviive",      "8WWivate",      "pxxvate",       "pXh_cggnstant",
@@ -42,7 +42,7 @@
         "jgkrouRR",       "wokroub",
     };
     for (auto _ : state) {
-        for (auto& str : kStrings) {
+        for (auto* str : kStrings) {
             auto result = ParseAddressSpace(str);
             benchmark::DoNotOptimize(result);
         }
diff --git a/src/tint/type/builtin.cc b/src/tint/type/builtin.cc
index 30409ca..1523619 100644
--- a/src/tint/type/builtin.cc
+++ b/src/tint/type/builtin.cc
@@ -94,6 +94,12 @@
     if (str == "mat4x4h") {
         return Builtin::kMat4X4H;
     }
+    if (str == "sampler") {
+        return Builtin::kSampler;
+    }
+    if (str == "sampler_comparison") {
+        return Builtin::kSamplerComparison;
+    }
     if (str == "u32") {
         return Builtin::kU32;
     }
@@ -184,6 +190,10 @@
             return out << "mat4x4f";
         case Builtin::kMat4X4H:
             return out << "mat4x4h";
+        case Builtin::kSampler:
+            return out << "sampler";
+        case Builtin::kSamplerComparison:
+            return out << "sampler_comparison";
         case Builtin::kU32:
             return out << "u32";
         case Builtin::kVec2F:
diff --git a/src/tint/type/builtin.h b/src/tint/type/builtin.h
index df3e9da..a69724f 100644
--- a/src/tint/type/builtin.h
+++ b/src/tint/type/builtin.h
@@ -52,6 +52,8 @@
     kMat4X3H,
     kMat4X4F,
     kMat4X4H,
+    kSampler,
+    kSamplerComparison,
     kU32,
     kVec2F,
     kVec2H,
@@ -78,11 +80,13 @@
 Builtin ParseBuiltin(std::string_view str);
 
 constexpr const char* kBuiltinStrings[] = {
-    "bool",    "f16",     "f32",     "i32",     "mat2x2f", "mat2x2h", "mat2x3f",
-    "mat2x3h", "mat2x4f", "mat2x4h", "mat3x2f", "mat3x2h", "mat3x3f", "mat3x3h",
-    "mat3x4f", "mat3x4h", "mat4x2f", "mat4x2h", "mat4x3f", "mat4x3h", "mat4x4f",
-    "mat4x4h", "u32",     "vec2f",   "vec2h",   "vec2i",   "vec2u",   "vec3f",
-    "vec3h",   "vec3i",   "vec3u",   "vec4f",   "vec4h",   "vec4i",   "vec4u",
+    "bool",    "f16",     "f32",     "i32",     "mat2x2f", "mat2x2h",
+    "mat2x3f", "mat2x3h", "mat2x4f", "mat2x4h", "mat3x2f", "mat3x2h",
+    "mat3x3f", "mat3x3h", "mat3x4f", "mat3x4h", "mat4x2f", "mat4x2h",
+    "mat4x3f", "mat4x3h", "mat4x4f", "mat4x4h", "sampler", "sampler_comparison",
+    "u32",     "vec2f",   "vec2h",   "vec2i",   "vec2u",   "vec3f",
+    "vec3h",   "vec3i",   "vec3u",   "vec4f",   "vec4h",   "vec4i",
+    "vec4u",
 };
 
 }  // namespace tint::type
diff --git a/src/tint/type/builtin_bench.cc b/src/tint/type/builtin_bench.cc
index d515e5d..8404209 100644
--- a/src/tint/type/builtin_bench.cc
+++ b/src/tint/type/builtin_bench.cc
@@ -30,51 +30,269 @@
 namespace {
 
 void BuiltinParser(::benchmark::State& state) {
-    std::array kStrings{
-        "ccol",        "3",           "bVol",      "bool",        "1ool",     "bqoJ",
-        "bllo77",      "fppqH",       "",          "Gb",          "f16",      "f1vi",
-        "f8WW",        "fxx",         "fgg",       "X",           "332",      "f32",
-        "fE2",         "fPTT",        "dxx2",      "4432",        "iSVV2",    "RR2",
-        "i32",         "92",          "i3",        "VOR2",        "ma2xyf",   "llnarr2772f",
-        "mat24200",    "mat2x2f",     "a2oof",     "zz2x2f",      "miitppx1", "mat2xXXh",
-        "9II5ann2x2h", "mataSSrHHYh", "mat2x2h",   "makkh",       "jatgRx",   "mb2x2",
-        "mat2xjf",     "at2x3f",      "q2x3f",     "mat2x3f",     "matNN3f",  "at23vv",
-        "QQt2x3f",     "maffxr",      "mat2xjh",   "mNNw2x38",    "mat2x3h",  "matx3h",
-        "mrrt2x3h",    "Gat2x3h",     "mat2x4FF",  "at2f",        "marrx4f",  "mat2x4f",
-        "t2x4f",       "Da2xJJf",     "ma84",      "m11k4",       "matx4h",   "maJx4h",
-        "mat2x4h",     "mat2c4h",     "mat2x4O",   "KK_atvvtt4h", "xx83x2f",  "__qatF2",
-        "matqx2f",     "mat3x2f",     "33atOx2f",  "mtt63x9oQQ",  "ma3x66f",  "mtOxzz66",
-        "mat3yy2h",    "ZaHH2Z",      "mat3x2h",   "4WWt3q2h",    "mOO3x2h",  "oatY2h",
-        "matx",        "ma3xFf",      "at3x3w",    "mat3x3f",     "fGtxKf",   "matqKx3f",
-        "matmmxFf",    "at3x3h",      "mt3x3q",    "mat3xbb",     "mat3x3h",  "mi3x3h",
-        "maOO3xq",     "matTvvx3h",   "maFF3x4f",  "Pa00xQf",     "mPt3x4f",  "mat3x4f",
-        "ma773xss",    "RRCbb3x4f",   "mXXt3x4f",  "qaCC3xOOh",   "ma3s4L",   "mXt3x4h",
-        "mat3x4h",     "mat34h",      "qa3O4",     "mat3x22h",    "myzz40XX", "matVViP",
-        "mannC2f",     "mat4x2f",     "atx2AHHq",  "mat4x2",      "fatK2f",   "ltgg2h",
-        "mat4xh",      "NTTtcx4h",    "mat4x2h",   "ma7ppl2h",    "mNNt4xg",  "uub4XX2h",
-        "matx3f",      "Qt883f",      "mt9q3f",    "mat4x3f",     "m11t4x3f", "22at4iif",
-        "at4x377",     "m2t4xNh",     "mVVt4x3h",  "FaWW4w11h",   "mat4x3h",  "mawwx3h",
-        "Dat4x3h",     "mt4x3K",      "mat41PPhf", "mat44f",      "mYYt4x4f", "mat4x4f",
-        "mttHH4kk",    "mat4rr4f",    "WWas4x4f",  "Yt4x4h",      "mt4qfh",   "mav224xuh",
-        "mat4x4h",     "t4x4h",       "YYat4h",    "may4x4EYY",   "Mo2",      "uMM",
-        "u552",        "u32",         "N",         "333",         "u33",      "mecI",
-        "vrnK2f",      "v2",          "vec2f",     "ILLcf",       "ecf",      "UecRY",
-        "vechh",       "qeIIu",       "Hec2h",     "vec2h",       "eQQvv",    "e66h",
-        "7Wc2",        "ve055DD",     "IIec2i",    "vec2",        "vec2i",    "rec2",
-        "lec2i",       "GeJ2i",       "ey2u",      "vc2u",        "IIeBB2u",  "vec2u",
-        "TTec338",     "veUUSS2nnd",  "vZx5CC",    "kkec3q",      "v005if",   "vnIIc3f",
-        "vec3f",       "cceW",        "cKK",       "vec66f",      "vePPK",    "vexxh",
-        "qec3h",       "vec3h",       "veSyMMr",   "v3u",         "ec",       "5eFF3i",
-        "rrecz44",     "vWW",         "vec3i",     "XJecCZZ",     "vePP3",    "vec3c",
-        "ve6ll3u",     "vcyy99",      "Jec3KK",    "vec3u",       "_ex3",     "Ky3",
-        "zek3u",       "veKSf",       "vc4f",      "ec4VV",       "vec4f",    "IAAc4f",
-        "jbR",         "veY4",        "ec4h",      "vc911",       "mmcch",    "vec4h",
-        "vJJch",       "lDDcUfC",     "vec4g",     "CCe",         "ec4i",     "vIc__i",
-        "vec4i",       "ePPtt",       "v3dc4i",    "vcyyi",       "u4",       "v03nnu",
-        "Cuuecnv",     "vec4u",       "vX4ll",     "vocppu",      "vwwc4",
+    const char* kStrings[] = {
+        "ccol",
+        "3",
+        "bVol",
+        "bool",
+        "1ool",
+        "bqoJ",
+        "bllo77",
+        "fppqH",
+        "",
+        "Gb",
+        "f16",
+        "f1vi",
+        "f8WW",
+        "fxx",
+        "fgg",
+        "X",
+        "332",
+        "f32",
+        "fE2",
+        "fPTT",
+        "dxx2",
+        "4432",
+        "iSVV2",
+        "RR2",
+        "i32",
+        "92",
+        "i3",
+        "VOR2",
+        "ma2xyf",
+        "llnarr2772f",
+        "mat24200",
+        "mat2x2f",
+        "a2oof",
+        "zz2x2f",
+        "miitppx1",
+        "mat2xXXh",
+        "9II5ann2x2h",
+        "mataSSrHHYh",
+        "mat2x2h",
+        "makkh",
+        "jatgRx",
+        "mb2x2",
+        "mat2xjf",
+        "at2x3f",
+        "q2x3f",
+        "mat2x3f",
+        "matNN3f",
+        "at23vv",
+        "QQt2x3f",
+        "maffxr",
+        "mat2xjh",
+        "mNNw2x38",
+        "mat2x3h",
+        "matx3h",
+        "mrrt2x3h",
+        "Gat2x3h",
+        "mat2x4FF",
+        "at2f",
+        "marrx4f",
+        "mat2x4f",
+        "t2x4f",
+        "Da2xJJf",
+        "ma84",
+        "m11k4",
+        "matx4h",
+        "maJx4h",
+        "mat2x4h",
+        "mat2c4h",
+        "mat2x4O",
+        "KK_atvvtt4h",
+        "xx83x2f",
+        "__qatF2",
+        "matqx2f",
+        "mat3x2f",
+        "33atOx2f",
+        "mtt63x9oQQ",
+        "ma3x66f",
+        "mtOxzz66",
+        "mat3yy2h",
+        "ZaHH2Z",
+        "mat3x2h",
+        "4WWt3q2h",
+        "mOO3x2h",
+        "oatY2h",
+        "matx",
+        "ma3xFf",
+        "at3x3w",
+        "mat3x3f",
+        "fGtxKf",
+        "matqKx3f",
+        "matmmxFf",
+        "at3x3h",
+        "mt3x3q",
+        "mat3xbb",
+        "mat3x3h",
+        "mi3x3h",
+        "maOO3xq",
+        "matTvvx3h",
+        "maFF3x4f",
+        "Pa00xQf",
+        "mPt3x4f",
+        "mat3x4f",
+        "ma773xss",
+        "RRCbb3x4f",
+        "mXXt3x4f",
+        "qaCC3xOOh",
+        "ma3s4L",
+        "mXt3x4h",
+        "mat3x4h",
+        "mat34h",
+        "qa3O4",
+        "mat3x22h",
+        "myzz40XX",
+        "matVViP",
+        "mannC2f",
+        "mat4x2f",
+        "atx2AHHq",
+        "mat4x2",
+        "fatK2f",
+        "ltgg2h",
+        "mat4xh",
+        "NTTtcx4h",
+        "mat4x2h",
+        "ma7ppl2h",
+        "mNNt4xg",
+        "uub4XX2h",
+        "matx3f",
+        "Qt883f",
+        "mt9q3f",
+        "mat4x3f",
+        "m11t4x3f",
+        "22at4iif",
+        "at4x377",
+        "m2t4xNh",
+        "mVVt4x3h",
+        "FaWW4w11h",
+        "mat4x3h",
+        "mawwx3h",
+        "Dat4x3h",
+        "mt4x3K",
+        "mat41PPhf",
+        "mat44f",
+        "mYYt4x4f",
+        "mat4x4f",
+        "mttHH4kk",
+        "mat4rr4f",
+        "WWas4x4f",
+        "Yt4x4h",
+        "mt4qfh",
+        "mav224xuh",
+        "mat4x4h",
+        "t4x4h",
+        "YYat4h",
+        "may4x4EYY",
+        "daplMor",
+        "samMMle",
+        "sampl55r",
+        "sampler",
+        "saNpe",
+        "sa3Ol33",
+        "s3mpler",
+        "Iamplercomparismn",
+        "sampleKrcompannison",
+        "samlr_copXXison",
+        "sampler_comparison",
+        "samplpLL_comparisI",
+        "smplerfomparison",
+        "sYmpURDr_comprison",
+        "u3h",
+        "IIq",
+        "u3H",
+        "u32",
+        "Qvv",
+        "66",
+        "73",
+        "ve055DD",
+        "IIec2f",
+        "vec2",
+        "vec2f",
+        "rec2",
+        "lec2f",
+        "GeJ2f",
+        "ey2h",
+        "vc2h",
+        "IIeBB2h",
+        "vec2h",
+        "TTec338",
+        "veUUSS2nnd",
+        "vZx5CC",
+        "kkec2q",
+        "v005ii",
+        "vnIIc2i",
+        "vec2i",
+        "cceW",
+        "cKK",
+        "vec66i",
+        "vePPK",
+        "vexxu",
+        "qec2u",
+        "vec2u",
+        "veSyMMr",
+        "v2u",
+        "ec",
+        "5eFF3f",
+        "rrecz44",
+        "vWW",
+        "vec3f",
+        "XJecCZZ",
+        "vePP3",
+        "vec3c",
+        "ve6ll3h",
+        "vcyy99",
+        "Jec3KK",
+        "vec3h",
+        "_ex3",
+        "Ky3",
+        "zek3h",
+        "veKSi",
+        "vc3i",
+        "ec3VV",
+        "vec3i",
+        "IAAc3i",
+        "jbR",
+        "veY4",
+        "ec3u",
+        "vc911",
+        "mmccu",
+        "vec3u",
+        "vJJcu",
+        "lDDcUfC",
+        "vec3g",
+        "CCe",
+        "ec4f",
+        "vIc__f",
+        "vec4f",
+        "ePPtt",
+        "v3dc4f",
+        "vcyyf",
+        "u4",
+        "v03nnh",
+        "Cuuecnv",
+        "vec4h",
+        "vX4ll",
+        "vocpph",
+        "vwwc4",
+        "veuug",
+        "vaac",
+        "TRZccci",
+        "vec4i",
+        "vTc4O8",
+        "vem04i",
+        "meBB4i",
+        "Mpp4",
+        "OOe4u",
+        "veG4G",
+        "vec4u",
+        "11eHH4u",
+        "veFFe6",
+        "ve4",
     };
     for (auto _ : state) {
-        for (auto& str : kStrings) {
+        for (auto* str : kStrings) {
             auto result = ParseBuiltin(str);
             benchmark::DoNotOptimize(result);
         }
diff --git a/src/tint/type/builtin_test.cc b/src/tint/type/builtin_test.cc
index 5ef9a17..bb30408 100644
--- a/src/tint/type/builtin_test.cc
+++ b/src/tint/type/builtin_test.cc
@@ -43,74 +43,139 @@
 }
 
 static constexpr Case kValidCases[] = {
-    {"bool", Builtin::kBool},       {"f16", Builtin::kF16},         {"f32", Builtin::kF32},
-    {"i32", Builtin::kI32},         {"mat2x2f", Builtin::kMat2X2F}, {"mat2x2h", Builtin::kMat2X2H},
-    {"mat2x3f", Builtin::kMat2X3F}, {"mat2x3h", Builtin::kMat2X3H}, {"mat2x4f", Builtin::kMat2X4F},
-    {"mat2x4h", Builtin::kMat2X4H}, {"mat3x2f", Builtin::kMat3X2F}, {"mat3x2h", Builtin::kMat3X2H},
-    {"mat3x3f", Builtin::kMat3X3F}, {"mat3x3h", Builtin::kMat3X3H}, {"mat3x4f", Builtin::kMat3X4F},
-    {"mat3x4h", Builtin::kMat3X4H}, {"mat4x2f", Builtin::kMat4X2F}, {"mat4x2h", Builtin::kMat4X2H},
-    {"mat4x3f", Builtin::kMat4X3F}, {"mat4x3h", Builtin::kMat4X3H}, {"mat4x4f", Builtin::kMat4X4F},
-    {"mat4x4h", Builtin::kMat4X4H}, {"u32", Builtin::kU32},         {"vec2f", Builtin::kVec2F},
-    {"vec2h", Builtin::kVec2H},     {"vec2i", Builtin::kVec2I},     {"vec2u", Builtin::kVec2U},
-    {"vec3f", Builtin::kVec3F},     {"vec3h", Builtin::kVec3H},     {"vec3i", Builtin::kVec3I},
-    {"vec3u", Builtin::kVec3U},     {"vec4f", Builtin::kVec4F},     {"vec4h", Builtin::kVec4H},
-    {"vec4i", Builtin::kVec4I},     {"vec4u", Builtin::kVec4U},
+    {"bool", Builtin::kBool},       {"f16", Builtin::kF16},
+    {"f32", Builtin::kF32},         {"i32", Builtin::kI32},
+    {"mat2x2f", Builtin::kMat2X2F}, {"mat2x2h", Builtin::kMat2X2H},
+    {"mat2x3f", Builtin::kMat2X3F}, {"mat2x3h", Builtin::kMat2X3H},
+    {"mat2x4f", Builtin::kMat2X4F}, {"mat2x4h", Builtin::kMat2X4H},
+    {"mat3x2f", Builtin::kMat3X2F}, {"mat3x2h", Builtin::kMat3X2H},
+    {"mat3x3f", Builtin::kMat3X3F}, {"mat3x3h", Builtin::kMat3X3H},
+    {"mat3x4f", Builtin::kMat3X4F}, {"mat3x4h", Builtin::kMat3X4H},
+    {"mat4x2f", Builtin::kMat4X2F}, {"mat4x2h", Builtin::kMat4X2H},
+    {"mat4x3f", Builtin::kMat4X3F}, {"mat4x3h", Builtin::kMat4X3H},
+    {"mat4x4f", Builtin::kMat4X4F}, {"mat4x4h", Builtin::kMat4X4H},
+    {"sampler", Builtin::kSampler}, {"sampler_comparison", Builtin::kSamplerComparison},
+    {"u32", Builtin::kU32},         {"vec2f", Builtin::kVec2F},
+    {"vec2h", Builtin::kVec2H},     {"vec2i", Builtin::kVec2I},
+    {"vec2u", Builtin::kVec2U},     {"vec3f", Builtin::kVec3F},
+    {"vec3h", Builtin::kVec3H},     {"vec3i", Builtin::kVec3I},
+    {"vec3u", Builtin::kVec3U},     {"vec4f", Builtin::kVec4F},
+    {"vec4h", Builtin::kVec4H},     {"vec4i", Builtin::kVec4I},
+    {"vec4u", Builtin::kVec4U},
 };
 
 static constexpr Case kInvalidCases[] = {
-    {"ccol", Builtin::kUndefined},        {"3", Builtin::kUndefined},
-    {"bVol", Builtin::kUndefined},        {"116", Builtin::kUndefined},
-    {"qJ6", Builtin::kUndefined},         {"f17ll", Builtin::kUndefined},
-    {"fppqH", Builtin::kUndefined},       {"", Builtin::kUndefined},
-    {"Gb", Builtin::kUndefined},          {"i3vi", Builtin::kUndefined},
-    {"i8WW", Builtin::kUndefined},        {"ixx", Builtin::kUndefined},
-    {"mX2x2gg", Builtin::kUndefined},     {"a2xXf", Builtin::kUndefined},
-    {"mat232f", Builtin::kUndefined},     {"Eat2x2h", Builtin::kUndefined},
-    {"mPTT2x2h", Builtin::kUndefined},    {"mat2xdxx", Builtin::kUndefined},
-    {"m44t2x3f", Builtin::kUndefined},    {"maSS2xVVf", Builtin::kUndefined},
-    {"RatR22f", Builtin::kUndefined},     {"mF2x9h", Builtin::kUndefined},
-    {"matx3h", Builtin::kUndefined},      {"VOORRH3h", Builtin::kUndefined},
-    {"ma2xyf", Builtin::kUndefined},      {"llnarr2774f", Builtin::kUndefined},
-    {"mat24400", Builtin::kUndefined},    {"a2ooh", Builtin::kUndefined},
-    {"zz2x4h", Builtin::kUndefined},      {"miitppx1", Builtin::kUndefined},
-    {"mat3xXXf", Builtin::kUndefined},    {"9II5ann3x2f", Builtin::kUndefined},
-    {"mataSSrHHYf", Builtin::kUndefined}, {"makkh", Builtin::kUndefined},
-    {"jatgRx", Builtin::kUndefined},      {"mb3x2", Builtin::kUndefined},
-    {"mat3xjf", Builtin::kUndefined},     {"at3x3f", Builtin::kUndefined},
-    {"q3x3f", Builtin::kUndefined},       {"matNN3h", Builtin::kUndefined},
-    {"at33vv", Builtin::kUndefined},      {"QQt3x3h", Builtin::kUndefined},
-    {"maffxr", Builtin::kUndefined},      {"mat3xjf", Builtin::kUndefined},
-    {"mNNw3x48", Builtin::kUndefined},    {"matx4h", Builtin::kUndefined},
-    {"mrrt3x4h", Builtin::kUndefined},    {"Gat3x4h", Builtin::kUndefined},
-    {"mat4x2FF", Builtin::kUndefined},    {"at4f", Builtin::kUndefined},
-    {"marrx2f", Builtin::kUndefined},     {"t4x2h", Builtin::kUndefined},
-    {"Da4xJJh", Builtin::kUndefined},     {"ma82", Builtin::kUndefined},
-    {"m11k3", Builtin::kUndefined},       {"matx3f", Builtin::kUndefined},
-    {"maJx3f", Builtin::kUndefined},      {"mat4c3h", Builtin::kUndefined},
-    {"mat4x3O", Builtin::kUndefined},     {"KK_atvvtt3h", Builtin::kUndefined},
-    {"xx84x4f", Builtin::kUndefined},     {"__qatF4", Builtin::kUndefined},
-    {"matqx4f", Builtin::kUndefined},     {"33atOx4h", Builtin::kUndefined},
-    {"mtt64x9oQQ", Builtin::kUndefined},  {"ma4x66h", Builtin::kUndefined},
-    {"zzO6", Builtin::kUndefined},        {"uyy2", Builtin::kUndefined},
-    {"HZ", Builtin::kUndefined},          {"ecWq4f", Builtin::kUndefined},
-    {"vOO2f", Builtin::kUndefined},       {"oYe2", Builtin::kUndefined},
-    {"v2", Builtin::kUndefined},          {"Fe2h", Builtin::kUndefined},
-    {"vwch", Builtin::kUndefined},        {"vefi", Builtin::kUndefined},
-    {"KKeq2i", Builtin::kUndefined},      {"vFmm2i", Builtin::kUndefined},
-    {"vecu", Builtin::kUndefined},        {"qc2u", Builtin::kUndefined},
-    {"vecbb", Builtin::kUndefined},       {"iic3", Builtin::kUndefined},
-    {"vqOOf", Builtin::kUndefined},       {"vevvTTf", Builtin::kUndefined},
-    {"veFF3h", Builtin::kUndefined},      {"00PfQ", Builtin::kUndefined},
-    {"vec3P", Builtin::kUndefined},       {"vec77s", Builtin::kUndefined},
-    {"vecbbCi", Builtin::kUndefined},     {"vecXXi", Builtin::kUndefined},
-    {"CCOOec3", Builtin::kUndefined},     {"vs3u", Builtin::kUndefined},
-    {"Xec3u", Builtin::kUndefined},       {"ve4f", Builtin::kUndefined},
-    {"qq4", Builtin::kUndefined},         {"vec422", Builtin::kUndefined},
-    {"vezzXy", Builtin::kUndefined},      {"ieVVP", Builtin::kUndefined},
-    {"venCh", Builtin::kUndefined},       {"vHc4Aq", Builtin::kUndefined},
-    {"ve4i", Builtin::kUndefined},        {"vefK", Builtin::kUndefined},
-    {"vgg4", Builtin::kUndefined},        {"vecu", Builtin::kUndefined},
-    {"4TNc4u", Builtin::kUndefined},
+    {"ccol", Builtin::kUndefined},
+    {"3", Builtin::kUndefined},
+    {"bVol", Builtin::kUndefined},
+    {"116", Builtin::kUndefined},
+    {"qJ6", Builtin::kUndefined},
+    {"f17ll", Builtin::kUndefined},
+    {"fppqH", Builtin::kUndefined},
+    {"", Builtin::kUndefined},
+    {"Gb", Builtin::kUndefined},
+    {"i3vi", Builtin::kUndefined},
+    {"i8WW", Builtin::kUndefined},
+    {"ixx", Builtin::kUndefined},
+    {"mX2x2gg", Builtin::kUndefined},
+    {"a2xXf", Builtin::kUndefined},
+    {"mat232f", Builtin::kUndefined},
+    {"Eat2x2h", Builtin::kUndefined},
+    {"mPTT2x2h", Builtin::kUndefined},
+    {"mat2xdxx", Builtin::kUndefined},
+    {"m44t2x3f", Builtin::kUndefined},
+    {"maSS2xVVf", Builtin::kUndefined},
+    {"RatR22f", Builtin::kUndefined},
+    {"mF2x9h", Builtin::kUndefined},
+    {"matx3h", Builtin::kUndefined},
+    {"VOORRH3h", Builtin::kUndefined},
+    {"ma2xyf", Builtin::kUndefined},
+    {"llnarr2774f", Builtin::kUndefined},
+    {"mat24400", Builtin::kUndefined},
+    {"a2ooh", Builtin::kUndefined},
+    {"zz2x4h", Builtin::kUndefined},
+    {"miitppx1", Builtin::kUndefined},
+    {"mat3xXXf", Builtin::kUndefined},
+    {"9II5ann3x2f", Builtin::kUndefined},
+    {"mataSSrHHYf", Builtin::kUndefined},
+    {"makkh", Builtin::kUndefined},
+    {"jatgRx", Builtin::kUndefined},
+    {"mb3x2", Builtin::kUndefined},
+    {"mat3xjf", Builtin::kUndefined},
+    {"at3x3f", Builtin::kUndefined},
+    {"q3x3f", Builtin::kUndefined},
+    {"matNN3h", Builtin::kUndefined},
+    {"at33vv", Builtin::kUndefined},
+    {"QQt3x3h", Builtin::kUndefined},
+    {"maffxr", Builtin::kUndefined},
+    {"mat3xjf", Builtin::kUndefined},
+    {"mNNw3x48", Builtin::kUndefined},
+    {"matx4h", Builtin::kUndefined},
+    {"mrrt3x4h", Builtin::kUndefined},
+    {"Gat3x4h", Builtin::kUndefined},
+    {"mat4x2FF", Builtin::kUndefined},
+    {"at4f", Builtin::kUndefined},
+    {"marrx2f", Builtin::kUndefined},
+    {"t4x2h", Builtin::kUndefined},
+    {"Da4xJJh", Builtin::kUndefined},
+    {"ma82", Builtin::kUndefined},
+    {"m11k3", Builtin::kUndefined},
+    {"matx3f", Builtin::kUndefined},
+    {"maJx3f", Builtin::kUndefined},
+    {"mat4c3h", Builtin::kUndefined},
+    {"mat4x3O", Builtin::kUndefined},
+    {"KK_atvvtt3h", Builtin::kUndefined},
+    {"xx84x4f", Builtin::kUndefined},
+    {"__qatF4", Builtin::kUndefined},
+    {"matqx4f", Builtin::kUndefined},
+    {"33atOx4h", Builtin::kUndefined},
+    {"mtt64x9oQQ", Builtin::kUndefined},
+    {"ma4x66h", Builtin::kUndefined},
+    {"smOlzz66", Builtin::kUndefined},
+    {"sampyyer", Builtin::kUndefined},
+    {"ZaHHeZ", Builtin::kUndefined},
+    {"sWWpleq_compari44on", Builtin::kUndefined},
+    {"sampler_compaisoOO", Builtin::kUndefined},
+    {"smpeoo_coYparison", Builtin::kUndefined},
+    {"", Builtin::kUndefined},
+    {"u3", Builtin::kUndefined},
+    {"3w", Builtin::kUndefined},
+    {"veff", Builtin::kUndefined},
+    {"KKeq2f", Builtin::kUndefined},
+    {"vFmm2f", Builtin::kUndefined},
+    {"vech", Builtin::kUndefined},
+    {"qc2h", Builtin::kUndefined},
+    {"vecbb", Builtin::kUndefined},
+    {"iic2", Builtin::kUndefined},
+    {"vqOOi", Builtin::kUndefined},
+    {"vevvTTi", Builtin::kUndefined},
+    {"veFF2u", Builtin::kUndefined},
+    {"00PfQ", Builtin::kUndefined},
+    {"vec2P", Builtin::kUndefined},
+    {"vec77s", Builtin::kUndefined},
+    {"vecbbCf", Builtin::kUndefined},
+    {"vecXXf", Builtin::kUndefined},
+    {"CCOOec3", Builtin::kUndefined},
+    {"vs3u", Builtin::kUndefined},
+    {"Xec3h", Builtin::kUndefined},
+    {"ve3i", Builtin::kUndefined},
+    {"qq3", Builtin::kUndefined},
+    {"vec322", Builtin::kUndefined},
+    {"vezzXy", Builtin::kUndefined},
+    {"ieVVP", Builtin::kUndefined},
+    {"venCu", Builtin::kUndefined},
+    {"vHc4Aq", Builtin::kUndefined},
+    {"ve4f", Builtin::kUndefined},
+    {"vefK", Builtin::kUndefined},
+    {"vgg4", Builtin::kUndefined},
+    {"vech", Builtin::kUndefined},
+    {"4TNc4h", Builtin::kUndefined},
+    {"ppec7l", Builtin::kUndefined},
+    {"zNe4i", Builtin::kUndefined},
+    {"uXXb4i", Builtin::kUndefined},
+    {"vec4", Builtin::kUndefined},
+    {"884K", Builtin::kUndefined},
+    {"vq9u", Builtin::kUndefined},
 };
 
 using BuiltinParseTest = testing::TestWithParam<Case>;
diff --git a/src/tint/type/texel_format_bench.cc b/src/tint/type/texel_format_bench.cc
index 8cf7a73..6a0ea27 100644
--- a/src/tint/type/texel_format_bench.cc
+++ b/src/tint/type/texel_format_bench.cc
@@ -30,7 +30,7 @@
 namespace {
 
 void TexelFormatParser(::benchmark::State& state) {
-    std::array kStrings{
+    const char* kStrings[] = {
         "bgraunccrm",     "blranr3",      "bVra8unorm",   "bgra8unorm",   "bgra1unorm",
         "bgrJqqnorm",     "bgr7ll8unorm", "qq32lppHat",   "c2fov",        "r32Goat",
         "r32float",       "r3viiloat",    "r3WWflo8t",    "rxxfMoat",     "rXsingg",
@@ -57,7 +57,7 @@
         "rgba8unorm",     "ba8unoqqHHA",  "rga8unorm",    "rgfa8uKKo",
     };
     for (auto _ : state) {
-        for (auto& str : kStrings) {
+        for (auto* str : kStrings) {
             auto result = ParseTexelFormat(str);
             benchmark::DoNotOptimize(result);
         }
diff --git a/src/tint/writer/glsl/generator_impl_builtin_texture_test.cc b/src/tint/writer/glsl/generator_impl_builtin_texture_test.cc
index cb5a4c8..be12076 100644
--- a/src/tint/writer/glsl/generator_impl_builtin_texture_test.cc
+++ b/src/tint/writer/glsl/generator_impl_builtin_texture_test.cc
@@ -61,41 +61,41 @@
         case ValidTextureOverload::kDimensionsStorageWO3d:
             return {"imageSize"};
         case ValidTextureOverload::kGather2dF32:
-            return R"(textureGather(tint_symbol_sampler, vec2(1.0f, 2.0f), 0))";
+            return R"(textureGather(Texture_Sampler, vec2(1.0f, 2.0f), 0))";
         case ValidTextureOverload::kGather2dOffsetF32:
-            return R"(textureGatherOffset(tint_symbol_sampler, vec2(1.0f, 2.0f), ivec2(3, 4), int(0u)))";
+            return R"(textureGatherOffset(Texture_Sampler, vec2(1.0f, 2.0f), ivec2(3, 4), int(0u)))";
         case ValidTextureOverload::kGather2dArrayF32:
-            return R"(textureGather(tint_symbol_sampler, vec3(1.0f, 2.0f, float(3)), 0))";
+            return R"(textureGather(Texture_Sampler, vec3(1.0f, 2.0f, float(3)), 0))";
         case ValidTextureOverload::kGather2dArrayOffsetF32:
-            return R"(textureGatherOffset(tint_symbol_sampler, vec3(1.0f, 2.0f, float(3u)), ivec2(4, 5), int(0u)))";
+            return R"(textureGatherOffset(Texture_Sampler, vec3(1.0f, 2.0f, float(3u)), ivec2(4, 5), int(0u)))";
         case ValidTextureOverload::kGatherCubeF32:
-            return R"(textureGather(tint_symbol_sampler, vec3(1.0f, 2.0f, 3.0f), 0))";
+            return R"(textureGather(Texture_Sampler, vec3(1.0f, 2.0f, 3.0f), 0))";
         case ValidTextureOverload::kGatherCubeArrayF32:
-            return R"(textureGather(tint_symbol_sampler, vec4(1.0f, 2.0f, 3.0f, float(4u)), int(0u))";
+            return R"(textureGather(Texture_Sampler, vec4(1.0f, 2.0f, 3.0f, float(4u)), int(0u))";
         case ValidTextureOverload::kGatherDepth2dF32:
-            return R"(textureGather(tint_symbol_sampler, vec2(1.0f, 2.0f), 0.0))";
+            return R"(textureGather(Texture_Sampler, vec2(1.0f, 2.0f), 0.0))";
         case ValidTextureOverload::kGatherDepth2dOffsetF32:
-            return R"(textureGatherOffset(tint_symbol_sampler, vec2(1.0f, 2.0f), 0.0, ivec2(3, 4))";
+            return R"(textureGatherOffset(Texture_Sampler, vec2(1.0f, 2.0f), 0.0, ivec2(3, 4))";
         case ValidTextureOverload::kGatherDepth2dArrayF32:
-            return R"(textureGather(tint_symbol_sampler, vec3(1.0f, 2.0f, float(3u)), 0.0))";
+            return R"(textureGather(Texture_Sampler, vec3(1.0f, 2.0f, float(3u)), 0.0))";
         case ValidTextureOverload::kGatherDepth2dArrayOffsetF32:
-            return R"(textureGatherOffset(tint_symbol_sampler, vec3(1.0f, 2.0f, float(3)), 0.0, ivec2(4, 5)))";
+            return R"(textureGatherOffset(Texture_Sampler, vec3(1.0f, 2.0f, float(3)), 0.0, ivec2(4, 5)))";
         case ValidTextureOverload::kGatherDepthCubeF32:
-            return R"(textureGather(tint_symbol_sampler, vec3(1.0f, 2.0f, 3.0f), 0.0))";
+            return R"(textureGather(Texture_Sampler, vec3(1.0f, 2.0f, 3.0f), 0.0))";
         case ValidTextureOverload::kGatherDepthCubeArrayF32:
-            return R"(textureGather(tint_symbol_sampler, vec4(1.0f, 2.0f, 3.0f, float(4u)), 0.0))";
+            return R"(textureGather(Texture_Sampler, vec4(1.0f, 2.0f, 3.0f, float(4u)), 0.0))";
         case ValidTextureOverload::kGatherCompareDepth2dF32:
-            return R"(textureGather(tint_symbol_sampler, vec2(1.0f, 2.0f), 3.0f))";
+            return R"(textureGather(Texture_Sampler, vec2(1.0f, 2.0f), 3.0f))";
         case ValidTextureOverload::kGatherCompareDepth2dOffsetF32:
-            return R"(textureGatherOffset(tint_symbol_sampler, vec2(1.0f, 2.0f), 3.0f, ivec2(4, 5)))";
+            return R"(textureGatherOffset(Texture_Sampler, vec2(1.0f, 2.0f), 3.0f, ivec2(4, 5)))";
         case ValidTextureOverload::kGatherCompareDepth2dArrayF32:
-            return R"(textureGather(tint_symbol_sampler, vec3(1.0f, 2.0f, float(3)), 4.0f))";
+            return R"(textureGather(Texture_Sampler, vec3(1.0f, 2.0f, float(3)), 4.0f))";
         case ValidTextureOverload::kGatherCompareDepth2dArrayOffsetF32:
-            return R"(textureGatherOffset(tint_symbol_sampler, vec3(1.0f, 2.0f, float(3)), 4.0f, ivec2(5, 6)))";
+            return R"(textureGatherOffset(Texture_Sampler, vec3(1.0f, 2.0f, float(3)), 4.0f, ivec2(5, 6)))";
         case ValidTextureOverload::kGatherCompareDepthCubeF32:
-            return R"(textureGather(tint_symbol_sampler, vec3(1.0f, 2.0f, 3.0f), 4.0f))";
+            return R"(textureGather(Texture_Sampler, vec3(1.0f, 2.0f, 3.0f), 4.0f))";
         case ValidTextureOverload::kGatherCompareDepthCubeArrayF32:
-            return R"(textureGather(tint_symbol_sampler, vec4(1.0f, 2.0f, 3.0f, float(4u)), 5.0f))";
+            return R"(textureGather(Texture_Sampler, vec4(1.0f, 2.0f, 3.0f, float(4u)), 5.0f))";
         case ValidTextureOverload::kNumLayers2dArray:
         case ValidTextureOverload::kNumLayersDepth2dArray:
         case ValidTextureOverload::kNumLayersCubeArray:
@@ -117,156 +117,156 @@
         case ValidTextureOverload::kNumSamplesMultisampled2d:
             return {"textureSamples"};
         case ValidTextureOverload::kSample1dF32:
-            return R"(texture(tint_symbol_sampler, vec2(1.0f, 0.5f));)";
+            return R"(texture(Texture_Sampler, vec2(1.0f, 0.5f));)";
         case ValidTextureOverload::kSample2dF32:
-            return R"(texture(tint_symbol_sampler, vec2(1.0f, 2.0f));)";
+            return R"(texture(Texture_Sampler, vec2(1.0f, 2.0f));)";
         case ValidTextureOverload::kSample2dOffsetF32:
-            return R"(textureOffset(tint_symbol_sampler, vec2(1.0f, 2.0f), ivec2(3, 4));)";
+            return R"(textureOffset(Texture_Sampler, vec2(1.0f, 2.0f), ivec2(3, 4));)";
         case ValidTextureOverload::kSample2dArrayF32:
-            return R"(texture(tint_symbol_sampler, vec3(1.0f, 2.0f, float(3)));)";
+            return R"(texture(Texture_Sampler, vec3(1.0f, 2.0f, float(3)));)";
         case ValidTextureOverload::kSample2dArrayOffsetF32:
-            return R"(textureOffset(tint_symbol_sampler, vec3(1.0f, 2.0f, float(3u)), ivec2(4, 5));)";
+            return R"(textureOffset(Texture_Sampler, vec3(1.0f, 2.0f, float(3u)), ivec2(4, 5));)";
         case ValidTextureOverload::kSample3dF32:
-            return R"(texture(tint_symbol_sampler, vec3(1.0f, 2.0f, 3.0f));)";
+            return R"(texture(Texture_Sampler, vec3(1.0f, 2.0f, 3.0f));)";
         case ValidTextureOverload::kSample3dOffsetF32:
-            return R"(textureOffset(tint_symbol_sampler, vec3(1.0f, 2.0f, 3.0f), ivec3(4, 5, 6));)";
+            return R"(textureOffset(Texture_Sampler, vec3(1.0f, 2.0f, 3.0f), ivec3(4, 5, 6));)";
         case ValidTextureOverload::kSampleCubeF32:
-            return R"(texture(tint_symbol_sampler, vec3(1.0f, 2.0f, 3.0f));)";
+            return R"(texture(Texture_Sampler, vec3(1.0f, 2.0f, 3.0f));)";
         case ValidTextureOverload::kSampleCubeArrayF32:
-            return R"(texture(tint_symbol_sampler, vec4(1.0f, 2.0f, 3.0f, float(4)));)";
+            return R"(texture(Texture_Sampler, vec4(1.0f, 2.0f, 3.0f, float(4)));)";
         case ValidTextureOverload::kSampleDepth2dF32:
-            return R"(texture(tint_symbol_sampler, vec3(1.0f, 2.0f, 0.0f));)";
+            return R"(texture(Texture_Sampler, vec3(1.0f, 2.0f, 0.0f));)";
         case ValidTextureOverload::kSampleDepth2dOffsetF32:
-            return R"(textureOffset(tint_symbol_sampler, vec3(1.0f, 2.0f, 0.0f), ivec2(3, 4));)";
+            return R"(textureOffset(Texture_Sampler, vec3(1.0f, 2.0f, 0.0f), ivec2(3, 4));)";
         case ValidTextureOverload::kSampleDepth2dArrayF32:
-            return R"(texture(tint_symbol_sampler, vec4(1.0f, 2.0f, float(3), 0.0f));)";
+            return R"(texture(Texture_Sampler, vec4(1.0f, 2.0f, float(3), 0.0f));)";
         case ValidTextureOverload::kSampleDepth2dArrayOffsetF32:
-            return R"(textureOffset(tint_symbol_sampler, vec4(1.0f, 2.0f, float(3), 0.0f), ivec2(4, 5));)";
+            return R"(textureOffset(Texture_Sampler, vec4(1.0f, 2.0f, float(3), 0.0f), ivec2(4, 5));)";
         case ValidTextureOverload::kSampleDepthCubeF32:
-            return R"(texture(tint_symbol_sampler, vec4(1.0f, 2.0f, 3.0f, 0.0f));)";
+            return R"(texture(Texture_Sampler, vec4(1.0f, 2.0f, 3.0f, 0.0f));)";
         case ValidTextureOverload::kSampleDepthCubeArrayF32:
-            return R"(texture(tint_symbol_sampler, vec4(1.0f, 2.0f, 3.0f, float(4u)), 0.0f);)";
+            return R"(texture(Texture_Sampler, vec4(1.0f, 2.0f, 3.0f, float(4u)), 0.0f);)";
         case ValidTextureOverload::kSampleBias2dF32:
-            return R"(texture(tint_symbol_sampler, vec2(1.0f, 2.0f), 3.0f);)";
+            return R"(texture(Texture_Sampler, vec2(1.0f, 2.0f), 3.0f);)";
         case ValidTextureOverload::kSampleBias2dOffsetF32:
-            return R"(textureOffset(tint_symbol_sampler, vec2(1.0f, 2.0f), ivec2(4, 5), 3.0f);)";
+            return R"(textureOffset(Texture_Sampler, vec2(1.0f, 2.0f), ivec2(4, 5), 3.0f);)";
         case ValidTextureOverload::kSampleBias2dArrayF32:
-            return R"(texture(tint_symbol_sampler, vec3(1.0f, 2.0f, float(4u)), 3.0f);)";
+            return R"(texture(Texture_Sampler, vec3(1.0f, 2.0f, float(4u)), 3.0f);)";
         case ValidTextureOverload::kSampleBias2dArrayOffsetF32:
-            return R"(textureOffset(tint_symbol_sampler, vec3(1.0f, 2.0f, float(3)), ivec2(5, 6), 4.0f);)";
+            return R"(textureOffset(Texture_Sampler, vec3(1.0f, 2.0f, float(3)), ivec2(5, 6), 4.0f);)";
         case ValidTextureOverload::kSampleBias3dF32:
-            return R"(texture(tint_symbol_sampler, vec3(1.0f, 2.0f, 3.0f), 4.0f);)";
+            return R"(texture(Texture_Sampler, vec3(1.0f, 2.0f, 3.0f), 4.0f);)";
         case ValidTextureOverload::kSampleBias3dOffsetF32:
-            return R"(textureOffset(tint_symbol_sampler, vec3(1.0f, 2.0f, 3.0f), ivec3(5, 6, 7), 4.0f);)";
+            return R"(textureOffset(Texture_Sampler, vec3(1.0f, 2.0f, 3.0f), ivec3(5, 6, 7), 4.0f);)";
         case ValidTextureOverload::kSampleBiasCubeF32:
-            return R"(texture(tint_symbol_sampler, vec3(1.0f, 2.0f, 3.0f), 4.0f);)";
+            return R"(texture(Texture_Sampler, vec3(1.0f, 2.0f, 3.0f), 4.0f);)";
         case ValidTextureOverload::kSampleBiasCubeArrayF32:
-            return R"(texture(tint_symbol_sampler, vec4(1.0f, 2.0f, 3.0f, float(3)), 4.0f);)";
+            return R"(texture(Texture_Sampler, vec4(1.0f, 2.0f, 3.0f, float(3)), 4.0f);)";
         case ValidTextureOverload::kSampleLevel2dF32:
-            return R"(textureLod(tint_symbol_sampler, vec2(1.0f, 2.0f), 3.0f);)";
+            return R"(textureLod(Texture_Sampler, vec2(1.0f, 2.0f), 3.0f);)";
         case ValidTextureOverload::kSampleLevel2dOffsetF32:
-            return R"(textureLodOffset(tint_symbol_sampler, vec2(1.0f, 2.0f), 3.0f, ivec2(4, 5));)";
+            return R"(textureLodOffset(Texture_Sampler, vec2(1.0f, 2.0f), 3.0f, ivec2(4, 5));)";
         case ValidTextureOverload::kSampleLevel2dArrayF32:
-            return R"(textureLod(tint_symbol_sampler, vec3(1.0f, 2.0f, float(3)), 4.0f);)";
+            return R"(textureLod(Texture_Sampler, vec3(1.0f, 2.0f, float(3)), 4.0f);)";
         case ValidTextureOverload::kSampleLevel2dArrayOffsetF32:
-            return R"(textureLodOffset(tint_symbol_sampler, vec3(1.0f, 2.0f, float(3)), 4.0f, ivec2(5, 6));)";
+            return R"(textureLodOffset(Texture_Sampler, vec3(1.0f, 2.0f, float(3)), 4.0f, ivec2(5, 6));)";
         case ValidTextureOverload::kSampleLevel3dF32:
-            return R"(textureLod(tint_symbol_sampler, vec3(1.0f, 2.0f, 3.0f), 4.0f);)";
+            return R"(textureLod(Texture_Sampler, vec3(1.0f, 2.0f, 3.0f), 4.0f);)";
         case ValidTextureOverload::kSampleLevel3dOffsetF32:
-            return R"(textureLodOffset(tint_symbol_sampler, vec3(1.0f, 2.0f, 3.0f), 4.0f, ivec3(5, 6, 7));)";
+            return R"(textureLodOffset(Texture_Sampler, vec3(1.0f, 2.0f, 3.0f), 4.0f, ivec3(5, 6, 7));)";
         case ValidTextureOverload::kSampleLevelCubeF32:
-            return R"(textureLod(tint_symbol_sampler, vec3(1.0f, 2.0f, 3.0f), 4.0f);)";
+            return R"(textureLod(Texture_Sampler, vec3(1.0f, 2.0f, 3.0f), 4.0f);)";
         case ValidTextureOverload::kSampleLevelCubeArrayF32:
-            return R"(textureLod(tint_symbol_sampler, vec4(1.0f, 2.0f, 3.0f, float(4)), 5.0f);)";
+            return R"(textureLod(Texture_Sampler, vec4(1.0f, 2.0f, 3.0f, float(4)), 5.0f);)";
         case ValidTextureOverload::kSampleLevelDepth2dF32:
-            return R"(textureLod(tint_symbol_sampler, vec3(1.0f, 2.0f, 0.0f), float(3u));)";
+            return R"(textureLod(Texture_Sampler, vec3(1.0f, 2.0f, 0.0f), float(3u));)";
         case ValidTextureOverload::kSampleLevelDepth2dOffsetF32:
-            return R"(textureLodOffset(tint_symbol_sampler, vec3(1.0f, 2.0f, 0.0f), float(3), ivec2(4, 5));)";
+            return R"(textureLodOffset(Texture_Sampler, vec3(1.0f, 2.0f, 0.0f), float(3), ivec2(4, 5));)";
         case ValidTextureOverload::kSampleLevelDepth2dArrayF32:
-            return R"(textureLod(tint_symbol_sampler, vec4(1.0f, 2.0f, float(3u), 0.0f), float(4u));)";
+            return R"(textureLod(Texture_Sampler, vec4(1.0f, 2.0f, float(3u), 0.0f), float(4u));)";
         case ValidTextureOverload::kSampleLevelDepth2dArrayOffsetF32:
-            return R"(textureLodOffset(tint_symbol_sampler, vec4(1.0f, 2.0f, float(3u), 0.0f), float(4u), ivec2(5, 6));)";
+            return R"(textureLodOffset(Texture_Sampler, vec4(1.0f, 2.0f, float(3u), 0.0f), float(4u), ivec2(5, 6));)";
         case ValidTextureOverload::kSampleLevelDepthCubeF32:
-            return R"(textureLod(tint_symbol_sampler, vec4(1.0f, 2.0f, 3.0f, 0.0f), float(4)))";
+            return R"(textureLod(Texture_Sampler, vec4(1.0f, 2.0f, 3.0f, 0.0f), float(4)))";
         case ValidTextureOverload::kSampleLevelDepthCubeArrayF32:
-            return R"(textureLod(tint_symbol_sampler, vec4(1.0f, 2.0f, 3.0f, float(4)), float(5));)";
+            return R"(textureLod(Texture_Sampler, vec4(1.0f, 2.0f, 3.0f, float(4)), float(5));)";
         case ValidTextureOverload::kSampleGrad2dF32:
-            return R"(textureGrad(tint_symbol_sampler, vec2(1.0f, 2.0f), vec2(3.0f, 4.0f), vec2(5.0f, 6.0f));)";
+            return R"(textureGrad(Texture_Sampler, vec2(1.0f, 2.0f), vec2(3.0f, 4.0f), vec2(5.0f, 6.0f));)";
         case ValidTextureOverload::kSampleGrad2dOffsetF32:
-            return R"(textureGradOffset(tint_symbol_sampler, vec2(1.0f, 2.0f), vec2(3.0f, 4.0f), vec2(5.0f, 6.0f), ivec2(7));)";
+            return R"(textureGradOffset(Texture_Sampler, vec2(1.0f, 2.0f), vec2(3.0f, 4.0f), vec2(5.0f, 6.0f), ivec2(7));)";
         case ValidTextureOverload::kSampleGrad2dArrayF32:
-            return R"(textureGrad(tint_symbol_sampler, vec3(1.0f, 2.0f, float(3)), vec2(4.0f, 5.0f), vec2(6.0f, 7.0f));)";
+            return R"(textureGrad(Texture_Sampler, vec3(1.0f, 2.0f, float(3)), vec2(4.0f, 5.0f), vec2(6.0f, 7.0f));)";
         case ValidTextureOverload::kSampleGrad2dArrayOffsetF32:
-            return R"(textureGradOffset(tint_symbol_sampler, vec3(1.0f, 2.0f, float(3u)), vec2(4.0f, 5.0f), vec2(6.0f, 7.0f), ivec2(6, 7));)";
+            return R"(textureGradOffset(Texture_Sampler, vec3(1.0f, 2.0f, float(3u)), vec2(4.0f, 5.0f), vec2(6.0f, 7.0f), ivec2(6, 7));)";
         case ValidTextureOverload::kSampleGrad3dF32:
-            return R"(textureGrad(tint_symbol_sampler, vec3(1.0f, 2.0f, 3.0f), vec3(4.0f, 5.0f, 6.0f), vec3(7.0f, 8.0f, 9.0f));)";
+            return R"(textureGrad(Texture_Sampler, vec3(1.0f, 2.0f, 3.0f), vec3(4.0f, 5.0f, 6.0f), vec3(7.0f, 8.0f, 9.0f));)";
         case ValidTextureOverload::kSampleGrad3dOffsetF32:
-            return R"(textureGradOffset(tint_symbol_sampler, vec3(1.0f, 2.0f, 3.0f), vec3(4.0f, 5.0f, 6.0f), vec3(7.0f, 8.0f, 9.0f), ivec3(0, 1, 2));)";
+            return R"(textureGradOffset(Texture_Sampler, vec3(1.0f, 2.0f, 3.0f), vec3(4.0f, 5.0f, 6.0f), vec3(7.0f, 8.0f, 9.0f), ivec3(0, 1, 2));)";
         case ValidTextureOverload::kSampleGradCubeF32:
-            return R"(textureGrad(tint_symbol_sampler, vec3(1.0f, 2.0f, 3.0f), vec3(4.0f, 5.0f, 6.0f), vec3(7.0f, 8.0f, 9.0f));)";
+            return R"(textureGrad(Texture_Sampler, vec3(1.0f, 2.0f, 3.0f), vec3(4.0f, 5.0f, 6.0f), vec3(7.0f, 8.0f, 9.0f));)";
         case ValidTextureOverload::kSampleGradCubeArrayF32:
-            return R"(textureGrad(tint_symbol_sampler, vec4(1.0f, 2.0f, 3.0f, float(4u)), vec3(5.0f, 6.0f, 7.0f), vec3(8.0f, 9.0f, 10.0f));)";
+            return R"(textureGrad(Texture_Sampler, vec4(1.0f, 2.0f, 3.0f, float(4u)), vec3(5.0f, 6.0f, 7.0f), vec3(8.0f, 9.0f, 10.0f));)";
         case ValidTextureOverload::kSampleCompareDepth2dF32:
-            return R"(texture(tint_symbol_sampler, vec3(1.0f, 2.0f, 3.0f));)";
+            return R"(texture(Texture_Sampler, vec3(1.0f, 2.0f, 3.0f));)";
         case ValidTextureOverload::kSampleCompareDepth2dOffsetF32:
-            return R"(textureOffset(tint_symbol_sampler, vec3(1.0f, 2.0f, 3.0f), ivec2(4, 5));)";
+            return R"(textureOffset(Texture_Sampler, vec3(1.0f, 2.0f, 3.0f), ivec2(4, 5));)";
         case ValidTextureOverload::kSampleCompareDepth2dArrayF32:
-            return R"(texture(tint_symbol_sampler, vec4(1.0f, 2.0f, float(4), 3.0f));)";
+            return R"(texture(Texture_Sampler, vec4(1.0f, 2.0f, float(4), 3.0f));)";
         case ValidTextureOverload::kSampleCompareDepth2dArrayOffsetF32:
-            return R"(textureOffset(tint_symbol_sampler, vec4(1.0f, 2.0f, float(4u), 3.0f), ivec2(5, 6));)";
+            return R"(textureOffset(Texture_Sampler, vec4(1.0f, 2.0f, float(4u), 3.0f), ivec2(5, 6));)";
         case ValidTextureOverload::kSampleCompareDepthCubeF32:
-            return R"(texture(tint_symbol_sampler, vec4(1.0f, 2.0f, 3.0f, 4.0f));)";
+            return R"(texture(Texture_Sampler, vec4(1.0f, 2.0f, 3.0f, 4.0f));)";
         case ValidTextureOverload::kSampleCompareDepthCubeArrayF32:
-            return R"(texture(tint_symbol_sampler, vec4(1.0f, 2.0f, 3.0f, float(4)), 5.0f);)";
+            return R"(texture(Texture_Sampler, vec4(1.0f, 2.0f, 3.0f, float(4)), 5.0f);)";
         case ValidTextureOverload::kSampleCompareLevelDepth2dF32:
-            return R"(texture(tint_symbol_sampler, vec3(1.0f, 2.0f, 3.0f));)";
+            return R"(texture(Texture_Sampler, vec3(1.0f, 2.0f, 3.0f));)";
         case ValidTextureOverload::kSampleCompareLevelDepth2dOffsetF32:
-            return R"(textureOffset(tint_symbol_sampler, vec3(1.0f, 2.0f, 3.0f), ivec2(4, 5));)";
+            return R"(textureOffset(Texture_Sampler, vec3(1.0f, 2.0f, 3.0f), ivec2(4, 5));)";
         case ValidTextureOverload::kSampleCompareLevelDepth2dArrayF32:
-            return R"(texture(tint_symbol_sampler, vec4(1.0f, 2.0f, float(3), 4.0f));)";
+            return R"(texture(Texture_Sampler, vec4(1.0f, 2.0f, float(3), 4.0f));)";
         case ValidTextureOverload::kSampleCompareLevelDepth2dArrayOffsetF32:
-            return R"(textureOffset(tint_symbol_sampler, vec4(1.0f, 2.0f, float(3), 4.0f), ivec2(5, 6));)";
+            return R"(textureOffset(Texture_Sampler, vec4(1.0f, 2.0f, float(3), 4.0f), ivec2(5, 6));)";
         case ValidTextureOverload::kSampleCompareLevelDepthCubeF32:
-            return R"(texture(tint_symbol_sampler, vec4(1.0f, 2.0f, 3.0f, 4.0f));)";
+            return R"(texture(Texture_Sampler, vec4(1.0f, 2.0f, 3.0f, 4.0f));)";
         case ValidTextureOverload::kSampleCompareLevelDepthCubeArrayF32:
-            return R"(texture(tint_symbol_sampler, vec4(1.0f, 2.0f, 3.0f, float(4)), 5.0f);)";
+            return R"(texture(Texture_Sampler, vec4(1.0f, 2.0f, 3.0f, float(4)), 5.0f);)";
         case ValidTextureOverload::kLoad1dLevelF32:
-            return R"(texelFetch(tint_symbol_2, ivec2(uvec2(1u, 0u)), int(3u));)";
+            return R"(texelFetch(Texture_1, ivec2(uvec2(1u, 0u)), int(3u));)";
         case ValidTextureOverload::kLoad1dLevelU32:
         case ValidTextureOverload::kLoad1dLevelI32:
-            return R"(texelFetch(tint_symbol_2, ivec2(1, 0), 3);)";
+            return R"(texelFetch(Texture_1, ivec2(1, 0), 3);)";
         case ValidTextureOverload::kLoad2dLevelU32:
-            return R"(texelFetch(tint_symbol_2, ivec2(1, 2), 3);)";
+            return R"(texelFetch(Texture_1, ivec2(1, 2), 3);)";
         case ValidTextureOverload::kLoad2dLevelF32:
         case ValidTextureOverload::kLoad2dLevelI32:
-            return R"(texelFetch(tint_symbol_2, ivec2(uvec2(1u, 2u)), int(3u));)";
+            return R"(texelFetch(Texture_1, ivec2(uvec2(1u, 2u)), int(3u));)";
         case ValidTextureOverload::kLoad2dArrayLevelF32:
         case ValidTextureOverload::kLoad2dArrayLevelU32:
         case ValidTextureOverload::kLoad3dLevelF32:
         case ValidTextureOverload::kLoad3dLevelU32:
-            return R"(texelFetch(tint_symbol_2, ivec3(1, 2, 3), 4);)";
+            return R"(texelFetch(Texture_1, ivec3(1, 2, 3), 4);)";
         case ValidTextureOverload::kLoad2dArrayLevelI32:
         case ValidTextureOverload::kLoad3dLevelI32:
-            return R"(texelFetch(tint_symbol_2, ivec3(uvec3(1u, 2u, 3u)), int(4u));)";
+            return R"(texelFetch(Texture_1, ivec3(uvec3(1u, 2u, 3u)), int(4u));)";
         case ValidTextureOverload::kLoadMultisampled2dF32:
         case ValidTextureOverload::kLoadMultisampled2dU32:
-            return R"(texelFetch(tint_symbol_2, ivec2(1, 2), 3);)";
+            return R"(texelFetch(Texture_1, ivec2(1, 2), 3);)";
         case ValidTextureOverload::kLoadMultisampled2dI32:
-            return R"(texelFetch(tint_symbol_2, ivec2(uvec2(1u, 2u)), int(3u));)";
+            return R"(texelFetch(Texture_1, ivec2(uvec2(1u, 2u)), int(3u));)";
         case ValidTextureOverload::kLoadDepth2dLevelF32:
-            return R"(texelFetch(tint_symbol_2, ivec2(1, 2), 3);)";
+            return R"(texelFetch(Texture_1, ivec2(1, 2), 3);)";
         case ValidTextureOverload::kLoadDepth2dArrayLevelF32:
-            return R"(texelFetch(tint_symbol_2, ivec3(uvec3(1u, 2u, 3u)), int(4u));)";
+            return R"(texelFetch(Texture_1, ivec3(uvec3(1u, 2u, 3u)), int(4u));)";
         case ValidTextureOverload::kLoadDepthMultisampled2dF32:
-            return R"(texelFetch(tint_symbol_2, ivec2(uvec2(1u, 2u)), int(3u)).x;)";
+            return R"(texelFetch(Texture_1, ivec2(uvec2(1u, 2u)), int(3u)).x;)";
         case ValidTextureOverload::kStoreWO1dRgba32float:
-            return R"(imageStore(tint_symbol, ivec2(1, 0), vec4(2.0f, 3.0f, 4.0f, 5.0f));)";
+            return R"(imageStore(Texture, ivec2(1, 0), vec4(2.0f, 3.0f, 4.0f, 5.0f));)";
         case ValidTextureOverload::kStoreWO2dRgba32float:
-            return R"(imageStore(tint_symbol, ivec2(1, 2), vec4(3.0f, 4.0f, 5.0f, 6.0f));)";
+            return R"(imageStore(Texture, ivec2(1, 2), vec4(3.0f, 4.0f, 5.0f, 6.0f));)";
         case ValidTextureOverload::kStoreWO2dArrayRgba32float:
-            return R"(imageStore(tint_symbol, ivec3(uvec3(1u, 2u, 3u)), vec4(4.0f, 5.0f, 6.0f, 7.0f));)";
+            return R"(imageStore(Texture, ivec3(uvec3(1u, 2u, 3u)), vec4(4.0f, 5.0f, 6.0f, 7.0f));)";
         case ValidTextureOverload::kStoreWO3dRgba32float:
-            return R"(imageStore(tint_symbol, ivec3(uvec3(1u, 2u, 3u)), vec4(4.0f, 5.0f, 6.0f, 7.0f));)";
+            return R"(imageStore(Texture, ivec3(uvec3(1u, 2u, 3u)), vec4(4.0f, 5.0f, 6.0f, 7.0f));)";
     }
     return "<unmatched texture overload>";
 }  // NOLINT - Ignore the length of this function
diff --git a/src/tint/writer/msl/generator_impl.cc b/src/tint/writer/msl/generator_impl.cc
index b09c554..7100321 100644
--- a/src/tint/writer/msl/generator_impl.cc
+++ b/src/tint/writer/msl/generator_impl.cc
@@ -2025,60 +2025,81 @@
                 out << " " << param_name;
             }
 
-            if (type->Is<sem::Struct>()) {
-                out << " [[stage_in]]";
-            } else if (type->is_handle()) {
-                uint32_t binding = get_binding_index(param);
-                if (binding == kInvalidBindingIndex) {
-                    return false;
-                }
-                if (param->type->Is<ast::Sampler>()) {
-                    out << " [[sampler(" << binding << ")]]";
-                } else if (TINT_LIKELY(param->type->Is<ast::Texture>())) {
-                    out << " [[texture(" << binding << ")]]";
-                } else {
-                    TINT_ICE(Writer, diagnostics_) << "invalid handle type entry point parameter";
-                    return false;
-                }
-            } else if (auto* ptr = param->type->As<ast::Pointer>()) {
-                auto sc = ptr->address_space;
-                if (sc == type::AddressSpace::kWorkgroup) {
-                    auto& allocations = workgroup_allocations_[func_name];
-                    out << " [[threadgroup(" << allocations.size() << ")]]";
-                    allocations.push_back(program_->Sem().Get(ptr->type)->Size());
-                } else if (TINT_LIKELY(sc == type::AddressSpace::kStorage ||
-                                       sc == type::AddressSpace::kUniform)) {
+            bool ok = Switch(
+                type,  //
+                [&](const type::Struct*) {
+                    out << " [[stage_in]]";
+                    return true;
+                },
+                [&](const type::Texture*) {
                     uint32_t binding = get_binding_index(param);
                     if (binding == kInvalidBindingIndex) {
                         return false;
                     }
-                    out << " [[buffer(" << binding << ")]]";
-                } else {
+                    out << " [[texture(" << binding << ")]]";
+                    return true;
+                },
+                [&](const type::Sampler*) {
+                    uint32_t binding = get_binding_index(param);
+                    if (binding == kInvalidBindingIndex) {
+                        return false;
+                    }
+                    out << " [[sampler(" << binding << ")]]";
+                    return true;
+                },
+                [&](const type::Pointer* ptr) {
+                    switch (ptr->AddressSpace()) {
+                        case type::AddressSpace::kWorkgroup: {
+                            auto& allocations = workgroup_allocations_[func_name];
+                            out << " [[threadgroup(" << allocations.size() << ")]]";
+                            allocations.push_back(ptr->StoreType()->Size());
+                            return true;
+                        }
+
+                        case type::AddressSpace::kStorage:
+                        case type::AddressSpace::kUniform: {
+                            uint32_t binding = get_binding_index(param);
+                            if (binding == kInvalidBindingIndex) {
+                                return false;
+                            }
+                            out << " [[buffer(" << binding << ")]]";
+                            return true;
+                        }
+
+                        default:
+                            break;
+                    }
                     TINT_ICE(Writer, diagnostics_)
                         << "invalid pointer address space for entry point parameter";
                     return false;
-                }
-            } else {
-                auto& attrs = param->attributes;
-                bool builtin_found = false;
-                for (auto* attr : attrs) {
-                    auto* builtin = attr->As<ast::BuiltinAttribute>();
-                    if (!builtin) {
-                        continue;
+                },
+                [&](Default) {
+                    auto& attrs = param->attributes;
+                    bool builtin_found = false;
+                    for (auto* attr : attrs) {
+                        auto* builtin = attr->As<ast::BuiltinAttribute>();
+                        if (!builtin) {
+                            continue;
+                        }
+
+                        builtin_found = true;
+
+                        auto name = builtin_to_attribute(builtin->builtin);
+                        if (name.empty()) {
+                            diagnostics_.add_error(diag::System::Writer, "unknown builtin");
+                            return false;
+                        }
+                        out << " [[" << name << "]]";
                     }
-
-                    builtin_found = true;
-
-                    auto name = builtin_to_attribute(builtin->builtin);
-                    if (name.empty()) {
-                        diagnostics_.add_error(diag::System::Writer, "unknown builtin");
+                    if (TINT_UNLIKELY(!builtin_found)) {
+                        TINT_ICE(Writer, diagnostics_) << "Unsupported entry point parameter";
                         return false;
                     }
-                    out << " [[" << name << "]]";
-                }
-                if (TINT_UNLIKELY(!builtin_found)) {
-                    TINT_ICE(Writer, diagnostics_) << "Unsupported entry point parameter";
-                }
+                    return true;
+                });
+
+            if (!ok) {
+                return false;
             }
         }
         out << ") {";
diff --git a/src/tint/writer/msl/generator_impl_builtin_texture_test.cc b/src/tint/writer/msl/generator_impl_builtin_texture_test.cc
index 5414416..028f851 100644
--- a/src/tint/writer/msl/generator_impl_builtin_texture_test.cc
+++ b/src/tint/writer/msl/generator_impl_builtin_texture_test.cc
@@ -24,7 +24,7 @@
     switch (overload) {
         case ValidTextureOverload::kDimensions1d:
         case ValidTextureOverload::kDimensionsStorageWO1d:
-            return R"(texture.get_width(0))";
+            return R"(Texture.get_width(0))";
         case ValidTextureOverload::kDimensions2d:
         case ValidTextureOverload::kDimensions2dArray:
         case ValidTextureOverload::kDimensionsCube:
@@ -37,10 +37,10 @@
         case ValidTextureOverload::kDimensionsDepthMultisampled2d:
         case ValidTextureOverload::kDimensionsStorageWO2d:
         case ValidTextureOverload::kDimensionsStorageWO2dArray:
-            return R"(uint2(texture.get_width(), texture.get_height()))";
+            return R"(uint2(Texture.get_width(), Texture.get_height()))";
         case ValidTextureOverload::kDimensions3d:
         case ValidTextureOverload::kDimensionsStorageWO3d:
-            return R"(uint3(texture.get_width(), texture.get_height(), texture.get_depth()))";
+            return R"(uint3(Texture.get_width(), Texture.get_height(), Texture.get_depth()))";
         case ValidTextureOverload::kDimensions2dLevel:
         case ValidTextureOverload::kDimensionsCubeLevel:
         case ValidTextureOverload::kDimensionsCubeArrayLevel:
@@ -49,51 +49,51 @@
         case ValidTextureOverload::kDimensionsDepth2dArrayLevel:
         case ValidTextureOverload::kDimensionsDepthCubeLevel:
         case ValidTextureOverload::kDimensionsDepthCubeArrayLevel:
-            return R"(uint2(texture.get_width(1), texture.get_height(1)))";
+            return R"(uint2(Texture.get_width(1), Texture.get_height(1)))";
         case ValidTextureOverload::kDimensions3dLevel:
-            return R"(uint3(texture.get_width(1), texture.get_height(1), texture.get_depth(1)))";
+            return R"(uint3(Texture.get_width(1), Texture.get_height(1), Texture.get_depth(1)))";
         case ValidTextureOverload::kGather2dF32:
-            return R"(texture.gather(sampler, float2(1.0f, 2.0f), int2(0), component::x))";
+            return R"(Texture.gather(Sampler, float2(1.0f, 2.0f), int2(0), component::x))";
         case ValidTextureOverload::kGather2dOffsetF32:
-            return R"(texture.gather(sampler, float2(1.0f, 2.0f), int2(3, 4), component::x))";
+            return R"(Texture.gather(Sampler, float2(1.0f, 2.0f), int2(3, 4), component::x))";
         case ValidTextureOverload::kGather2dArrayF32:
-            return R"(texture.gather(sampler, float2(1.0f, 2.0f), 3, int2(0), component::x))";
+            return R"(Texture.gather(Sampler, float2(1.0f, 2.0f), 3, int2(0), component::x))";
         case ValidTextureOverload::kGather2dArrayOffsetF32:
-            return R"(texture.gather(sampler, float2(1.0f, 2.0f), 3u, int2(4, 5), component::x))";
+            return R"(Texture.gather(Sampler, float2(1.0f, 2.0f), 3u, int2(4, 5), component::x))";
         case ValidTextureOverload::kGatherCubeF32:
-            return R"(texture.gather(sampler, float3(1.0f, 2.0f, 3.0f), component::x))";
+            return R"(Texture.gather(Sampler, float3(1.0f, 2.0f, 3.0f), component::x))";
         case ValidTextureOverload::kGatherCubeArrayF32:
-            return R"(texture.gather(sampler, float3(1.0f, 2.0f, 3.0f), 4u, component::x))";
+            return R"(Texture.gather(Sampler, float3(1.0f, 2.0f, 3.0f), 4u, component::x))";
         case ValidTextureOverload::kGatherDepth2dF32:
-            return R"(texture.gather(sampler, float2(1.0f, 2.0f)))";
+            return R"(Texture.gather(Sampler, float2(1.0f, 2.0f)))";
         case ValidTextureOverload::kGatherDepth2dOffsetF32:
-            return R"(texture.gather(sampler, float2(1.0f, 2.0f), int2(3, 4)))";
+            return R"(Texture.gather(Sampler, float2(1.0f, 2.0f), int2(3, 4)))";
         case ValidTextureOverload::kGatherDepth2dArrayF32:
-            return R"(texture.gather(sampler, float2(1.0f, 2.0f), 3u))";
+            return R"(Texture.gather(Sampler, float2(1.0f, 2.0f), 3u))";
         case ValidTextureOverload::kGatherDepth2dArrayOffsetF32:
-            return R"(texture.gather(sampler, float2(1.0f, 2.0f), 3, int2(4, 5)))";
+            return R"(Texture.gather(Sampler, float2(1.0f, 2.0f), 3, int2(4, 5)))";
         case ValidTextureOverload::kGatherDepthCubeF32:
-            return R"(texture.gather(sampler, float3(1.0f, 2.0f, 3.0f)))";
+            return R"(Texture.gather(Sampler, float3(1.0f, 2.0f, 3.0f)))";
         case ValidTextureOverload::kGatherDepthCubeArrayF32:
-            return R"(texture.gather(sampler, float3(1.0f, 2.0f, 3.0f), 4u))";
+            return R"(Texture.gather(Sampler, float3(1.0f, 2.0f, 3.0f), 4u))";
         case ValidTextureOverload::kGatherCompareDepth2dF32:
-            return R"(texture.gather_compare(sampler, float2(1.0f, 2.0f), 3.0f))";
+            return R"(Texture.gather_compare(Sampler, float2(1.0f, 2.0f), 3.0f))";
         case ValidTextureOverload::kGatherCompareDepth2dOffsetF32:
-            return R"(texture.gather_compare(sampler, float2(1.0f, 2.0f), 3.0f, int2(4, 5)))";
+            return R"(Texture.gather_compare(Sampler, float2(1.0f, 2.0f), 3.0f, int2(4, 5)))";
         case ValidTextureOverload::kGatherCompareDepth2dArrayF32:
-            return R"(texture.gather_compare(sampler, float2(1.0f, 2.0f), 3, 4.0f))";
+            return R"(Texture.gather_compare(Sampler, float2(1.0f, 2.0f), 3, 4.0f))";
         case ValidTextureOverload::kGatherCompareDepth2dArrayOffsetF32:
-            return R"(texture.gather_compare(sampler, float2(1.0f, 2.0f), 3, 4.0f, int2(5, 6)))";
+            return R"(Texture.gather_compare(Sampler, float2(1.0f, 2.0f), 3, 4.0f, int2(5, 6)))";
         case ValidTextureOverload::kGatherCompareDepthCubeF32:
-            return R"(texture.gather_compare(sampler, float3(1.0f, 2.0f, 3.0f), 4.0f))";
+            return R"(Texture.gather_compare(Sampler, float3(1.0f, 2.0f, 3.0f), 4.0f))";
         case ValidTextureOverload::kGatherCompareDepthCubeArrayF32:
-            return R"(texture.gather_compare(sampler, float3(1.0f, 2.0f, 3.0f), 4u, 5.0f))";
+            return R"(Texture.gather_compare(Sampler, float3(1.0f, 2.0f, 3.0f), 4u, 5.0f))";
         case ValidTextureOverload::kNumLayers2dArray:
         case ValidTextureOverload::kNumLayersCubeArray:
         case ValidTextureOverload::kNumLayersDepth2dArray:
         case ValidTextureOverload::kNumLayersDepthCubeArray:
         case ValidTextureOverload::kNumLayersStorageWO2dArray:
-            return R"(texture.get_array_size())";
+            return R"(Texture.get_array_size())";
         case ValidTextureOverload::kNumLevels2d:
         case ValidTextureOverload::kNumLevels2dArray:
         case ValidTextureOverload::kNumLevels3d:
@@ -103,166 +103,166 @@
         case ValidTextureOverload::kNumLevelsDepth2dArray:
         case ValidTextureOverload::kNumLevelsDepthCube:
         case ValidTextureOverload::kNumLevelsDepthCubeArray:
-            return R"(texture.get_num_mip_levels())";
+            return R"(Texture.get_num_mip_levels())";
         case ValidTextureOverload::kNumSamplesDepthMultisampled2d:
         case ValidTextureOverload::kNumSamplesMultisampled2d:
-            return R"(texture.get_num_samples())";
+            return R"(Texture.get_num_samples())";
         case ValidTextureOverload::kSample1dF32:
-            return R"(texture.sample(sampler, 1.0f))";
+            return R"(Texture.sample(Sampler, 1.0f))";
         case ValidTextureOverload::kSample2dF32:
-            return R"(texture.sample(sampler, float2(1.0f, 2.0f)))";
+            return R"(Texture.sample(Sampler, float2(1.0f, 2.0f)))";
         case ValidTextureOverload::kSample2dOffsetF32:
-            return R"(texture.sample(sampler, float2(1.0f, 2.0f), int2(3, 4)))";
+            return R"(Texture.sample(Sampler, float2(1.0f, 2.0f), int2(3, 4)))";
         case ValidTextureOverload::kSample2dArrayF32:
-            return R"(texture.sample(sampler, float2(1.0f, 2.0f), 3))";
+            return R"(Texture.sample(Sampler, float2(1.0f, 2.0f), 3))";
         case ValidTextureOverload::kSample2dArrayOffsetF32:
-            return R"(texture.sample(sampler, float2(1.0f, 2.0f), 3u, int2(4, 5)))";
+            return R"(Texture.sample(Sampler, float2(1.0f, 2.0f), 3u, int2(4, 5)))";
         case ValidTextureOverload::kSample3dF32:
-            return R"(texture.sample(sampler, float3(1.0f, 2.0f, 3.0f)))";
+            return R"(Texture.sample(Sampler, float3(1.0f, 2.0f, 3.0f)))";
         case ValidTextureOverload::kSample3dOffsetF32:
-            return R"(texture.sample(sampler, float3(1.0f, 2.0f, 3.0f), int3(4, 5, 6)))";
+            return R"(Texture.sample(Sampler, float3(1.0f, 2.0f, 3.0f), int3(4, 5, 6)))";
         case ValidTextureOverload::kSampleCubeF32:
-            return R"(texture.sample(sampler, float3(1.0f, 2.0f, 3.0f)))";
+            return R"(Texture.sample(Sampler, float3(1.0f, 2.0f, 3.0f)))";
         case ValidTextureOverload::kSampleCubeArrayF32:
-            return R"(texture.sample(sampler, float3(1.0f, 2.0f, 3.0f), 4))";
+            return R"(Texture.sample(Sampler, float3(1.0f, 2.0f, 3.0f), 4))";
         case ValidTextureOverload::kSampleDepth2dF32:
-            return R"(texture.sample(sampler, float2(1.0f, 2.0f)))";
+            return R"(Texture.sample(Sampler, float2(1.0f, 2.0f)))";
         case ValidTextureOverload::kSampleDepth2dOffsetF32:
-            return R"(texture.sample(sampler, float2(1.0f, 2.0f), int2(3, 4)))";
+            return R"(Texture.sample(Sampler, float2(1.0f, 2.0f), int2(3, 4)))";
         case ValidTextureOverload::kSampleDepth2dArrayF32:
-            return R"(texture.sample(sampler, float2(1.0f, 2.0f), 3))";
+            return R"(Texture.sample(Sampler, float2(1.0f, 2.0f), 3))";
         case ValidTextureOverload::kSampleDepth2dArrayOffsetF32:
-            return R"(texture.sample(sampler, float2(1.0f, 2.0f), 3, int2(4, 5)))";
+            return R"(Texture.sample(Sampler, float2(1.0f, 2.0f), 3, int2(4, 5)))";
         case ValidTextureOverload::kSampleDepthCubeF32:
-            return R"(texture.sample(sampler, float3(1.0f, 2.0f, 3.0f)))";
+            return R"(Texture.sample(Sampler, float3(1.0f, 2.0f, 3.0f)))";
         case ValidTextureOverload::kSampleDepthCubeArrayF32:
-            return R"(texture.sample(sampler, float3(1.0f, 2.0f, 3.0f), 4u))";
+            return R"(Texture.sample(Sampler, float3(1.0f, 2.0f, 3.0f), 4u))";
         case ValidTextureOverload::kSampleBias2dF32:
-            return R"(texture.sample(sampler, float2(1.0f, 2.0f), bias(3.0f)))";
+            return R"(Texture.sample(Sampler, float2(1.0f, 2.0f), bias(3.0f)))";
         case ValidTextureOverload::kSampleBias2dOffsetF32:
-            return R"(texture.sample(sampler, float2(1.0f, 2.0f), bias(3.0f), int2(4, 5)))";
+            return R"(Texture.sample(Sampler, float2(1.0f, 2.0f), bias(3.0f), int2(4, 5)))";
         case ValidTextureOverload::kSampleBias2dArrayF32:
-            return R"(texture.sample(sampler, float2(1.0f, 2.0f), 4u, bias(3.0f)))";
+            return R"(Texture.sample(Sampler, float2(1.0f, 2.0f), 4u, bias(3.0f)))";
         case ValidTextureOverload::kSampleBias2dArrayOffsetF32:
-            return R"(texture.sample(sampler, float2(1.0f, 2.0f), 3, bias(4.0f), int2(5, 6)))";
+            return R"(Texture.sample(Sampler, float2(1.0f, 2.0f), 3, bias(4.0f), int2(5, 6)))";
         case ValidTextureOverload::kSampleBias3dF32:
-            return R"(texture.sample(sampler, float3(1.0f, 2.0f, 3.0f), bias(4.0f)))";
+            return R"(Texture.sample(Sampler, float3(1.0f, 2.0f, 3.0f), bias(4.0f)))";
         case ValidTextureOverload::kSampleBias3dOffsetF32:
-            return R"(texture.sample(sampler, float3(1.0f, 2.0f, 3.0f), bias(4.0f), int3(5, 6, 7)))";
+            return R"(Texture.sample(Sampler, float3(1.0f, 2.0f, 3.0f), bias(4.0f), int3(5, 6, 7)))";
         case ValidTextureOverload::kSampleBiasCubeF32:
-            return R"(texture.sample(sampler, float3(1.0f, 2.0f, 3.0f), bias(4.0f)))";
+            return R"(Texture.sample(Sampler, float3(1.0f, 2.0f, 3.0f), bias(4.0f)))";
         case ValidTextureOverload::kSampleBiasCubeArrayF32:
-            return R"(texture.sample(sampler, float3(1.0f, 2.0f, 3.0f), 3, bias(4.0f)))";
+            return R"(Texture.sample(Sampler, float3(1.0f, 2.0f, 3.0f), 3, bias(4.0f)))";
         case ValidTextureOverload::kSampleLevel2dF32:
-            return R"(texture.sample(sampler, float2(1.0f, 2.0f), level(3.0f)))";
+            return R"(Texture.sample(Sampler, float2(1.0f, 2.0f), level(3.0f)))";
         case ValidTextureOverload::kSampleLevel2dOffsetF32:
-            return R"(texture.sample(sampler, float2(1.0f, 2.0f), level(3.0f), int2(4, 5)))";
+            return R"(Texture.sample(Sampler, float2(1.0f, 2.0f), level(3.0f), int2(4, 5)))";
         case ValidTextureOverload::kSampleLevel2dArrayF32:
-            return R"(texture.sample(sampler, float2(1.0f, 2.0f), 3, level(4.0f)))";
+            return R"(Texture.sample(Sampler, float2(1.0f, 2.0f), 3, level(4.0f)))";
         case ValidTextureOverload::kSampleLevel2dArrayOffsetF32:
-            return R"(texture.sample(sampler, float2(1.0f, 2.0f), 3, level(4.0f), int2(5, 6)))";
+            return R"(Texture.sample(Sampler, float2(1.0f, 2.0f), 3, level(4.0f), int2(5, 6)))";
         case ValidTextureOverload::kSampleLevel3dF32:
-            return R"(texture.sample(sampler, float3(1.0f, 2.0f, 3.0f), level(4.0f)))";
+            return R"(Texture.sample(Sampler, float3(1.0f, 2.0f, 3.0f), level(4.0f)))";
         case ValidTextureOverload::kSampleLevel3dOffsetF32:
-            return R"(texture.sample(sampler, float3(1.0f, 2.0f, 3.0f), level(4.0f), int3(5, 6, 7)))";
+            return R"(Texture.sample(Sampler, float3(1.0f, 2.0f, 3.0f), level(4.0f), int3(5, 6, 7)))";
         case ValidTextureOverload::kSampleLevelCubeF32:
-            return R"(texture.sample(sampler, float3(1.0f, 2.0f, 3.0f), level(4.0f)))";
+            return R"(Texture.sample(Sampler, float3(1.0f, 2.0f, 3.0f), level(4.0f)))";
         case ValidTextureOverload::kSampleLevelCubeArrayF32:
-            return R"(texture.sample(sampler, float3(1.0f, 2.0f, 3.0f), 4, level(5.0f)))";
+            return R"(Texture.sample(Sampler, float3(1.0f, 2.0f, 3.0f), 4, level(5.0f)))";
         case ValidTextureOverload::kSampleLevelDepth2dF32:
-            return R"(texture.sample(sampler, float2(1.0f, 2.0f), level(3u)))";
+            return R"(Texture.sample(Sampler, float2(1.0f, 2.0f), level(3u)))";
         case ValidTextureOverload::kSampleLevelDepth2dOffsetF32:
-            return R"(texture.sample(sampler, float2(1.0f, 2.0f), level(3), int2(4, 5)))";
+            return R"(Texture.sample(Sampler, float2(1.0f, 2.0f), level(3), int2(4, 5)))";
         case ValidTextureOverload::kSampleLevelDepth2dArrayF32:
-            return R"(texture.sample(sampler, float2(1.0f, 2.0f), 3u, level(4u)))";
+            return R"(Texture.sample(Sampler, float2(1.0f, 2.0f), 3u, level(4u)))";
         case ValidTextureOverload::kSampleLevelDepth2dArrayOffsetF32:
-            return R"(texture.sample(sampler, float2(1.0f, 2.0f), 3u, level(4u), int2(5, 6)))";
+            return R"(Texture.sample(Sampler, float2(1.0f, 2.0f), 3u, level(4u), int2(5, 6)))";
         case ValidTextureOverload::kSampleLevelDepthCubeF32:
-            return R"(texture.sample(sampler, float3(1.0f, 2.0f, 3.0f), level(4)))";
+            return R"(Texture.sample(Sampler, float3(1.0f, 2.0f, 3.0f), level(4)))";
         case ValidTextureOverload::kSampleLevelDepthCubeArrayF32:
-            return R"(texture.sample(sampler, float3(1.0f, 2.0f, 3.0f), 4, level(5)))";
+            return R"(Texture.sample(Sampler, float3(1.0f, 2.0f, 3.0f), 4, level(5)))";
         case ValidTextureOverload::kSampleGrad2dF32:
-            return R"(texture.sample(sampler, float2(1.0f, 2.0f), gradient2d(float2(3.0f, 4.0f), float2(5.0f, 6.0f))))";
+            return R"(Texture.sample(Sampler, float2(1.0f, 2.0f), gradient2d(float2(3.0f, 4.0f), float2(5.0f, 6.0f))))";
         case ValidTextureOverload::kSampleGrad2dOffsetF32:
-            return R"(texture.sample(sampler, float2(1.0f, 2.0f), gradient2d(float2(3.0f, 4.0f), float2(5.0f, 6.0f)), int2(7)))";
+            return R"(Texture.sample(Sampler, float2(1.0f, 2.0f), gradient2d(float2(3.0f, 4.0f), float2(5.0f, 6.0f)), int2(7)))";
         case ValidTextureOverload::kSampleGrad2dArrayF32:
-            return R"(texture.sample(sampler, float2(1.0f, 2.0f), 3, gradient2d(float2(4.0f, 5.0f), float2(6.0f, 7.0f))))";
+            return R"(Texture.sample(Sampler, float2(1.0f, 2.0f), 3, gradient2d(float2(4.0f, 5.0f), float2(6.0f, 7.0f))))";
         case ValidTextureOverload::kSampleGrad2dArrayOffsetF32:
-            return R"(texture.sample(sampler, float2(1.0f, 2.0f), 3u, gradient2d(float2(4.0f, 5.0f), float2(6.0f, 7.0f)), int2(6, 7)))";
+            return R"(Texture.sample(Sampler, float2(1.0f, 2.0f), 3u, gradient2d(float2(4.0f, 5.0f), float2(6.0f, 7.0f)), int2(6, 7)))";
         case ValidTextureOverload::kSampleGrad3dF32:
-            return R"(texture.sample(sampler, float3(1.0f, 2.0f, 3.0f), gradient3d(float3(4.0f, 5.0f, 6.0f), float3(7.0f, 8.0f, 9.0f))))";
+            return R"(Texture.sample(Sampler, float3(1.0f, 2.0f, 3.0f), gradient3d(float3(4.0f, 5.0f, 6.0f), float3(7.0f, 8.0f, 9.0f))))";
         case ValidTextureOverload::kSampleGrad3dOffsetF32:
-            return R"(texture.sample(sampler, float3(1.0f, 2.0f, 3.0f), gradient3d(float3(4.0f, 5.0f, 6.0f), float3(7.0f, 8.0f, 9.0f)), int3(0, 1, 2)))";
+            return R"(Texture.sample(Sampler, float3(1.0f, 2.0f, 3.0f), gradient3d(float3(4.0f, 5.0f, 6.0f), float3(7.0f, 8.0f, 9.0f)), int3(0, 1, 2)))";
         case ValidTextureOverload::kSampleGradCubeF32:
-            return R"(texture.sample(sampler, float3(1.0f, 2.0f, 3.0f), gradientcube(float3(4.0f, 5.0f, 6.0f), float3(7.0f, 8.0f, 9.0f))))";
+            return R"(Texture.sample(Sampler, float3(1.0f, 2.0f, 3.0f), gradientcube(float3(4.0f, 5.0f, 6.0f), float3(7.0f, 8.0f, 9.0f))))";
         case ValidTextureOverload::kSampleGradCubeArrayF32:
-            return R"(texture.sample(sampler, float3(1.0f, 2.0f, 3.0f), 4u, gradientcube(float3(5.0f, 6.0f, 7.0f), float3(8.0f, 9.0f, 10.0f))))";
+            return R"(Texture.sample(Sampler, float3(1.0f, 2.0f, 3.0f), 4u, gradientcube(float3(5.0f, 6.0f, 7.0f), float3(8.0f, 9.0f, 10.0f))))";
         case ValidTextureOverload::kSampleCompareDepth2dF32:
-            return R"(texture.sample_compare(sampler, float2(1.0f, 2.0f), 3.0f))";
+            return R"(Texture.sample_compare(Sampler, float2(1.0f, 2.0f), 3.0f))";
         case ValidTextureOverload::kSampleCompareDepth2dOffsetF32:
-            return R"(texture.sample_compare(sampler, float2(1.0f, 2.0f), 3.0f, int2(4, 5)))";
+            return R"(Texture.sample_compare(Sampler, float2(1.0f, 2.0f), 3.0f, int2(4, 5)))";
         case ValidTextureOverload::kSampleCompareDepth2dArrayF32:
-            return R"(texture.sample_compare(sampler, float2(1.0f, 2.0f), 4, 3.0f))";
+            return R"(Texture.sample_compare(Sampler, float2(1.0f, 2.0f), 4, 3.0f))";
         case ValidTextureOverload::kSampleCompareDepth2dArrayOffsetF32:
-            return R"(texture.sample_compare(sampler, float2(1.0f, 2.0f), 4u, 3.0f, int2(5, 6)))";
+            return R"(Texture.sample_compare(Sampler, float2(1.0f, 2.0f), 4u, 3.0f, int2(5, 6)))";
         case ValidTextureOverload::kSampleCompareDepthCubeF32:
-            return R"(texture.sample_compare(sampler, float3(1.0f, 2.0f, 3.0f), 4.0f))";
+            return R"(Texture.sample_compare(Sampler, float3(1.0f, 2.0f, 3.0f), 4.0f))";
         case ValidTextureOverload::kSampleCompareDepthCubeArrayF32:
-            return R"(texture.sample_compare(sampler, float3(1.0f, 2.0f, 3.0f), 4, 5.0f))";
+            return R"(Texture.sample_compare(Sampler, float3(1.0f, 2.0f, 3.0f), 4, 5.0f))";
         case ValidTextureOverload::kSampleCompareLevelDepth2dF32:
-            return R"(texture.sample_compare(sampler, float2(1.0f, 2.0f), 3.0f, level(0)))";
+            return R"(Texture.sample_compare(Sampler, float2(1.0f, 2.0f), 3.0f, level(0)))";
         case ValidTextureOverload::kSampleCompareLevelDepth2dOffsetF32:
-            return R"(texture.sample_compare(sampler, float2(1.0f, 2.0f), 3.0f, level(0), int2(4, 5)))";
+            return R"(Texture.sample_compare(Sampler, float2(1.0f, 2.0f), 3.0f, level(0), int2(4, 5)))";
         case ValidTextureOverload::kSampleCompareLevelDepth2dArrayF32:
-            return R"(texture.sample_compare(sampler, float2(1.0f, 2.0f), 3, 4.0f, level(0)))";
+            return R"(Texture.sample_compare(Sampler, float2(1.0f, 2.0f), 3, 4.0f, level(0)))";
         case ValidTextureOverload::kSampleCompareLevelDepth2dArrayOffsetF32:
-            return R"(texture.sample_compare(sampler, float2(1.0f, 2.0f), 3, 4.0f, level(0), int2(5, 6)))";
+            return R"(Texture.sample_compare(Sampler, float2(1.0f, 2.0f), 3, 4.0f, level(0), int2(5, 6)))";
         case ValidTextureOverload::kSampleCompareLevelDepthCubeF32:
-            return R"(texture.sample_compare(sampler, float3(1.0f, 2.0f, 3.0f), 4.0f, level(0)))";
+            return R"(Texture.sample_compare(Sampler, float3(1.0f, 2.0f, 3.0f), 4.0f, level(0)))";
         case ValidTextureOverload::kSampleCompareLevelDepthCubeArrayF32:
-            return R"(texture.sample_compare(sampler, float3(1.0f, 2.0f, 3.0f), 4, 5.0f, level(0)))";
+            return R"(Texture.sample_compare(Sampler, float3(1.0f, 2.0f, 3.0f), 4, 5.0f, level(0)))";
         case ValidTextureOverload::kLoad1dLevelF32:
-            return R"(texture.read(uint(1u), 0))";
+            return R"(Texture.read(uint(1u), 0))";
         case ValidTextureOverload::kLoad1dLevelU32:
-            return R"(texture.read(uint(1), 0))";
+            return R"(Texture.read(uint(1), 0))";
         case ValidTextureOverload::kLoad1dLevelI32:
-            return R"(texture.read(uint(1), 0))";
+            return R"(Texture.read(uint(1), 0))";
         case ValidTextureOverload::kLoad2dLevelF32:
-            return R"(texture.read(uint2(uint2(1u, 2u)), 3u))";
+            return R"(Texture.read(uint2(uint2(1u, 2u)), 3u))";
         case ValidTextureOverload::kLoad2dLevelU32:
-            return R"(texture.read(uint2(int2(1, 2)), 3))";
+            return R"(Texture.read(uint2(int2(1, 2)), 3))";
         case ValidTextureOverload::kLoad2dArrayLevelF32:
-            return R"(texture.read(uint2(int2(1, 2)), 3, 4))";
+            return R"(Texture.read(uint2(int2(1, 2)), 3, 4))";
         case ValidTextureOverload::kLoad2dArrayLevelU32:
-            return R"(texture.read(uint2(int2(1, 2)), 3, 4))";
+            return R"(Texture.read(uint2(int2(1, 2)), 3, 4))";
         case ValidTextureOverload::kLoad2dArrayLevelI32:
-            return R"(texture.read(uint2(uint2(1u, 2u)), 3u, 4u))";
+            return R"(Texture.read(uint2(uint2(1u, 2u)), 3u, 4u))";
         case ValidTextureOverload::kLoad3dLevelF32:
-            return R"(texture.read(uint3(int3(1, 2, 3)), 4))";
+            return R"(Texture.read(uint3(int3(1, 2, 3)), 4))";
         case ValidTextureOverload::kLoad3dLevelU32:
-            return R"(texture.read(uint3(int3(1, 2, 3)), 4))";
+            return R"(Texture.read(uint3(int3(1, 2, 3)), 4))";
         case ValidTextureOverload::kLoad3dLevelI32:
-            return R"(texture.read(uint3(uint3(1u, 2u, 3u)), 4u))";
+            return R"(Texture.read(uint3(uint3(1u, 2u, 3u)), 4u))";
         case ValidTextureOverload::kLoadMultisampled2dF32:
         case ValidTextureOverload::kLoadMultisampled2dU32:
-            return R"(texture.read(uint2(int2(1, 2)), 3))";
+            return R"(Texture.read(uint2(int2(1, 2)), 3))";
         case ValidTextureOverload::kLoad2dLevelI32:
         case ValidTextureOverload::kLoadMultisampled2dI32:
-            return R"(texture.read(uint2(uint2(1u, 2u)), 3u))";
+            return R"(Texture.read(uint2(uint2(1u, 2u)), 3u))";
         case ValidTextureOverload::kLoadDepth2dLevelF32:
-            return R"(texture.read(uint2(int2(1, 2)), 3))";
+            return R"(Texture.read(uint2(int2(1, 2)), 3))";
         case ValidTextureOverload::kLoadDepth2dArrayLevelF32:
-            return R"(texture.read(uint2(uint2(1u, 2u)), 3u, 4u))";
+            return R"(Texture.read(uint2(uint2(1u, 2u)), 3u, 4u))";
         case ValidTextureOverload::kLoadDepthMultisampled2dF32:
-            return R"(texture.read(uint2(uint2(1u, 2u)), 3u))";
+            return R"(Texture.read(uint2(uint2(1u, 2u)), 3u))";
         case ValidTextureOverload::kStoreWO1dRgba32float:
-            return R"(texture.write(float4(2.0f, 3.0f, 4.0f, 5.0f), uint(1)))";
+            return R"(Texture.write(float4(2.0f, 3.0f, 4.0f, 5.0f), uint(1)))";
         case ValidTextureOverload::kStoreWO2dRgba32float:
-            return R"(texture.write(float4(3.0f, 4.0f, 5.0f, 6.0f), uint2(int2(1, 2))))";
+            return R"(Texture.write(float4(3.0f, 4.0f, 5.0f, 6.0f), uint2(int2(1, 2))))";
         case ValidTextureOverload::kStoreWO2dArrayRgba32float:
-            return R"(texture.write(float4(4.0f, 5.0f, 6.0f, 7.0f), uint2(uint2(1u, 2u)), 3u))";
+            return R"(Texture.write(float4(4.0f, 5.0f, 6.0f, 7.0f), uint2(uint2(1u, 2u)), 3u))";
         case ValidTextureOverload::kStoreWO3dRgba32float:
-            return R"(texture.write(float4(4.0f, 5.0f, 6.0f, 7.0f), uint3(uint3(1u, 2u, 3u))))";
+            return R"(Texture.write(float4(4.0f, 5.0f, 6.0f, 7.0f), uint3(uint3(1u, 2u, 3u))))";
     }
     return "<unmatched texture overload>";
 }  // NOLINT - Ignore the length of this function
diff --git a/src/tint/writer/wgsl/generator_impl.cc b/src/tint/writer/wgsl/generator_impl.cc
index 5c76c86..7e497eb 100644
--- a/src/tint/writer/wgsl/generator_impl.cc
+++ b/src/tint/writer/wgsl/generator_impl.cc
@@ -452,14 +452,6 @@
             out << ">";
             return true;
         },
-        [&](const ast::Sampler* sampler) {
-            out << "sampler";
-
-            if (sampler->IsComparison()) {
-                out << "_comparison";
-            }
-            return true;
-        },
         [&](const ast::ExternalTexture*) {
             out << "texture_external";
             return true;