writer/hlsl: Move the renamer into the sanitizer transform

The renamer logic in the HLSL writer was inconsistent, and actually
broke some valid shaders.

Change-Id: I8fbddc7e657f5509b18435fdf352a39d83c1b89c
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/47224
Commit-Queue: Ben Clayton <bclayton@google.com>
Reviewed-by: James Price <jrprice@google.com>
diff --git a/src/BUILD.gn b/src/BUILD.gn
index 8c197e2..2e27469 100644
--- a/src/BUILD.gn
+++ b/src/BUILD.gn
@@ -646,8 +646,6 @@
     "writer/hlsl/generator.h",
     "writer/hlsl/generator_impl.cc",
     "writer/hlsl/generator_impl.h",
-    "writer/hlsl/namer.cc",
-    "writer/hlsl/namer.h",
   ]
 
   configs += [ ":tint_common_config" ]
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 91567fc..4852f94 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -383,8 +383,6 @@
     writer/hlsl/generator.h
     writer/hlsl/generator_impl.cc
     writer/hlsl/generator_impl.h
-    writer/hlsl/namer.cc
-    writer/hlsl/namer.h
   )
 endif()
 
@@ -812,7 +810,6 @@
       writer/hlsl/generator_impl_unary_op_test.cc
       writer/hlsl/generator_impl_variable_decl_statement_test.cc
       writer/hlsl/generator_impl_workgroup_var_test.cc
-      writer/hlsl/namer_test.cc
       writer/hlsl/test_helper.cc
       writer/hlsl/test_helper.h
     )
diff --git a/src/transform/hlsl.cc b/src/transform/hlsl.cc
index d2af505..0da3013 100644
--- a/src/transform/hlsl.cc
+++ b/src/transform/hlsl.cc
@@ -30,6 +30,575 @@
 namespace tint {
 namespace transform {
 
+namespace {
+
+// This list is used for a binary search and must be kept in sorted order.
+const char* kReservedKeywords[] = {"AddressU",
+                                   "AddressV",
+                                   "AddressW",
+                                   "AllMemoryBarrier",
+                                   "AllMemoryBarrierWithGroupSync",
+                                   "AppendStructuredBuffer",
+                                   "BINORMAL",
+                                   "BLENDINDICES",
+                                   "BLENDWEIGHT",
+                                   "BlendState",
+                                   "BorderColor",
+                                   "Buffer",
+                                   "ByteAddressBuffer",
+                                   "COLOR",
+                                   "CheckAccessFullyMapped",
+                                   "ComparisonFunc",
+                                   "CompileShader",
+                                   "ComputeShader",
+                                   "ConsumeStructuredBuffer",
+                                   "D3DCOLORtoUBYTE4",
+                                   "DEPTH",
+                                   "DepthStencilState",
+                                   "DepthStencilView",
+                                   "DeviceMemoryBarrier",
+                                   "DeviceMemroyBarrierWithGroupSync",
+                                   "DomainShader",
+                                   "EvaluateAttributeAtCentroid",
+                                   "EvaluateAttributeAtSample",
+                                   "EvaluateAttributeSnapped",
+                                   "FOG",
+                                   "Filter",
+                                   "GeometryShader",
+                                   "GetRenderTargetSampleCount",
+                                   "GetRenderTargetSamplePosition",
+                                   "GroupMemoryBarrier",
+                                   "GroupMemroyBarrierWithGroupSync",
+                                   "Hullshader",
+                                   "InputPatch",
+                                   "InterlockedAdd",
+                                   "InterlockedAnd",
+                                   "InterlockedCompareExchange",
+                                   "InterlockedCompareStore",
+                                   "InterlockedExchange",
+                                   "InterlockedMax",
+                                   "InterlockedMin",
+                                   "InterlockedOr",
+                                   "InterlockedXor",
+                                   "LineStream",
+                                   "MaxAnisotropy",
+                                   "MaxLOD",
+                                   "MinLOD",
+                                   "MipLODBias",
+                                   "NORMAL",
+                                   "NULL",
+                                   "Normal",
+                                   "OutputPatch",
+                                   "POSITION",
+                                   "POSITIONT",
+                                   "PSIZE",
+                                   "PixelShader",
+                                   "PointStream",
+                                   "Process2DQuadTessFactorsAvg",
+                                   "Process2DQuadTessFactorsMax",
+                                   "Process2DQuadTessFactorsMin",
+                                   "ProcessIsolineTessFactors",
+                                   "ProcessQuadTessFactorsAvg",
+                                   "ProcessQuadTessFactorsMax",
+                                   "ProcessQuadTessFactorsMin",
+                                   "ProcessTriTessFactorsAvg",
+                                   "ProcessTriTessFactorsMax",
+                                   "ProcessTriTessFactorsMin",
+                                   "RWBuffer",
+                                   "RWByteAddressBuffer",
+                                   "RWStructuredBuffer",
+                                   "RWTexture1D",
+                                   "RWTexture2D",
+                                   "RWTexture2DArray",
+                                   "RWTexture3D",
+                                   "RasterizerState",
+                                   "RenderTargetView",
+                                   "SV_ClipDistance",
+                                   "SV_Coverage",
+                                   "SV_CullDistance",
+                                   "SV_Depth",
+                                   "SV_DepthGreaterEqual",
+                                   "SV_DepthLessEqual",
+                                   "SV_DispatchThreadID",
+                                   "SV_DomainLocation",
+                                   "SV_GSInstanceID",
+                                   "SV_GroupID",
+                                   "SV_GroupIndex",
+                                   "SV_GroupThreadID",
+                                   "SV_InnerCoverage",
+                                   "SV_InsideTessFactor",
+                                   "SV_InstanceID",
+                                   "SV_IsFrontFace",
+                                   "SV_OutputControlPointID",
+                                   "SV_Position",
+                                   "SV_PrimitiveID",
+                                   "SV_RenderTargetArrayIndex",
+                                   "SV_SampleIndex",
+                                   "SV_StencilRef",
+                                   "SV_Target",
+                                   "SV_TessFactor",
+                                   "SV_VertexArrayIndex",
+                                   "SV_VertexID",
+                                   "Sampler",
+                                   "Sampler1D",
+                                   "Sampler2D",
+                                   "Sampler3D",
+                                   "SamplerCUBE",
+                                   "StructuredBuffer",
+                                   "TANGENT",
+                                   "TESSFACTOR",
+                                   "TEXCOORD",
+                                   "Texcoord",
+                                   "Texture",
+                                   "Texture1D",
+                                   "Texture2D",
+                                   "Texture2DArray",
+                                   "Texture2DMS",
+                                   "Texture2DMSArray",
+                                   "Texture3D",
+                                   "TextureCube",
+                                   "TextureCubeArray",
+                                   "TriangleStream",
+                                   "VFACE",
+                                   "VPOS",
+                                   "VertexShader",
+                                   "abort",
+                                   "allow_uav_condition",
+                                   "asdouble",
+                                   "asfloat",
+                                   "asint",
+                                   "asm",
+                                   "asm_fragment",
+                                   "asuint",
+                                   "auto",
+                                   "bool",
+                                   "bool1",
+                                   "bool1x1",
+                                   "bool1x2",
+                                   "bool1x3",
+                                   "bool1x4",
+                                   "bool2",
+                                   "bool2x1",
+                                   "bool2x2",
+                                   "bool2x3",
+                                   "bool2x4",
+                                   "bool3",
+                                   "bool3x1",
+                                   "bool3x2",
+                                   "bool3x3",
+                                   "bool3x4",
+                                   "bool4",
+                                   "bool4x1",
+                                   "bool4x2",
+                                   "bool4x3",
+                                   "bool4x4",
+                                   "branch",
+                                   "break",
+                                   "call",
+                                   "case",
+                                   "catch",
+                                   "cbuffer",
+                                   "centroid",
+                                   "char",
+                                   "class",
+                                   "clip",
+                                   "column_major",
+                                   "compile_fragment",
+                                   "const",
+                                   "const_cast",
+                                   "continue",
+                                   "countbits",
+                                   "ddx",
+                                   "ddx_coarse",
+                                   "ddx_fine",
+                                   "ddy",
+                                   "ddy_coarse",
+                                   "ddy_fine",
+                                   "degrees",
+                                   "delete",
+                                   "discard",
+                                   "do",
+                                   "double",
+                                   "double1",
+                                   "double1x1",
+                                   "double1x2",
+                                   "double1x3",
+                                   "double1x4",
+                                   "double2",
+                                   "double2x1",
+                                   "double2x2",
+                                   "double2x3",
+                                   "double2x4",
+                                   "double3",
+                                   "double3x1",
+                                   "double3x2",
+                                   "double3x3",
+                                   "double3x4",
+                                   "double4",
+                                   "double4x1",
+                                   "double4x2",
+                                   "double4x3",
+                                   "double4x4",
+                                   "dst",
+                                   "dword",
+                                   "dword1",
+                                   "dword1x1",
+                                   "dword1x2",
+                                   "dword1x3",
+                                   "dword1x4",
+                                   "dword2",
+                                   "dword2x1",
+                                   "dword2x2",
+                                   "dword2x3",
+                                   "dword2x4",
+                                   "dword3",
+                                   "dword3x1",
+                                   "dword3x2",
+                                   "dword3x3",
+                                   "dword3x4",
+                                   "dword4",
+                                   "dword4x1",
+                                   "dword4x2",
+                                   "dword4x3",
+                                   "dword4x4",
+                                   "dynamic_cast",
+                                   "else",
+                                   "enum",
+                                   "errorf",
+                                   "explicit",
+                                   "export",
+                                   "extern",
+                                   "f16to32",
+                                   "f32tof16",
+                                   "false",
+                                   "fastopt",
+                                   "firstbithigh",
+                                   "firstbitlow",
+                                   "flatten",
+                                   "float",
+                                   "float1",
+                                   "float1x1",
+                                   "float1x2",
+                                   "float1x3",
+                                   "float1x4",
+                                   "float2",
+                                   "float2x1",
+                                   "float2x2",
+                                   "float2x3",
+                                   "float2x4",
+                                   "float3",
+                                   "float3x1",
+                                   "float3x2",
+                                   "float3x3",
+                                   "float3x4",
+                                   "float4",
+                                   "float4x1",
+                                   "float4x2",
+                                   "float4x3",
+                                   "float4x4",
+                                   "fmod",
+                                   "for",
+                                   "forcecase",
+                                   "frac",
+                                   "friend",
+                                   "fxgroup",
+                                   "goto",
+                                   "groupshared",
+                                   "half",
+                                   "half1",
+                                   "half1x1",
+                                   "half1x2",
+                                   "half1x3",
+                                   "half1x4",
+                                   "half2",
+                                   "half2x1",
+                                   "half2x2",
+                                   "half2x3",
+                                   "half2x4",
+                                   "half3",
+                                   "half3x1",
+                                   "half3x2",
+                                   "half3x3",
+                                   "half3x4",
+                                   "half4",
+                                   "half4x1",
+                                   "half4x2",
+                                   "half4x3",
+                                   "half4x4",
+                                   "if",
+                                   "in",
+                                   "inline",
+                                   "inout",
+                                   "int",
+                                   "int1",
+                                   "int1x1",
+                                   "int1x2",
+                                   "int1x3",
+                                   "int1x4",
+                                   "int2",
+                                   "int2x1",
+                                   "int2x2",
+                                   "int2x3",
+                                   "int2x4",
+                                   "int3",
+                                   "int3x1",
+                                   "int3x2",
+                                   "int3x3",
+                                   "int3x4",
+                                   "int4",
+                                   "int4x1",
+                                   "int4x2",
+                                   "int4x3",
+                                   "int4x4",
+                                   "interface",
+                                   "isfinite",
+                                   "isinf",
+                                   "isnan",
+                                   "lerp",
+                                   "lineadj",
+                                   "linear",
+                                   "lit",
+                                   "log10",
+                                   "long",
+                                   "loop",
+                                   "mad",
+                                   "matrix",
+                                   "min10float",
+                                   "min10float1",
+                                   "min10float1x1",
+                                   "min10float1x2",
+                                   "min10float1x3",
+                                   "min10float1x4",
+                                   "min10float2",
+                                   "min10float2x1",
+                                   "min10float2x2",
+                                   "min10float2x3",
+                                   "min10float2x4",
+                                   "min10float3",
+                                   "min10float3x1",
+                                   "min10float3x2",
+                                   "min10float3x3",
+                                   "min10float3x4",
+                                   "min10float4",
+                                   "min10float4x1",
+                                   "min10float4x2",
+                                   "min10float4x3",
+                                   "min10float4x4",
+                                   "min12int",
+                                   "min12int1",
+                                   "min12int1x1",
+                                   "min12int1x2",
+                                   "min12int1x3",
+                                   "min12int1x4",
+                                   "min12int2",
+                                   "min12int2x1",
+                                   "min12int2x2",
+                                   "min12int2x3",
+                                   "min12int2x4",
+                                   "min12int3",
+                                   "min12int3x1",
+                                   "min12int3x2",
+                                   "min12int3x3",
+                                   "min12int3x4",
+                                   "min12int4",
+                                   "min12int4x1",
+                                   "min12int4x2",
+                                   "min12int4x3",
+                                   "min12int4x4",
+                                   "min16float",
+                                   "min16float1",
+                                   "min16float1x1",
+                                   "min16float1x2",
+                                   "min16float1x3",
+                                   "min16float1x4",
+                                   "min16float2",
+                                   "min16float2x1",
+                                   "min16float2x2",
+                                   "min16float2x3",
+                                   "min16float2x4",
+                                   "min16float3",
+                                   "min16float3x1",
+                                   "min16float3x2",
+                                   "min16float3x3",
+                                   "min16float3x4",
+                                   "min16float4",
+                                   "min16float4x1",
+                                   "min16float4x2",
+                                   "min16float4x3",
+                                   "min16float4x4",
+                                   "min16int",
+                                   "min16int1",
+                                   "min16int1x1",
+                                   "min16int1x2",
+                                   "min16int1x3",
+                                   "min16int1x4",
+                                   "min16int2",
+                                   "min16int2x1",
+                                   "min16int2x2",
+                                   "min16int2x3",
+                                   "min16int2x4",
+                                   "min16int3",
+                                   "min16int3x1",
+                                   "min16int3x2",
+                                   "min16int3x3",
+                                   "min16int3x4",
+                                   "min16int4",
+                                   "min16int4x1",
+                                   "min16int4x2",
+                                   "min16int4x3",
+                                   "min16int4x4",
+                                   "min16uint",
+                                   "min16uint1",
+                                   "min16uint1x1",
+                                   "min16uint1x2",
+                                   "min16uint1x3",
+                                   "min16uint1x4",
+                                   "min16uint2",
+                                   "min16uint2x1",
+                                   "min16uint2x2",
+                                   "min16uint2x3",
+                                   "min16uint2x4",
+                                   "min16uint3",
+                                   "min16uint3x1",
+                                   "min16uint3x2",
+                                   "min16uint3x3",
+                                   "min16uint3x4",
+                                   "min16uint4",
+                                   "min16uint4x1",
+                                   "min16uint4x2",
+                                   "min16uint4x3",
+                                   "min16uint4x4",
+                                   "msad4",
+                                   "mul",
+                                   "mutable",
+                                   "namespace",
+                                   "new",
+                                   "nointerpolation",
+                                   "noise",
+                                   "noperspective",
+                                   "numthreads",
+                                   "operator",
+                                   "out",
+                                   "packoffset",
+                                   "pass",
+                                   "pixelfragment",
+                                   "pixelshader",
+                                   "point",
+                                   "precise",
+                                   "printf",
+                                   "private",
+                                   "protected",
+                                   "public",
+                                   "radians",
+                                   "rcp",
+                                   "refract",
+                                   "register",
+                                   "reinterpret_cast",
+                                   "return",
+                                   "row_major",
+                                   "rsqrt",
+                                   "sample",
+                                   "sampler",
+                                   "sampler1D",
+                                   "sampler2D",
+                                   "sampler3D",
+                                   "samplerCUBE",
+                                   "sampler_state",
+                                   "saturate",
+                                   "shared",
+                                   "short",
+                                   "signed",
+                                   "sincos",
+                                   "sizeof",
+                                   "snorm",
+                                   "stateblock",
+                                   "stateblock_state",
+                                   "static",
+                                   "static_cast",
+                                   "string",
+                                   "struct",
+                                   "switch",
+                                   "tbuffer",
+                                   "technique",
+                                   "technique10",
+                                   "technique11",
+                                   "template",
+                                   "tex1D",
+                                   "tex1Dbias",
+                                   "tex1Dgrad",
+                                   "tex1Dlod",
+                                   "tex1Dproj",
+                                   "tex2D",
+                                   "tex2Dbias",
+                                   "tex2Dgrad",
+                                   "tex2Dlod",
+                                   "tex2Dproj",
+                                   "tex3D",
+                                   "tex3Dbias",
+                                   "tex3Dgrad",
+                                   "tex3Dlod",
+                                   "tex3Dproj",
+                                   "texCUBE",
+                                   "texCUBEbias",
+                                   "texCUBEgrad",
+                                   "texCUBElod",
+                                   "texCUBEproj",
+                                   "texture",
+                                   "texture1D",
+                                   "texture1DArray",
+                                   "texture2D",
+                                   "texture2DArray",
+                                   "texture2DMS",
+                                   "texture2DMSArray",
+                                   "texture3D",
+                                   "textureCube",
+                                   "textureCubeArray",
+                                   "this",
+                                   "throw",
+                                   "transpose",
+                                   "triangle",
+                                   "triangleadj",
+                                   "true",
+                                   "try",
+                                   "typedef",
+                                   "typename",
+                                   "uint",
+                                   "uint1",
+                                   "uint1x1",
+                                   "uint1x2",
+                                   "uint1x3",
+                                   "uint1x4",
+                                   "uint2",
+                                   "uint2x1",
+                                   "uint2x2",
+                                   "uint2x3",
+                                   "uint2x4",
+                                   "uint3",
+                                   "uint3x1",
+                                   "uint3x2",
+                                   "uint3x3",
+                                   "uint3x4",
+                                   "uint4",
+                                   "uint4x1",
+                                   "uint4x2",
+                                   "uint4x3",
+                                   "uint4x4",
+                                   "uniform",
+                                   "union",
+                                   "unorm",
+                                   "unroll",
+                                   "unsigned",
+                                   "using",
+                                   "vector",
+                                   "vertexfragment",
+                                   "vertexshader",
+                                   "virtual",
+                                   "void",
+                                   "volatile",
+                                   "while"};
+
+}  // namespace
+
 Hlsl::Hlsl() = default;
 Hlsl::~Hlsl() = default;
 
@@ -47,6 +616,7 @@
   CloneContext ctx(&builder, &out.program);
   PromoteInitializersToConstVar(ctx);
   AddEmptyEntryPoint(ctx);
+  RenameReservedKeywords(&ctx, kReservedKeywords);
   ctx.Clone();
   return Output{Program(std::move(builder))};
 }
diff --git a/src/transform/hlsl_test.cc b/src/transform/hlsl_test.cc
index 75f2390..fc5567e 100644
--- a/src/transform/hlsl_test.cc
+++ b/src/transform/hlsl_test.cc
@@ -14,6 +14,8 @@
 
 #include "src/transform/hlsl.h"
 
+#include <string>
+
 #include "src/transform/test_helper.h"
 
 namespace tint {
@@ -291,6 +293,639 @@
   EXPECT_EQ(expect, str(got));
 }
 
+using HlslReservedKeywordTest = TransformTestWithParam<std::string>;
+
+TEST_P(HlslReservedKeywordTest, Keywords) {
+  auto keyword = GetParam();
+
+  auto src = R"(
+[[stage(fragment)]]
+fn main() {
+  var )" + keyword +
+             R"( : i32;
+}
+)";
+
+  auto expect = R"(
+[[stage(fragment)]]
+fn main() {
+  var _tint_)" + keyword +
+                R"( : i32;
+}
+)";
+
+  auto got = Run<Hlsl>(src);
+
+  EXPECT_EQ(expect, str(got));
+}
+INSTANTIATE_TEST_SUITE_P(HlslReservedKeywordTest,
+                         HlslReservedKeywordTest,
+                         testing::Values("AddressU",
+                                         "AddressV",
+                                         "AddressW",
+                                         "AllMemoryBarrier",
+                                         "AllMemoryBarrierWithGroupSync",
+                                         "AppendStructuredBuffer",
+                                         "BINORMAL",
+                                         "BLENDINDICES",
+                                         "BLENDWEIGHT",
+                                         "BlendState",
+                                         "BorderColor",
+                                         "Buffer",
+                                         "ByteAddressBuffer",
+                                         "COLOR",
+                                         "CheckAccessFullyMapped",
+                                         "ComparisonFunc",
+                                         "CompileShader",
+                                         "ComputeShader",
+                                         "ConsumeStructuredBuffer",
+                                         "D3DCOLORtoUBYTE4",
+                                         "DEPTH",
+                                         "DepthStencilState",
+                                         "DepthStencilView",
+                                         "DeviceMemoryBarrier",
+                                         "DeviceMemroyBarrierWithGroupSync",
+                                         "DomainShader",
+                                         "EvaluateAttributeAtCentroid",
+                                         "EvaluateAttributeAtSample",
+                                         "EvaluateAttributeSnapped",
+                                         "FOG",
+                                         "Filter",
+                                         "GeometryShader",
+                                         "GetRenderTargetSampleCount",
+                                         "GetRenderTargetSamplePosition",
+                                         "GroupMemoryBarrier",
+                                         "GroupMemroyBarrierWithGroupSync",
+                                         "Hullshader",
+                                         "InputPatch",
+                                         "InterlockedAdd",
+                                         "InterlockedAnd",
+                                         "InterlockedCompareExchange",
+                                         "InterlockedCompareStore",
+                                         "InterlockedExchange",
+                                         "InterlockedMax",
+                                         "InterlockedMin",
+                                         "InterlockedOr",
+                                         "InterlockedXor",
+                                         "LineStream",
+                                         "MaxAnisotropy",
+                                         "MaxLOD",
+                                         "MinLOD",
+                                         "MipLODBias",
+                                         "NORMAL",
+                                         "NULL",
+                                         "Normal",
+                                         "OutputPatch",
+                                         "POSITION",
+                                         "POSITIONT",
+                                         "PSIZE",
+                                         "PixelShader",
+                                         "PointStream",
+                                         "Process2DQuadTessFactorsAvg",
+                                         "Process2DQuadTessFactorsMax",
+                                         "Process2DQuadTessFactorsMin",
+                                         "ProcessIsolineTessFactors",
+                                         "ProcessQuadTessFactorsAvg",
+                                         "ProcessQuadTessFactorsMax",
+                                         "ProcessQuadTessFactorsMin",
+                                         "ProcessTriTessFactorsAvg",
+                                         "ProcessTriTessFactorsMax",
+                                         "ProcessTriTessFactorsMin",
+                                         "RWBuffer",
+                                         "RWByteAddressBuffer",
+                                         "RWStructuredBuffer",
+                                         "RWTexture1D",
+                                         "RWTexture2D",
+                                         "RWTexture2DArray",
+                                         "RWTexture3D",
+                                         "RasterizerState",
+                                         "RenderTargetView",
+                                         "SV_ClipDistance",
+                                         "SV_Coverage",
+                                         "SV_CullDistance",
+                                         "SV_Depth",
+                                         "SV_DepthGreaterEqual",
+                                         "SV_DepthLessEqual",
+                                         "SV_DispatchThreadID",
+                                         "SV_DomainLocation",
+                                         "SV_GSInstanceID",
+                                         "SV_GroupID",
+                                         "SV_GroupIndex",
+                                         "SV_GroupThreadID",
+                                         "SV_InnerCoverage",
+                                         "SV_InsideTessFactor",
+                                         "SV_InstanceID",
+                                         "SV_IsFrontFace",
+                                         "SV_OutputControlPointID",
+                                         "SV_Position",
+                                         "SV_PrimitiveID",
+                                         "SV_RenderTargetArrayIndex",
+                                         "SV_SampleIndex",
+                                         "SV_StencilRef",
+                                         "SV_Target",
+                                         "SV_TessFactor",
+                                         "SV_VertexArrayIndex",
+                                         "SV_VertexID",
+                                         "Sampler",
+                                         "Sampler1D",
+                                         "Sampler2D",
+                                         "Sampler3D",
+                                         "SamplerCUBE",
+                                         "StructuredBuffer",
+                                         "TANGENT",
+                                         "TESSFACTOR",
+                                         "TEXCOORD",
+                                         "Texcoord",
+                                         "Texture",
+                                         "Texture1D",
+                                         "Texture2D",
+                                         "Texture2DArray",
+                                         "Texture2DMS",
+                                         "Texture2DMSArray",
+                                         "Texture3D",
+                                         "TextureCube",
+                                         "TextureCubeArray",
+                                         "TriangleStream",
+                                         "VFACE",
+                                         "VPOS",
+                                         "VertexShader",
+                                         "abort",
+                                         // "abs",  // WGSL intrinsic
+                                         // "acos",  // WGSL intrinsic
+                                         // "all",  // WGSL intrinsic
+                                         "allow_uav_condition",
+                                         // "any",  // WGSL intrinsic
+                                         "asdouble",
+                                         "asfloat",
+                                         // "asin",  // WGSL intrinsic
+                                         "asint",
+                                         // "asm",  // WGSL keyword
+                                         "asm_fragment",
+                                         "asuint",
+                                         // "atan",  // WGSL intrinsic
+                                         // "atan2",  // WGSL intrinsic
+                                         "auto",
+                                         // "bool",  // WGSL keyword
+                                         "bool1",
+                                         "bool1x1",
+                                         "bool1x2",
+                                         "bool1x3",
+                                         "bool1x4",
+                                         "bool2",
+                                         "bool2x1",
+                                         "bool2x2",
+                                         "bool2x3",
+                                         "bool2x4",
+                                         "bool3",
+                                         "bool3x1",
+                                         "bool3x2",
+                                         "bool3x3",
+                                         "bool3x4",
+                                         "bool4",
+                                         "bool4x1",
+                                         "bool4x2",
+                                         "bool4x3",
+                                         "bool4x4",
+                                         "branch",
+                                         // "break",  // WGSL keyword
+                                         // "call",  // WGSL intrinsic
+                                         // "case",  // WGSL keyword
+                                         "catch",
+                                         "cbuffer",
+                                         // "ceil",  // WGSL intrinsic
+                                         "centroid",
+                                         "char",
+                                         // "clamp",  // WGSL intrinsic
+                                         "class",
+                                         "clip",
+                                         "column_major",
+                                         "compile_fragment",
+                                         // "const",  // WGSL keyword
+                                         "const_cast",
+                                         // "continue",  // WGSL keyword
+                                         // "cos",  // WGSL intrinsic
+                                         // "cosh",  // WGSL intrinsic
+                                         "countbits",
+                                         // "cross",  // WGSL intrinsic
+                                         "ddx",
+                                         "ddx_coarse",
+                                         "ddx_fine",
+                                         "ddy",
+                                         "ddy_coarse",
+                                         "ddy_fine",
+                                         "degrees",
+                                         "delete",
+                                         // "determinant",  // WGSL intrinsic
+                                         // "discard",  // WGSL keyword
+                                         // "distance",  // WGSL intrinsic
+                                         // "do",  // WGSL keyword
+                                         // "dot",  // WGSL intrinsic
+                                         "double",
+                                         "double1",
+                                         "double1x1",
+                                         "double1x2",
+                                         "double1x3",
+                                         "double1x4",
+                                         "double2",
+                                         "double2x1",
+                                         "double2x2",
+                                         "double2x3",
+                                         "double2x4",
+                                         "double3",
+                                         "double3x1",
+                                         "double3x2",
+                                         "double3x3",
+                                         "double3x4",
+                                         "double4",
+                                         "double4x1",
+                                         "double4x2",
+                                         "double4x3",
+                                         "double4x4",
+                                         "dst",
+                                         "dword",
+                                         "dword1",
+                                         "dword1x1",
+                                         "dword1x2",
+                                         "dword1x3",
+                                         "dword1x4",
+                                         "dword2",
+                                         "dword2x1",
+                                         "dword2x2",
+                                         "dword2x3",
+                                         "dword2x4",
+                                         "dword3",
+                                         "dword3x1",
+                                         "dword3x2",
+                                         "dword3x3",
+                                         "dword3x4",
+                                         "dword4",
+                                         "dword4x1",
+                                         "dword4x2",
+                                         "dword4x3",
+                                         "dword4x4",
+                                         "dynamic_cast",
+                                         // "else",  // WGSL keyword
+                                         // "enum",  // WGSL keyword
+                                         "errorf",
+                                         // "exp",  // WGSL intrinsic
+                                         // "exp2",  // WGSL intrinsic
+                                         "explicit",
+                                         "export",
+                                         "extern",
+                                         "f16to32",
+                                         "f32tof16",
+                                         // "faceforward",  // WGSL intrinsic
+                                         // "false",  // WGSL keyword
+                                         "fastopt",
+                                         "firstbithigh",
+                                         "firstbitlow",
+                                         "flatten",
+                                         "float",
+                                         "float1",
+                                         "float1x1",
+                                         "float1x2",
+                                         "float1x3",
+                                         "float1x4",
+                                         "float2",
+                                         "float2x1",
+                                         "float2x2",
+                                         "float2x3",
+                                         "float2x4",
+                                         "float3",
+                                         "float3x1",
+                                         "float3x2",
+                                         "float3x3",
+                                         "float3x4",
+                                         "float4",
+                                         "float4x1",
+                                         "float4x2",
+                                         "float4x3",
+                                         "float4x4",
+                                         // "floor",  // WGSL intrinsic
+                                         // "fma",  // WGSL intrinsic
+                                         "fmod",
+                                         // "for",  // WGSL keyword
+                                         "forcecase",
+                                         "frac",
+                                         // "frexp",  // WGSL intrinsic
+                                         "friend",
+                                         // "fwidth",  // WGSL intrinsic
+                                         "fxgroup",
+                                         "goto",
+                                         "groupshared",
+                                         "half",
+                                         "half1",
+                                         "half1x1",
+                                         "half1x2",
+                                         "half1x3",
+                                         "half1x4",
+                                         "half2",
+                                         "half2x1",
+                                         "half2x2",
+                                         "half2x3",
+                                         "half2x4",
+                                         "half3",
+                                         "half3x1",
+                                         "half3x2",
+                                         "half3x3",
+                                         "half3x4",
+                                         "half4",
+                                         "half4x1",
+                                         "half4x2",
+                                         "half4x3",
+                                         "half4x4",
+                                         // "if",  // WGSL keyword
+                                         // "in",  // WGSL keyword
+                                         "inline",
+                                         "inout",
+                                         "int",
+                                         "int1",
+                                         "int1x1",
+                                         "int1x2",
+                                         "int1x3",
+                                         "int1x4",
+                                         "int2",
+                                         "int2x1",
+                                         "int2x2",
+                                         "int2x3",
+                                         "int2x4",
+                                         "int3",
+                                         "int3x1",
+                                         "int3x2",
+                                         "int3x3",
+                                         "int3x4",
+                                         "int4",
+                                         "int4x1",
+                                         "int4x2",
+                                         "int4x3",
+                                         "int4x4",
+                                         "interface",
+                                         "isfinite",
+                                         "isinf",
+                                         "isnan",
+                                         // "ldexp",  // WGSL intrinsic
+                                         // "length",  // WGSL intrinsic
+                                         "lerp",
+                                         "lineadj",
+                                         "linear",
+                                         "lit",
+                                         // "log",  // WGSL intrinsic
+                                         "log10",
+                                         // "log2",  // WGSL intrinsic
+                                         "long",
+                                         // "loop",  // WGSL keyword
+                                         "mad",
+                                         "matrix",
+                                         // "max",  // WGSL intrinsic
+                                         // "min",  // WGSL intrinsic
+                                         "min10float",
+                                         "min10float1",
+                                         "min10float1x1",
+                                         "min10float1x2",
+                                         "min10float1x3",
+                                         "min10float1x4",
+                                         "min10float2",
+                                         "min10float2x1",
+                                         "min10float2x2",
+                                         "min10float2x3",
+                                         "min10float2x4",
+                                         "min10float3",
+                                         "min10float3x1",
+                                         "min10float3x2",
+                                         "min10float3x3",
+                                         "min10float3x4",
+                                         "min10float4",
+                                         "min10float4x1",
+                                         "min10float4x2",
+                                         "min10float4x3",
+                                         "min10float4x4",
+                                         "min12int",
+                                         "min12int1",
+                                         "min12int1x1",
+                                         "min12int1x2",
+                                         "min12int1x3",
+                                         "min12int1x4",
+                                         "min12int2",
+                                         "min12int2x1",
+                                         "min12int2x2",
+                                         "min12int2x3",
+                                         "min12int2x4",
+                                         "min12int3",
+                                         "min12int3x1",
+                                         "min12int3x2",
+                                         "min12int3x3",
+                                         "min12int3x4",
+                                         "min12int4",
+                                         "min12int4x1",
+                                         "min12int4x2",
+                                         "min12int4x3",
+                                         "min12int4x4",
+                                         "min16float",
+                                         "min16float1",
+                                         "min16float1x1",
+                                         "min16float1x2",
+                                         "min16float1x3",
+                                         "min16float1x4",
+                                         "min16float2",
+                                         "min16float2x1",
+                                         "min16float2x2",
+                                         "min16float2x3",
+                                         "min16float2x4",
+                                         "min16float3",
+                                         "min16float3x1",
+                                         "min16float3x2",
+                                         "min16float3x3",
+                                         "min16float3x4",
+                                         "min16float4",
+                                         "min16float4x1",
+                                         "min16float4x2",
+                                         "min16float4x3",
+                                         "min16float4x4",
+                                         "min16int",
+                                         "min16int1",
+                                         "min16int1x1",
+                                         "min16int1x2",
+                                         "min16int1x3",
+                                         "min16int1x4",
+                                         "min16int2",
+                                         "min16int2x1",
+                                         "min16int2x2",
+                                         "min16int2x3",
+                                         "min16int2x4",
+                                         "min16int3",
+                                         "min16int3x1",
+                                         "min16int3x2",
+                                         "min16int3x3",
+                                         "min16int3x4",
+                                         "min16int4",
+                                         "min16int4x1",
+                                         "min16int4x2",
+                                         "min16int4x3",
+                                         "min16int4x4",
+                                         "min16uint",
+                                         "min16uint1",
+                                         "min16uint1x1",
+                                         "min16uint1x2",
+                                         "min16uint1x3",
+                                         "min16uint1x4",
+                                         "min16uint2",
+                                         "min16uint2x1",
+                                         "min16uint2x2",
+                                         "min16uint2x3",
+                                         "min16uint2x4",
+                                         "min16uint3",
+                                         "min16uint3x1",
+                                         "min16uint3x2",
+                                         "min16uint3x3",
+                                         "min16uint3x4",
+                                         "min16uint4",
+                                         "min16uint4x1",
+                                         "min16uint4x2",
+                                         "min16uint4x3",
+                                         "min16uint4x4",
+                                         // "modf",  // WGSL intrinsic
+                                         "msad4",
+                                         "mul",
+                                         "mutable",
+                                         "namespace",
+                                         "new",
+                                         "nointerpolation",
+                                         "noise",
+                                         "noperspective",
+                                         // "normalize",  // WGSL intrinsic
+                                         "numthreads",
+                                         "operator",
+                                         // "out",  // WGSL keyword
+                                         "packoffset",
+                                         "pass",
+                                         "pixelfragment",
+                                         "pixelshader",
+                                         "point",
+                                         // "pow",  // WGSL intrinsic
+                                         "precise",
+                                         "printf",
+                                         // "private",  // WGSL keyword
+                                         "protected",
+                                         "public",
+                                         "radians",
+                                         "rcp",
+                                         // "reflect",  // WGSL intrinsic
+                                         "refract",
+                                         "register",
+                                         "reinterpret_cast",
+                                         // "return",  // WGSL keyword
+                                         // "reversebits",  // WGSL intrinsic
+                                         // "round",  // WGSL intrinsic
+                                         "row_major",
+                                         "rsqrt",
+                                         "sample",
+                                         "sampler1D",
+                                         "sampler2D",
+                                         "sampler3D",
+                                         "samplerCUBE",
+                                         "sampler_state",
+                                         "saturate",
+                                         "shared",
+                                         "short",
+                                         // "sign",  // WGSL intrinsic
+                                         "signed",
+                                         // "sin",  // WGSL intrinsic
+                                         "sincos",
+                                         // "sinh",  // WGSL intrinsic
+                                         "sizeof",
+                                         // "smoothstep",  // WGSL intrinsic
+                                         "snorm",
+                                         // "sqrt",  // WGSL intrinsic
+                                         "stateblock",
+                                         "stateblock_state",
+                                         "static",
+                                         "static_cast",
+                                         // "step",  // WGSL intrinsic
+                                         "string",
+                                         // "struct",  // WGSL keyword
+                                         // "switch",  // WGSL keyword
+                                         // "tan",  // WGSL intrinsic
+                                         // "tanh",  // WGSL intrinsic
+                                         "tbuffer",
+                                         "technique",
+                                         "technique10",
+                                         "technique11",
+                                         "template",
+                                         "tex1D",
+                                         "tex1Dbias",
+                                         "tex1Dgrad",
+                                         "tex1Dlod",
+                                         "tex1Dproj",
+                                         "tex2D",
+                                         "tex2Dbias",
+                                         "tex2Dgrad",
+                                         "tex2Dlod",
+                                         "tex2Dproj",
+                                         "tex3D",
+                                         "tex3Dbias",
+                                         "tex3Dgrad",
+                                         "tex3Dlod",
+                                         "tex3Dproj",
+                                         "texCUBE",
+                                         "texCUBEbias",
+                                         "texCUBEgrad",
+                                         "texCUBElod",
+                                         "texCUBEproj",
+                                         "texture",
+                                         "texture1D",
+                                         "texture1DArray",
+                                         "texture2D",
+                                         "texture2DArray",
+                                         "texture2DMS",
+                                         "texture2DMSArray",
+                                         "texture3D",
+                                         "textureCube",
+                                         "textureCubeArray",
+                                         "this",
+                                         "throw",
+                                         "transpose",
+                                         "triangle",
+                                         "triangleadj",
+                                         // "true",  // WGSL keyword
+                                         // "trunc",  // WGSL intrinsic
+                                         "try",
+                                         // "typedef",  // WGSL keyword
+                                         "typename",
+                                         "uint",
+                                         "uint1",
+                                         "uint1x1",
+                                         "uint1x2",
+                                         "uint1x3",
+                                         "uint1x4",
+                                         "uint2",
+                                         "uint2x1",
+                                         "uint2x2",
+                                         "uint2x3",
+                                         "uint2x4",
+                                         "uint3",
+                                         "uint3x1",
+                                         "uint3x2",
+                                         "uint3x3",
+                                         "uint3x4",
+                                         "uint4",
+                                         "uint4x1",
+                                         "uint4x2",
+                                         "uint4x3",
+                                         "uint4x4",
+                                         // "uniform",  // WGSL keyword
+                                         "union",
+                                         "unorm",
+                                         "unroll",
+                                         "unsigned",
+                                         "using",
+                                         "vector",
+                                         "vertexfragment",
+                                         "vertexshader",
+                                         "virtual",
+                                         // "void",  // WGSL keyword
+                                         "volatile",
+                                         "while"));
+
 }  // namespace
 }  // namespace transform
 }  // namespace tint
diff --git a/src/transform/msl.cc b/src/transform/msl.cc
index 48cebce..3624b5d 100644
--- a/src/transform/msl.cc
+++ b/src/transform/msl.cc
@@ -23,6 +23,7 @@
 namespace tint {
 namespace transform {
 namespace {
+// This list is used for a binary search and must be kept in sorted order.
 const char* kReservedKeywords[] = {"access",
                                    "alignas",
                                    "alignof",
diff --git a/src/writer/hlsl/generator_impl.cc b/src/writer/hlsl/generator_impl.cc
index 9c1b179..c569d51 100644
--- a/src/writer/hlsl/generator_impl.cc
+++ b/src/writer/hlsl/generator_impl.cc
@@ -176,14 +176,18 @@
 }
 
 std::string GeneratorImpl::generate_name(const std::string& prefix) {
-  std::string name = prefix;
-  uint32_t i = 0;
-  while (namer_.IsMapped(name) || namer_.IsRemapped(name)) {
-    name = prefix + "_" + std::to_string(i);
-    ++i;
+  if (!builder_.Symbols().Get(prefix).IsValid()) {
+    builder_.Symbols().Register(prefix);
+    return prefix;
   }
-  namer_.RegisterRemappedName(name);
-  return name;
+  for (uint32_t i = 0;; i++) {
+    std::string name = prefix + "_" + std::to_string(i);
+    if (builder_.Symbols().Get(name).IsValid()) {
+      continue;
+    }
+    builder_.Symbols().Register(name);
+    return name;
+  }
 }
 
 std::string GeneratorImpl::current_ep_var_name(VarType type) {
@@ -225,8 +229,8 @@
     if (!EmitType(out, alias->type(), ast::StorageClass::kNone, "")) {
       return false;
     }
-    out << " " << namer_.NameFor(builder_.Symbols().NameFor(alias->symbol()))
-        << ";" << std::endl;
+    out << " " << builder_.Symbols().NameFor(alias->symbol()) << ";"
+        << std::endl;
   } else if (auto* str = ty->As<type::Struct>()) {
     if (!EmitStructType(out, str, builder_.Symbols().NameFor(str->symbol()))) {
       return false;
@@ -1428,7 +1432,7 @@
     }
   }
 
-  out << namer_.NameFor(builder_.Symbols().NameFor(ident->symbol()));
+  out << builder_.Symbols().NameFor(ident->symbol());
 
   return true;
 }
@@ -1604,8 +1608,7 @@
                          builder_.Symbols().NameFor(ep_sym));
     ep_func_name_remapped_[ep_name + "_" + func_name] = name;
   } else {
-    // TODO(dsinclair): this should be updated to a remapped name
-    name = namer_.NameFor(builder_.Symbols().NameFor(func->symbol()));
+    name = builder_.Symbols().NameFor(func->symbol());
   }
 
   out << name << "(";
@@ -1905,7 +1908,7 @@
       if (!EmitType(out, var->Type(), var->StorageClass(), "")) {
         return false;
       }
-      out << " " << namer_.NameFor(builder_.Symbols().NameFor(decl->symbol()));
+      out << " " << builder_.Symbols().NameFor(decl->symbol());
 
       const char* register_space = nullptr;
 
@@ -2003,8 +2006,7 @@
     out << func->return_type()->FriendlyName(builder_.Symbols());
   }
   // TODO(dsinclair): This should output the remapped name
-  out << " " << namer_.NameFor(builder_.Symbols().NameFor(current_ep_sym_))
-      << "(";
+  out << " " << builder_.Symbols().NameFor(current_ep_sym_) << "(";
 
   bool first = true;
   // TODO(crbug.com/tint/697): Remove this.
@@ -2144,8 +2146,8 @@
 bool GeneratorImpl::EmitLoop(std::ostream& out, ast::LoopStatement* stmt) {
   loop_emission_counter_++;
 
-  std::string guard = namer_.NameFor("tint_hlsl_is_first_" +
-                                     std::to_string(loop_emission_counter_));
+  std::string guard = generate_name("tint_hlsl_is_first_" +
+                                    std::to_string(loop_emission_counter_));
 
   if (stmt->has_continuing()) {
     make_indent(out);
@@ -2385,7 +2387,7 @@
   }
 
   if (auto* alias = type->As<type::Alias>()) {
-    out << namer_.NameFor(builder_.Symbols().NameFor(alias->symbol()));
+    out << builder_.Symbols().NameFor(alias->symbol());
   } else if (auto* ary = type->As<type::Array>()) {
     type::Type* base_type = ary;
     std::vector<uint32_t> sizes;
@@ -2403,7 +2405,7 @@
       return false;
     }
     if (!name.empty()) {
-      out << " " << namer_.NameFor(name);
+      out << " " << name;
     }
     for (uint32_t size : sizes) {
       out << "[" << size << "]";
@@ -2557,7 +2559,7 @@
     }
     // Array member name will be output with the type
     if (!mem->type()->Is<type::Array>()) {
-      out << " " << namer_.NameFor(builder_.Symbols().NameFor(mem->symbol()));
+      out << " " << builder_.Symbols().NameFor(mem->symbol());
     }
 
     for (auto* deco : mem->decorations()) {
diff --git a/src/writer/hlsl/generator_impl.h b/src/writer/hlsl/generator_impl.h
index 08d844f..7961c21 100644
--- a/src/writer/hlsl/generator_impl.h
+++ b/src/writer/hlsl/generator_impl.h
@@ -31,7 +31,6 @@
 #include "src/ast/unary_op_expression.h"
 #include "src/program_builder.h"
 #include "src/scope_stack.h"
-#include "src/writer/hlsl/namer.h"
 #include "src/writer/text_generator.h"
 
 namespace tint {
@@ -358,9 +357,6 @@
   /// @returns true if an input or output struct is required.
   bool has_referenced_var_needing_struct(const semantic::Function* func);
 
-  /// @returns the namer for testing
-  Namer* namer_for_testing() { return &namer_; }
-
   /// Generate a unique name
   /// @param prefix the name prefix
   /// @returns a unique name
@@ -383,7 +379,6 @@
     return builder_.TypeOf(expr);
   }
 
-  Namer namer_;
   ProgramBuilder builder_;
   Symbol current_ep_sym_;
   bool generating_entry_point_ = false;
diff --git a/src/writer/hlsl/generator_impl_alias_type_test.cc b/src/writer/hlsl/generator_impl_alias_type_test.cc
index 8a24701..2d53286 100644
--- a/src/writer/hlsl/generator_impl_alias_type_test.cc
+++ b/src/writer/hlsl/generator_impl_alias_type_test.cc
@@ -12,6 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#include "gmock/gmock.h"
 #include "src/writer/hlsl/test_helper.h"
 
 namespace tint {
@@ -19,6 +20,8 @@
 namespace hlsl {
 namespace {
 
+using ::testing::HasSubstr;
+
 using HlslGeneratorImplTest_Alias = TestHelper;
 
 TEST_F(HlslGeneratorImplTest_Alias, EmitAlias_F32) {
@@ -32,13 +35,13 @@
 }
 
 TEST_F(HlslGeneratorImplTest_Alias, EmitAlias_NameCollision) {
-  auto* alias = ty.alias("float", ty.f32());
+  AST().AddConstructedType(ty.alias("float", ty.f32()));
 
-  GeneratorImpl& gen = Build();
+  GeneratorImpl& gen = SanitizeAndBuild();
 
-  ASSERT_TRUE(gen.EmitConstructedType(out, alias)) << gen.error();
-  EXPECT_EQ(result(), R"(typedef float float_tint_0;
-)");
+  ASSERT_TRUE(gen.Generate(out)) << gen.error();
+  EXPECT_THAT(result(), HasSubstr(R"(typedef float _tint_float;
+)"));
 }
 
 TEST_F(HlslGeneratorImplTest_Alias, EmitAlias_Struct) {
diff --git a/src/writer/hlsl/generator_impl_function_test.cc b/src/writer/hlsl/generator_impl_function_test.cc
index ea23929..525ce1f 100644
--- a/src/writer/hlsl/generator_impl_function_test.cc
+++ b/src/writer/hlsl/generator_impl_function_test.cc
@@ -55,16 +55,14 @@
        },
        ast::DecorationList{});
 
-  GeneratorImpl& gen = Build();
+  GeneratorImpl& gen = SanitizeAndBuild();
 
   gen.increment_indent();
 
   ASSERT_TRUE(gen.Generate(out)) << gen.error();
-  EXPECT_EQ(result(), R"(  void GeometryShader_tint_0() {
+  EXPECT_THAT(result(), HasSubstr(R"(  void _tint_GeometryShader() {
     return;
-  }
-
-)");
+  })"));
 }
 
 TEST_F(HlslGeneratorImplTest_Function, Emit_Function_WithParams) {
@@ -121,15 +119,15 @@
   GeneratorImpl& gen = SanitizeAndBuild();
 
   ASSERT_TRUE(gen.Generate(out)) << gen.error();
-  EXPECT_EQ(result(), R"(struct tint_symbol_5 {
+  EXPECT_EQ(result(), R"(struct tint_symbol_1 {
   float foo : TEXCOORD0;
 };
 struct tint_symbol_2 {
   float value : SV_Target1;
 };
 
-tint_symbol_2 frag_main(tint_symbol_5 tint_symbol_7) {
-  const float foo = tint_symbol_7.foo;
+tint_symbol_2 frag_main(tint_symbol_1 tint_symbol_6) {
+  const float foo = tint_symbol_6.foo;
   const tint_symbol_2 tint_symbol_1 = {foo};
   return tint_symbol_1;
 }
@@ -155,15 +153,15 @@
   GeneratorImpl& gen = SanitizeAndBuild();
 
   ASSERT_TRUE(gen.Generate(out)) << gen.error();
-  EXPECT_EQ(result(), R"(struct tint_symbol_6 {
+  EXPECT_EQ(result(), R"(struct tint_symbol_1 {
   float4 coord : SV_Position;
 };
 struct tint_symbol_2 {
   float value : SV_Depth;
 };
 
-tint_symbol_2 frag_main(tint_symbol_6 tint_symbol_8) {
-  const float4 coord = tint_symbol_8.coord;
+tint_symbol_2 frag_main(tint_symbol_1 tint_symbol_6) {
+  const float4 coord = tint_symbol_6.coord;
   const tint_symbol_2 tint_symbol_1 = {coord.x};
   return tint_symbol_1;
 }
@@ -216,7 +214,7 @@
   float col1 : TEXCOORD1;
   float col2 : TEXCOORD2;
 };
-struct tint_symbol_8 {
+struct tint_symbol_7 {
   float col1 : TEXCOORD1;
   float col2 : TEXCOORD2;
 };
@@ -227,8 +225,8 @@
   return tint_symbol_1;
 }
 
-void frag_main(tint_symbol_8 tint_symbol_10) {
-  const Interface colors = {tint_symbol_10.col1, tint_symbol_10.col2};
+void frag_main(tint_symbol_7 tint_symbol_9) {
+  const Interface colors = {tint_symbol_9.col1, tint_symbol_9.col2};
   const float r = colors.col1;
   const float g = colors.col2;
   return;
@@ -876,10 +874,10 @@
            create<ast::StageDecoration>(ast::PipelineStage::kFragment),
        });
 
-  GeneratorImpl& gen = Build();
+  GeneratorImpl& gen = SanitizeAndBuild();
 
   ASSERT_TRUE(gen.Generate(out)) << gen.error();
-  EXPECT_EQ(result(), R"(void GeometryShader_tint_0() {
+  EXPECT_EQ(result(), R"(void _tint_GeometryShader() {
   return;
 }
 
diff --git a/src/writer/hlsl/generator_impl_identifier_test.cc b/src/writer/hlsl/generator_impl_identifier_test.cc
index 536f5c0..1faa7ae 100644
--- a/src/writer/hlsl/generator_impl_identifier_test.cc
+++ b/src/writer/hlsl/generator_impl_identifier_test.cc
@@ -30,16 +30,6 @@
   EXPECT_EQ(result(), "foo");
 }
 
-TEST_F(HlslGeneratorImplTest_Identifier,
-       EmitIdentifierExpression_Single_WithCollision) {
-  auto* i = Expr("virtual");
-
-  GeneratorImpl& gen = Build();
-
-  ASSERT_TRUE(gen.EmitExpression(pre, out, i)) << gen.error();
-  EXPECT_EQ(result(), "virtual_tint_0");
-}
-
 }  // namespace
 }  // namespace hlsl
 }  // namespace writer
diff --git a/src/writer/hlsl/generator_impl_intrinsic_texture_test.cc b/src/writer/hlsl/generator_impl_intrinsic_texture_test.cc
index d6aaa84..6fdab58 100644
--- a/src/writer/hlsl/generator_impl_intrinsic_texture_test.cc
+++ b/src/writer/hlsl/generator_impl_intrinsic_texture_test.cc
@@ -12,6 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#include "gmock/gmock.h"
 #include "src/ast/call_statement.h"
 #include "src/ast/intrinsic_texture_helper_test.h"
 #include "src/ast/stage_decoration.h"
@@ -22,6 +23,8 @@
 namespace hlsl {
 namespace {
 
+using ::testing::HasSubstr;
+
 struct ExpectedResult {
   ExpectedResult(const char* o) : out(o) {}  // NOLINT
   ExpectedResult(const char* p, const char* o) : pre(p), out(o) {}
@@ -39,7 +42,7 @@
     case ValidTextureOverload::kDimensionsStorageWO1d:
       return {
           R"(int _tint_tmp;
-texture_tint_0.GetDimensions(_tint_tmp);
+  _tint_texture.GetDimensions(_tint_tmp);
 )",
           "_tint_tmp",
       };
@@ -49,14 +52,14 @@
     case ValidTextureOverload::kDimensionsStorageWO2d:
       return {
           R"(int2 _tint_tmp;
-texture_tint_0.GetDimensions(_tint_tmp.x, _tint_tmp.y);
+  _tint_texture.GetDimensions(_tint_tmp.x, _tint_tmp.y);
 )",
           "_tint_tmp",
       };
     case ValidTextureOverload::kDimensionsMultisampled2d:
       return {
           R"(int3 _tint_tmp;
-texture_tint_0.GetDimensions(_tint_tmp.x, _tint_tmp.y, _tint_tmp.z);
+  _tint_texture.GetDimensions(_tint_tmp.x, _tint_tmp.y, _tint_tmp.z);
 )",
           "_tint_tmp.xy",
       };
@@ -67,14 +70,14 @@
     case ValidTextureOverload::kDimensionsStorageWO2dArray:
       return {
           R"(int3 _tint_tmp;
-texture_tint_0.GetDimensions(_tint_tmp.x, _tint_tmp.y, _tint_tmp.z);
+  _tint_texture.GetDimensions(_tint_tmp.x, _tint_tmp.y, _tint_tmp.z);
 )",
           "_tint_tmp.xy",
       };
     case ValidTextureOverload::kDimensionsMultisampled2dArray:
       return {
           R"(int4 _tint_tmp;
-texture_tint_0.GetDimensions(_tint_tmp.x, _tint_tmp.y, _tint_tmp.z, _tint_tmp.w);
+  _tint_texture.GetDimensions(_tint_tmp.x, _tint_tmp.y, _tint_tmp.z, _tint_tmp.w);
 )",
           "_tint_tmp.xy",
       };
@@ -83,22 +86,23 @@
     case ValidTextureOverload::kDimensionsStorageWO3d:
       return {
           R"(int3 _tint_tmp;
-texture_tint_0.GetDimensions(_tint_tmp.x, _tint_tmp.y, _tint_tmp.z);
+  _tint_texture.GetDimensions(_tint_tmp.x, _tint_tmp.y, _tint_tmp.z);
 )",
           "_tint_tmp",
       };
     case ValidTextureOverload::kDimensionsCube:
     case ValidTextureOverload::kDimensionsDepthCube:
       return {
-          "int2 _tint_tmp;\n"
-          "texture_tint_0.GetDimensions(_tint_tmp.x, _tint_tmp.y);\n",
+          R"(int2 _tint_tmp;
+  _tint_texture.GetDimensions(_tint_tmp.x, _tint_tmp.y);
+)",
           "_tint_tmp.xyy",
       };
     case ValidTextureOverload::kDimensionsCubeArray:
     case ValidTextureOverload::kDimensionsDepthCubeArray:
       return {
           R"(int3 _tint_tmp;
-texture_tint_0.GetDimensions(_tint_tmp.x, _tint_tmp.y, _tint_tmp.z);
+  _tint_texture.GetDimensions(_tint_tmp.x, _tint_tmp.y, _tint_tmp.z);
 )",
           "_tint_tmp.xyy",
       };
@@ -106,7 +110,7 @@
     case ValidTextureOverload::kDimensionsDepth2dLevel:
       return {
           R"(int3 _tint_tmp;
-texture_tint_0.GetDimensions(1, _tint_tmp.x, _tint_tmp.y, _tint_tmp.z);
+  _tint_texture.GetDimensions(1, _tint_tmp.x, _tint_tmp.y, _tint_tmp.z);
 )",
           "_tint_tmp.xy",
       };
@@ -114,14 +118,14 @@
     case ValidTextureOverload::kDimensionsDepth2dArrayLevel:
       return {
           R"(int4 _tint_tmp;
-texture_tint_0.GetDimensions(1, _tint_tmp.x, _tint_tmp.y, _tint_tmp.z, _tint_tmp.w);
+  _tint_texture.GetDimensions(1, _tint_tmp.x, _tint_tmp.y, _tint_tmp.z, _tint_tmp.w);
 )",
           "_tint_tmp.xy",
       };
     case ValidTextureOverload::kDimensions3dLevel:
       return {
           R"(int4 _tint_tmp;
-texture_tint_0.GetDimensions(1, _tint_tmp.x, _tint_tmp.y, _tint_tmp.z, _tint_tmp.w);
+  _tint_texture.GetDimensions(1, _tint_tmp.x, _tint_tmp.y, _tint_tmp.z, _tint_tmp.w);
 )",
           "_tint_tmp.xyz",
       };
@@ -129,7 +133,7 @@
     case ValidTextureOverload::kDimensionsDepthCubeLevel:
       return {
           R"(int3 _tint_tmp;
-texture_tint_0.GetDimensions(1, _tint_tmp.x, _tint_tmp.y, _tint_tmp.z);
+  _tint_texture.GetDimensions(1, _tint_tmp.x, _tint_tmp.y, _tint_tmp.z);
 )",
           "_tint_tmp.xyy",
       };
@@ -137,7 +141,7 @@
     case ValidTextureOverload::kDimensionsDepthCubeArrayLevel:
       return {
           R"(int4 _tint_tmp;
-texture_tint_0.GetDimensions(1, _tint_tmp.x, _tint_tmp.y, _tint_tmp.z, _tint_tmp.w);
+  _tint_texture.GetDimensions(1, _tint_tmp.x, _tint_tmp.y, _tint_tmp.z, _tint_tmp.w);
 )",
           "_tint_tmp.xyy",
       };
@@ -148,14 +152,14 @@
     case ValidTextureOverload::kNumLayersStorageWO2dArray:
       return {
           R"(int3 _tint_tmp;
-texture_tint_0.GetDimensions(_tint_tmp.x, _tint_tmp.y, _tint_tmp.z);
+  _tint_texture.GetDimensions(_tint_tmp.x, _tint_tmp.y, _tint_tmp.z);
 )",
           "_tint_tmp.z",
       };
     case ValidTextureOverload::kNumLayersMultisampled2dArray:
       return {
           R"(int4 _tint_tmp;
-texture_tint_0.GetDimensions(_tint_tmp.x, _tint_tmp.y, _tint_tmp.z, _tint_tmp.w);
+  _tint_texture.GetDimensions(_tint_tmp.x, _tint_tmp.y, _tint_tmp.z, _tint_tmp.w);
 )",
           "_tint_tmp.z",
       };
@@ -166,7 +170,7 @@
     case ValidTextureOverload::kNumLevelsDepthCube:
       return {
           R"(int3 _tint_tmp;
-texture_tint_0.GetDimensions(0, _tint_tmp.x, _tint_tmp.y, _tint_tmp.z);
+  _tint_texture.GetDimensions(0, _tint_tmp.x, _tint_tmp.y, _tint_tmp.z);
 )",
           "_tint_tmp.z",
       };
@@ -177,168 +181,168 @@
     case ValidTextureOverload::kNumLevelsDepthCubeArray:
       return {
           R"(int4 _tint_tmp;
-texture_tint_0.GetDimensions(0, _tint_tmp.x, _tint_tmp.y, _tint_tmp.z, _tint_tmp.w);
+  _tint_texture.GetDimensions(0, _tint_tmp.x, _tint_tmp.y, _tint_tmp.z, _tint_tmp.w);
 )",
           "_tint_tmp.w",
       };
     case ValidTextureOverload::kNumSamplesMultisampled2d:
       return {
           R"(int3 _tint_tmp;
-texture_tint_0.GetDimensions(_tint_tmp.x, _tint_tmp.y, _tint_tmp.z);
+  _tint_texture.GetDimensions(_tint_tmp.x, _tint_tmp.y, _tint_tmp.z);
 )",
           "_tint_tmp.z",
       };
     case ValidTextureOverload::kNumSamplesMultisampled2dArray:
       return {
           R"(int4 _tint_tmp;
-texture_tint_0.GetDimensions(_tint_tmp.x, _tint_tmp.y, _tint_tmp.z, _tint_tmp.w);
+  _tint_texture.GetDimensions(_tint_tmp.x, _tint_tmp.y, _tint_tmp.z, _tint_tmp.w);
 )",
           "_tint_tmp.w",
       };
     case ValidTextureOverload::kSample1dF32:
-      return R"(texture_tint_0.Sample(sampler_tint_0, 1.0f))";
+      return R"(_tint_texture.Sample(_tint_sampler, 1.0f))";
     case ValidTextureOverload::kSample2dF32:
-      return R"(texture_tint_0.Sample(sampler_tint_0, float2(1.0f, 2.0f)))";
+      return R"(_tint_texture.Sample(_tint_sampler, float2(1.0f, 2.0f)))";
     case ValidTextureOverload::kSample2dOffsetF32:
-      return R"(texture_tint_0.Sample(sampler_tint_0, float2(1.0f, 2.0f), int2(3, 4)))";
+      return R"(_tint_texture.Sample(_tint_sampler, float2(1.0f, 2.0f), int2(3, 4)))";
     case ValidTextureOverload::kSample2dArrayF32:
-      return R"(texture_tint_0.Sample(sampler_tint_0, float3(1.0f, 2.0f, float(3))))";
+      return R"(_tint_texture.Sample(_tint_sampler, float3(1.0f, 2.0f, float(3))))";
     case ValidTextureOverload::kSample2dArrayOffsetF32:
-      return R"(texture_tint_0.Sample(sampler_tint_0, float3(1.0f, 2.0f, float(3)), int2(4, 5)))";
+      return R"(_tint_texture.Sample(_tint_sampler, float3(1.0f, 2.0f, float(3)), int2(4, 5)))";
     case ValidTextureOverload::kSample3dF32:
-      return R"(texture_tint_0.Sample(sampler_tint_0, float3(1.0f, 2.0f, 3.0f)))";
+      return R"(_tint_texture.Sample(_tint_sampler, float3(1.0f, 2.0f, 3.0f)))";
     case ValidTextureOverload::kSample3dOffsetF32:
-      return R"(texture_tint_0.Sample(sampler_tint_0, float3(1.0f, 2.0f, 3.0f), int3(4, 5, 6)))";
+      return R"(_tint_texture.Sample(_tint_sampler, float3(1.0f, 2.0f, 3.0f), int3(4, 5, 6)))";
     case ValidTextureOverload::kSampleCubeF32:
-      return R"(texture_tint_0.Sample(sampler_tint_0, float3(1.0f, 2.0f, 3.0f)))";
+      return R"(_tint_texture.Sample(_tint_sampler, float3(1.0f, 2.0f, 3.0f)))";
     case ValidTextureOverload::kSampleCubeArrayF32:
-      return R"(texture_tint_0.Sample(sampler_tint_0, float4(1.0f, 2.0f, 3.0f, float(4))))";
+      return R"(_tint_texture.Sample(_tint_sampler, float4(1.0f, 2.0f, 3.0f, float(4))))";
     case ValidTextureOverload::kSampleDepth2dF32:
-      return R"(texture_tint_0.Sample(sampler_tint_0, float2(1.0f, 2.0f)))";
+      return R"(_tint_texture.Sample(_tint_sampler, float2(1.0f, 2.0f)))";
     case ValidTextureOverload::kSampleDepth2dOffsetF32:
-      return R"(texture_tint_0.Sample(sampler_tint_0, float2(1.0f, 2.0f), int2(3, 4)))";
+      return R"(_tint_texture.Sample(_tint_sampler, float2(1.0f, 2.0f), int2(3, 4)))";
     case ValidTextureOverload::kSampleDepth2dArrayF32:
-      return R"(texture_tint_0.Sample(sampler_tint_0, float3(1.0f, 2.0f, float(3))))";
+      return R"(_tint_texture.Sample(_tint_sampler, float3(1.0f, 2.0f, float(3))))";
     case ValidTextureOverload::kSampleDepth2dArrayOffsetF32:
-      return R"(texture_tint_0.Sample(sampler_tint_0, float3(1.0f, 2.0f, float(3)), int2(4, 5)))";
+      return R"(_tint_texture.Sample(_tint_sampler, float3(1.0f, 2.0f, float(3)), int2(4, 5)))";
     case ValidTextureOverload::kSampleDepthCubeF32:
-      return R"(texture_tint_0.Sample(sampler_tint_0, float3(1.0f, 2.0f, 3.0f)))";
+      return R"(_tint_texture.Sample(_tint_sampler, float3(1.0f, 2.0f, 3.0f)))";
     case ValidTextureOverload::kSampleDepthCubeArrayF32:
-      return R"(texture_tint_0.Sample(sampler_tint_0, float4(1.0f, 2.0f, 3.0f, float(4))))";
+      return R"(_tint_texture.Sample(_tint_sampler, float4(1.0f, 2.0f, 3.0f, float(4))))";
     case ValidTextureOverload::kSampleBias2dF32:
-      return R"(texture_tint_0.SampleBias(sampler_tint_0, float2(1.0f, 2.0f), 3.0f))";
+      return R"(_tint_texture.SampleBias(_tint_sampler, float2(1.0f, 2.0f), 3.0f))";
     case ValidTextureOverload::kSampleBias2dOffsetF32:
-      return R"(texture_tint_0.SampleBias(sampler_tint_0, float2(1.0f, 2.0f), 3.0f, int2(4, 5)))";
+      return R"(_tint_texture.SampleBias(_tint_sampler, float2(1.0f, 2.0f), 3.0f, int2(4, 5)))";
     case ValidTextureOverload::kSampleBias2dArrayF32:
-      return R"(texture_tint_0.SampleBias(sampler_tint_0, float3(1.0f, 2.0f, float(4)), 3.0f))";
+      return R"(_tint_texture.SampleBias(_tint_sampler, float3(1.0f, 2.0f, float(4)), 3.0f))";
     case ValidTextureOverload::kSampleBias2dArrayOffsetF32:
-      return R"(texture_tint_0.SampleBias(sampler_tint_0, float3(1.0f, 2.0f, float(3)), 4.0f, int2(5, 6)))";
+      return R"(_tint_texture.SampleBias(_tint_sampler, float3(1.0f, 2.0f, float(3)), 4.0f, int2(5, 6)))";
     case ValidTextureOverload::kSampleBias3dF32:
-      return R"(texture_tint_0.SampleBias(sampler_tint_0, float3(1.0f, 2.0f, 3.0f), 4.0f))";
+      return R"(_tint_texture.SampleBias(_tint_sampler, float3(1.0f, 2.0f, 3.0f), 4.0f))";
     case ValidTextureOverload::kSampleBias3dOffsetF32:
-      return R"(texture_tint_0.SampleBias(sampler_tint_0, float3(1.0f, 2.0f, 3.0f), 4.0f, int3(5, 6, 7)))";
+      return R"(_tint_texture.SampleBias(_tint_sampler, float3(1.0f, 2.0f, 3.0f), 4.0f, int3(5, 6, 7)))";
     case ValidTextureOverload::kSampleBiasCubeF32:
-      return R"(texture_tint_0.SampleBias(sampler_tint_0, float3(1.0f, 2.0f, 3.0f), 4.0f))";
+      return R"(_tint_texture.SampleBias(_tint_sampler, float3(1.0f, 2.0f, 3.0f), 4.0f))";
     case ValidTextureOverload::kSampleBiasCubeArrayF32:
-      return R"(texture_tint_0.SampleBias(sampler_tint_0, float4(1.0f, 2.0f, 3.0f, float(3)), 4.0f))";
+      return R"(_tint_texture.SampleBias(_tint_sampler, float4(1.0f, 2.0f, 3.0f, float(3)), 4.0f))";
     case ValidTextureOverload::kSampleLevel2dF32:
-      return R"(texture_tint_0.SampleLevel(sampler_tint_0, float2(1.0f, 2.0f), 3.0f))";
+      return R"(_tint_texture.SampleLevel(_tint_sampler, float2(1.0f, 2.0f), 3.0f))";
     case ValidTextureOverload::kSampleLevel2dOffsetF32:
-      return R"(texture_tint_0.SampleLevel(sampler_tint_0, float2(1.0f, 2.0f), 3.0f, int2(4, 5)))";
+      return R"(_tint_texture.SampleLevel(_tint_sampler, float2(1.0f, 2.0f), 3.0f, int2(4, 5)))";
     case ValidTextureOverload::kSampleLevel2dArrayF32:
-      return R"(texture_tint_0.SampleLevel(sampler_tint_0, float3(1.0f, 2.0f, float(3)), 4.0f))";
+      return R"(_tint_texture.SampleLevel(_tint_sampler, float3(1.0f, 2.0f, float(3)), 4.0f))";
     case ValidTextureOverload::kSampleLevel2dArrayOffsetF32:
-      return R"(texture_tint_0.SampleLevel(sampler_tint_0, float3(1.0f, 2.0f, float(3)), 4.0f, int2(5, 6)))";
+      return R"(_tint_texture.SampleLevel(_tint_sampler, float3(1.0f, 2.0f, float(3)), 4.0f, int2(5, 6)))";
     case ValidTextureOverload::kSampleLevel3dF32:
-      return R"(texture_tint_0.SampleLevel(sampler_tint_0, float3(1.0f, 2.0f, 3.0f), 4.0f))";
+      return R"(_tint_texture.SampleLevel(_tint_sampler, float3(1.0f, 2.0f, 3.0f), 4.0f))";
     case ValidTextureOverload::kSampleLevel3dOffsetF32:
-      return R"(texture_tint_0.SampleLevel(sampler_tint_0, float3(1.0f, 2.0f, 3.0f), 4.0f, int3(5, 6, 7)))";
+      return R"(_tint_texture.SampleLevel(_tint_sampler, float3(1.0f, 2.0f, 3.0f), 4.0f, int3(5, 6, 7)))";
     case ValidTextureOverload::kSampleLevelCubeF32:
-      return R"(texture_tint_0.SampleLevel(sampler_tint_0, float3(1.0f, 2.0f, 3.0f), 4.0f))";
+      return R"(_tint_texture.SampleLevel(_tint_sampler, float3(1.0f, 2.0f, 3.0f), 4.0f))";
     case ValidTextureOverload::kSampleLevelCubeArrayF32:
-      return R"(texture_tint_0.SampleLevel(sampler_tint_0, float4(1.0f, 2.0f, 3.0f, float(4)), 5.0f))";
+      return R"(_tint_texture.SampleLevel(_tint_sampler, float4(1.0f, 2.0f, 3.0f, float(4)), 5.0f))";
     case ValidTextureOverload::kSampleLevelDepth2dF32:
-      return R"(texture_tint_0.SampleLevel(sampler_tint_0, float2(1.0f, 2.0f), 3))";
+      return R"(_tint_texture.SampleLevel(_tint_sampler, float2(1.0f, 2.0f), 3))";
     case ValidTextureOverload::kSampleLevelDepth2dOffsetF32:
-      return R"(texture_tint_0.SampleLevel(sampler_tint_0, float2(1.0f, 2.0f), 3, int2(4, 5)))";
+      return R"(_tint_texture.SampleLevel(_tint_sampler, float2(1.0f, 2.0f), 3, int2(4, 5)))";
     case ValidTextureOverload::kSampleLevelDepth2dArrayF32:
-      return R"(texture_tint_0.SampleLevel(sampler_tint_0, float3(1.0f, 2.0f, float(3)), 4))";
+      return R"(_tint_texture.SampleLevel(_tint_sampler, float3(1.0f, 2.0f, float(3)), 4))";
     case ValidTextureOverload::kSampleLevelDepth2dArrayOffsetF32:
-      return R"(texture_tint_0.SampleLevel(sampler_tint_0, float3(1.0f, 2.0f, float(3)), 4, int2(5, 6)))";
+      return R"(_tint_texture.SampleLevel(_tint_sampler, float3(1.0f, 2.0f, float(3)), 4, int2(5, 6)))";
     case ValidTextureOverload::kSampleLevelDepthCubeF32:
-      return R"(texture_tint_0.SampleLevel(sampler_tint_0, float3(1.0f, 2.0f, 3.0f), 4))";
+      return R"(_tint_texture.SampleLevel(_tint_sampler, float3(1.0f, 2.0f, 3.0f), 4))";
     case ValidTextureOverload::kSampleLevelDepthCubeArrayF32:
-      return R"(texture_tint_0.SampleLevel(sampler_tint_0, float4(1.0f, 2.0f, 3.0f, float(4)), 5))";
+      return R"(_tint_texture.SampleLevel(_tint_sampler, float4(1.0f, 2.0f, 3.0f, float(4)), 5))";
     case ValidTextureOverload::kSampleGrad2dF32:
-      return R"(texture_tint_0.SampleGrad(sampler_tint_0, float2(1.0f, 2.0f), float2(3.0f, 4.0f), float2(5.0f, 6.0f)))";
+      return R"(_tint_texture.SampleGrad(_tint_sampler, float2(1.0f, 2.0f), float2(3.0f, 4.0f), float2(5.0f, 6.0f)))";
     case ValidTextureOverload::kSampleGrad2dOffsetF32:
-      return R"(texture_tint_0.SampleGrad(sampler_tint_0, float2(1.0f, 2.0f), float2(3.0f, 4.0f), float2(5.0f, 6.0f), int2(7, 8)))";
+      return R"(_tint_texture.SampleGrad(_tint_sampler, float2(1.0f, 2.0f), float2(3.0f, 4.0f), float2(5.0f, 6.0f), int2(7, 8)))";
     case ValidTextureOverload::kSampleGrad2dArrayF32:
-      return R"(texture_tint_0.SampleGrad(sampler_tint_0, float3(1.0f, 2.0f, float(3)), float2(4.0f, 5.0f), float2(6.0f, 7.0f)))";
+      return R"(_tint_texture.SampleGrad(_tint_sampler, float3(1.0f, 2.0f, float(3)), float2(4.0f, 5.0f), float2(6.0f, 7.0f)))";
     case ValidTextureOverload::kSampleGrad2dArrayOffsetF32:
-      return R"(texture_tint_0.SampleGrad(sampler_tint_0, float3(1.0f, 2.0f, float(3)), float2(4.0f, 5.0f), float2(6.0f, 7.0f), int2(8, 9)))";
+      return R"(_tint_texture.SampleGrad(_tint_sampler, float3(1.0f, 2.0f, float(3)), float2(4.0f, 5.0f), float2(6.0f, 7.0f), int2(8, 9)))";
     case ValidTextureOverload::kSampleGrad3dF32:
-      return R"(texture_tint_0.SampleGrad(sampler_tint_0, float3(1.0f, 2.0f, 3.0f), float3(4.0f, 5.0f, 6.0f), float3(7.0f, 8.0f, 9.0f)))";
+      return R"(_tint_texture.SampleGrad(_tint_sampler, float3(1.0f, 2.0f, 3.0f), float3(4.0f, 5.0f, 6.0f), float3(7.0f, 8.0f, 9.0f)))";
     case ValidTextureOverload::kSampleGrad3dOffsetF32:
-      return R"(texture_tint_0.SampleGrad(sampler_tint_0, float3(1.0f, 2.0f, 3.0f), float3(4.0f, 5.0f, 6.0f), float3(7.0f, 8.0f, 9.0f), int3(10, 11, 12)))";
+      return R"(_tint_texture.SampleGrad(_tint_sampler, float3(1.0f, 2.0f, 3.0f), float3(4.0f, 5.0f, 6.0f), float3(7.0f, 8.0f, 9.0f), int3(10, 11, 12)))";
     case ValidTextureOverload::kSampleGradCubeF32:
-      return R"(texture_tint_0.SampleGrad(sampler_tint_0, float3(1.0f, 2.0f, 3.0f), float3(4.0f, 5.0f, 6.0f), float3(7.0f, 8.0f, 9.0f)))";
+      return R"(_tint_texture.SampleGrad(_tint_sampler, float3(1.0f, 2.0f, 3.0f), float3(4.0f, 5.0f, 6.0f), float3(7.0f, 8.0f, 9.0f)))";
     case ValidTextureOverload::kSampleGradCubeArrayF32:
-      return R"(texture_tint_0.SampleGrad(sampler_tint_0, float4(1.0f, 2.0f, 3.0f, float(4)), float3(5.0f, 6.0f, 7.0f), float3(8.0f, 9.0f, 10.0f)))";
+      return R"(_tint_texture.SampleGrad(_tint_sampler, float4(1.0f, 2.0f, 3.0f, float(4)), float3(5.0f, 6.0f, 7.0f), float3(8.0f, 9.0f, 10.0f)))";
     case ValidTextureOverload::kSampleCompareDepth2dF32:
-      return R"(texture_tint_0.SampleCmp(sampler_tint_0, float2(1.0f, 2.0f), 3.0f))";
+      return R"(_tint_texture.SampleCmp(_tint_sampler, float2(1.0f, 2.0f), 3.0f))";
     case ValidTextureOverload::kSampleCompareDepth2dOffsetF32:
-      return R"(texture_tint_0.SampleCmp(sampler_tint_0, float2(1.0f, 2.0f), 3.0f, int2(4, 5)))";
+      return R"(_tint_texture.SampleCmp(_tint_sampler, float2(1.0f, 2.0f), 3.0f, int2(4, 5)))";
     case ValidTextureOverload::kSampleCompareDepth2dArrayF32:
-      return R"(texture_tint_0.SampleCmp(sampler_tint_0, float3(1.0f, 2.0f, float(4)), 3.0f))";
+      return R"(_tint_texture.SampleCmp(_tint_sampler, float3(1.0f, 2.0f, float(4)), 3.0f))";
     case ValidTextureOverload::kSampleCompareDepth2dArrayOffsetF32:
-      return R"(texture_tint_0.SampleCmp(sampler_tint_0, float3(1.0f, 2.0f, float(4)), 3.0f, int2(5, 6)))";
+      return R"(_tint_texture.SampleCmp(_tint_sampler, float3(1.0f, 2.0f, float(4)), 3.0f, int2(5, 6)))";
     case ValidTextureOverload::kSampleCompareDepthCubeF32:
-      return R"(texture_tint_0.SampleCmp(sampler_tint_0, float3(1.0f, 2.0f, 3.0f), 4.0f))";
+      return R"(_tint_texture.SampleCmp(_tint_sampler, float3(1.0f, 2.0f, 3.0f), 4.0f))";
     case ValidTextureOverload::kSampleCompareDepthCubeArrayF32:
-      return R"(texture_tint_0.SampleCmp(sampler_tint_0, float4(1.0f, 2.0f, 3.0f, float(4)), 5.0f))";
+      return R"(_tint_texture.SampleCmp(_tint_sampler, float4(1.0f, 2.0f, 3.0f, float(4)), 5.0f))";
     case ValidTextureOverload::kLoad1dLevelF32:
-      return R"(texture_tint_0.Load(int2(1, 0), 3))";
+      return R"(_tint_texture.Load(int2(1, 0), 3))";
     case ValidTextureOverload::kLoad1dLevelU32:
-      return R"(texture_tint_0.Load(int2(1, 0), 3))";
+      return R"(_tint_texture.Load(int2(1, 0), 3))";
     case ValidTextureOverload::kLoad1dLevelI32:
-      return R"(texture_tint_0.Load(int2(1, 0), 3))";
+      return R"(_tint_texture.Load(int2(1, 0), 3))";
     case ValidTextureOverload::kLoad2dLevelF32:
-      return R"(texture_tint_0.Load(int3(1, 2, 0), 3))";
+      return R"(_tint_texture.Load(int3(1, 2, 0), 3))";
     case ValidTextureOverload::kLoad2dLevelU32:
-      return R"(texture_tint_0.Load(int3(1, 2, 0), 3))";
+      return R"(_tint_texture.Load(int3(1, 2, 0), 3))";
     case ValidTextureOverload::kLoad2dLevelI32:
-      return R"(texture_tint_0.Load(int3(1, 2, 0), 3))";
+      return R"(_tint_texture.Load(int3(1, 2, 0), 3))";
     case ValidTextureOverload::kLoad2dArrayLevelF32:
-      return R"(texture_tint_0.Load(int4(1, 2, 3, 0), 4))";
+      return R"(_tint_texture.Load(int4(1, 2, 3, 0), 4))";
     case ValidTextureOverload::kLoad2dArrayLevelU32:
-      return R"(texture_tint_0.Load(int4(1, 2, 3, 0), 4))";
+      return R"(_tint_texture.Load(int4(1, 2, 3, 0), 4))";
     case ValidTextureOverload::kLoad2dArrayLevelI32:
-      return R"(texture_tint_0.Load(int4(1, 2, 3, 0), 4))";
+      return R"(_tint_texture.Load(int4(1, 2, 3, 0), 4))";
     case ValidTextureOverload::kLoad3dLevelF32:
-      return R"(texture_tint_0.Load(int4(1, 2, 3, 0), 4))";
+      return R"(_tint_texture.Load(int4(1, 2, 3, 0), 4))";
     case ValidTextureOverload::kLoad3dLevelU32:
-      return R"(texture_tint_0.Load(int4(1, 2, 3, 0), 4))";
+      return R"(_tint_texture.Load(int4(1, 2, 3, 0), 4))";
     case ValidTextureOverload::kLoad3dLevelI32:
-      return R"(texture_tint_0.Load(int4(1, 2, 3, 0), 4))";
+      return R"(_tint_texture.Load(int4(1, 2, 3, 0), 4))";
     case ValidTextureOverload::kLoadMultisampled2dF32:
-      return R"(texture_tint_0.Load(int3(1, 2, 0), 3))";
+      return R"(_tint_texture.Load(int3(1, 2, 0), 3))";
     case ValidTextureOverload::kLoadMultisampled2dU32:
-      return R"(texture_tint_0.Load(int3(1, 2, 0), 3))";
+      return R"(_tint_texture.Load(int3(1, 2, 0), 3))";
     case ValidTextureOverload::kLoadMultisampled2dI32:
-      return R"(texture_tint_0.Load(int3(1, 2, 0), 3))";
+      return R"(_tint_texture.Load(int3(1, 2, 0), 3))";
     case ValidTextureOverload::kLoadMultisampled2dArrayF32:
-      return R"(texture_tint_0.Load(int4(1, 2, 3, 0), 4))";
+      return R"(_tint_texture.Load(int4(1, 2, 3, 0), 4))";
     case ValidTextureOverload::kLoadMultisampled2dArrayU32:
-      return R"(texture_tint_0.Load(int4(1, 2, 3, 0), 4))";
+      return R"(_tint_texture.Load(int4(1, 2, 3, 0), 4))";
     case ValidTextureOverload::kLoadMultisampled2dArrayI32:
-      return R"(texture_tint_0.Load(int4(1, 2, 3, 0), 4))";
+      return R"(_tint_texture.Load(int4(1, 2, 3, 0), 4))";
     case ValidTextureOverload::kLoadDepth2dLevelF32:
-      return R"(texture_tint_0.Load(int3(1, 2, 0), 3))";
+      return R"(_tint_texture.Load(int3(1, 2, 0), 3))";
     case ValidTextureOverload::kLoadDepth2dArrayLevelF32:
-      return R"(texture_tint_0.Load(int4(1, 2, 3, 0), 4))";
+      return R"(_tint_texture.Load(int4(1, 2, 3, 0), 4))";
     case ValidTextureOverload::kLoadStorageRO1dRgba32float:
-      return R"(texture_tint_0.Load(int2(1, 0)))";
+      return R"(_tint_texture.Load(int2(1, 0)))";
     case ValidTextureOverload::kLoadStorageRO2dRgba8unorm:
     case ValidTextureOverload::kLoadStorageRO2dRgba8snorm:
     case ValidTextureOverload::kLoadStorageRO2dRgba8uint:
@@ -355,19 +359,19 @@
     case ValidTextureOverload::kLoadStorageRO2dRgba32uint:
     case ValidTextureOverload::kLoadStorageRO2dRgba32sint:
     case ValidTextureOverload::kLoadStorageRO2dRgba32float:
-      return R"(texture_tint_0.Load(int3(1, 2, 0)))";
+      return R"(_tint_texture.Load(int3(1, 2, 0)))";
     case ValidTextureOverload::kLoadStorageRO2dArrayRgba32float:
-      return R"(texture_tint_0.Load(int4(1, 2, 3, 0)))";
+      return R"(_tint_texture.Load(int4(1, 2, 3, 0)))";
     case ValidTextureOverload::kLoadStorageRO3dRgba32float:
-      return R"(texture_tint_0.Load(int4(1, 2, 3, 0)))";
+      return R"(_tint_texture.Load(int4(1, 2, 3, 0)))";
     case ValidTextureOverload::kStoreWO1dRgba32float:
-      return R"(texture_tint_0[1] = float4(2.0f, 3.0f, 4.0f, 5.0f))";
+      return R"(_tint_texture[1] = float4(2.0f, 3.0f, 4.0f, 5.0f))";
     case ValidTextureOverload::kStoreWO2dRgba32float:
-      return R"(texture_tint_0[int2(1, 2)] = float4(3.0f, 4.0f, 5.0f, 6.0f))";
+      return R"(_tint_texture[int2(1, 2)] = float4(3.0f, 4.0f, 5.0f, 6.0f))";
     case ValidTextureOverload::kStoreWO2dArrayRgba32float:
-      return R"(texture_tint_0[int3(1, 2, 3)] = float4(4.0f, 5.0f, 6.0f, 7.0f))";
+      return R"(_tint_texture[int3(1, 2, 3)] = float4(4.0f, 5.0f, 6.0f, 7.0f))";
     case ValidTextureOverload::kStoreWO3dRgba32float:
-      return R"(texture_tint_0[int3(1, 2, 3)] = float4(4.0f, 5.0f, 6.0f, 7.0f))";
+      return R"(_tint_texture[int3(1, 2, 3)] = float4(4.0f, 5.0f, 6.0f, 7.0f))";
   }
   return "<unmatched texture overload>";
 }  // NOLINT - Ignore the length of this function
@@ -391,14 +395,14 @@
            create<ast::StageDecoration>(ast::PipelineStage::kFragment),
        });
 
-  GeneratorImpl& gen = Build();
+  GeneratorImpl& gen = SanitizeAndBuild();
 
-  ASSERT_TRUE(gen.EmitExpression(pre, out, call)) << gen.error();
+  ASSERT_TRUE(gen.Generate(out)) << gen.error();
 
   auto expected = expected_texture_overload(param.overload);
 
-  EXPECT_EQ(expected.pre, pre_result());
-  EXPECT_EQ(expected.out, result());
+  EXPECT_THAT(result(), HasSubstr(expected.pre));
+  EXPECT_THAT(result(), HasSubstr(expected.out));
 
   Validate();
 }
diff --git a/src/writer/hlsl/generator_impl_sanitizer_test.cc b/src/writer/hlsl/generator_impl_sanitizer_test.cc
index 229931d..48fbb06 100644
--- a/src/writer/hlsl/generator_impl_sanitizer_test.cc
+++ b/src/writer/hlsl/generator_impl_sanitizer_test.cc
@@ -62,10 +62,10 @@
 ByteAddressBuffer sb : register(t0, space1);
 
 void main() {
-  uint tint_symbol_9 = 0u;
-  sb.GetDimensions(tint_symbol_9);
-  const uint tint_symbol_10 = ((tint_symbol_9 - 16u) / 16u);
-  uint len = tint_symbol_10;
+  uint tint_symbol_7 = 0u;
+  sb.GetDimensions(tint_symbol_7);
+  const uint tint_symbol_9 = ((tint_symbol_7 - 16u) / 16u);
+  uint len = tint_symbol_9;
   return;
 }
 
diff --git a/src/writer/hlsl/generator_impl_test.cc b/src/writer/hlsl/generator_impl_test.cc
index f800f0e..a47cd9e 100644
--- a/src/writer/hlsl/generator_impl_test.cc
+++ b/src/writer/hlsl/generator_impl_test.cc
@@ -41,23 +41,15 @@
 }
 
 TEST_F(HlslGeneratorImplTest, InputStructName_ConflictWithExisting) {
-  // Register the struct name as existing.
+  Symbols().Register("func_main_out_1");
+  Symbols().Register("func_main_out_2");
+
   GeneratorImpl& gen = Build();
 
-  auto* namer = gen.namer_for_testing();
-  namer->NameFor("func_main_out");
-
+  ASSERT_EQ(gen.generate_name("func_main_out"), "func_main_out");
   ASSERT_EQ(gen.generate_name("func_main_out"), "func_main_out_0");
-}
-
-TEST_F(HlslGeneratorImplTest, NameConflictWith_InputStructName) {
-  auto* expr = Expr("func_main_in");
-
-  GeneratorImpl& gen = Build();
-
-  ASSERT_EQ(gen.generate_name("func_main_in"), "func_main_in");
-  ASSERT_TRUE(gen.EmitIdentifier(pre, out, expr));
-  EXPECT_EQ(result(), "func_main_in_0");
+  ASSERT_EQ(gen.generate_name("func_main_out"), "func_main_out_3");
+  ASSERT_EQ(gen.generate_name("func_main_out"), "func_main_out_4");
 }
 
 struct HlslBuiltinData {
diff --git a/src/writer/hlsl/generator_impl_type_test.cc b/src/writer/hlsl/generator_impl_type_test.cc
index fb871e4..bb64ba4 100644
--- a/src/writer/hlsl/generator_impl_type_test.cc
+++ b/src/writer/hlsl/generator_impl_type_test.cc
@@ -42,16 +42,6 @@
   EXPECT_EQ(result(), "alias");
 }
 
-TEST_F(HlslGeneratorImplTest_Type, EmitType_Alias_NameCollision) {
-  auto* alias = ty.alias("bool", ty.f32());
-
-  GeneratorImpl& gen = Build();
-
-  ASSERT_TRUE(gen.EmitType(out, alias, ast::StorageClass::kNone, ""))
-      << gen.error();
-  EXPECT_EQ(result(), "bool_tint_0");
-}
-
 TEST_F(HlslGeneratorImplTest_Type, EmitType_Array) {
   auto* arr = ty.array<bool, 4>();
 
@@ -94,16 +84,6 @@
   EXPECT_EQ(result(), "bool ary[6][5][4]");
 }
 
-TEST_F(HlslGeneratorImplTest_Type, EmitType_Array_NameCollision) {
-  auto* arr = ty.array<bool, 4>();
-
-  GeneratorImpl& gen = Build();
-
-  ASSERT_TRUE(gen.EmitType(out, arr, ast::StorageClass::kNone, "bool"))
-      << gen.error();
-  EXPECT_EQ(result(), "bool bool_tint_0[4]");
-}
-
 TEST_F(HlslGeneratorImplTest_Type, EmitType_Array_WithoutName) {
   auto* arr = ty.array<bool, 4>();
 
@@ -124,17 +104,6 @@
   EXPECT_EQ(result(), "bool ary[]");
 }
 
-TEST_F(HlslGeneratorImplTest_Type,
-       DISABLED_EmitType_RuntimeArray_NameCollision) {
-  auto* arr = ty.array<bool>();
-
-  GeneratorImpl& gen = Build();
-
-  ASSERT_TRUE(gen.EmitType(out, arr, ast::StorageClass::kNone, "double"))
-      << gen.error();
-  EXPECT_EQ(result(), "bool double_tint_0[]");
-}
-
 TEST_F(HlslGeneratorImplTest_Type, EmitType_Bool) {
   auto* bool_ = ty.bool_();
 
@@ -263,14 +232,14 @@
                            });
   Global("g", s, ast::StorageClass::kPrivate);
 
-  GeneratorImpl& gen = Build();
+  GeneratorImpl& gen = SanitizeAndBuild();
 
-  ASSERT_TRUE(gen.EmitStructType(out, s, "S")) << gen.error();
-  EXPECT_EQ(result(), R"(struct S {
-  int double_tint_0;
-  float float_tint_0;
+  ASSERT_TRUE(gen.Generate(out)) << gen.error();
+  EXPECT_THAT(result(), HasSubstr(R"(struct S {
+  int _tint_double;
+  float _tint_float;
 };
-)");
+)"));
 }
 
 // TODO(dsinclair): How to translate [[block]]
diff --git a/src/writer/hlsl/namer.cc b/src/writer/hlsl/namer.cc
deleted file mode 100644
index 79e4975..0000000
--- a/src/writer/hlsl/namer.cc
+++ /dev/null
@@ -1,694 +0,0 @@
-// Copyright 2020 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "src/writer/hlsl/namer.h"
-
-#include <algorithm>
-
-namespace tint {
-namespace writer {
-namespace hlsl {
-namespace {
-
-// This list is used for a binary search and must be kept in sorted order.
-const char* kNames[] = {"AddressU",
-                        "AddressV",
-                        "AddressW",
-                        "AllMemoryBarrier",
-                        "AllMemoryBarrierWithGroupSync",
-                        "AppendStructuredBuffer",
-                        "BINORMAL",
-                        "BLENDINDICES",
-                        "BLENDWEIGHT",
-                        "BlendState",
-                        "BorderColor",
-                        "Buffer",
-                        "ByteAddressBuffer",
-                        "COLOR",
-                        "CheckAccessFullyMapped",
-                        "ComparisonFunc",
-                        "CompileShader",
-                        "ComputeShader",
-                        "ConsumeStructuredBuffer",
-                        "D3DCOLORtoUBYTE4",
-                        "DEPTH",
-                        "DepthStencilState",
-                        "DepthStencilView",
-                        "DeviceMemoryBarrier",
-                        "DeviceMemroyBarrierWithGroupSync",
-                        "DomainShader",
-                        "EvaluateAttributeAtCentroid",
-                        "EvaluateAttributeAtSample",
-                        "EvaluateAttributeSnapped",
-                        "FOG",
-                        "Filter",
-                        "GeometryShader",
-                        "GetRenderTargetSampleCount",
-                        "GetRenderTargetSamplePosition",
-                        "GroupMemoryBarrier",
-                        "GroupMemroyBarrierWithGroupSync",
-                        "Hullshader",
-                        "InputPatch",
-                        "InterlockedAdd",
-                        "InterlockedAnd",
-                        "InterlockedCompareExchange",
-                        "InterlockedCompareStore",
-                        "InterlockedExchange",
-                        "InterlockedMax",
-                        "InterlockedMin",
-                        "InterlockedOr",
-                        "InterlockedXor",
-                        "LineStream",
-                        "MaxAnisotropy",
-                        "MaxLOD",
-                        "MinLOD",
-                        "MipLODBias",
-                        "NORMAL",
-                        "NULL",
-                        "Normal",
-                        "OutputPatch",
-                        "POSITION",
-                        "POSITIONT",
-                        "PSIZE",
-                        "PixelShader",
-                        "PointStream",
-                        "Process2DQuadTessFactorsAvg",
-                        "Process2DQuadTessFactorsMax",
-                        "Process2DQuadTessFactorsMin",
-                        "ProcessIsolineTessFactors",
-                        "ProcessQuadTessFactorsAvg",
-                        "ProcessQuadTessFactorsMax",
-                        "ProcessQuadTessFactorsMin",
-                        "ProcessTriTessFactorsAvg",
-                        "ProcessTriTessFactorsMax",
-                        "ProcessTriTessFactorsMin",
-                        "RWBuffer",
-                        "RWByteAddressBuffer",
-                        "RWStructuredBuffer",
-                        "RWTexture1D",
-                        "RWTexture2D",
-                        "RWTexture2DArray",
-                        "RWTexture3D",
-                        "RasterizerState",
-                        "RenderTargetView",
-                        "SV_ClipDistance",
-                        "SV_Coverage",
-                        "SV_CullDistance",
-                        "SV_Depth",
-                        "SV_DepthGreaterEqual",
-                        "SV_DepthLessEqual",
-                        "SV_DispatchThreadID",
-                        "SV_DomainLocation",
-                        "SV_GSInstanceID",
-                        "SV_GroupID",
-                        "SV_GroupIndex",
-                        "SV_GroupThreadID",
-                        "SV_InnerCoverage",
-                        "SV_InsideTessFactor",
-                        "SV_InstanceID",
-                        "SV_IsFrontFace",
-                        "SV_OutputControlPointID",
-                        "SV_Position",
-                        "SV_PrimitiveID",
-                        "SV_RenderTargetArrayIndex",
-                        "SV_SampleIndex",
-                        "SV_StencilRef",
-                        "SV_Target",
-                        "SV_TessFactor",
-                        "SV_VertexArrayIndex",
-                        "SV_VertexID",
-                        "Sampler",
-                        "Sampler1D",
-                        "Sampler2D",
-                        "Sampler3D",
-                        "SamplerCUBE",
-                        "StructuredBuffer",
-                        "TANGENT",
-                        "TESSFACTOR",
-                        "TEXCOORD",
-                        "Texcoord",
-                        "Texture",
-                        "Texture1D",
-                        "Texture2D",
-                        "Texture2DArray",
-                        "Texture2DMS",
-                        "Texture2DMSArray",
-                        "Texture3D",
-                        "TextureCube",
-                        "TextureCubeArray",
-                        "TriangleStream",
-                        "VFACE",
-                        "VPOS",
-                        "VertexShader",
-                        "abort",
-                        "abs",
-                        "acos",
-                        "all",
-                        "allow_uav_condition",
-                        "any",
-                        "asdouble",
-                        "asfloat",
-                        "asin",
-                        "asint",
-                        "asm",
-                        "asm_fragment",
-                        "asuint",
-                        "atan",
-                        "atan2",
-                        "auto",
-                        "bool",
-                        "bool1",
-                        "bool1x1",
-                        "bool1x2",
-                        "bool1x3",
-                        "bool1x4",
-                        "bool2",
-                        "bool2x1",
-                        "bool2x2",
-                        "bool2x3",
-                        "bool2x4",
-                        "bool3",
-                        "bool3x1",
-                        "bool3x2",
-                        "bool3x3",
-                        "bool3x4",
-                        "bool4",
-                        "bool4x1",
-                        "bool4x2",
-                        "bool4x3",
-                        "bool4x4",
-                        "branch",
-                        "break",
-                        "call",
-                        "case",
-                        "catch",
-                        "cbuffer",
-                        "ceil",
-                        "centroid",
-                        "char",
-                        "clamp",
-                        "class",
-                        "clip",
-                        "column_major",
-                        "compile_fragment",
-                        "const",
-                        "const_cast",
-                        "continue",
-                        "cos",
-                        "cosh",
-                        "countbits",
-                        "cross",
-                        "ddx",
-                        "ddx_coarse",
-                        "ddx_fine",
-                        "ddy",
-                        "ddy_coarse",
-                        "ddy_fine",
-                        "degrees",
-                        "delete",
-                        "determinant",
-                        "discard",
-                        "distance",
-                        "do",
-                        "dot",
-                        "double",
-                        "double1",
-                        "double1x1",
-                        "double1x2",
-                        "double1x3",
-                        "double1x4",
-                        "double2",
-                        "double2x1",
-                        "double2x2",
-                        "double2x3",
-                        "double2x4",
-                        "double3",
-                        "double3x1",
-                        "double3x2",
-                        "double3x3",
-                        "double3x4",
-                        "double4",
-                        "double4x1",
-                        "double4x2",
-                        "double4x3",
-                        "double4x4",
-                        "dst",
-                        "dword",
-                        "dword1",
-                        "dword1x1",
-                        "dword1x2",
-                        "dword1x3",
-                        "dword1x4",
-                        "dword2",
-                        "dword2x1",
-                        "dword2x2",
-                        "dword2x3",
-                        "dword2x4",
-                        "dword3",
-                        "dword3x1",
-                        "dword3x2",
-                        "dword3x3",
-                        "dword3x4",
-                        "dword4",
-                        "dword4x1",
-                        "dword4x2",
-                        "dword4x3",
-                        "dword4x4",
-                        "dynamic_cast",
-                        "else",
-                        "enum",
-                        "errorf",
-                        "exp",
-                        "exp2",
-                        "explicit",
-                        "export",
-                        "extern",
-                        "f16to32",
-                        "f32tof16",
-                        "faceforward",
-                        "false",
-                        "fastopt",
-                        "firstbithigh",
-                        "firstbitlow",
-                        "flatten",
-                        "float",
-                        "float1",
-                        "float1x1",
-                        "float1x2",
-                        "float1x3",
-                        "float1x4",
-                        "float2",
-                        "float2x1",
-                        "float2x2",
-                        "float2x3",
-                        "float2x4",
-                        "float3",
-                        "float3x1",
-                        "float3x2",
-                        "float3x3",
-                        "float3x4",
-                        "float4",
-                        "float4x1",
-                        "float4x2",
-                        "float4x3",
-                        "float4x4",
-                        "floor",
-                        "fma",
-                        "fmod",
-                        "for",
-                        "forcecase",
-                        "frac",
-                        "frexp",
-                        "friend",
-                        "fwidth",
-                        "fxgroup",
-                        "goto",
-                        "groupshared",
-                        "half",
-                        "half1",
-                        "half1x1",
-                        "half1x2",
-                        "half1x3",
-                        "half1x4",
-                        "half2",
-                        "half2x1",
-                        "half2x2",
-                        "half2x3",
-                        "half2x4",
-                        "half3",
-                        "half3x1",
-                        "half3x2",
-                        "half3x3",
-                        "half3x4",
-                        "half4",
-                        "half4x1",
-                        "half4x2",
-                        "half4x3",
-                        "half4x4",
-                        "if",
-                        "in",
-                        "inline",
-                        "inout",
-                        "int",
-                        "int1",
-                        "int1x1",
-                        "int1x2",
-                        "int1x3",
-                        "int1x4",
-                        "int2",
-                        "int2x1",
-                        "int2x2",
-                        "int2x3",
-                        "int2x4",
-                        "int3",
-                        "int3x1",
-                        "int3x2",
-                        "int3x3",
-                        "int3x4",
-                        "int4",
-                        "int4x1",
-                        "int4x2",
-                        "int4x3",
-                        "int4x4",
-                        "interface",
-                        "isfinite",
-                        "isinf",
-                        "isnan",
-                        "ldexp",
-                        "length",
-                        "lerp",
-                        "lineadj",
-                        "linear",
-                        "lit",
-                        "log",
-                        "log10",
-                        "log2",
-                        "long",
-                        "loop",
-                        "mad",
-                        "matrix",
-                        "max",
-                        "min",
-                        "min10float",
-                        "min10float1",
-                        "min10float1x1",
-                        "min10float1x2",
-                        "min10float1x3",
-                        "min10float1x4",
-                        "min10float2",
-                        "min10float2x1",
-                        "min10float2x2",
-                        "min10float2x3",
-                        "min10float2x4",
-                        "min10float3",
-                        "min10float3x1",
-                        "min10float3x2",
-                        "min10float3x3",
-                        "min10float3x4",
-                        "min10float4",
-                        "min10float4x1",
-                        "min10float4x2",
-                        "min10float4x3",
-                        "min10float4x4",
-                        "min12int",
-                        "min12int1",
-                        "min12int1x1",
-                        "min12int1x2",
-                        "min12int1x3",
-                        "min12int1x4",
-                        "min12int2",
-                        "min12int2x1",
-                        "min12int2x2",
-                        "min12int2x3",
-                        "min12int2x4",
-                        "min12int3",
-                        "min12int3x1",
-                        "min12int3x2",
-                        "min12int3x3",
-                        "min12int3x4",
-                        "min12int4",
-                        "min12int4x1",
-                        "min12int4x2",
-                        "min12int4x3",
-                        "min12int4x4",
-                        "min16float",
-                        "min16float1",
-                        "min16float1x1",
-                        "min16float1x2",
-                        "min16float1x3",
-                        "min16float1x4",
-                        "min16float2",
-                        "min16float2x1",
-                        "min16float2x2",
-                        "min16float2x3",
-                        "min16float2x4",
-                        "min16float3",
-                        "min16float3x1",
-                        "min16float3x2",
-                        "min16float3x3",
-                        "min16float3x4",
-                        "min16float4",
-                        "min16float4x1",
-                        "min16float4x2",
-                        "min16float4x3",
-                        "min16float4x4",
-                        "min16int",
-                        "min16int1",
-                        "min16int1x1",
-                        "min16int1x2",
-                        "min16int1x3",
-                        "min16int1x4",
-                        "min16int2",
-                        "min16int2x1",
-                        "min16int2x2",
-                        "min16int2x3",
-                        "min16int2x4",
-                        "min16int3",
-                        "min16int3x1",
-                        "min16int3x2",
-                        "min16int3x3",
-                        "min16int3x4",
-                        "min16int4",
-                        "min16int4x1",
-                        "min16int4x2",
-                        "min16int4x3",
-                        "min16int4x4",
-                        "min16uint",
-                        "min16uint1",
-                        "min16uint1x1",
-                        "min16uint1x2",
-                        "min16uint1x3",
-                        "min16uint1x4",
-                        "min16uint2",
-                        "min16uint2x1",
-                        "min16uint2x2",
-                        "min16uint2x3",
-                        "min16uint2x4",
-                        "min16uint3",
-                        "min16uint3x1",
-                        "min16uint3x2",
-                        "min16uint3x3",
-                        "min16uint3x4",
-                        "min16uint4",
-                        "min16uint4x1",
-                        "min16uint4x2",
-                        "min16uint4x3",
-                        "min16uint4x4",
-                        "modf",
-                        "msad4",
-                        "mul",
-                        "mutable",
-                        "namespace",
-                        "new",
-                        "nointerpolation",
-                        "noise",
-                        "noperspective",
-                        "normalize",
-                        "numthreads",
-                        "operator",
-                        "out",
-                        "packoffset",
-                        "pass",
-                        "pixelfragment",
-                        "pixelshader",
-                        "point",
-                        "pow",
-                        "precise",
-                        "printf",
-                        "private",
-                        "protected",
-                        "public",
-                        "radians",
-                        "rcp",
-                        "reflect",
-                        "refract",
-                        "register",
-                        "reinterpret_cast",
-                        "return",
-                        "reversebits",
-                        "round",
-                        "row_major",
-                        "rsqrt",
-                        "sample",
-                        "sampler",
-                        "sampler1D",
-                        "sampler2D",
-                        "sampler3D",
-                        "samplerCUBE",
-                        "sampler_state",
-                        "saturate",
-                        "shared",
-                        "short",
-                        "sign",
-                        "signed",
-                        "sin",
-                        "sincos",
-                        "sinh",
-                        "sizeof",
-                        "smoothstep",
-                        "snorm",
-                        "sqrt",
-                        "stateblock",
-                        "stateblock_state",
-                        "static",
-                        "static_cast",
-                        "step",
-                        "string",
-                        "struct",
-                        "switch",
-                        "tan",
-                        "tanh",
-                        "tbuffer",
-                        "technique",
-                        "technique10",
-                        "technique11",
-                        "template",
-                        "tex1D",
-                        "tex1Dbias",
-                        "tex1Dgrad",
-                        "tex1Dlod",
-                        "tex1Dproj",
-                        "tex2D",
-                        "tex2Dbias",
-                        "tex2Dgrad",
-                        "tex2Dlod",
-                        "tex2Dproj",
-                        "tex3D",
-                        "tex3Dbias",
-                        "tex3Dgrad",
-                        "tex3Dlod",
-                        "tex3Dproj",
-                        "texCUBE",
-                        "texCUBEbias",
-                        "texCUBEgrad",
-                        "texCUBElod",
-                        "texCUBEproj",
-                        "texture",
-                        "texture1D",
-                        "texture1DArray",
-                        "texture2D",
-                        "texture2DArray",
-                        "texture2DMS",
-                        "texture2DMSArray",
-                        "texture3D",
-                        "textureCube",
-                        "textureCubeArray",
-                        "this",
-                        "throw",
-                        "transpose",
-                        "triangle",
-                        "triangleadj",
-                        "true",
-                        "trunc",
-                        "try",
-                        "typedef",
-                        "typename",
-                        "uint",
-                        "uint1",
-                        "uint1x1",
-                        "uint1x2",
-                        "uint1x3",
-                        "uint1x4",
-                        "uint2",
-                        "uint2x1",
-                        "uint2x2",
-                        "uint2x3",
-                        "uint2x4",
-                        "uint3",
-                        "uint3x1",
-                        "uint3x2",
-                        "uint3x3",
-                        "uint3x4",
-                        "uint4",
-                        "uint4x1",
-                        "uint4x2",
-                        "uint4x3",
-                        "uint4x4",
-                        "uniform",
-                        "union",
-                        "unorm",
-                        "unroll",
-                        "unsigned",
-                        "using",
-                        "vector",
-                        "vertexfragment",
-                        "vertexshader",
-                        "virtual",
-                        "void",
-                        "volatile",
-                        "while"};
-
-}  // namespace
-
-Namer::Namer() = default;
-
-Namer::~Namer() = default;
-
-std::string Namer::NameFor(const std::string& name) {
-  // If it's in the name map we can just return it. There are no shadow names
-  // in WGSL so this has to be unique in the WGSL names, and we've already
-  // checked the name collisions with HLSL.
-  auto it = name_map_.find(name);
-  if (it != name_map_.end()) {
-    return it->second;
-  }
-
-  std::string ret_name = name;
-  if (std::binary_search(std::begin(kNames), std::end(kNames), ret_name)) {
-    uint32_t i = 0;
-    // Make sure there wasn't already a tint variable with the new name we've
-    // now created.
-    while (true) {
-      ret_name = name + "_tint_" + std::to_string(i);
-      it = name_map_.find(ret_name);
-      if (it == name_map_.end()) {
-        break;
-      }
-      i++;
-    }
-    RegisterRemappedName(ret_name);
-  } else {
-    uint32_t i = 0;
-    // Make sure the ident name wasn't assigned by a remapping.
-    while (true) {
-      if (!IsRemapped(ret_name)) {
-        break;
-      }
-      ret_name = name + "_" + std::to_string(i);
-      i++;
-    }
-    RegisterRemappedName(ret_name);
-  }
-
-  name_map_[name] = ret_name;
-  return ret_name;
-}
-
-bool Namer::IsMapped(const std::string& name) {
-  auto it = name_map_.find(name);
-  return it != name_map_.end();
-}
-
-bool Namer::IsRemapped(const std::string& name) {
-  auto it = remapped_names_.find(name);
-  return it != remapped_names_.end();
-}
-
-void Namer::RegisterRemappedName(const std::string& name) {
-  remapped_names_.insert(name);
-}
-
-}  // namespace hlsl
-}  // namespace writer
-}  // namespace tint
diff --git a/src/writer/hlsl/namer.h b/src/writer/hlsl/namer.h
deleted file mode 100644
index c067e22..0000000
--- a/src/writer/hlsl/namer.h
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright 2020 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#ifndef SRC_WRITER_HLSL_NAMER_H_
-#define SRC_WRITER_HLSL_NAMER_H_
-
-#include <string>
-#include <unordered_map>
-#include <unordered_set>
-
-namespace tint {
-namespace writer {
-namespace hlsl {
-
-/// Remaps maps names to avoid reserved words and collisions for HLSL.
-class Namer {
- public:
-  /// Constructor
-  Namer();
-  ~Namer();
-
-  /// Returns a sanitized version of `name`
-  /// @param name the name to sanitize
-  /// @returns the sanitized version of `name`
-  std::string NameFor(const std::string& name);
-
-  /// Registers a remapped name.
-  /// @param name the name to register
-  void RegisterRemappedName(const std::string& name);
-
-  /// Returns if the given name has been mapped already
-  /// @param name the name to check
-  /// @returns true if the name has been mapped
-  bool IsMapped(const std::string& name);
-
-  /// Returns if the given name has been remapped already
-  /// @param name the name to check
-  /// @returns true if the name has been remapped
-  bool IsRemapped(const std::string& name);
-
- private:
-  /// Map of original name to new name. The two names may be the same.
-  std::unordered_map<std::string, std::string> name_map_;
-  // The list of names taken by the remapper
-  std::unordered_set<std::string> remapped_names_;
-};
-
-}  // namespace hlsl
-}  // namespace writer
-}  // namespace tint
-
-#endif  // SRC_WRITER_HLSL_NAMER_H_
diff --git a/src/writer/hlsl/namer_test.cc b/src/writer/hlsl/namer_test.cc
deleted file mode 100644
index a714cb9..0000000
--- a/src/writer/hlsl/namer_test.cc
+++ /dev/null
@@ -1,665 +0,0 @@
-// Copyright 2020 The Tint Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "src/writer/hlsl/namer.h"
-
-#include "gtest/gtest.h"
-
-namespace tint {
-namespace writer {
-namespace hlsl {
-namespace {
-
-using HlslNamerTest = testing::Test;
-
-TEST_F(HlslNamerTest, ReturnsName) {
-  Namer n;
-  EXPECT_EQ("my_name", n.NameFor("my_name"));
-  EXPECT_EQ("my_name", n.NameFor("my_name"));
-}
-
-TEST_F(HlslNamerTest, HandlesConflictWithRenamedReservedWordAfterIdentSeen) {
-  Namer n;
-  EXPECT_EQ("float_tint_0", n.NameFor("float_tint_0"));
-  EXPECT_EQ("float_tint_1", n.NameFor("float"));
-  EXPECT_EQ("float_tint_0", n.NameFor("float_tint_0"));
-}
-
-TEST_F(HlslNamerTest, HandlesConflictWithRenamedReservedWordBeforeIdentSeen) {
-  Namer n;
-  EXPECT_EQ("float_tint_0", n.NameFor("float"));
-  EXPECT_EQ("float_tint_0_0", n.NameFor("float_tint_0"));
-  EXPECT_EQ("float_tint_0_0_0", n.NameFor("float_tint_0_0"));
-  EXPECT_EQ("float_tint_0_0", n.NameFor("float_tint_0"));
-}
-
-using HlslReservedNameTest = testing::TestWithParam<std::string>;
-TEST_P(HlslReservedNameTest, Emit) {
-  auto name = GetParam();
-
-  Namer n;
-  EXPECT_EQ(name + "_tint_0", n.NameFor(name));
-}
-INSTANTIATE_TEST_SUITE_P(HlslNamerTest,
-                         HlslReservedNameTest,
-                         testing::Values("AddressU",
-                                         "AddressV",
-                                         "AddressW",
-                                         "AllMemoryBarrier",
-                                         "AllMemoryBarrierWithGroupSync",
-                                         "AppendStructuredBuffer",
-                                         "BINORMAL",
-                                         "BLENDINDICES",
-                                         "BLENDWEIGHT",
-                                         "BlendState",
-                                         "BorderColor",
-                                         "Buffer",
-                                         "ByteAddressBuffer",
-                                         "COLOR",
-                                         "CheckAccessFullyMapped",
-                                         "ComparisonFunc",
-                                         "CompileShader",
-                                         "ComputeShader",
-                                         "ConsumeStructuredBuffer",
-                                         "D3DCOLORtoUBYTE4",
-                                         "DEPTH",
-                                         "DepthStencilState",
-                                         "DepthStencilView",
-                                         "DeviceMemoryBarrier",
-                                         "DeviceMemroyBarrierWithGroupSync",
-                                         "DomainShader",
-                                         "EvaluateAttributeAtCentroid",
-                                         "EvaluateAttributeAtSample",
-                                         "EvaluateAttributeSnapped",
-                                         "FOG",
-                                         "Filter",
-                                         "GeometryShader",
-                                         "GetRenderTargetSampleCount",
-                                         "GetRenderTargetSamplePosition",
-                                         "GroupMemoryBarrier",
-                                         "GroupMemroyBarrierWithGroupSync",
-                                         "Hullshader",
-                                         "InputPatch",
-                                         "InterlockedAdd",
-                                         "InterlockedAnd",
-                                         "InterlockedCompareExchange",
-                                         "InterlockedCompareStore",
-                                         "InterlockedExchange",
-                                         "InterlockedMax",
-                                         "InterlockedMin",
-                                         "InterlockedOr",
-                                         "InterlockedXor",
-                                         "LineStream",
-                                         "MaxAnisotropy",
-                                         "MaxLOD",
-                                         "MinLOD",
-                                         "MipLODBias",
-                                         "NORMAL",
-                                         "NULL",
-                                         "Normal",
-                                         "OutputPatch",
-                                         "POSITION",
-                                         "POSITIONT",
-                                         "PSIZE",
-                                         "PixelShader",
-                                         "PointStream",
-                                         "Process2DQuadTessFactorsAvg",
-                                         "Process2DQuadTessFactorsMax",
-                                         "Process2DQuadTessFactorsMin",
-                                         "ProcessIsolineTessFactors",
-                                         "ProcessQuadTessFactorsAvg",
-                                         "ProcessQuadTessFactorsMax",
-                                         "ProcessQuadTessFactorsMin",
-                                         "ProcessTriTessFactorsAvg",
-                                         "ProcessTriTessFactorsMax",
-                                         "ProcessTriTessFactorsMin",
-                                         "RWBuffer",
-                                         "RWByteAddressBuffer",
-                                         "RWStructuredBuffer",
-                                         "RWTexture1D",
-                                         "RWTexture2D",
-                                         "RWTexture2DArray",
-                                         "RWTexture3D",
-                                         "RasterizerState",
-                                         "RenderTargetView",
-                                         "SV_ClipDistance",
-                                         "SV_Coverage",
-                                         "SV_CullDistance",
-                                         "SV_Depth",
-                                         "SV_DepthGreaterEqual",
-                                         "SV_DepthLessEqual",
-                                         "SV_DispatchThreadID",
-                                         "SV_DomainLocation",
-                                         "SV_GSInstanceID",
-                                         "SV_GroupID",
-                                         "SV_GroupIndex",
-                                         "SV_GroupThreadID",
-                                         "SV_InnerCoverage",
-                                         "SV_InsideTessFactor",
-                                         "SV_InstanceID",
-                                         "SV_IsFrontFace",
-                                         "SV_OutputControlPointID",
-                                         "SV_Position",
-                                         "SV_PrimitiveID",
-                                         "SV_RenderTargetArrayIndex",
-                                         "SV_SampleIndex",
-                                         "SV_StencilRef",
-                                         "SV_Target",
-                                         "SV_TessFactor",
-                                         "SV_VertexArrayIndex",
-                                         "SV_VertexID",
-                                         "Sampler",
-                                         "Sampler1D",
-                                         "Sampler2D",
-                                         "Sampler3D",
-                                         "SamplerCUBE",
-                                         "StructuredBuffer",
-                                         "TANGENT",
-                                         "TESSFACTOR",
-                                         "TEXCOORD",
-                                         "Texcoord",
-                                         "Texture",
-                                         "Texture1D",
-                                         "Texture2D",
-                                         "Texture2DArray",
-                                         "Texture2DMS",
-                                         "Texture2DMSArray",
-                                         "Texture3D",
-                                         "TextureCube",
-                                         "TextureCubeArray",
-                                         "TriangleStream",
-                                         "VFACE",
-                                         "VPOS",
-                                         "VertexShader",
-                                         "abort",
-                                         "abs",
-                                         "acos",
-                                         "all",
-                                         "allow_uav_condition",
-                                         "any",
-                                         "asdouble",
-                                         "asfloat",
-                                         "asin",
-                                         "asint",
-                                         "asm",
-                                         "asm_fragment",
-                                         "asuint",
-                                         "atan",
-                                         "atan2",
-                                         "auto",
-                                         "bool",
-                                         "bool1",
-                                         "bool1x1",
-                                         "bool1x2",
-                                         "bool1x3",
-                                         "bool1x4",
-                                         "bool2",
-                                         "bool2x1",
-                                         "bool2x2",
-                                         "bool2x3",
-                                         "bool2x4",
-                                         "bool3",
-                                         "bool3x1",
-                                         "bool3x2",
-                                         "bool3x3",
-                                         "bool3x4",
-                                         "bool4",
-                                         "bool4x1",
-                                         "bool4x2",
-                                         "bool4x3",
-                                         "bool4x4",
-                                         "branch",
-                                         "break",
-                                         "call",
-                                         "case",
-                                         "catch",
-                                         "cbuffer",
-                                         "ceil",
-                                         "centroid",
-                                         "char",
-                                         "clamp",
-                                         "class",
-                                         "clip",
-                                         "column_major",
-                                         "compile_fragment",
-                                         "const",
-                                         "const_cast",
-                                         "continue",
-                                         "cos",
-                                         "cosh",
-                                         "countbits",
-                                         "cross",
-                                         "ddx",
-                                         "ddx_coarse",
-                                         "ddx_fine",
-                                         "ddy",
-                                         "ddy_coarse",
-                                         "ddy_fine",
-                                         "degrees",
-                                         "delete",
-                                         "determinant",
-                                         "discard",
-                                         "distance",
-                                         "do",
-                                         "dot",
-                                         "double",
-                                         "double1",
-                                         "double1x1",
-                                         "double1x2",
-                                         "double1x3",
-                                         "double1x4",
-                                         "double2",
-                                         "double2x1",
-                                         "double2x2",
-                                         "double2x3",
-                                         "double2x4",
-                                         "double3",
-                                         "double3x1",
-                                         "double3x2",
-                                         "double3x3",
-                                         "double3x4",
-                                         "double4",
-                                         "double4x1",
-                                         "double4x2",
-                                         "double4x3",
-                                         "double4x4",
-                                         "dst",
-                                         "dword",
-                                         "dword1",
-                                         "dword1x1",
-                                         "dword1x2",
-                                         "dword1x3",
-                                         "dword1x4",
-                                         "dword2",
-                                         "dword2x1",
-                                         "dword2x2",
-                                         "dword2x3",
-                                         "dword2x4",
-                                         "dword3",
-                                         "dword3x1",
-                                         "dword3x2",
-                                         "dword3x3",
-                                         "dword3x4",
-                                         "dword4",
-                                         "dword4x1",
-                                         "dword4x2",
-                                         "dword4x3",
-                                         "dword4x4",
-                                         "dynamic_cast",
-                                         "else",
-                                         "enum",
-                                         "errorf",
-                                         "exp",
-                                         "exp2",
-                                         "explicit",
-                                         "export",
-                                         "extern",
-                                         "f16to32",
-                                         "f32tof16",
-                                         "faceforward",
-                                         "false",
-                                         "fastopt",
-                                         "firstbithigh",
-                                         "firstbitlow",
-                                         "flatten",
-                                         "float",
-                                         "float1",
-                                         "float1x1",
-                                         "float1x2",
-                                         "float1x3",
-                                         "float1x4",
-                                         "float2",
-                                         "float2x1",
-                                         "float2x2",
-                                         "float2x3",
-                                         "float2x4",
-                                         "float3",
-                                         "float3x1",
-                                         "float3x2",
-                                         "float3x3",
-                                         "float3x4",
-                                         "float4",
-                                         "float4x1",
-                                         "float4x2",
-                                         "float4x3",
-                                         "float4x4",
-                                         "floor",
-                                         "fma",
-                                         "fmod",
-                                         "for",
-                                         "forcecase",
-                                         "frac",
-                                         "frexp",
-                                         "friend",
-                                         "fwidth",
-                                         "fxgroup",
-                                         "goto",
-                                         "groupshared",
-                                         "half",
-                                         "half1",
-                                         "half1x1",
-                                         "half1x2",
-                                         "half1x3",
-                                         "half1x4",
-                                         "half2",
-                                         "half2x1",
-                                         "half2x2",
-                                         "half2x3",
-                                         "half2x4",
-                                         "half3",
-                                         "half3x1",
-                                         "half3x2",
-                                         "half3x3",
-                                         "half3x4",
-                                         "half4",
-                                         "half4x1",
-                                         "half4x2",
-                                         "half4x3",
-                                         "half4x4",
-                                         "if",
-                                         "in",
-                                         "inline",
-                                         "inout",
-                                         "int",
-                                         "int1",
-                                         "int1x1",
-                                         "int1x2",
-                                         "int1x3",
-                                         "int1x4",
-                                         "int2",
-                                         "int2x1",
-                                         "int2x2",
-                                         "int2x3",
-                                         "int2x4",
-                                         "int3",
-                                         "int3x1",
-                                         "int3x2",
-                                         "int3x3",
-                                         "int3x4",
-                                         "int4",
-                                         "int4x1",
-                                         "int4x2",
-                                         "int4x3",
-                                         "int4x4",
-                                         "interface",
-                                         "isfinite",
-                                         "isinf",
-                                         "isnan",
-                                         "ldexp",
-                                         "length",
-                                         "lerp",
-                                         "lineadj",
-                                         "linear",
-                                         "lit",
-                                         "log",
-                                         "log10",
-                                         "log2",
-                                         "long",
-                                         "loop",
-                                         "mad",
-                                         "matrix",
-                                         "max",
-                                         "min",
-                                         "min10float",
-                                         "min10float1",
-                                         "min10float1x1",
-                                         "min10float1x2",
-                                         "min10float1x3",
-                                         "min10float1x4",
-                                         "min10float2",
-                                         "min10float2x1",
-                                         "min10float2x2",
-                                         "min10float2x3",
-                                         "min10float2x4",
-                                         "min10float3",
-                                         "min10float3x1",
-                                         "min10float3x2",
-                                         "min10float3x3",
-                                         "min10float3x4",
-                                         "min10float4",
-                                         "min10float4x1",
-                                         "min10float4x2",
-                                         "min10float4x3",
-                                         "min10float4x4",
-                                         "min12int",
-                                         "min12int1",
-                                         "min12int1x1",
-                                         "min12int1x2",
-                                         "min12int1x3",
-                                         "min12int1x4",
-                                         "min12int2",
-                                         "min12int2x1",
-                                         "min12int2x2",
-                                         "min12int2x3",
-                                         "min12int2x4",
-                                         "min12int3",
-                                         "min12int3x1",
-                                         "min12int3x2",
-                                         "min12int3x3",
-                                         "min12int3x4",
-                                         "min12int4",
-                                         "min12int4x1",
-                                         "min12int4x2",
-                                         "min12int4x3",
-                                         "min12int4x4",
-                                         "min16float",
-                                         "min16float1",
-                                         "min16float1x1",
-                                         "min16float1x2",
-                                         "min16float1x3",
-                                         "min16float1x4",
-                                         "min16float2",
-                                         "min16float2x1",
-                                         "min16float2x2",
-                                         "min16float2x3",
-                                         "min16float2x4",
-                                         "min16float3",
-                                         "min16float3x1",
-                                         "min16float3x2",
-                                         "min16float3x3",
-                                         "min16float3x4",
-                                         "min16float4",
-                                         "min16float4x1",
-                                         "min16float4x2",
-                                         "min16float4x3",
-                                         "min16float4x4",
-                                         "min16int",
-                                         "min16int1",
-                                         "min16int1x1",
-                                         "min16int1x2",
-                                         "min16int1x3",
-                                         "min16int1x4",
-                                         "min16int2",
-                                         "min16int2x1",
-                                         "min16int2x2",
-                                         "min16int2x3",
-                                         "min16int2x4",
-                                         "min16int3",
-                                         "min16int3x1",
-                                         "min16int3x2",
-                                         "min16int3x3",
-                                         "min16int3x4",
-                                         "min16int4",
-                                         "min16int4x1",
-                                         "min16int4x2",
-                                         "min16int4x3",
-                                         "min16int4x4",
-                                         "min16uint",
-                                         "min16uint1",
-                                         "min16uint1x1",
-                                         "min16uint1x2",
-                                         "min16uint1x3",
-                                         "min16uint1x4",
-                                         "min16uint2",
-                                         "min16uint2x1",
-                                         "min16uint2x2",
-                                         "min16uint2x3",
-                                         "min16uint2x4",
-                                         "min16uint3",
-                                         "min16uint3x1",
-                                         "min16uint3x2",
-                                         "min16uint3x3",
-                                         "min16uint3x4",
-                                         "min16uint4",
-                                         "min16uint4x1",
-                                         "min16uint4x2",
-                                         "min16uint4x3",
-                                         "min16uint4x4",
-                                         "modf",
-                                         "msad4",
-                                         "mul",
-                                         "mutable",
-                                         "namespace",
-                                         "new",
-                                         "nointerpolation",
-                                         "noise",
-                                         "noperspective",
-                                         "normalize",
-                                         "numthreads",
-                                         "operator",
-                                         "out",
-                                         "packoffset",
-                                         "pass",
-                                         "pixelfragment",
-                                         "pixelshader",
-                                         "point",
-                                         "pow",
-                                         "precise",
-                                         "printf",
-                                         "private",
-                                         "protected",
-                                         "public",
-                                         "radians",
-                                         "rcp",
-                                         "reflect",
-                                         "refract",
-                                         "register",
-                                         "reinterpret_cast",
-                                         "return",
-                                         "reversebits",
-                                         "round",
-                                         "row_major",
-                                         "rsqrt",
-                                         "sample",
-                                         "sampler1D",
-                                         "sampler2D",
-                                         "sampler3D",
-                                         "samplerCUBE",
-                                         "sampler_state",
-                                         "saturate",
-                                         "shared",
-                                         "short",
-                                         "sign",
-                                         "signed",
-                                         "sin",
-                                         "sincos",
-                                         "sinh",
-                                         "sizeof",
-                                         "smoothstep",
-                                         "snorm",
-                                         "sqrt",
-                                         "stateblock",
-                                         "stateblock_state",
-                                         "static",
-                                         "static_cast",
-                                         "step",
-                                         "string",
-                                         "struct",
-                                         "switch",
-                                         "tan",
-                                         "tanh",
-                                         "tbuffer",
-                                         "technique",
-                                         "technique10",
-                                         "technique11",
-                                         "template",
-                                         "tex1D",
-                                         "tex1Dbias",
-                                         "tex1Dgrad",
-                                         "tex1Dlod",
-                                         "tex1Dproj",
-                                         "tex2D",
-                                         "tex2Dbias",
-                                         "tex2Dgrad",
-                                         "tex2Dlod",
-                                         "tex2Dproj",
-                                         "tex3D",
-                                         "tex3Dbias",
-                                         "tex3Dgrad",
-                                         "tex3Dlod",
-                                         "tex3Dproj",
-                                         "texCUBE",
-                                         "texCUBEbias",
-                                         "texCUBEgrad",
-                                         "texCUBElod",
-                                         "texCUBEproj",
-                                         "texture",
-                                         "texture1D",
-                                         "texture1DArray",
-                                         "texture2D",
-                                         "texture2DArray",
-                                         "texture2DMS",
-                                         "texture2DMSArray",
-                                         "texture3D",
-                                         "textureCube",
-                                         "textureCubeArray",
-                                         "this",
-                                         "throw",
-                                         "transpose",
-                                         "triangle",
-                                         "triangleadj",
-                                         "true",
-                                         "trunc",
-                                         "try",
-                                         "typedef",
-                                         "typename",
-                                         "uint",
-                                         "uint1",
-                                         "uint1x1",
-                                         "uint1x2",
-                                         "uint1x3",
-                                         "uint1x4",
-                                         "uint2",
-                                         "uint2x1",
-                                         "uint2x2",
-                                         "uint2x3",
-                                         "uint2x4",
-                                         "uint3",
-                                         "uint3x1",
-                                         "uint3x2",
-                                         "uint3x3",
-                                         "uint3x4",
-                                         "uint4",
-                                         "uint4x1",
-                                         "uint4x2",
-                                         "uint4x3",
-                                         "uint4x4",
-                                         "uniform",
-                                         "union",
-                                         "unorm",
-                                         "unroll",
-                                         "unsigned",
-                                         "using",
-                                         "vector",
-                                         "vertexfragment",
-                                         "vertexshader",
-                                         "virtual",
-                                         "void",
-                                         "volatile",
-                                         "while"));
-
-}  // namespace
-}  // namespace hlsl
-}  // namespace writer
-}  // namespace tint
diff --git a/test/BUILD.gn b/test/BUILD.gn
index 6827f4b..43e014b 100644
--- a/test/BUILD.gn
+++ b/test/BUILD.gn
@@ -591,7 +591,6 @@
     "../src/writer/hlsl/generator_impl_unary_op_test.cc",
     "../src/writer/hlsl/generator_impl_variable_decl_statement_test.cc",
     "../src/writer/hlsl/generator_impl_workgroup_var_test.cc",
-    "../src/writer/hlsl/namer_test.cc",
     "../src/writer/hlsl/test_helper.cc",
     "../src/writer/hlsl/test_helper.h",
   ]