Remove internal usage of Context.

This CL removes all internal usage of the Context object. It is still
accepted as a parameter until we update Dawn, but all usage is removed.

The namer has been removed from the SPIR-V backend with this change and
the emitted names reverted to their non-modified version.

Change-Id: Ie6c550fab1807b558182cd7188ab6450a627f154
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/34740
Commit-Queue: dan sinclair <dsinclair@chromium.org>
Auto-Submit: dan sinclair <dsinclair@chromium.org>
Reviewed-by: Ryan Harrison <rharrison@chromium.org>
diff --git a/fuzzers/tint_ast_clone_fuzzer.cc b/fuzzers/tint_ast_clone_fuzzer.cc
index 71c1e27..ff72174 100644
--- a/fuzzers/tint_ast_clone_fuzzer.cc
+++ b/fuzzers/tint_ast_clone_fuzzer.cc
@@ -47,8 +47,7 @@
   tint::Source::File file("test.wgsl", str);
 
   // Parse the wgsl, create the src module
-  tint::Context ctx;
-  tint::reader::wgsl::ParserImpl parser(&ctx, &file);
+  tint::reader::wgsl::ParserImpl parser(&file);
   parser.set_max_errors(1);
   if (!parser.Parse()) {
     return 0;
diff --git a/fuzzers/tint_spv_reader_fuzzer.cc b/fuzzers/tint_spv_reader_fuzzer.cc
index 2498383..e809e55 100644
--- a/fuzzers/tint_spv_reader_fuzzer.cc
+++ b/fuzzers/tint_spv_reader_fuzzer.cc
@@ -22,8 +22,7 @@
   std::vector<uint32_t> input(u32Data, u32Data + sizeInU32);
 
   if (input.size() != 0) {
-    tint::Context ctx;
-    tint::reader::spirv::Parser parser(&ctx, input);
+    tint::reader::spirv::Parser parser(input);
     parser.Parse();
   }
 
diff --git a/fuzzers/tint_wgsl_reader_fuzzer.cc b/fuzzers/tint_wgsl_reader_fuzzer.cc
index d9c0d4e..d1a7507 100644
--- a/fuzzers/tint_wgsl_reader_fuzzer.cc
+++ b/fuzzers/tint_wgsl_reader_fuzzer.cc
@@ -20,9 +20,7 @@
   std::string str(reinterpret_cast<const char*>(data), size);
 
   tint::Source::File file("test.wgsl", str);
-
-  tint::Context ctx;
-  tint::reader::wgsl::Parser parser(&ctx, &file);
+  tint::reader::wgsl::Parser parser(&file);
   parser.Parse();
 
   return 0;
diff --git a/samples/main.cc b/samples/main.cc
index 5d4534c..dcdea27 100644
--- a/samples/main.cc
+++ b/samples/main.cc
@@ -418,8 +418,6 @@
     options.format = Format::kSpvAsm;
   }
 
-  tint::Context ctx(std::make_unique<tint::NoopNamer>());
-
   auto diag_printer = tint::diag::Printer::create(stderr, true);
   tint::diag::Formatter diag_formatter;
 
@@ -435,8 +433,7 @@
     }
     source_file = std::make_unique<tint::Source::File>(
         options.input_filename, std::string(data.begin(), data.end()));
-    reader =
-        std::make_unique<tint::reader::wgsl::Parser>(&ctx, source_file.get());
+    reader = std::make_unique<tint::reader::wgsl::Parser>(source_file.get());
   }
 #endif  // TINT_BUILD_WGSL_READER
 
@@ -449,7 +446,7 @@
     if (!ReadFile<uint32_t>(options.input_filename, &data)) {
       return 1;
     }
-    reader = std::make_unique<tint::reader::spirv::Parser>(&ctx, data);
+    reader = std::make_unique<tint::reader::spirv::Parser>(data);
   }
   // Handle SPIR-V assembly input, in files ending with .spvasm
   if (options.input_filename.size() > 7 &&
@@ -471,7 +468,7 @@
                         SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS)) {
       return 1;
     }
-    reader = std::make_unique<tint::reader::spirv::Parser>(&ctx, data);
+    reader = std::make_unique<tint::reader::spirv::Parser>(data);
   }
 #endif  // TINT_BUILD_SPV_READER
 
@@ -490,7 +487,7 @@
     return 1;
   }
 
-  tint::TypeDeterminer td(&ctx, &mod);
+  tint::TypeDeterminer td(&mod);
   if (!td.Determine()) {
     std::cerr << "Type Determination: " << td.error() << std::endl;
     return 1;
@@ -509,7 +506,7 @@
     return 1;
   }
 
-  tint::transform::Manager transform_manager(&ctx, &mod);
+  tint::transform::Manager transform_manager;
   for (const auto& name : options.transforms) {
     // TODO(dsinclair): The vertex pulling transform requires setup code to
     // be run that needs user input. Should we find a way to support that here
@@ -518,13 +515,13 @@
     if (name == "bound_array_accessors") {
       transform_manager.append(
           std::make_unique<tint::transform::BoundArrayAccessorsTransform>(
-              &ctx, &mod));
+              &mod));
     } else {
       std::cerr << "Unknown transform name: " << name << std::endl;
       return 1;
     }
   }
-  if (!transform_manager.Run()) {
+  if (!transform_manager.Run(&mod)) {
     std::cerr << "Transformer: " << transform_manager.error() << std::endl;
     return 1;
   }
@@ -533,29 +530,25 @@
 
 #if TINT_BUILD_SPV_WRITER
   if (options.format == Format::kSpirv || options.format == Format::kSpvAsm) {
-    writer =
-        std::make_unique<tint::writer::spirv::Generator>(&ctx, std::move(mod));
+    writer = std::make_unique<tint::writer::spirv::Generator>(std::move(mod));
   }
 #endif  // TINT_BUILD_SPV_WRITER
 
 #if TINT_BUILD_WGSL_WRITER
   if (options.format == Format::kWgsl) {
-    writer =
-        std::make_unique<tint::writer::wgsl::Generator>(&ctx, std::move(mod));
+    writer = std::make_unique<tint::writer::wgsl::Generator>(std::move(mod));
   }
 #endif  // TINT_BUILD_WGSL_WRITER
 
 #if TINT_BUILD_MSL_WRITER
   if (options.format == Format::kMsl) {
-    writer =
-        std::make_unique<tint::writer::msl::Generator>(&ctx, std::move(mod));
+    writer = std::make_unique<tint::writer::msl::Generator>(std::move(mod));
   }
 #endif  // TINT_BUILD_MSL_WRITER
 
 #if TINT_BUILD_HLSL_WRITER
   if (options.format == Format::kHlsl) {
-    writer =
-        std::make_unique<tint::writer::hlsl::Generator>(&ctx, std::move(mod));
+    writer = std::make_unique<tint::writer::hlsl::Generator>(std::move(mod));
   }
 #endif  // TINT_BUILD_HLSL_WRITER
 
diff --git a/src/ast/builder.cc b/src/ast/builder.cc
index cdc6835..9984977 100644
--- a/src/ast/builder.cc
+++ b/src/ast/builder.cc
@@ -25,7 +25,8 @@
       void_(mod->create<type::Void>()),
       mod_(mod) {}
 
-Builder::Builder(Context* c, Module* m) : ctx(c), mod(m), ty(m) {}
+Builder::Builder(Module* m) : mod(m), ty(m) {}
+
 Builder::~Builder() = default;
 
 Variable* Builder::Var(const std::string& name,
@@ -36,10 +37,9 @@
   return var;
 }
 
-BuilderWithContextAndModule::BuilderWithContextAndModule()
-    : Builder(new Context(), new Module()) {}
-BuilderWithContextAndModule::~BuilderWithContextAndModule() {
-  delete ctx;
+BuilderWithModule::BuilderWithModule() : Builder(new Module()) {}
+
+BuilderWithModule::~BuilderWithModule() {
   delete mod;
 }
 
diff --git a/src/ast/builder.h b/src/ast/builder.h
index 7551f92..eaa7ed7 100644
--- a/src/ast/builder.h
+++ b/src/ast/builder.h
@@ -38,7 +38,6 @@
 #include "src/ast/type_constructor_expression.h"
 #include "src/ast/uint_literal.h"
 #include "src/ast/variable.h"
-#include "src/context.h"
 
 namespace tint {
 namespace ast {
@@ -186,9 +185,8 @@
   using f32 = float;
 
   /// Constructor
-  /// @param ctx the context to use in the builder
   /// @param mod the module to use in the builder
-  explicit Builder(Context* ctx, Module* mod);
+  explicit Builder(Module* mod);
   virtual ~Builder();
 
   /// @param expr the expression
@@ -444,8 +442,6 @@
   }
 
   /// The builder module
-  Context* const ctx;
-  /// The builder module
   Module* const mod;
   /// The builder types
   const TypesBuilder ty;
@@ -455,12 +451,11 @@
   virtual void OnVariableBuilt(Variable*) {}
 };
 
-/// BuilderWithContextAndModule is a `Builder` that constructs and owns its
-/// `Context` and `Module`.
-class BuilderWithContextAndModule : public Builder {
+/// BuilderWithModule is a `Builder` that constructs and owns its `Module`.
+class BuilderWithModule : public Builder {
  public:
-  BuilderWithContextAndModule();
-  ~BuilderWithContextAndModule() override;
+  BuilderWithModule();
+  ~BuilderWithModule() override;
 };
 
 //! @cond Doxygen_Suppress
diff --git a/src/context.cc b/src/context.cc
index 88e69f9..e637879 100644
--- a/src/context.cc
+++ b/src/context.cc
@@ -21,9 +21,9 @@
 
 namespace tint {
 
-Context::Context() : namer_(std::make_unique<HashingNamer>()) {}
+Context::Context() = default;
 
-Context::Context(std::unique_ptr<Namer> namer) : namer_(std::move(namer)) {}
+Context::Context(std::unique_ptr<Namer>) {}
 
 Context::~Context() = default;
 
diff --git a/src/context.h b/src/context.h
index d21fc5b..89a89b3 100644
--- a/src/context.h
+++ b/src/context.h
@@ -41,12 +41,6 @@
   explicit Context(std::unique_ptr<Namer> namer);
   /// Destructor
   ~Context();
-
-  /// @returns the namer object
-  Namer* namer() const { return namer_.get(); }
-
- private:
-  std::unique_ptr<Namer> namer_;
 };
 
 }  // namespace tint
diff --git a/src/inspector/inspector.cc b/src/inspector/inspector.cc
index 9914d85..031723b 100644
--- a/src/inspector/inspector.cc
+++ b/src/inspector/inspector.cc
@@ -43,18 +43,12 @@
 namespace tint {
 namespace inspector {
 
-Inspector::Inspector(const ast::Module& module)
-    : ctx_(new Context()), context_is_owned_(true), module_(module) {}
+Inspector::Inspector(const ast::Module& module) : module_(module) {}
 
-Inspector::Inspector(Context* ctx, const ast::Module& module)
-    : ctx_(ctx), context_is_owned_(false), module_(module) {
-  assert(ctx);
-}
+Inspector::Inspector(Context*, const ast::Module& module)
+    : Inspector(std::move(module)) {}
 
-Inspector::~Inspector() {
-  if (context_is_owned_)
-    delete ctx_;
-}
+Inspector::~Inspector() = default;
 
 std::vector<EntryPoint> Inspector::GetEntryPoints() {
   std::vector<EntryPoint> result;
@@ -66,7 +60,7 @@
 
     EntryPoint entry_point;
     entry_point.name = func->name();
-    entry_point.remapped_name = ctx_->namer()->NameFor(func->name());
+    entry_point.remapped_name = func->name();
     entry_point.stage = func->pipeline_stage();
     std::tie(entry_point.workgroup_size_x, entry_point.workgroup_size_y,
              entry_point.workgroup_size_z) = func->workgroup_size();
@@ -93,7 +87,7 @@
   //  if (!func) {
   //    return {};
   //  }
-  //  return ctx_->namer()->NameFor(entry_point);
+  //  return func->name();
   return entry_point;
 }
 
diff --git a/src/inspector/inspector.h b/src/inspector/inspector.h
index d14c1df..f1189b0 100644
--- a/src/inspector/inspector.h
+++ b/src/inspector/inspector.h
@@ -72,10 +72,10 @@
 class Inspector {
  public:
   /// Constructor
-  /// DEPRECATED
   /// @param module Shader module to extract information from.
   explicit Inspector(const ast::Module& module);
   /// Constructor
+  /// DEPRECATED
   /// @param ctx the context, must be non-null
   /// @param module Shader module to extract information from.
   Inspector(Context* ctx, const ast::Module& module);
@@ -133,8 +133,6 @@
       const std::string& entry_point);
 
  private:
-  Context* ctx_ = nullptr;
-  bool context_is_owned_ = false;
   const ast::Module& module_;
   std::string error_;
 
diff --git a/src/inspector/inspector_test.cc b/src/inspector/inspector_test.cc
index f463ba3..34c8796 100644
--- a/src/inspector/inspector_test.cc
+++ b/src/inspector/inspector_test.cc
@@ -59,7 +59,6 @@
 #include "src/ast/variable_decl_statement.h"
 #include "src/ast/variable_decoration.h"
 #include "src/ast/workgroup_decoration.h"
-#include "src/context.h"
 #include "src/type_determiner.h"
 #include "tint/tint.h"
 
@@ -70,7 +69,7 @@
 class InspectorHelper {
  public:
   InspectorHelper()
-      : td_(std::make_unique<TypeDeterminer>(&ctx_, &mod_)),
+      : td_(std::make_unique<TypeDeterminer>(&mod_)),
         inspector_(std::make_unique<Inspector>(mod_)),
         sampler_type_(ast::type::SamplerKind::kSampler),
         comparison_sampler_type_(ast::type::SamplerKind::kComparisonSampler) {}
@@ -683,7 +682,6 @@
   }
 
  private:
-  Context ctx_;
   ast::Module mod_;
   std::unique_ptr<TypeDeterminer> td_;
   std::unique_ptr<Inspector> inspector_;
@@ -771,12 +769,14 @@
       create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}));
   mod()->AddFunction(foo);
 
+  // TODO(dsinclair): Update to run the namer transform when available.
+
   auto result = inspector()->GetEntryPoints();
   ASSERT_FALSE(inspector()->has_error()) << inspector()->error();
 
   ASSERT_EQ(1u, result.size());
   EXPECT_EQ("foo", result[0].name);
-  EXPECT_EQ("tint_666f6f", result[0].remapped_name);
+  EXPECT_EQ("foo", result[0].remapped_name);
   EXPECT_EQ(ast::PipelineStage::kVertex, result[0].stage);
 }
 
@@ -791,15 +791,17 @@
       create<ast::StageDecoration>(ast::PipelineStage::kCompute, Source{}));
   mod()->AddFunction(bar);
 
+  // TODO(dsinclair): Update to run the namer transform when available.
+
   auto result = inspector()->GetEntryPoints();
   ASSERT_FALSE(inspector()->has_error()) << inspector()->error();
 
   ASSERT_EQ(2u, result.size());
   EXPECT_EQ("foo", result[0].name);
-  EXPECT_EQ("tint_666f6f", result[0].remapped_name);
+  EXPECT_EQ("foo", result[0].remapped_name);
   EXPECT_EQ(ast::PipelineStage::kVertex, result[0].stage);
   EXPECT_EQ("bar", result[1].name);
-  EXPECT_EQ("tint_626172", result[1].remapped_name);
+  EXPECT_EQ("bar", result[1].remapped_name);
   EXPECT_EQ(ast::PipelineStage::kCompute, result[1].stage);
 }
 
@@ -817,15 +819,17 @@
       create<ast::StageDecoration>(ast::PipelineStage::kFragment, Source{}));
   mod()->AddFunction(bar);
 
+  // TODO(dsinclair): Update to run the namer transform when available.
+
   auto result = inspector()->GetEntryPoints();
   EXPECT_FALSE(inspector()->has_error());
 
   ASSERT_EQ(2u, result.size());
   EXPECT_EQ("foo", result[0].name);
-  EXPECT_EQ("tint_666f6f", result[0].remapped_name);
+  EXPECT_EQ("foo", result[0].remapped_name);
   EXPECT_EQ(ast::PipelineStage::kVertex, result[0].stage);
   EXPECT_EQ("bar", result[1].name);
-  EXPECT_EQ("tint_626172", result[1].remapped_name);
+  EXPECT_EQ("bar", result[1].remapped_name);
   EXPECT_EQ(ast::PipelineStage::kFragment, result[1].stage);
 }
 
@@ -1017,20 +1021,22 @@
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
 
+  // TODO(dsinclair): Update to run the namer transform when available.
+
   auto result = inspector()->GetEntryPoints();
   ASSERT_FALSE(inspector()->has_error()) << inspector()->error();
 
   ASSERT_EQ(2u, result.size());
 
   ASSERT_EQ("foo", result[0].name);
-  ASSERT_EQ("tint_666f6f", result[0].remapped_name);
+  ASSERT_EQ("foo", result[0].remapped_name);
   ASSERT_EQ(1u, result[0].input_variables.size());
   EXPECT_EQ("in_var", result[0].input_variables[0]);
   ASSERT_EQ(1u, result[0].output_variables.size());
   EXPECT_EQ("out2_var", result[0].output_variables[0]);
 
   ASSERT_EQ("bar", result[1].name);
-  ASSERT_EQ("tint_626172", result[1].remapped_name);
+  ASSERT_EQ("bar", result[1].remapped_name);
   ASSERT_EQ(1u, result[1].input_variables.size());
   EXPECT_EQ("in2_var", result[1].input_variables[0]);
   ASSERT_EQ(1u, result[1].output_variables.size());
@@ -1056,13 +1062,15 @@
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
 
+  // TODO(dsinclair): Update to run the namer transform when available.
+
   auto result = inspector()->GetEntryPoints();
   ASSERT_FALSE(inspector()->has_error()) << inspector()->error();
 
   ASSERT_EQ(2u, result.size());
 
   ASSERT_EQ("foo", result[0].name);
-  ASSERT_EQ("tint_666f6f", result[0].remapped_name);
+  ASSERT_EQ("foo", result[0].remapped_name);
   EXPECT_EQ(2u, result[0].input_variables.size());
   EXPECT_TRUE(ContainsString(result[0].input_variables, "in_var"));
   EXPECT_TRUE(ContainsString(result[0].input_variables, "in2_var"));
@@ -1071,7 +1079,7 @@
   EXPECT_TRUE(ContainsString(result[0].output_variables, "out2_var"));
 
   ASSERT_EQ("bar", result[1].name);
-  ASSERT_EQ("tint_626172", result[1].remapped_name);
+  ASSERT_EQ("bar", result[1].remapped_name);
   EXPECT_EQ(1u, result[1].input_variables.size());
   EXPECT_EQ("in2_var", result[1].input_variables[0]);
   EXPECT_EQ(1u, result[1].output_variables.size());
@@ -1106,10 +1114,12 @@
       create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}));
   mod()->AddFunction(foo);
 
+  // TODO(dsinclair): Update to run the namer transform when available.
+
   auto result = inspector()->GetRemappedNameForEntryPoint("foo");
   ASSERT_FALSE(inspector()->has_error()) << inspector()->error();
 
-  EXPECT_EQ("tint_666f6f", result);
+  EXPECT_EQ("foo", result);
 }
 
 // TODO(rharrison): Reenable once GetRemappedNameForEntryPoint isn't a pass
@@ -1121,6 +1131,8 @@
       create<ast::StageDecoration>(ast::PipelineStage::kVertex, Source{}));
   mod()->AddFunction(foo);
 
+  // TODO(dsinclair): Update to run the namer transform when available.
+
   auto* bar = MakeEmptyBodyFunction("bar");
   bar->add_decoration(
       create<ast::StageDecoration>(ast::PipelineStage::kCompute, Source{}));
@@ -1129,12 +1141,12 @@
   {
     auto result = inspector()->GetRemappedNameForEntryPoint("foo");
     ASSERT_FALSE(inspector()->has_error()) << inspector()->error();
-    EXPECT_EQ("tint_666f6f", result);
+    EXPECT_EQ("foo", result);
   }
   {
     auto result = inspector()->GetRemappedNameForEntryPoint("bar");
     ASSERT_FALSE(inspector()->has_error()) << inspector()->error();
-    EXPECT_EQ("tint_626172", result);
+    EXPECT_EQ("bar", result);
   }
 }
 
diff --git a/src/reader/reader.cc b/src/reader/reader.cc
index c94f899..6d90273 100644
--- a/src/reader/reader.cc
+++ b/src/reader/reader.cc
@@ -17,7 +17,7 @@
 namespace tint {
 namespace reader {
 
-Reader::Reader(Context* ctx) : ctx_(*ctx) {}
+Reader::Reader() = default;
 
 Reader::~Reader() = default;
 
diff --git a/src/reader/reader.h b/src/reader/reader.h
index 481752f..8fa4c92 100644
--- a/src/reader/reader.h
+++ b/src/reader/reader.h
@@ -19,7 +19,6 @@
 #include <utility>
 
 #include "src/ast/module.h"
-#include "src/context.h"
 #include "src/diagnostic/diagnostic.h"
 #include "src/diagnostic/formatter.h"
 
@@ -52,16 +51,12 @@
 
  protected:
   /// Constructor
-  /// @param ctx the context object, must be non-null
-  explicit Reader(Context* ctx);
+  Reader();
 
   /// Sets the diagnostic messages
   /// @param diags the list of diagnostic messages
   void set_diagnostics(const diag::List& diags) { diags_ = diags; }
 
-  /// The Tint context object
-  Context& ctx_;
-
   /// All diagnostic messages from the reader.
   diag::List diags_;
 };
diff --git a/src/reader/spirv/parser.cc b/src/reader/spirv/parser.cc
index 23b5acd..751b59d 100644
--- a/src/reader/spirv/parser.cc
+++ b/src/reader/spirv/parser.cc
@@ -20,8 +20,11 @@
 namespace reader {
 namespace spirv {
 
-Parser::Parser(Context* ctx, const std::vector<uint32_t>& spv_binary)
-    : Reader(ctx), impl_(std::make_unique<ParserImpl>(ctx, spv_binary)) {}
+Parser::Parser(const std::vector<uint32_t>& spv_binary)
+    : Reader(), impl_(std::make_unique<ParserImpl>(spv_binary)) {}
+
+Parser::Parser(Context*, const std::vector<uint32_t>& spv_binary)
+    : Parser(spv_binary) {}
 
 Parser::~Parser() = default;
 
diff --git a/src/reader/spirv/parser.h b/src/reader/spirv/parser.h
index d4d0974..e2084e2 100644
--- a/src/reader/spirv/parser.h
+++ b/src/reader/spirv/parser.h
@@ -19,6 +19,7 @@
 #include <memory>
 #include <vector>
 
+#include "src/context.h"
 #include "src/reader/reader.h"
 
 namespace tint {
@@ -31,6 +32,10 @@
 class Parser : public Reader {
  public:
   /// Creates a new parser
+  /// @param input the input data to parse
+  explicit Parser(const std::vector<uint32_t>& input);
+  /// Creates a new parser
+  /// DEPRECATED
   /// @param ctx the non-null context object
   /// @param input the input data to parse
   Parser(Context* ctx, const std::vector<uint32_t>& input);
diff --git a/src/reader/spirv/parser_impl.cc b/src/reader/spirv/parser_impl.cc
index ccdf5c5..b0c01a9 100644
--- a/src/reader/spirv/parser_impl.cc
+++ b/src/reader/spirv/parser_impl.cc
@@ -192,8 +192,8 @@
 
 }  // namespace
 
-ParserImpl::ParserImpl(Context* ctx, const std::vector<uint32_t>& spv_binary)
-    : Reader(ctx),
+ParserImpl::ParserImpl(const std::vector<uint32_t>& spv_binary)
+    : Reader(),
       spv_binary_(spv_binary),
       fail_stream_(&success_, &errors_),
       bool_type_(ast_module_.create<ast::type::Bool>()),
diff --git a/src/reader/spirv/parser_impl.h b/src/reader/spirv/parser_impl.h
index 856ecf8..6530d9e 100644
--- a/src/reader/spirv/parser_impl.h
+++ b/src/reader/spirv/parser_impl.h
@@ -86,9 +86,8 @@
 class ParserImpl : Reader {
  public:
   /// Creates a new parser
-  /// @param ctx the non-null context object
   /// @param input the input data to parse
-  ParserImpl(Context* ctx, const std::vector<uint32_t>& input);
+  explicit ParserImpl(const std::vector<uint32_t>& input);
   /// Destructor
   ~ParserImpl() override;
 
@@ -96,11 +95,6 @@
   /// @returns true if the parse was successful, false otherwise.
   bool Parse() override;
 
-  /// @returns the Tint context.
-  Context& context() {
-    return ctx_;  // Inherited from Reader
-  }
-
   /// @returns the module. The module in the parser will be reset after this.
   ast::Module module() override;
 
diff --git a/src/reader/spirv/parser_impl_test_helper.h b/src/reader/spirv/parser_impl_test_helper.h
index 164bfaa..0a915a8 100644
--- a/src/reader/spirv/parser_impl_test_helper.h
+++ b/src/reader/spirv/parser_impl_test_helper.h
@@ -22,7 +22,6 @@
 
 #include "gtest/gtest.h"
 #include "source/opt/ir_context.h"
-#include "src/context.h"
 #include "src/reader/spirv/parser_impl.h"
 
 namespace tint {
@@ -40,7 +39,7 @@
   /// @param input the SPIR-V binary to parse
   /// @returns a parser for the given binary
   std::unique_ptr<ParserImpl> parser(const std::vector<uint32_t>& input) {
-    return std::make_unique<ParserImpl>(&ctx_, input);
+    return std::make_unique<ParserImpl>(input);
   }
 
   /// Gets the internal representation of the function with the given ID.
@@ -52,9 +51,6 @@
   spvtools::opt::Function* spirv_function(ParserImpl* parser, uint32_t id) {
     return parser->ir_context()->GetFunction(id);
   }
-
- private:
-  Context ctx_;
 };
 
 // Use this form when you don't need to template any further.
diff --git a/src/reader/wgsl/parser.cc b/src/reader/wgsl/parser.cc
index 3b41c09..503910b 100644
--- a/src/reader/wgsl/parser.cc
+++ b/src/reader/wgsl/parser.cc
@@ -22,8 +22,10 @@
 namespace reader {
 namespace wgsl {
 
-Parser::Parser(Context* ctx, Source::File const* file)
-    : Reader(ctx), impl_(std::make_unique<ParserImpl>(ctx, file)) {}
+Parser::Parser(Source::File const* file)
+    : Reader(), impl_(std::make_unique<ParserImpl>(file)) {}
+
+Parser::Parser(Context*, Source::File const* file) : Parser(file) {}
 
 Parser::~Parser() = default;
 
diff --git a/src/reader/wgsl/parser.h b/src/reader/wgsl/parser.h
index ddff63f..110fafc 100644
--- a/src/reader/wgsl/parser.h
+++ b/src/reader/wgsl/parser.h
@@ -18,6 +18,7 @@
 #include <memory>
 #include <string>
 
+#include "src/context.h"
 #include "src/reader/reader.h"
 #include "src/source.h"
 
@@ -31,6 +32,10 @@
 class Parser : public Reader {
  public:
   /// Creates a new parser from the given file.
+  /// @param file the input source file to parse
+  explicit Parser(Source::File const* file);
+  /// Creates a new parser from the given file.
+  /// DEPRECATED
   /// @param ctx the non-null context object
   /// @param file the input source file to parse
   Parser(Context* ctx, Source::File const* file);
diff --git a/src/reader/wgsl/parser_impl.cc b/src/reader/wgsl/parser_impl.cc
index fcbba85..0e7e9d7 100644
--- a/src/reader/wgsl/parser_impl.cc
+++ b/src/reader/wgsl/parser_impl.cc
@@ -186,7 +186,7 @@
 
 }  // namespace
 
-ParserImpl::ParserImpl(Context*, Source::File const* file)
+ParserImpl::ParserImpl(Source::File const* file)
     : lexer_(std::make_unique<Lexer>(file)) {}
 
 ParserImpl::~ParserImpl() = default;
diff --git a/src/reader/wgsl/parser_impl.h b/src/reader/wgsl/parser_impl.h
index 760a1cd..5ee8fe2 100644
--- a/src/reader/wgsl/parser_impl.h
+++ b/src/reader/wgsl/parser_impl.h
@@ -55,7 +55,6 @@
 #include "src/ast/variable.h"
 #include "src/ast/variable_decl_statement.h"
 #include "src/ast/variable_decoration.h"
-#include "src/context.h"
 #include "src/diagnostic/diagnostic.h"
 #include "src/diagnostic/formatter.h"
 #include "src/reader/wgsl/parser_impl_detail.h"
@@ -231,9 +230,8 @@
   };
 
   /// Creates a new parser using the given file
-  /// @param ctx the non-null context object
   /// @param file the input source file to parse
-  ParserImpl(Context* ctx, Source::File const* file);
+  explicit ParserImpl(Source::File const* file);
   ~ParserImpl();
 
   /// Run the parser
diff --git a/src/reader/wgsl/parser_impl_test_helper.h b/src/reader/wgsl/parser_impl_test_helper.h
index 73d2900..f1bdf3b 100644
--- a/src/reader/wgsl/parser_impl_test_helper.h
+++ b/src/reader/wgsl/parser_impl_test_helper.h
@@ -40,14 +40,13 @@
   /// @returns the parser implementation
   std::unique_ptr<ParserImpl> parser(const std::string& str) {
     auto file = std::make_unique<Source::File>("test.wgsl", str);
-    auto impl = std::make_unique<ParserImpl>(&ctx_, file.get());
+    auto impl = std::make_unique<ParserImpl>(file.get());
     files_.emplace_back(std::move(file));
     return impl;
   }
 
  private:
   std::vector<std::unique_ptr<Source::File>> files_;
-  Context ctx_;
 };
 
 /// WGSL Parser test class with param
@@ -63,14 +62,13 @@
   /// @returns the parser implementation
   std::unique_ptr<ParserImpl> parser(const std::string& str) {
     auto file = std::make_unique<Source::File>("test.wgsl", str);
-    auto impl = std::make_unique<ParserImpl>(&ctx_, file.get());
+    auto impl = std::make_unique<ParserImpl>(file.get());
     files_.emplace_back(std::move(file));
     return impl;
   }
 
  private:
   std::vector<std::unique_ptr<Source::File>> files_;
-  Context ctx_;
 };
 
 }  // namespace wgsl
diff --git a/src/transform/bound_array_accessors_transform.cc b/src/transform/bound_array_accessors_transform.cc
index f1ecc64..e13ecee 100644
--- a/src/transform/bound_array_accessors_transform.cc
+++ b/src/transform/bound_array_accessors_transform.cc
@@ -49,9 +49,12 @@
 namespace tint {
 namespace transform {
 
-BoundArrayAccessorsTransform::BoundArrayAccessorsTransform(Context* ctx,
+BoundArrayAccessorsTransform::BoundArrayAccessorsTransform(ast::Module* mod)
+    : Transformer(mod) {}
+
+BoundArrayAccessorsTransform::BoundArrayAccessorsTransform(Context*,
                                                            ast::Module* mod)
-    : Transformer(ctx, mod) {}
+    : BoundArrayAccessorsTransform(mod) {}
 
 BoundArrayAccessorsTransform::~BoundArrayAccessorsTransform() = default;
 
diff --git a/src/transform/bound_array_accessors_transform.h b/src/transform/bound_array_accessors_transform.h
index fb20428..5da26b2 100644
--- a/src/transform/bound_array_accessors_transform.h
+++ b/src/transform/bound_array_accessors_transform.h
@@ -35,9 +35,13 @@
 class BoundArrayAccessorsTransform : public Transformer {
  public:
   /// Constructor
+  /// @param mod the module transform
+  explicit BoundArrayAccessorsTransform(ast::Module* mod);
+  /// Constructor
+  /// DEPRECATED
   /// @param ctx the Tint context object
   /// @param mod the module transform
-  explicit BoundArrayAccessorsTransform(Context* ctx, ast::Module* mod);
+  BoundArrayAccessorsTransform(Context* ctx, ast::Module* mod);
   ~BoundArrayAccessorsTransform() override;
 
   /// Users of Tint should register the transform with transform manager and
diff --git a/src/transform/bound_array_accessors_transform_test.cc b/src/transform/bound_array_accessors_transform_test.cc
index 8df7a7c..e483082 100644
--- a/src/transform/bound_array_accessors_transform_test.cc
+++ b/src/transform/bound_array_accessors_transform_test.cc
@@ -40,7 +40,6 @@
 #include "src/ast/uint_literal.h"
 #include "src/ast/variable.h"
 #include "src/ast/variable_decl_statement.h"
-#include "src/context.h"
 #include "src/transform/manager.h"
 #include "src/type_determiner.h"
 
@@ -50,12 +49,10 @@
 
 class BoundArrayAccessorsTest : public testing::Test {
  public:
-  BoundArrayAccessorsTest() : td_(&ctx_, &mod_) {
-    auto transform =
-        std::make_unique<BoundArrayAccessorsTransform>(&ctx_, &mod_);
+  BoundArrayAccessorsTest() : td_(&mod_) {
+    auto transform = std::make_unique<BoundArrayAccessorsTransform>(&mod_);
     transform_ = transform.get();
-    manager_ = std::make_unique<Manager>(&ctx_, &mod_);
-    manager_->append(std::move(transform));
+    manager_.append(std::move(transform));
   }
 
   ast::BlockStatement* SetupFunctionAndBody() {
@@ -74,7 +71,7 @@
 
   TypeDeterminer* td() { return &td_; }
 
-  Manager* manager() { return manager_.get(); }
+  bool Run() { return manager_.Run(&mod_); }
 
   /// Creates a new `ast::Node` owned by the Module. When the Module is
   /// destructed, the `ast::Node` will also be destructed.
@@ -86,11 +83,10 @@
   }
 
  private:
-  Context ctx_;
   ast::Module mod_;
   TypeDeterminer td_;
   ast::type::Void void_type_;
-  std::unique_ptr<Manager> manager_;
+  Manager manager_;
   BoundArrayAccessorsTransform* transform_;
   ast::BlockStatement* body_ = nullptr;
 };
@@ -128,7 +124,7 @@
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
 
-  ASSERT_TRUE(manager()->Run());
+  ASSERT_TRUE(Run());
   ASSERT_TRUE(ptr->Is<ast::ArrayAccessorExpression>());
   ASSERT_TRUE(ptr->idx_expr()->Is<ast::CallExpression>());
 
@@ -191,7 +187,7 @@
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
 
-  ASSERT_TRUE(manager()->Run());
+  ASSERT_TRUE(Run());
   ASSERT_TRUE(ptr->Is<ast::ArrayAccessorExpression>());
   ASSERT_TRUE(ptr->idx_expr()->Is<ast::CallExpression>());
 
@@ -268,7 +264,7 @@
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
 
-  ASSERT_TRUE(manager()->Run());
+  ASSERT_TRUE(Run());
   ASSERT_TRUE(ptr->Is<ast::ArrayAccessorExpression>());
   ASSERT_TRUE(ptr->idx_expr()->Is<ast::ConstructorExpression>());
   ASSERT_TRUE(ptr->idx_expr()->Is<ast::ScalarConstructorExpression>());
@@ -316,7 +312,7 @@
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
 
-  ASSERT_TRUE(manager()->Run());
+  ASSERT_TRUE(Run());
   ASSERT_TRUE(ptr->Is<ast::ArrayAccessorExpression>());
   ASSERT_TRUE(ptr->idx_expr()->Is<ast::CallExpression>());
 
@@ -369,7 +365,7 @@
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
 
-  ASSERT_TRUE(manager()->Run());
+  ASSERT_TRUE(Run());
   ASSERT_TRUE(ptr->Is<ast::ArrayAccessorExpression>());
   ASSERT_TRUE(ptr->idx_expr()->Is<ast::ConstructorExpression>());
   ASSERT_TRUE(ptr->idx_expr()->Is<ast::ScalarConstructorExpression>());
@@ -408,7 +404,7 @@
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
 
-  ASSERT_TRUE(manager()->Run());
+  ASSERT_TRUE(Run());
   ASSERT_TRUE(ptr->Is<ast::ArrayAccessorExpression>());
   ASSERT_TRUE(ptr->idx_expr()->Is<ast::ConstructorExpression>());
   ASSERT_TRUE(ptr->idx_expr()->Is<ast::ScalarConstructorExpression>());
@@ -447,7 +443,7 @@
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
 
-  ASSERT_TRUE(manager()->Run());
+  ASSERT_TRUE(Run());
   ASSERT_TRUE(ptr->Is<ast::ArrayAccessorExpression>());
   ASSERT_TRUE(ptr->idx_expr()->Is<ast::ConstructorExpression>());
   ASSERT_TRUE(ptr->idx_expr()->Is<ast::ScalarConstructorExpression>());
@@ -495,7 +491,7 @@
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
 
-  ASSERT_TRUE(manager()->Run());
+  ASSERT_TRUE(Run());
   ASSERT_TRUE(ptr->Is<ast::ArrayAccessorExpression>());
   ASSERT_TRUE(ptr->idx_expr()->Is<ast::CallExpression>());
 
@@ -547,7 +543,7 @@
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
 
-  ASSERT_TRUE(manager()->Run());
+  ASSERT_TRUE(Run());
   ASSERT_TRUE(ptr->Is<ast::ArrayAccessorExpression>());
   ASSERT_TRUE(ptr->idx_expr()->Is<ast::ConstructorExpression>());
   ASSERT_TRUE(ptr->idx_expr()->Is<ast::ScalarConstructorExpression>());
@@ -586,7 +582,7 @@
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
 
-  ASSERT_TRUE(manager()->Run());
+  ASSERT_TRUE(Run());
   ASSERT_TRUE(ptr->Is<ast::ArrayAccessorExpression>());
   ASSERT_TRUE(ptr->idx_expr()->Is<ast::ConstructorExpression>());
   ASSERT_TRUE(ptr->idx_expr()->Is<ast::ScalarConstructorExpression>());
@@ -628,7 +624,7 @@
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
 
-  ASSERT_TRUE(manager()->Run());
+  ASSERT_TRUE(Run());
   ASSERT_TRUE(ptr->Is<ast::ArrayAccessorExpression>());
 
   ASSERT_TRUE(ptr->array()->Is<ast::ArrayAccessorExpression>());
@@ -692,7 +688,7 @@
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
 
-  ASSERT_TRUE(manager()->Run());
+  ASSERT_TRUE(Run());
   ASSERT_TRUE(ptr->Is<ast::ArrayAccessorExpression>());
 
   ASSERT_TRUE(ptr->array()->Is<ast::ArrayAccessorExpression>());
@@ -771,7 +767,7 @@
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
 
-  ASSERT_TRUE(manager()->Run());
+  ASSERT_TRUE(Run());
   ASSERT_TRUE(ptr->Is<ast::ArrayAccessorExpression>());
 
   ASSERT_TRUE(ptr->array()->Is<ast::ArrayAccessorExpression>());
@@ -839,7 +835,7 @@
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
 
-  ASSERT_TRUE(manager()->Run());
+  ASSERT_TRUE(Run());
   ASSERT_TRUE(ptr->Is<ast::ArrayAccessorExpression>());
 
   ASSERT_TRUE(ptr->array()->Is<ast::ArrayAccessorExpression>());
@@ -893,7 +889,7 @@
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
 
-  ASSERT_TRUE(manager()->Run());
+  ASSERT_TRUE(Run());
   ASSERT_TRUE(ptr->Is<ast::ArrayAccessorExpression>());
 
   ASSERT_TRUE(ptr->array()->Is<ast::ArrayAccessorExpression>());
@@ -948,7 +944,7 @@
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
 
-  ASSERT_TRUE(manager()->Run());
+  ASSERT_TRUE(Run());
   ASSERT_TRUE(ptr->Is<ast::ArrayAccessorExpression>());
 
   ASSERT_TRUE(ptr->array()->Is<ast::ArrayAccessorExpression>());
@@ -1003,7 +999,7 @@
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
 
-  ASSERT_TRUE(manager()->Run());
+  ASSERT_TRUE(Run());
   ASSERT_TRUE(ptr->Is<ast::ArrayAccessorExpression>());
 
   ASSERT_TRUE(ptr->array()->Is<ast::ArrayAccessorExpression>());
diff --git a/src/transform/manager.cc b/src/transform/manager.cc
index 0cf8a55..8b30c2a 100644
--- a/src/transform/manager.cc
+++ b/src/transform/manager.cc
@@ -19,12 +19,19 @@
 namespace tint {
 namespace transform {
 
-Manager::Manager(Context* context, ast::Module* module)
-    : context_(context), module_(module) {}
+Manager::Manager() = default;
+
+Manager::Manager(Context*, ast::Module* module) : module_(module) {}
 
 Manager::~Manager() = default;
 
 bool Manager::Run() {
+  return Run(module_);
+}
+
+bool Manager::Run(ast::Module* module) {
+  error_ = "";
+
   for (auto& transform : transforms_) {
     if (!transform->Run()) {
       error_ = transform->error();
@@ -32,10 +39,10 @@
     }
   }
 
-  if (context_ != nullptr && module_ != nullptr) {
+  if (module != nullptr) {
     // The transformed have potentially inserted nodes into the AST, so the type
     // determinater needs to be run.
-    TypeDeterminer td(context_, module_);
+    TypeDeterminer td(module);
     if (!td.Determine()) {
       error_ = td.error();
       return false;
diff --git a/src/transform/manager.h b/src/transform/manager.h
index 2ce8ca3..c0b3abc 100644
--- a/src/transform/manager.h
+++ b/src/transform/manager.h
@@ -20,6 +20,7 @@
 #include <utility>
 #include <vector>
 
+#include "src/context.h"
 #include "src/transform/transformer.h"
 
 namespace tint {
@@ -31,6 +32,9 @@
 class Manager {
  public:
   /// Constructor
+  Manager();
+  /// Constructor
+  /// DEPRECATED
   /// @param context the tint context
   /// @param module the module to transform
   Manager(Context* context, ast::Module* module);
@@ -43,6 +47,11 @@
   }
 
   /// Runs the transforms
+  /// @param module the module to run the transforms on
+  /// @returns true on success; false otherwise
+  bool Run(ast::Module* module);
+  /// Runs the transforms
+  /// DEPRECATED
   /// @returns true on success; false otherwise
   bool Run();
 
@@ -50,9 +59,8 @@
   std::string error() const { return error_; }
 
  private:
-  Context* context_;
-  ast::Module* module_;
   std::vector<std::unique_ptr<Transformer>> transforms_;
+  ast::Module* module_ = nullptr;
 
   std::string error_;
 };
diff --git a/src/transform/transformer.cc b/src/transform/transformer.cc
index c3b7770..cb48de3 100644
--- a/src/transform/transformer.cc
+++ b/src/transform/transformer.cc
@@ -17,8 +17,7 @@
 namespace tint {
 namespace transform {
 
-Transformer::Transformer(Context* ctx, ast::Module* mod)
-    : ctx_(ctx), mod_(mod) {}
+Transformer::Transformer(ast::Module* mod) : mod_(mod) {}
 
 Transformer::~Transformer() = default;
 
diff --git a/src/transform/transformer.h b/src/transform/transformer.h
index d1ec990..60f10aa 100644
--- a/src/transform/transformer.h
+++ b/src/transform/transformer.h
@@ -29,9 +29,8 @@
 class Transformer {
  public:
   /// Constructor
-  /// @param ctx the Tint context
   /// @param mod the module to transform
-  Transformer(Context* ctx, ast::Module* mod);
+  explicit Transformer(ast::Module* mod);
   virtual ~Transformer();
 
   /// Users of Tint should register the transform with transform manager and
@@ -53,8 +52,6 @@
     return mod_->create<T>(std::forward<ARGS>(args)...);
   }
 
-  /// The context
-  Context* ctx_ = nullptr;
   /// The module
   ast::Module* mod_ = nullptr;
   /// Any error messages, or blank if no error
diff --git a/src/transform/vertex_pulling_transform.cc b/src/transform/vertex_pulling_transform.cc
index 49b8ba6..588bbfa 100644
--- a/src/transform/vertex_pulling_transform.cc
+++ b/src/transform/vertex_pulling_transform.cc
@@ -52,8 +52,11 @@
 
 }  // namespace
 
-VertexPullingTransform::VertexPullingTransform(Context* ctx, ast::Module* mod)
-    : Transformer(ctx, mod) {}
+VertexPullingTransform::VertexPullingTransform(ast::Module* mod)
+    : Transformer(mod) {}
+
+VertexPullingTransform::VertexPullingTransform(Context*, ast::Module* mod)
+    : VertexPullingTransform(mod) {}
 
 VertexPullingTransform::~VertexPullingTransform() = default;
 
diff --git a/src/transform/vertex_pulling_transform.h b/src/transform/vertex_pulling_transform.h
index ac19f4f..3ce7db9 100644
--- a/src/transform/vertex_pulling_transform.h
+++ b/src/transform/vertex_pulling_transform.h
@@ -25,7 +25,6 @@
 #include "src/ast/module.h"
 #include "src/ast/statement.h"
 #include "src/ast/variable.h"
-#include "src/context.h"
 #include "src/transform/transformer.h"
 
 namespace tint {
@@ -147,6 +146,10 @@
 class VertexPullingTransform : public Transformer {
  public:
   /// Constructor
+  /// @param mod the module to convert to vertex pulling
+  explicit VertexPullingTransform(ast::Module* mod);
+  /// Constructor
+  /// DEPRECATED
   /// @param ctx the tint context
   /// @param mod the module to convert to vertex pulling
   VertexPullingTransform(Context* ctx, ast::Module* mod);
diff --git a/src/type_determiner.cc b/src/type_determiner.cc
index 6b46f9e..41e143a 100644
--- a/src/type_determiner.cc
+++ b/src/type_determiner.cc
@@ -58,8 +58,10 @@
 
 namespace tint {
 
-TypeDeterminer::TypeDeterminer(Context* ctx, ast::Module* mod)
-    : ctx_(*ctx), mod_(mod) {}
+TypeDeterminer::TypeDeterminer(ast::Module* mod) : mod_(mod) {}
+
+TypeDeterminer::TypeDeterminer(Context*, ast::Module* mod)
+    : TypeDeterminer(mod) {}
 
 TypeDeterminer::~TypeDeterminer() = default;
 
diff --git a/src/type_determiner.h b/src/type_determiner.h
index 98e1f23..1632af2 100644
--- a/src/type_determiner.h
+++ b/src/type_determiner.h
@@ -44,6 +44,10 @@
 class TypeDeterminer {
  public:
   /// Constructor
+  /// @param mod the module to update with typing information
+  explicit TypeDeterminer(ast::Module* mod);
+  /// Constructor
+  /// DEPRECATED
   /// @param ctx the tint context, must be non-null
   /// @param mod the module to update with typing information
   TypeDeterminer(Context* ctx, ast::Module* mod);
@@ -128,7 +132,6 @@
   bool DetermineMemberAccessor(ast::MemberAccessorExpression* expr);
   bool DetermineUnaryOp(ast::UnaryOpExpression* expr);
 
-  Context& ctx_;
   ast::Module* mod_;
   std::string error_;
   ScopeStack<ast::Variable*> variable_stack_;
diff --git a/src/type_determiner_test.cc b/src/type_determiner_test.cc
index 2d240f0..af76cee 100644
--- a/src/type_determiner_test.cc
+++ b/src/type_determiner_test.cc
@@ -84,9 +84,9 @@
   void to_str(std::ostream&, size_t) const override {}
 };
 
-class TypeDeterminerHelper : public ast::BuilderWithContextAndModule {
+class TypeDeterminerHelper : public ast::BuilderWithModule {
  public:
-  TypeDeterminerHelper() : td_(std::make_unique<TypeDeterminer>(ctx, mod)) {}
+  TypeDeterminerHelper() : td_(std::make_unique<TypeDeterminer>(mod)) {}
 
   TypeDeterminer* td() const { return td_.get(); }
 
diff --git a/src/writer/hlsl/generator.cc b/src/writer/hlsl/generator.cc
index fa76960..437d0d5 100644
--- a/src/writer/hlsl/generator.cc
+++ b/src/writer/hlsl/generator.cc
@@ -22,18 +22,17 @@
 
 Generator::Generator(ast::Module module)
     : Text(std::move(module)),
-      impl_(std::make_unique<GeneratorImpl>(ctx_, &module_)) {}
+      impl_(std::make_unique<GeneratorImpl>(&module_)) {}
 
-Generator::Generator(Context* ctx, ast::Module module)
-    : Text(ctx, std::move(module)),
-      impl_(std::make_unique<GeneratorImpl>(ctx_, &module_)) {}
+Generator::Generator(Context*, ast::Module module)
+    : Generator(std::move(module)) {}
 
 Generator::~Generator() = default;
 
 void Generator::Reset() {
   set_error("");
   out_ = std::ostringstream();
-  impl_ = std::make_unique<GeneratorImpl>(ctx_, &module_);
+  impl_ = std::make_unique<GeneratorImpl>(&module_);
 }
 
 bool Generator::Generate() {
diff --git a/src/writer/hlsl/generator.h b/src/writer/hlsl/generator.h
index 93213e6..6f4fa1b 100644
--- a/src/writer/hlsl/generator.h
+++ b/src/writer/hlsl/generator.h
@@ -30,10 +30,10 @@
 class Generator : public Text {
  public:
   /// Constructor
-  /// DEPRECATED
   /// @param module the module to convert
   explicit Generator(ast::Module module);
   /// Constructor
+  /// DEPRECATED
   /// @param ctx the context, must be non-null
   /// @param module the module to convert
   Generator(Context* ctx, ast::Module module);
diff --git a/src/writer/hlsl/generator_impl.cc b/src/writer/hlsl/generator_impl.cc
index dc91175..3bde2da 100644
--- a/src/writer/hlsl/generator_impl.cc
+++ b/src/writer/hlsl/generator_impl.cc
@@ -113,10 +113,7 @@
 
 }  // namespace
 
-GeneratorImpl::GeneratorImpl(Context* ctx, ast::Module* module)
-    : ctx_(ctx), module_(module) {
-  assert(ctx);
-}
+GeneratorImpl::GeneratorImpl(ast::Module* module) : module_(module) {}
 
 GeneratorImpl::~GeneratorImpl() = default;
 
diff --git a/src/writer/hlsl/generator_impl.h b/src/writer/hlsl/generator_impl.h
index 44b4dd4..6694e26 100644
--- a/src/writer/hlsl/generator_impl.h
+++ b/src/writer/hlsl/generator_impl.h
@@ -41,7 +41,6 @@
 #include "src/ast/type/struct_type.h"
 #include "src/ast/type_constructor_expression.h"
 #include "src/ast/unary_op_expression.h"
-#include "src/context.h"
 #include "src/scope_stack.h"
 #include "src/writer/hlsl/namer.h"
 
@@ -53,9 +52,8 @@
 class GeneratorImpl {
  public:
   /// Constructor
-  /// @param ctx the context object, must be non-null
   /// @param module the module to generate
-  GeneratorImpl(Context* ctx, ast::Module* module);
+  explicit GeneratorImpl(ast::Module* module);
   ~GeneratorImpl();
 
   /// Increment the emitter indent level
@@ -398,7 +396,6 @@
   size_t indent_ = 0;
 
   Namer namer_;
-  Context* ctx_ = nullptr;
   ast::Module* module_ = nullptr;
   std::string current_ep_name_;
   bool generating_entry_point_ = false;
diff --git a/src/writer/hlsl/generator_impl_intrinsic_texture_test.cc b/src/writer/hlsl/generator_impl_intrinsic_texture_test.cc
index 9da97e1..cd385c4 100644
--- a/src/writer/hlsl/generator_impl_intrinsic_texture_test.cc
+++ b/src/writer/hlsl/generator_impl_intrinsic_texture_test.cc
@@ -141,7 +141,7 @@
 }  // LINT - Ignore the length of this function
 
 class HlslGeneratorIntrinsicTextureTest
-    : public ast::BuilderWithContextAndModule,
+    : public ast::BuilderWithModule,
       public testing::TestWithParam<ast::intrinsic::test::TextureOverloadCase> {
  protected:
   void OnVariableBuilt(ast::Variable* var) override {
@@ -154,9 +154,9 @@
   std::string pre_result() const { return pre.str(); }
 
   /// The type determiner
-  TypeDeterminer td{ctx, mod};
+  TypeDeterminer td{mod};
   /// The generator
-  GeneratorImpl gen{ctx, mod};
+  GeneratorImpl gen{mod};
   /// The output stream
   std::ostringstream out;
   /// The pre-output stream
diff --git a/src/writer/hlsl/test_helper.h b/src/writer/hlsl/test_helper.h
index aea3938..7f5386c 100644
--- a/src/writer/hlsl/test_helper.h
+++ b/src/writer/hlsl/test_helper.h
@@ -22,7 +22,6 @@
 
 #include "gtest/gtest.h"
 #include "src/ast/module.h"
-#include "src/context.h"
 #include "src/type_determiner.h"
 #include "src/writer/hlsl/generator_impl.h"
 
@@ -34,7 +33,7 @@
 template <typename BODY>
 class TestHelperBase : public BODY {
  public:
-  TestHelperBase() : td(&ctx, &mod), gen(&ctx, &mod) {}
+  TestHelperBase() : td(&mod), gen(&mod) {}
   ~TestHelperBase() = default;
 
   /// @returns the result string
@@ -52,8 +51,6 @@
     return mod.create<T>(std::forward<ARGS>(args)...);
   }
 
-  /// The context
-  Context ctx;
   /// The module
   ast::Module mod;
   /// The type determiner
diff --git a/src/writer/msl/generator.cc b/src/writer/msl/generator.cc
index 418735e..5a9e810 100644
--- a/src/writer/msl/generator.cc
+++ b/src/writer/msl/generator.cc
@@ -22,17 +22,16 @@
 
 Generator::Generator(ast::Module module)
     : Text(std::move(module)),
-      impl_(std::make_unique<GeneratorImpl>(ctx_, &module_)) {}
+      impl_(std::make_unique<GeneratorImpl>(&module_)) {}
 
-Generator::Generator(Context* ctx, ast::Module module)
-    : Text(ctx, std::move(module)),
-      impl_(std::make_unique<GeneratorImpl>(ctx_, &module_)) {}
+Generator::Generator(Context*, ast::Module module)
+    : Generator(std::move(module)) {}
 
 Generator::~Generator() = default;
 
 void Generator::Reset() {
   set_error("");
-  impl_ = std::make_unique<GeneratorImpl>(ctx_, &module_);
+  impl_ = std::make_unique<GeneratorImpl>(&module_);
 }
 
 bool Generator::Generate() {
diff --git a/src/writer/msl/generator.h b/src/writer/msl/generator.h
index 19bf085..9675223 100644
--- a/src/writer/msl/generator.h
+++ b/src/writer/msl/generator.h
@@ -29,10 +29,10 @@
 class Generator : public Text {
  public:
   /// Constructor
-  /// DEPRECATED
   /// @param module the module to convert
   explicit Generator(ast::Module module);
   /// Constructor
+  /// DEPRECATED
   /// @param ctx the context object, must be non-null
   /// @param module the module to convert
   Generator(Context* ctx, ast::Module module);
diff --git a/src/writer/msl/generator_impl.cc b/src/writer/msl/generator_impl.cc
index 6fa0c6a..003401f 100644
--- a/src/writer/msl/generator_impl.cc
+++ b/src/writer/msl/generator_impl.cc
@@ -95,8 +95,8 @@
 
 }  // namespace
 
-GeneratorImpl::GeneratorImpl(Context* ctx, ast::Module* module)
-    : TextGenerator(ctx), module_(module) {}
+GeneratorImpl::GeneratorImpl(ast::Module* module)
+    : TextGenerator(), module_(module) {}
 
 GeneratorImpl::~GeneratorImpl() = default;
 
diff --git a/src/writer/msl/generator_impl.h b/src/writer/msl/generator_impl.h
index 111ce81..0e4ef7d 100644
--- a/src/writer/msl/generator_impl.h
+++ b/src/writer/msl/generator_impl.h
@@ -54,9 +54,8 @@
 class GeneratorImpl : public TextGenerator {
  public:
   /// Constructor
-  /// @param ctx the context, must be non-null
   /// @param module the module to generate
-  GeneratorImpl(Context* ctx, ast::Module* module);
+  explicit GeneratorImpl(ast::Module* module);
   ~GeneratorImpl();
 
   /// @returns true on successful generation; false otherwise
diff --git a/src/writer/msl/generator_impl_intrinsic_texture_test.cc b/src/writer/msl/generator_impl_intrinsic_texture_test.cc
index f38e3aa..d3ece25 100644
--- a/src/writer/msl/generator_impl_intrinsic_texture_test.cc
+++ b/src/writer/msl/generator_impl_intrinsic_texture_test.cc
@@ -141,7 +141,7 @@
 }  // LINT - Ignore the length of this function
 
 class MslGeneratorIntrinsicTextureTest
-    : public ast::BuilderWithContextAndModule,
+    : public ast::BuilderWithModule,
       public testing::TestWithParam<ast::intrinsic::test::TextureOverloadCase> {
  protected:
   void OnVariableBuilt(ast::Variable* var) override {
@@ -149,9 +149,9 @@
   }
 
   /// The type determiner
-  TypeDeterminer td{ctx, mod};
+  TypeDeterminer td{mod};
   /// The generator
-  GeneratorImpl gen{ctx, mod};
+  GeneratorImpl gen{mod};
 };
 
 TEST_P(MslGeneratorIntrinsicTextureTest, Call) {
diff --git a/src/writer/msl/test_helper.h b/src/writer/msl/test_helper.h
index b336a47..853b51a 100644
--- a/src/writer/msl/test_helper.h
+++ b/src/writer/msl/test_helper.h
@@ -20,7 +20,6 @@
 
 #include "gtest/gtest.h"
 #include "src/ast/module.h"
-#include "src/context.h"
 #include "src/type_determiner.h"
 #include "src/writer/msl/generator_impl.h"
 
@@ -32,7 +31,7 @@
 template <typename BASE>
 class TestHelperBase : public BASE {
  public:
-  TestHelperBase() : td(&ctx, &mod), gen(&ctx, &mod) {}
+  TestHelperBase() : td(&mod), gen(&mod) {}
   ~TestHelperBase() = default;
 
   /// Creates a new `ast::Node` owned by the Module. When the Module is
@@ -44,8 +43,6 @@
     return mod.create<T>(std::forward<ARGS>(args)...);
   }
 
-  /// The context
-  Context ctx;
   /// The module
   ast::Module mod;
   /// The type determiner
diff --git a/src/writer/spirv/builder.cc b/src/writer/spirv/builder.cc
index 14f8398..dd7e1c1 100644
--- a/src/writer/spirv/builder.cc
+++ b/src/writer/spirv/builder.cc
@@ -277,10 +277,9 @@
 
 Builder::AccessorInfo::~AccessorInfo() {}
 
-Builder::Builder(Context* ctx, ast::Module* mod)
-    : ctx_(ctx), mod_(mod), scope_stack_({}) {
-  assert(ctx_);
-}
+Builder::Builder(ast::Module* mod) : mod_(mod), scope_stack_({}) {}
+
+Builder::Builder(Context*, ast::Module* mod) : Builder(mod) {}
 
 Builder::~Builder() = default;
 
@@ -437,7 +436,7 @@
   // the inspector and land the same change in MSL / HLSL to all roll into Dawn
   // at the same time.
   // OperandList operands = {Operand::Int(stage), Operand::Int(id),
-  //                         Operand::String(ctx_.namer()->NameFor(func->name()))};
+  //                         Operand::String(func->name())};
   OperandList operands = {Operand::Int(stage), Operand::Int(id),
                           Operand::String(func->name())};
 
@@ -522,8 +521,7 @@
   auto func_id = func_op.to_i();
 
   push_debug(spv::Op::OpName,
-             {Operand::Int(func_id),
-              Operand::String(ctx_->namer()->NameFor(func->name()))});
+             {Operand::Int(func_id), Operand::String(func->name())});
 
   auto ret_id = GenerateTypeIfNeeded(func->return_type());
   if (ret_id == 0) {
@@ -548,8 +546,7 @@
     }
 
     push_debug(spv::Op::OpName,
-               {Operand::Int(param_id),
-                Operand::String(ctx_->namer()->NameFor(param->name()))});
+               {Operand::Int(param_id), Operand::String(param->name())});
     params.push_back(Instruction{spv::Op::OpFunctionParameter,
                                  {Operand::Int(param_type_id), param_op}});
 
@@ -640,8 +637,7 @@
   }
 
   push_debug(spv::Op::OpName,
-             {Operand::Int(var_id),
-              Operand::String(ctx_->namer()->NameFor(var->name()))});
+             {Operand::Int(var_id), Operand::String(var->name())});
 
   // TODO(dsinclair) We could detect if the constructor is fully const and emit
   // an initializer value for the variable instead of doing the OpLoad.
@@ -689,8 +685,7 @@
       return false;
     }
     push_debug(spv::Op::OpName,
-               {Operand::Int(init_id),
-                Operand::String(ctx_->namer()->NameFor(var->name()))});
+               {Operand::Int(init_id), Operand::String(var->name())});
 
     scope_stack_.set_global(var->name(), init_id);
     spirv_id_to_variable_[init_id] = var;
@@ -711,8 +706,7 @@
   }
 
   push_debug(spv::Op::OpName,
-             {Operand::Int(var_id),
-              Operand::String(ctx_->namer()->NameFor(var->name()))});
+             {Operand::Int(var_id), Operand::String(var->name())});
 
   auto* type = var->type()->UnwrapAll();
 
@@ -2633,8 +2627,7 @@
 
   if (!struct_type->name().empty()) {
     push_debug(spv::Op::OpName,
-               {Operand::Int(struct_id),
-                Operand::String(ctx_->namer()->NameFor(struct_type->name()))});
+               {Operand::Int(struct_id), Operand::String(struct_type->name())});
   }
 
   OperandList ops;
@@ -2675,9 +2668,8 @@
 uint32_t Builder::GenerateStructMember(uint32_t struct_id,
                                        uint32_t idx,
                                        ast::StructMember* member) {
-  push_debug(spv::Op::OpMemberName,
-             {Operand::Int(struct_id), Operand::Int(idx),
-              Operand::String(ctx_->namer()->NameFor(member->name()))});
+  push_debug(spv::Op::OpMemberName, {Operand::Int(struct_id), Operand::Int(idx),
+                                     Operand::String(member->name())});
 
   bool has_layout = false;
   for (auto* deco : member->decorations()) {
diff --git a/src/writer/spirv/builder.h b/src/writer/spirv/builder.h
index f32db12..57ca018 100644
--- a/src/writer/spirv/builder.h
+++ b/src/writer/spirv/builder.h
@@ -83,6 +83,10 @@
   };
 
   /// Constructor
+  /// @param mod the module to generate from
+  explicit Builder(ast::Module* mod);
+  /// Constructor
+  /// DEPRECATED
   /// @param ctx the context, must be non-null
   /// @param mod the module to generate from
   Builder(Context* ctx, ast::Module* mod);
@@ -495,7 +499,6 @@
     return func_name_to_id_[name];
   }
 
-  Context* ctx_ = nullptr;
   ast::Module* mod_;
   std::string error_;
   uint32_t next_id_ = 1;
diff --git a/src/writer/spirv/builder_call_test.cc b/src/writer/spirv/builder_call_test.cc
index 67447cf..af7ec5b 100644
--- a/src/writer/spirv/builder_call_test.cc
+++ b/src/writer/spirv/builder_call_test.cc
@@ -74,10 +74,10 @@
   ASSERT_TRUE(b.GenerateFunction(&func)) << b.error();
 
   EXPECT_EQ(b.GenerateCallExpression(&expr), 14u) << b.error();
-  EXPECT_EQ(DumpBuilder(b), R"(OpName %3 "tint_615f66756e63"
-OpName %4 "tint_61"
-OpName %5 "tint_62"
-OpName %12 "tint_6d61696e"
+  EXPECT_EQ(DumpBuilder(b), R"(OpName %3 "a_func"
+OpName %4 "a"
+OpName %5 "b"
+OpName %12 "main"
 %2 = OpTypeFloat 32
 %1 = OpTypeFunction %2 %2 %2
 %11 = OpTypeVoid
@@ -136,10 +136,10 @@
   ASSERT_TRUE(b.GenerateFunction(&func)) << b.error();
 
   EXPECT_TRUE(b.GenerateStatement(&expr)) << b.error();
-  EXPECT_EQ(DumpBuilder(b), R"(OpName %4 "tint_615f66756e63"
-OpName %5 "tint_61"
-OpName %6 "tint_62"
-OpName %12 "tint_6d61696e"
+  EXPECT_EQ(DumpBuilder(b), R"(OpName %4 "a_func"
+OpName %5 "a"
+OpName %6 "b"
+OpName %12 "main"
 %2 = OpTypeVoid
 %3 = OpTypeFloat 32
 %1 = OpTypeFunction %2 %3 %3
diff --git a/src/writer/spirv/builder_function_decoration_test.cc b/src/writer/spirv/builder_function_decoration_test.cc
index e7ad94a..179432d 100644
--- a/src/writer/spirv/builder_function_decoration_test.cc
+++ b/src/writer/spirv/builder_function_decoration_test.cc
@@ -110,10 +110,10 @@
   mod->AddGlobalVariable(v_wg);
 
   ASSERT_TRUE(b.GenerateFunction(&func)) << b.error();
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "tint_6d795f696e"
-OpName %4 "tint_6d795f6f7574"
-OpName %7 "tint_6d795f7767"
-OpName %11 "tint_6d61696e"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "my_in"
+OpName %4 "my_out"
+OpName %7 "my_wg"
+OpName %11 "main"
 )");
   EXPECT_EQ(DumpInstructions(b.types()), R"(%3 = OpTypeFloat 32
 %2 = OpTypePointer Input %3
@@ -173,10 +173,10 @@
   mod->AddGlobalVariable(v_wg);
 
   ASSERT_TRUE(b.GenerateFunction(&func)) << b.error();
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "tint_6d795f696e"
-OpName %4 "tint_6d795f6f7574"
-OpName %7 "tint_6d795f7767"
-OpName %11 "tint_6d61696e"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "my_in"
+OpName %4 "my_out"
+OpName %7 "my_wg"
+OpName %11 "main"
 )");
   EXPECT_EQ(DumpInstructions(b.types()), R"(%3 = OpTypeFloat 32
 %2 = OpTypePointer Input %3
@@ -252,8 +252,8 @@
 OpEntryPoint Fragment %5 "main2"
 OpExecutionMode %3 OriginUpperLeft
 OpExecutionMode %5 OriginUpperLeft
-OpName %3 "tint_6d61696e31"
-OpName %5 "tint_6d61696e32"
+OpName %3 "main1"
+OpName %5 "main2"
 %2 = OpTypeVoid
 %1 = OpTypeFunction %2
 %3 = OpFunction %2 None %1
diff --git a/src/writer/spirv/builder_function_test.cc b/src/writer/spirv/builder_function_test.cc
index 9e195c2..d9fb3c8 100644
--- a/src/writer/spirv/builder_function_test.cc
+++ b/src/writer/spirv/builder_function_test.cc
@@ -52,7 +52,7 @@
   ast::Function func("a_func", {}, &void_type, create<ast::BlockStatement>());
 
   ASSERT_TRUE(b.GenerateFunction(&func));
-  EXPECT_EQ(DumpBuilder(b), R"(OpName %3 "tint_615f66756e63"
+  EXPECT_EQ(DumpBuilder(b), R"(OpName %3 "a_func"
 %2 = OpTypeVoid
 %1 = OpTypeFunction %2
 %3 = OpFunction %2 None %1
@@ -71,7 +71,7 @@
   ast::Function func("a_func", {}, &void_type, body);
 
   ASSERT_TRUE(b.GenerateFunction(&func));
-  EXPECT_EQ(DumpBuilder(b), R"(OpName %3 "tint_615f66756e63"
+  EXPECT_EQ(DumpBuilder(b), R"(OpName %3 "a_func"
 %2 = OpTypeVoid
 %1 = OpTypeFunction %2
 %3 = OpFunction %2 None %1
@@ -97,8 +97,8 @@
 
   ASSERT_TRUE(b.GenerateGlobalVariable(var_a)) << b.error();
   ASSERT_TRUE(b.GenerateFunction(&func)) << b.error();
-  EXPECT_EQ(DumpBuilder(b), R"(OpName %1 "tint_61"
-OpName %7 "tint_615f66756e63"
+  EXPECT_EQ(DumpBuilder(b), R"(OpName %1 "a"
+OpName %7 "a_func"
 %3 = OpTypeFloat 32
 %2 = OpTypePointer Private %3
 %4 = OpConstantNull %3
@@ -122,7 +122,7 @@
   ast::Function func("a_func", {}, &void_type, body);
 
   ASSERT_TRUE(b.GenerateFunction(&func));
-  EXPECT_EQ(DumpBuilder(b), R"(OpName %3 "tint_615f66756e63"
+  EXPECT_EQ(DumpBuilder(b), R"(OpName %3 "a_func"
 %2 = OpTypeVoid
 %1 = OpTypeFunction %2
 %3 = OpFunction %2 None %1
@@ -155,9 +155,9 @@
   EXPECT_TRUE(td.DetermineFunction(&func));
 
   ASSERT_TRUE(b.GenerateFunction(&func));
-  EXPECT_EQ(DumpBuilder(b), R"(OpName %4 "tint_615f66756e63"
-OpName %5 "tint_61"
-OpName %6 "tint_62"
+  EXPECT_EQ(DumpBuilder(b), R"(OpName %4 "a_func"
+OpName %5 "a"
+OpName %6 "b"
 %2 = OpTypeFloat 32
 %3 = OpTypeInt 32 1
 %1 = OpTypeFunction %2 %2 %3
@@ -179,7 +179,7 @@
   ast::Function func("a_func", {}, &void_type, body);
 
   ASSERT_TRUE(b.GenerateFunction(&func));
-  EXPECT_EQ(DumpBuilder(b), R"(OpName %3 "tint_615f66756e63"
+  EXPECT_EQ(DumpBuilder(b), R"(OpName %3 "a_func"
 %2 = OpTypeVoid
 %1 = OpTypeFunction %2
 %3 = OpFunction %2 None %1
@@ -302,13 +302,13 @@
 OpEntryPoint GLCompute %17 "b"
 OpExecutionMode %7 LocalSize 1 1 1
 OpExecutionMode %17 LocalSize 1 1 1
-OpName %3 "tint_44617461"
-OpMemberName %3 0 "tint_64"
-OpName %1 "tint_64617461"
-OpName %7 "tint_61"
-OpName %14 "tint_76"
-OpName %17 "tint_62"
-OpName %21 "tint_76"
+OpName %3 "Data"
+OpMemberName %3 0 "d"
+OpName %1 "data"
+OpName %7 "a"
+OpName %14 "v"
+OpName %17 "b"
+OpName %21 "v"
 OpDecorate %3 Block
 OpMemberDecorate %3 0 Offset 0
 OpDecorate %1 Binding 0
diff --git a/src/writer/spirv/builder_function_variable_test.cc b/src/writer/spirv/builder_function_variable_test.cc
index b28e73b..ebc092f 100644
--- a/src/writer/spirv/builder_function_variable_test.cc
+++ b/src/writer/spirv/builder_function_variable_test.cc
@@ -52,7 +52,7 @@
 
   b.push_function(Function{});
   EXPECT_TRUE(b.GenerateFunctionVariable(&v)) << b.error();
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "tint_766172"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "var"
 )");
   EXPECT_EQ(DumpInstructions(b.types()), R"(%3 = OpTypeFloat 32
 %2 = OpTypePointer Function %3
@@ -90,7 +90,7 @@
   EXPECT_TRUE(b.GenerateFunctionVariable(&v)) << b.error();
   ASSERT_FALSE(b.has_error()) << b.error();
 
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %6 "tint_766172"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %6 "var"
 )");
   EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeFloat 32
 %1 = OpTypeVector %2 3
@@ -135,7 +135,7 @@
   EXPECT_TRUE(b.GenerateFunctionVariable(&v)) << b.error();
   ASSERT_FALSE(b.has_error()) << b.error();
 
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %7 "tint_766172"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %7 "var"
 )");
   EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeFloat 32
 %1 = OpTypeVector %2 2
@@ -180,8 +180,8 @@
   EXPECT_TRUE(b.GenerateFunctionVariable(&v2)) << b.error();
   ASSERT_FALSE(b.has_error()) << b.error();
 
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %3 "tint_76"
-OpName %7 "tint_7632"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %3 "v"
+OpName %7 "v2"
 )");
   EXPECT_EQ(DumpInstructions(b.types()), R"(%1 = OpTypeFloat 32
 %2 = OpConstant %1 1
@@ -226,7 +226,7 @@
   EXPECT_TRUE(b.GenerateFunctionVariable(&v2)) << b.error();
   ASSERT_FALSE(b.has_error()) << b.error();
 
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %3 "tint_76"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %3 "v"
 )");
   EXPECT_EQ(DumpInstructions(b.types()), R"(%1 = OpTypeFloat 32
 %2 = OpConstant %1 1
diff --git a/src/writer/spirv/builder_global_variable_test.cc b/src/writer/spirv/builder_global_variable_test.cc
index 0b4782c..da997b1 100644
--- a/src/writer/spirv/builder_global_variable_test.cc
+++ b/src/writer/spirv/builder_global_variable_test.cc
@@ -56,7 +56,7 @@
   ast::Variable v("var", ast::StorageClass::kNone, &f32);
 
   EXPECT_TRUE(b.GenerateGlobalVariable(&v)) << b.error();
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "tint_766172"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "var"
 )");
   EXPECT_EQ(DumpInstructions(b.types()), R"(%3 = OpTypeFloat 32
 %2 = OpTypePointer Private %3
@@ -70,7 +70,7 @@
   ast::Variable v("var", ast::StorageClass::kOutput, &f32);
 
   EXPECT_TRUE(b.GenerateGlobalVariable(&v)) << b.error();
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "tint_766172"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "var"
 )");
   EXPECT_EQ(DumpInstructions(b.types()), R"(%3 = OpTypeFloat 32
 %2 = OpTypePointer Output %3
@@ -84,7 +84,7 @@
   ast::Variable v("var", ast::StorageClass::kInput, &f32);
 
   EXPECT_TRUE(b.GenerateGlobalVariable(&v)) << b.error();
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "tint_766172"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "var"
 )");
   EXPECT_EQ(DumpInstructions(b.types()), R"(%3 = OpTypeFloat 32
 %2 = OpTypePointer Input %3
@@ -115,7 +115,7 @@
   EXPECT_TRUE(b.GenerateGlobalVariable(&v)) << b.error();
   ASSERT_FALSE(b.has_error()) << b.error();
 
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %6 "tint_766172"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %6 "var"
 )");
   EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeFloat 32
 %1 = OpTypeVector %2 3
@@ -151,7 +151,7 @@
   EXPECT_TRUE(b.GenerateGlobalVariable(&v)) << b.error();
   ASSERT_FALSE(b.has_error()) << b.error();
 
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %5 "tint_766172"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %5 "var"
 )");
   EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeFloat 32
 %1 = OpTypeVector %2 3
@@ -249,7 +249,7 @@
   dv.set_decorations(decos);
 
   EXPECT_TRUE(b.GenerateGlobalVariable(&dv)) << b.error();
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "tint_766172"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "var"
 )");
   EXPECT_EQ(DumpInstructions(b.annots()), R"(OpDecorate %1 Location 5
 )");
@@ -271,7 +271,7 @@
   dv.set_decorations(decos);
 
   EXPECT_TRUE(b.GenerateGlobalVariable(&dv)) << b.error();
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "tint_766172"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "var"
 )");
   EXPECT_EQ(DumpInstructions(b.annots()), R"(OpDecorate %1 Binding 2
 OpDecorate %1 DescriptorSet 3
@@ -294,7 +294,7 @@
   dv.set_decorations(decos);
 
   EXPECT_TRUE(b.GenerateGlobalVariable(&dv)) << b.error();
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "tint_766172"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "var"
 )");
   EXPECT_EQ(DumpInstructions(b.annots()), R"(OpDecorate %1 BuiltIn Position
 )");
@@ -318,7 +318,7 @@
       create<ast::BoolLiteral>(&bool_type, true)));
 
   EXPECT_TRUE(b.GenerateGlobalVariable(&v)) << b.error();
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %3 "tint_766172"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %3 "var"
 )");
   EXPECT_EQ(DumpInstructions(b.annots()), R"(OpDecorate %2 SpecId 1200
 )");
@@ -340,7 +340,7 @@
   v.set_decorations(decos);
 
   EXPECT_TRUE(b.GenerateGlobalVariable(&v)) << b.error();
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "tint_766172"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "var"
 )");
   EXPECT_EQ(DumpInstructions(b.annots()), R"(OpDecorate %4 SpecId 1200
 )");
@@ -364,7 +364,7 @@
       create<ast::FloatLiteral>(&f32, 2.0)));
 
   EXPECT_TRUE(b.GenerateGlobalVariable(&v)) << b.error();
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %3 "tint_766172"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %3 "var"
 )");
   EXPECT_EQ(DumpInstructions(b.annots()), R"(OpDecorate %2 SpecId 0
 )");
@@ -386,7 +386,7 @@
   v.set_decorations(decos);
 
   EXPECT_TRUE(b.GenerateGlobalVariable(&v)) << b.error();
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "tint_766172"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "var"
 )");
   EXPECT_EQ(DumpInstructions(b.annots()), R"(OpDecorate %4 SpecId 0
 )");
@@ -408,7 +408,7 @@
   v.set_decorations(decos);
 
   EXPECT_TRUE(b.GenerateGlobalVariable(&v)) << b.error();
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "tint_766172"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "var"
 )");
   EXPECT_EQ(DumpInstructions(b.annots()), R"(OpDecorate %4 SpecId 0
 )");
@@ -430,7 +430,7 @@
   v.set_decorations(decos);
 
   EXPECT_TRUE(b.GenerateGlobalVariable(&v)) << b.error();
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "tint_766172"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "var"
 )");
   EXPECT_EQ(DumpInstructions(b.annots()), R"(OpDecorate %4 SpecId 0
 )");
@@ -498,10 +498,10 @@
   EXPECT_EQ(DumpInstructions(b.annots()), R"(OpMemberDecorate %3 0 NonWritable
 OpMemberDecorate %3 1 NonWritable
 )");
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %3 "tint_41"
-OpMemberName %3 0 "tint_61"
-OpMemberName %3 1 "tint_62"
-OpName %1 "tint_62"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %3 "A"
+OpMemberName %3 0 "a"
+OpMemberName %3 1 "b"
+OpName %1 "b"
 )");
   EXPECT_EQ(DumpInstructions(b.types()), R"(%4 = OpTypeInt 32 1
 %3 = OpTypeStruct %4 %4
@@ -533,9 +533,9 @@
 
   EXPECT_EQ(DumpInstructions(b.annots()), R"(OpMemberDecorate %3 0 NonWritable
 )");
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %3 "tint_41"
-OpMemberName %3 0 "tint_61"
-OpName %1 "tint_62"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %3 "A"
+OpMemberName %3 0 "a"
+OpName %1 "b"
 )");
   EXPECT_EQ(DumpInstructions(b.types()), R"(%4 = OpTypeInt 32 1
 %3 = OpTypeStruct %4
@@ -567,9 +567,9 @@
 
   EXPECT_EQ(DumpInstructions(b.annots()), R"(OpMemberDecorate %3 0 NonWritable
 )");
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %3 "tint_41"
-OpMemberName %3 0 "tint_61"
-OpName %1 "tint_62"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %3 "A"
+OpMemberName %3 0 "a"
+OpName %1 "b"
 )");
   EXPECT_EQ(DumpInstructions(b.types()), R"(%4 = OpTypeInt 32 1
 %3 = OpTypeStruct %4
@@ -603,12 +603,12 @@
 
   EXPECT_EQ(DumpInstructions(b.annots()), R"(OpMemberDecorate %3 0 NonWritable
 )");
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %3 "tint_41"
-OpMemberName %3 0 "tint_61"
-OpName %1 "tint_62"
-OpName %7 "tint_41"
-OpMemberName %7 0 "tint_61"
-OpName %5 "tint_63"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %3 "A"
+OpMemberName %3 0 "a"
+OpName %1 "b"
+OpName %7 "A"
+OpMemberName %7 0 "a"
+OpName %5 "c"
 )");
   EXPECT_EQ(DumpInstructions(b.types()), R"(%4 = OpTypeInt 32 1
 %3 = OpTypeStruct %4
diff --git a/src/writer/spirv/builder_ident_expression_test.cc b/src/writer/spirv/builder_ident_expression_test.cc
index 7be7907..dd6b7e4 100644
--- a/src/writer/spirv/builder_ident_expression_test.cc
+++ b/src/writer/spirv/builder_ident_expression_test.cc
@@ -84,7 +84,7 @@
 
   b.push_function(Function{});
   EXPECT_TRUE(b.GenerateGlobalVariable(&v)) << b.error();
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "tint_766172"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "var"
 )");
   EXPECT_EQ(DumpInstructions(b.types()), R"(%3 = OpTypeFloat 32
 %2 = OpTypePointer Output %3
@@ -141,7 +141,7 @@
 
   b.push_function(Function{});
   EXPECT_TRUE(b.GenerateFunctionVariable(&v)) << b.error();
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "tint_766172"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "var"
 )");
   EXPECT_EQ(DumpInstructions(b.types()), R"(%3 = OpTypeFloat 32
 %2 = OpTypePointer Function %3
diff --git a/src/writer/spirv/builder_intrinsic_test.cc b/src/writer/spirv/builder_intrinsic_test.cc
index 2f9c33d..37f18a9 100644
--- a/src/writer/spirv/builder_intrinsic_test.cc
+++ b/src/writer/spirv/builder_intrinsic_test.cc
@@ -52,15 +52,15 @@
 namespace spirv {
 namespace {
 
-class IntrinsicBuilderTest : public ast::BuilderWithContextAndModule,
+class IntrinsicBuilderTest : public ast::BuilderWithModule,
                              public testing::Test {
  protected:
   void OnVariableBuilt(ast::Variable* var) override {
     td.RegisterVariableForTesting(var);
   }
 
-  TypeDeterminer td{ctx, mod};
-  spirv::Builder b{ctx, mod};
+  TypeDeterminer td{mod};
+  spirv::Builder b{mod};
 };
 
 template <typename T>
@@ -646,8 +646,8 @@
 
   EXPECT_EQ(b.GenerateCallExpression(&expr), 9u) << b.error();
   EXPECT_EQ(DumpBuilder(b), R"(%10 = OpExtInstImport "GLSL.std.450"
-OpName %1 "tint_6964656e74"
-OpName %7 "tint_615f66756e63"
+OpName %1 "ident"
+OpName %7 "a_func"
 %3 = OpTypeFloat 32
 %2 = OpTypePointer Private %3
 %4 = OpConstantNull %3
@@ -677,7 +677,7 @@
 
   EXPECT_EQ(b.GenerateCallExpression(&expr), 5u) << b.error();
   EXPECT_EQ(DumpBuilder(b), R"(%7 = OpExtInstImport "GLSL.std.450"
-OpName %3 "tint_615f66756e63"
+OpName %3 "a_func"
 %2 = OpTypeVoid
 %1 = OpTypeFunction %2
 %6 = OpTypeFloat 32
@@ -703,7 +703,7 @@
 
   EXPECT_EQ(b.GenerateCallExpression(&expr), 5u) << b.error();
   EXPECT_EQ(DumpBuilder(b), R"(%8 = OpExtInstImport "GLSL.std.450"
-OpName %3 "tint_615f66756e63"
+OpName %3 "a_func"
 %2 = OpTypeVoid
 %1 = OpTypeFunction %2
 %7 = OpTypeFloat 32
@@ -755,7 +755,7 @@
 
   EXPECT_EQ(b.GenerateCallExpression(&expr), 5u) << b.error();
   EXPECT_EQ(DumpBuilder(b), R"(%7 = OpExtInstImport "GLSL.std.450"
-OpName %3 "tint_615f66756e63"
+OpName %3 "a_func"
 %2 = OpTypeVoid
 %1 = OpTypeFunction %2
 %6 = OpTypeFloat 32
@@ -778,7 +778,7 @@
 
   EXPECT_EQ(b.GenerateCallExpression(&expr), 5u) << b.error();
   EXPECT_EQ(DumpBuilder(b), R"(%7 = OpExtInstImport "GLSL.std.450"
-OpName %3 "tint_615f66756e63"
+OpName %3 "a_func"
 %2 = OpTypeVoid
 %1 = OpTypeFunction %2
 %6 = OpTypeFloat 32
@@ -803,7 +803,7 @@
 
   EXPECT_EQ(b.GenerateCallExpression(&expr), 5u) << b.error();
   EXPECT_EQ(DumpBuilder(b), R"(%8 = OpExtInstImport "GLSL.std.450"
-OpName %3 "tint_615f66756e63"
+OpName %3 "a_func"
 %2 = OpTypeVoid
 %1 = OpTypeFunction %2
 %7 = OpTypeFloat 32
@@ -833,7 +833,7 @@
 
   EXPECT_EQ(b.GenerateCallExpression(&expr), 5u) << b.error();
   EXPECT_EQ(DumpBuilder(b), R"(%7 = OpExtInstImport "GLSL.std.450"
-OpName %3 "tint_615f66756e63"
+OpName %3 "a_func"
 %2 = OpTypeVoid
 %1 = OpTypeFunction %2
 %6 = OpTypeFloat 32
@@ -860,7 +860,7 @@
 
   EXPECT_EQ(b.GenerateCallExpression(&expr), 5u) << b.error();
   EXPECT_EQ(DumpBuilder(b), R"(%8 = OpExtInstImport "GLSL.std.450"
-OpName %3 "tint_615f66756e63"
+OpName %3 "a_func"
 %2 = OpTypeVoid
 %1 = OpTypeFunction %2
 %7 = OpTypeFloat 32
@@ -895,7 +895,7 @@
 
   EXPECT_EQ(b.GenerateCallExpression(&expr), 5u) << b.error();
   EXPECT_EQ(DumpBuilder(b), R"(%7 = OpExtInstImport "GLSL.std.450"
-OpName %3 "tint_615f66756e63"
+OpName %3 "a_func"
 %2 = OpTypeVoid
 %1 = OpTypeFunction %2
 %6 = OpTypeFloat 32
@@ -919,7 +919,7 @@
 
   EXPECT_EQ(b.GenerateCallExpression(&expr), 5u) << b.error();
   EXPECT_EQ(DumpBuilder(b), R"(%7 = OpExtInstImport "GLSL.std.450"
-OpName %3 "tint_615f66756e63"
+OpName %3 "a_func"
 %2 = OpTypeVoid
 %1 = OpTypeFunction %2
 %6 = OpTypeFloat 32
@@ -946,7 +946,7 @@
 
   EXPECT_EQ(b.GenerateCallExpression(&expr), 5u) << b.error();
   EXPECT_EQ(DumpBuilder(b), R"(%8 = OpExtInstImport "GLSL.std.450"
-OpName %3 "tint_615f66756e63"
+OpName %3 "a_func"
 %2 = OpTypeVoid
 %1 = OpTypeFunction %2
 %7 = OpTypeFloat 32
@@ -975,7 +975,7 @@
 
   EXPECT_EQ(b.GenerateCallExpression(&expr), 5u) << b.error();
   EXPECT_EQ(DumpBuilder(b), R"(%7 = OpExtInstImport "GLSL.std.450"
-OpName %3 "tint_615f66756e63"
+OpName %3 "a_func"
 %2 = OpTypeVoid
 %1 = OpTypeFunction %2
 %6 = OpTypeFloat 32
@@ -1003,7 +1003,7 @@
 
   EXPECT_EQ(b.GenerateCallExpression(&expr), 5u) << b.error();
   EXPECT_EQ(DumpBuilder(b), R"(%8 = OpExtInstImport "GLSL.std.450"
-OpName %3 "tint_615f66756e63"
+OpName %3 "a_func"
 %2 = OpTypeVoid
 %1 = OpTypeFunction %2
 %7 = OpTypeFloat 32
@@ -1042,7 +1042,7 @@
 
   EXPECT_EQ(b.GenerateCallExpression(&expr), 5u) << b.error();
   EXPECT_EQ(DumpBuilder(b), R"(%7 = OpExtInstImport "GLSL.std.450"
-OpName %3 "tint_615f66756e63"
+OpName %3 "a_func"
 %2 = OpTypeVoid
 %1 = OpTypeFunction %2
 %6 = OpTypeInt 32 1
@@ -1068,7 +1068,7 @@
 
   EXPECT_EQ(b.GenerateCallExpression(&expr), 5u) << b.error();
   EXPECT_EQ(DumpBuilder(b), R"(%8 = OpExtInstImport "GLSL.std.450"
-OpName %3 "tint_615f66756e63"
+OpName %3 "a_func"
 %2 = OpTypeVoid
 %1 = OpTypeFunction %2
 %7 = OpTypeInt 32 1
@@ -1101,7 +1101,7 @@
 
   EXPECT_EQ(b.GenerateCallExpression(&expr), 5u) << b.error();
   EXPECT_EQ(DumpBuilder(b), R"(%7 = OpExtInstImport "GLSL.std.450"
-OpName %3 "tint_615f66756e63"
+OpName %3 "a_func"
 %2 = OpTypeVoid
 %1 = OpTypeFunction %2
 %6 = OpTypeInt 32 0
@@ -1127,7 +1127,7 @@
 
   EXPECT_EQ(b.GenerateCallExpression(&expr), 5u) << b.error();
   EXPECT_EQ(DumpBuilder(b), R"(%8 = OpExtInstImport "GLSL.std.450"
-OpName %3 "tint_615f66756e63"
+OpName %3 "a_func"
 %2 = OpTypeVoid
 %1 = OpTypeFunction %2
 %7 = OpTypeInt 32 0
@@ -1160,7 +1160,7 @@
 
   EXPECT_EQ(b.GenerateCallExpression(&expr), 5u) << b.error();
   EXPECT_EQ(DumpBuilder(b), R"(%7 = OpExtInstImport "GLSL.std.450"
-OpName %3 "tint_615f66756e63"
+OpName %3 "a_func"
 %2 = OpTypeVoid
 %1 = OpTypeFunction %2
 %6 = OpTypeInt 32 1
@@ -1186,7 +1186,7 @@
 
   EXPECT_EQ(b.GenerateCallExpression(&expr), 5u) << b.error();
   EXPECT_EQ(DumpBuilder(b), R"(%8 = OpExtInstImport "GLSL.std.450"
-OpName %3 "tint_615f66756e63"
+OpName %3 "a_func"
 %2 = OpTypeVoid
 %1 = OpTypeFunction %2
 %7 = OpTypeInt 32 1
@@ -1220,7 +1220,7 @@
 
   EXPECT_EQ(b.GenerateCallExpression(&expr), 5u) << b.error();
   EXPECT_EQ(DumpBuilder(b), R"(%7 = OpExtInstImport "GLSL.std.450"
-OpName %3 "tint_615f66756e63"
+OpName %3 "a_func"
 %2 = OpTypeVoid
 %1 = OpTypeFunction %2
 %6 = OpTypeInt 32 0
@@ -1246,7 +1246,7 @@
 
   EXPECT_EQ(b.GenerateCallExpression(&expr), 5u) << b.error();
   EXPECT_EQ(DumpBuilder(b), R"(%8 = OpExtInstImport "GLSL.std.450"
-OpName %3 "tint_615f66756e63"
+OpName %3 "a_func"
 %2 = OpTypeVoid
 %1 = OpTypeFunction %2
 %7 = OpTypeInt 32 0
@@ -1280,7 +1280,7 @@
 
   EXPECT_EQ(b.GenerateCallExpression(&expr), 5u) << b.error();
   EXPECT_EQ(DumpBuilder(b), R"(%7 = OpExtInstImport "GLSL.std.450"
-OpName %3 "tint_615f66756e63"
+OpName %3 "a_func"
 %2 = OpTypeVoid
 %1 = OpTypeFunction %2
 %6 = OpTypeInt 32 1
@@ -1308,7 +1308,7 @@
 
   EXPECT_EQ(b.GenerateCallExpression(&expr), 5u) << b.error();
   EXPECT_EQ(DumpBuilder(b), R"(%8 = OpExtInstImport "GLSL.std.450"
-OpName %3 "tint_615f66756e63"
+OpName %3 "a_func"
 %2 = OpTypeVoid
 %1 = OpTypeFunction %2
 %7 = OpTypeInt 32 1
@@ -1341,7 +1341,7 @@
 
   EXPECT_EQ(b.GenerateCallExpression(&expr), 5u) << b.error();
   EXPECT_EQ(DumpBuilder(b), R"(%7 = OpExtInstImport "GLSL.std.450"
-OpName %3 "tint_615f66756e63"
+OpName %3 "a_func"
 %2 = OpTypeVoid
 %1 = OpTypeFunction %2
 %6 = OpTypeInt 32 0
@@ -1369,7 +1369,7 @@
 
   EXPECT_EQ(b.GenerateCallExpression(&expr), 5u) << b.error();
   EXPECT_EQ(DumpBuilder(b), R"(%8 = OpExtInstImport "GLSL.std.450"
-OpName %3 "tint_615f66756e63"
+OpName %3 "a_func"
 %2 = OpTypeVoid
 %1 = OpTypeFunction %2
 %7 = OpTypeInt 32 0
@@ -1402,8 +1402,8 @@
   EXPECT_EQ(b.GenerateCallExpression(&expr), 11u) << b.error();
 
   EXPECT_EQ(DumpBuilder(b), R"(%12 = OpExtInstImport "GLSL.std.450"
-OpName %3 "tint_615f66756e63"
-OpName %5 "tint_766172"
+OpName %3 "a_func"
+OpName %5 "var"
 %2 = OpTypeVoid
 %1 = OpTypeFunction %2
 %9 = OpTypeFloat 32
diff --git a/src/writer/spirv/builder_intrinsic_texture_test.cc b/src/writer/spirv/builder_intrinsic_texture_test.cc
index f5c8c06..c065cfc 100644
--- a/src/writer/spirv/builder_intrinsic_texture_test.cc
+++ b/src/writer/spirv/builder_intrinsic_texture_test.cc
@@ -1491,15 +1491,15 @@
 }  // NOLINT - Ignore the length of this function
 
 class IntrinsicTextureTest
-    : public ast::BuilderWithContextAndModule,
+    : public ast::BuilderWithModule,
       public testing::TestWithParam<ast::intrinsic::test::TextureOverloadCase> {
  protected:
   void OnVariableBuilt(ast::Variable* var) override {
     td.RegisterVariableForTesting(var);
   }
 
-  TypeDeterminer td{ctx, mod};
-  spirv::Builder b{ctx, mod};
+  TypeDeterminer td{mod};
+  spirv::Builder b{mod};
 };
 
 INSTANTIATE_TEST_SUITE_P(
diff --git a/src/writer/spirv/builder_switch_test.cc b/src/writer/spirv/builder_switch_test.cc
index 25158f3..fb99a2a 100644
--- a/src/writer/spirv/builder_switch_test.cc
+++ b/src/writer/spirv/builder_switch_test.cc
@@ -116,9 +116,9 @@
 
   EXPECT_TRUE(b.GenerateSwitchStatement(&expr)) << b.error();
 
-  EXPECT_EQ(DumpBuilder(b), R"(OpName %1 "tint_76"
-OpName %5 "tint_61"
-OpName %7 "tint_615f66756e63"
+  EXPECT_EQ(DumpBuilder(b), R"(OpName %1 "v"
+OpName %5 "a"
+OpName %7 "a_func"
 %3 = OpTypeInt 32 1
 %2 = OpTypePointer Private %3
 %4 = OpConstantNull %3
@@ -180,9 +180,9 @@
 
   EXPECT_TRUE(b.GenerateSwitchStatement(&expr)) << b.error();
 
-  EXPECT_EQ(DumpBuilder(b), R"(OpName %1 "tint_76"
-OpName %5 "tint_61"
-OpName %7 "tint_615f66756e63"
+  EXPECT_EQ(DumpBuilder(b), R"(OpName %1 "v"
+OpName %5 "a"
+OpName %7 "a_func"
 %3 = OpTypeInt 32 1
 %2 = OpTypePointer Private %3
 %4 = OpConstantNull %3
@@ -263,9 +263,9 @@
 
   EXPECT_TRUE(b.GenerateSwitchStatement(&expr)) << b.error();
 
-  EXPECT_EQ(DumpBuilder(b), R"(OpName %1 "tint_76"
-OpName %5 "tint_61"
-OpName %7 "tint_615f66756e63"
+  EXPECT_EQ(DumpBuilder(b), R"(OpName %1 "v"
+OpName %5 "a"
+OpName %7 "a_func"
 %3 = OpTypeInt 32 1
 %2 = OpTypePointer Private %3
 %4 = OpConstantNull %3
@@ -355,9 +355,9 @@
 
   EXPECT_TRUE(b.GenerateSwitchStatement(&expr)) << b.error();
 
-  EXPECT_EQ(DumpBuilder(b), R"(OpName %1 "tint_76"
-OpName %5 "tint_61"
-OpName %7 "tint_615f66756e63"
+  EXPECT_EQ(DumpBuilder(b), R"(OpName %1 "v"
+OpName %5 "a"
+OpName %7 "a_func"
 %3 = OpTypeInt 32 1
 %2 = OpTypePointer Private %3
 %4 = OpConstantNull %3
@@ -477,9 +477,9 @@
 
   EXPECT_TRUE(b.GenerateSwitchStatement(&expr)) << b.error();
 
-  EXPECT_EQ(DumpBuilder(b), R"(OpName %1 "tint_76"
-OpName %5 "tint_61"
-OpName %7 "tint_615f66756e63"
+  EXPECT_EQ(DumpBuilder(b), R"(OpName %1 "v"
+OpName %5 "a"
+OpName %7 "a_func"
 %3 = OpTypeInt 32 1
 %2 = OpTypePointer Private %3
 %4 = OpConstantNull %3
diff --git a/src/writer/spirv/builder_type_test.cc b/src/writer/spirv/builder_type_test.cc
index 219fbe1..0a1c200 100644
--- a/src/writer/spirv/builder_type_test.cc
+++ b/src/writer/spirv/builder_type_test.cc
@@ -287,7 +287,7 @@
   EXPECT_EQ(id, 1u);
 
   EXPECT_EQ(b.types().size(), 1u);
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "tint_53"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "S"
 )");
   EXPECT_EQ(DumpInstructions(b.types()), R"(%1 = OpTypeStruct
 )");
@@ -310,8 +310,8 @@
   EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeFloat 32
 %1 = OpTypeStruct %2
 )");
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "tint_6d795f737472756374"
-OpMemberName %1 0 "tint_61"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "my_struct"
+OpMemberName %1 0 "a"
 )");
 }
 
@@ -335,8 +335,8 @@
   EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeFloat 32
 %1 = OpTypeStruct %2
 )");
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "tint_6d795f737472756374"
-OpMemberName %1 0 "tint_61"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "my_struct"
+OpMemberName %1 0 "a"
 )");
   EXPECT_EQ(DumpInstructions(b.annots()), R"(OpDecorate %1 Block
 )");
@@ -364,9 +364,9 @@
   EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeFloat 32
 %1 = OpTypeStruct %2 %2
 )");
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "tint_53"
-OpMemberName %1 0 "tint_61"
-OpMemberName %1 1 "tint_62"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "S"
+OpMemberName %1 0 "a"
+OpMemberName %1 1 "b"
 )");
   EXPECT_EQ(DumpInstructions(b.annots()), R"(OpMemberDecorate %1 0 Offset 0
 OpMemberDecorate %1 1 Offset 8
@@ -404,10 +404,10 @@
 %7 = OpTypeMatrix %8 4
 %1 = OpTypeStruct %2 %5 %7
 )");
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "tint_53"
-OpMemberName %1 0 "tint_61"
-OpMemberName %1 1 "tint_62"
-OpMemberName %1 2 "tint_63"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "S"
+OpMemberName %1 0 "a"
+OpMemberName %1 1 "b"
+OpMemberName %1 2 "c"
 )");
   EXPECT_EQ(DumpInstructions(b.annots()), "");
 }
@@ -447,10 +447,10 @@
 %7 = OpTypeMatrix %8 4
 %1 = OpTypeStruct %2 %5 %7
 )");
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "tint_53"
-OpMemberName %1 0 "tint_61"
-OpMemberName %1 1 "tint_62"
-OpMemberName %1 2 "tint_63"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "S"
+OpMemberName %1 0 "a"
+OpMemberName %1 1 "b"
+OpMemberName %1 2 "c"
 )");
   EXPECT_EQ(DumpInstructions(b.annots()), R"(OpMemberDecorate %1 0 Offset 0
 OpMemberDecorate %1 0 ColMajor
@@ -508,10 +508,10 @@
 %7 = OpTypeMatrix %8 4
 %1 = OpTypeStruct %2 %5 %7
 )");
-  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "tint_53"
-OpMemberName %1 0 "tint_61"
-OpMemberName %1 1 "tint_62"
-OpMemberName %1 2 "tint_63"
+  EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "S"
+OpMemberName %1 0 "a"
+OpMemberName %1 1 "b"
+OpMemberName %1 2 "c"
 )");
   EXPECT_EQ(DumpInstructions(b.annots()), R"(OpMemberDecorate %1 0 Offset 0
 OpMemberDecorate %1 0 ColMajor
diff --git a/src/writer/spirv/generator.cc b/src/writer/spirv/generator.cc
index 495ddd0..1fac75e 100644
--- a/src/writer/spirv/generator.cc
+++ b/src/writer/spirv/generator.cc
@@ -22,18 +22,16 @@
 
 Generator::Generator(ast::Module module)
     : writer::Writer(std::move(module)),
-      builder_(std::make_unique<Builder>(ctx_, &module_)),
+      builder_(std::make_unique<Builder>(&module_)),
       writer_(std::make_unique<BinaryWriter>()) {}
 
-Generator::Generator(Context* ctx, ast::Module module)
-    : writer::Writer(ctx, std::move(module)),
-      builder_(std::make_unique<Builder>(ctx, &module_)),
-      writer_(std::make_unique<BinaryWriter>()) {}
+Generator::Generator(Context*, ast::Module module)
+    : Generator(std::move(module)) {}
 
 Generator::~Generator() = default;
 
 void Generator::Reset() {
-  builder_ = std::make_unique<Builder>(ctx_, &module_);
+  builder_ = std::make_unique<Builder>(&module_);
   writer_ = std::make_unique<BinaryWriter>();
 }
 
diff --git a/src/writer/spirv/generator.h b/src/writer/spirv/generator.h
index 9687969..97825eb 100644
--- a/src/writer/spirv/generator.h
+++ b/src/writer/spirv/generator.h
@@ -32,10 +32,10 @@
 class Generator : public writer::Writer {
  public:
   /// Constructor
-  /// DEPRECATED
   /// @param module the module to convert
   explicit Generator(ast::Module module);
   /// Constructor
+  /// DEPRECATED
   /// @param ctx the context, must be non-null
   /// @param module the module to convert
   Generator(Context* ctx, ast::Module module);
diff --git a/src/writer/spirv/test_helper.h b/src/writer/spirv/test_helper.h
index c8194b4..cbc3d0e 100644
--- a/src/writer/spirv/test_helper.h
+++ b/src/writer/spirv/test_helper.h
@@ -21,7 +21,6 @@
 #include "gtest/gtest.h"
 #include "src/ast/builder.h"
 #include "src/ast/module.h"
-#include "src/context.h"
 #include "src/type_determiner.h"
 #include "src/writer/spirv/builder.h"
 
@@ -31,9 +30,9 @@
 
 /// Helper class for testing
 template <typename BASE>
-class TestHelperBase : public ast::BuilderWithContextAndModule, public BASE {
+class TestHelperBase : public ast::BuilderWithModule, public BASE {
  public:
-  TestHelperBase() : td(ctx, mod), b(ctx, mod) {}
+  TestHelperBase() : td(mod), b(mod) {}
   ~TestHelperBase() override = default;
 
   /// The type determiner
diff --git a/src/writer/text.cc b/src/writer/text.cc
index 52929cc..319f32e 100644
--- a/src/writer/text.cc
+++ b/src/writer/text.cc
@@ -21,8 +21,6 @@
 
 Text::Text(ast::Module module) : Writer(std::move(module)) {}
 
-Text::Text(Context* ctx, ast::Module module) : Writer(ctx, std::move(module)) {}
-
 Text::~Text() = default;
 
 }  // namespace writer
diff --git a/src/writer/text.h b/src/writer/text.h
index 5f7bb1c..7e4fffc 100644
--- a/src/writer/text.h
+++ b/src/writer/text.h
@@ -26,13 +26,8 @@
 class Text : public Writer {
  public:
   /// Constructor
-  /// DEPRECATED
   /// @param module the module to convert
   explicit Text(ast::Module module);
-  /// Constructor
-  /// @param ctx the context object, must be non-null
-  /// @param module the module to convert
-  Text(Context* ctx, ast::Module module);
   ~Text() override;
 
   /// @returns the result data
diff --git a/src/writer/text_generator.cc b/src/writer/text_generator.cc
index 52f60e8..e057abe 100644
--- a/src/writer/text_generator.cc
+++ b/src/writer/text_generator.cc
@@ -21,9 +21,7 @@
 namespace tint {
 namespace writer {
 
-TextGenerator::TextGenerator(Context* ctx) : ctx_(ctx) {
-  assert(ctx_);
-}
+TextGenerator::TextGenerator() = default;
 
 TextGenerator::~TextGenerator() = default;
 
diff --git a/src/writer/text_generator.h b/src/writer/text_generator.h
index d38d3ed..46da1bc 100644
--- a/src/writer/text_generator.h
+++ b/src/writer/text_generator.h
@@ -18,8 +18,6 @@
 #include <sstream>
 #include <string>
 
-#include "src/context.h"
-
 namespace tint {
 namespace writer {
 
@@ -27,8 +25,7 @@
 class TextGenerator {
  public:
   /// Constructor
-  /// @param ctx the context object, must be non-null
-  explicit TextGenerator(Context* ctx);
+  TextGenerator();
   ~TextGenerator();
 
   /// Increment the emitter indent level
@@ -52,8 +49,6 @@
   std::string error() const { return error_; }
 
  protected:
-  /// The context
-  Context* ctx_ = nullptr;
   /// The text output stream
   std::ostringstream out_;
   /// Error generated by the generator
diff --git a/src/writer/wgsl/generator.cc b/src/writer/wgsl/generator.cc
index 93816ed..c96cafd 100644
--- a/src/writer/wgsl/generator.cc
+++ b/src/writer/wgsl/generator.cc
@@ -21,17 +21,16 @@
 namespace wgsl {
 
 Generator::Generator(ast::Module module)
-    : Text(std::move(module)), impl_(std::make_unique<GeneratorImpl>(ctx_)) {}
+    : Text(std::move(module)), impl_(std::make_unique<GeneratorImpl>()) {}
 
-Generator::Generator(Context* ctx, ast::Module module)
-    : Text(ctx, std::move(module)),
-      impl_(std::make_unique<GeneratorImpl>(ctx_)) {}
+Generator::Generator(Context*, ast::Module module)
+    : Generator(std::move(module)) {}
 
 Generator::~Generator() = default;
 
 void Generator::Reset() {
   set_error("");
-  impl_ = std::make_unique<GeneratorImpl>(ctx_);
+  impl_ = std::make_unique<GeneratorImpl>();
 }
 
 bool Generator::Generate() {
diff --git a/src/writer/wgsl/generator.h b/src/writer/wgsl/generator.h
index 685f7cf..e269ec9 100644
--- a/src/writer/wgsl/generator.h
+++ b/src/writer/wgsl/generator.h
@@ -29,10 +29,10 @@
 class Generator : public Text {
  public:
   /// Constructor
-  /// DEPRECATED
   /// @param module the module to convert
   explicit Generator(ast::Module module);
   /// Constructor
+  /// DEPRECATED
   /// @param ctx the context, must be non-null
   /// @param module the module to convert
   Generator(Context* ctx, ast::Module module);
diff --git a/src/writer/wgsl/generator_impl.cc b/src/writer/wgsl/generator_impl.cc
index 24d51a0..1257e7b 100644
--- a/src/writer/wgsl/generator_impl.cc
+++ b/src/writer/wgsl/generator_impl.cc
@@ -78,7 +78,7 @@
 namespace writer {
 namespace wgsl {
 
-GeneratorImpl::GeneratorImpl(Context* ctx) : TextGenerator(ctx) {}
+GeneratorImpl::GeneratorImpl() : TextGenerator() {}
 
 GeneratorImpl::~GeneratorImpl() = default;
 
diff --git a/src/writer/wgsl/generator_impl.h b/src/writer/wgsl/generator_impl.h
index 3bc921a..ba0544f 100644
--- a/src/writer/wgsl/generator_impl.h
+++ b/src/writer/wgsl/generator_impl.h
@@ -54,8 +54,7 @@
 class GeneratorImpl : public TextGenerator {
  public:
   /// Constructor
-  /// @param ctx the context, must be non-null
-  explicit GeneratorImpl(Context* ctx);
+  GeneratorImpl();
   ~GeneratorImpl();
 
   /// Generates the result data
diff --git a/src/writer/wgsl/test_helper.h b/src/writer/wgsl/test_helper.h
index 57b14ce..4b8055e 100644
--- a/src/writer/wgsl/test_helper.h
+++ b/src/writer/wgsl/test_helper.h
@@ -20,7 +20,6 @@
 
 #include "gtest/gtest.h"
 #include "src/ast/module.h"
-#include "src/context.h"
 #include "src/type_determiner.h"
 #include "src/writer/wgsl/generator_impl.h"
 
@@ -32,7 +31,7 @@
 template <typename BASE>
 class TestHelperBase : public BASE {
  public:
-  TestHelperBase() : td(&ctx, &mod), gen(&ctx) {}
+  TestHelperBase() : td(&mod), gen() {}
 
   ~TestHelperBase() = default;
 
@@ -45,8 +44,6 @@
     return mod.create<T>(std::forward<ARGS>(args)...);
   }
 
-  /// The context
-  Context ctx;
   /// The module
   ast::Module mod;
   /// The type determiner
diff --git a/src/writer/writer.cc b/src/writer/writer.cc
index c41b556..545ed3b 100644
--- a/src/writer/writer.cc
+++ b/src/writer/writer.cc
@@ -19,18 +19,9 @@
 namespace tint {
 namespace writer {
 
-Writer::Writer(ast::Module module)
-    : ctx_(new Context()),
-      context_is_owned_(true),
-      module_(std::move(module)) {}
+Writer::Writer(ast::Module module) : module_(std::move(module)) {}
 
-Writer::Writer(Context* ctx, ast::Module module)
-    : ctx_(ctx), context_is_owned_(false), module_(std::move(module)) {}
-
-Writer::~Writer() {
-  if (context_is_owned_)
-    delete ctx_;
-}
+Writer::~Writer() = default;
 
 }  // namespace writer
 }  // namespace tint
diff --git a/src/writer/writer.h b/src/writer/writer.h
index 3caf73e..46d8801 100644
--- a/src/writer/writer.h
+++ b/src/writer/writer.h
@@ -50,25 +50,15 @@
 
  protected:
   /// Constructor
-  /// DEPRECATED
   /// @param module the tint module to convert
   explicit Writer(ast::Module module);
 
-  /// Constructor
-  /// @param ctx the context object, must be non-null
-  /// @param module the tint module to convert
-  Writer(Context* ctx, ast::Module module);
-
   /// Sets the error string
   /// @param msg the error message
   void set_error(const std::string& msg) { error_ = msg; }
 
   /// An error message, if an error was encountered
   std::string error_;
-  /// The context
-  Context* ctx_ = nullptr;
-  /// Tracks if we own the context
-  bool context_is_owned_ = false;
   /// The module being converted
   ast::Module module_;
 };