Resolver: Add ast -> sem type resolving

Not currently called (nothing currently attaches ast::Type nodes to the AST), but implements some of the boilerplate that'll be shortly required.

This change also removes a bunch of duplicated enumerators from the sem namespace for their counterpart in the ast namespace.

Bug: tint:724
Change-Id: I0372a9f4eca2f9357ff161e7ec1b67eae1c4c8f6
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/48603
Commit-Queue: Ben Clayton <bclayton@google.com>
Reviewed-by: Antonio Maiorano <amaiorano@google.com>
diff --git a/src/ast/intrinsic_texture_helper_test.cc b/src/ast/intrinsic_texture_helper_test.cc
index aca8e1d..c0ea686 100644
--- a/src/ast/intrinsic_texture_helper_test.cc
+++ b/src/ast/intrinsic_texture_helper_test.cc
@@ -32,8 +32,8 @@
     ValidTextureOverload o,
     const char* desc,
     TextureKind tk,
-    sem::SamplerKind sk,
-    sem::TextureDimension dims,
+    ast::SamplerKind sk,
+    ast::TextureDimension dims,
     TextureDataType datatype,
     const char* f,
     std::function<ExpressionList(ProgramBuilder*)> a)
@@ -49,7 +49,7 @@
     ValidTextureOverload o,
     const char* desc,
     TextureKind tk,
-    sem::TextureDimension dims,
+    ast::TextureDimension dims,
     TextureDataType datatype,
     const char* f,
     std::function<ExpressionList(ProgramBuilder*)> a)
@@ -64,8 +64,8 @@
     ValidTextureOverload o,
     const char* d,
     AccessControl::Access access,
-    sem::ImageFormat i,
-    sem::TextureDimension dims,
+    ast::ImageFormat i,
+    ast::TextureDimension dims,
     TextureDataType datatype,
     const char* f,
     std::function<ExpressionList(ProgramBuilder*)> a)
@@ -203,8 +203,8 @@
           ValidTextureOverload::kDimensions1d,
           "textureDimensions(t : texture_1d<f32>) -> i32",
           TextureKind::kRegular,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::k1d,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::k1d,
           TextureDataType::kF32,
           "textureDimensions",
           [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -213,8 +213,8 @@
           ValidTextureOverload::kDimensions2d,
           "textureDimensions(t : texture_2d<f32>) -> vec2<i32>",
           TextureKind::kRegular,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::k2d,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::k2d,
           TextureDataType::kF32,
           "textureDimensions",
           [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -224,8 +224,8 @@
           "textureDimensions(t     : texture_2d<f32>,\n"
           "                  level : i32) -> vec2<i32>",
           TextureKind::kRegular,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::k2d,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::k2d,
           TextureDataType::kF32,
           "textureDimensions",
           [](ProgramBuilder* b) { return b->ExprList("texture", 1); },
@@ -234,8 +234,8 @@
           ValidTextureOverload::kDimensions2dArray,
           "textureDimensions(t : texture_2d_array<f32>) -> vec2<i32>",
           TextureKind::kRegular,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::k2dArray,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::k2dArray,
           TextureDataType::kF32,
           "textureDimensions",
           [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -245,8 +245,8 @@
           "textureDimensions(t     : texture_2d_array<f32>,\n"
           "                  level : i32) -> vec2<i32>",
           TextureKind::kRegular,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::k2dArray,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::k2dArray,
           TextureDataType::kF32,
           "textureDimensions",
           [](ProgramBuilder* b) { return b->ExprList("texture", 1); },
@@ -255,8 +255,8 @@
           ValidTextureOverload::kDimensions3d,
           "textureDimensions(t : texture_3d<f32>) -> vec3<i32>",
           TextureKind::kRegular,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::k3d,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::k3d,
           TextureDataType::kF32,
           "textureDimensions",
           [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -266,8 +266,8 @@
           "textureDimensions(t     : texture_3d<f32>,\n"
           "                  level : i32) -> vec3<i32>",
           TextureKind::kRegular,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::k3d,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::k3d,
           TextureDataType::kF32,
           "textureDimensions",
           [](ProgramBuilder* b) { return b->ExprList("texture", 1); },
@@ -276,8 +276,8 @@
           ValidTextureOverload::kDimensionsCube,
           "textureDimensions(t : texture_cube<f32>) -> vec3<i32>",
           TextureKind::kRegular,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::kCube,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::kCube,
           TextureDataType::kF32,
           "textureDimensions",
           [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -287,8 +287,8 @@
           "textureDimensions(t     : texture_cube<f32>,\n"
           "                  level : i32) -> vec3<i32>",
           TextureKind::kRegular,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::kCube,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::kCube,
           TextureDataType::kF32,
           "textureDimensions",
           [](ProgramBuilder* b) { return b->ExprList("texture", 1); },
@@ -297,8 +297,8 @@
           ValidTextureOverload::kDimensionsCubeArray,
           "textureDimensions(t : texture_cube_array<f32>) -> vec3<i32>",
           TextureKind::kRegular,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::kCubeArray,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::kCubeArray,
           TextureDataType::kF32,
           "textureDimensions",
           [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -308,8 +308,8 @@
           "textureDimensions(t     : texture_cube_array<f32>,\n"
           "                  level : i32) -> vec3<i32>",
           TextureKind::kRegular,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::kCubeArray,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::kCubeArray,
           TextureDataType::kF32,
           "textureDimensions",
           [](ProgramBuilder* b) { return b->ExprList("texture", 1); },
@@ -318,8 +318,8 @@
           ValidTextureOverload::kDimensionsMultisampled2d,
           "textureDimensions(t : texture_multisampled_2d<f32>)-> vec2<i32>",
           TextureKind::kMultisampled,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::k2d,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::k2d,
           TextureDataType::kF32,
           "textureDimensions",
           [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -328,8 +328,8 @@
           ValidTextureOverload::kDimensionsDepth2d,
           "textureDimensions(t : texture_depth_2d) -> vec2<i32>",
           TextureKind::kDepth,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::k2d,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::k2d,
           TextureDataType::kF32,
           "textureDimensions",
           [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -339,8 +339,8 @@
           "textureDimensions(t     : texture_depth_2d,\n"
           "                  level : i32) -> vec2<i32>",
           TextureKind::kDepth,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::k2d,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::k2d,
           TextureDataType::kF32,
           "textureDimensions",
           [](ProgramBuilder* b) { return b->ExprList("texture", 1); },
@@ -349,8 +349,8 @@
           ValidTextureOverload::kDimensionsDepth2dArray,
           "textureDimensions(t : texture_depth_2d_array) -> vec2<i32>",
           TextureKind::kDepth,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::k2dArray,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::k2dArray,
           TextureDataType::kF32,
           "textureDimensions",
           [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -360,8 +360,8 @@
           "textureDimensions(t     : texture_depth_2d_array,\n"
           "                  level : i32) -> vec2<i32>",
           TextureKind::kDepth,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::k2dArray,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::k2dArray,
           TextureDataType::kF32,
           "textureDimensions",
           [](ProgramBuilder* b) { return b->ExprList("texture", 1); },
@@ -370,8 +370,8 @@
           ValidTextureOverload::kDimensionsDepthCube,
           "textureDimensions(t : texture_depth_cube) -> vec3<i32>",
           TextureKind::kDepth,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::kCube,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::kCube,
           TextureDataType::kF32,
           "textureDimensions",
           [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -381,8 +381,8 @@
           "textureDimensions(t     : texture_depth_cube,\n"
           "                  level : i32) -> vec3<i32>",
           TextureKind::kDepth,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::kCube,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::kCube,
           TextureDataType::kF32,
           "textureDimensions",
           [](ProgramBuilder* b) { return b->ExprList("texture", 1); },
@@ -391,8 +391,8 @@
           ValidTextureOverload::kDimensionsDepthCubeArray,
           "textureDimensions(t : texture_depth_cube_array) -> vec3<i32>",
           TextureKind::kDepth,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::kCubeArray,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::kCubeArray,
           TextureDataType::kF32,
           "textureDimensions",
           [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -402,8 +402,8 @@
           "textureDimensions(t     : texture_depth_cube_array,\n"
           "                  level : i32) -> vec3<i32>",
           TextureKind::kDepth,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::kCubeArray,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::kCubeArray,
           TextureDataType::kF32,
           "textureDimensions",
           [](ProgramBuilder* b) { return b->ExprList("texture", 1); },
@@ -412,8 +412,8 @@
           ValidTextureOverload::kDimensionsStorageRO1d,
           "textureDimensions(t : texture_storage_1d<rgba32float>) -> i32",
           ast::AccessControl::kReadOnly,
-          sem::ImageFormat::kRgba32Float,
-          sem::TextureDimension::k1d,
+          ast::ImageFormat::kRgba32Float,
+          ast::TextureDimension::k1d,
           TextureDataType::kF32,
           "textureDimensions",
           [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -423,8 +423,8 @@
           "textureDimensions(t : texture_storage_2d<rgba32float>) -> "
           "vec2<i32>",
           ast::AccessControl::kReadOnly,
-          sem::ImageFormat::kRgba32Float,
-          sem::TextureDimension::k2d,
+          ast::ImageFormat::kRgba32Float,
+          ast::TextureDimension::k2d,
           TextureDataType::kF32,
           "textureDimensions",
           [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -434,8 +434,8 @@
           "textureDimensions(t : texture_storage_2d_array<rgba32float>) -> "
           "vec2<i32>",
           ast::AccessControl::kReadOnly,
-          sem::ImageFormat::kRgba32Float,
-          sem::TextureDimension::k2dArray,
+          ast::ImageFormat::kRgba32Float,
+          ast::TextureDimension::k2dArray,
           TextureDataType::kF32,
           "textureDimensions",
           [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -445,8 +445,8 @@
           "textureDimensions(t : texture_storage_3d<rgba32float>) -> "
           "vec3<i32>",
           ast::AccessControl::kReadOnly,
-          sem::ImageFormat::kRgba32Float,
-          sem::TextureDimension::k3d,
+          ast::ImageFormat::kRgba32Float,
+          ast::TextureDimension::k3d,
           TextureDataType::kF32,
           "textureDimensions",
           [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -455,8 +455,8 @@
           ValidTextureOverload::kDimensionsStorageWO1d,
           "textureDimensions(t : texture_storage_1d<rgba32float>) -> i32",
           ast::AccessControl::kWriteOnly,
-          sem::ImageFormat::kRgba32Float,
-          sem::TextureDimension::k1d,
+          ast::ImageFormat::kRgba32Float,
+          ast::TextureDimension::k1d,
           TextureDataType::kF32,
           "textureDimensions",
           [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -466,8 +466,8 @@
           "textureDimensions(t : texture_storage_2d<rgba32float>) -> "
           "vec2<i32>",
           ast::AccessControl::kWriteOnly,
-          sem::ImageFormat::kRgba32Float,
-          sem::TextureDimension::k2d,
+          ast::ImageFormat::kRgba32Float,
+          ast::TextureDimension::k2d,
           TextureDataType::kF32,
           "textureDimensions",
           [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -477,8 +477,8 @@
           "textureDimensions(t : texture_storage_2d_array<rgba32float>) -> "
           "vec2<i32>",
           ast::AccessControl::kWriteOnly,
-          sem::ImageFormat::kRgba32Float,
-          sem::TextureDimension::k2dArray,
+          ast::ImageFormat::kRgba32Float,
+          ast::TextureDimension::k2dArray,
           TextureDataType::kF32,
           "textureDimensions",
           [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -488,8 +488,8 @@
           "textureDimensions(t : texture_storage_3d<rgba32float>) -> "
           "vec3<i32>",
           ast::AccessControl::kWriteOnly,
-          sem::ImageFormat::kRgba32Float,
-          sem::TextureDimension::k3d,
+          ast::ImageFormat::kRgba32Float,
+          ast::TextureDimension::k3d,
           TextureDataType::kF32,
           "textureDimensions",
           [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -498,8 +498,8 @@
           ValidTextureOverload::kNumLayers2dArray,
           "textureNumLayers(t : texture_2d_array<f32>) -> i32",
           TextureKind::kRegular,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::k2dArray,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::k2dArray,
           TextureDataType::kF32,
           "textureNumLayers",
           [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -508,8 +508,8 @@
           ValidTextureOverload::kNumLayersCubeArray,
           "textureNumLayers(t : texture_cube_array<f32>) -> i32",
           TextureKind::kRegular,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::kCubeArray,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::kCubeArray,
           TextureDataType::kF32,
           "textureNumLayers",
           [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -518,8 +518,8 @@
           ValidTextureOverload::kNumLayersDepth2dArray,
           "textureNumLayers(t : texture_depth_2d_array) -> i32",
           TextureKind::kDepth,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::k2dArray,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::k2dArray,
           TextureDataType::kF32,
           "textureNumLayers",
           [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -528,8 +528,8 @@
           ValidTextureOverload::kNumLayersDepthCubeArray,
           "textureNumLayers(t : texture_depth_cube_array) -> i32",
           TextureKind::kDepth,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::kCubeArray,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::kCubeArray,
           TextureDataType::kF32,
           "textureNumLayers",
           [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -538,8 +538,8 @@
           ValidTextureOverload::kNumLayersStorageWO2dArray,
           "textureNumLayers(t : texture_storage_2d_array<rgba32float>) -> i32",
           ast::AccessControl::kWriteOnly,
-          sem::ImageFormat::kRgba32Float,
-          sem::TextureDimension::k2dArray,
+          ast::ImageFormat::kRgba32Float,
+          ast::TextureDimension::k2dArray,
           TextureDataType::kF32,
           "textureNumLayers",
           [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -548,8 +548,8 @@
           ValidTextureOverload::kNumLevels2d,
           "textureNumLevels(t : texture_2d<f32>) -> i32",
           TextureKind::kRegular,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::k2d,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::k2d,
           TextureDataType::kF32,
           "textureNumLevels",
           [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -558,8 +558,8 @@
           ValidTextureOverload::kNumLevels2dArray,
           "textureNumLevels(t : texture_2d_array<f32>) -> i32",
           TextureKind::kRegular,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::k2dArray,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::k2dArray,
           TextureDataType::kF32,
           "textureNumLevels",
           [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -568,8 +568,8 @@
           ValidTextureOverload::kNumLevels3d,
           "textureNumLevels(t : texture_3d<f32>) -> i32",
           TextureKind::kRegular,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::k3d,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::k3d,
           TextureDataType::kF32,
           "textureNumLevels",
           [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -578,8 +578,8 @@
           ValidTextureOverload::kNumLevelsCube,
           "textureNumLevels(t : texture_cube<f32>) -> i32",
           TextureKind::kRegular,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::kCube,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::kCube,
           TextureDataType::kF32,
           "textureNumLevels",
           [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -588,8 +588,8 @@
           ValidTextureOverload::kNumLevelsCubeArray,
           "textureNumLevels(t : texture_cube_array<f32>) -> i32",
           TextureKind::kRegular,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::kCubeArray,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::kCubeArray,
           TextureDataType::kF32,
           "textureNumLevels",
           [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -598,8 +598,8 @@
           ValidTextureOverload::kNumLevelsDepth2d,
           "textureNumLevels(t : texture_depth_2d) -> i32",
           TextureKind::kDepth,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::k2d,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::k2d,
           TextureDataType::kF32,
           "textureNumLevels",
           [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -608,8 +608,8 @@
           ValidTextureOverload::kNumLevelsDepth2dArray,
           "textureNumLevels(t : texture_depth_2d_array) -> i32",
           TextureKind::kDepth,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::k2dArray,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::k2dArray,
           TextureDataType::kF32,
           "textureNumLevels",
           [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -618,8 +618,8 @@
           ValidTextureOverload::kNumLevelsDepthCube,
           "textureNumLevels(t : texture_depth_cube) -> i32",
           TextureKind::kDepth,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::kCube,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::kCube,
           TextureDataType::kF32,
           "textureNumLevels",
           [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -628,8 +628,8 @@
           ValidTextureOverload::kNumLevelsDepthCubeArray,
           "textureNumLevels(t : texture_depth_cube_array) -> i32",
           TextureKind::kDepth,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::kCubeArray,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::kCubeArray,
           TextureDataType::kF32,
           "textureNumLevels",
           [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -638,8 +638,8 @@
           ValidTextureOverload::kNumSamplesMultisampled2d,
           "textureNumSamples(t : texture_multisampled_2d<f32>) -> i32",
           TextureKind::kMultisampled,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::k2d,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::k2d,
           TextureDataType::kF32,
           "textureNumSamples",
           [](ProgramBuilder* b) { return b->ExprList("texture"); },
@@ -650,8 +650,8 @@
           "              s      : sampler,\n"
           "              coords : f32) -> vec4<f32>",
           TextureKind::kRegular,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::k1d,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::k1d,
           TextureDataType::kF32,
           "textureSample",
           [](ProgramBuilder* b) {
@@ -666,8 +666,8 @@
           "              s      : sampler,\n"
           "              coords : vec2<f32>) -> vec4<f32>",
           TextureKind::kRegular,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::k2d,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::k2d,
           TextureDataType::kF32,
           "textureSample",
           [](ProgramBuilder* b) {
@@ -683,8 +683,8 @@
           "              coords : vec2<f32>\n"
           "              offset : vec2<i32>) -> vec4<f32>",
           TextureKind::kRegular,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::k2d,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::k2d,
           TextureDataType::kF32,
           "textureSample",
           [](ProgramBuilder* b) {
@@ -701,8 +701,8 @@
           "              coords      : vec2<f32>,\n"
           "              array_index : i32) -> vec4<f32>",
           TextureKind::kRegular,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::k2dArray,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::k2dArray,
           TextureDataType::kF32,
           "textureSample",
           [](ProgramBuilder* b) {
@@ -720,8 +720,8 @@
           "              array_index : i32\n"
           "              offset      : vec2<i32>) -> vec4<f32>",
           TextureKind::kRegular,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::k2dArray,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::k2dArray,
           TextureDataType::kF32,
           "textureSample",
           [](ProgramBuilder* b) {
@@ -738,8 +738,8 @@
           "              s      : sampler,\n"
           "              coords : vec3<f32>) -> vec4<f32>",
           TextureKind::kRegular,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::k3d,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::k3d,
           TextureDataType::kF32,
           "textureSample",
           [](ProgramBuilder* b) {
@@ -755,8 +755,8 @@
           "              coords : vec3<f32>\n"
           "              offset : vec3<i32>) -> vec4<f32>",
           TextureKind::kRegular,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::k3d,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::k3d,
           TextureDataType::kF32,
           "textureSample",
           [](ProgramBuilder* b) {
@@ -772,8 +772,8 @@
           "              s      : sampler,\n"
           "              coords : vec3<f32>) -> vec4<f32>",
           TextureKind::kRegular,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::kCube,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::kCube,
           TextureDataType::kF32,
           "textureSample",
           [](ProgramBuilder* b) {
@@ -789,8 +789,8 @@
           "              coords      : vec3<f32>,\n"
           "              array_index : i32) -> vec4<f32>",
           TextureKind::kRegular,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::kCubeArray,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::kCubeArray,
           TextureDataType::kF32,
           "textureSample",
           [](ProgramBuilder* b) {
@@ -806,8 +806,8 @@
           "              s      : sampler,\n"
           "              coords : vec2<f32>) -> f32",
           TextureKind::kDepth,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::k2d,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::k2d,
           TextureDataType::kF32,
           "textureSample",
           [](ProgramBuilder* b) {
@@ -823,8 +823,8 @@
           "              coords : vec2<f32>\n"
           "              offset : vec2<i32>) -> f32",
           TextureKind::kDepth,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::k2d,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::k2d,
           TextureDataType::kF32,
           "textureSample",
           [](ProgramBuilder* b) {
@@ -841,8 +841,8 @@
           "              coords      : vec2<f32>,\n"
           "              array_index : i32) -> f32",
           TextureKind::kDepth,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::k2dArray,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::k2dArray,
           TextureDataType::kF32,
           "textureSample",
           [](ProgramBuilder* b) {
@@ -860,8 +860,8 @@
           "              array_index : i32\n"
           "              offset      : vec2<i32>) -> f32",
           TextureKind::kDepth,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::k2dArray,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::k2dArray,
           TextureDataType::kF32,
           "textureSample",
           [](ProgramBuilder* b) {
@@ -878,8 +878,8 @@
           "              s      : sampler,\n"
           "              coords : vec3<f32>) -> f32",
           TextureKind::kDepth,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::kCube,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::kCube,
           TextureDataType::kF32,
           "textureSample",
           [](ProgramBuilder* b) {
@@ -895,8 +895,8 @@
           "              coords      : vec3<f32>,\n"
           "              array_index : i32) -> f32",
           TextureKind::kDepth,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::kCubeArray,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::kCubeArray,
           TextureDataType::kF32,
           "textureSample",
           [](ProgramBuilder* b) {
@@ -913,8 +913,8 @@
           "                  coords : vec2<f32>,\n"
           "                  bias   : f32) -> vec4<f32>",
           TextureKind::kRegular,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::k2d,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::k2d,
           TextureDataType::kF32,
           "textureSampleBias",
           [](ProgramBuilder* b) {
@@ -932,8 +932,8 @@
           "                  bias   : f32,\n"
           "                  offset : vec2<i32>) -> vec4<f32>",
           TextureKind::kRegular,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::k2d,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::k2d,
           TextureDataType::kF32,
           "textureSampleBias",
           [](ProgramBuilder* b) {
@@ -952,8 +952,8 @@
           "                  array_index : i32,\n"
           "                  bias        : f32) -> vec4<f32>",
           TextureKind::kRegular,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::k2dArray,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::k2dArray,
           TextureDataType::kF32,
           "textureSampleBias",
           [](ProgramBuilder* b) {
@@ -973,8 +973,8 @@
           "                  bias        : f32,\n"
           "                  offset      : vec2<i32>) -> vec4<f32>",
           TextureKind::kRegular,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::k2dArray,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::k2dArray,
           TextureDataType::kF32,
           "textureSampleBias",
           [](ProgramBuilder* b) {
@@ -993,8 +993,8 @@
           "                  coords : vec3<f32>,\n"
           "                  bias   : f32) -> vec4<f32>",
           TextureKind::kRegular,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::k3d,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::k3d,
           TextureDataType::kF32,
           "textureSampleBias",
           [](ProgramBuilder* b) {
@@ -1012,8 +1012,8 @@
           "                  bias   : f32,\n"
           "                  offset : vec3<i32>) -> vec4<f32>",
           TextureKind::kRegular,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::k3d,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::k3d,
           TextureDataType::kF32,
           "textureSampleBias",
           [](ProgramBuilder* b) {
@@ -1031,8 +1031,8 @@
           "                  coords : vec3<f32>,\n"
           "                  bias   : f32) -> vec4<f32>",
           TextureKind::kRegular,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::kCube,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::kCube,
           TextureDataType::kF32,
           "textureSampleBias",
           [](ProgramBuilder* b) {
@@ -1050,8 +1050,8 @@
           "                  array_index : i32,\n"
           "                  bias        : f32) -> vec4<f32>",
           TextureKind::kRegular,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::kCubeArray,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::kCubeArray,
           TextureDataType::kF32,
           "textureSampleBias",
           [](ProgramBuilder* b) {
@@ -1069,8 +1069,8 @@
           "                   coords : vec2<f32>,\n"
           "                   level  : f32) -> vec4<f32>",
           TextureKind::kRegular,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::k2d,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::k2d,
           TextureDataType::kF32,
           "textureSampleLevel",
           [](ProgramBuilder* b) {
@@ -1088,8 +1088,8 @@
           "                   level  : f32,\n"
           "                   offset : vec2<i32>) -> vec4<f32>",
           TextureKind::kRegular,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::k2d,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::k2d,
           TextureDataType::kF32,
           "textureSampleLevel",
           [](ProgramBuilder* b) {
@@ -1108,8 +1108,8 @@
           "                   array_index : i32,\n"
           "                   level       : f32) -> vec4<f32>",
           TextureKind::kRegular,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::k2dArray,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::k2dArray,
           TextureDataType::kF32,
           "textureSampleLevel",
           [](ProgramBuilder* b) {
@@ -1129,8 +1129,8 @@
           "                   level       : f32,\n"
           "                   offset      : vec2<i32>) -> vec4<f32>",
           TextureKind::kRegular,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::k2dArray,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::k2dArray,
           TextureDataType::kF32,
           "textureSampleLevel",
           [](ProgramBuilder* b) {
@@ -1149,8 +1149,8 @@
           "                   coords : vec3<f32>,\n"
           "                   level  : f32) -> vec4<f32>",
           TextureKind::kRegular,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::k3d,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::k3d,
           TextureDataType::kF32,
           "textureSampleLevel",
           [](ProgramBuilder* b) {
@@ -1168,8 +1168,8 @@
           "                   level  : f32,\n"
           "                   offset : vec3<i32>) -> vec4<f32>",
           TextureKind::kRegular,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::k3d,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::k3d,
           TextureDataType::kF32,
           "textureSampleLevel",
           [](ProgramBuilder* b) {
@@ -1187,8 +1187,8 @@
           "                   coords : vec3<f32>,\n"
           "                   level  : f32) -> vec4<f32>",
           TextureKind::kRegular,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::kCube,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::kCube,
           TextureDataType::kF32,
           "textureSampleLevel",
           [](ProgramBuilder* b) {
@@ -1206,8 +1206,8 @@
           "                   array_index : i32,\n"
           "                   level       : f32) -> vec4<f32>",
           TextureKind::kRegular,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::kCubeArray,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::kCubeArray,
           TextureDataType::kF32,
           "textureSampleLevel",
           [](ProgramBuilder* b) {
@@ -1225,8 +1225,8 @@
           "                   coords : vec2<f32>,\n"
           "                   level  : i32) -> f32",
           TextureKind::kDepth,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::k2d,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::k2d,
           TextureDataType::kF32,
           "textureSampleLevel",
           [](ProgramBuilder* b) {
@@ -1244,8 +1244,8 @@
           "                   level  : i32,\n"
           "                   offset : vec2<i32>) -> f32",
           TextureKind::kDepth,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::k2d,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::k2d,
           TextureDataType::kF32,
           "textureSampleLevel",
           [](ProgramBuilder* b) {
@@ -1264,8 +1264,8 @@
           "                   array_index : i32,\n"
           "                   level       : i32) -> f32",
           TextureKind::kDepth,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::k2dArray,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::k2dArray,
           TextureDataType::kF32,
           "textureSampleLevel",
           [](ProgramBuilder* b) {
@@ -1285,8 +1285,8 @@
           "                   level       : i32,\n"
           "                   offset      : vec2<i32>) -> f32",
           TextureKind::kDepth,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::k2dArray,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::k2dArray,
           TextureDataType::kF32,
           "textureSampleLevel",
           [](ProgramBuilder* b) {
@@ -1305,8 +1305,8 @@
           "                   coords : vec3<f32>,\n"
           "                   level  : i32) -> f32",
           TextureKind::kDepth,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::kCube,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::kCube,
           TextureDataType::kF32,
           "textureSampleLevel",
           [](ProgramBuilder* b) {
@@ -1324,8 +1324,8 @@
           "                   array_index : i32,\n"
           "                   level       : i32) -> f32",
           TextureKind::kDepth,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::kCubeArray,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::kCubeArray,
           TextureDataType::kF32,
           "textureSampleLevel",
           [](ProgramBuilder* b) {
@@ -1344,8 +1344,8 @@
           "                  ddx    : vec2<f32>,\n"
           "                  ddy    : vec2<f32>) -> vec4<f32>",
           TextureKind::kRegular,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::k2d,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::k2d,
           TextureDataType::kF32,
           "textureSampleGrad",
           [](ProgramBuilder* b) {
@@ -1365,8 +1365,8 @@
           "                  ddy    : vec2<f32>,\n"
           "                  offset : vec2<i32>) -> vec4<f32>",
           TextureKind::kRegular,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::k2d,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::k2d,
           TextureDataType::kF32,
           "textureSampleGrad",
           [](ProgramBuilder* b) {
@@ -1387,8 +1387,8 @@
           "                  ddx         : vec2<f32>,\n"
           "                  ddy         : vec2<f32>) -> vec4<f32>",
           TextureKind::kRegular,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::k2dArray,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::k2dArray,
           TextureDataType::kF32,
           "textureSampleGrad",
           [](ProgramBuilder* b) {
@@ -1410,8 +1410,8 @@
           "                  ddy         : vec2<f32>,\n"
           "                  offset      : vec2<i32>) -> vec4<f32>",
           TextureKind::kRegular,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::k2dArray,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::k2dArray,
           TextureDataType::kF32,
           "textureSampleGrad",
           [](ProgramBuilder* b) {
@@ -1432,8 +1432,8 @@
           "                  ddx    : vec3<f32>,\n"
           "                  ddy    : vec3<f32>) -> vec4<f32>",
           TextureKind::kRegular,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::k3d,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::k3d,
           TextureDataType::kF32,
           "textureSampleGrad",
           [](ProgramBuilder* b) {
@@ -1453,8 +1453,8 @@
           "                  ddy    : vec3<f32>,\n"
           "                  offset : vec3<i32>) -> vec4<f32>",
           TextureKind::kRegular,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::k3d,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::k3d,
           TextureDataType::kF32,
           "textureSampleGrad",
           [](ProgramBuilder* b) {
@@ -1474,8 +1474,8 @@
           "                  ddx    : vec3<f32>,\n"
           "                  ddy    : vec3<f32>) -> vec4<f32>",
           TextureKind::kRegular,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::kCube,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::kCube,
           TextureDataType::kF32,
           "textureSampleGrad",
           [](ProgramBuilder* b) {
@@ -1495,8 +1495,8 @@
           "                  ddx         : vec3<f32>,\n"
           "                  ddy         : vec3<f32>) -> vec4<f32>",
           TextureKind::kRegular,
-          sem::SamplerKind::kSampler,
-          sem::TextureDimension::kCubeArray,
+          ast::SamplerKind::kSampler,
+          ast::TextureDimension::kCubeArray,
           TextureDataType::kF32,
           "textureSampleGrad",
           [](ProgramBuilder* b) {
@@ -1515,8 +1515,8 @@
           "                     coords    : vec2<f32>,\n"
           "                     depth_ref : f32) -> f32",
           TextureKind::kDepth,
-          sem::SamplerKind::kComparisonSampler,
-          sem::TextureDimension::k2d,
+          ast::SamplerKind::kComparisonSampler,
+          ast::TextureDimension::k2d,
           TextureDataType::kF32,
           "textureSampleCompare",
           [](ProgramBuilder* b) {
@@ -1534,8 +1534,8 @@
           "                     depth_ref : f32,\n"
           "                     offset    : vec2<i32>) -> f32",
           TextureKind::kDepth,
-          sem::SamplerKind::kComparisonSampler,
-          sem::TextureDimension::k2d,
+          ast::SamplerKind::kComparisonSampler,
+          ast::TextureDimension::k2d,
           TextureDataType::kF32,
           "textureSampleCompare",
           [](ProgramBuilder* b) {
@@ -1554,8 +1554,8 @@
           "                     array_index : i32,\n"
           "                     depth_ref   : f32) -> f32",
           TextureKind::kDepth,
-          sem::SamplerKind::kComparisonSampler,
-          sem::TextureDimension::k2dArray,
+          ast::SamplerKind::kComparisonSampler,
+          ast::TextureDimension::k2dArray,
           TextureDataType::kF32,
           "textureSampleCompare",
           [](ProgramBuilder* b) {
@@ -1575,8 +1575,8 @@
           "                     depth_ref   : f32,\n"
           "                     offset      : vec2<i32>) -> f32",
           TextureKind::kDepth,
-          sem::SamplerKind::kComparisonSampler,
-          sem::TextureDimension::k2dArray,
+          ast::SamplerKind::kComparisonSampler,
+          ast::TextureDimension::k2dArray,
           TextureDataType::kF32,
           "textureSampleCompare",
           [](ProgramBuilder* b) {
@@ -1595,8 +1595,8 @@
           "                     coords    : vec3<f32>,\n"
           "                     depth_ref : f32) -> f32",
           TextureKind::kDepth,
-          sem::SamplerKind::kComparisonSampler,
-          sem::TextureDimension::kCube,
+          ast::SamplerKind::kComparisonSampler,
+          ast::TextureDimension::kCube,
           TextureDataType::kF32,
           "textureSampleCompare",
           [](ProgramBuilder* b) {
@@ -1614,8 +1614,8 @@
           "                     array_index : i32,\n"
           "                     depth_ref   : f32) -> f32",
           TextureKind::kDepth,
-          sem::SamplerKind::kComparisonSampler,
-          sem::TextureDimension::kCubeArray,
+          ast::SamplerKind::kComparisonSampler,
+          ast::TextureDimension::kCubeArray,
           TextureDataType::kF32,
           "textureSampleCompare",
           [](ProgramBuilder* b) {
@@ -1632,7 +1632,7 @@
           "            coords : i32,\n"
           "            level  : i32) -> vec4<f32>",
           TextureKind::kRegular,
-          sem::TextureDimension::k1d,
+          ast::TextureDimension::k1d,
           TextureDataType::kF32,
           "textureLoad",
           [](ProgramBuilder* b) {
@@ -1647,7 +1647,7 @@
           "            coords : i32,\n"
           "            level  : i32) -> vec4<u32>",
           TextureKind::kRegular,
-          sem::TextureDimension::k1d,
+          ast::TextureDimension::k1d,
           TextureDataType::kU32,
           "textureLoad",
           [](ProgramBuilder* b) {
@@ -1662,7 +1662,7 @@
           "            coords : i32,\n"
           "            level  : i32) -> vec4<i32>",
           TextureKind::kRegular,
-          sem::TextureDimension::k1d,
+          ast::TextureDimension::k1d,
           TextureDataType::kI32,
           "textureLoad",
           [](ProgramBuilder* b) {
@@ -1677,7 +1677,7 @@
           "            coords : vec2<i32>,\n"
           "            level  : i32) -> vec4<f32>",
           TextureKind::kRegular,
-          sem::TextureDimension::k2d,
+          ast::TextureDimension::k2d,
           TextureDataType::kF32,
           "textureLoad",
           [](ProgramBuilder* b) {
@@ -1692,7 +1692,7 @@
           "            coords : vec2<i32>,\n"
           "            level  : i32) -> vec4<u32>",
           TextureKind::kRegular,
-          sem::TextureDimension::k2d,
+          ast::TextureDimension::k2d,
           TextureDataType::kU32,
           "textureLoad",
           [](ProgramBuilder* b) {
@@ -1707,7 +1707,7 @@
           "            coords : vec2<i32>,\n"
           "            level  : i32) -> vec4<i32>",
           TextureKind::kRegular,
-          sem::TextureDimension::k2d,
+          ast::TextureDimension::k2d,
           TextureDataType::kI32,
           "textureLoad",
           [](ProgramBuilder* b) {
@@ -1723,7 +1723,7 @@
           "            array_index : i32,\n"
           "            level       : i32) -> vec4<f32>",
           TextureKind::kRegular,
-          sem::TextureDimension::k2dArray,
+          ast::TextureDimension::k2dArray,
           TextureDataType::kF32,
           "textureLoad",
           [](ProgramBuilder* b) {
@@ -1740,7 +1740,7 @@
           "            array_index : i32,\n"
           "            level       : i32) -> vec4<u32>",
           TextureKind::kRegular,
-          sem::TextureDimension::k2dArray,
+          ast::TextureDimension::k2dArray,
           TextureDataType::kU32,
           "textureLoad",
           [](ProgramBuilder* b) {
@@ -1757,7 +1757,7 @@
           "            array_index : i32,\n"
           "            level       : i32) -> vec4<i32>",
           TextureKind::kRegular,
-          sem::TextureDimension::k2dArray,
+          ast::TextureDimension::k2dArray,
           TextureDataType::kI32,
           "textureLoad",
           [](ProgramBuilder* b) {
@@ -1773,7 +1773,7 @@
           "            coords : vec3<i32>,\n"
           "            level  : i32) -> vec4<f32>",
           TextureKind::kRegular,
-          sem::TextureDimension::k3d,
+          ast::TextureDimension::k3d,
           TextureDataType::kF32,
           "textureLoad",
           [](ProgramBuilder* b) {
@@ -1788,7 +1788,7 @@
           "            coords : vec3<i32>,\n"
           "            level  : i32) -> vec4<u32>",
           TextureKind::kRegular,
-          sem::TextureDimension::k3d,
+          ast::TextureDimension::k3d,
           TextureDataType::kU32,
           "textureLoad",
           [](ProgramBuilder* b) {
@@ -1803,7 +1803,7 @@
           "            coords : vec3<i32>,\n"
           "            level  : i32) -> vec4<i32>",
           TextureKind::kRegular,
-          sem::TextureDimension::k3d,
+          ast::TextureDimension::k3d,
           TextureDataType::kI32,
           "textureLoad",
           [](ProgramBuilder* b) {
@@ -1818,7 +1818,7 @@
           "            coords       : vec2<i32>,\n"
           "            sample_index : i32) -> vec4<f32>",
           TextureKind::kMultisampled,
-          sem::TextureDimension::k2d,
+          ast::TextureDimension::k2d,
           TextureDataType::kF32,
           "textureLoad",
           [](ProgramBuilder* b) {
@@ -1833,7 +1833,7 @@
           "            coords       : vec2<i32>,\n"
           "            sample_index : i32) -> vec4<u32>",
           TextureKind::kMultisampled,
-          sem::TextureDimension::k2d,
+          ast::TextureDimension::k2d,
           TextureDataType::kU32,
           "textureLoad",
           [](ProgramBuilder* b) {
@@ -1848,7 +1848,7 @@
           "            coords       : vec2<i32>,\n"
           "            sample_index : i32) -> vec4<i32>",
           TextureKind::kMultisampled,
-          sem::TextureDimension::k2d,
+          ast::TextureDimension::k2d,
           TextureDataType::kI32,
           "textureLoad",
           [](ProgramBuilder* b) {
@@ -1863,7 +1863,7 @@
           "            coords : vec2<i32>,\n"
           "            level  : i32) -> f32",
           TextureKind::kDepth,
-          sem::TextureDimension::k2d,
+          ast::TextureDimension::k2d,
           TextureDataType::kF32,
           "textureLoad",
           [](ProgramBuilder* b) {
@@ -1879,7 +1879,7 @@
           "            array_index : i32,\n"
           "            level       : i32) -> f32",
           TextureKind::kDepth,
-          sem::TextureDimension::k2dArray,
+          ast::TextureDimension::k2dArray,
           TextureDataType::kF32,
           "textureLoad",
           [](ProgramBuilder* b) {
@@ -1894,8 +1894,8 @@
           "textureLoad(t      : texture_storage_1d<rgba32float>,\n"
           "            coords : i32) -> vec4<f32>",
           ast::AccessControl::kReadOnly,
-          sem::ImageFormat::kRgba32Float,
-          sem::TextureDimension::k1d,
+          ast::ImageFormat::kRgba32Float,
+          ast::TextureDimension::k1d,
           TextureDataType::kF32,
           "textureLoad",
           [](ProgramBuilder* b) {
@@ -1908,8 +1908,8 @@
           "textureLoad(t           : texture_storage_2d<rgba8unorm>,\n"
           "            coords      : vec2<i32>) -> vec4<f32>",
           ast::AccessControl::kReadOnly,
-          sem::ImageFormat::kRgba8Unorm,
-          sem::TextureDimension::k2d,
+          ast::ImageFormat::kRgba8Unorm,
+          ast::TextureDimension::k2d,
           TextureDataType::kF32,
           "textureLoad",
           [](ProgramBuilder* b) {
@@ -1922,8 +1922,8 @@
           "textureLoad(t           : texture_storage_2d<rgba8snorm>,\n"
           "            coords      : vec2<i32>) -> vec4<f32>",
           ast::AccessControl::kReadOnly,
-          sem::ImageFormat::kRgba8Snorm,
-          sem::TextureDimension::k2d,
+          ast::ImageFormat::kRgba8Snorm,
+          ast::TextureDimension::k2d,
           TextureDataType::kF32,
           "textureLoad",
           [](ProgramBuilder* b) {
@@ -1936,8 +1936,8 @@
           "textureLoad(t           : texture_storage_2d<rgba8uint>,\n"
           "            coords      : vec2<i32>) -> vec4<u32>",
           ast::AccessControl::kReadOnly,
-          sem::ImageFormat::kRgba8Uint,
-          sem::TextureDimension::k2d,
+          ast::ImageFormat::kRgba8Uint,
+          ast::TextureDimension::k2d,
           TextureDataType::kU32,
           "textureLoad",
           [](ProgramBuilder* b) {
@@ -1950,8 +1950,8 @@
           "textureLoad(t           : texture_storage_2d<rgba8sint>,\n"
           "            coords      : vec2<i32>) -> vec4<i32>",
           ast::AccessControl::kReadOnly,
-          sem::ImageFormat::kRgba8Sint,
-          sem::TextureDimension::k2d,
+          ast::ImageFormat::kRgba8Sint,
+          ast::TextureDimension::k2d,
           TextureDataType::kI32,
           "textureLoad",
           [](ProgramBuilder* b) {
@@ -1964,8 +1964,8 @@
           "textureLoad(t           : texture_storage_2d<rgba16uint>,\n"
           "            coords      : vec2<i32>) -> vec4<u32>",
           ast::AccessControl::kReadOnly,
-          sem::ImageFormat::kRgba16Uint,
-          sem::TextureDimension::k2d,
+          ast::ImageFormat::kRgba16Uint,
+          ast::TextureDimension::k2d,
           TextureDataType::kU32,
           "textureLoad",
           [](ProgramBuilder* b) {
@@ -1978,8 +1978,8 @@
           "textureLoad(t           : texture_storage_2d<rgba16sint>,\n"
           "            coords      : vec2<i32>) -> vec4<i32>",
           ast::AccessControl::kReadOnly,
-          sem::ImageFormat::kRgba16Sint,
-          sem::TextureDimension::k2d,
+          ast::ImageFormat::kRgba16Sint,
+          ast::TextureDimension::k2d,
           TextureDataType::kI32,
           "textureLoad",
           [](ProgramBuilder* b) {
@@ -1992,8 +1992,8 @@
           "textureLoad(t           : texture_storage_2d<rgba16float>,\n"
           "            coords      : vec2<i32>) -> vec4<f32>",
           ast::AccessControl::kReadOnly,
-          sem::ImageFormat::kRgba16Float,
-          sem::TextureDimension::k2d,
+          ast::ImageFormat::kRgba16Float,
+          ast::TextureDimension::k2d,
           TextureDataType::kF32,
           "textureLoad",
           [](ProgramBuilder* b) {
@@ -2006,8 +2006,8 @@
           "textureLoad(t           : texture_storage_2d<r32uint>,\n"
           "            coords      : vec2<i32>) -> vec4<u32>",
           ast::AccessControl::kReadOnly,
-          sem::ImageFormat::kR32Uint,
-          sem::TextureDimension::k2d,
+          ast::ImageFormat::kR32Uint,
+          ast::TextureDimension::k2d,
           TextureDataType::kU32,
           "textureLoad",
           [](ProgramBuilder* b) {
@@ -2020,8 +2020,8 @@
           "textureLoad(t           : texture_storage_2d<r32sint>,\n"
           "            coords      : vec2<i32>) -> vec4<i32>",
           ast::AccessControl::kReadOnly,
-          sem::ImageFormat::kR32Sint,
-          sem::TextureDimension::k2d,
+          ast::ImageFormat::kR32Sint,
+          ast::TextureDimension::k2d,
           TextureDataType::kI32,
           "textureLoad",
           [](ProgramBuilder* b) {
@@ -2034,8 +2034,8 @@
           "textureLoad(t           : texture_storage_2d<r32float>,\n"
           "            coords      : vec2<i32>) -> vec4<f32>",
           ast::AccessControl::kReadOnly,
-          sem::ImageFormat::kR32Float,
-          sem::TextureDimension::k2d,
+          ast::ImageFormat::kR32Float,
+          ast::TextureDimension::k2d,
           TextureDataType::kF32,
           "textureLoad",
           [](ProgramBuilder* b) {
@@ -2048,8 +2048,8 @@
           "textureLoad(t           : texture_storage_2d<rg32uint>,\n"
           "            coords      : vec2<i32>) -> vec4<u32>",
           ast::AccessControl::kReadOnly,
-          sem::ImageFormat::kRg32Uint,
-          sem::TextureDimension::k2d,
+          ast::ImageFormat::kRg32Uint,
+          ast::TextureDimension::k2d,
           TextureDataType::kU32,
           "textureLoad",
           [](ProgramBuilder* b) {
@@ -2062,8 +2062,8 @@
           "textureLoad(t           : texture_storage_2d<rg32sint>,\n"
           "            coords      : vec2<i32>) -> vec4<i32>",
           ast::AccessControl::kReadOnly,
-          sem::ImageFormat::kRg32Sint,
-          sem::TextureDimension::k2d,
+          ast::ImageFormat::kRg32Sint,
+          ast::TextureDimension::k2d,
           TextureDataType::kI32,
           "textureLoad",
           [](ProgramBuilder* b) {
@@ -2076,8 +2076,8 @@
           "textureLoad(t           : texture_storage_2d<rg32float>,\n"
           "            coords      : vec2<i32>) -> vec4<f32>",
           ast::AccessControl::kReadOnly,
-          sem::ImageFormat::kRg32Float,
-          sem::TextureDimension::k2d,
+          ast::ImageFormat::kRg32Float,
+          ast::TextureDimension::k2d,
           TextureDataType::kF32,
           "textureLoad",
           [](ProgramBuilder* b) {
@@ -2090,8 +2090,8 @@
           "textureLoad(t           : texture_storage_2d<rgba32uint>,\n"
           "            coords      : vec2<i32>) -> vec4<u32>",
           ast::AccessControl::kReadOnly,
-          sem::ImageFormat::kRgba32Uint,
-          sem::TextureDimension::k2d,
+          ast::ImageFormat::kRgba32Uint,
+          ast::TextureDimension::k2d,
           TextureDataType::kU32,
           "textureLoad",
           [](ProgramBuilder* b) {
@@ -2104,8 +2104,8 @@
           "textureLoad(t           : texture_storage_2d<rgba32sint>,\n"
           "            coords      : vec2<i32>) -> vec4<i32>",
           ast::AccessControl::kReadOnly,
-          sem::ImageFormat::kRgba32Sint,
-          sem::TextureDimension::k2d,
+          ast::ImageFormat::kRgba32Sint,
+          ast::TextureDimension::k2d,
           TextureDataType::kI32,
           "textureLoad",
           [](ProgramBuilder* b) {
@@ -2118,8 +2118,8 @@
           "textureLoad(t           : texture_storage_2d<rgba32float>,\n"
           "            coords      : vec2<i32>) -> vec4<f32>",
           ast::AccessControl::kReadOnly,
-          sem::ImageFormat::kRgba32Float,
-          sem::TextureDimension::k2d,
+          ast::ImageFormat::kRgba32Float,
+          ast::TextureDimension::k2d,
           TextureDataType::kF32,
           "textureLoad",
           [](ProgramBuilder* b) {
@@ -2134,8 +2134,8 @@
           "            coords      : vec2<i32>,\n"
           "            array_index : i32) -> vec4<f32>",
           ast::AccessControl::kReadOnly,
-          sem::ImageFormat::kRgba32Float,
-          sem::TextureDimension::k2dArray,
+          ast::ImageFormat::kRgba32Float,
+          ast::TextureDimension::k2dArray,
           TextureDataType::kF32,
           "textureLoad",
           [](ProgramBuilder* b) {
@@ -2149,8 +2149,8 @@
           "textureLoad(t      : texture_storage_3d<rgba32float>,\n"
           "            coords : vec3<i32>) -> vec4<f32>",
           ast::AccessControl::kReadOnly,
-          sem::ImageFormat::kRgba32Float,
-          sem::TextureDimension::k3d,
+          ast::ImageFormat::kRgba32Float,
+          ast::TextureDimension::k3d,
           TextureDataType::kF32,
           "textureLoad",
           [](ProgramBuilder* b) {
@@ -2164,8 +2164,8 @@
           "             coords : i32,\n"
           "             value  : vec4<T>)",
           ast::AccessControl::kWriteOnly,
-          sem::ImageFormat::kRgba32Float,
-          sem::TextureDimension::k1d,
+          ast::ImageFormat::kRgba32Float,
+          ast::TextureDimension::k1d,
           TextureDataType::kF32,
           "textureStore",
           [](ProgramBuilder* b) {
@@ -2180,8 +2180,8 @@
           "             coords : vec2<i32>,\n"
           "             value  : vec4<T>)",
           ast::AccessControl::kWriteOnly,
-          sem::ImageFormat::kRgba32Float,
-          sem::TextureDimension::k2d,
+          ast::ImageFormat::kRgba32Float,
+          ast::TextureDimension::k2d,
           TextureDataType::kF32,
           "textureStore",
           [](ProgramBuilder* b) {
@@ -2197,8 +2197,8 @@
           "             array_index : i32,\n"
           "             value       : vec4<T>)",
           ast::AccessControl::kWriteOnly,
-          sem::ImageFormat::kRgba32Float,
-          sem::TextureDimension::k2dArray,
+          ast::ImageFormat::kRgba32Float,
+          ast::TextureDimension::k2dArray,
           TextureDataType::kF32,
           "textureStore",
           [](ProgramBuilder* b) {
@@ -2214,8 +2214,8 @@
           "             coords : vec3<i32>,\n"
           "             value  : vec4<T>)",
           ast::AccessControl::kWriteOnly,
-          sem::ImageFormat::kRgba32Float,
-          sem::TextureDimension::k3d,
+          ast::ImageFormat::kRgba32Float,
+          ast::TextureDimension::k3d,
           TextureDataType::kF32,
           "textureStore",
           [](ProgramBuilder* b) {
diff --git a/src/ast/intrinsic_texture_helper_test.h b/src/ast/intrinsic_texture_helper_test.h
index dc42295..d173111 100644
--- a/src/ast/intrinsic_texture_helper_test.h
+++ b/src/ast/intrinsic_texture_helper_test.h
@@ -176,8 +176,8 @@
   TextureOverloadCase(ValidTextureOverload,
                       const char*,
                       TextureKind,
-                      sem::SamplerKind,
-                      sem::TextureDimension,
+                      ast::SamplerKind,
+                      ast::TextureDimension,
                       TextureDataType,
                       const char*,
                       std::function<ExpressionList(ProgramBuilder*)>);
@@ -185,7 +185,7 @@
   TextureOverloadCase(ValidTextureOverload,
                       const char*,
                       TextureKind,
-                      sem::TextureDimension,
+                      ast::TextureDimension,
                       TextureDataType,
                       const char*,
                       std::function<ExpressionList(ProgramBuilder*)>);
@@ -193,8 +193,8 @@
   TextureOverloadCase(ValidTextureOverload,
                       const char*,
                       AccessControl::Access,
-                      sem::ImageFormat,
-                      sem::TextureDimension,
+                      ast::ImageFormat,
+                      ast::TextureDimension,
                       TextureDataType,
                       const char*,
                       std::function<ExpressionList(ProgramBuilder*)>);
@@ -227,15 +227,15 @@
   TextureKind const texture_kind;
   /// The sampler kind for the sampler parameter
   /// Used only when texture_kind is not kStorage
-  sem::SamplerKind const sampler_kind = sem::SamplerKind::kSampler;
+  ast::SamplerKind const sampler_kind = ast::SamplerKind::kSampler;
   /// The access control for the storage texture
   /// Used only when texture_kind is kStorage
   AccessControl::Access const access_control = AccessControl::kReadWrite;
   /// The image format for the storage texture
   /// Used only when texture_kind is kStorage
-  sem::ImageFormat const image_format = sem::ImageFormat::kNone;
+  ast::ImageFormat const image_format = ast::ImageFormat::kNone;
   /// The dimensions of the texture parameter
-  sem::TextureDimension const texture_dimension;
+  ast::TextureDimension const texture_dimension;
   /// The data type of the texture parameter
   TextureDataType const texture_data_type;
   /// Name of the function. e.g. `textureSample`, `textureSampleGrad`, etc
diff --git a/src/inspector/inspector.cc b/src/inspector/inspector.cc
index 213fc88..d1b38e9 100644
--- a/src/inspector/inspector.cc
+++ b/src/inspector/inspector.cc
@@ -57,21 +57,21 @@
 
 ResourceBinding::TextureDimension
 TypeTextureDimensionToResourceBindingTextureDimension(
-    const sem::TextureDimension& type_dim) {
+    const ast::TextureDimension& type_dim) {
   switch (type_dim) {
-    case sem::TextureDimension::k1d:
+    case ast::TextureDimension::k1d:
       return ResourceBinding::TextureDimension::k1d;
-    case sem::TextureDimension::k2d:
+    case ast::TextureDimension::k2d:
       return ResourceBinding::TextureDimension::k2d;
-    case sem::TextureDimension::k2dArray:
+    case ast::TextureDimension::k2dArray:
       return ResourceBinding::TextureDimension::k2dArray;
-    case sem::TextureDimension::k3d:
+    case ast::TextureDimension::k3d:
       return ResourceBinding::TextureDimension::k3d;
-    case sem::TextureDimension::kCube:
+    case ast::TextureDimension::kCube:
       return ResourceBinding::TextureDimension::kCube;
-    case sem::TextureDimension::kCubeArray:
+    case ast::TextureDimension::kCubeArray:
       return ResourceBinding::TextureDimension::kCubeArray;
-    case sem::TextureDimension::kNone:
+    case ast::TextureDimension::kNone:
       return ResourceBinding::TextureDimension::kNone;
   }
   return ResourceBinding::TextureDimension::kNone;
@@ -102,79 +102,79 @@
 }
 
 ResourceBinding::ImageFormat TypeImageFormatToResourceBindingImageFormat(
-    const sem::ImageFormat& image_format) {
+    const ast::ImageFormat& image_format) {
   switch (image_format) {
-    case sem::ImageFormat::kR8Unorm:
+    case ast::ImageFormat::kR8Unorm:
       return ResourceBinding::ImageFormat::kR8Unorm;
-    case sem::ImageFormat::kR8Snorm:
+    case ast::ImageFormat::kR8Snorm:
       return ResourceBinding::ImageFormat::kR8Snorm;
-    case sem::ImageFormat::kR8Uint:
+    case ast::ImageFormat::kR8Uint:
       return ResourceBinding::ImageFormat::kR8Uint;
-    case sem::ImageFormat::kR8Sint:
+    case ast::ImageFormat::kR8Sint:
       return ResourceBinding::ImageFormat::kR8Sint;
-    case sem::ImageFormat::kR16Uint:
+    case ast::ImageFormat::kR16Uint:
       return ResourceBinding::ImageFormat::kR16Uint;
-    case sem::ImageFormat::kR16Sint:
+    case ast::ImageFormat::kR16Sint:
       return ResourceBinding::ImageFormat::kR16Sint;
-    case sem::ImageFormat::kR16Float:
+    case ast::ImageFormat::kR16Float:
       return ResourceBinding::ImageFormat::kR16Float;
-    case sem::ImageFormat::kRg8Unorm:
+    case ast::ImageFormat::kRg8Unorm:
       return ResourceBinding::ImageFormat::kRg8Unorm;
-    case sem::ImageFormat::kRg8Snorm:
+    case ast::ImageFormat::kRg8Snorm:
       return ResourceBinding::ImageFormat::kRg8Snorm;
-    case sem::ImageFormat::kRg8Uint:
+    case ast::ImageFormat::kRg8Uint:
       return ResourceBinding::ImageFormat::kRg8Uint;
-    case sem::ImageFormat::kRg8Sint:
+    case ast::ImageFormat::kRg8Sint:
       return ResourceBinding::ImageFormat::kRg8Sint;
-    case sem::ImageFormat::kR32Uint:
+    case ast::ImageFormat::kR32Uint:
       return ResourceBinding::ImageFormat::kR32Uint;
-    case sem::ImageFormat::kR32Sint:
+    case ast::ImageFormat::kR32Sint:
       return ResourceBinding::ImageFormat::kR32Sint;
-    case sem::ImageFormat::kR32Float:
+    case ast::ImageFormat::kR32Float:
       return ResourceBinding::ImageFormat::kR32Float;
-    case sem::ImageFormat::kRg16Uint:
+    case ast::ImageFormat::kRg16Uint:
       return ResourceBinding::ImageFormat::kRg16Uint;
-    case sem::ImageFormat::kRg16Sint:
+    case ast::ImageFormat::kRg16Sint:
       return ResourceBinding::ImageFormat::kRg16Sint;
-    case sem::ImageFormat::kRg16Float:
+    case ast::ImageFormat::kRg16Float:
       return ResourceBinding::ImageFormat::kRg16Float;
-    case sem::ImageFormat::kRgba8Unorm:
+    case ast::ImageFormat::kRgba8Unorm:
       return ResourceBinding::ImageFormat::kRgba8Unorm;
-    case sem::ImageFormat::kRgba8UnormSrgb:
+    case ast::ImageFormat::kRgba8UnormSrgb:
       return ResourceBinding::ImageFormat::kRgba8UnormSrgb;
-    case sem::ImageFormat::kRgba8Snorm:
+    case ast::ImageFormat::kRgba8Snorm:
       return ResourceBinding::ImageFormat::kRgba8Snorm;
-    case sem::ImageFormat::kRgba8Uint:
+    case ast::ImageFormat::kRgba8Uint:
       return ResourceBinding::ImageFormat::kRgba8Uint;
-    case sem::ImageFormat::kRgba8Sint:
+    case ast::ImageFormat::kRgba8Sint:
       return ResourceBinding::ImageFormat::kRgba8Sint;
-    case sem::ImageFormat::kBgra8Unorm:
+    case ast::ImageFormat::kBgra8Unorm:
       return ResourceBinding::ImageFormat::kBgra8Unorm;
-    case sem::ImageFormat::kBgra8UnormSrgb:
+    case ast::ImageFormat::kBgra8UnormSrgb:
       return ResourceBinding::ImageFormat::kBgra8UnormSrgb;
-    case sem::ImageFormat::kRgb10A2Unorm:
+    case ast::ImageFormat::kRgb10A2Unorm:
       return ResourceBinding::ImageFormat::kRgb10A2Unorm;
-    case sem::ImageFormat::kRg11B10Float:
+    case ast::ImageFormat::kRg11B10Float:
       return ResourceBinding::ImageFormat::kRg11B10Float;
-    case sem::ImageFormat::kRg32Uint:
+    case ast::ImageFormat::kRg32Uint:
       return ResourceBinding::ImageFormat::kRg32Uint;
-    case sem::ImageFormat::kRg32Sint:
+    case ast::ImageFormat::kRg32Sint:
       return ResourceBinding::ImageFormat::kRg32Sint;
-    case sem::ImageFormat::kRg32Float:
+    case ast::ImageFormat::kRg32Float:
       return ResourceBinding::ImageFormat::kRg32Float;
-    case sem::ImageFormat::kRgba16Uint:
+    case ast::ImageFormat::kRgba16Uint:
       return ResourceBinding::ImageFormat::kRgba16Uint;
-    case sem::ImageFormat::kRgba16Sint:
+    case ast::ImageFormat::kRgba16Sint:
       return ResourceBinding::ImageFormat::kRgba16Sint;
-    case sem::ImageFormat::kRgba16Float:
+    case ast::ImageFormat::kRgba16Float:
       return ResourceBinding::ImageFormat::kRgba16Float;
-    case sem::ImageFormat::kRgba32Uint:
+    case ast::ImageFormat::kRgba32Uint:
       return ResourceBinding::ImageFormat::kRgba32Uint;
-    case sem::ImageFormat::kRgba32Sint:
+    case ast::ImageFormat::kRgba32Sint:
       return ResourceBinding::ImageFormat::kRgba32Sint;
-    case sem::ImageFormat::kRgba32Float:
+    case ast::ImageFormat::kRgba32Float:
       return ResourceBinding::ImageFormat::kRgba32Float;
-    case sem::ImageFormat::kNone:
+    case ast::ImageFormat::kNone:
       return ResourceBinding::ImageFormat::kNone;
   }
   return ResourceBinding::ImageFormat::kNone;
diff --git a/src/inspector/inspector_test.cc b/src/inspector/inspector_test.cc
index 68214a0..7f287d6 100644
--- a/src/inspector/inspector_test.cc
+++ b/src/inspector/inspector_test.cc
@@ -30,8 +30,8 @@
 class InspectorHelper : public ProgramBuilder {
  public:
   InspectorHelper()
-      : sampler_type_(sem::SamplerKind::kSampler),
-        comparison_sampler_type_(sem::SamplerKind::kComparisonSampler) {}
+      : sampler_type_(ast::SamplerKind::kSampler),
+        comparison_sampler_type_(ast::SamplerKind::kComparisonSampler) {}
 
   /// Generates an empty function
   /// @param name name of the function created
@@ -374,7 +374,7 @@
   /// @param dim the dimensions of the texture
   /// @param type the data type of the sampled texture
   /// @returns the generated SampleTextureType
-  sem::SampledTexture* MakeSampledTextureType(sem::TextureDimension dim,
+  sem::SampledTexture* MakeSampledTextureType(ast::TextureDimension dim,
                                               sem::Type* type) {
     return create<sem::SampledTexture>(dim, type);
   }
@@ -382,7 +382,7 @@
   /// Generates a DepthTexture appropriate for the params
   /// @param dim the dimensions of the texture
   /// @returns the generated DepthTexture
-  sem::DepthTexture* MakeDepthTextureType(sem::TextureDimension dim) {
+  sem::DepthTexture* MakeDepthTextureType(ast::TextureDimension dim) {
     return create<sem::DepthTexture>(dim);
   }
 
@@ -391,7 +391,7 @@
   /// @param type the data type of the sampled texture
   /// @returns the generated SampleTextureType
   sem::MultisampledTexture* MakeMultisampledTextureType(
-      sem::TextureDimension dim,
+      ast::TextureDimension dim,
       sem::Type* type) {
     return create<sem::MultisampledTexture>(dim, type);
   }
@@ -552,16 +552,16 @@
   /// @param dim dimensionality of the texture being sampled
   /// @param scalar the scalar type
   /// @returns a pointer to a type appropriate for the coord param
-  sem::Type* GetCoordsType(sem::TextureDimension dim, sem::Type* scalar) {
+  sem::Type* GetCoordsType(ast::TextureDimension dim, sem::Type* scalar) {
     switch (dim) {
-      case sem::TextureDimension::k1d:
+      case ast::TextureDimension::k1d:
         return scalar;
-      case sem::TextureDimension::k2d:
-      case sem::TextureDimension::k2dArray:
+      case ast::TextureDimension::k2d:
+      case ast::TextureDimension::k2dArray:
         return create<sem::Vector>(scalar, 2);
-      case sem::TextureDimension::k3d:
-      case sem::TextureDimension::kCube:
-      case sem::TextureDimension::kCubeArray:
+      case ast::TextureDimension::k3d:
+      case ast::TextureDimension::kCube:
+      case ast::TextureDimension::kCubeArray:
         return create<sem::Vector>(scalar, 3);
       default:
         [=]() { FAIL() << "Unsupported texture dimension: " << dim; }();
@@ -574,8 +574,8 @@
   /// @param format the image format of the storage texture
   /// @returns the storage texture type and subtype
   std::tuple<sem::StorageTexture*, sem::Type*> MakeStorageTextureTypes(
-      sem::TextureDimension dim,
-      sem::ImageFormat format) {
+      ast::TextureDimension dim,
+      ast::ImageFormat format) {
     sem::Type* subtype = sem::StorageTexture::SubtypeFor(format, Types());
     return {create<sem::StorageTexture>(dim, format, subtype), subtype};
   }
@@ -586,8 +586,8 @@
   /// @param read_only should the access type be read only, otherwise write only
   /// @returns the storage texture type, subtype & access control type
   std::tuple<sem::StorageTexture*, sem::Type*, sem::AccessControl*>
-  MakeStorageTextureTypes(sem::TextureDimension dim,
-                          sem::ImageFormat format,
+  MakeStorageTextureTypes(ast::TextureDimension dim,
+                          ast::ImageFormat format,
                           bool read_only) {
     sem::StorageTexture* texture_type;
     sem::Type* subtype;
@@ -705,7 +705,7 @@
     : public InspectorHelper,
       public testing::Test {};
 struct GetSampledTextureTestParams {
-  sem::TextureDimension type_dim;
+  ast::TextureDimension type_dim;
   inspector::ResourceBinding::TextureDimension inspector_dim;
   inspector::ResourceBinding::SampledKind sampled_kind;
 };
@@ -731,16 +731,16 @@
 class InspectorGetStorageTextureResourceBindingsTest : public InspectorHelper,
                                                        public testing::Test {};
 struct GetDepthTextureTestParams {
-  sem::TextureDimension type_dim;
+  ast::TextureDimension type_dim;
   inspector::ResourceBinding::TextureDimension inspector_dim;
 };
 class InspectorGetDepthTextureResourceBindingsTestWithParam
     : public InspectorHelper,
       public testing::TestWithParam<GetDepthTextureTestParams> {};
 
-typedef std::tuple<sem::TextureDimension, ResourceBinding::TextureDimension>
+typedef std::tuple<ast::TextureDimension, ResourceBinding::TextureDimension>
     DimensionParams;
-typedef std::tuple<sem::ImageFormat,
+typedef std::tuple<ast::ImageFormat,
                    ResourceBinding::ImageFormat,
                    ResourceBinding::SampledKind>
     ImageFormatParams;
@@ -1702,7 +1702,7 @@
                                           {{0, ty.i32()}});
 
   auto* s_texture_type =
-      MakeSampledTextureType(sem::TextureDimension::k1d, ty.f32());
+      MakeSampledTextureType(ast::TextureDimension::k1d, ty.f32());
   AddSampledTexture("s_texture", s_texture_type, 2, 0);
   AddSampler("s_var", 3, 0);
   AddGlobalVariable("s_coords", ty.f32());
@@ -1710,7 +1710,7 @@
                                    ty.f32(), {});
 
   auto* cs_depth_texture_type =
-      MakeDepthTextureType(sem::TextureDimension::k2d);
+      MakeDepthTextureType(ast::TextureDimension::k2d);
   AddDepthTexture("cs_texture", cs_depth_texture_type, 3, 1);
   AddComparisonSampler("cs_var", 3, 2);
   AddGlobalVariable("cs_coords", ty.vec2<f32>());
@@ -1722,7 +1722,7 @@
   sem::Type* st_subtype;
   sem::AccessControl* st_ac;
   std::tie(st_type, st_subtype, st_ac) = MakeStorageTextureTypes(
-      sem::TextureDimension::k2d, sem::ImageFormat::kR32Uint, false);
+      ast::TextureDimension::k2d, ast::ImageFormat::kR32Uint, false);
   AddStorageTexture("st_var", st_ac, 4, 0);
   MakeStorageTextureBodyFunction("st_func", "st_var", ty.vec2<i32>(), {});
 
@@ -1730,7 +1730,7 @@
   sem::Type* rost_subtype;
   sem::AccessControl* rost_ac;
   std::tie(rost_type, rost_subtype, rost_ac) = MakeStorageTextureTypes(
-      sem::TextureDimension::k2d, sem::ImageFormat::kR32Uint, true);
+      ast::TextureDimension::k2d, ast::ImageFormat::kR32Uint, true);
   AddStorageTexture("rost_var", rost_ac, 4, 1);
   MakeStorageTextureBodyFunction("rost_func", "rost_var", ty.vec2<i32>(), {});
 
@@ -2420,7 +2420,7 @@
 
 TEST_F(InspectorGetSamplerResourceBindingsTest, Simple) {
   auto* sampled_texture_type =
-      MakeSampledTextureType(sem::TextureDimension::k1d, ty.f32());
+      MakeSampledTextureType(ast::TextureDimension::k1d, ty.f32());
   AddSampledTexture("foo_texture", sampled_texture_type, 0, 0);
   AddSampler("foo_sampler", 0, 1);
   AddGlobalVariable("foo_coords", ty.f32());
@@ -2458,7 +2458,7 @@
 
 TEST_F(InspectorGetSamplerResourceBindingsTest, InFunction) {
   auto* sampled_texture_type =
-      MakeSampledTextureType(sem::TextureDimension::k1d, ty.f32());
+      MakeSampledTextureType(ast::TextureDimension::k1d, ty.f32());
   AddSampledTexture("foo_texture", sampled_texture_type, 0, 0);
   AddSampler("foo_sampler", 0, 1);
   AddGlobalVariable("foo_coords", ty.f32());
@@ -2485,7 +2485,7 @@
 
 TEST_F(InspectorGetSamplerResourceBindingsTest, UnknownEntryPoint) {
   auto* sampled_texture_type =
-      MakeSampledTextureType(sem::TextureDimension::k1d, ty.f32());
+      MakeSampledTextureType(ast::TextureDimension::k1d, ty.f32());
   AddSampledTexture("foo_texture", sampled_texture_type, 0, 0);
   AddSampler("foo_sampler", 0, 1);
   AddGlobalVariable("foo_coords", ty.f32());
@@ -2503,7 +2503,7 @@
 }
 
 TEST_F(InspectorGetSamplerResourceBindingsTest, SkipsComparisonSamplers) {
-  auto* depth_texture_type = MakeDepthTextureType(sem::TextureDimension::k2d);
+  auto* depth_texture_type = MakeDepthTextureType(ast::TextureDimension::k2d);
   AddDepthTexture("foo_texture", depth_texture_type, 0, 0);
   AddComparisonSampler("foo_sampler", 0, 1);
   AddGlobalVariable("foo_coords", ty.vec2<f32>());
@@ -2524,7 +2524,7 @@
 }
 
 TEST_F(InspectorGetComparisonSamplerResourceBindingsTest, Simple) {
-  auto* depth_texture_type = MakeDepthTextureType(sem::TextureDimension::k2d);
+  auto* depth_texture_type = MakeDepthTextureType(ast::TextureDimension::k2d);
   AddDepthTexture("foo_texture", depth_texture_type, 0, 0);
   AddComparisonSampler("foo_sampler", 0, 1);
   AddGlobalVariable("foo_coords", ty.vec2<f32>());
@@ -2563,7 +2563,7 @@
 }
 
 TEST_F(InspectorGetComparisonSamplerResourceBindingsTest, InFunction) {
-  auto* depth_texture_type = MakeDepthTextureType(sem::TextureDimension::k2d);
+  auto* depth_texture_type = MakeDepthTextureType(ast::TextureDimension::k2d);
   AddDepthTexture("foo_texture", depth_texture_type, 0, 0);
   AddComparisonSampler("foo_sampler", 0, 1);
   AddGlobalVariable("foo_coords", ty.vec2<f32>());
@@ -2592,7 +2592,7 @@
 }
 
 TEST_F(InspectorGetComparisonSamplerResourceBindingsTest, UnknownEntryPoint) {
-  auto* depth_texture_type = MakeDepthTextureType(sem::TextureDimension::k2d);
+  auto* depth_texture_type = MakeDepthTextureType(ast::TextureDimension::k2d);
   AddDepthTexture("foo_texture", depth_texture_type, 0, 0);
   AddComparisonSampler("foo_sampler", 0, 1);
   AddGlobalVariable("foo_coords", ty.vec2<f32>());
@@ -2612,7 +2612,7 @@
 
 TEST_F(InspectorGetComparisonSamplerResourceBindingsTest, SkipsSamplers) {
   auto* sampled_texture_type =
-      MakeSampledTextureType(sem::TextureDimension::k1d, ty.f32());
+      MakeSampledTextureType(ast::TextureDimension::k1d, ty.f32());
   AddSampledTexture("foo_texture", sampled_texture_type, 0, 0);
   AddSampler("foo_sampler", 0, 1);
   AddGlobalVariable("foo_coords", ty.f32());
@@ -2686,19 +2686,19 @@
     InspectorGetSampledTextureResourceBindingsTestWithParam,
     testing::Values(
         GetSampledTextureTestParams{
-            sem::TextureDimension::k1d,
+            ast::TextureDimension::k1d,
             inspector::ResourceBinding::TextureDimension::k1d,
             inspector::ResourceBinding::SampledKind::kFloat},
         GetSampledTextureTestParams{
-            sem::TextureDimension::k2d,
+            ast::TextureDimension::k2d,
             inspector::ResourceBinding::TextureDimension::k2d,
             inspector::ResourceBinding::SampledKind::kFloat},
         GetSampledTextureTestParams{
-            sem::TextureDimension::k3d,
+            ast::TextureDimension::k3d,
             inspector::ResourceBinding::TextureDimension::k3d,
             inspector::ResourceBinding::SampledKind::kFloat},
         GetSampledTextureTestParams{
-            sem::TextureDimension::kCube,
+            ast::TextureDimension::kCube,
             inspector::ResourceBinding::TextureDimension::kCube,
             inspector::ResourceBinding::SampledKind::kFloat}));
 
@@ -2738,11 +2738,11 @@
     InspectorGetSampledArrayTextureResourceBindingsTestWithParam,
     testing::Values(
         GetSampledTextureTestParams{
-            sem::TextureDimension::k2dArray,
+            ast::TextureDimension::k2dArray,
             inspector::ResourceBinding::TextureDimension::k2dArray,
             inspector::ResourceBinding::SampledKind::kFloat},
         GetSampledTextureTestParams{
-            sem::TextureDimension::kCubeArray,
+            ast::TextureDimension::kCubeArray,
             inspector::ResourceBinding::TextureDimension::kCubeArray,
             inspector::ResourceBinding::SampledKind::kFloat}));
 
@@ -2790,15 +2790,15 @@
     InspectorGetMultisampledTextureResourceBindingsTestWithParam,
     testing::Values(
         GetMultisampledTextureTestParams{
-            sem::TextureDimension::k2d,
+            ast::TextureDimension::k2d,
             inspector::ResourceBinding::TextureDimension::k2d,
             inspector::ResourceBinding::SampledKind::kFloat},
         GetMultisampledTextureTestParams{
-            sem::TextureDimension::k2d,
+            ast::TextureDimension::k2d,
             inspector::ResourceBinding::TextureDimension::k2d,
             inspector::ResourceBinding::SampledKind::kSInt},
         GetMultisampledTextureTestParams{
-            sem::TextureDimension::k2d,
+            ast::TextureDimension::k2d,
             inspector::ResourceBinding::TextureDimension::k2d,
             inspector::ResourceBinding::SampledKind::kUInt}));
 
@@ -2852,15 +2852,15 @@
     InspectorGetMultisampledArrayTextureResourceBindingsTestWithParam,
     testing::Values(
         GetMultisampledTextureTestParams{
-            sem::TextureDimension::k2dArray,
+            ast::TextureDimension::k2dArray,
             inspector::ResourceBinding::TextureDimension::k2dArray,
             inspector::ResourceBinding::SampledKind::kFloat},
         GetMultisampledTextureTestParams{
-            sem::TextureDimension::k2dArray,
+            ast::TextureDimension::k2dArray,
             inspector::ResourceBinding::TextureDimension::k2dArray,
             inspector::ResourceBinding::SampledKind::kSInt},
         GetMultisampledTextureTestParams{
-            sem::TextureDimension::k2dArray,
+            ast::TextureDimension::k2dArray,
             inspector::ResourceBinding::TextureDimension::k2dArray,
             inspector::ResourceBinding::SampledKind::kUInt}));
 
@@ -2887,11 +2887,11 @@
   ImageFormatParams format_params;
   std::tie(read_only, dim_params, format_params) = GetParam();
 
-  sem::TextureDimension dim;
+  ast::TextureDimension dim;
   ResourceBinding::TextureDimension expected_dim;
   std::tie(dim, expected_dim) = dim_params;
 
-  sem::ImageFormat format;
+  ast::ImageFormat format;
   ResourceBinding::ImageFormat expected_format;
   ResourceBinding::SampledKind expected_kind;
   std::tie(format, expected_format, expected_kind) = format_params;
@@ -2905,14 +2905,14 @@
 
   sem::Type* dim_type = nullptr;
   switch (dim) {
-    case sem::TextureDimension::k1d:
+    case ast::TextureDimension::k1d:
       dim_type = ty.i32();
       break;
-    case sem::TextureDimension::k2d:
-    case sem::TextureDimension::k2dArray:
+    case ast::TextureDimension::k2d:
+    case ast::TextureDimension::k2dArray:
       dim_type = ty.vec2<i32>();
       break;
-    case sem::TextureDimension::k3d:
+    case ast::TextureDimension::k3d:
       dim_type = ty.vec3<i32>();
       break;
     default:
@@ -2956,61 +2956,61 @@
     testing::Combine(
         testing::Bool(),
         testing::Values(
-            std::make_tuple(sem::TextureDimension::k1d,
+            std::make_tuple(ast::TextureDimension::k1d,
                             ResourceBinding::TextureDimension::k1d),
-            std::make_tuple(sem::TextureDimension::k2d,
+            std::make_tuple(ast::TextureDimension::k2d,
                             ResourceBinding::TextureDimension::k2d),
-            std::make_tuple(sem::TextureDimension::k2dArray,
+            std::make_tuple(ast::TextureDimension::k2dArray,
                             ResourceBinding::TextureDimension::k2dArray),
-            std::make_tuple(sem::TextureDimension::k3d,
+            std::make_tuple(ast::TextureDimension::k3d,
                             ResourceBinding::TextureDimension::k3d)),
         testing::Values(
-            std::make_tuple(sem::ImageFormat::kR32Float,
+            std::make_tuple(ast::ImageFormat::kR32Float,
                             ResourceBinding::ImageFormat::kR32Float,
                             ResourceBinding::SampledKind::kFloat),
-            std::make_tuple(sem::ImageFormat::kR32Sint,
+            std::make_tuple(ast::ImageFormat::kR32Sint,
                             ResourceBinding::ImageFormat::kR32Sint,
                             ResourceBinding::SampledKind::kSInt),
-            std::make_tuple(sem::ImageFormat::kR32Uint,
+            std::make_tuple(ast::ImageFormat::kR32Uint,
                             ResourceBinding::ImageFormat::kR32Uint,
                             ResourceBinding::SampledKind::kUInt),
-            std::make_tuple(sem::ImageFormat::kRg32Float,
+            std::make_tuple(ast::ImageFormat::kRg32Float,
                             ResourceBinding::ImageFormat::kRg32Float,
                             ResourceBinding::SampledKind::kFloat),
-            std::make_tuple(sem::ImageFormat::kRg32Sint,
+            std::make_tuple(ast::ImageFormat::kRg32Sint,
                             ResourceBinding::ImageFormat::kRg32Sint,
                             ResourceBinding::SampledKind::kSInt),
-            std::make_tuple(sem::ImageFormat::kRg32Uint,
+            std::make_tuple(ast::ImageFormat::kRg32Uint,
                             ResourceBinding::ImageFormat::kRg32Uint,
                             ResourceBinding::SampledKind::kUInt),
-            std::make_tuple(sem::ImageFormat::kRgba16Float,
+            std::make_tuple(ast::ImageFormat::kRgba16Float,
                             ResourceBinding::ImageFormat::kRgba16Float,
                             ResourceBinding::SampledKind::kFloat),
-            std::make_tuple(sem::ImageFormat::kRgba16Sint,
+            std::make_tuple(ast::ImageFormat::kRgba16Sint,
                             ResourceBinding::ImageFormat::kRgba16Sint,
                             ResourceBinding::SampledKind::kSInt),
-            std::make_tuple(sem::ImageFormat::kRgba16Uint,
+            std::make_tuple(ast::ImageFormat::kRgba16Uint,
                             ResourceBinding::ImageFormat::kRgba16Uint,
                             ResourceBinding::SampledKind::kUInt),
-            std::make_tuple(sem::ImageFormat::kRgba32Float,
+            std::make_tuple(ast::ImageFormat::kRgba32Float,
                             ResourceBinding::ImageFormat::kRgba32Float,
                             ResourceBinding::SampledKind::kFloat),
-            std::make_tuple(sem::ImageFormat::kRgba32Sint,
+            std::make_tuple(ast::ImageFormat::kRgba32Sint,
                             ResourceBinding::ImageFormat::kRgba32Sint,
                             ResourceBinding::SampledKind::kSInt),
-            std::make_tuple(sem::ImageFormat::kRgba32Uint,
+            std::make_tuple(ast::ImageFormat::kRgba32Uint,
                             ResourceBinding::ImageFormat::kRgba32Uint,
                             ResourceBinding::SampledKind::kUInt),
-            std::make_tuple(sem::ImageFormat::kRgba8Sint,
+            std::make_tuple(ast::ImageFormat::kRgba8Sint,
                             ResourceBinding::ImageFormat::kRgba8Sint,
                             ResourceBinding::SampledKind::kSInt),
-            std::make_tuple(sem::ImageFormat::kRgba8Snorm,
+            std::make_tuple(ast::ImageFormat::kRgba8Snorm,
                             ResourceBinding::ImageFormat::kRgba8Snorm,
                             ResourceBinding::SampledKind::kFloat),
-            std::make_tuple(sem::ImageFormat::kRgba8Uint,
+            std::make_tuple(ast::ImageFormat::kRgba8Uint,
                             ResourceBinding::ImageFormat::kRgba8Uint,
                             ResourceBinding::SampledKind::kUInt),
-            std::make_tuple(sem::ImageFormat::kRgba8Unorm,
+            std::make_tuple(ast::ImageFormat::kRgba8Unorm,
                             ResourceBinding::ImageFormat::kRgba8Unorm,
                             ResourceBinding::SampledKind::kFloat))));
 
@@ -3047,16 +3047,16 @@
     InspectorGetDepthTextureResourceBindingsTestWithParam,
     testing::Values(
         GetDepthTextureTestParams{
-            sem::TextureDimension::k2d,
+            ast::TextureDimension::k2d,
             inspector::ResourceBinding::TextureDimension::k2d},
         GetDepthTextureTestParams{
-            sem::TextureDimension::k2dArray,
+            ast::TextureDimension::k2dArray,
             inspector::ResourceBinding::TextureDimension::k2dArray},
         GetDepthTextureTestParams{
-            sem::TextureDimension::kCube,
+            ast::TextureDimension::kCube,
             inspector::ResourceBinding::TextureDimension::kCube},
         GetDepthTextureTestParams{
-            sem::TextureDimension::kCubeArray,
+            ast::TextureDimension::kCubeArray,
             inspector::ResourceBinding::TextureDimension::kCubeArray}));
 
 }  // namespace
diff --git a/src/intrinsic_table.cc b/src/intrinsic_table.cc
index 40d2ef1..b4164ed 100644
--- a/src/intrinsic_table.cc
+++ b/src/intrinsic_table.cc
@@ -428,7 +428,7 @@
 /// SampledTextureBuilder is a Matcher / Builder for sampled texture types.
 class SampledTextureBuilder : public Builder {
  public:
-  explicit SampledTextureBuilder(sem::TextureDimension dimensions,
+  explicit SampledTextureBuilder(ast::TextureDimension dimensions,
                                  Builder* type_builder)
       : dimensions_(dimensions), type_builder_(type_builder) {}
 
@@ -453,7 +453,7 @@
   }
 
  private:
-  sem::TextureDimension const dimensions_;
+  ast::TextureDimension const dimensions_;
   Builder* const type_builder_;
 };
 
@@ -461,7 +461,7 @@
 /// types.
 class MultisampledTextureBuilder : public Builder {
  public:
-  explicit MultisampledTextureBuilder(sem::TextureDimension dimensions,
+  explicit MultisampledTextureBuilder(ast::TextureDimension dimensions,
                                       Builder* type_builder)
       : dimensions_(dimensions), type_builder_(type_builder) {}
 
@@ -487,14 +487,14 @@
   }
 
  private:
-  sem::TextureDimension const dimensions_;
+  ast::TextureDimension const dimensions_;
   Builder* const type_builder_;
 };
 
 /// DepthTextureBuilder is a Matcher / Builder for depth texture types.
 class DepthTextureBuilder : public Builder {
  public:
-  explicit DepthTextureBuilder(sem::TextureDimension dimensions)
+  explicit DepthTextureBuilder(ast::TextureDimension dimensions)
       : dimensions_(dimensions) {}
 
   bool MatchUnwrapped(MatchState&, sem::Type* ty) const override {
@@ -515,7 +515,7 @@
   }
 
  private:
-  sem::TextureDimension const dimensions_;
+  ast::TextureDimension const dimensions_;
 };
 
 /// StorageTextureBuilder is a Matcher / Builder for storage texture types of
@@ -523,7 +523,7 @@
 class StorageTextureBuilder : public Builder {
  public:
   explicit StorageTextureBuilder(
-      sem::TextureDimension dimensions,
+      ast::TextureDimension dimensions,
       OpenNumber texel_format,  // a.k.a "image format"
       OpenType channel_format)  // a.k.a "storage subtype"
       : dimensions_(dimensions),
@@ -552,7 +552,7 @@
 
   sem::Type* Build(BuildState& state) const override {
     auto texel_format =
-        static_cast<sem::ImageFormat>(state.open_numbers.at(texel_format_));
+        static_cast<ast::ImageFormat>(state.open_numbers.at(texel_format_));
     auto* channel_format = state.open_types.at(channel_format_);
     return state.ty_mgr.Get<sem::StorageTexture>(dimensions_, texel_format,
                                                  channel_format);
@@ -565,7 +565,7 @@
   }
 
  private:
-  sem::TextureDimension const dimensions_;
+  ast::TextureDimension const dimensions_;
   OpenNumber const texel_format_;
   OpenType const channel_format_;
 };
@@ -573,7 +573,7 @@
 /// SamplerBuilder is a Matcher / Builder for sampler types of the given kind.
 class SamplerBuilder : public Builder {
  public:
-  explicit SamplerBuilder(sem::SamplerKind kind) : kind_(kind) {}
+  explicit SamplerBuilder(ast::SamplerKind kind) : kind_(kind) {}
 
   bool MatchUnwrapped(MatchState&, sem::Type* ty) const override {
     if (auto* sampler = ty->As<sem::Sampler>()) {
@@ -588,16 +588,16 @@
 
   std::string str() const override {
     switch (kind_) {
-      case sem::SamplerKind::kSampler:
+      case ast::SamplerKind::kSampler:
         return "sampler";
-      case sem::SamplerKind::kComparisonSampler:
+      case ast::SamplerKind::kComparisonSampler:
         return "sampler_comparison";
     }
     return "sampler";
   }
 
  private:
-  sem::SamplerKind const kind_;
+  ast::SamplerKind const kind_;
 };
 
 /// AccessControlBuilder is a Matcher / Builder for AccessControl types
@@ -732,13 +732,13 @@
 
   /// @returns a Matcher / Builder that matches a sampled texture with the given
   /// dimensions and type
-  Builder* sampled_texture(sem::TextureDimension dimensions, Builder* type) {
+  Builder* sampled_texture(ast::TextureDimension dimensions, Builder* type) {
     return matcher_allocator_.Create<SampledTextureBuilder>(dimensions, type);
   }
 
   /// @returns a Matcher / Builder that matches a multisampled texture with the
   /// given dimensions and type
-  Builder* multisampled_texture(sem::TextureDimension dimensions,
+  Builder* multisampled_texture(ast::TextureDimension dimensions,
                                 Builder* type) {
     return matcher_allocator_.Create<MultisampledTextureBuilder>(dimensions,
                                                                  type);
@@ -746,13 +746,13 @@
 
   /// @returns a Matcher / Builder that matches a depth texture with the
   /// given dimensions
-  Builder* depth_texture(sem::TextureDimension dimensions) {
+  Builder* depth_texture(ast::TextureDimension dimensions) {
     return matcher_allocator_.Create<DepthTextureBuilder>(dimensions);
   }
 
   /// @returns a Matcher / Builder that matches a storage texture of the given
   /// format with the given dimensions
-  Builder* storage_texture(sem::TextureDimension dimensions,
+  Builder* storage_texture(ast::TextureDimension dimensions,
                            OpenNumber texel_format,
                            OpenType channel_format) {
     return matcher_allocator_.Create<StorageTextureBuilder>(
@@ -760,7 +760,7 @@
   }
 
   /// @returns a Matcher / Builder that matches a sampler type
-  Builder* sampler(sem::SamplerKind kind) {
+  Builder* sampler(ast::SamplerKind kind) {
     return matcher_allocator_.Create<SamplerBuilder>(kind);
   }
 
@@ -797,7 +797,7 @@
 
 Impl::Impl() {
   using I = sem::IntrinsicType;
-  using Dim = sem::TextureDimension;
+  using Dim = ast::TextureDimension;
 
   auto* void_ = &matchers_.void_;      // void
   auto* bool_ = &matchers_.bool_;      // bool
@@ -1115,9 +1115,9 @@
       access_control(ast::AccessControl::kWriteOnly, tex_storage_2d_array_FT);
   auto* tex_storage_wo_3d_FT =
       access_control(ast::AccessControl::kWriteOnly, tex_storage_3d_FT);
-  auto* sampler = this->sampler(sem::SamplerKind::kSampler);
+  auto* sampler = this->sampler(ast::SamplerKind::kSampler);
   auto* sampler_comparison =
-      this->sampler(sem::SamplerKind::kComparisonSampler);
+      this->sampler(ast::SamplerKind::kComparisonSampler);
   auto t = sem::Parameter::Usage::kTexture;
   auto s = sem::Parameter::Usage::kSampler;
   auto coords = sem::Parameter::Usage::kCoords;
diff --git a/src/intrinsic_table_test.cc b/src/intrinsic_table_test.cc
index 1fc730e..8349c4b 100644
--- a/src/intrinsic_table_test.cc
+++ b/src/intrinsic_table_test.cc
@@ -69,7 +69,7 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchI32) {
-  auto* tex = create<sem::SampledTexture>(sem::TextureDimension::k1d, ty.f32());
+  auto* tex = create<sem::SampledTexture>(ast::TextureDimension::k1d, ty.f32());
   auto result = table->Lookup(*this, IntrinsicType::kTextureLoad,
                               {tex, ty.i32(), ty.i32()}, Source{});
   ASSERT_NE(result.intrinsic, nullptr);
@@ -83,7 +83,7 @@
 }
 
 TEST_F(IntrinsicTableTest, MismatchI32) {
-  auto* tex = create<sem::SampledTexture>(sem::TextureDimension::k1d, ty.f32());
+  auto* tex = create<sem::SampledTexture>(ast::TextureDimension::k1d, ty.f32());
   auto result = table->Lookup(*this, IntrinsicType::kTextureLoad,
                               {tex, ty.f32()}, Source{});
   ASSERT_EQ(result.intrinsic, nullptr);
@@ -219,8 +219,8 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchSampler) {
-  auto* tex = create<sem::SampledTexture>(sem::TextureDimension::k2d, ty.f32());
-  auto* sampler = create<sem::Sampler>(sem::SamplerKind::kSampler);
+  auto* tex = create<sem::SampledTexture>(ast::TextureDimension::k2d, ty.f32());
+  auto* sampler = create<sem::Sampler>(ast::SamplerKind::kSampler);
   auto result = table->Lookup(*this, IntrinsicType::kTextureSample,
                               {tex, sampler, ty.vec2<f32>()}, Source{});
   ASSERT_NE(result.intrinsic, nullptr);
@@ -235,7 +235,7 @@
 }
 
 TEST_F(IntrinsicTableTest, MismatchSampler) {
-  auto* tex = create<sem::SampledTexture>(sem::TextureDimension::k2d, ty.f32());
+  auto* tex = create<sem::SampledTexture>(ast::TextureDimension::k2d, ty.f32());
   auto result = table->Lookup(*this, IntrinsicType::kTextureSample,
                               {tex, ty.f32(), ty.vec2<f32>()}, Source{});
   ASSERT_EQ(result.intrinsic, nullptr);
@@ -243,7 +243,7 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchSampledTexture) {
-  auto* tex = create<sem::SampledTexture>(sem::TextureDimension::k2d, ty.f32());
+  auto* tex = create<sem::SampledTexture>(ast::TextureDimension::k2d, ty.f32());
   auto result = table->Lookup(*this, IntrinsicType::kTextureLoad,
                               {tex, ty.vec2<i32>(), ty.i32()}, Source{});
   ASSERT_NE(result.intrinsic, nullptr);
@@ -258,7 +258,7 @@
 
 TEST_F(IntrinsicTableTest, MatchMultisampledTexture) {
   auto* tex =
-      create<sem::MultisampledTexture>(sem::TextureDimension::k2d, ty.f32());
+      create<sem::MultisampledTexture>(ast::TextureDimension::k2d, ty.f32());
   auto result = table->Lookup(*this, IntrinsicType::kTextureLoad,
                               {tex, ty.vec2<i32>(), ty.i32()}, Source{});
   ASSERT_NE(result.intrinsic, nullptr);
@@ -272,7 +272,7 @@
 }
 
 TEST_F(IntrinsicTableTest, MatchDepthTexture) {
-  auto* tex = create<sem::DepthTexture>(sem::TextureDimension::k2d);
+  auto* tex = create<sem::DepthTexture>(ast::TextureDimension::k2d);
   auto result = table->Lookup(*this, IntrinsicType::kTextureLoad,
                               {tex, ty.vec2<i32>(), ty.i32()}, Source{});
   ASSERT_NE(result.intrinsic, nullptr);
@@ -287,8 +287,8 @@
 
 TEST_F(IntrinsicTableTest, MatchROStorageTexture) {
   auto* tex = create<sem::StorageTexture>(
-      sem::TextureDimension::k2d, sem::ImageFormat::kR16Float,
-      sem::StorageTexture::SubtypeFor(sem::ImageFormat::kR16Float, Types()));
+      ast::TextureDimension::k2d, ast::ImageFormat::kR16Float,
+      sem::StorageTexture::SubtypeFor(ast::ImageFormat::kR16Float, Types()));
   auto* tex_ac = create<sem::AccessControl>(ast::AccessControl::kReadOnly, tex);
   auto result = table->Lookup(*this, IntrinsicType::kTextureLoad,
                               {tex_ac, ty.vec2<i32>()}, Source{});
@@ -304,8 +304,8 @@
 
 TEST_F(IntrinsicTableTest, MatchWOStorageTexture) {
   auto* tex = create<sem::StorageTexture>(
-      sem::TextureDimension::k2d, sem::ImageFormat::kR16Float,
-      sem::StorageTexture::SubtypeFor(sem::ImageFormat::kR16Float, Types()));
+      ast::TextureDimension::k2d, ast::ImageFormat::kR16Float,
+      sem::StorageTexture::SubtypeFor(ast::ImageFormat::kR16Float, Types()));
   auto* tex_ac =
       create<sem::AccessControl>(ast::AccessControl::kWriteOnly, tex);
   auto result =
@@ -464,7 +464,7 @@
 }
 
 TEST_F(IntrinsicTableTest, OverloadOrderByMatchingParameter) {
-  auto* tex = create<sem::DepthTexture>(sem::TextureDimension::k2d);
+  auto* tex = create<sem::DepthTexture>(ast::TextureDimension::k2d);
   auto result = table->Lookup(*this, IntrinsicType::kTextureDimensions,
                               {tex, ty.bool_()}, Source{});
   ASSERT_EQ(
diff --git a/src/reader/spirv/enum_converter.cc b/src/reader/spirv/enum_converter.cc
index 1f82c04..2a78248 100644
--- a/src/reader/spirv/enum_converter.cc
+++ b/src/reader/spirv/enum_converter.cc
@@ -100,83 +100,83 @@
   return ast::Builtin::kNone;
 }
 
-sem::TextureDimension EnumConverter::ToDim(SpvDim dim, bool arrayed) {
+ast::TextureDimension EnumConverter::ToDim(SpvDim dim, bool arrayed) {
   if (arrayed) {
     switch (dim) {
       case SpvDim2D:
-        return sem::TextureDimension::k2dArray;
+        return ast::TextureDimension::k2dArray;
       case SpvDimCube:
-        return sem::TextureDimension::kCubeArray;
+        return ast::TextureDimension::kCubeArray;
       default:
         break;
     }
     Fail() << "arrayed dimension must be 1D, 2D, or Cube. Got " << int(dim);
-    return sem::TextureDimension::kNone;
+    return ast::TextureDimension::kNone;
   }
   // Assume non-arrayed
   switch (dim) {
     case SpvDim1D:
-      return sem::TextureDimension::k1d;
+      return ast::TextureDimension::k1d;
     case SpvDim2D:
-      return sem::TextureDimension::k2d;
+      return ast::TextureDimension::k2d;
     case SpvDim3D:
-      return sem::TextureDimension::k3d;
+      return ast::TextureDimension::k3d;
     case SpvDimCube:
-      return sem::TextureDimension::kCube;
+      return ast::TextureDimension::kCube;
     default:
       break;
   }
   Fail() << "invalid dimension: " << int(dim);
-  return sem::TextureDimension::kNone;
+  return ast::TextureDimension::kNone;
 }
 
-sem::ImageFormat EnumConverter::ToImageFormat(SpvImageFormat fmt) {
+ast::ImageFormat EnumConverter::ToImageFormat(SpvImageFormat fmt) {
   switch (fmt) {
     case SpvImageFormatUnknown:
-      return sem::ImageFormat::kNone;
+      return ast::ImageFormat::kNone;
 
     // 8 bit channels
     case SpvImageFormatRgba8:
-      return sem::ImageFormat::kRgba8Unorm;
+      return ast::ImageFormat::kRgba8Unorm;
     case SpvImageFormatRgba8Snorm:
-      return sem::ImageFormat::kRgba8Snorm;
+      return ast::ImageFormat::kRgba8Snorm;
     case SpvImageFormatRgba8ui:
-      return sem::ImageFormat::kRgba8Uint;
+      return ast::ImageFormat::kRgba8Uint;
     case SpvImageFormatRgba8i:
-      return sem::ImageFormat::kRgba8Sint;
+      return ast::ImageFormat::kRgba8Sint;
 
     // 16 bit channels
     case SpvImageFormatRgba16ui:
-      return sem::ImageFormat::kRgba16Uint;
+      return ast::ImageFormat::kRgba16Uint;
     case SpvImageFormatRgba16i:
-      return sem::ImageFormat::kRgba16Sint;
+      return ast::ImageFormat::kRgba16Sint;
     case SpvImageFormatRgba16f:
-      return sem::ImageFormat::kRgba16Float;
+      return ast::ImageFormat::kRgba16Float;
 
     // 32 bit channels
     case SpvImageFormatR32ui:
-      return sem::ImageFormat::kR32Uint;
+      return ast::ImageFormat::kR32Uint;
     case SpvImageFormatR32i:
-      return sem::ImageFormat::kR32Sint;
+      return ast::ImageFormat::kR32Sint;
     case SpvImageFormatR32f:
-      return sem::ImageFormat::kR32Float;
+      return ast::ImageFormat::kR32Float;
     case SpvImageFormatRg32ui:
-      return sem::ImageFormat::kRg32Uint;
+      return ast::ImageFormat::kRg32Uint;
     case SpvImageFormatRg32i:
-      return sem::ImageFormat::kRg32Sint;
+      return ast::ImageFormat::kRg32Sint;
     case SpvImageFormatRg32f:
-      return sem::ImageFormat::kRg32Float;
+      return ast::ImageFormat::kRg32Float;
     case SpvImageFormatRgba32ui:
-      return sem::ImageFormat::kRgba32Uint;
+      return ast::ImageFormat::kRgba32Uint;
     case SpvImageFormatRgba32i:
-      return sem::ImageFormat::kRgba32Sint;
+      return ast::ImageFormat::kRgba32Sint;
     case SpvImageFormatRgba32f:
-      return sem::ImageFormat::kRgba32Float;
+      return ast::ImageFormat::kRgba32Float;
     default:
       break;
   }
   Fail() << "invalid image format: " << int(fmt);
-  return sem::ImageFormat::kNone;
+  return ast::ImageFormat::kNone;
 }
 
 }  // namespace spirv
diff --git a/src/reader/spirv/enum_converter.h b/src/reader/spirv/enum_converter.h
index 12ac904..25b4971 100644
--- a/src/reader/spirv/enum_converter.h
+++ b/src/reader/spirv/enum_converter.h
@@ -58,13 +58,13 @@
   /// @param dim the SPIR-V Dim value
   /// @param arrayed true if the texture is arrayed
   /// @returns a Tint AST texture dimension
-  sem::TextureDimension ToDim(SpvDim dim, bool arrayed);
+  ast::TextureDimension ToDim(SpvDim dim, bool arrayed);
 
   /// Converts a SPIR-V Image Format to a Tint ImageFormat
   /// On failure, logs an error and returns kNone
   /// @param fmt the SPIR-V format
   /// @returns a Tint AST format
-  sem::ImageFormat ToImageFormat(SpvImageFormat fmt);
+  ast::ImageFormat ToImageFormat(SpvImageFormat fmt);
 
  private:
   /// Registers a failure and returns a stream for log diagnostics.
diff --git a/src/reader/spirv/enum_converter_test.cc b/src/reader/spirv/enum_converter_test.cc
index 4433f9c..7cb0932 100644
--- a/src/reader/spirv/enum_converter_test.cc
+++ b/src/reader/spirv/enum_converter_test.cc
@@ -243,7 +243,7 @@
   SpvDim dim;
   bool arrayed;
   bool expect_success;
-  sem::TextureDimension expected;
+  ast::TextureDimension expected;
 };
 inline std::ostream& operator<<(std::ostream& out, DimCase dc) {
   out << "DimCase{ SpvDim:" << int(dc.dim) << " arrayed?:" << int(dc.arrayed)
@@ -287,37 +287,37 @@
     SpvDimTest,
     testing::Values(
         // Non-arrayed
-        DimCase{SpvDim1D, false, true, sem::TextureDimension::k1d},
-        DimCase{SpvDim2D, false, true, sem::TextureDimension::k2d},
-        DimCase{SpvDim3D, false, true, sem::TextureDimension::k3d},
-        DimCase{SpvDimCube, false, true, sem::TextureDimension::kCube},
+        DimCase{SpvDim1D, false, true, ast::TextureDimension::k1d},
+        DimCase{SpvDim2D, false, true, ast::TextureDimension::k2d},
+        DimCase{SpvDim3D, false, true, ast::TextureDimension::k3d},
+        DimCase{SpvDimCube, false, true, ast::TextureDimension::kCube},
         // Arrayed
-        DimCase{SpvDim2D, true, true, sem::TextureDimension::k2dArray},
-        DimCase{SpvDimCube, true, true, sem::TextureDimension::kCubeArray}));
+        DimCase{SpvDim2D, true, true, ast::TextureDimension::k2dArray},
+        DimCase{SpvDimCube, true, true, ast::TextureDimension::kCubeArray}));
 
 INSTANTIATE_TEST_SUITE_P(
     EnumConverterBad,
     SpvDimTest,
     testing::Values(
         // Invalid SPIR-V dimensionality.
-        DimCase{SpvDimMax, false, false, sem::TextureDimension::kNone},
-        DimCase{SpvDimMax, true, false, sem::TextureDimension::kNone},
+        DimCase{SpvDimMax, false, false, ast::TextureDimension::kNone},
+        DimCase{SpvDimMax, true, false, ast::TextureDimension::kNone},
         // Vulkan non-arrayed dimensionalities not supported by WGSL.
-        DimCase{SpvDimRect, false, false, sem::TextureDimension::kNone},
-        DimCase{SpvDimBuffer, false, false, sem::TextureDimension::kNone},
-        DimCase{SpvDimSubpassData, false, false, sem::TextureDimension::kNone},
+        DimCase{SpvDimRect, false, false, ast::TextureDimension::kNone},
+        DimCase{SpvDimBuffer, false, false, ast::TextureDimension::kNone},
+        DimCase{SpvDimSubpassData, false, false, ast::TextureDimension::kNone},
         // Arrayed dimensionalities not supported by WGSL
-        DimCase{SpvDim3D, true, false, sem::TextureDimension::kNone},
-        DimCase{SpvDimRect, true, false, sem::TextureDimension::kNone},
-        DimCase{SpvDimBuffer, true, false, sem::TextureDimension::kNone},
-        DimCase{SpvDimSubpassData, true, false, sem::TextureDimension::kNone}));
+        DimCase{SpvDim3D, true, false, ast::TextureDimension::kNone},
+        DimCase{SpvDimRect, true, false, ast::TextureDimension::kNone},
+        DimCase{SpvDimBuffer, true, false, ast::TextureDimension::kNone},
+        DimCase{SpvDimSubpassData, true, false, ast::TextureDimension::kNone}));
 
 // ImageFormat
 
 struct ImageFormatCase {
   SpvImageFormat format;
   bool expect_success;
-  sem::ImageFormat expected;
+  ast::ImageFormat expected;
 };
 inline std::ostream& operator<<(std::ostream& out, ImageFormatCase ifc) {
   out << "ImageFormatCase{ SpvImageFormat:" << int(ifc.format)
@@ -361,68 +361,68 @@
     SpvImageFormatTest,
     testing::Values(
         // Unknown.  This is used for sampled images.
-        ImageFormatCase{SpvImageFormatUnknown, true, sem::ImageFormat::kNone},
+        ImageFormatCase{SpvImageFormatUnknown, true, ast::ImageFormat::kNone},
         // 8 bit channels
         ImageFormatCase{SpvImageFormatRgba8, true,
-                        sem::ImageFormat::kRgba8Unorm},
+                        ast::ImageFormat::kRgba8Unorm},
         ImageFormatCase{SpvImageFormatRgba8Snorm, true,
-                        sem::ImageFormat::kRgba8Snorm},
+                        ast::ImageFormat::kRgba8Snorm},
         ImageFormatCase{SpvImageFormatRgba8ui, true,
-                        sem::ImageFormat::kRgba8Uint},
+                        ast::ImageFormat::kRgba8Uint},
         ImageFormatCase{SpvImageFormatRgba8i, true,
-                        sem::ImageFormat::kRgba8Sint},
+                        ast::ImageFormat::kRgba8Sint},
         // 16 bit channels
         ImageFormatCase{SpvImageFormatRgba16ui, true,
-                        sem::ImageFormat::kRgba16Uint},
+                        ast::ImageFormat::kRgba16Uint},
         ImageFormatCase{SpvImageFormatRgba16i, true,
-                        sem::ImageFormat::kRgba16Sint},
+                        ast::ImageFormat::kRgba16Sint},
         ImageFormatCase{SpvImageFormatRgba16f, true,
-                        sem::ImageFormat::kRgba16Float},
+                        ast::ImageFormat::kRgba16Float},
         // 32 bit channels
         // ... 1 channel
-        ImageFormatCase{SpvImageFormatR32ui, true, sem::ImageFormat::kR32Uint},
-        ImageFormatCase{SpvImageFormatR32i, true, sem::ImageFormat::kR32Sint},
-        ImageFormatCase{SpvImageFormatR32f, true, sem::ImageFormat::kR32Float},
+        ImageFormatCase{SpvImageFormatR32ui, true, ast::ImageFormat::kR32Uint},
+        ImageFormatCase{SpvImageFormatR32i, true, ast::ImageFormat::kR32Sint},
+        ImageFormatCase{SpvImageFormatR32f, true, ast::ImageFormat::kR32Float},
         // ... 2 channels
         ImageFormatCase{SpvImageFormatRg32ui, true,
-                        sem::ImageFormat::kRg32Uint},
-        ImageFormatCase{SpvImageFormatRg32i, true, sem::ImageFormat::kRg32Sint},
+                        ast::ImageFormat::kRg32Uint},
+        ImageFormatCase{SpvImageFormatRg32i, true, ast::ImageFormat::kRg32Sint},
         ImageFormatCase{SpvImageFormatRg32f, true,
-                        sem::ImageFormat::kRg32Float},
+                        ast::ImageFormat::kRg32Float},
         // ... 4 channels
         ImageFormatCase{SpvImageFormatRgba32ui, true,
-                        sem::ImageFormat::kRgba32Uint},
+                        ast::ImageFormat::kRgba32Uint},
         ImageFormatCase{SpvImageFormatRgba32i, true,
-                        sem::ImageFormat::kRgba32Sint},
+                        ast::ImageFormat::kRgba32Sint},
         ImageFormatCase{SpvImageFormatRgba32f, true,
-                        sem::ImageFormat::kRgba32Float}));
+                        ast::ImageFormat::kRgba32Float}));
 
 INSTANTIATE_TEST_SUITE_P(
     EnumConverterBad,
     SpvImageFormatTest,
     testing::Values(
         // Scanning in order from the SPIR-V spec.
-        ImageFormatCase{SpvImageFormatRg16f, false, sem::ImageFormat::kNone},
+        ImageFormatCase{SpvImageFormatRg16f, false, ast::ImageFormat::kNone},
         ImageFormatCase{SpvImageFormatR11fG11fB10f, false,
-                        sem::ImageFormat::kNone},
-        ImageFormatCase{SpvImageFormatR16f, false, sem::ImageFormat::kNone},
-        ImageFormatCase{SpvImageFormatRgb10A2, false, sem::ImageFormat::kNone},
-        ImageFormatCase{SpvImageFormatRg16, false, sem::ImageFormat::kNone},
-        ImageFormatCase{SpvImageFormatRg8, false, sem::ImageFormat::kNone},
-        ImageFormatCase{SpvImageFormatR16, false, sem::ImageFormat::kNone},
-        ImageFormatCase{SpvImageFormatR8, false, sem::ImageFormat::kNone},
+                        ast::ImageFormat::kNone},
+        ImageFormatCase{SpvImageFormatR16f, false, ast::ImageFormat::kNone},
+        ImageFormatCase{SpvImageFormatRgb10A2, false, ast::ImageFormat::kNone},
+        ImageFormatCase{SpvImageFormatRg16, false, ast::ImageFormat::kNone},
+        ImageFormatCase{SpvImageFormatRg8, false, ast::ImageFormat::kNone},
+        ImageFormatCase{SpvImageFormatR16, false, ast::ImageFormat::kNone},
+        ImageFormatCase{SpvImageFormatR8, false, ast::ImageFormat::kNone},
         ImageFormatCase{SpvImageFormatRgba16Snorm, false,
-                        sem::ImageFormat::kNone},
+                        ast::ImageFormat::kNone},
         ImageFormatCase{SpvImageFormatRg16Snorm, false,
-                        sem::ImageFormat::kNone},
-        ImageFormatCase{SpvImageFormatRg8Snorm, false, sem::ImageFormat::kNone},
-        ImageFormatCase{SpvImageFormatRg16i, false, sem::ImageFormat::kNone},
-        ImageFormatCase{SpvImageFormatRg8i, false, sem::ImageFormat::kNone},
-        ImageFormatCase{SpvImageFormatR8i, false, sem::ImageFormat::kNone},
+                        ast::ImageFormat::kNone},
+        ImageFormatCase{SpvImageFormatRg8Snorm, false, ast::ImageFormat::kNone},
+        ImageFormatCase{SpvImageFormatRg16i, false, ast::ImageFormat::kNone},
+        ImageFormatCase{SpvImageFormatRg8i, false, ast::ImageFormat::kNone},
+        ImageFormatCase{SpvImageFormatR8i, false, ast::ImageFormat::kNone},
         ImageFormatCase{SpvImageFormatRgb10a2ui, false,
-                        sem::ImageFormat::kNone},
-        ImageFormatCase{SpvImageFormatRg16ui, false, sem::ImageFormat::kNone},
-        ImageFormatCase{SpvImageFormatRg8ui, false, sem::ImageFormat::kNone}));
+                        ast::ImageFormat::kNone},
+        ImageFormatCase{SpvImageFormatRg16ui, false, ast::ImageFormat::kNone},
+        ImageFormatCase{SpvImageFormatRg8ui, false, ast::ImageFormat::kNone}));
 
 }  // namespace
 }  // namespace spirv
diff --git a/src/reader/spirv/function.cc b/src/reader/spirv/function.cc
index 00e94b6..888f7cc 100644
--- a/src/reader/spirv/function.cc
+++ b/src/reader/spirv/function.cc
@@ -4549,9 +4549,9 @@
                     << inst.PrettyPrint();
     }
     switch (texture_type->dim()) {
-      case sem::TextureDimension::k2d:
-      case sem::TextureDimension::k2dArray:
-      case sem::TextureDimension::k3d:
+      case ast::TextureDimension::k2d:
+      case ast::TextureDimension::k2dArray:
+      case ast::TextureDimension::k3d:
         break;
       default:
         return Fail() << "ConstOffset is only permitted for 2D, 2D Arrayed, "
@@ -4674,7 +4674,7 @@
       }
       exprs.push_back(
           create<ast::CallExpression>(Source{}, dims_ident, dims_args));
-      if (sem::IsTextureArray(texture_type->dim())) {
+      if (ast::IsTextureArray(texture_type->dim())) {
         auto* layers_ident = create<ast::IdentifierExpression>(
             Source{}, builder_.Symbols().Register("textureNumLayers"));
         exprs.push_back(create<ast::CallExpression>(
@@ -4753,10 +4753,10 @@
   if (!texture_type) {
     return {};
   }
-  sem::TextureDimension dim = texture_type->dim();
+  ast::TextureDimension dim = texture_type->dim();
   // Number of regular coordinates.
-  uint32_t num_axes = sem::NumCoordinateAxes(dim);
-  bool is_arrayed = sem::IsTextureArray(dim);
+  uint32_t num_axes = ast::NumCoordinateAxes(dim);
+  bool is_arrayed = ast::IsTextureArray(dim);
   if ((num_axes == 0) || (num_axes > 3)) {
     Fail() << "unsupported image dimensionality for "
            << texture_type->type_name() << " prompted by "
diff --git a/src/reader/spirv/parser_impl.cc b/src/reader/spirv/parser_impl.cc
index 36d1bf9..ab1848d 100644
--- a/src/reader/spirv/parser_impl.cc
+++ b/src/reader/spirv/parser_impl.cc
@@ -1898,8 +1898,8 @@
   sem::Type* ast_store_type = nullptr;
   if (usage.IsSampler()) {
     ast_store_type = builder_.create<sem::Sampler>(
-        usage.IsComparisonSampler() ? sem::SamplerKind::kComparisonSampler
-                                    : sem::SamplerKind::kSampler);
+        usage.IsComparisonSampler() ? ast::SamplerKind::kComparisonSampler
+                                    : ast::SamplerKind::kSampler);
   } else if (usage.IsTexture()) {
     const spvtools::opt::analysis::Image* image_type =
         type_mgr_->GetType(raw_handle_type->result_id())->AsImage();
@@ -1909,9 +1909,9 @@
       return nullptr;
     }
 
-    const sem::TextureDimension dim =
+    const ast::TextureDimension dim =
         enum_converter_.ToDim(image_type->dim(), image_type->is_arrayed());
-    if (dim == sem::TextureDimension::kNone) {
+    if (dim == ast::TextureDimension::kNone) {
       return nullptr;
     }
 
@@ -1942,7 +1942,7 @@
                               ? ast::AccessControl::kReadOnly
                               : ast::AccessControl::kWriteOnly;
       const auto format = enum_converter_.ToImageFormat(image_type->format());
-      if (format == sem::ImageFormat::kNone) {
+      if (format == ast::ImageFormat::kNone) {
         return nullptr;
       }
       auto* subtype = sem::StorageTexture::SubtypeFor(format, builder_.Types());
@@ -1964,47 +1964,47 @@
   return result;
 }
 
-sem::Type* ParserImpl::GetComponentTypeForFormat(sem::ImageFormat format) {
+sem::Type* ParserImpl::GetComponentTypeForFormat(ast::ImageFormat format) {
   switch (format) {
-    case sem::ImageFormat::kR8Uint:
-    case sem::ImageFormat::kR16Uint:
-    case sem::ImageFormat::kRg8Uint:
-    case sem::ImageFormat::kR32Uint:
-    case sem::ImageFormat::kRg16Uint:
-    case sem::ImageFormat::kRgba8Uint:
-    case sem::ImageFormat::kRg32Uint:
-    case sem::ImageFormat::kRgba16Uint:
-    case sem::ImageFormat::kRgba32Uint:
+    case ast::ImageFormat::kR8Uint:
+    case ast::ImageFormat::kR16Uint:
+    case ast::ImageFormat::kRg8Uint:
+    case ast::ImageFormat::kR32Uint:
+    case ast::ImageFormat::kRg16Uint:
+    case ast::ImageFormat::kRgba8Uint:
+    case ast::ImageFormat::kRg32Uint:
+    case ast::ImageFormat::kRgba16Uint:
+    case ast::ImageFormat::kRgba32Uint:
       return builder_.create<sem::U32>();
 
-    case sem::ImageFormat::kR8Sint:
-    case sem::ImageFormat::kR16Sint:
-    case sem::ImageFormat::kRg8Sint:
-    case sem::ImageFormat::kR32Sint:
-    case sem::ImageFormat::kRg16Sint:
-    case sem::ImageFormat::kRgba8Sint:
-    case sem::ImageFormat::kRg32Sint:
-    case sem::ImageFormat::kRgba16Sint:
-    case sem::ImageFormat::kRgba32Sint:
+    case ast::ImageFormat::kR8Sint:
+    case ast::ImageFormat::kR16Sint:
+    case ast::ImageFormat::kRg8Sint:
+    case ast::ImageFormat::kR32Sint:
+    case ast::ImageFormat::kRg16Sint:
+    case ast::ImageFormat::kRgba8Sint:
+    case ast::ImageFormat::kRg32Sint:
+    case ast::ImageFormat::kRgba16Sint:
+    case ast::ImageFormat::kRgba32Sint:
       return builder_.create<sem::I32>();
 
-    case sem::ImageFormat::kR8Unorm:
-    case sem::ImageFormat::kRg8Unorm:
-    case sem::ImageFormat::kRgba8Unorm:
-    case sem::ImageFormat::kRgba8UnormSrgb:
-    case sem::ImageFormat::kBgra8Unorm:
-    case sem::ImageFormat::kBgra8UnormSrgb:
-    case sem::ImageFormat::kRgb10A2Unorm:
-    case sem::ImageFormat::kR8Snorm:
-    case sem::ImageFormat::kRg8Snorm:
-    case sem::ImageFormat::kRgba8Snorm:
-    case sem::ImageFormat::kR16Float:
-    case sem::ImageFormat::kR32Float:
-    case sem::ImageFormat::kRg16Float:
-    case sem::ImageFormat::kRg11B10Float:
-    case sem::ImageFormat::kRg32Float:
-    case sem::ImageFormat::kRgba16Float:
-    case sem::ImageFormat::kRgba32Float:
+    case ast::ImageFormat::kR8Unorm:
+    case ast::ImageFormat::kRg8Unorm:
+    case ast::ImageFormat::kRgba8Unorm:
+    case ast::ImageFormat::kRgba8UnormSrgb:
+    case ast::ImageFormat::kBgra8Unorm:
+    case ast::ImageFormat::kBgra8UnormSrgb:
+    case ast::ImageFormat::kRgb10A2Unorm:
+    case ast::ImageFormat::kR8Snorm:
+    case ast::ImageFormat::kRg8Snorm:
+    case ast::ImageFormat::kRgba8Snorm:
+    case ast::ImageFormat::kR16Float:
+    case ast::ImageFormat::kR32Float:
+    case ast::ImageFormat::kRg16Float:
+    case ast::ImageFormat::kRg11B10Float:
+    case ast::ImageFormat::kRg32Float:
+    case ast::ImageFormat::kRgba16Float:
+    case ast::ImageFormat::kRgba32Float:
       return builder_.create<sem::F32>();
     default:
       break;
@@ -2013,54 +2013,54 @@
   return nullptr;
 }
 
-sem::Type* ParserImpl::GetTexelTypeForFormat(sem::ImageFormat format) {
+sem::Type* ParserImpl::GetTexelTypeForFormat(ast::ImageFormat format) {
   auto* component_type = GetComponentTypeForFormat(format);
   if (!component_type) {
     return nullptr;
   }
 
   switch (format) {
-    case sem::ImageFormat::kR16Float:
-    case sem::ImageFormat::kR16Sint:
-    case sem::ImageFormat::kR16Uint:
-    case sem::ImageFormat::kR32Float:
-    case sem::ImageFormat::kR32Sint:
-    case sem::ImageFormat::kR32Uint:
-    case sem::ImageFormat::kR8Sint:
-    case sem::ImageFormat::kR8Snorm:
-    case sem::ImageFormat::kR8Uint:
-    case sem::ImageFormat::kR8Unorm:
+    case ast::ImageFormat::kR16Float:
+    case ast::ImageFormat::kR16Sint:
+    case ast::ImageFormat::kR16Uint:
+    case ast::ImageFormat::kR32Float:
+    case ast::ImageFormat::kR32Sint:
+    case ast::ImageFormat::kR32Uint:
+    case ast::ImageFormat::kR8Sint:
+    case ast::ImageFormat::kR8Snorm:
+    case ast::ImageFormat::kR8Uint:
+    case ast::ImageFormat::kR8Unorm:
       // One channel
       return component_type;
 
-    case sem::ImageFormat::kRg11B10Float:
-    case sem::ImageFormat::kRg16Float:
-    case sem::ImageFormat::kRg16Sint:
-    case sem::ImageFormat::kRg16Uint:
-    case sem::ImageFormat::kRg32Float:
-    case sem::ImageFormat::kRg32Sint:
-    case sem::ImageFormat::kRg32Uint:
-    case sem::ImageFormat::kRg8Sint:
-    case sem::ImageFormat::kRg8Snorm:
-    case sem::ImageFormat::kRg8Uint:
-    case sem::ImageFormat::kRg8Unorm:
+    case ast::ImageFormat::kRg11B10Float:
+    case ast::ImageFormat::kRg16Float:
+    case ast::ImageFormat::kRg16Sint:
+    case ast::ImageFormat::kRg16Uint:
+    case ast::ImageFormat::kRg32Float:
+    case ast::ImageFormat::kRg32Sint:
+    case ast::ImageFormat::kRg32Uint:
+    case ast::ImageFormat::kRg8Sint:
+    case ast::ImageFormat::kRg8Snorm:
+    case ast::ImageFormat::kRg8Uint:
+    case ast::ImageFormat::kRg8Unorm:
       // Two channels
       return builder_.create<sem::Vector>(component_type, 2);
 
-    case sem::ImageFormat::kBgra8Unorm:
-    case sem::ImageFormat::kBgra8UnormSrgb:
-    case sem::ImageFormat::kRgb10A2Unorm:
-    case sem::ImageFormat::kRgba16Float:
-    case sem::ImageFormat::kRgba16Sint:
-    case sem::ImageFormat::kRgba16Uint:
-    case sem::ImageFormat::kRgba32Float:
-    case sem::ImageFormat::kRgba32Sint:
-    case sem::ImageFormat::kRgba32Uint:
-    case sem::ImageFormat::kRgba8Sint:
-    case sem::ImageFormat::kRgba8Snorm:
-    case sem::ImageFormat::kRgba8Uint:
-    case sem::ImageFormat::kRgba8Unorm:
-    case sem::ImageFormat::kRgba8UnormSrgb:
+    case ast::ImageFormat::kBgra8Unorm:
+    case ast::ImageFormat::kBgra8UnormSrgb:
+    case ast::ImageFormat::kRgb10A2Unorm:
+    case ast::ImageFormat::kRgba16Float:
+    case ast::ImageFormat::kRgba16Sint:
+    case ast::ImageFormat::kRgba16Uint:
+    case ast::ImageFormat::kRgba32Float:
+    case ast::ImageFormat::kRgba32Sint:
+    case ast::ImageFormat::kRgba32Uint:
+    case ast::ImageFormat::kRgba8Sint:
+    case ast::ImageFormat::kRgba8Snorm:
+    case ast::ImageFormat::kRgba8Uint:
+    case ast::ImageFormat::kRgba8Unorm:
+    case ast::ImageFormat::kRgba8UnormSrgb:
       // Four channels
       return builder_.create<sem::Vector>(component_type, 4);
 
diff --git a/src/reader/spirv/parser_impl.h b/src/reader/spirv/parser_impl.h
index 3eeee28..7feb72e 100644
--- a/src/reader/spirv/parser_impl.h
+++ b/src/reader/spirv/parser_impl.h
@@ -475,12 +475,12 @@
   /// format.
   /// @param format image texel format
   /// @returns the component type, one of f32, i32, u32
-  sem::Type* GetComponentTypeForFormat(sem::ImageFormat format);
+  sem::Type* GetComponentTypeForFormat(ast::ImageFormat format);
 
   /// Returns texel type corresponding to the given image format.
   /// @param format image texel format
   /// @returns the texel format
-  sem::Type* GetTexelTypeForFormat(sem::ImageFormat format);
+  sem::Type* GetTexelTypeForFormat(ast::ImageFormat format);
 
   /// Returns the SPIR-V instruction with the given ID, or nullptr.
   /// @param id the SPIR-V result ID
diff --git a/src/reader/wgsl/parser_impl.cc b/src/reader/wgsl/parser_impl.cc
index 6ce0278..4783c4f 100644
--- a/src/reader/wgsl/parser_impl.cc
+++ b/src/reader/wgsl/parser_impl.cc
@@ -563,10 +563,10 @@
 //  | SAMPLER_COMPARISON
 Maybe<sem::Type*> ParserImpl::sampler_type() {
   if (match(Token::Type::kSampler))
-    return builder_.create<sem::Sampler>(sem::SamplerKind::kSampler);
+    return builder_.create<sem::Sampler>(ast::SamplerKind::kSampler);
 
   if (match(Token::Type::kComparisonSampler))
-    return builder_.create<sem::Sampler>(sem::SamplerKind::kComparisonSampler);
+    return builder_.create<sem::Sampler>(ast::SamplerKind::kComparisonSampler);
 
   return Failure::kNoMatch;
 }
@@ -578,33 +578,33 @@
 //  | TEXTURE_SAMPLED_3D
 //  | TEXTURE_SAMPLED_CUBE
 //  | TEXTURE_SAMPLED_CUBE_ARRAY
-Maybe<sem::TextureDimension> ParserImpl::sampled_texture_type() {
+Maybe<ast::TextureDimension> ParserImpl::sampled_texture_type() {
   if (match(Token::Type::kTextureSampled1d))
-    return sem::TextureDimension::k1d;
+    return ast::TextureDimension::k1d;
 
   if (match(Token::Type::kTextureSampled2d))
-    return sem::TextureDimension::k2d;
+    return ast::TextureDimension::k2d;
 
   if (match(Token::Type::kTextureSampled2dArray))
-    return sem::TextureDimension::k2dArray;
+    return ast::TextureDimension::k2dArray;
 
   if (match(Token::Type::kTextureSampled3d))
-    return sem::TextureDimension::k3d;
+    return ast::TextureDimension::k3d;
 
   if (match(Token::Type::kTextureSampledCube))
-    return sem::TextureDimension::kCube;
+    return ast::TextureDimension::kCube;
 
   if (match(Token::Type::kTextureSampledCubeArray))
-    return sem::TextureDimension::kCubeArray;
+    return ast::TextureDimension::kCubeArray;
 
   return Failure::kNoMatch;
 }
 
 // multisampled_texture_type
 //  : TEXTURE_MULTISAMPLED_2D
-Maybe<sem::TextureDimension> ParserImpl::multisampled_texture_type() {
+Maybe<ast::TextureDimension> ParserImpl::multisampled_texture_type() {
   if (match(Token::Type::kTextureMultisampled2d))
-    return sem::TextureDimension::k2d;
+    return ast::TextureDimension::k2d;
 
   return Failure::kNoMatch;
 }
@@ -614,15 +614,15 @@
 //  | TEXTURE_STORAGE_2D
 //  | TEXTURE_STORAGE_2D_ARRAY
 //  | TEXTURE_STORAGE_3D
-Maybe<sem::TextureDimension> ParserImpl::storage_texture_type() {
+Maybe<ast::TextureDimension> ParserImpl::storage_texture_type() {
   if (match(Token::Type::kTextureStorage1d))
-    return sem::TextureDimension::k1d;
+    return ast::TextureDimension::k1d;
   if (match(Token::Type::kTextureStorage2d))
-    return sem::TextureDimension::k2d;
+    return ast::TextureDimension::k2d;
   if (match(Token::Type::kTextureStorage2dArray))
-    return sem::TextureDimension::k2dArray;
+    return ast::TextureDimension::k2dArray;
   if (match(Token::Type::kTextureStorage3d))
-    return sem::TextureDimension::k3d;
+    return ast::TextureDimension::k3d;
 
   return Failure::kNoMatch;
 }
@@ -634,17 +634,17 @@
 //  | TEXTURE_DEPTH_CUBE_ARRAY
 Maybe<sem::Type*> ParserImpl::depth_texture_type() {
   if (match(Token::Type::kTextureDepth2d))
-    return builder_.create<sem::DepthTexture>(sem::TextureDimension::k2d);
+    return builder_.create<sem::DepthTexture>(ast::TextureDimension::k2d);
 
   if (match(Token::Type::kTextureDepth2dArray))
-    return builder_.create<sem::DepthTexture>(sem::TextureDimension::k2dArray);
+    return builder_.create<sem::DepthTexture>(ast::TextureDimension::k2dArray);
 
   if (match(Token::Type::kTextureDepthCube))
-    return builder_.create<sem::DepthTexture>(sem::TextureDimension::kCube);
+    return builder_.create<sem::DepthTexture>(ast::TextureDimension::kCube);
 
   if (match(Token::Type::kTextureDepthCubeArray))
     return builder_.create<sem::DepthTexture>(
-        sem::TextureDimension::kCubeArray);
+        ast::TextureDimension::kCubeArray);
 
   return Failure::kNoMatch;
 }
@@ -685,112 +685,112 @@
 //  | RGBA32UINT
 //  | RGBA32SINT
 //  | RGBA32FLOAT
-Expect<sem::ImageFormat> ParserImpl::expect_image_storage_type(
+Expect<ast::ImageFormat> ParserImpl::expect_image_storage_type(
     const std::string& use) {
   if (match(Token::Type::kFormatR8Unorm))
-    return sem::ImageFormat::kR8Unorm;
+    return ast::ImageFormat::kR8Unorm;
 
   if (match(Token::Type::kFormatR8Snorm))
-    return sem::ImageFormat::kR8Snorm;
+    return ast::ImageFormat::kR8Snorm;
 
   if (match(Token::Type::kFormatR8Uint))
-    return sem::ImageFormat::kR8Uint;
+    return ast::ImageFormat::kR8Uint;
 
   if (match(Token::Type::kFormatR8Sint))
-    return sem::ImageFormat::kR8Sint;
+    return ast::ImageFormat::kR8Sint;
 
   if (match(Token::Type::kFormatR16Uint))
-    return sem::ImageFormat::kR16Uint;
+    return ast::ImageFormat::kR16Uint;
 
   if (match(Token::Type::kFormatR16Sint))
-    return sem::ImageFormat::kR16Sint;
+    return ast::ImageFormat::kR16Sint;
 
   if (match(Token::Type::kFormatR16Float))
-    return sem::ImageFormat::kR16Float;
+    return ast::ImageFormat::kR16Float;
 
   if (match(Token::Type::kFormatRg8Unorm))
-    return sem::ImageFormat::kRg8Unorm;
+    return ast::ImageFormat::kRg8Unorm;
 
   if (match(Token::Type::kFormatRg8Snorm))
-    return sem::ImageFormat::kRg8Snorm;
+    return ast::ImageFormat::kRg8Snorm;
 
   if (match(Token::Type::kFormatRg8Uint))
-    return sem::ImageFormat::kRg8Uint;
+    return ast::ImageFormat::kRg8Uint;
 
   if (match(Token::Type::kFormatRg8Sint))
-    return sem::ImageFormat::kRg8Sint;
+    return ast::ImageFormat::kRg8Sint;
 
   if (match(Token::Type::kFormatR32Uint))
-    return sem::ImageFormat::kR32Uint;
+    return ast::ImageFormat::kR32Uint;
 
   if (match(Token::Type::kFormatR32Sint))
-    return sem::ImageFormat::kR32Sint;
+    return ast::ImageFormat::kR32Sint;
 
   if (match(Token::Type::kFormatR32Float))
-    return sem::ImageFormat::kR32Float;
+    return ast::ImageFormat::kR32Float;
 
   if (match(Token::Type::kFormatRg16Uint))
-    return sem::ImageFormat::kRg16Uint;
+    return ast::ImageFormat::kRg16Uint;
 
   if (match(Token::Type::kFormatRg16Sint))
-    return sem::ImageFormat::kRg16Sint;
+    return ast::ImageFormat::kRg16Sint;
 
   if (match(Token::Type::kFormatRg16Float))
-    return sem::ImageFormat::kRg16Float;
+    return ast::ImageFormat::kRg16Float;
 
   if (match(Token::Type::kFormatRgba8Unorm))
-    return sem::ImageFormat::kRgba8Unorm;
+    return ast::ImageFormat::kRgba8Unorm;
 
   if (match(Token::Type::kFormatRgba8UnormSrgb))
-    return sem::ImageFormat::kRgba8UnormSrgb;
+    return ast::ImageFormat::kRgba8UnormSrgb;
 
   if (match(Token::Type::kFormatRgba8Snorm))
-    return sem::ImageFormat::kRgba8Snorm;
+    return ast::ImageFormat::kRgba8Snorm;
 
   if (match(Token::Type::kFormatRgba8Uint))
-    return sem::ImageFormat::kRgba8Uint;
+    return ast::ImageFormat::kRgba8Uint;
 
   if (match(Token::Type::kFormatRgba8Sint))
-    return sem::ImageFormat::kRgba8Sint;
+    return ast::ImageFormat::kRgba8Sint;
 
   if (match(Token::Type::kFormatBgra8Unorm))
-    return sem::ImageFormat::kBgra8Unorm;
+    return ast::ImageFormat::kBgra8Unorm;
 
   if (match(Token::Type::kFormatBgra8UnormSrgb))
-    return sem::ImageFormat::kBgra8UnormSrgb;
+    return ast::ImageFormat::kBgra8UnormSrgb;
 
   if (match(Token::Type::kFormatRgb10A2Unorm))
-    return sem::ImageFormat::kRgb10A2Unorm;
+    return ast::ImageFormat::kRgb10A2Unorm;
 
   if (match(Token::Type::kFormatRg11B10Float))
-    return sem::ImageFormat::kRg11B10Float;
+    return ast::ImageFormat::kRg11B10Float;
 
   if (match(Token::Type::kFormatRg32Uint))
-    return sem::ImageFormat::kRg32Uint;
+    return ast::ImageFormat::kRg32Uint;
 
   if (match(Token::Type::kFormatRg32Sint))
-    return sem::ImageFormat::kRg32Sint;
+    return ast::ImageFormat::kRg32Sint;
 
   if (match(Token::Type::kFormatRg32Float))
-    return sem::ImageFormat::kRg32Float;
+    return ast::ImageFormat::kRg32Float;
 
   if (match(Token::Type::kFormatRgba16Uint))
-    return sem::ImageFormat::kRgba16Uint;
+    return ast::ImageFormat::kRgba16Uint;
 
   if (match(Token::Type::kFormatRgba16Sint))
-    return sem::ImageFormat::kRgba16Sint;
+    return ast::ImageFormat::kRgba16Sint;
 
   if (match(Token::Type::kFormatRgba16Float))
-    return sem::ImageFormat::kRgba16Float;
+    return ast::ImageFormat::kRgba16Float;
 
   if (match(Token::Type::kFormatRgba32Uint))
-    return sem::ImageFormat::kRgba32Uint;
+    return ast::ImageFormat::kRgba32Uint;
 
   if (match(Token::Type::kFormatRgba32Sint))
-    return sem::ImageFormat::kRgba32Sint;
+    return ast::ImageFormat::kRgba32Sint;
 
   if (match(Token::Type::kFormatRgba32Float))
-    return sem::ImageFormat::kRgba32Float;
+    return ast::ImageFormat::kRgba32Float;
 
   return add_error(peek().source(), "invalid format", use);
 }
diff --git a/src/reader/wgsl/parser_impl.h b/src/reader/wgsl/parser_impl.h
index a7ae443..fe42a76 100644
--- a/src/reader/wgsl/parser_impl.h
+++ b/src/reader/wgsl/parser_impl.h
@@ -403,21 +403,21 @@
   /// Parses a `multisampled_texture_type` grammar element
   /// @returns returns the multisample texture dimension or kNone if none
   /// matched.
-  Maybe<sem::TextureDimension> multisampled_texture_type();
+  Maybe<ast::TextureDimension> multisampled_texture_type();
   /// Parses a `sampled_texture_type` grammar element
   /// @returns returns the sample texture dimension or kNone if none matched.
-  Maybe<sem::TextureDimension> sampled_texture_type();
+  Maybe<ast::TextureDimension> sampled_texture_type();
   /// Parses a `storage_texture_type` grammar element
   /// @returns returns the storage texture dimension.
   /// Returns kNone if none matched.
-  Maybe<sem::TextureDimension> storage_texture_type();
+  Maybe<ast::TextureDimension> storage_texture_type();
   /// Parses a `depth_texture_type` grammar element
   /// @returns the parsed Type or nullptr if none matched.
   Maybe<sem::Type*> depth_texture_type();
   /// Parses a `image_storage_type` grammar element
   /// @param use a description of what was being parsed if an error was raised
   /// @returns returns the image format or kNone if none matched.
-  Expect<sem::ImageFormat> expect_image_storage_type(const std::string& use);
+  Expect<ast::ImageFormat> expect_image_storage_type(const std::string& use);
   /// Parses a `function_type_decl` grammar element
   /// @returns the parsed type or nullptr otherwise
   Maybe<sem::Type*> function_type_decl();
diff --git a/src/reader/wgsl/parser_impl_depth_texture_type_test.cc b/src/reader/wgsl/parser_impl_depth_texture_type_test.cc
index a9300b4..cc06e7a 100644
--- a/src/reader/wgsl/parser_impl_depth_texture_type_test.cc
+++ b/src/reader/wgsl/parser_impl_depth_texture_type_test.cc
@@ -36,7 +36,7 @@
   ASSERT_NE(t.value, nullptr);
   ASSERT_TRUE(t->Is<sem::Texture>());
   ASSERT_TRUE(t->Is<sem::DepthTexture>());
-  EXPECT_EQ(t->As<sem::Texture>()->dim(), sem::TextureDimension::k2d);
+  EXPECT_EQ(t->As<sem::Texture>()->dim(), ast::TextureDimension::k2d);
   EXPECT_FALSE(p->has_error());
 }
 
@@ -48,7 +48,7 @@
   ASSERT_NE(t.value, nullptr);
   ASSERT_TRUE(t->Is<sem::Texture>());
   ASSERT_TRUE(t->Is<sem::DepthTexture>());
-  EXPECT_EQ(t->As<sem::Texture>()->dim(), sem::TextureDimension::k2dArray);
+  EXPECT_EQ(t->As<sem::Texture>()->dim(), ast::TextureDimension::k2dArray);
   EXPECT_FALSE(p->has_error());
 }
 
@@ -60,7 +60,7 @@
   ASSERT_NE(t.value, nullptr);
   ASSERT_TRUE(t->Is<sem::Texture>());
   ASSERT_TRUE(t->Is<sem::DepthTexture>());
-  EXPECT_EQ(t->As<sem::Texture>()->dim(), sem::TextureDimension::kCube);
+  EXPECT_EQ(t->As<sem::Texture>()->dim(), ast::TextureDimension::kCube);
   EXPECT_FALSE(p->has_error());
 }
 
@@ -72,7 +72,7 @@
   ASSERT_NE(t.value, nullptr);
   ASSERT_TRUE(t->Is<sem::Texture>());
   ASSERT_TRUE(t->Is<sem::DepthTexture>());
-  EXPECT_EQ(t->As<sem::Texture>()->dim(), sem::TextureDimension::kCubeArray);
+  EXPECT_EQ(t->As<sem::Texture>()->dim(), ast::TextureDimension::kCubeArray);
   EXPECT_FALSE(p->has_error());
 }
 
diff --git a/src/reader/wgsl/parser_impl_image_storage_type_test.cc b/src/reader/wgsl/parser_impl_image_storage_type_test.cc
index bf34ed1..bafb777 100644
--- a/src/reader/wgsl/parser_impl_image_storage_type_test.cc
+++ b/src/reader/wgsl/parser_impl_image_storage_type_test.cc
@@ -31,7 +31,7 @@
   auto p = parser("r8unorm");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
-  EXPECT_EQ(t.value, sem::ImageFormat::kR8Unorm);
+  EXPECT_EQ(t.value, ast::ImageFormat::kR8Unorm);
   EXPECT_FALSE(p->has_error());
 }
 
@@ -39,7 +39,7 @@
   auto p = parser("r8snorm");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
-  EXPECT_EQ(t.value, sem::ImageFormat::kR8Snorm);
+  EXPECT_EQ(t.value, ast::ImageFormat::kR8Snorm);
   EXPECT_FALSE(p->has_error());
 }
 
@@ -47,7 +47,7 @@
   auto p = parser("r8uint");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
-  EXPECT_EQ(t.value, sem::ImageFormat::kR8Uint);
+  EXPECT_EQ(t.value, ast::ImageFormat::kR8Uint);
   EXPECT_FALSE(p->has_error());
 }
 
@@ -55,7 +55,7 @@
   auto p = parser("r8sint");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
-  EXPECT_EQ(t.value, sem::ImageFormat::kR8Sint);
+  EXPECT_EQ(t.value, ast::ImageFormat::kR8Sint);
   EXPECT_FALSE(p->has_error());
 }
 
@@ -63,7 +63,7 @@
   auto p = parser("r16uint");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
-  EXPECT_EQ(t.value, sem::ImageFormat::kR16Uint);
+  EXPECT_EQ(t.value, ast::ImageFormat::kR16Uint);
   EXPECT_FALSE(p->has_error());
 }
 
@@ -71,7 +71,7 @@
   auto p = parser("r16sint");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
-  EXPECT_EQ(t.value, sem::ImageFormat::kR16Sint);
+  EXPECT_EQ(t.value, ast::ImageFormat::kR16Sint);
   EXPECT_FALSE(p->has_error());
 }
 
@@ -79,7 +79,7 @@
   auto p = parser("r16float");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
-  EXPECT_EQ(t.value, sem::ImageFormat::kR16Float);
+  EXPECT_EQ(t.value, ast::ImageFormat::kR16Float);
   EXPECT_FALSE(p->has_error());
 }
 
@@ -87,7 +87,7 @@
   auto p = parser("rg8unorm");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
-  EXPECT_EQ(t.value, sem::ImageFormat::kRg8Unorm);
+  EXPECT_EQ(t.value, ast::ImageFormat::kRg8Unorm);
   EXPECT_FALSE(p->has_error());
 }
 
@@ -95,7 +95,7 @@
   auto p = parser("rg8snorm");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
-  EXPECT_EQ(t.value, sem::ImageFormat::kRg8Snorm);
+  EXPECT_EQ(t.value, ast::ImageFormat::kRg8Snorm);
   EXPECT_FALSE(p->has_error());
 }
 
@@ -103,7 +103,7 @@
   auto p = parser("rg8uint");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
-  EXPECT_EQ(t.value, sem::ImageFormat::kRg8Uint);
+  EXPECT_EQ(t.value, ast::ImageFormat::kRg8Uint);
   EXPECT_FALSE(p->has_error());
 }
 
@@ -111,7 +111,7 @@
   auto p = parser("rg8sint");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
-  EXPECT_EQ(t.value, sem::ImageFormat::kRg8Sint);
+  EXPECT_EQ(t.value, ast::ImageFormat::kRg8Sint);
   EXPECT_FALSE(p->has_error());
 }
 
@@ -119,7 +119,7 @@
   auto p = parser("r32uint");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
-  EXPECT_EQ(t.value, sem::ImageFormat::kR32Uint);
+  EXPECT_EQ(t.value, ast::ImageFormat::kR32Uint);
   EXPECT_FALSE(p->has_error());
 }
 
@@ -127,7 +127,7 @@
   auto p = parser("r32sint");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
-  EXPECT_EQ(t.value, sem::ImageFormat::kR32Sint);
+  EXPECT_EQ(t.value, ast::ImageFormat::kR32Sint);
   EXPECT_FALSE(p->has_error());
 }
 
@@ -135,7 +135,7 @@
   auto p = parser("r32float");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
-  EXPECT_EQ(t.value, sem::ImageFormat::kR32Float);
+  EXPECT_EQ(t.value, ast::ImageFormat::kR32Float);
   EXPECT_FALSE(p->has_error());
 }
 
@@ -143,7 +143,7 @@
   auto p = parser("rg16uint");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
-  EXPECT_EQ(t.value, sem::ImageFormat::kRg16Uint);
+  EXPECT_EQ(t.value, ast::ImageFormat::kRg16Uint);
   EXPECT_FALSE(p->has_error());
 }
 
@@ -151,7 +151,7 @@
   auto p = parser("rg16sint");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
-  EXPECT_EQ(t.value, sem::ImageFormat::kRg16Sint);
+  EXPECT_EQ(t.value, ast::ImageFormat::kRg16Sint);
   EXPECT_FALSE(p->has_error());
 }
 
@@ -159,7 +159,7 @@
   auto p = parser("rg16float");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
-  EXPECT_EQ(t.value, sem::ImageFormat::kRg16Float);
+  EXPECT_EQ(t.value, ast::ImageFormat::kRg16Float);
   EXPECT_FALSE(p->has_error());
 }
 
@@ -167,7 +167,7 @@
   auto p = parser("rgba8unorm");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
-  EXPECT_EQ(t.value, sem::ImageFormat::kRgba8Unorm);
+  EXPECT_EQ(t.value, ast::ImageFormat::kRgba8Unorm);
   EXPECT_FALSE(p->has_error());
 }
 
@@ -175,7 +175,7 @@
   auto p = parser("rgba8unorm_srgb");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
-  EXPECT_EQ(t.value, sem::ImageFormat::kRgba8UnormSrgb);
+  EXPECT_EQ(t.value, ast::ImageFormat::kRgba8UnormSrgb);
   EXPECT_FALSE(p->has_error());
 }
 
@@ -183,7 +183,7 @@
   auto p = parser("rgba8snorm");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
-  EXPECT_EQ(t.value, sem::ImageFormat::kRgba8Snorm);
+  EXPECT_EQ(t.value, ast::ImageFormat::kRgba8Snorm);
   EXPECT_FALSE(p->has_error());
 }
 
@@ -191,7 +191,7 @@
   auto p = parser("rgba8uint");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
-  EXPECT_EQ(t.value, sem::ImageFormat::kRgba8Uint);
+  EXPECT_EQ(t.value, ast::ImageFormat::kRgba8Uint);
   EXPECT_FALSE(p->has_error());
 }
 
@@ -199,7 +199,7 @@
   auto p = parser("rgba8sint");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
-  EXPECT_EQ(t.value, sem::ImageFormat::kRgba8Sint);
+  EXPECT_EQ(t.value, ast::ImageFormat::kRgba8Sint);
   EXPECT_FALSE(p->has_error());
 }
 
@@ -207,7 +207,7 @@
   auto p = parser("bgra8unorm");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
-  EXPECT_EQ(t.value, sem::ImageFormat::kBgra8Unorm);
+  EXPECT_EQ(t.value, ast::ImageFormat::kBgra8Unorm);
   EXPECT_FALSE(p->has_error());
 }
 
@@ -215,7 +215,7 @@
   auto p = parser("bgra8unorm_srgb");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
-  EXPECT_EQ(t.value, sem::ImageFormat::kBgra8UnormSrgb);
+  EXPECT_EQ(t.value, ast::ImageFormat::kBgra8UnormSrgb);
   EXPECT_FALSE(p->has_error());
 }
 
@@ -223,7 +223,7 @@
   auto p = parser("rgb10a2unorm");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
-  EXPECT_EQ(t.value, sem::ImageFormat::kRgb10A2Unorm);
+  EXPECT_EQ(t.value, ast::ImageFormat::kRgb10A2Unorm);
   EXPECT_FALSE(p->has_error());
 }
 
@@ -231,7 +231,7 @@
   auto p = parser("rg11b10float");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
-  EXPECT_EQ(t.value, sem::ImageFormat::kRg11B10Float);
+  EXPECT_EQ(t.value, ast::ImageFormat::kRg11B10Float);
   EXPECT_FALSE(p->has_error());
 }
 
@@ -239,7 +239,7 @@
   auto p = parser("rg32uint");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
-  EXPECT_EQ(t.value, sem::ImageFormat::kRg32Uint);
+  EXPECT_EQ(t.value, ast::ImageFormat::kRg32Uint);
   EXPECT_FALSE(p->has_error());
 }
 
@@ -247,7 +247,7 @@
   auto p = parser("rg32sint");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
-  EXPECT_EQ(t.value, sem::ImageFormat::kRg32Sint);
+  EXPECT_EQ(t.value, ast::ImageFormat::kRg32Sint);
   EXPECT_FALSE(p->has_error());
 }
 
@@ -255,7 +255,7 @@
   auto p = parser("rg32float");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
-  EXPECT_EQ(t.value, sem::ImageFormat::kRg32Float);
+  EXPECT_EQ(t.value, ast::ImageFormat::kRg32Float);
   EXPECT_FALSE(p->has_error());
 }
 
@@ -263,7 +263,7 @@
   auto p = parser("rgba16uint");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
-  EXPECT_EQ(t.value, sem::ImageFormat::kRgba16Uint);
+  EXPECT_EQ(t.value, ast::ImageFormat::kRgba16Uint);
   EXPECT_FALSE(p->has_error());
 }
 
@@ -271,7 +271,7 @@
   auto p = parser("rgba16sint");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
-  EXPECT_EQ(t.value, sem::ImageFormat::kRgba16Sint);
+  EXPECT_EQ(t.value, ast::ImageFormat::kRgba16Sint);
   EXPECT_FALSE(p->has_error());
 }
 
@@ -279,7 +279,7 @@
   auto p = parser("rgba16float");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
-  EXPECT_EQ(t.value, sem::ImageFormat::kRgba16Float);
+  EXPECT_EQ(t.value, ast::ImageFormat::kRgba16Float);
   EXPECT_FALSE(p->has_error());
 }
 
@@ -287,7 +287,7 @@
   auto p = parser("rgba32uint");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
-  EXPECT_EQ(t.value, sem::ImageFormat::kRgba32Uint);
+  EXPECT_EQ(t.value, ast::ImageFormat::kRgba32Uint);
   EXPECT_FALSE(p->has_error());
 }
 
@@ -295,7 +295,7 @@
   auto p = parser("rgba32sint");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
-  EXPECT_EQ(t.value, sem::ImageFormat::kRgba32Sint);
+  EXPECT_EQ(t.value, ast::ImageFormat::kRgba32Sint);
   EXPECT_FALSE(p->has_error());
 }
 
@@ -303,7 +303,7 @@
   auto p = parser("rgba32float");
   auto t = p->expect_image_storage_type("test");
   EXPECT_FALSE(t.errored);
-  EXPECT_EQ(t.value, sem::ImageFormat::kRgba32Float);
+  EXPECT_EQ(t.value, ast::ImageFormat::kRgba32Float);
   EXPECT_FALSE(p->has_error());
 }
 
diff --git a/src/reader/wgsl/parser_impl_sampled_texture_type_test.cc b/src/reader/wgsl/parser_impl_sampled_texture_type_test.cc
index 82550a7..884c083 100644
--- a/src/reader/wgsl/parser_impl_sampled_texture_type_test.cc
+++ b/src/reader/wgsl/parser_impl_sampled_texture_type_test.cc
@@ -32,7 +32,7 @@
   auto t = p->sampled_texture_type();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
-  EXPECT_EQ(t.value, sem::TextureDimension::k1d);
+  EXPECT_EQ(t.value, ast::TextureDimension::k1d);
   EXPECT_FALSE(p->has_error());
 }
 
@@ -41,7 +41,7 @@
   auto t = p->sampled_texture_type();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
-  EXPECT_EQ(t.value, sem::TextureDimension::k2d);
+  EXPECT_EQ(t.value, ast::TextureDimension::k2d);
   EXPECT_FALSE(p->has_error());
 }
 
@@ -50,7 +50,7 @@
   auto t = p->sampled_texture_type();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
-  EXPECT_EQ(t.value, sem::TextureDimension::k2dArray);
+  EXPECT_EQ(t.value, ast::TextureDimension::k2dArray);
   EXPECT_FALSE(p->has_error());
 }
 
@@ -59,7 +59,7 @@
   auto t = p->sampled_texture_type();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
-  EXPECT_EQ(t.value, sem::TextureDimension::k3d);
+  EXPECT_EQ(t.value, ast::TextureDimension::k3d);
   EXPECT_FALSE(p->has_error());
 }
 
@@ -68,7 +68,7 @@
   auto t = p->sampled_texture_type();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
-  EXPECT_EQ(t.value, sem::TextureDimension::kCube);
+  EXPECT_EQ(t.value, ast::TextureDimension::kCube);
   EXPECT_FALSE(p->has_error());
 }
 
@@ -77,7 +77,7 @@
   auto t = p->sampled_texture_type();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
-  EXPECT_EQ(t.value, sem::TextureDimension::kCubeArray);
+  EXPECT_EQ(t.value, ast::TextureDimension::kCubeArray);
   EXPECT_FALSE(p->has_error());
 }
 
diff --git a/src/reader/wgsl/parser_impl_storage_texture_type_test.cc b/src/reader/wgsl/parser_impl_storage_texture_type_test.cc
index cd27e99..622a8df 100644
--- a/src/reader/wgsl/parser_impl_storage_texture_type_test.cc
+++ b/src/reader/wgsl/parser_impl_storage_texture_type_test.cc
@@ -32,7 +32,7 @@
   auto t = p->storage_texture_type();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
-  EXPECT_EQ(t.value, sem::TextureDimension::k1d);
+  EXPECT_EQ(t.value, ast::TextureDimension::k1d);
   EXPECT_FALSE(p->has_error());
 }
 
@@ -41,7 +41,7 @@
   auto t = p->storage_texture_type();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
-  EXPECT_EQ(t.value, sem::TextureDimension::k2d);
+  EXPECT_EQ(t.value, ast::TextureDimension::k2d);
   EXPECT_FALSE(p->has_error());
 }
 
@@ -50,7 +50,7 @@
   auto t = p->storage_texture_type();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
-  EXPECT_EQ(t.value, sem::TextureDimension::k2dArray);
+  EXPECT_EQ(t.value, ast::TextureDimension::k2dArray);
   EXPECT_FALSE(p->has_error());
 }
 
@@ -59,7 +59,7 @@
   auto t = p->storage_texture_type();
   EXPECT_TRUE(t.matched);
   EXPECT_FALSE(t.errored);
-  EXPECT_EQ(t.value, sem::TextureDimension::k3d);
+  EXPECT_EQ(t.value, ast::TextureDimension::k3d);
   EXPECT_FALSE(p->has_error());
 }
 
diff --git a/src/reader/wgsl/parser_impl_texture_sampler_types_test.cc b/src/reader/wgsl/parser_impl_texture_sampler_types_test.cc
index 125dcce..8b5118e 100644
--- a/src/reader/wgsl/parser_impl_texture_sampler_types_test.cc
+++ b/src/reader/wgsl/parser_impl_texture_sampler_types_test.cc
@@ -62,7 +62,7 @@
   ASSERT_NE(t.value, nullptr);
   ASSERT_TRUE(t->Is<sem::Texture>());
   ASSERT_TRUE(t->Is<sem::DepthTexture>());
-  EXPECT_EQ(t->As<sem::Texture>()->dim(), sem::TextureDimension::k2d);
+  EXPECT_EQ(t->As<sem::Texture>()->dim(), ast::TextureDimension::k2d);
 }
 
 TEST_F(ParserImplTest, TextureSamplerTypes_SampledTexture_F32) {
@@ -75,7 +75,7 @@
   ASSERT_TRUE(t->Is<sem::Texture>());
   ASSERT_TRUE(t->Is<sem::SampledTexture>());
   ASSERT_TRUE(t->As<sem::SampledTexture>()->type()->Is<sem::F32>());
-  EXPECT_EQ(t->As<sem::Texture>()->dim(), sem::TextureDimension::k1d);
+  EXPECT_EQ(t->As<sem::Texture>()->dim(), ast::TextureDimension::k1d);
 }
 
 TEST_F(ParserImplTest, TextureSamplerTypes_SampledTexture_I32) {
@@ -88,7 +88,7 @@
   ASSERT_TRUE(t->Is<sem::Texture>());
   ASSERT_TRUE(t->Is<sem::SampledTexture>());
   ASSERT_TRUE(t->As<sem::SampledTexture>()->type()->Is<sem::I32>());
-  EXPECT_EQ(t->As<sem::Texture>()->dim(), sem::TextureDimension::k2d);
+  EXPECT_EQ(t->As<sem::Texture>()->dim(), ast::TextureDimension::k2d);
 }
 
 TEST_F(ParserImplTest, TextureSamplerTypes_SampledTexture_U32) {
@@ -101,7 +101,7 @@
   ASSERT_TRUE(t->Is<sem::Texture>());
   ASSERT_TRUE(t->Is<sem::SampledTexture>());
   ASSERT_TRUE(t->As<sem::SampledTexture>()->type()->Is<sem::U32>());
-  EXPECT_EQ(t->As<sem::Texture>()->dim(), sem::TextureDimension::k3d);
+  EXPECT_EQ(t->As<sem::Texture>()->dim(), ast::TextureDimension::k3d);
 }
 
 TEST_F(ParserImplTest, TextureSamplerTypes_SampledTexture_Invalid) {
@@ -154,7 +154,7 @@
   ASSERT_TRUE(t->Is<sem::Texture>());
   ASSERT_TRUE(t->Is<sem::MultisampledTexture>());
   ASSERT_TRUE(t->As<sem::MultisampledTexture>()->type()->Is<sem::I32>());
-  EXPECT_EQ(t->As<sem::Texture>()->dim(), sem::TextureDimension::k2d);
+  EXPECT_EQ(t->As<sem::Texture>()->dim(), ast::TextureDimension::k2d);
 }
 
 TEST_F(ParserImplTest, TextureSamplerTypes_MultisampledTexture_Invalid) {
@@ -208,8 +208,8 @@
   ASSERT_TRUE(t->Is<sem::Texture>());
   ASSERT_TRUE(t->Is<sem::StorageTexture>());
   EXPECT_EQ(t->As<sem::StorageTexture>()->image_format(),
-            sem::ImageFormat::kR8Unorm);
-  EXPECT_EQ(t->As<sem::Texture>()->dim(), sem::TextureDimension::k1d);
+            ast::ImageFormat::kR8Unorm);
+  EXPECT_EQ(t->As<sem::Texture>()->dim(), ast::TextureDimension::k1d);
 }
 
 TEST_F(ParserImplTest, TextureSamplerTypes_StorageTexture_Writeonly2dR16Float) {
@@ -223,8 +223,8 @@
   ASSERT_TRUE(t->Is<sem::Texture>());
   ASSERT_TRUE(t->Is<sem::StorageTexture>());
   EXPECT_EQ(t->As<sem::StorageTexture>()->image_format(),
-            sem::ImageFormat::kR16Float);
-  EXPECT_EQ(t->As<sem::Texture>()->dim(), sem::TextureDimension::k2d);
+            ast::ImageFormat::kR16Float);
+  EXPECT_EQ(t->As<sem::Texture>()->dim(), ast::TextureDimension::k2d);
 }
 
 TEST_F(ParserImplTest, TextureSamplerTypes_StorageTexture_InvalidType) {
diff --git a/src/reader/wgsl/parser_impl_type_decl_test.cc b/src/reader/wgsl/parser_impl_type_decl_test.cc
index 4357774..080b76e 100644
--- a/src/reader/wgsl/parser_impl_type_decl_test.cc
+++ b/src/reader/wgsl/parser_impl_type_decl_test.cc
@@ -746,7 +746,7 @@
   auto p = parser("sampler");
 
   auto& builder = p->builder();
-  auto* type = builder.create<sem::Sampler>(sem::SamplerKind::kSampler);
+  auto* type = builder.create<sem::Sampler>(ast::SamplerKind::kSampler);
 
   auto t = p->type_decl();
   EXPECT_TRUE(t.matched);
@@ -761,7 +761,7 @@
   auto p = parser("texture_cube<f32>");
 
   auto& builder = p->builder();
-  auto* type = builder.create<sem::SampledTexture>(sem::TextureDimension::kCube,
+  auto* type = builder.create<sem::SampledTexture>(ast::TextureDimension::kCube,
                                                    ty.f32());
 
   auto t = p->type_decl();
diff --git a/src/resolver/assignment_validation_test.cc b/src/resolver/assignment_validation_test.cc
index 2dbbd67..19aa5bf 100644
--- a/src/resolver/assignment_validation_test.cc
+++ b/src/resolver/assignment_validation_test.cc
@@ -256,8 +256,8 @@
   // a = b;
 
   auto* tex_type = create<sem::StorageTexture>(
-      sem::TextureDimension::k1d, sem::ImageFormat::kRgba8Unorm,
-      sem::StorageTexture::SubtypeFor(sem::ImageFormat::kRgba8Unorm, Types()));
+      ast::TextureDimension::k1d, ast::ImageFormat::kRgba8Unorm,
+      sem::StorageTexture::SubtypeFor(ast::ImageFormat::kRgba8Unorm, Types()));
   auto* tex_ac =
       create<sem::AccessControl>(ast::AccessControl::kReadOnly, tex_type);
 
diff --git a/src/resolver/intrinsic_test.cc b/src/resolver/intrinsic_test.cc
index 434305f..3b21484 100644
--- a/src/resolver/intrinsic_test.cc
+++ b/src/resolver/intrinsic_test.cc
@@ -206,9 +206,9 @@
 }
 
 struct TextureTestParams {
-  sem::TextureDimension dim;
+  ast::TextureDimension dim;
   Texture type = Texture::kF32;
-  sem::ImageFormat format = sem::ImageFormat::kR16Float;
+  ast::ImageFormat format = ast::ImageFormat::kR16Float;
 };
 inline std::ostream& operator<<(std::ostream& out, TextureTestParams data) {
   out << data.dim << "_" << data.type;
@@ -223,16 +223,16 @@
   /// @param dim dimensionality of the texture being sampled
   /// @param scalar the scalar type
   /// @returns a pointer to a type appropriate for the coord param
-  sem::Type* GetCoordsType(sem::TextureDimension dim, sem::Type* scalar) {
+  sem::Type* GetCoordsType(ast::TextureDimension dim, sem::Type* scalar) {
     switch (dim) {
-      case sem::TextureDimension::k1d:
+      case ast::TextureDimension::k1d:
         return scalar;
-      case sem::TextureDimension::k2d:
-      case sem::TextureDimension::k2dArray:
+      case ast::TextureDimension::k2d:
+      case ast::TextureDimension::k2dArray:
         return create<sem::Vector>(scalar, 2);
-      case sem::TextureDimension::k3d:
-      case sem::TextureDimension::kCube:
-      case sem::TextureDimension::kCubeArray:
+      case ast::TextureDimension::k3d:
+      case ast::TextureDimension::kCube:
+      case ast::TextureDimension::kCubeArray:
         return create<sem::Vector>(scalar, 3);
       default:
         [=]() { FAIL() << "Unsupported texture dimension: " << dim; }();
@@ -276,7 +276,7 @@
   add_call_param("texture", ro_texture_type, &call_params);
   add_call_param("coords", coords_type, &call_params);
 
-  if (sem::IsTextureArray(dim)) {
+  if (ast::IsTextureArray(dim)) {
     add_call_param("array_index", ty.i32(), &call_params);
   }
 
@@ -301,30 +301,30 @@
     ResolverTest,
     ResolverIntrinsicTest_StorageTextureOperation,
     testing::Values(
-        TextureTestParams{sem::TextureDimension::k1d, Texture::kF32,
-                          sem::ImageFormat::kR32Float},
-        TextureTestParams{sem::TextureDimension::k1d, Texture::kI32,
-                          sem::ImageFormat::kR32Sint},
-        TextureTestParams{sem::TextureDimension::k1d, Texture::kF32,
-                          sem::ImageFormat::kRgba8Unorm},
-        TextureTestParams{sem::TextureDimension::k2d, Texture::kF32,
-                          sem::ImageFormat::kR32Float},
-        TextureTestParams{sem::TextureDimension::k2d, Texture::kI32,
-                          sem::ImageFormat::kR32Sint},
-        TextureTestParams{sem::TextureDimension::k2d, Texture::kF32,
-                          sem::ImageFormat::kRgba8Unorm},
-        TextureTestParams{sem::TextureDimension::k2dArray, Texture::kF32,
-                          sem::ImageFormat::kR32Float},
-        TextureTestParams{sem::TextureDimension::k2dArray, Texture::kI32,
-                          sem::ImageFormat::kR32Sint},
-        TextureTestParams{sem::TextureDimension::k2dArray, Texture::kF32,
-                          sem::ImageFormat::kRgba8Unorm},
-        TextureTestParams{sem::TextureDimension::k3d, Texture::kF32,
-                          sem::ImageFormat::kR32Float},
-        TextureTestParams{sem::TextureDimension::k3d, Texture::kI32,
-                          sem::ImageFormat::kR32Sint},
-        TextureTestParams{sem::TextureDimension::k3d, Texture::kF32,
-                          sem::ImageFormat::kRgba8Unorm}));
+        TextureTestParams{ast::TextureDimension::k1d, Texture::kF32,
+                          ast::ImageFormat::kR32Float},
+        TextureTestParams{ast::TextureDimension::k1d, Texture::kI32,
+                          ast::ImageFormat::kR32Sint},
+        TextureTestParams{ast::TextureDimension::k1d, Texture::kF32,
+                          ast::ImageFormat::kRgba8Unorm},
+        TextureTestParams{ast::TextureDimension::k2d, Texture::kF32,
+                          ast::ImageFormat::kR32Float},
+        TextureTestParams{ast::TextureDimension::k2d, Texture::kI32,
+                          ast::ImageFormat::kR32Sint},
+        TextureTestParams{ast::TextureDimension::k2d, Texture::kF32,
+                          ast::ImageFormat::kRgba8Unorm},
+        TextureTestParams{ast::TextureDimension::k2dArray, Texture::kF32,
+                          ast::ImageFormat::kR32Float},
+        TextureTestParams{ast::TextureDimension::k2dArray, Texture::kI32,
+                          ast::ImageFormat::kR32Sint},
+        TextureTestParams{ast::TextureDimension::k2dArray, Texture::kF32,
+                          ast::ImageFormat::kRgba8Unorm},
+        TextureTestParams{ast::TextureDimension::k3d, Texture::kF32,
+                          ast::ImageFormat::kR32Float},
+        TextureTestParams{ast::TextureDimension::k3d, Texture::kI32,
+                          ast::ImageFormat::kR32Sint},
+        TextureTestParams{ast::TextureDimension::k3d, Texture::kF32,
+                          ast::ImageFormat::kRgba8Unorm}));
 
 using ResolverIntrinsicTest_SampledTextureOperation =
     ResolverIntrinsicTest_TextureOperation;
@@ -340,7 +340,7 @@
 
   add_call_param("texture", texture_type, &call_params);
   add_call_param("coords", coords_type, &call_params);
-  if (dim == sem::TextureDimension::k2dArray) {
+  if (dim == ast::TextureDimension::k2dArray) {
     add_call_param("array_index", ty.i32(), &call_params);
   }
   add_call_param("level", ty.i32(), &call_params);
@@ -365,10 +365,10 @@
 INSTANTIATE_TEST_SUITE_P(
     ResolverTest,
     ResolverIntrinsicTest_SampledTextureOperation,
-    testing::Values(TextureTestParams{sem::TextureDimension::k1d},
-                    TextureTestParams{sem::TextureDimension::k2d},
-                    TextureTestParams{sem::TextureDimension::k2dArray},
-                    TextureTestParams{sem::TextureDimension::k3d}));
+    testing::Values(TextureTestParams{ast::TextureDimension::k1d},
+                    TextureTestParams{ast::TextureDimension::k2d},
+                    TextureTestParams{ast::TextureDimension::k2dArray},
+                    TextureTestParams{ast::TextureDimension::k3d}));
 
 TEST_F(ResolverIntrinsicTest, Dot_Vec2) {
   Global("my_var", ty.vec2<f32>(), ast::StorageClass::kInput);
@@ -1924,16 +1924,16 @@
     switch (param.texture_dimension) {
       default:
         FAIL() << "invalid texture dimensions: " << param.texture_dimension;
-      case sem::TextureDimension::k1d:
+      case ast::TextureDimension::k1d:
         EXPECT_EQ(TypeOf(call)->type_name(), ty.i32()->type_name());
         break;
-      case sem::TextureDimension::k2d:
-      case sem::TextureDimension::k2dArray:
+      case ast::TextureDimension::k2d:
+      case ast::TextureDimension::k2dArray:
         EXPECT_EQ(TypeOf(call)->type_name(), ty.vec2<i32>()->type_name());
         break;
-      case sem::TextureDimension::k3d:
-      case sem::TextureDimension::kCube:
-      case sem::TextureDimension::kCubeArray:
+      case ast::TextureDimension::k3d:
+      case ast::TextureDimension::kCube:
+      case ast::TextureDimension::kCubeArray:
         EXPECT_EQ(TypeOf(call)->type_name(), ty.vec3<i32>()->type_name());
         break;
     }
diff --git a/src/resolver/resolver.cc b/src/resolver/resolver.cc
index 697c706..4038df9 100644
--- a/src/resolver/resolver.cc
+++ b/src/resolver/resolver.cc
@@ -18,29 +18,42 @@
 #include <utility>
 
 #include "src/ast/access_decoration.h"
+#include "src/ast/alias.h"
+#include "src/ast/array.h"
 #include "src/ast/assignment_statement.h"
 #include "src/ast/bitcast_expression.h"
 #include "src/ast/break_statement.h"
 #include "src/ast/call_statement.h"
 #include "src/ast/constant_id_decoration.h"
 #include "src/ast/continue_statement.h"
+#include "src/ast/depth_texture.h"
 #include "src/ast/discard_statement.h"
 #include "src/ast/fallthrough_statement.h"
 #include "src/ast/if_statement.h"
 #include "src/ast/internal_decoration.h"
 #include "src/ast/loop_statement.h"
+#include "src/ast/matrix.h"
+#include "src/ast/pointer.h"
 #include "src/ast/return_statement.h"
+#include "src/ast/sampled_texture.h"
+#include "src/ast/sampler.h"
+#include "src/ast/storage_texture.h"
 #include "src/ast/struct_block_decoration.h"
 #include "src/ast/switch_statement.h"
 #include "src/ast/unary_op_expression.h"
 #include "src/ast/variable_decl_statement.h"
+#include "src/ast/vector.h"
 #include "src/ast/workgroup_decoration.h"
 #include "src/sem/access_control_type.h"
 #include "src/sem/array.h"
 #include "src/sem/call.h"
+#include "src/sem/depth_texture_type.h"
 #include "src/sem/function.h"
 #include "src/sem/member_accessor_expression.h"
 #include "src/sem/multisampled_texture_type.h"
+#include "src/sem/pointer_type.h"
+#include "src/sem/sampled_texture_type.h"
+#include "src/sem/sampler_type.h"
 #include "src/sem/statement.h"
 #include "src/sem/storage_texture_type.h"
 #include "src/sem/struct.h"
@@ -78,36 +91,36 @@
                 start.file_path, start.file_content);
 }
 
-bool IsValidStorageTextureDimension(sem::TextureDimension dim) {
+bool IsValidStorageTextureDimension(ast::TextureDimension dim) {
   switch (dim) {
-    case sem::TextureDimension::k1d:
-    case sem::TextureDimension::k2d:
-    case sem::TextureDimension::k2dArray:
-    case sem::TextureDimension::k3d:
+    case ast::TextureDimension::k1d:
+    case ast::TextureDimension::k2d:
+    case ast::TextureDimension::k2dArray:
+    case ast::TextureDimension::k3d:
       return true;
     default:
       return false;
   }
 }
 
-bool IsValidStorageTextureImageFormat(sem::ImageFormat format) {
+bool IsValidStorageTextureImageFormat(ast::ImageFormat format) {
   switch (format) {
-    case sem::ImageFormat::kR32Uint:
-    case sem::ImageFormat::kR32Sint:
-    case sem::ImageFormat::kR32Float:
-    case sem::ImageFormat::kRg32Uint:
-    case sem::ImageFormat::kRg32Sint:
-    case sem::ImageFormat::kRg32Float:
-    case sem::ImageFormat::kRgba8Unorm:
-    case sem::ImageFormat::kRgba8Snorm:
-    case sem::ImageFormat::kRgba8Uint:
-    case sem::ImageFormat::kRgba8Sint:
-    case sem::ImageFormat::kRgba16Uint:
-    case sem::ImageFormat::kRgba16Sint:
-    case sem::ImageFormat::kRgba16Float:
-    case sem::ImageFormat::kRgba32Uint:
-    case sem::ImageFormat::kRgba32Sint:
-    case sem::ImageFormat::kRgba32Float:
+    case ast::ImageFormat::kR32Uint:
+    case ast::ImageFormat::kR32Sint:
+    case ast::ImageFormat::kR32Float:
+    case ast::ImageFormat::kRg32Uint:
+    case ast::ImageFormat::kRg32Sint:
+    case ast::ImageFormat::kRg32Float:
+    case ast::ImageFormat::kRgba8Unorm:
+    case ast::ImageFormat::kRgba8Snorm:
+    case ast::ImageFormat::kRgba8Uint:
+    case ast::ImageFormat::kRgba8Sint:
+    case ast::ImageFormat::kRgba16Uint:
+    case ast::ImageFormat::kRgba16Sint:
+    case ast::ImageFormat::kRgba16Float:
+    case ast::ImageFormat::kRgba32Uint:
+    case ast::ImageFormat::kRgba32Sint:
+    case ast::ImageFormat::kRgba32Float:
       return true;
     default:
       return false;
@@ -266,6 +279,61 @@
   return true;
 }
 
+sem::Type* Resolver::Type(ast::Type* ty) {
+  Mark(ty);
+  sem::Type* s = nullptr;
+  if (ty->Is<ast::Void>()) {
+    s = builder_->create<sem::Void>();
+  } else if (ty->Is<ast::Bool>()) {
+    s = builder_->create<sem::Bool>();
+  } else if (ty->Is<ast::I32>()) {
+    s = builder_->create<sem::I32>();
+  } else if (ty->Is<ast::U32>()) {
+    s = builder_->create<sem::U32>();
+  } else if (ty->Is<ast::F32>()) {
+    s = builder_->create<sem::F32>();
+  } else if (auto* alias = ty->As<ast::Alias>()) {
+    auto* el = Type(alias->type());
+    s = builder_->create<sem::Alias>(alias->symbol(), el);
+  } else if (auto* access = ty->As<ast::AccessControl>()) {
+    auto* el = Type(access->type());
+    s = builder_->create<sem::AccessControl>(access->access_control(), el);
+  } else if (auto* vec = ty->As<ast::Vector>()) {
+    auto* el = Type(vec->type());
+    s = builder_->create<sem::Vector>(el, vec->size());
+  } else if (auto* mat = ty->As<ast::Matrix>()) {
+    auto* el = Type(mat->type());
+    s = builder_->create<sem::Matrix>(el, mat->rows(), mat->columns());
+  } else if (auto* arr = ty->As<ast::Array>()) {
+    auto* el = Type(arr->type());
+    s = builder_->create<sem::ArrayType>(el, arr->size(), arr->decorations());
+  } else if (auto* ptr = ty->As<ast::Pointer>()) {
+    auto* el = Type(ptr->type());
+    s = builder_->create<sem::Pointer>(el, ptr->storage_class());
+  } else if (auto* str = ty->As<ast::Struct>()) {
+    s = builder_->create<sem::StructType>(str);
+  } else if (auto* sampler = ty->As<ast::Sampler>()) {
+    s = builder_->create<sem::Sampler>(sampler->kind());
+  } else if (auto* sampled_tex = ty->As<ast::SampledTexture>()) {
+    auto* el = Type(sampled_tex->type());
+    s = builder_->create<sem::SampledTexture>(sampled_tex->dim(), el);
+  } else if (auto* depth_tex = ty->As<ast::DepthTexture>()) {
+    s = builder_->create<sem::DepthTexture>(depth_tex->dim());
+  } else if (auto* storage_tex = ty->As<ast::StorageTexture>()) {
+    auto* el = Type(storage_tex->type());
+    s = builder_->create<sem::StorageTexture>(storage_tex->dim(),
+                                              storage_tex->image_format(), el);
+  }
+  if (s == nullptr) {
+    return nullptr;
+  }
+  if (!Type(s)) {
+    return nullptr;
+  }
+  return s;
+}
+
+// TODO(crbug.com/tint/724): This method should be replaced by Type(ast::Type*)
 bool Resolver::Type(sem::Type* ty) {
   ty = ty->UnwrapAliasIfNeeded();
   if (auto* str = ty->As<sem::StructType>()) {
@@ -413,7 +481,7 @@
   }
 
   if (auto* r = type->UnwrapAll()->As<sem::MultisampledTexture>()) {
-    if (r->dim() != sem::TextureDimension::k2d) {
+    if (r->dim() != ast::TextureDimension::k2d) {
       diagnostics_.add_error("Only 2d multisampled textures are supported",
                              var->source());
       return false;
diff --git a/src/resolver/resolver.h b/src/resolver/resolver.h
index 23f8d6e..c352f42 100644
--- a/src/resolver/resolver.h
+++ b/src/resolver/resolver.h
@@ -251,6 +251,12 @@
   bool ValidateVectorConstructor(const sem::Vector* vec_type,
                                  const ast::ExpressionList& values);
 
+  /// @returns the sem::Type for the ast::Type `ty`, building it if it
+  /// hasn't been constructed already. If an error is raised, nullptr is
+  /// returned.
+  /// @param ty the ast::Type
+  sem::Type* Type(ast::Type* ty);
+
   /// @returns the semantic information for the array `arr`, building it if it
   /// hasn't been constructed already. If an error is raised, nullptr is
   /// returned.
diff --git a/src/resolver/type_validation_test.cc b/src/resolver/type_validation_test.cc
index faedfbe..b80bfb5 100644
--- a/src/resolver/type_validation_test.cc
+++ b/src/resolver/type_validation_test.cc
@@ -536,17 +536,17 @@
 
 namespace MultisampledTextureTests {
 struct DimensionParams {
-  sem::TextureDimension dim;
+  ast::TextureDimension dim;
   bool is_valid;
 };
 
 static constexpr DimensionParams dimension_cases[] = {
-    DimensionParams{sem::TextureDimension::k1d, false},
-    DimensionParams{sem::TextureDimension::k2d, true},
-    DimensionParams{sem::TextureDimension::k2dArray, false},
-    DimensionParams{sem::TextureDimension::k3d, false},
-    DimensionParams{sem::TextureDimension::kCube, false},
-    DimensionParams{sem::TextureDimension::kCubeArray, false}};
+    DimensionParams{ast::TextureDimension::k1d, false},
+    DimensionParams{ast::TextureDimension::k2d, true},
+    DimensionParams{ast::TextureDimension::k2dArray, false},
+    DimensionParams{ast::TextureDimension::k3d, false},
+    DimensionParams{ast::TextureDimension::kCube, false},
+    DimensionParams{ast::TextureDimension::kCubeArray, false}};
 
 using MultisampledTextureDimensionTest = ResolverTestWithParam<DimensionParams>;
 TEST_P(MultisampledTextureDimensionTest, All) {
@@ -594,7 +594,7 @@
 TEST_P(MultisampledTextureTypeTest, All) {
   auto& params = GetParam();
   Global("a",
-         create<sem::MultisampledTexture>(sem::TextureDimension::k2d,
+         create<sem::MultisampledTexture>(ast::TextureDimension::k2d,
                                           params.type_func(ty)),
          ast::StorageClass::kUniformConstant, nullptr,
          ast::DecorationList{
@@ -616,25 +616,25 @@
 
 namespace StorageTextureTests {
 struct DimensionParams {
-  sem::TextureDimension dim;
+  ast::TextureDimension dim;
   bool is_valid;
 };
 
 static constexpr DimensionParams Dimension_cases[] = {
-    DimensionParams{sem::TextureDimension::k1d, true},
-    DimensionParams{sem::TextureDimension::k2d, true},
-    DimensionParams{sem::TextureDimension::k2dArray, true},
-    DimensionParams{sem::TextureDimension::k3d, true},
-    DimensionParams{sem::TextureDimension::kCube, false},
-    DimensionParams{sem::TextureDimension::kCubeArray, false}};
+    DimensionParams{ast::TextureDimension::k1d, true},
+    DimensionParams{ast::TextureDimension::k2d, true},
+    DimensionParams{ast::TextureDimension::k2dArray, true},
+    DimensionParams{ast::TextureDimension::k3d, true},
+    DimensionParams{ast::TextureDimension::kCube, false},
+    DimensionParams{ast::TextureDimension::kCubeArray, false}};
 
 using StorageTextureDimensionTest = ResolverTestWithParam<DimensionParams>;
 TEST_P(StorageTextureDimensionTest, All) {
   auto& params = GetParam();
   Global("a",
-         create<sem::StorageTexture>(params.dim, sem::ImageFormat::kR32Uint,
+         create<sem::StorageTexture>(params.dim, ast::ImageFormat::kR32Uint,
                                      sem::StorageTexture::SubtypeFor(
-                                         sem::ImageFormat::kR32Uint, Types())),
+                                         ast::ImageFormat::kR32Uint, Types())),
          ast::StorageClass::kUniformConstant, nullptr,
          ast::DecorationList{
              create<ast::BindingDecoration>(0),
@@ -652,46 +652,46 @@
                          testing::ValuesIn(Dimension_cases));
 
 struct FormatParams {
-  sem::ImageFormat format;
+  ast::ImageFormat format;
   bool is_valid;
 };
 
 static constexpr FormatParams format_cases[] = {
-    FormatParams{sem::ImageFormat::kBgra8Unorm, false},
-    FormatParams{sem::ImageFormat::kBgra8UnormSrgb, false},
-    FormatParams{sem::ImageFormat::kR16Float, false},
-    FormatParams{sem::ImageFormat::kR16Sint, false},
-    FormatParams{sem::ImageFormat::kR16Uint, false},
-    FormatParams{sem::ImageFormat::kR32Float, true},
-    FormatParams{sem::ImageFormat::kR32Sint, true},
-    FormatParams{sem::ImageFormat::kR32Uint, true},
-    FormatParams{sem::ImageFormat::kR8Sint, false},
-    FormatParams{sem::ImageFormat::kR8Snorm, false},
-    FormatParams{sem::ImageFormat::kR8Uint, false},
-    FormatParams{sem::ImageFormat::kR8Unorm, false},
-    FormatParams{sem::ImageFormat::kRg11B10Float, false},
-    FormatParams{sem::ImageFormat::kRg16Float, false},
-    FormatParams{sem::ImageFormat::kRg16Sint, false},
-    FormatParams{sem::ImageFormat::kRg16Uint, false},
-    FormatParams{sem::ImageFormat::kRg32Float, true},
-    FormatParams{sem::ImageFormat::kRg32Sint, true},
-    FormatParams{sem::ImageFormat::kRg32Uint, true},
-    FormatParams{sem::ImageFormat::kRg8Sint, false},
-    FormatParams{sem::ImageFormat::kRg8Snorm, false},
-    FormatParams{sem::ImageFormat::kRg8Uint, false},
-    FormatParams{sem::ImageFormat::kRg8Unorm, false},
-    FormatParams{sem::ImageFormat::kRgb10A2Unorm, false},
-    FormatParams{sem::ImageFormat::kRgba16Float, true},
-    FormatParams{sem::ImageFormat::kRgba16Sint, true},
-    FormatParams{sem::ImageFormat::kRgba16Uint, true},
-    FormatParams{sem::ImageFormat::kRgba32Float, true},
-    FormatParams{sem::ImageFormat::kRgba32Sint, true},
-    FormatParams{sem::ImageFormat::kRgba32Uint, true},
-    FormatParams{sem::ImageFormat::kRgba8Sint, true},
-    FormatParams{sem::ImageFormat::kRgba8Snorm, true},
-    FormatParams{sem::ImageFormat::kRgba8Uint, true},
-    FormatParams{sem::ImageFormat::kRgba8Unorm, true},
-    FormatParams{sem::ImageFormat::kRgba8UnormSrgb, false}};
+    FormatParams{ast::ImageFormat::kBgra8Unorm, false},
+    FormatParams{ast::ImageFormat::kBgra8UnormSrgb, false},
+    FormatParams{ast::ImageFormat::kR16Float, false},
+    FormatParams{ast::ImageFormat::kR16Sint, false},
+    FormatParams{ast::ImageFormat::kR16Uint, false},
+    FormatParams{ast::ImageFormat::kR32Float, true},
+    FormatParams{ast::ImageFormat::kR32Sint, true},
+    FormatParams{ast::ImageFormat::kR32Uint, true},
+    FormatParams{ast::ImageFormat::kR8Sint, false},
+    FormatParams{ast::ImageFormat::kR8Snorm, false},
+    FormatParams{ast::ImageFormat::kR8Uint, false},
+    FormatParams{ast::ImageFormat::kR8Unorm, false},
+    FormatParams{ast::ImageFormat::kRg11B10Float, false},
+    FormatParams{ast::ImageFormat::kRg16Float, false},
+    FormatParams{ast::ImageFormat::kRg16Sint, false},
+    FormatParams{ast::ImageFormat::kRg16Uint, false},
+    FormatParams{ast::ImageFormat::kRg32Float, true},
+    FormatParams{ast::ImageFormat::kRg32Sint, true},
+    FormatParams{ast::ImageFormat::kRg32Uint, true},
+    FormatParams{ast::ImageFormat::kRg8Sint, false},
+    FormatParams{ast::ImageFormat::kRg8Snorm, false},
+    FormatParams{ast::ImageFormat::kRg8Uint, false},
+    FormatParams{ast::ImageFormat::kRg8Unorm, false},
+    FormatParams{ast::ImageFormat::kRgb10A2Unorm, false},
+    FormatParams{ast::ImageFormat::kRgba16Float, true},
+    FormatParams{ast::ImageFormat::kRgba16Sint, true},
+    FormatParams{ast::ImageFormat::kRgba16Uint, true},
+    FormatParams{ast::ImageFormat::kRgba32Float, true},
+    FormatParams{ast::ImageFormat::kRgba32Sint, true},
+    FormatParams{ast::ImageFormat::kRgba32Uint, true},
+    FormatParams{ast::ImageFormat::kRgba8Sint, true},
+    FormatParams{ast::ImageFormat::kRgba8Snorm, true},
+    FormatParams{ast::ImageFormat::kRgba8Uint, true},
+    FormatParams{ast::ImageFormat::kRgba8Unorm, true},
+    FormatParams{ast::ImageFormat::kRgba8UnormSrgb, false}};
 
 using StorageTextureFormatTest = ResolverTestWithParam<FormatParams>;
 TEST_P(StorageTextureFormatTest, All) {
@@ -705,7 +705,7 @@
 
   Global("a",
          create<sem::StorageTexture>(
-             sem::TextureDimension::k1d, params.format,
+             ast::TextureDimension::k1d, params.format,
              sem::StorageTexture::SubtypeFor(params.format, Types())),
          ast::StorageClass::kUniformConstant, nullptr,
          ast::DecorationList{
@@ -715,7 +715,7 @@
 
   Global("b",
          create<sem::StorageTexture>(
-             sem::TextureDimension::k2d, params.format,
+             ast::TextureDimension::k2d, params.format,
              sem::StorageTexture::SubtypeFor(params.format, Types())),
          ast::StorageClass::kUniformConstant, nullptr,
          ast::DecorationList{
@@ -725,7 +725,7 @@
 
   Global("c",
          create<sem::StorageTexture>(
-             sem::TextureDimension::k2dArray, params.format,
+             ast::TextureDimension::k2dArray, params.format,
              sem::StorageTexture::SubtypeFor(params.format, Types())),
          ast::StorageClass::kUniformConstant, nullptr,
          ast::DecorationList{
@@ -735,7 +735,7 @@
 
   Global("d",
          create<sem::StorageTexture>(
-             sem::TextureDimension::k3d, params.format,
+             ast::TextureDimension::k3d, params.format,
              sem::StorageTexture::SubtypeFor(params.format, Types())),
          ast::StorageClass::kUniformConstant, nullptr,
          ast::DecorationList{
diff --git a/src/sem/depth_texture_type.cc b/src/sem/depth_texture_type.cc
index d4951e3..81ba2b8 100644
--- a/src/sem/depth_texture_type.cc
+++ b/src/sem/depth_texture_type.cc
@@ -22,14 +22,16 @@
 namespace sem {
 namespace {
 
-bool IsValidDepthDimension(TextureDimension dim) {
-  return dim == TextureDimension::k2d || dim == TextureDimension::k2dArray ||
-         dim == TextureDimension::kCube || dim == TextureDimension::kCubeArray;
+bool IsValidDepthDimension(ast::TextureDimension dim) {
+  return dim == ast::TextureDimension::k2d ||
+         dim == ast::TextureDimension::k2dArray ||
+         dim == ast::TextureDimension::kCube ||
+         dim == ast::TextureDimension::kCubeArray;
 }
 
 }  // namespace
 
-DepthTexture::DepthTexture(TextureDimension dim) : Base(dim) {
+DepthTexture::DepthTexture(ast::TextureDimension dim) : Base(dim) {
   TINT_ASSERT(IsValidDepthDimension(dim));
 }
 
diff --git a/src/sem/depth_texture_type.h b/src/sem/depth_texture_type.h
index e912a87..947223f 100644
--- a/src/sem/depth_texture_type.h
+++ b/src/sem/depth_texture_type.h
@@ -27,7 +27,7 @@
  public:
   /// Constructor
   /// @param dim the dimensionality of the texture
-  explicit DepthTexture(TextureDimension dim);
+  explicit DepthTexture(ast::TextureDimension dim);
   /// Move constructor
   DepthTexture(DepthTexture&&);
   ~DepthTexture() override;
diff --git a/src/sem/depth_texture_type_test.cc b/src/sem/depth_texture_type_test.cc
index 0935eba..da779a5 100644
--- a/src/sem/depth_texture_type_test.cc
+++ b/src/sem/depth_texture_type_test.cc
@@ -28,7 +28,7 @@
 using DepthTextureTest = TestHelper;
 
 TEST_F(DepthTextureTest, Is) {
-  DepthTexture d(TextureDimension::kCube);
+  DepthTexture d(ast::TextureDimension::kCube);
   Type* ty = &d;
   EXPECT_FALSE(ty->Is<AccessControl>());
   EXPECT_FALSE(ty->Is<Alias>());
@@ -46,7 +46,7 @@
 }
 
 TEST_F(DepthTextureTest, IsTexture) {
-  DepthTexture d(TextureDimension::kCube);
+  DepthTexture d(ast::TextureDimension::kCube);
   Texture* ty = &d;
   EXPECT_TRUE(ty->Is<DepthTexture>());
   EXPECT_FALSE(ty->Is<ExternalTexture>());
@@ -55,17 +55,17 @@
 }
 
 TEST_F(DepthTextureTest, Dim) {
-  DepthTexture d(TextureDimension::kCube);
-  EXPECT_EQ(d.dim(), TextureDimension::kCube);
+  DepthTexture d(ast::TextureDimension::kCube);
+  EXPECT_EQ(d.dim(), ast::TextureDimension::kCube);
 }
 
 TEST_F(DepthTextureTest, TypeName) {
-  DepthTexture d(TextureDimension::kCube);
+  DepthTexture d(ast::TextureDimension::kCube);
   EXPECT_EQ(d.type_name(), "__depth_texture_cube");
 }
 
 TEST_F(DepthTextureTest, FriendlyName) {
-  DepthTexture d(TextureDimension::kCube);
+  DepthTexture d(ast::TextureDimension::kCube);
   EXPECT_EQ(d.FriendlyName(Symbols()), "texture_depth_cube");
 }
 
diff --git a/src/sem/external_texture_type.cc b/src/sem/external_texture_type.cc
index 7341aaf..7f475e2 100644
--- a/src/sem/external_texture_type.cc
+++ b/src/sem/external_texture_type.cc
@@ -21,7 +21,7 @@
 namespace tint {
 namespace sem {
 
-ExternalTexture::ExternalTexture() : Base(TextureDimension::k2d) {}
+ExternalTexture::ExternalTexture() : Base(ast::TextureDimension::k2d) {}
 
 ExternalTexture::ExternalTexture(ExternalTexture&&) = default;
 
diff --git a/src/sem/external_texture_type_test.cc b/src/sem/external_texture_type_test.cc
index c12dc33..89bfa19 100644
--- a/src/sem/external_texture_type_test.cc
+++ b/src/sem/external_texture_type_test.cc
@@ -60,7 +60,7 @@
 TEST_F(ExternalTextureTest, Dim) {
   F32 f32;
   ExternalTexture s;
-  EXPECT_EQ(s.dim(), TextureDimension::k2d);
+  EXPECT_EQ(s.dim(), ast::TextureDimension::k2d);
 }
 
 TEST_F(ExternalTextureTest, TypeName) {
diff --git a/src/sem/function.cc b/src/sem/function.cc
index d4b1809..cf28d02 100644
--- a/src/sem/function.cc
+++ b/src/sem/function.cc
@@ -117,12 +117,12 @@
 }
 
 Function::VariableBindings Function::ReferencedSamplerVariables() const {
-  return ReferencedSamplerVariablesImpl(sem::SamplerKind::kSampler);
+  return ReferencedSamplerVariablesImpl(ast::SamplerKind::kSampler);
 }
 
 Function::VariableBindings Function::ReferencedComparisonSamplerVariables()
     const {
-  return ReferencedSamplerVariablesImpl(sem::SamplerKind::kComparisonSampler);
+  return ReferencedSamplerVariablesImpl(ast::SamplerKind::kComparisonSampler);
 }
 
 Function::VariableBindings Function::ReferencedSampledTextureVariables() const {
@@ -180,7 +180,7 @@
 }
 
 Function::VariableBindings Function::ReferencedSamplerVariablesImpl(
-    sem::SamplerKind kind) const {
+    ast::SamplerKind kind) const {
   VariableBindings ret;
 
   for (auto* var : ReferencedModuleVariables()) {
diff --git a/src/sem/function.h b/src/sem/function.h
index 4069245..4a43d02 100644
--- a/src/sem/function.h
+++ b/src/sem/function.h
@@ -142,7 +142,7 @@
   bool HasAncestorEntryPoint(Symbol sym) const;
 
  private:
-  VariableBindings ReferencedSamplerVariablesImpl(sem::SamplerKind kind) const;
+  VariableBindings ReferencedSamplerVariablesImpl(ast::SamplerKind kind) const;
   VariableBindings ReferencedSampledTextureVariablesImpl(
       bool multisampled) const;
 
diff --git a/src/sem/multisampled_texture_type.cc b/src/sem/multisampled_texture_type.cc
index 88b09f1..62125f8 100644
--- a/src/sem/multisampled_texture_type.cc
+++ b/src/sem/multisampled_texture_type.cc
@@ -21,7 +21,7 @@
 namespace tint {
 namespace sem {
 
-MultisampledTexture::MultisampledTexture(TextureDimension dim, Type* type)
+MultisampledTexture::MultisampledTexture(ast::TextureDimension dim, Type* type)
     : Base(dim), type_(type) {
   TINT_ASSERT(type_);
 }
diff --git a/src/sem/multisampled_texture_type.h b/src/sem/multisampled_texture_type.h
index 4a4c848..b6d022a 100644
--- a/src/sem/multisampled_texture_type.h
+++ b/src/sem/multisampled_texture_type.h
@@ -28,7 +28,7 @@
   /// Constructor
   /// @param dim the dimensionality of the texture
   /// @param type the data type of the multisampled texture
-  MultisampledTexture(TextureDimension dim, Type* type);
+  MultisampledTexture(ast::TextureDimension dim, Type* type);
   /// Move constructor
   MultisampledTexture(MultisampledTexture&&);
   ~MultisampledTexture() override;
diff --git a/src/sem/multisampled_texture_type_test.cc b/src/sem/multisampled_texture_type_test.cc
index 010c635..4f5a977 100644
--- a/src/sem/multisampled_texture_type_test.cc
+++ b/src/sem/multisampled_texture_type_test.cc
@@ -29,7 +29,7 @@
 
 TEST_F(MultisampledTextureTest, Is) {
   F32 f32;
-  MultisampledTexture s(TextureDimension::kCube, &f32);
+  MultisampledTexture s(ast::TextureDimension::kCube, &f32);
   Type* ty = &s;
   EXPECT_FALSE(ty->Is<AccessControl>());
   EXPECT_FALSE(ty->Is<Alias>());
@@ -48,7 +48,7 @@
 
 TEST_F(MultisampledTextureTest, IsTexture) {
   F32 f32;
-  MultisampledTexture s(TextureDimension::kCube, &f32);
+  MultisampledTexture s(ast::TextureDimension::kCube, &f32);
   Texture* ty = &s;
   EXPECT_FALSE(ty->Is<DepthTexture>());
   EXPECT_FALSE(ty->Is<ExternalTexture>());
@@ -59,24 +59,24 @@
 
 TEST_F(MultisampledTextureTest, Dim) {
   F32 f32;
-  MultisampledTexture s(TextureDimension::k3d, &f32);
-  EXPECT_EQ(s.dim(), TextureDimension::k3d);
+  MultisampledTexture s(ast::TextureDimension::k3d, &f32);
+  EXPECT_EQ(s.dim(), ast::TextureDimension::k3d);
 }
 
 TEST_F(MultisampledTextureTest, Type) {
   F32 f32;
-  MultisampledTexture s(TextureDimension::k3d, &f32);
+  MultisampledTexture s(ast::TextureDimension::k3d, &f32);
   EXPECT_EQ(s.type(), &f32);
 }
 
 TEST_F(MultisampledTextureTest, TypeName) {
   F32 f32;
-  MultisampledTexture s(TextureDimension::k3d, &f32);
+  MultisampledTexture s(ast::TextureDimension::k3d, &f32);
   EXPECT_EQ(s.type_name(), "__multisampled_texture_3d__f32");
 }
 
 TEST_F(MultisampledTextureTest, FriendlyName) {
-  MultisampledTexture s(TextureDimension::k3d, ty.f32());
+  MultisampledTexture s(ast::TextureDimension::k3d, ty.f32());
   EXPECT_EQ(s.FriendlyName(Symbols()), "texture_multisampled_3d<f32>");
 }
 
diff --git a/src/sem/pointer_type.h b/src/sem/pointer_type.h
index 1ce73f2..cdc73f2 100644
--- a/src/sem/pointer_type.h
+++ b/src/sem/pointer_type.h
@@ -29,7 +29,7 @@
   /// Construtor
   /// @param subtype the pointee type
   /// @param storage_class the storage class of the pointer
-  explicit Pointer(Type* subtype, ast::StorageClass storage_class);
+  Pointer(Type* subtype, ast::StorageClass storage_class);
   /// Move constructor
   Pointer(Pointer&&);
   ~Pointer() override;
diff --git a/src/sem/sampled_texture_type.cc b/src/sem/sampled_texture_type.cc
index e820e9b..251b05e 100644
--- a/src/sem/sampled_texture_type.cc
+++ b/src/sem/sampled_texture_type.cc
@@ -21,7 +21,7 @@
 namespace tint {
 namespace sem {
 
-SampledTexture::SampledTexture(TextureDimension dim, Type* type)
+SampledTexture::SampledTexture(ast::TextureDimension dim, Type* type)
     : Base(dim), type_(type) {
   TINT_ASSERT(type_);
 }
diff --git a/src/sem/sampled_texture_type.h b/src/sem/sampled_texture_type.h
index 8bc3ad5..ba01759 100644
--- a/src/sem/sampled_texture_type.h
+++ b/src/sem/sampled_texture_type.h
@@ -28,7 +28,7 @@
   /// Constructor
   /// @param dim the dimensionality of the texture
   /// @param type the data type of the sampled texture
-  SampledTexture(TextureDimension dim, Type* type);
+  SampledTexture(ast::TextureDimension dim, Type* type);
   /// Move constructor
   SampledTexture(SampledTexture&&);
   ~SampledTexture() override;
diff --git a/src/sem/sampled_texture_type_test.cc b/src/sem/sampled_texture_type_test.cc
index 1083003..b3dd053 100644
--- a/src/sem/sampled_texture_type_test.cc
+++ b/src/sem/sampled_texture_type_test.cc
@@ -28,7 +28,7 @@
 
 TEST_F(SampledTextureTest, Is) {
   F32 f32;
-  SampledTexture s(TextureDimension::kCube, &f32);
+  SampledTexture s(ast::TextureDimension::kCube, &f32);
   Type* ty = &s;
   EXPECT_FALSE(ty->Is<AccessControl>());
   EXPECT_FALSE(ty->Is<Alias>());
@@ -47,7 +47,7 @@
 
 TEST_F(SampledTextureTest, IsTexture) {
   F32 f32;
-  SampledTexture s(TextureDimension::kCube, &f32);
+  SampledTexture s(ast::TextureDimension::kCube, &f32);
   Texture* ty = &s;
   EXPECT_FALSE(ty->Is<DepthTexture>());
   EXPECT_FALSE(ty->Is<ExternalTexture>());
@@ -57,24 +57,24 @@
 
 TEST_F(SampledTextureTest, Dim) {
   F32 f32;
-  SampledTexture s(TextureDimension::k3d, &f32);
-  EXPECT_EQ(s.dim(), TextureDimension::k3d);
+  SampledTexture s(ast::TextureDimension::k3d, &f32);
+  EXPECT_EQ(s.dim(), ast::TextureDimension::k3d);
 }
 
 TEST_F(SampledTextureTest, Type) {
   F32 f32;
-  SampledTexture s(TextureDimension::k3d, &f32);
+  SampledTexture s(ast::TextureDimension::k3d, &f32);
   EXPECT_EQ(s.type(), &f32);
 }
 
 TEST_F(SampledTextureTest, TypeName) {
   F32 f32;
-  SampledTexture s(TextureDimension::k3d, &f32);
+  SampledTexture s(ast::TextureDimension::k3d, &f32);
   EXPECT_EQ(s.type_name(), "__sampled_texture_3d__f32");
 }
 
 TEST_F(SampledTextureTest, FriendlyName) {
-  SampledTexture s(TextureDimension::k3d, ty.f32());
+  SampledTexture s(ast::TextureDimension::k3d, ty.f32());
   EXPECT_EQ(s.FriendlyName(Symbols()), "texture_3d<f32>");
 }
 
diff --git a/src/sem/sampler_type.cc b/src/sem/sampler_type.cc
index 3fdc3a7..cc71125 100644
--- a/src/sem/sampler_type.cc
+++ b/src/sem/sampler_type.cc
@@ -21,19 +21,7 @@
 namespace tint {
 namespace sem {
 
-std::ostream& operator<<(std::ostream& out, SamplerKind kind) {
-  switch (kind) {
-    case SamplerKind::kSampler:
-      out << "sampler";
-      break;
-    case SamplerKind::kComparisonSampler:
-      out << "comparison_sampler";
-      break;
-  }
-  return out;
-}
-
-Sampler::Sampler(SamplerKind kind) : kind_(kind) {}
+Sampler::Sampler(ast::SamplerKind kind) : kind_(kind) {}
 
 Sampler::Sampler(Sampler&&) = default;
 
@@ -41,11 +29,11 @@
 
 std::string Sampler::type_name() const {
   return std::string("__sampler_") +
-         (kind_ == SamplerKind::kSampler ? "sampler" : "comparison");
+         (kind_ == ast::SamplerKind::kSampler ? "sampler" : "comparison");
 }
 
 std::string Sampler::FriendlyName(const SymbolTable&) const {
-  return kind_ == SamplerKind::kSampler ? "sampler" : "sampler_comparison";
+  return kind_ == ast::SamplerKind::kSampler ? "sampler" : "sampler_comparison";
 }
 
 Sampler* Sampler::Clone(CloneContext* ctx) const {
diff --git a/src/sem/sampler_type.h b/src/sem/sampler_type.h
index 050528e..fc93b17 100644
--- a/src/sem/sampler_type.h
+++ b/src/sem/sampler_type.h
@@ -17,35 +17,29 @@
 
 #include <string>
 
+#include "src/ast/sampler.h"
 #include "src/sem/type.h"
 
 namespace tint {
 namespace sem {
 
-/// The different kinds of samplers
-enum class SamplerKind {
-  /// A regular sampler
-  kSampler,
-  /// A comparison sampler
-  kComparisonSampler
-};
-std::ostream& operator<<(std::ostream& out, SamplerKind kind);
-
 /// A sampler type.
 class Sampler : public Castable<Sampler, Type> {
  public:
   /// Constructor
   /// @param kind the kind of sampler
-  explicit Sampler(SamplerKind kind);
+  explicit Sampler(ast::SamplerKind kind);
   /// Move constructor
   Sampler(Sampler&&);
   ~Sampler() override;
 
   /// @returns the sampler type
-  SamplerKind kind() const { return kind_; }
+  ast::SamplerKind kind() const { return kind_; }
 
   /// @returns true if this is a comparison sampler
-  bool IsComparison() const { return kind_ == SamplerKind::kComparisonSampler; }
+  bool IsComparison() const {
+    return kind_ == ast::SamplerKind::kComparisonSampler;
+  }
 
   /// @returns the name for this type
   std::string type_name() const override;
@@ -61,7 +55,7 @@
   Sampler* Clone(CloneContext* ctx) const override;
 
  private:
-  SamplerKind const kind_;
+  ast::SamplerKind const kind_;
 };
 
 }  // namespace sem
diff --git a/src/sem/sampler_type_test.cc b/src/sem/sampler_type_test.cc
index 4e6c382..ccac497 100644
--- a/src/sem/sampler_type_test.cc
+++ b/src/sem/sampler_type_test.cc
@@ -23,18 +23,18 @@
 using SamplerTest = TestHelper;
 
 TEST_F(SamplerTest, Creation) {
-  Sampler s{SamplerKind::kSampler};
-  EXPECT_EQ(s.kind(), SamplerKind::kSampler);
+  Sampler s{ast::SamplerKind::kSampler};
+  EXPECT_EQ(s.kind(), ast::SamplerKind::kSampler);
 }
 
 TEST_F(SamplerTest, Creation_ComparisonSampler) {
-  Sampler s{SamplerKind::kComparisonSampler};
-  EXPECT_EQ(s.kind(), SamplerKind::kComparisonSampler);
+  Sampler s{ast::SamplerKind::kComparisonSampler};
+  EXPECT_EQ(s.kind(), ast::SamplerKind::kComparisonSampler);
   EXPECT_TRUE(s.IsComparison());
 }
 
 TEST_F(SamplerTest, Is) {
-  Sampler s{SamplerKind::kSampler};
+  Sampler s{ast::SamplerKind::kSampler};
   Type* ty = &s;
   EXPECT_FALSE(ty->Is<AccessControl>());
   EXPECT_FALSE(ty->Is<Alias>());
@@ -52,22 +52,22 @@
 }
 
 TEST_F(SamplerTest, TypeName_Sampler) {
-  Sampler s{SamplerKind::kSampler};
+  Sampler s{ast::SamplerKind::kSampler};
   EXPECT_EQ(s.type_name(), "__sampler_sampler");
 }
 
 TEST_F(SamplerTest, TypeName_Comparison) {
-  Sampler s{SamplerKind::kComparisonSampler};
+  Sampler s{ast::SamplerKind::kComparisonSampler};
   EXPECT_EQ(s.type_name(), "__sampler_comparison");
 }
 
 TEST_F(SamplerTest, FriendlyNameSampler) {
-  Sampler s{SamplerKind::kSampler};
+  Sampler s{ast::SamplerKind::kSampler};
   EXPECT_EQ(s.FriendlyName(Symbols()), "sampler");
 }
 
 TEST_F(SamplerTest, FriendlyNameComparisonSampler) {
-  Sampler s{SamplerKind::kComparisonSampler};
+  Sampler s{ast::SamplerKind::kComparisonSampler};
   EXPECT_EQ(s.FriendlyName(Symbols()), "sampler_comparison");
 }
 
diff --git a/src/sem/storage_texture_type.cc b/src/sem/storage_texture_type.cc
index 798792b..231758b 100644
--- a/src/sem/storage_texture_type.cc
+++ b/src/sem/storage_texture_type.cc
@@ -21,124 +21,8 @@
 namespace tint {
 namespace sem {
 
-// Note, these names match the names in the WGSL spec. This behaviour is used
-// in the WGSL writer to emit the texture format names.
-std::ostream& operator<<(std::ostream& out, ImageFormat format) {
-  switch (format) {
-    case ImageFormat::kNone:
-      out << "none";
-      break;
-    case ImageFormat::kR8Unorm:
-      out << "r8unorm";
-      break;
-    case ImageFormat::kR8Snorm:
-      out << "r8snorm";
-      break;
-    case ImageFormat::kR8Uint:
-      out << "r8uint";
-      break;
-    case ImageFormat::kR8Sint:
-      out << "r8sint";
-      break;
-    case ImageFormat::kR16Uint:
-      out << "r16uint";
-      break;
-    case ImageFormat::kR16Sint:
-      out << "r16sint";
-      break;
-    case ImageFormat::kR16Float:
-      out << "r16float";
-      break;
-    case ImageFormat::kRg8Unorm:
-      out << "rg8unorm";
-      break;
-    case ImageFormat::kRg8Snorm:
-      out << "rg8snorm";
-      break;
-    case ImageFormat::kRg8Uint:
-      out << "rg8uint";
-      break;
-    case ImageFormat::kRg8Sint:
-      out << "rg8sint";
-      break;
-    case ImageFormat::kR32Uint:
-      out << "r32uint";
-      break;
-    case ImageFormat::kR32Sint:
-      out << "r32sint";
-      break;
-    case ImageFormat::kR32Float:
-      out << "r32float";
-      break;
-    case ImageFormat::kRg16Uint:
-      out << "rg16uint";
-      break;
-    case ImageFormat::kRg16Sint:
-      out << "rg16sint";
-      break;
-    case ImageFormat::kRg16Float:
-      out << "rg16float";
-      break;
-    case ImageFormat::kRgba8Unorm:
-      out << "rgba8unorm";
-      break;
-    case ImageFormat::kRgba8UnormSrgb:
-      out << "rgba8unorm_srgb";
-      break;
-    case ImageFormat::kRgba8Snorm:
-      out << "rgba8snorm";
-      break;
-    case ImageFormat::kRgba8Uint:
-      out << "rgba8uint";
-      break;
-    case ImageFormat::kRgba8Sint:
-      out << "rgba8sint";
-      break;
-    case ImageFormat::kBgra8Unorm:
-      out << "bgra8unorm";
-      break;
-    case ImageFormat::kBgra8UnormSrgb:
-      out << "bgra8unorm_srgb";
-      break;
-    case ImageFormat::kRgb10A2Unorm:
-      out << "rgb10a2unorm";
-      break;
-    case ImageFormat::kRg11B10Float:
-      out << "rg11b10float";
-      break;
-    case ImageFormat::kRg32Uint:
-      out << "rg32uint";
-      break;
-    case ImageFormat::kRg32Sint:
-      out << "rg32sint";
-      break;
-    case ImageFormat::kRg32Float:
-      out << "rg32float";
-      break;
-    case ImageFormat::kRgba16Uint:
-      out << "rgba16uint";
-      break;
-    case ImageFormat::kRgba16Sint:
-      out << "rgba16sint";
-      break;
-    case ImageFormat::kRgba16Float:
-      out << "rgba16float";
-      break;
-    case ImageFormat::kRgba32Uint:
-      out << "rgba32uint";
-      break;
-    case ImageFormat::kRgba32Sint:
-      out << "rgba32sint";
-      break;
-    case ImageFormat::kRgba32Float:
-      out << "rgba32float";
-      break;
-  }
-  return out;
-}
-
-StorageTexture::StorageTexture(TextureDimension dim,
-                               ImageFormat format,
+StorageTexture::StorageTexture(ast::TextureDimension dim,
+                               ast::ImageFormat format,
                                sem::Type* subtype)
     : Base(dim), image_format_(format), subtype_(subtype) {}
 
@@ -164,54 +48,54 @@
   return ctx->dst->create<StorageTexture>(dim(), image_format_, ty);
 }
 
-sem::Type* StorageTexture::SubtypeFor(sem::ImageFormat format,
+sem::Type* StorageTexture::SubtypeFor(ast::ImageFormat format,
                                       sem::Manager& type_mgr) {
   switch (format) {
-    case sem::ImageFormat::kR8Uint:
-    case sem::ImageFormat::kR16Uint:
-    case sem::ImageFormat::kRg8Uint:
-    case sem::ImageFormat::kR32Uint:
-    case sem::ImageFormat::kRg16Uint:
-    case sem::ImageFormat::kRgba8Uint:
-    case sem::ImageFormat::kRg32Uint:
-    case sem::ImageFormat::kRgba16Uint:
-    case sem::ImageFormat::kRgba32Uint: {
+    case ast::ImageFormat::kR8Uint:
+    case ast::ImageFormat::kR16Uint:
+    case ast::ImageFormat::kRg8Uint:
+    case ast::ImageFormat::kR32Uint:
+    case ast::ImageFormat::kRg16Uint:
+    case ast::ImageFormat::kRgba8Uint:
+    case ast::ImageFormat::kRg32Uint:
+    case ast::ImageFormat::kRgba16Uint:
+    case ast::ImageFormat::kRgba32Uint: {
       return type_mgr.Get<sem::U32>();
     }
 
-    case sem::ImageFormat::kR8Sint:
-    case sem::ImageFormat::kR16Sint:
-    case sem::ImageFormat::kRg8Sint:
-    case sem::ImageFormat::kR32Sint:
-    case sem::ImageFormat::kRg16Sint:
-    case sem::ImageFormat::kRgba8Sint:
-    case sem::ImageFormat::kRg32Sint:
-    case sem::ImageFormat::kRgba16Sint:
-    case sem::ImageFormat::kRgba32Sint: {
+    case ast::ImageFormat::kR8Sint:
+    case ast::ImageFormat::kR16Sint:
+    case ast::ImageFormat::kRg8Sint:
+    case ast::ImageFormat::kR32Sint:
+    case ast::ImageFormat::kRg16Sint:
+    case ast::ImageFormat::kRgba8Sint:
+    case ast::ImageFormat::kRg32Sint:
+    case ast::ImageFormat::kRgba16Sint:
+    case ast::ImageFormat::kRgba32Sint: {
       return type_mgr.Get<sem::I32>();
     }
 
-    case sem::ImageFormat::kR8Unorm:
-    case sem::ImageFormat::kRg8Unorm:
-    case sem::ImageFormat::kRgba8Unorm:
-    case sem::ImageFormat::kRgba8UnormSrgb:
-    case sem::ImageFormat::kBgra8Unorm:
-    case sem::ImageFormat::kBgra8UnormSrgb:
-    case sem::ImageFormat::kRgb10A2Unorm:
-    case sem::ImageFormat::kR8Snorm:
-    case sem::ImageFormat::kRg8Snorm:
-    case sem::ImageFormat::kRgba8Snorm:
-    case sem::ImageFormat::kR16Float:
-    case sem::ImageFormat::kR32Float:
-    case sem::ImageFormat::kRg16Float:
-    case sem::ImageFormat::kRg11B10Float:
-    case sem::ImageFormat::kRg32Float:
-    case sem::ImageFormat::kRgba16Float:
-    case sem::ImageFormat::kRgba32Float: {
+    case ast::ImageFormat::kR8Unorm:
+    case ast::ImageFormat::kRg8Unorm:
+    case ast::ImageFormat::kRgba8Unorm:
+    case ast::ImageFormat::kRgba8UnormSrgb:
+    case ast::ImageFormat::kBgra8Unorm:
+    case ast::ImageFormat::kBgra8UnormSrgb:
+    case ast::ImageFormat::kRgb10A2Unorm:
+    case ast::ImageFormat::kR8Snorm:
+    case ast::ImageFormat::kRg8Snorm:
+    case ast::ImageFormat::kRgba8Snorm:
+    case ast::ImageFormat::kR16Float:
+    case ast::ImageFormat::kR32Float:
+    case ast::ImageFormat::kRg16Float:
+    case ast::ImageFormat::kRg11B10Float:
+    case ast::ImageFormat::kRg32Float:
+    case ast::ImageFormat::kRgba16Float:
+    case ast::ImageFormat::kRgba32Float: {
       return type_mgr.Get<sem::F32>();
     }
 
-    case sem::ImageFormat::kNone:
+    case ast::ImageFormat::kNone:
       break;
   }
 
diff --git a/src/sem/storage_texture_type.h b/src/sem/storage_texture_type.h
index 59269a8..8162974 100644
--- a/src/sem/storage_texture_type.h
+++ b/src/sem/storage_texture_type.h
@@ -17,6 +17,7 @@
 
 #include <string>
 
+#include "src/ast/storage_texture.h"
 #include "src/sem/texture_type.h"
 
 namespace tint {
@@ -24,47 +25,6 @@
 
 class Manager;
 
-/// The image format in the storage texture
-enum class ImageFormat {
-  kNone = -1,
-  kR8Unorm,
-  kR8Snorm,
-  kR8Uint,
-  kR8Sint,
-  kR16Uint,
-  kR16Sint,
-  kR16Float,
-  kRg8Unorm,
-  kRg8Snorm,
-  kRg8Uint,
-  kRg8Sint,
-  kR32Uint,
-  kR32Sint,
-  kR32Float,
-  kRg16Uint,
-  kRg16Sint,
-  kRg16Float,
-  kRgba8Unorm,
-  kRgba8UnormSrgb,
-  kRgba8Snorm,
-  kRgba8Uint,
-  kRgba8Sint,
-  kBgra8Unorm,
-  kBgra8UnormSrgb,
-  kRgb10A2Unorm,
-  kRg11B10Float,
-  kRg32Uint,
-  kRg32Sint,
-  kRg32Float,
-  kRgba16Uint,
-  kRgba16Sint,
-  kRgba16Float,
-  kRgba32Uint,
-  kRgba32Sint,
-  kRgba32Float,
-};
-std::ostream& operator<<(std::ostream& out, ImageFormat dim);
-
 /// A storage texture type.
 class StorageTexture : public Castable<StorageTexture, Texture> {
  public:
@@ -72,7 +32,9 @@
   /// @param dim the dimensionality of the texture
   /// @param format the image format of the texture
   /// @param subtype the storage subtype. Use SubtypeFor() to calculate this.
-  StorageTexture(TextureDimension dim, ImageFormat format, sem::Type* subtype);
+  StorageTexture(ast::TextureDimension dim,
+                 ast::ImageFormat format,
+                 sem::Type* subtype);
 
   /// Move constructor
   StorageTexture(StorageTexture&&);
@@ -82,7 +44,7 @@
   Type* type() const { return subtype_; }
 
   /// @returns the image format
-  ImageFormat image_format() const { return image_format_; }
+  ast::ImageFormat image_format() const { return image_format_; }
 
   /// @returns the name for this type
   std::string type_name() const override;
@@ -100,10 +62,10 @@
   /// @param format the storage texture image format
   /// @param type_mgr the sem::Manager used to build the returned type
   /// @returns the storage texture subtype for the given ImageFormat
-  static sem::Type* SubtypeFor(sem::ImageFormat format, sem::Manager& type_mgr);
+  static sem::Type* SubtypeFor(ast::ImageFormat format, sem::Manager& type_mgr);
 
  private:
-  ImageFormat const image_format_;
+  ast::ImageFormat const image_format_;
   Type* const subtype_;
 };
 
diff --git a/src/sem/storage_texture_type_test.cc b/src/sem/storage_texture_type_test.cc
index 2716dc2..f36706b 100644
--- a/src/sem/storage_texture_type_test.cc
+++ b/src/sem/storage_texture_type_test.cc
@@ -28,9 +28,9 @@
 
 TEST_F(StorageTextureTest, Is) {
   auto* subtype =
-      StorageTexture::SubtypeFor(ImageFormat::kRgba32Float, Types());
-  auto* s = create<StorageTexture>(TextureDimension::k2dArray,
-                                   ImageFormat::kRgba32Float, subtype);
+      StorageTexture::SubtypeFor(ast::ImageFormat::kRgba32Float, Types());
+  auto* s = create<StorageTexture>(ast::TextureDimension::k2dArray,
+                                   ast::ImageFormat::kRgba32Float, subtype);
   Type* ty = s;
   EXPECT_FALSE(ty->Is<AccessControl>());
   EXPECT_FALSE(ty->Is<Alias>());
@@ -49,9 +49,9 @@
 
 TEST_F(StorageTextureTest, IsTexture) {
   auto* subtype =
-      StorageTexture::SubtypeFor(ImageFormat::kRgba32Float, Types());
-  auto* s = create<StorageTexture>(TextureDimension::k2dArray,
-                                   ImageFormat::kRgba32Float, subtype);
+      StorageTexture::SubtypeFor(ast::ImageFormat::kRgba32Float, Types());
+  auto* s = create<StorageTexture>(ast::TextureDimension::k2dArray,
+                                   ast::ImageFormat::kRgba32Float, subtype);
   Texture* ty = s;
   EXPECT_FALSE(ty->Is<DepthTexture>());
   EXPECT_FALSE(ty->Is<ExternalTexture>());
@@ -61,42 +61,42 @@
 
 TEST_F(StorageTextureTest, Dim) {
   auto* subtype =
-      StorageTexture::SubtypeFor(ImageFormat::kRgba32Float, Types());
-  auto* s = create<StorageTexture>(TextureDimension::k2dArray,
-                                   ImageFormat::kRgba32Float, subtype);
-  EXPECT_EQ(s->dim(), TextureDimension::k2dArray);
+      StorageTexture::SubtypeFor(ast::ImageFormat::kRgba32Float, Types());
+  auto* s = create<StorageTexture>(ast::TextureDimension::k2dArray,
+                                   ast::ImageFormat::kRgba32Float, subtype);
+  EXPECT_EQ(s->dim(), ast::TextureDimension::k2dArray);
 }
 
 TEST_F(StorageTextureTest, Format) {
   auto* subtype =
-      StorageTexture::SubtypeFor(ImageFormat::kRgba32Float, Types());
-  auto* s = create<StorageTexture>(TextureDimension::k2dArray,
-                                   ImageFormat::kRgba32Float, subtype);
-  EXPECT_EQ(s->image_format(), ImageFormat::kRgba32Float);
+      StorageTexture::SubtypeFor(ast::ImageFormat::kRgba32Float, Types());
+  auto* s = create<StorageTexture>(ast::TextureDimension::k2dArray,
+                                   ast::ImageFormat::kRgba32Float, subtype);
+  EXPECT_EQ(s->image_format(), ast::ImageFormat::kRgba32Float);
 }
 
 TEST_F(StorageTextureTest, TypeName) {
   auto* subtype =
-      StorageTexture::SubtypeFor(ImageFormat::kRgba32Float, Types());
-  auto* s = create<StorageTexture>(TextureDimension::k2dArray,
-                                   ImageFormat::kRgba32Float, subtype);
+      StorageTexture::SubtypeFor(ast::ImageFormat::kRgba32Float, Types());
+  auto* s = create<StorageTexture>(ast::TextureDimension::k2dArray,
+                                   ast::ImageFormat::kRgba32Float, subtype);
   EXPECT_EQ(s->type_name(), "__storage_texture_2d_array_rgba32float");
 }
 
 TEST_F(StorageTextureTest, FriendlyName) {
   auto* subtype =
-      StorageTexture::SubtypeFor(ImageFormat::kRgba32Float, Types());
-  auto* s = create<StorageTexture>(TextureDimension::k2dArray,
-                                   ImageFormat::kRgba32Float, subtype);
+      StorageTexture::SubtypeFor(ast::ImageFormat::kRgba32Float, Types());
+  auto* s = create<StorageTexture>(ast::TextureDimension::k2dArray,
+                                   ast::ImageFormat::kRgba32Float, subtype);
   EXPECT_EQ(s->FriendlyName(Symbols()),
             "texture_storage_2d_array<rgba32float>");
 }
 
 TEST_F(StorageTextureTest, F32) {
   auto* subtype =
-      sem::StorageTexture::SubtypeFor(ImageFormat::kRgba32Float, Types());
-  Type* s = create<StorageTexture>(TextureDimension::k2dArray,
-                                   ImageFormat::kRgba32Float, subtype);
+      sem::StorageTexture::SubtypeFor(ast::ImageFormat::kRgba32Float, Types());
+  Type* s = create<StorageTexture>(ast::TextureDimension::k2dArray,
+                                   ast::ImageFormat::kRgba32Float, subtype);
 
   auto program = Build();
 
@@ -108,9 +108,9 @@
 
 TEST_F(StorageTextureTest, U32) {
   auto* subtype =
-      sem::StorageTexture::SubtypeFor(ImageFormat::kRg32Uint, Types());
-  Type* s = create<StorageTexture>(TextureDimension::k2dArray,
-                                   ImageFormat::kRg32Uint, subtype);
+      sem::StorageTexture::SubtypeFor(ast::ImageFormat::kRg32Uint, Types());
+  Type* s = create<StorageTexture>(ast::TextureDimension::k2dArray,
+                                   ast::ImageFormat::kRg32Uint, subtype);
 
   auto program = Build();
 
@@ -122,9 +122,9 @@
 
 TEST_F(StorageTextureTest, I32) {
   auto* subtype =
-      sem::StorageTexture::SubtypeFor(ImageFormat::kRgba32Sint, Types());
-  Type* s = create<StorageTexture>(TextureDimension::k2dArray,
-                                   ImageFormat::kRgba32Sint, subtype);
+      sem::StorageTexture::SubtypeFor(ast::ImageFormat::kRgba32Sint, Types());
+  Type* s = create<StorageTexture>(ast::TextureDimension::k2dArray,
+                                   ast::ImageFormat::kRgba32Sint, subtype);
 
   auto program = Build();
 
diff --git a/src/sem/texture_type.cc b/src/sem/texture_type.cc
index 479d5a8..d418d0a 100644
--- a/src/sem/texture_type.cc
+++ b/src/sem/texture_type.cc
@@ -19,66 +19,7 @@
 namespace tint {
 namespace sem {
 
-std::ostream& operator<<(std::ostream& out, TextureDimension dim) {
-  switch (dim) {
-    case TextureDimension::kNone:
-      out << "None";
-      break;
-    case TextureDimension::k1d:
-      out << "1d";
-      break;
-    case TextureDimension::k2d:
-      out << "2d";
-      break;
-    case TextureDimension::k2dArray:
-      out << "2d_array";
-      break;
-    case TextureDimension::k3d:
-      out << "3d";
-      break;
-    case TextureDimension::kCube:
-      out << "cube";
-      break;
-    case TextureDimension::kCubeArray:
-      out << "cube_array";
-      break;
-  }
-  return out;
-}
-
-bool IsTextureArray(TextureDimension dim) {
-  switch (dim) {
-    case TextureDimension::k2dArray:
-    case TextureDimension::kCubeArray:
-      return true;
-    case TextureDimension::k2d:
-    case TextureDimension::kNone:
-    case TextureDimension::k1d:
-    case TextureDimension::k3d:
-    case TextureDimension::kCube:
-      return false;
-  }
-  return false;
-}
-
-int NumCoordinateAxes(TextureDimension dim) {
-  switch (dim) {
-    case TextureDimension::kNone:
-      return 0;
-    case TextureDimension::k1d:
-      return 1;
-    case TextureDimension::k2d:
-    case TextureDimension::k2dArray:
-      return 2;
-    case TextureDimension::k3d:
-    case TextureDimension::kCube:
-    case TextureDimension::kCubeArray:
-      return 3;
-  }
-  return 0;
-}
-
-Texture::Texture(TextureDimension dim) : dim_(dim) {}
+Texture::Texture(ast::TextureDimension dim) : dim_(dim) {}
 
 Texture::Texture(Texture&&) = default;
 
diff --git a/src/sem/texture_type.h b/src/sem/texture_type.h
index d9ab6e3..5afab9b 100644
--- a/src/sem/texture_type.h
+++ b/src/sem/texture_type.h
@@ -15,58 +15,27 @@
 #ifndef SRC_SEM_TEXTURE_TYPE_H_
 #define SRC_SEM_TEXTURE_TYPE_H_
 
+#include "src/ast/texture.h"
 #include "src/sem/type.h"
 
 namespace tint {
 namespace sem {
 
-/// The dimensionality of the texture
-enum class TextureDimension {
-  /// Invalid texture
-  kNone = -1,
-  /// 1 dimensional texture
-  k1d,
-  /// 2 dimensional texture
-  k2d,
-  /// 2 dimensional array texture
-  k2dArray,
-  /// 3 dimensional texture
-  k3d,
-  /// cube texture
-  kCube,
-  /// cube array texture
-  kCubeArray,
-};
-std::ostream& operator<<(std::ostream& out, TextureDimension dim);
-
-/// @param dim the TextureDimension to query
-/// @return true if the given TextureDimension is an array texture
-bool IsTextureArray(TextureDimension dim);
-
-/// Returns the number of axes in the coordinate for a dimensionality.
-///  None -> 0
-///  1D -> 1
-///  2D, 2DArray -> 2
-///  3D, Cube, CubeArray -> 3
-/// @param dim the TextureDimension to query
-/// @return number of dimensions in a coordinate for the dimensionality
-int NumCoordinateAxes(TextureDimension dim);
-
 /// A texture type.
 class Texture : public Castable<Texture, Type> {
  public:
   /// Constructor
   /// @param dim the dimensionality of the texture
-  explicit Texture(TextureDimension dim);
+  explicit Texture(ast::TextureDimension dim);
   /// Move constructor
   Texture(Texture&&);
   ~Texture() override;
 
   /// @returns the texture dimension
-  TextureDimension dim() const { return dim_; }
+  ast::TextureDimension dim() const { return dim_; }
 
  private:
-  TextureDimension const dim_;
+  ast::TextureDimension const dim_;
 };
 
 }  // namespace sem
diff --git a/src/sem/texture_type_test.cc b/src/sem/texture_type_test.cc
index ee1e25e..8763df2 100644
--- a/src/sem/texture_type_test.cc
+++ b/src/sem/texture_type_test.cc
@@ -23,23 +23,23 @@
 using TextureTypeTest = TestHelper;
 
 TEST_F(TextureTypeTest, IsTextureArray) {
-  EXPECT_EQ(false, IsTextureArray(TextureDimension::kNone));
-  EXPECT_EQ(false, IsTextureArray(TextureDimension::k1d));
-  EXPECT_EQ(false, IsTextureArray(TextureDimension::k2d));
-  EXPECT_EQ(true, IsTextureArray(TextureDimension::k2dArray));
-  EXPECT_EQ(false, IsTextureArray(TextureDimension::k3d));
-  EXPECT_EQ(false, IsTextureArray(TextureDimension::kCube));
-  EXPECT_EQ(true, IsTextureArray(TextureDimension::kCubeArray));
+  EXPECT_EQ(false, IsTextureArray(ast::TextureDimension::kNone));
+  EXPECT_EQ(false, IsTextureArray(ast::TextureDimension::k1d));
+  EXPECT_EQ(false, IsTextureArray(ast::TextureDimension::k2d));
+  EXPECT_EQ(true, IsTextureArray(ast::TextureDimension::k2dArray));
+  EXPECT_EQ(false, IsTextureArray(ast::TextureDimension::k3d));
+  EXPECT_EQ(false, IsTextureArray(ast::TextureDimension::kCube));
+  EXPECT_EQ(true, IsTextureArray(ast::TextureDimension::kCubeArray));
 }
 
 TEST_F(TextureTypeTest, NumCoordinateAxes) {
-  EXPECT_EQ(0, NumCoordinateAxes(TextureDimension::kNone));
-  EXPECT_EQ(1, NumCoordinateAxes(TextureDimension::k1d));
-  EXPECT_EQ(2, NumCoordinateAxes(TextureDimension::k2d));
-  EXPECT_EQ(2, NumCoordinateAxes(TextureDimension::k2dArray));
-  EXPECT_EQ(3, NumCoordinateAxes(TextureDimension::k3d));
-  EXPECT_EQ(3, NumCoordinateAxes(TextureDimension::kCube));
-  EXPECT_EQ(3, NumCoordinateAxes(TextureDimension::kCubeArray));
+  EXPECT_EQ(0, NumCoordinateAxes(ast::TextureDimension::kNone));
+  EXPECT_EQ(1, NumCoordinateAxes(ast::TextureDimension::k1d));
+  EXPECT_EQ(2, NumCoordinateAxes(ast::TextureDimension::k2d));
+  EXPECT_EQ(2, NumCoordinateAxes(ast::TextureDimension::k2dArray));
+  EXPECT_EQ(3, NumCoordinateAxes(ast::TextureDimension::k3d));
+  EXPECT_EQ(3, NumCoordinateAxes(ast::TextureDimension::kCube));
+  EXPECT_EQ(3, NumCoordinateAxes(ast::TextureDimension::kCubeArray));
 }
 
 }  // namespace
diff --git a/src/writer/hlsl/generator_impl.cc b/src/writer/hlsl/generator_impl.cc
index 109b40a..198456b 100644
--- a/src/writer/hlsl/generator_impl.cc
+++ b/src/writer/hlsl/generator_impl.cc
@@ -58,26 +58,26 @@
          stmts->last()->Is<ast::FallthroughStatement>();
 }
 
-const char* image_format_to_rwtexture_type(sem::ImageFormat image_format) {
+const char* image_format_to_rwtexture_type(ast::ImageFormat image_format) {
   switch (image_format) {
-    case sem::ImageFormat::kRgba8Unorm:
-    case sem::ImageFormat::kRgba8Snorm:
-    case sem::ImageFormat::kRgba16Float:
-    case sem::ImageFormat::kR32Float:
-    case sem::ImageFormat::kRg32Float:
-    case sem::ImageFormat::kRgba32Float:
+    case ast::ImageFormat::kRgba8Unorm:
+    case ast::ImageFormat::kRgba8Snorm:
+    case ast::ImageFormat::kRgba16Float:
+    case ast::ImageFormat::kR32Float:
+    case ast::ImageFormat::kRg32Float:
+    case ast::ImageFormat::kRgba32Float:
       return "float4";
-    case sem::ImageFormat::kRgba8Uint:
-    case sem::ImageFormat::kRgba16Uint:
-    case sem::ImageFormat::kR32Uint:
-    case sem::ImageFormat::kRg32Uint:
-    case sem::ImageFormat::kRgba32Uint:
+    case ast::ImageFormat::kRgba8Uint:
+    case ast::ImageFormat::kRgba16Uint:
+    case ast::ImageFormat::kR32Uint:
+    case ast::ImageFormat::kRg32Uint:
+    case ast::ImageFormat::kRgba32Uint:
       return "uint4";
-    case sem::ImageFormat::kRgba8Sint:
-    case sem::ImageFormat::kRgba16Sint:
-    case sem::ImageFormat::kR32Sint:
-    case sem::ImageFormat::kRg32Sint:
-    case sem::ImageFormat::kRgba32Sint:
+    case ast::ImageFormat::kRgba8Sint:
+    case ast::ImageFormat::kRgba16Sint:
+    case ast::ImageFormat::kR32Sint:
+    case ast::ImageFormat::kRg32Sint:
+    case ast::ImageFormat::kRgba32Sint:
       return "int4";
     default:
       return nullptr;
@@ -881,30 +881,30 @@
       switch (intrinsic->Type()) {
         case sem::IntrinsicType::kTextureDimensions:
           switch (texture_type->dim()) {
-            case sem::TextureDimension::kNone:
+            case ast::TextureDimension::kNone:
               TINT_ICE(diagnostics_) << "texture dimension is kNone";
               return false;
-            case sem::TextureDimension::k1d:
+            case ast::TextureDimension::k1d:
               num_dimensions = 1;
               break;
-            case sem::TextureDimension::k2d:
+            case ast::TextureDimension::k2d:
               num_dimensions = is_ms ? 3 : 2;
               swizzle = is_ms ? ".xy" : "";
               break;
-            case sem::TextureDimension::k2dArray:
+            case ast::TextureDimension::k2dArray:
               num_dimensions = is_ms ? 4 : 3;
               swizzle = ".xy";
               break;
-            case sem::TextureDimension::k3d:
+            case ast::TextureDimension::k3d:
               num_dimensions = 3;
               break;
-            case sem::TextureDimension::kCube:
+            case ast::TextureDimension::kCube:
               // width == height == depth for cubes
               // See https://github.com/gpuweb/gpuweb/issues/1345
               num_dimensions = 2;
               swizzle = ".xyy";  // [width, height, height]
               break;
-            case sem::TextureDimension::kCubeArray:
+            case ast::TextureDimension::kCubeArray:
               // width == height == depth for cubes
               // See https://github.com/gpuweb/gpuweb/issues/1345
               num_dimensions = 3;
@@ -917,11 +917,11 @@
             default:
               TINT_ICE(diagnostics_) << "texture dimension is not arrayed";
               return false;
-            case sem::TextureDimension::k2dArray:
+            case ast::TextureDimension::k2dArray:
               num_dimensions = is_ms ? 4 : 3;
               swizzle = ".z";
               break;
-            case sem::TextureDimension::kCubeArray:
+            case ast::TextureDimension::kCubeArray:
               num_dimensions = 3;
               swizzle = ".z";
               break;
@@ -933,14 +933,14 @@
               TINT_ICE(diagnostics_)
                   << "texture dimension does not support mips";
               return false;
-            case sem::TextureDimension::k2d:
-            case sem::TextureDimension::kCube:
+            case ast::TextureDimension::k2d:
+            case ast::TextureDimension::kCube:
               num_dimensions = 3;
               swizzle = ".z";
               break;
-            case sem::TextureDimension::k2dArray:
-            case sem::TextureDimension::k3d:
-            case sem::TextureDimension::kCubeArray:
+            case ast::TextureDimension::k2dArray:
+            case ast::TextureDimension::k3d:
+            case ast::TextureDimension::kCubeArray:
               num_dimensions = 4;
               swizzle = ".w";
               break;
@@ -952,11 +952,11 @@
               TINT_ICE(diagnostics_)
                   << "texture dimension does not support multisampling";
               return false;
-            case sem::TextureDimension::k2d:
+            case ast::TextureDimension::k2d:
               num_dimensions = 3;
               swizzle = ".z";
               break;
-            case sem::TextureDimension::k2dArray:
+            case ast::TextureDimension::k2dArray:
               num_dimensions = 4;
               swizzle = ".w";
               break;
@@ -2466,22 +2466,22 @@
     out << "Texture";
 
     switch (tex->dim()) {
-      case sem::TextureDimension::k1d:
+      case ast::TextureDimension::k1d:
         out << "1D";
         break;
-      case sem::TextureDimension::k2d:
+      case ast::TextureDimension::k2d:
         out << (multism ? "2DMS" : "2D");
         break;
-      case sem::TextureDimension::k2dArray:
+      case ast::TextureDimension::k2dArray:
         out << (multism ? "2DMSArray" : "2DArray");
         break;
-      case sem::TextureDimension::k3d:
+      case ast::TextureDimension::k3d:
         out << "3D";
         break;
-      case sem::TextureDimension::kCube:
+      case ast::TextureDimension::kCube:
         out << "Cube";
         break;
-      case sem::TextureDimension::kCubeArray:
+      case ast::TextureDimension::kCubeArray:
         out << "CubeArray";
         break;
       default:
diff --git a/src/writer/hlsl/generator_impl_type_test.cc b/src/writer/hlsl/generator_impl_type_test.cc
index 71fc2e2..b483bd5 100644
--- a/src/writer/hlsl/generator_impl_type_test.cc
+++ b/src/writer/hlsl/generator_impl_type_test.cc
@@ -295,7 +295,7 @@
 }
 
 TEST_F(HlslGeneratorImplTest_Type, EmitSampler) {
-  sem::Sampler sampler(sem::SamplerKind::kSampler);
+  sem::Sampler sampler(ast::SamplerKind::kSampler);
 
   GeneratorImpl& gen = Build();
 
@@ -305,7 +305,7 @@
 }
 
 TEST_F(HlslGeneratorImplTest_Type, EmitSamplerComparison) {
-  sem::Sampler sampler(sem::SamplerKind::kComparisonSampler);
+  sem::Sampler sampler(ast::SamplerKind::kComparisonSampler);
 
   GeneratorImpl& gen = Build();
 
@@ -315,7 +315,7 @@
 }
 
 struct HlslDepthTextureData {
-  sem::TextureDimension dim;
+  ast::TextureDimension dim;
   std::string result;
 };
 inline std::ostream& operator<<(std::ostream& out, HlslDepthTextureData data) {
@@ -349,18 +349,18 @@
     HlslGeneratorImplTest_Type,
     HlslDepthTexturesTest,
     testing::Values(
-        HlslDepthTextureData{sem::TextureDimension::k2d,
+        HlslDepthTextureData{ast::TextureDimension::k2d,
                              "Texture2D tex : register(t1, space2);"},
-        HlslDepthTextureData{sem::TextureDimension::k2dArray,
+        HlslDepthTextureData{ast::TextureDimension::k2dArray,
                              "Texture2DArray tex : register(t1, space2);"},
-        HlslDepthTextureData{sem::TextureDimension::kCube,
+        HlslDepthTextureData{ast::TextureDimension::kCube,
                              "TextureCube tex : register(t1, space2);"},
-        HlslDepthTextureData{sem::TextureDimension::kCubeArray,
+        HlslDepthTextureData{ast::TextureDimension::kCubeArray,
                              "TextureCubeArray tex : register(t1, space2);"}));
 
 enum class TextureDataType { F32, U32, I32 };
 struct HlslSampledTextureData {
-  sem::TextureDimension dim;
+  ast::TextureDimension dim;
   TextureDataType datatype;
   std::string result;
 };
@@ -409,98 +409,98 @@
     HlslSampledTexturesTest,
     testing::Values(
         HlslSampledTextureData{
-            sem::TextureDimension::k1d,
+            ast::TextureDimension::k1d,
             TextureDataType::F32,
             "Texture1D<float4> tex : register(t1, space2);",
         },
         HlslSampledTextureData{
-            sem::TextureDimension::k2d,
+            ast::TextureDimension::k2d,
             TextureDataType::F32,
             "Texture2D<float4> tex : register(t1, space2);",
         },
         HlslSampledTextureData{
-            sem::TextureDimension::k2dArray,
+            ast::TextureDimension::k2dArray,
             TextureDataType::F32,
             "Texture2DArray<float4> tex : register(t1, space2);",
         },
         HlslSampledTextureData{
-            sem::TextureDimension::k3d,
+            ast::TextureDimension::k3d,
             TextureDataType::F32,
             "Texture3D<float4> tex : register(t1, space2);",
         },
         HlslSampledTextureData{
-            sem::TextureDimension::kCube,
+            ast::TextureDimension::kCube,
             TextureDataType::F32,
             "TextureCube<float4> tex : register(t1, space2);",
         },
         HlslSampledTextureData{
-            sem::TextureDimension::kCubeArray,
+            ast::TextureDimension::kCubeArray,
             TextureDataType::F32,
             "TextureCubeArray<float4> tex : register(t1, space2);",
         },
         HlslSampledTextureData{
-            sem::TextureDimension::k1d,
+            ast::TextureDimension::k1d,
             TextureDataType::U32,
             "Texture1D<uint4> tex : register(t1, space2);",
         },
         HlslSampledTextureData{
-            sem::TextureDimension::k2d,
+            ast::TextureDimension::k2d,
             TextureDataType::U32,
             "Texture2D<uint4> tex : register(t1, space2);",
         },
         HlslSampledTextureData{
-            sem::TextureDimension::k2dArray,
+            ast::TextureDimension::k2dArray,
             TextureDataType::U32,
             "Texture2DArray<uint4> tex : register(t1, space2);",
         },
         HlslSampledTextureData{
-            sem::TextureDimension::k3d,
+            ast::TextureDimension::k3d,
             TextureDataType::U32,
             "Texture3D<uint4> tex : register(t1, space2);",
         },
         HlslSampledTextureData{
-            sem::TextureDimension::kCube,
+            ast::TextureDimension::kCube,
             TextureDataType::U32,
             "TextureCube<uint4> tex : register(t1, space2);",
         },
         HlslSampledTextureData{
-            sem::TextureDimension::kCubeArray,
+            ast::TextureDimension::kCubeArray,
             TextureDataType::U32,
             "TextureCubeArray<uint4> tex : register(t1, space2);",
         },
         HlslSampledTextureData{
-            sem::TextureDimension::k1d,
+            ast::TextureDimension::k1d,
             TextureDataType::I32,
             "Texture1D<int4> tex : register(t1, space2);",
         },
         HlslSampledTextureData{
-            sem::TextureDimension::k2d,
+            ast::TextureDimension::k2d,
             TextureDataType::I32,
             "Texture2D<int4> tex : register(t1, space2);",
         },
         HlslSampledTextureData{
-            sem::TextureDimension::k2dArray,
+            ast::TextureDimension::k2dArray,
             TextureDataType::I32,
             "Texture2DArray<int4> tex : register(t1, space2);",
         },
         HlslSampledTextureData{
-            sem::TextureDimension::k3d,
+            ast::TextureDimension::k3d,
             TextureDataType::I32,
             "Texture3D<int4> tex : register(t1, space2);",
         },
         HlslSampledTextureData{
-            sem::TextureDimension::kCube,
+            ast::TextureDimension::kCube,
             TextureDataType::I32,
             "TextureCube<int4> tex : register(t1, space2);",
         },
         HlslSampledTextureData{
-            sem::TextureDimension::kCubeArray,
+            ast::TextureDimension::kCubeArray,
             TextureDataType::I32,
             "TextureCubeArray<int4> tex : register(t1, space2);",
         }));
 
 TEST_F(HlslGeneratorImplTest_Type, EmitMultisampledTexture) {
-  sem::MultisampledTexture s(sem::TextureDimension::k2d, ty.f32());
+  sem::MultisampledTexture s(ast::TextureDimension::k2d, ty.f32());
 
   GeneratorImpl& gen = Build();
 
@@ -510,8 +510,8 @@
 }
 
 struct HlslStorageTextureData {
-  sem::TextureDimension dim;
-  sem::ImageFormat imgfmt;
+  ast::TextureDimension dim;
+  ast::ImageFormat imgfmt;
   bool ro;
   std::string result;
 };
@@ -552,44 +552,44 @@
     HlslGeneratorImplTest_Type,
     HlslStorageTexturesTest,
     testing::Values(
-        HlslStorageTextureData{sem::TextureDimension::k1d,
-                               sem::ImageFormat::kRgba8Unorm, true,
+        HlslStorageTextureData{ast::TextureDimension::k1d,
+                               ast::ImageFormat::kRgba8Unorm, true,
                                "Texture1D<float4> tex : register(t1, space2);"},
-        HlslStorageTextureData{sem::TextureDimension::k2d,
-                               sem::ImageFormat::kRgba16Float, true,
+        HlslStorageTextureData{ast::TextureDimension::k2d,
+                               ast::ImageFormat::kRgba16Float, true,
                                "Texture2D<float4> tex : register(t1, space2);"},
         HlslStorageTextureData{
-            sem::TextureDimension::k2dArray, sem::ImageFormat::kR32Float, true,
+            ast::TextureDimension::k2dArray, ast::ImageFormat::kR32Float, true,
             "Texture2DArray<float4> tex : register(t1, space2);"},
-        HlslStorageTextureData{sem::TextureDimension::k3d,
-                               sem::ImageFormat::kRg32Float, true,
+        HlslStorageTextureData{ast::TextureDimension::k3d,
+                               ast::ImageFormat::kRg32Float, true,
                                "Texture3D<float4> tex : register(t1, space2);"},
         HlslStorageTextureData{
-            sem::TextureDimension::k1d, sem::ImageFormat::kRgba32Float, false,
+            ast::TextureDimension::k1d, ast::ImageFormat::kRgba32Float, false,
             "RWTexture1D<float4> tex : register(u1, space2);"},
         HlslStorageTextureData{
-            sem::TextureDimension::k2d, sem::ImageFormat::kRgba16Uint, false,
+            ast::TextureDimension::k2d, ast::ImageFormat::kRgba16Uint, false,
             "RWTexture2D<uint4> tex : register(u1, space2);"},
         HlslStorageTextureData{
-            sem::TextureDimension::k2dArray, sem::ImageFormat::kR32Uint, false,
+            ast::TextureDimension::k2dArray, ast::ImageFormat::kR32Uint, false,
             "RWTexture2DArray<uint4> tex : register(u1, space2);"},
         HlslStorageTextureData{
-            sem::TextureDimension::k3d, sem::ImageFormat::kRg32Uint, false,
+            ast::TextureDimension::k3d, ast::ImageFormat::kRg32Uint, false,
             "RWTexture3D<uint4> tex : register(u1, space2);"},
-        HlslStorageTextureData{sem::TextureDimension::k1d,
-                               sem::ImageFormat::kRgba32Uint, true,
+        HlslStorageTextureData{ast::TextureDimension::k1d,
+                               ast::ImageFormat::kRgba32Uint, true,
                                "Texture1D<uint4> tex : register(t1, space2);"},
-        HlslStorageTextureData{sem::TextureDimension::k2d,
-                               sem::ImageFormat::kRgba16Sint, true,
+        HlslStorageTextureData{ast::TextureDimension::k2d,
+                               ast::ImageFormat::kRgba16Sint, true,
                                "Texture2D<int4> tex : register(t1, space2);"},
         HlslStorageTextureData{
-            sem::TextureDimension::k2dArray, sem::ImageFormat::kR32Sint, true,
+            ast::TextureDimension::k2dArray, ast::ImageFormat::kR32Sint, true,
             "Texture2DArray<int4> tex : register(t1, space2);"},
-        HlslStorageTextureData{sem::TextureDimension::k3d,
-                               sem::ImageFormat::kRg32Sint, true,
+        HlslStorageTextureData{ast::TextureDimension::k3d,
+                               ast::ImageFormat::kRg32Sint, true,
                                "Texture3D<int4> tex : register(t1, space2);"},
         HlslStorageTextureData{
-            sem::TextureDimension::k1d, sem::ImageFormat::kRgba32Sint, false,
+            ast::TextureDimension::k1d, ast::ImageFormat::kRgba32Sint, false,
             "RWTexture1D<int4> tex : register(u1, space2);"}));
 
 }  // namespace
diff --git a/src/writer/msl/generator_impl.cc b/src/writer/msl/generator_impl.cc
index 2af17d7..fc31953 100644
--- a/src/writer/msl/generator_impl.cc
+++ b/src/writer/msl/generator_impl.cc
@@ -496,21 +496,21 @@
     case sem::IntrinsicType::kTextureDimensions: {
       std::vector<const char*> dims;
       switch (texture_type->dim()) {
-        case sem::TextureDimension::kNone:
+        case ast::TextureDimension::kNone:
           diagnostics_.add_error("texture dimension is kNone");
           return false;
-        case sem::TextureDimension::k1d:
+        case ast::TextureDimension::k1d:
           dims = {"width"};
           break;
-        case sem::TextureDimension::k2d:
-        case sem::TextureDimension::k2dArray:
+        case ast::TextureDimension::k2d:
+        case ast::TextureDimension::k2dArray:
           dims = {"width", "height"};
           break;
-        case sem::TextureDimension::k3d:
+        case ast::TextureDimension::k3d:
           dims = {"width", "height", "depth"};
           break;
-        case sem::TextureDimension::kCube:
-        case sem::TextureDimension::kCubeArray:
+        case ast::TextureDimension::kCube:
+        case ast::TextureDimension::kCubeArray:
           // width == height == depth for cubes
           // See https://github.com/gpuweb/gpuweb/issues/1345
           dims = {"width", "height", "height"};
@@ -645,17 +645,17 @@
   if (auto* ddx = arg(Usage::kDdx)) {
     auto dim = texture_type->dim();
     switch (dim) {
-      case sem::TextureDimension::k2d:
-      case sem::TextureDimension::k2dArray:
+      case ast::TextureDimension::k2d:
+      case ast::TextureDimension::k2dArray:
         maybe_write_comma();
         out_ << "gradient2d(";
         break;
-      case sem::TextureDimension::k3d:
+      case ast::TextureDimension::k3d:
         maybe_write_comma();
         out_ << "gradient3d(";
         break;
-      case sem::TextureDimension::kCube:
-      case sem::TextureDimension::kCubeArray:
+      case ast::TextureDimension::kCube:
+      case ast::TextureDimension::kCubeArray:
         maybe_write_comma();
         out_ << "gradientcube(";
         break;
@@ -1959,22 +1959,22 @@
     }
 
     switch (tex->dim()) {
-      case sem::TextureDimension::k1d:
+      case ast::TextureDimension::k1d:
         out_ << "1d";
         break;
-      case sem::TextureDimension::k2d:
+      case ast::TextureDimension::k2d:
         out_ << "2d";
         break;
-      case sem::TextureDimension::k2dArray:
+      case ast::TextureDimension::k2dArray:
         out_ << "2d_array";
         break;
-      case sem::TextureDimension::k3d:
+      case ast::TextureDimension::k3d:
         out_ << "3d";
         break;
-      case sem::TextureDimension::kCube:
+      case ast::TextureDimension::kCube:
         out_ << "cube";
         break;
-      case sem::TextureDimension::kCubeArray:
+      case ast::TextureDimension::kCubeArray:
         out_ << "cube_array";
         break;
       default:
diff --git a/src/writer/msl/generator_impl_type_test.cc b/src/writer/msl/generator_impl_type_test.cc
index 836b22f..8f260d7 100644
--- a/src/writer/msl/generator_impl_type_test.cc
+++ b/src/writer/msl/generator_impl_type_test.cc
@@ -631,7 +631,7 @@
 }
 
 TEST_F(MslGeneratorImplTest, EmitType_Sampler) {
-  sem::Sampler sampler(sem::SamplerKind::kSampler);
+  sem::Sampler sampler(ast::SamplerKind::kSampler);
 
   GeneratorImpl& gen = Build();
 
@@ -640,7 +640,7 @@
 }
 
 TEST_F(MslGeneratorImplTest, EmitType_SamplerComparison) {
-  sem::Sampler sampler(sem::SamplerKind::kComparisonSampler);
+  sem::Sampler sampler(ast::SamplerKind::kComparisonSampler);
 
   GeneratorImpl& gen = Build();
 
@@ -649,7 +649,7 @@
 }
 
 struct MslDepthTextureData {
-  sem::TextureDimension dim;
+  ast::TextureDimension dim;
   std::string result;
 };
 inline std::ostream& operator<<(std::ostream& out, MslDepthTextureData data) {
@@ -670,18 +670,18 @@
 INSTANTIATE_TEST_SUITE_P(
     MslGeneratorImplTest,
     MslDepthTexturesTest,
-    testing::Values(MslDepthTextureData{sem::TextureDimension::k2d,
+    testing::Values(MslDepthTextureData{ast::TextureDimension::k2d,
                                         "depth2d<float, access::sample>"},
-                    MslDepthTextureData{sem::TextureDimension::k2dArray,
+                    MslDepthTextureData{ast::TextureDimension::k2dArray,
                                         "depth2d_array<float, access::sample>"},
-                    MslDepthTextureData{sem::TextureDimension::kCube,
+                    MslDepthTextureData{ast::TextureDimension::kCube,
                                         "depthcube<float, access::sample>"},
                     MslDepthTextureData{
-                        sem::TextureDimension::kCubeArray,
+                        ast::TextureDimension::kCubeArray,
                         "depthcube_array<float, access::sample>"}));
 
 struct MslTextureData {
-  sem::TextureDimension dim;
+  ast::TextureDimension dim;
   std::string result;
 };
 inline std::ostream& operator<<(std::ostream& out, MslTextureData data) {
@@ -702,22 +702,22 @@
 INSTANTIATE_TEST_SUITE_P(
     MslGeneratorImplTest,
     MslSampledtexturesTest,
-    testing::Values(MslTextureData{sem::TextureDimension::k1d,
+    testing::Values(MslTextureData{ast::TextureDimension::k1d,
                                    "texture1d<float, access::sample>"},
-                    MslTextureData{sem::TextureDimension::k2d,
+                    MslTextureData{ast::TextureDimension::k2d,
                                    "texture2d<float, access::sample>"},
-                    MslTextureData{sem::TextureDimension::k2dArray,
+                    MslTextureData{ast::TextureDimension::k2dArray,
                                    "texture2d_array<float, access::sample>"},
-                    MslTextureData{sem::TextureDimension::k3d,
+                    MslTextureData{ast::TextureDimension::k3d,
                                    "texture3d<float, access::sample>"},
-                    MslTextureData{sem::TextureDimension::kCube,
+                    MslTextureData{ast::TextureDimension::kCube,
                                    "texturecube<float, access::sample>"},
                     MslTextureData{
-                        sem::TextureDimension::kCubeArray,
+                        ast::TextureDimension::kCubeArray,
                         "texturecube_array<float, access::sample>"}));
 
 TEST_F(MslGeneratorImplTest, Emit_TypeMultisampledTexture) {
-  sem::MultisampledTexture s(sem::TextureDimension::k2d, ty.u32());
+  sem::MultisampledTexture s(ast::TextureDimension::k2d, ty.u32());
 
   GeneratorImpl& gen = Build();
 
@@ -726,7 +726,7 @@
 }
 
 struct MslStorageTextureData {
-  sem::TextureDimension dim;
+  ast::TextureDimension dim;
   bool ro;
   std::string result;
 };
@@ -739,8 +739,8 @@
   auto params = GetParam();
 
   auto* subtype =
-      sem::StorageTexture::SubtypeFor(sem::ImageFormat::kR32Float, Types());
-  auto* s = create<sem::StorageTexture>(params.dim, sem::ImageFormat::kR32Float,
+      sem::StorageTexture::SubtypeFor(ast::ImageFormat::kR32Float, Types());
+  auto* s = create<sem::StorageTexture>(params.dim, ast::ImageFormat::kR32Float,
                                         subtype);
   auto* ac =
       create<sem::AccessControl>(params.ro ? ast::AccessControl::kReadOnly
@@ -757,21 +757,21 @@
     MslGeneratorImplTest,
     MslStorageTexturesTest,
     testing::Values(
-        MslStorageTextureData{sem::TextureDimension::k1d, true,
+        MslStorageTextureData{ast::TextureDimension::k1d, true,
                               "texture1d<float, access::read>"},
-        MslStorageTextureData{sem::TextureDimension::k2d, true,
+        MslStorageTextureData{ast::TextureDimension::k2d, true,
                               "texture2d<float, access::read>"},
-        MslStorageTextureData{sem::TextureDimension::k2dArray, true,
+        MslStorageTextureData{ast::TextureDimension::k2dArray, true,
                               "texture2d_array<float, access::read>"},
-        MslStorageTextureData{sem::TextureDimension::k3d, true,
+        MslStorageTextureData{ast::TextureDimension::k3d, true,
                               "texture3d<float, access::read>"},
-        MslStorageTextureData{sem::TextureDimension::k1d, false,
+        MslStorageTextureData{ast::TextureDimension::k1d, false,
                               "texture1d<float, access::write>"},
-        MslStorageTextureData{sem::TextureDimension::k2d, false,
+        MslStorageTextureData{ast::TextureDimension::k2d, false,
                               "texture2d<float, access::write>"},
-        MslStorageTextureData{sem::TextureDimension::k2dArray, false,
+        MslStorageTextureData{ast::TextureDimension::k2dArray, false,
                               "texture2d_array<float, access::write>"},
-        MslStorageTextureData{sem::TextureDimension::k3d, false,
+        MslStorageTextureData{ast::TextureDimension::k3d, false,
                               "texture3d<float, access::write>"}));
 
 }  // namespace
diff --git a/src/writer/spirv/builder.cc b/src/writer/spirv/builder.cc
index 8a401a0..60e022a 100644
--- a/src/writer/spirv/builder.cc
+++ b/src/writer/spirv/builder.cc
@@ -2271,22 +2271,22 @@
       std::vector<uint32_t> swizzle;
       uint32_t spirv_dims = 0;
       switch (texture_type->dim()) {
-        case sem::TextureDimension::kNone:
+        case ast::TextureDimension::kNone:
           error_ = "texture dimension is kNone";
           return false;
-        case sem::TextureDimension::k1d:
-        case sem::TextureDimension::k2d:
-        case sem::TextureDimension::k3d:
+        case ast::TextureDimension::k1d:
+        case ast::TextureDimension::k2d:
+        case ast::TextureDimension::k3d:
           break;  // No swizzle needed
-        case sem::TextureDimension::kCube:
+        case ast::TextureDimension::kCube:
           swizzle = {0, 1, 1};  // Duplicate height for depth
           spirv_dims = 2;       // [width, height]
           break;
-        case sem::TextureDimension::k2dArray:
+        case ast::TextureDimension::k2dArray:
           swizzle = {0, 1};  // Strip array index
           spirv_dims = 3;    // [width, height, array_count]
           break;
-        case sem::TextureDimension::kCubeArray:
+        case ast::TextureDimension::kCubeArray:
           swizzle = {0, 1, 1};  // Strip array index, duplicate height for depth
           spirv_dims = 3;       // [width, height, array_count]
           break;
@@ -2319,8 +2319,8 @@
         default:
           error_ = "texture is not arrayed";
           return false;
-        case sem::TextureDimension::k2dArray:
-        case sem::TextureDimension::kCubeArray:
+        case ast::TextureDimension::k2dArray:
+        case ast::TextureDimension::kCubeArray:
           spirv_dims = 3;
           break;
       }
@@ -3010,13 +3010,13 @@
                                   const Operand& result) {
   uint32_t array_literal = 0u;
   const auto dim = texture->dim();
-  if (dim == sem::TextureDimension::k2dArray ||
-      dim == sem::TextureDimension::kCubeArray) {
+  if (dim == ast::TextureDimension::k2dArray ||
+      dim == ast::TextureDimension::kCubeArray) {
     array_literal = 1u;
   }
 
   uint32_t dim_literal = SpvDim2D;
-  if (dim == sem::TextureDimension::k1d) {
+  if (dim == ast::TextureDimension::k1d) {
     dim_literal = SpvDim1D;
     if (texture->Is<sem::SampledTexture>()) {
       push_capability(SpvCapabilitySampled1D);
@@ -3024,11 +3024,11 @@
       push_capability(SpvCapabilityImage1D);
     }
   }
-  if (dim == sem::TextureDimension::k3d) {
+  if (dim == ast::TextureDimension::k3d) {
     dim_literal = SpvDim3D;
   }
-  if (dim == sem::TextureDimension::kCube ||
-      dim == sem::TextureDimension::kCubeArray) {
+  if (dim == ast::TextureDimension::kCube ||
+      dim == ast::TextureDimension::kCubeArray) {
     dim_literal = SpvDimCube;
   }
 
@@ -3048,7 +3048,7 @@
     sampled_literal = 1u;
   }
 
-  if (dim == sem::TextureDimension::kCubeArray) {
+  if (dim == ast::TextureDimension::kCubeArray) {
     if (texture->Is<sem::SampledTexture>() ||
         texture->Is<sem::DepthTexture>()) {
       push_capability(SpvCapabilitySampledCubeArray);
@@ -3321,98 +3321,98 @@
 }
 
 SpvImageFormat Builder::convert_image_format_to_spv(
-    const sem::ImageFormat format) {
+    const ast::ImageFormat format) {
   switch (format) {
-    case sem::ImageFormat::kR8Unorm:
+    case ast::ImageFormat::kR8Unorm:
       push_capability(SpvCapabilityStorageImageExtendedFormats);
       return SpvImageFormatR8;
-    case sem::ImageFormat::kR8Snorm:
+    case ast::ImageFormat::kR8Snorm:
       push_capability(SpvCapabilityStorageImageExtendedFormats);
       return SpvImageFormatR8Snorm;
-    case sem::ImageFormat::kR8Uint:
+    case ast::ImageFormat::kR8Uint:
       push_capability(SpvCapabilityStorageImageExtendedFormats);
       return SpvImageFormatR8ui;
-    case sem::ImageFormat::kR8Sint:
+    case ast::ImageFormat::kR8Sint:
       push_capability(SpvCapabilityStorageImageExtendedFormats);
       return SpvImageFormatR8i;
-    case sem::ImageFormat::kR16Uint:
+    case ast::ImageFormat::kR16Uint:
       push_capability(SpvCapabilityStorageImageExtendedFormats);
       return SpvImageFormatR16ui;
-    case sem::ImageFormat::kR16Sint:
+    case ast::ImageFormat::kR16Sint:
       push_capability(SpvCapabilityStorageImageExtendedFormats);
       return SpvImageFormatR16i;
-    case sem::ImageFormat::kR16Float:
+    case ast::ImageFormat::kR16Float:
       push_capability(SpvCapabilityStorageImageExtendedFormats);
       return SpvImageFormatR16f;
-    case sem::ImageFormat::kRg8Unorm:
+    case ast::ImageFormat::kRg8Unorm:
       push_capability(SpvCapabilityStorageImageExtendedFormats);
       return SpvImageFormatRg8;
-    case sem::ImageFormat::kRg8Snorm:
+    case ast::ImageFormat::kRg8Snorm:
       push_capability(SpvCapabilityStorageImageExtendedFormats);
       return SpvImageFormatRg8Snorm;
-    case sem::ImageFormat::kRg8Uint:
+    case ast::ImageFormat::kRg8Uint:
       push_capability(SpvCapabilityStorageImageExtendedFormats);
       return SpvImageFormatRg8ui;
-    case sem::ImageFormat::kRg8Sint:
+    case ast::ImageFormat::kRg8Sint:
       push_capability(SpvCapabilityStorageImageExtendedFormats);
       return SpvImageFormatRg8i;
-    case sem::ImageFormat::kR32Uint:
+    case ast::ImageFormat::kR32Uint:
       return SpvImageFormatR32ui;
-    case sem::ImageFormat::kR32Sint:
+    case ast::ImageFormat::kR32Sint:
       return SpvImageFormatR32i;
-    case sem::ImageFormat::kR32Float:
+    case ast::ImageFormat::kR32Float:
       return SpvImageFormatR32f;
-    case sem::ImageFormat::kRg16Uint:
+    case ast::ImageFormat::kRg16Uint:
       push_capability(SpvCapabilityStorageImageExtendedFormats);
       return SpvImageFormatRg16ui;
-    case sem::ImageFormat::kRg16Sint:
+    case ast::ImageFormat::kRg16Sint:
       push_capability(SpvCapabilityStorageImageExtendedFormats);
       return SpvImageFormatRg16i;
-    case sem::ImageFormat::kRg16Float:
+    case ast::ImageFormat::kRg16Float:
       push_capability(SpvCapabilityStorageImageExtendedFormats);
       return SpvImageFormatRg16f;
-    case sem::ImageFormat::kRgba8Unorm:
+    case ast::ImageFormat::kRgba8Unorm:
       return SpvImageFormatRgba8;
-    case sem::ImageFormat::kRgba8UnormSrgb:
+    case ast::ImageFormat::kRgba8UnormSrgb:
       return SpvImageFormatUnknown;
-    case sem::ImageFormat::kRgba8Snorm:
+    case ast::ImageFormat::kRgba8Snorm:
       return SpvImageFormatRgba8Snorm;
-    case sem::ImageFormat::kRgba8Uint:
+    case ast::ImageFormat::kRgba8Uint:
       return SpvImageFormatRgba8ui;
-    case sem::ImageFormat::kRgba8Sint:
+    case ast::ImageFormat::kRgba8Sint:
       return SpvImageFormatRgba8i;
-    case sem::ImageFormat::kBgra8Unorm:
+    case ast::ImageFormat::kBgra8Unorm:
       return SpvImageFormatUnknown;
-    case sem::ImageFormat::kBgra8UnormSrgb:
+    case ast::ImageFormat::kBgra8UnormSrgb:
       return SpvImageFormatUnknown;
-    case sem::ImageFormat::kRgb10A2Unorm:
+    case ast::ImageFormat::kRgb10A2Unorm:
       push_capability(SpvCapabilityStorageImageExtendedFormats);
       return SpvImageFormatRgb10A2;
-    case sem::ImageFormat::kRg11B10Float:
+    case ast::ImageFormat::kRg11B10Float:
       push_capability(SpvCapabilityStorageImageExtendedFormats);
       return SpvImageFormatR11fG11fB10f;
-    case sem::ImageFormat::kRg32Uint:
+    case ast::ImageFormat::kRg32Uint:
       push_capability(SpvCapabilityStorageImageExtendedFormats);
       return SpvImageFormatRg32ui;
-    case sem::ImageFormat::kRg32Sint:
+    case ast::ImageFormat::kRg32Sint:
       push_capability(SpvCapabilityStorageImageExtendedFormats);
       return SpvImageFormatRg32i;
-    case sem::ImageFormat::kRg32Float:
+    case ast::ImageFormat::kRg32Float:
       push_capability(SpvCapabilityStorageImageExtendedFormats);
       return SpvImageFormatRg32f;
-    case sem::ImageFormat::kRgba16Uint:
+    case ast::ImageFormat::kRgba16Uint:
       return SpvImageFormatRgba16ui;
-    case sem::ImageFormat::kRgba16Sint:
+    case ast::ImageFormat::kRgba16Sint:
       return SpvImageFormatRgba16i;
-    case sem::ImageFormat::kRgba16Float:
+    case ast::ImageFormat::kRgba16Float:
       return SpvImageFormatRgba16f;
-    case sem::ImageFormat::kRgba32Uint:
+    case ast::ImageFormat::kRgba32Uint:
       return SpvImageFormatRgba32ui;
-    case sem::ImageFormat::kRgba32Sint:
+    case ast::ImageFormat::kRgba32Sint:
       return SpvImageFormatRgba32i;
-    case sem::ImageFormat::kRgba32Float:
+    case ast::ImageFormat::kRgba32Float:
       return SpvImageFormatRgba32f;
-    case sem::ImageFormat::kNone:
+    case ast::ImageFormat::kNone:
       return SpvImageFormatUnknown;
   }
   return SpvImageFormatUnknown;
diff --git a/src/writer/spirv/builder.h b/src/writer/spirv/builder.h
index bea880d..7e45e24 100644
--- a/src/writer/spirv/builder.h
+++ b/src/writer/spirv/builder.h
@@ -473,7 +473,7 @@
   /// Converts AST image format to SPIR-V and pushes an appropriate capability.
   /// @param format AST image format type
   /// @returns SPIR-V image format type
-  SpvImageFormat convert_image_format_to_spv(const sem::ImageFormat format);
+  SpvImageFormat convert_image_format_to_spv(const ast::ImageFormat format);
 
   /// Determines if the given type constructor is created from constant values
   /// @param expr the expression to check
diff --git a/src/writer/spirv/builder_format_conversion_test.cc b/src/writer/spirv/builder_format_conversion_test.cc
index 62fcd23..8bfbb73 100644
--- a/src/writer/spirv/builder_format_conversion_test.cc
+++ b/src/writer/spirv/builder_format_conversion_test.cc
@@ -21,7 +21,7 @@
 namespace {
 
 struct TestData {
-  sem::ImageFormat ast_format;
+  ast::ImageFormat ast_format;
   SpvImageFormat_ spv_format;
   bool extended_format = false;
 };
@@ -51,42 +51,42 @@
     BuilderTest,
     ImageFormatConversionTest,
     testing::Values(
-        TestData{sem::ImageFormat::kR8Unorm, SpvImageFormatR8, true},
-        TestData{sem::ImageFormat::kR8Snorm, SpvImageFormatR8Snorm, true},
-        TestData{sem::ImageFormat::kR8Uint, SpvImageFormatR8ui, true},
-        TestData{sem::ImageFormat::kR8Sint, SpvImageFormatR8i, true},
-        TestData{sem::ImageFormat::kR16Uint, SpvImageFormatR16ui, true},
-        TestData{sem::ImageFormat::kR16Sint, SpvImageFormatR16i, true},
-        TestData{sem::ImageFormat::kR16Float, SpvImageFormatR16f, true},
-        TestData{sem::ImageFormat::kRg8Unorm, SpvImageFormatRg8, true},
-        TestData{sem::ImageFormat::kRg8Snorm, SpvImageFormatRg8Snorm, true},
-        TestData{sem::ImageFormat::kRg8Uint, SpvImageFormatRg8ui, true},
-        TestData{sem::ImageFormat::kRg8Sint, SpvImageFormatRg8i, true},
-        TestData{sem::ImageFormat::kR32Uint, SpvImageFormatR32ui},
-        TestData{sem::ImageFormat::kR32Sint, SpvImageFormatR32i},
-        TestData{sem::ImageFormat::kR32Float, SpvImageFormatR32f},
-        TestData{sem::ImageFormat::kRg16Uint, SpvImageFormatRg16ui, true},
-        TestData{sem::ImageFormat::kRg16Sint, SpvImageFormatRg16i, true},
-        TestData{sem::ImageFormat::kRg16Float, SpvImageFormatRg16f, true},
-        TestData{sem::ImageFormat::kRgba8Unorm, SpvImageFormatRgba8},
-        TestData{sem::ImageFormat::kRgba8UnormSrgb, SpvImageFormatUnknown},
-        TestData{sem::ImageFormat::kRgba8Snorm, SpvImageFormatRgba8Snorm},
-        TestData{sem::ImageFormat::kRgba8Uint, SpvImageFormatRgba8ui},
-        TestData{sem::ImageFormat::kRgba8Sint, SpvImageFormatRgba8i},
-        TestData{sem::ImageFormat::kBgra8Unorm, SpvImageFormatUnknown},
-        TestData{sem::ImageFormat::kBgra8UnormSrgb, SpvImageFormatUnknown},
-        TestData{sem::ImageFormat::kRgb10A2Unorm, SpvImageFormatRgb10A2, true},
-        TestData{sem::ImageFormat::kRg11B10Float, SpvImageFormatR11fG11fB10f,
+        TestData{ast::ImageFormat::kR8Unorm, SpvImageFormatR8, true},
+        TestData{ast::ImageFormat::kR8Snorm, SpvImageFormatR8Snorm, true},
+        TestData{ast::ImageFormat::kR8Uint, SpvImageFormatR8ui, true},
+        TestData{ast::ImageFormat::kR8Sint, SpvImageFormatR8i, true},
+        TestData{ast::ImageFormat::kR16Uint, SpvImageFormatR16ui, true},
+        TestData{ast::ImageFormat::kR16Sint, SpvImageFormatR16i, true},
+        TestData{ast::ImageFormat::kR16Float, SpvImageFormatR16f, true},
+        TestData{ast::ImageFormat::kRg8Unorm, SpvImageFormatRg8, true},
+        TestData{ast::ImageFormat::kRg8Snorm, SpvImageFormatRg8Snorm, true},
+        TestData{ast::ImageFormat::kRg8Uint, SpvImageFormatRg8ui, true},
+        TestData{ast::ImageFormat::kRg8Sint, SpvImageFormatRg8i, true},
+        TestData{ast::ImageFormat::kR32Uint, SpvImageFormatR32ui},
+        TestData{ast::ImageFormat::kR32Sint, SpvImageFormatR32i},
+        TestData{ast::ImageFormat::kR32Float, SpvImageFormatR32f},
+        TestData{ast::ImageFormat::kRg16Uint, SpvImageFormatRg16ui, true},
+        TestData{ast::ImageFormat::kRg16Sint, SpvImageFormatRg16i, true},
+        TestData{ast::ImageFormat::kRg16Float, SpvImageFormatRg16f, true},
+        TestData{ast::ImageFormat::kRgba8Unorm, SpvImageFormatRgba8},
+        TestData{ast::ImageFormat::kRgba8UnormSrgb, SpvImageFormatUnknown},
+        TestData{ast::ImageFormat::kRgba8Snorm, SpvImageFormatRgba8Snorm},
+        TestData{ast::ImageFormat::kRgba8Uint, SpvImageFormatRgba8ui},
+        TestData{ast::ImageFormat::kRgba8Sint, SpvImageFormatRgba8i},
+        TestData{ast::ImageFormat::kBgra8Unorm, SpvImageFormatUnknown},
+        TestData{ast::ImageFormat::kBgra8UnormSrgb, SpvImageFormatUnknown},
+        TestData{ast::ImageFormat::kRgb10A2Unorm, SpvImageFormatRgb10A2, true},
+        TestData{ast::ImageFormat::kRg11B10Float, SpvImageFormatR11fG11fB10f,
                  true},
-        TestData{sem::ImageFormat::kRg32Uint, SpvImageFormatRg32ui, true},
-        TestData{sem::ImageFormat::kRg32Sint, SpvImageFormatRg32i, true},
-        TestData{sem::ImageFormat::kRg32Float, SpvImageFormatRg32f, true},
-        TestData{sem::ImageFormat::kRgba16Uint, SpvImageFormatRgba16ui},
-        TestData{sem::ImageFormat::kRgba16Sint, SpvImageFormatRgba16i},
-        TestData{sem::ImageFormat::kRgba16Float, SpvImageFormatRgba16f},
-        TestData{sem::ImageFormat::kRgba32Uint, SpvImageFormatRgba32ui},
-        TestData{sem::ImageFormat::kRgba32Sint, SpvImageFormatRgba32i},
-        TestData{sem::ImageFormat::kRgba32Float, SpvImageFormatRgba32f}));
+        TestData{ast::ImageFormat::kRg32Uint, SpvImageFormatRg32ui, true},
+        TestData{ast::ImageFormat::kRg32Sint, SpvImageFormatRg32i, true},
+        TestData{ast::ImageFormat::kRg32Float, SpvImageFormatRg32f, true},
+        TestData{ast::ImageFormat::kRgba16Uint, SpvImageFormatRgba16ui},
+        TestData{ast::ImageFormat::kRgba16Sint, SpvImageFormatRgba16i},
+        TestData{ast::ImageFormat::kRgba16Float, SpvImageFormatRgba16f},
+        TestData{ast::ImageFormat::kRgba32Uint, SpvImageFormatRgba32ui},
+        TestData{ast::ImageFormat::kRgba32Sint, SpvImageFormatRgba32i},
+        TestData{ast::ImageFormat::kRgba32Float, SpvImageFormatRgba32f}));
 
 }  // namespace
 }  // namespace spirv
diff --git a/src/writer/spirv/builder_global_variable_test.cc b/src/writer/spirv/builder_global_variable_test.cc
index fad90dd..f3e095b 100644
--- a/src/writer/spirv/builder_global_variable_test.cc
+++ b/src/writer/spirv/builder_global_variable_test.cc
@@ -532,9 +532,9 @@
   // var<uniform_constant> a : [[access(read)]] texture_storage_2d<r32uint>;
 
   auto* subtype =
-      sem::StorageTexture::SubtypeFor(sem::ImageFormat::kR32Uint, Types());
-  auto* type = create<sem::StorageTexture>(sem::TextureDimension::k2d,
-                                           sem::ImageFormat::kR32Uint, subtype);
+      sem::StorageTexture::SubtypeFor(ast::ImageFormat::kR32Uint, Types());
+  auto* type = create<sem::StorageTexture>(ast::TextureDimension::k2d,
+                                           ast::ImageFormat::kR32Uint, subtype);
 
   auto* ac = create<sem::AccessControl>(ast::AccessControl::kReadOnly, type);
 
@@ -557,9 +557,9 @@
   // var<uniform_constant> a : [[access(write)]] texture_storage_2d<r32uint>;
 
   auto* subtype =
-      sem::StorageTexture::SubtypeFor(sem::ImageFormat::kR32Uint, Types());
-  auto* type = create<sem::StorageTexture>(sem::TextureDimension::k2d,
-                                           sem::ImageFormat::kR32Uint, subtype);
+      sem::StorageTexture::SubtypeFor(ast::ImageFormat::kR32Uint, Types());
+  auto* type = create<sem::StorageTexture>(ast::TextureDimension::k2d,
+                                           ast::ImageFormat::kR32Uint, subtype);
   Global("test_var", type, ast::StorageClass::kInput);
 
   auto* ac = create<sem::AccessControl>(ast::AccessControl::kWriteOnly, type);
@@ -586,9 +586,9 @@
   // var<uniform_constant> b : [[access(write)]] texture_storage_2d<r32uint>;
 
   auto* subtype =
-      sem::StorageTexture::SubtypeFor(sem::ImageFormat::kR32Uint, Types());
-  auto* st = create<sem::StorageTexture>(sem::TextureDimension::k2d,
-                                         sem::ImageFormat::kR32Uint, subtype);
+      sem::StorageTexture::SubtypeFor(ast::ImageFormat::kR32Uint, Types());
+  auto* st = create<sem::StorageTexture>(ast::TextureDimension::k2d,
+                                         ast::ImageFormat::kR32Uint, subtype);
 
   Global("test_var", st, ast::StorageClass::kInput);
 
diff --git a/src/writer/spirv/builder_intrinsic_test.cc b/src/writer/spirv/builder_intrinsic_test.cc
index 8e21765..6f539e5 100644
--- a/src/writer/spirv/builder_intrinsic_test.cc
+++ b/src/writer/spirv/builder_intrinsic_test.cc
@@ -370,8 +370,8 @@
 
 // This tests that we do not push OpTypeSampledImage and float_0 type twice.
 TEST_F(IntrinsicBuilderTest, Call_TextureSampleCompare_Twice) {
-  sem::Sampler s(sem::SamplerKind::kComparisonSampler);
-  sem::DepthTexture t(sem::TextureDimension::k2d);
+  sem::Sampler s(ast::SamplerKind::kComparisonSampler);
+  sem::DepthTexture t(ast::TextureDimension::k2d);
 
   auto* tex = Global("texture", &t, ast::StorageClass::kInput);
 
diff --git a/src/writer/spirv/builder_type_test.cc b/src/writer/spirv/builder_type_test.cc
index f445009..23376b2 100644
--- a/src/writer/spirv/builder_type_test.cc
+++ b/src/writer/spirv/builder_type_test.cc
@@ -617,7 +617,7 @@
         PtrData{ast::StorageClass::kFunction, SpvStorageClassFunction}));
 
 TEST_F(BuilderTest_Type, DepthTexture_Generate_2d) {
-  sem::DepthTexture two_d(sem::TextureDimension::k2d);
+  sem::DepthTexture two_d(ast::TextureDimension::k2d);
 
   spirv::Builder& b = Build();
 
@@ -631,7 +631,7 @@
 }
 
 TEST_F(BuilderTest_Type, DepthTexture_Generate_2dArray) {
-  sem::DepthTexture two_d_array(sem::TextureDimension::k2dArray);
+  sem::DepthTexture two_d_array(ast::TextureDimension::k2dArray);
 
   spirv::Builder& b = Build();
 
@@ -645,7 +645,7 @@
 }
 
 TEST_F(BuilderTest_Type, DepthTexture_Generate_Cube) {
-  sem::DepthTexture cube(sem::TextureDimension::kCube);
+  sem::DepthTexture cube(ast::TextureDimension::kCube);
 
   spirv::Builder& b = Build();
 
@@ -660,7 +660,7 @@
 }
 
 TEST_F(BuilderTest_Type, DepthTexture_Generate_CubeArray) {
-  sem::DepthTexture cube_array(sem::TextureDimension::kCubeArray);
+  sem::DepthTexture cube_array(ast::TextureDimension::kCubeArray);
 
   spirv::Builder& b = Build();
 
@@ -677,7 +677,7 @@
 }
 
 TEST_F(BuilderTest_Type, MultisampledTexture_Generate_2d_i32) {
-  sem::MultisampledTexture ms(sem::TextureDimension::k2d, ty.i32());
+  sem::MultisampledTexture ms(ast::TextureDimension::k2d, ty.i32());
 
   spirv::Builder& b = Build();
 
@@ -689,7 +689,7 @@
 }
 
 TEST_F(BuilderTest_Type, MultisampledTexture_Generate_2d_u32) {
-  sem::MultisampledTexture ms(sem::TextureDimension::k2d, ty.u32());
+  sem::MultisampledTexture ms(ast::TextureDimension::k2d, ty.u32());
 
   spirv::Builder& b = Build();
 
@@ -702,7 +702,7 @@
 }
 
 TEST_F(BuilderTest_Type, MultisampledTexture_Generate_2d_f32) {
-  sem::MultisampledTexture ms(sem::TextureDimension::k2d, ty.f32());
+  sem::MultisampledTexture ms(ast::TextureDimension::k2d, ty.f32());
 
   spirv::Builder& b = Build();
 
@@ -715,7 +715,7 @@
 }
 
 TEST_F(BuilderTest_Type, SampledTexture_Generate_1d_i32) {
-  auto* s = create<sem::SampledTexture>(sem::TextureDimension::k1d, ty.i32());
+  auto* s = create<sem::SampledTexture>(ast::TextureDimension::k1d, ty.i32());
 
   spirv::Builder& b = Build();
 
@@ -732,7 +732,7 @@
 }
 
 TEST_F(BuilderTest_Type, SampledTexture_Generate_1d_u32) {
-  auto* s = create<sem::SampledTexture>(sem::TextureDimension::k1d, ty.u32());
+  auto* s = create<sem::SampledTexture>(ast::TextureDimension::k1d, ty.u32());
 
   spirv::Builder& b = Build();
 
@@ -749,7 +749,7 @@
 }
 
 TEST_F(BuilderTest_Type, SampledTexture_Generate_1d_f32) {
-  auto* s = create<sem::SampledTexture>(sem::TextureDimension::k1d, ty.f32());
+  auto* s = create<sem::SampledTexture>(ast::TextureDimension::k1d, ty.f32());
 
   spirv::Builder& b = Build();
 
@@ -766,7 +766,7 @@
 }
 
 TEST_F(BuilderTest_Type, SampledTexture_Generate_2d) {
-  auto* s = create<sem::SampledTexture>(sem::TextureDimension::k2d, ty.f32());
+  auto* s = create<sem::SampledTexture>(ast::TextureDimension::k2d, ty.f32());
 
   spirv::Builder& b = Build();
 
@@ -780,7 +780,7 @@
 
 TEST_F(BuilderTest_Type, SampledTexture_Generate_2d_array) {
   auto* s =
-      create<sem::SampledTexture>(sem::TextureDimension::k2dArray, ty.f32());
+      create<sem::SampledTexture>(ast::TextureDimension::k2dArray, ty.f32());
 
   spirv::Builder& b = Build();
 
@@ -793,7 +793,7 @@
 }
 
 TEST_F(BuilderTest_Type, SampledTexture_Generate_3d) {
-  auto* s = create<sem::SampledTexture>(sem::TextureDimension::k3d, ty.f32());
+  auto* s = create<sem::SampledTexture>(ast::TextureDimension::k3d, ty.f32());
 
   spirv::Builder& b = Build();
 
@@ -806,7 +806,7 @@
 }
 
 TEST_F(BuilderTest_Type, SampledTexture_Generate_Cube) {
-  auto* s = create<sem::SampledTexture>(sem::TextureDimension::kCube, ty.f32());
+  auto* s = create<sem::SampledTexture>(ast::TextureDimension::kCube, ty.f32());
 
   spirv::Builder& b = Build();
 
@@ -821,7 +821,7 @@
 
 TEST_F(BuilderTest_Type, SampledTexture_Generate_CubeArray) {
   auto* s =
-      create<sem::SampledTexture>(sem::TextureDimension::kCubeArray, ty.f32());
+      create<sem::SampledTexture>(ast::TextureDimension::kCubeArray, ty.f32());
 
   spirv::Builder& b = Build();
 
@@ -838,9 +838,9 @@
 
 TEST_F(BuilderTest_Type, StorageTexture_Generate_1d) {
   auto* subtype =
-      sem::StorageTexture::SubtypeFor(sem::ImageFormat::kR32Float, Types());
-  auto* s = create<sem::StorageTexture>(sem::TextureDimension::k1d,
-                                        sem::ImageFormat::kR32Float, subtype);
+      sem::StorageTexture::SubtypeFor(ast::ImageFormat::kR32Float, Types());
+  auto* s = create<sem::StorageTexture>(ast::TextureDimension::k1d,
+                                        ast::ImageFormat::kR32Float, subtype);
 
   Global("test_var", s, ast::StorageClass::kInput);
 
@@ -855,9 +855,9 @@
 
 TEST_F(BuilderTest_Type, StorageTexture_Generate_2d) {
   auto* subtype =
-      sem::StorageTexture::SubtypeFor(sem::ImageFormat::kR32Float, Types());
-  auto* s = create<sem::StorageTexture>(sem::TextureDimension::k2d,
-                                        sem::ImageFormat::kR32Float, subtype);
+      sem::StorageTexture::SubtypeFor(ast::ImageFormat::kR32Float, Types());
+  auto* s = create<sem::StorageTexture>(ast::TextureDimension::k2d,
+                                        ast::ImageFormat::kR32Float, subtype);
 
   Global("test_var", s, ast::StorageClass::kInput);
 
@@ -872,9 +872,9 @@
 
 TEST_F(BuilderTest_Type, StorageTexture_Generate_2dArray) {
   auto* subtype =
-      sem::StorageTexture::SubtypeFor(sem::ImageFormat::kR32Float, Types());
-  auto* s = create<sem::StorageTexture>(sem::TextureDimension::k2dArray,
-                                        sem::ImageFormat::kR32Float, subtype);
+      sem::StorageTexture::SubtypeFor(ast::ImageFormat::kR32Float, Types());
+  auto* s = create<sem::StorageTexture>(ast::TextureDimension::k2dArray,
+                                        ast::ImageFormat::kR32Float, subtype);
 
   Global("test_var", s, ast::StorageClass::kInput);
 
@@ -889,9 +889,9 @@
 
 TEST_F(BuilderTest_Type, StorageTexture_Generate_3d) {
   auto* subtype =
-      sem::StorageTexture::SubtypeFor(sem::ImageFormat::kR32Float, Types());
-  auto* s = create<sem::StorageTexture>(sem::TextureDimension::k3d,
-                                        sem::ImageFormat::kR32Float, subtype);
+      sem::StorageTexture::SubtypeFor(ast::ImageFormat::kR32Float, Types());
+  auto* s = create<sem::StorageTexture>(ast::TextureDimension::k3d,
+                                        ast::ImageFormat::kR32Float, subtype);
 
   Global("test_var", s, ast::StorageClass::kInput);
 
@@ -907,9 +907,9 @@
 TEST_F(BuilderTest_Type,
        StorageTexture_Generate_SampledTypeFloat_Format_r32float) {
   auto* subtype =
-      sem::StorageTexture::SubtypeFor(sem::ImageFormat::kR32Float, Types());
-  auto* s = create<sem::StorageTexture>(sem::TextureDimension::k2d,
-                                        sem::ImageFormat::kR32Float, subtype);
+      sem::StorageTexture::SubtypeFor(ast::ImageFormat::kR32Float, Types());
+  auto* s = create<sem::StorageTexture>(ast::TextureDimension::k2d,
+                                        ast::ImageFormat::kR32Float, subtype);
 
   Global("test_var", s, ast::StorageClass::kInput);
 
@@ -925,9 +925,9 @@
 TEST_F(BuilderTest_Type,
        StorageTexture_Generate_SampledTypeSint_Format_r32sint) {
   auto* subtype =
-      sem::StorageTexture::SubtypeFor(sem::ImageFormat::kR32Sint, Types());
-  auto* s = create<sem::StorageTexture>(sem::TextureDimension::k2d,
-                                        sem::ImageFormat::kR32Sint, subtype);
+      sem::StorageTexture::SubtypeFor(ast::ImageFormat::kR32Sint, Types());
+  auto* s = create<sem::StorageTexture>(ast::TextureDimension::k2d,
+                                        ast::ImageFormat::kR32Sint, subtype);
 
   Global("test_var", s, ast::StorageClass::kInput);
 
@@ -943,9 +943,9 @@
 TEST_F(BuilderTest_Type,
        StorageTexture_Generate_SampledTypeUint_Format_r32uint) {
   auto* subtype =
-      sem::StorageTexture::SubtypeFor(sem::ImageFormat::kR32Uint, Types());
-  auto* s = create<sem::StorageTexture>(sem::TextureDimension::k2d,
-                                        sem::ImageFormat::kR32Uint, subtype);
+      sem::StorageTexture::SubtypeFor(ast::ImageFormat::kR32Uint, Types());
+  auto* s = create<sem::StorageTexture>(ast::TextureDimension::k2d,
+                                        ast::ImageFormat::kR32Uint, subtype);
 
   Global("test_var", s, ast::StorageClass::kInput);
 
@@ -959,7 +959,7 @@
 }
 
 TEST_F(BuilderTest_Type, Sampler) {
-  sem::Sampler sampler(sem::SamplerKind::kSampler);
+  sem::Sampler sampler(ast::SamplerKind::kSampler);
 
   spirv::Builder& b = Build();
 
@@ -969,7 +969,7 @@
 }
 
 TEST_F(BuilderTest_Type, ComparisonSampler) {
-  sem::Sampler sampler(sem::SamplerKind::kComparisonSampler);
+  sem::Sampler sampler(ast::SamplerKind::kComparisonSampler);
 
   spirv::Builder& b = Build();
 
@@ -979,8 +979,8 @@
 }
 
 TEST_F(BuilderTest_Type, Dedup_Sampler_And_ComparisonSampler) {
-  sem::Sampler comp_sampler(sem::SamplerKind::kComparisonSampler);
-  sem::Sampler sampler(sem::SamplerKind::kSampler);
+  sem::Sampler comp_sampler(ast::SamplerKind::kComparisonSampler);
+  sem::Sampler sampler(ast::SamplerKind::kSampler);
 
   spirv::Builder& b = Build();
 
diff --git a/src/writer/wgsl/generator_impl.cc b/src/writer/wgsl/generator_impl.cc
index 101d5da..509a0fb 100644
--- a/src/writer/wgsl/generator_impl.cc
+++ b/src/writer/wgsl/generator_impl.cc
@@ -358,9 +358,9 @@
   return true;
 }
 
-bool GeneratorImpl::EmitImageFormat(const sem::ImageFormat fmt) {
+bool GeneratorImpl::EmitImageFormat(const ast::ImageFormat fmt) {
   switch (fmt) {
-    case sem::ImageFormat::kNone:
+    case ast::ImageFormat::kNone:
       diagnostics_.add_error("unknown image format");
       return false;
     default:
@@ -450,22 +450,22 @@
     }
 
     switch (texture->dim()) {
-      case sem::TextureDimension::k1d:
+      case ast::TextureDimension::k1d:
         out_ << "1d";
         break;
-      case sem::TextureDimension::k2d:
+      case ast::TextureDimension::k2d:
         out_ << "2d";
         break;
-      case sem::TextureDimension::k2dArray:
+      case ast::TextureDimension::k2dArray:
         out_ << "2d_array";
         break;
-      case sem::TextureDimension::k3d:
+      case ast::TextureDimension::k3d:
         out_ << "3d";
         break;
-      case sem::TextureDimension::kCube:
+      case ast::TextureDimension::kCube:
         out_ << "cube";
         break;
-      case sem::TextureDimension::kCubeArray:
+      case ast::TextureDimension::kCubeArray:
         out_ << "cube_array";
         break;
       default:
diff --git a/src/writer/wgsl/generator_impl.h b/src/writer/wgsl/generator_impl.h
index 5ac967f..2d8de45 100644
--- a/src/writer/wgsl/generator_impl.h
+++ b/src/writer/wgsl/generator_impl.h
@@ -180,7 +180,7 @@
   /// Handles emitting an image format
   /// @param fmt the format to generate
   /// @returns true if the format is emitted
-  bool EmitImageFormat(const sem::ImageFormat fmt);
+  bool EmitImageFormat(const ast::ImageFormat fmt);
   /// Handles emitting a type constructor
   /// @param expr the type constructor expression
   /// @returns true if the constructor is emitted
diff --git a/src/writer/wgsl/generator_impl_global_decl_test.cc b/src/writer/wgsl/generator_impl_global_decl_test.cc
index 6dd6ca2..eb17d95 100644
--- a/src/writer/wgsl/generator_impl_global_decl_test.cc
+++ b/src/writer/wgsl/generator_impl_global_decl_test.cc
@@ -101,7 +101,7 @@
 }
 
 TEST_F(WgslGeneratorImplTest, Emit_Global_Sampler) {
-  Global("s", create<sem::Sampler>(sem::SamplerKind::kSampler),
+  Global("s", create<sem::Sampler>(ast::SamplerKind::kSampler),
          ast::StorageClass::kUniformConstant);
 
   GeneratorImpl& gen = Build();
@@ -113,7 +113,7 @@
 }
 
 TEST_F(WgslGeneratorImplTest, Emit_Global_Texture) {
-  auto* st = create<sem::SampledTexture>(sem::TextureDimension::k1d, ty.f32());
+  auto* st = create<sem::SampledTexture>(ast::TextureDimension::k1d, ty.f32());
   Global("t", ty.access(ast::AccessControl::kReadOnly, st),
          ast::StorageClass::kUniformConstant);
 
diff --git a/src/writer/wgsl/generator_impl_type_test.cc b/src/writer/wgsl/generator_impl_type_test.cc
index 8f03f60..10c0979 100644
--- a/src/writer/wgsl/generator_impl_type_test.cc
+++ b/src/writer/wgsl/generator_impl_type_test.cc
@@ -314,7 +314,7 @@
 }
 
 struct TextureData {
-  sem::TextureDimension dim;
+  ast::TextureDimension dim;
   const char* name;
 };
 inline std::ostream& operator<<(std::ostream& out, TextureData data) {
@@ -338,10 +338,10 @@
     WgslGeneratorImplTest,
     WgslGenerator_DepthTextureTest,
     testing::Values(
-        TextureData{sem::TextureDimension::k2d, "texture_depth_2d"},
-        TextureData{sem::TextureDimension::k2dArray, "texture_depth_2d_array"},
-        TextureData{sem::TextureDimension::kCube, "texture_depth_cube"},
-        TextureData{sem::TextureDimension::kCubeArray,
+        TextureData{ast::TextureDimension::k2d, "texture_depth_2d"},
+        TextureData{ast::TextureDimension::k2dArray, "texture_depth_2d_array"},
+        TextureData{ast::TextureDimension::kCube, "texture_depth_cube"},
+        TextureData{ast::TextureDimension::kCubeArray,
                     "texture_depth_cube_array"}));
 
 using WgslGenerator_SampledTextureTest = TestParamHelper<TextureData>;
@@ -384,12 +384,12 @@
     WgslGeneratorImplTest,
     WgslGenerator_SampledTextureTest,
     testing::Values(
-        TextureData{sem::TextureDimension::k1d, "texture_1d"},
-        TextureData{sem::TextureDimension::k2d, "texture_2d"},
-        TextureData{sem::TextureDimension::k2dArray, "texture_2d_array"},
-        TextureData{sem::TextureDimension::k3d, "texture_3d"},
-        TextureData{sem::TextureDimension::kCube, "texture_cube"},
-        TextureData{sem::TextureDimension::kCubeArray, "texture_cube_array"}));
+        TextureData{ast::TextureDimension::k1d, "texture_1d"},
+        TextureData{ast::TextureDimension::k2d, "texture_2d"},
+        TextureData{ast::TextureDimension::k2dArray, "texture_2d_array"},
+        TextureData{ast::TextureDimension::k3d, "texture_3d"},
+        TextureData{ast::TextureDimension::kCube, "texture_cube"},
+        TextureData{ast::TextureDimension::kCubeArray, "texture_cube_array"}));
 
 using WgslGenerator_MultiampledTextureTest = TestParamHelper<TextureData>;
 TEST_P(WgslGenerator_MultiampledTextureTest, EmitType_MultisampledTexture_F32) {
@@ -430,12 +430,12 @@
 INSTANTIATE_TEST_SUITE_P(WgslGeneratorImplTest,
                          WgslGenerator_MultiampledTextureTest,
                          testing::Values(TextureData{
-                             sem::TextureDimension::k2d,
+                             ast::TextureDimension::k2d,
                              "texture_multisampled_2d"}));
 
 struct StorageTextureData {
-  sem::ImageFormat fmt;
-  sem::TextureDimension dim;
+  ast::ImageFormat fmt;
+  ast::TextureDimension dim;
   ast::AccessControl::Access access;
   const char* name;
 };
@@ -460,41 +460,41 @@
     WgslGeneratorImplTest,
     WgslGenerator_StorageTextureTest,
     testing::Values(
-        StorageTextureData{sem::ImageFormat::kR8Unorm,
-                           sem::TextureDimension::k1d,
+        StorageTextureData{ast::ImageFormat::kR8Unorm,
+                           ast::TextureDimension::k1d,
                            ast::AccessControl::kReadOnly,
                            "[[access(read)]] texture_storage_1d<r8unorm>"},
-        StorageTextureData{sem::ImageFormat::kR8Unorm,
-                           sem::TextureDimension::k2d,
+        StorageTextureData{ast::ImageFormat::kR8Unorm,
+                           ast::TextureDimension::k2d,
                            ast::AccessControl::kReadOnly,
                            "[[access(read)]] texture_storage_2d<r8unorm>"},
         StorageTextureData{
-            sem::ImageFormat::kR8Unorm, sem::TextureDimension::k2dArray,
+            ast::ImageFormat::kR8Unorm, ast::TextureDimension::k2dArray,
             ast::AccessControl::kReadOnly,
             "[[access(read)]] texture_storage_2d_array<r8unorm>"},
-        StorageTextureData{sem::ImageFormat::kR8Unorm,
-                           sem::TextureDimension::k3d,
+        StorageTextureData{ast::ImageFormat::kR8Unorm,
+                           ast::TextureDimension::k3d,
                            ast::AccessControl::kReadOnly,
                            "[[access(read)]] texture_storage_3d<r8unorm>"},
-        StorageTextureData{sem::ImageFormat::kR8Unorm,
-                           sem::TextureDimension::k1d,
+        StorageTextureData{ast::ImageFormat::kR8Unorm,
+                           ast::TextureDimension::k1d,
                            ast::AccessControl::kWriteOnly,
                            "[[access(write)]] texture_storage_1d<r8unorm>"},
-        StorageTextureData{sem::ImageFormat::kR8Unorm,
-                           sem::TextureDimension::k2d,
+        StorageTextureData{ast::ImageFormat::kR8Unorm,
+                           ast::TextureDimension::k2d,
                            ast::AccessControl::kWriteOnly,
                            "[[access(write)]] texture_storage_2d<r8unorm>"},
         StorageTextureData{
-            sem::ImageFormat::kR8Unorm, sem::TextureDimension::k2dArray,
+            ast::ImageFormat::kR8Unorm, ast::TextureDimension::k2dArray,
             ast::AccessControl::kWriteOnly,
             "[[access(write)]] texture_storage_2d_array<r8unorm>"},
-        StorageTextureData{sem::ImageFormat::kR8Unorm,
-                           sem::TextureDimension::k3d,
+        StorageTextureData{ast::ImageFormat::kR8Unorm,
+                           ast::TextureDimension::k3d,
                            ast::AccessControl::kWriteOnly,
                            "[[access(write)]] texture_storage_3d<r8unorm>"}));
 
 struct ImageFormatData {
-  sem::ImageFormat fmt;
+  ast::ImageFormat fmt;
   const char* name;
 };
 inline std::ostream& operator<<(std::ostream& out, ImageFormatData data) {
@@ -515,44 +515,44 @@
     WgslGeneratorImplTest,
     WgslGenerator_ImageFormatTest,
     testing::Values(
-        ImageFormatData{sem::ImageFormat::kR8Unorm, "r8unorm"},
-        ImageFormatData{sem::ImageFormat::kR8Snorm, "r8snorm"},
-        ImageFormatData{sem::ImageFormat::kR8Uint, "r8uint"},
-        ImageFormatData{sem::ImageFormat::kR8Sint, "r8sint"},
-        ImageFormatData{sem::ImageFormat::kR16Uint, "r16uint"},
-        ImageFormatData{sem::ImageFormat::kR16Sint, "r16sint"},
-        ImageFormatData{sem::ImageFormat::kR16Float, "r16float"},
-        ImageFormatData{sem::ImageFormat::kRg8Unorm, "rg8unorm"},
-        ImageFormatData{sem::ImageFormat::kRg8Snorm, "rg8snorm"},
-        ImageFormatData{sem::ImageFormat::kRg8Uint, "rg8uint"},
-        ImageFormatData{sem::ImageFormat::kRg8Sint, "rg8sint"},
-        ImageFormatData{sem::ImageFormat::kR32Uint, "r32uint"},
-        ImageFormatData{sem::ImageFormat::kR32Sint, "r32sint"},
-        ImageFormatData{sem::ImageFormat::kR32Float, "r32float"},
-        ImageFormatData{sem::ImageFormat::kRg16Uint, "rg16uint"},
-        ImageFormatData{sem::ImageFormat::kRg16Sint, "rg16sint"},
-        ImageFormatData{sem::ImageFormat::kRg16Float, "rg16float"},
-        ImageFormatData{sem::ImageFormat::kRgba8Unorm, "rgba8unorm"},
-        ImageFormatData{sem::ImageFormat::kRgba8UnormSrgb, "rgba8unorm_srgb"},
-        ImageFormatData{sem::ImageFormat::kRgba8Snorm, "rgba8snorm"},
-        ImageFormatData{sem::ImageFormat::kRgba8Uint, "rgba8uint"},
-        ImageFormatData{sem::ImageFormat::kRgba8Sint, "rgba8sint"},
-        ImageFormatData{sem::ImageFormat::kBgra8Unorm, "bgra8unorm"},
-        ImageFormatData{sem::ImageFormat::kBgra8UnormSrgb, "bgra8unorm_srgb"},
-        ImageFormatData{sem::ImageFormat::kRgb10A2Unorm, "rgb10a2unorm"},
-        ImageFormatData{sem::ImageFormat::kRg11B10Float, "rg11b10float"},
-        ImageFormatData{sem::ImageFormat::kRg32Uint, "rg32uint"},
-        ImageFormatData{sem::ImageFormat::kRg32Sint, "rg32sint"},
-        ImageFormatData{sem::ImageFormat::kRg32Float, "rg32float"},
-        ImageFormatData{sem::ImageFormat::kRgba16Uint, "rgba16uint"},
-        ImageFormatData{sem::ImageFormat::kRgba16Sint, "rgba16sint"},
-        ImageFormatData{sem::ImageFormat::kRgba16Float, "rgba16float"},
-        ImageFormatData{sem::ImageFormat::kRgba32Uint, "rgba32uint"},
-        ImageFormatData{sem::ImageFormat::kRgba32Sint, "rgba32sint"},
-        ImageFormatData{sem::ImageFormat::kRgba32Float, "rgba32float"}));
+        ImageFormatData{ast::ImageFormat::kR8Unorm, "r8unorm"},
+        ImageFormatData{ast::ImageFormat::kR8Snorm, "r8snorm"},
+        ImageFormatData{ast::ImageFormat::kR8Uint, "r8uint"},
+        ImageFormatData{ast::ImageFormat::kR8Sint, "r8sint"},
+        ImageFormatData{ast::ImageFormat::kR16Uint, "r16uint"},
+        ImageFormatData{ast::ImageFormat::kR16Sint, "r16sint"},
+        ImageFormatData{ast::ImageFormat::kR16Float, "r16float"},
+        ImageFormatData{ast::ImageFormat::kRg8Unorm, "rg8unorm"},
+        ImageFormatData{ast::ImageFormat::kRg8Snorm, "rg8snorm"},
+        ImageFormatData{ast::ImageFormat::kRg8Uint, "rg8uint"},
+        ImageFormatData{ast::ImageFormat::kRg8Sint, "rg8sint"},
+        ImageFormatData{ast::ImageFormat::kR32Uint, "r32uint"},
+        ImageFormatData{ast::ImageFormat::kR32Sint, "r32sint"},
+        ImageFormatData{ast::ImageFormat::kR32Float, "r32float"},
+        ImageFormatData{ast::ImageFormat::kRg16Uint, "rg16uint"},
+        ImageFormatData{ast::ImageFormat::kRg16Sint, "rg16sint"},
+        ImageFormatData{ast::ImageFormat::kRg16Float, "rg16float"},
+        ImageFormatData{ast::ImageFormat::kRgba8Unorm, "rgba8unorm"},
+        ImageFormatData{ast::ImageFormat::kRgba8UnormSrgb, "rgba8unorm_srgb"},
+        ImageFormatData{ast::ImageFormat::kRgba8Snorm, "rgba8snorm"},
+        ImageFormatData{ast::ImageFormat::kRgba8Uint, "rgba8uint"},
+        ImageFormatData{ast::ImageFormat::kRgba8Sint, "rgba8sint"},
+        ImageFormatData{ast::ImageFormat::kBgra8Unorm, "bgra8unorm"},
+        ImageFormatData{ast::ImageFormat::kBgra8UnormSrgb, "bgra8unorm_srgb"},
+        ImageFormatData{ast::ImageFormat::kRgb10A2Unorm, "rgb10a2unorm"},
+        ImageFormatData{ast::ImageFormat::kRg11B10Float, "rg11b10float"},
+        ImageFormatData{ast::ImageFormat::kRg32Uint, "rg32uint"},
+        ImageFormatData{ast::ImageFormat::kRg32Sint, "rg32sint"},
+        ImageFormatData{ast::ImageFormat::kRg32Float, "rg32float"},
+        ImageFormatData{ast::ImageFormat::kRgba16Uint, "rgba16uint"},
+        ImageFormatData{ast::ImageFormat::kRgba16Sint, "rgba16sint"},
+        ImageFormatData{ast::ImageFormat::kRgba16Float, "rgba16float"},
+        ImageFormatData{ast::ImageFormat::kRgba32Uint, "rgba32uint"},
+        ImageFormatData{ast::ImageFormat::kRgba32Sint, "rgba32sint"},
+        ImageFormatData{ast::ImageFormat::kRgba32Float, "rgba32float"}));
 
 TEST_F(WgslGeneratorImplTest, EmitType_Sampler) {
-  auto* sampler = create<sem::Sampler>(sem::SamplerKind::kSampler);
+  auto* sampler = create<sem::Sampler>(ast::SamplerKind::kSampler);
   AST().AddConstructedType(ty.alias("make_type_reachable", sampler));
 
   GeneratorImpl& gen = Build();
@@ -562,7 +562,7 @@
 }
 
 TEST_F(WgslGeneratorImplTest, EmitType_SamplerComparison) {
-  auto* sampler = create<sem::Sampler>(sem::SamplerKind::kComparisonSampler);
+  auto* sampler = create<sem::Sampler>(ast::SamplerKind::kComparisonSampler);
   AST().AddConstructedType(ty.alias("make_type_reachable", sampler));
 
   GeneratorImpl& gen = Build();