diff --git a/src/ast/function.cc b/src/ast/function.cc
index 88b5b96..66147f9 100644
--- a/src/ast/function.cc
+++ b/src/ast/function.cc
@@ -360,5 +360,32 @@
   return ret;
 }
 
+Function* FunctionList::Find(Symbol sym) const {
+  for (auto* func : *this) {
+    if (func->symbol() == sym) {
+      return func;
+    }
+  }
+  return nullptr;
+}
+
+Function* FunctionList::Find(Symbol sym, PipelineStage stage) const {
+  for (auto* func : *this) {
+    if (func->symbol() == sym && func->pipeline_stage() == stage) {
+      return func;
+    }
+  }
+  return nullptr;
+}
+
+bool FunctionList::HasStage(ast::PipelineStage stage) const {
+  for (auto* func : *this) {
+    if (func->pipeline_stage() == stage) {
+      return true;
+    }
+  }
+  return false;
+}
+
 }  // namespace ast
 }  // namespace tint
diff --git a/src/ast/function.h b/src/ast/function.h
index 248dd55..0f635c1 100644
--- a/src/ast/function.h
+++ b/src/ast/function.h
@@ -210,7 +210,28 @@
 };
 
 /// A list of functions
-using FunctionList = std::vector<Function*>;
+class FunctionList : public std::vector<Function*> {
+ public:
+  /// Appends f to the end of the list
+  /// @param f the function to append to this list
+  void Add(Function* f) { this->emplace_back(f); }
+
+  /// Returns the function with the given name
+  /// @param sym the function symbol to search for
+  /// @returns the associated function or nullptr if none exists
+  Function* Find(Symbol sym) const;
+
+  /// Returns the function with the given name
+  /// @param sym the function symbol to search for
+  /// @param stage the pipeline stage
+  /// @returns the associated function or nullptr if none exists
+  Function* Find(Symbol sym, PipelineStage stage) const;
+
+  /// @param stage the pipeline stage
+  /// @returns true if the Builder contains an entrypoint function with
+  /// the given stage
+  bool HasStage(PipelineStage stage) const;
+};
 
 }  // namespace ast
 }  // namespace tint
diff --git a/src/ast/function_test.cc b/src/ast/function_test.cc
index 548aedc..a2aeb5d 100644
--- a/src/ast/function_test.cc
+++ b/src/ast/function_test.cc
@@ -18,6 +18,7 @@
 #include "src/ast/discard_statement.h"
 #include "src/ast/location_decoration.h"
 #include "src/ast/pipeline_stage.h"
+#include "src/ast/stage_decoration.h"
 #include "src/ast/test_helper.h"
 #include "src/ast/variable.h"
 #include "src/ast/workgroup_decoration.h"
@@ -356,6 +357,58 @@
   EXPECT_EQ(z, 6u);
 }
 
+using FunctionListTest = TestHelper;
+
+TEST_F(FunctionListTest, FindSymbol) {
+  auto* func = Func("main", VariableList{}, ty.f32, StatementList{},
+                    ast::FunctionDecorationList{});
+  FunctionList list;
+  list.Add(func);
+  EXPECT_EQ(func, list.Find(mod->RegisterSymbol("main")));
+}
+
+TEST_F(FunctionListTest, FindSymbolMissing) {
+  FunctionList list;
+  EXPECT_EQ(nullptr, list.Find(mod->RegisterSymbol("Missing")));
+}
+
+TEST_F(FunctionListTest, FindSymbolStage) {
+  auto* fs = Func("main", VariableList{}, ty.f32, StatementList{},
+                  ast::FunctionDecorationList{
+                      create<ast::StageDecoration>(PipelineStage::kFragment),
+                  });
+  auto* vs = Func("main", VariableList{}, ty.f32, StatementList{},
+                  ast::FunctionDecorationList{
+                      create<ast::StageDecoration>(PipelineStage::kVertex),
+                  });
+  FunctionList list;
+  list.Add(fs);
+  list.Add(vs);
+  EXPECT_EQ(fs,
+            list.Find(mod->RegisterSymbol("main"), PipelineStage::kFragment));
+  EXPECT_EQ(vs, list.Find(mod->RegisterSymbol("main"), PipelineStage::kVertex));
+}
+
+TEST_F(FunctionListTest, FindSymbolStageMissing) {
+  FunctionList list;
+  list.Add(Func("main", VariableList{}, ty.f32, StatementList{},
+                ast::FunctionDecorationList{
+                    create<ast::StageDecoration>(PipelineStage::kFragment),
+                }));
+  EXPECT_EQ(nullptr,
+            list.Find(mod->RegisterSymbol("main"), PipelineStage::kVertex));
+}
+
+TEST_F(FunctionListTest, HasStage) {
+  FunctionList list;
+  list.Add(Func("main", VariableList{}, ty.f32, StatementList{},
+                ast::FunctionDecorationList{
+                    create<ast::StageDecoration>(PipelineStage::kFragment),
+                }));
+  EXPECT_TRUE(list.HasStage(PipelineStage::kFragment));
+  EXPECT_FALSE(list.HasStage(PipelineStage::kVertex));
+}
+
 }  // namespace
 }  // namespace ast
 }  // namespace tint
diff --git a/src/ast/module.cc b/src/ast/module.cc
index e439a8d..0a73dd0 100644
--- a/src/ast/module.cc
+++ b/src/ast/module.cc
@@ -48,34 +48,6 @@
   }
 }
 
-Function* Module::FindFunctionBySymbol(Symbol sym) const {
-  for (auto* func : functions_) {
-    if (func->symbol() == sym) {
-      return func;
-    }
-  }
-  return nullptr;
-}
-
-Function* Module::FindFunctionBySymbolAndStage(Symbol sym,
-                                               PipelineStage stage) const {
-  for (auto* func : functions_) {
-    if (func->symbol() == sym && func->pipeline_stage() == stage) {
-      return func;
-    }
-  }
-  return nullptr;
-}
-
-bool Module::HasStage(ast::PipelineStage stage) const {
-  for (auto* func : functions_) {
-    if (func->pipeline_stage() == stage) {
-      return true;
-    }
-  }
-  return false;
-}
-
 Symbol Module::RegisterSymbol(const std::string& name) {
   return symbol_table_.Register(name);
 }
diff --git a/src/ast/module.h b/src/ast/module.h
index 798a761..393f3db 100644
--- a/src/ast/module.h
+++ b/src/ast/module.h
@@ -82,24 +82,11 @@
     return constructed_types_;
   }
 
-  /// Adds a function to the module
-  /// @param func the function
-  void AddFunction(Function* func) { functions_.push_back(func); }
-  /// @returns the modules functions
-  const FunctionList& functions() const { return functions_; }
-  /// Returns the function with the given name
-  /// @param sym the function symbol to search for
-  /// @returns the associated function or nullptr if none exists
-  Function* FindFunctionBySymbol(Symbol sym) const;
-  /// Returns the function with the given name
-  /// @param sym the function symbol to search for
-  /// @param stage the pipeline stage
-  /// @returns the associated function or nullptr if none exists
-  Function* FindFunctionBySymbolAndStage(Symbol sym, PipelineStage stage) const;
-  /// @param stage the pipeline stage
-  /// @returns true if the module contains an entrypoint function with the given
-  /// stage
-  bool HasStage(PipelineStage stage) const;
+  /// @returns the functions declared in the translation unit
+  const FunctionList& Functions() const { return functions_; }
+
+  /// @returns the functions declared in the translation unit
+  FunctionList& Functions() { return functions_; }
 
   /// @returns true if all required fields in the AST are present.
   bool IsValid() const;
diff --git a/src/ast/module_test.cc b/src/ast/module_test.cc
index 605bdb8..399a442 100644
--- a/src/ast/module_test.cc
+++ b/src/ast/module_test.cc
@@ -32,7 +32,7 @@
 using ModuleTest = TestHelper;
 
 TEST_F(ModuleTest, Creation) {
-  EXPECT_EQ(mod->functions().size(), 0u);
+  EXPECT_EQ(mod->Functions().size(), 0u);
 }
 
 TEST_F(ModuleTest, ToStrEmitsPreambleAndPostamble) {
@@ -41,17 +41,6 @@
   EXPECT_EQ(str, expected);
 }
 
-TEST_F(ModuleTest, LookupFunction) {
-  auto* func = Func("main", VariableList{}, ty.f32, StatementList{},
-                    ast::FunctionDecorationList{});
-  mod->AddFunction(func);
-  EXPECT_EQ(func, mod->FindFunctionBySymbol(mod->RegisterSymbol("main")));
-}
-
-TEST_F(ModuleTest, LookupFunctionMissing) {
-  EXPECT_EQ(nullptr, mod->FindFunctionBySymbol(mod->RegisterSymbol("Missing")));
-}
-
 TEST_F(ModuleTest, IsValid_Empty) {
   EXPECT_TRUE(mod->IsValid());
 }
@@ -102,12 +91,12 @@
   auto* func = Func("main", VariableList(), ty.f32, StatementList{},
                     ast::FunctionDecorationList{});
 
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
   EXPECT_TRUE(mod->IsValid());
 }
 
 TEST_F(ModuleTest, IsValid_Null_Function) {
-  mod->AddFunction(nullptr);
+  mod->Functions().Add(nullptr);
   EXPECT_FALSE(mod->IsValid());
 }
 
@@ -115,7 +104,7 @@
   auto* func = Func("main", VariableList{}, nullptr, StatementList{},
                     ast::FunctionDecorationList{});
 
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
   EXPECT_FALSE(mod->IsValid());
 }
 
diff --git a/src/inspector/inspector.cc b/src/inspector/inspector.cc
index 91d6cd1..dbbaa21 100644
--- a/src/inspector/inspector.cc
+++ b/src/inspector/inspector.cc
@@ -50,7 +50,7 @@
 std::vector<EntryPoint> Inspector::GetEntryPoints() {
   std::vector<EntryPoint> result;
 
-  for (auto* func : module_.functions()) {
+  for (auto* func : module_.Functions()) {
     if (!func->IsEntryPoint()) {
       continue;
     }
@@ -278,7 +278,7 @@
 }
 
 ast::Function* Inspector::FindEntryPointByName(const std::string& name) {
-  auto* func = module_.FindFunctionBySymbol(module_.GetSymbol(name));
+  auto* func = module_.Functions().Find(module_.GetSymbol(name));
   if (!func) {
     error_ += name + " was not found!";
     return nullptr;
diff --git a/src/inspector/inspector_test.cc b/src/inspector/inspector_test.cc
index bd9ad5d..b0792bb 100644
--- a/src/inspector/inspector_test.cc
+++ b/src/inspector/inspector_test.cc
@@ -701,7 +701,7 @@
 }
 
 TEST_F(InspectorGetEntryPointTest, NoEntryPoints) {
-  mod->AddFunction(MakeEmptyBodyFunction("foo", {}));
+  mod->Functions().Add(MakeEmptyBodyFunction("foo", {}));
 
   auto result = inspector()->GetEntryPoints();
   ASSERT_FALSE(inspector()->has_error()) << inspector()->error();
@@ -714,7 +714,7 @@
       "foo", ast::FunctionDecorationList{
                  create<ast::StageDecoration>(ast::PipelineStage::kVertex),
              });
-  mod->AddFunction(foo);
+  mod->Functions().Add(foo);
 
   // TODO(dsinclair): Update to run the namer transform when available.
 
@@ -732,13 +732,13 @@
       "foo", ast::FunctionDecorationList{
                  create<ast::StageDecoration>(ast::PipelineStage::kVertex),
              });
-  mod->AddFunction(foo);
+  mod->Functions().Add(foo);
 
   auto* bar = MakeEmptyBodyFunction(
       "bar", ast::FunctionDecorationList{
                  create<ast::StageDecoration>(ast::PipelineStage::kCompute),
              });
-  mod->AddFunction(bar);
+  mod->Functions().Add(bar);
 
   // TODO(dsinclair): Update to run the namer transform when available.
 
@@ -756,21 +756,21 @@
 
 TEST_F(InspectorGetEntryPointTest, MixFunctionsAndEntryPoints) {
   auto* func = MakeEmptyBodyFunction("func", {});
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   auto* foo = MakeCallerBodyFunction(
       "foo", "func",
       ast::FunctionDecorationList{
           create<ast::StageDecoration>(ast::PipelineStage::kVertex),
       });
-  mod->AddFunction(foo);
+  mod->Functions().Add(foo);
 
   auto* bar = MakeCallerBodyFunction(
       "bar", "func",
       ast::FunctionDecorationList{
           create<ast::StageDecoration>(ast::PipelineStage::kFragment),
       });
-  mod->AddFunction(bar);
+  mod->Functions().Add(bar);
 
   // TODO(dsinclair): Update to run the namer transform when available.
 
@@ -792,7 +792,7 @@
       ast::FunctionDecorationList{
           create<ast::StageDecoration>(ast::PipelineStage::kVertex),
       });
-  mod->AddFunction(foo);
+  mod->Functions().Add(foo);
 
   auto result = inspector()->GetEntryPoints();
   ASSERT_FALSE(inspector()->has_error()) << inspector()->error();
@@ -811,7 +811,7 @@
                  create<ast::StageDecoration>(ast::PipelineStage::kCompute),
                  create<ast::WorkgroupDecoration>(8u, 2u, 1u),
              });
-  mod->AddFunction(foo);
+  mod->Functions().Add(foo);
 
   auto result = inspector()->GetEntryPoints();
   ASSERT_FALSE(inspector()->has_error()) << inspector()->error();
@@ -826,14 +826,14 @@
 
 TEST_F(InspectorGetEntryPointTest, NoInOutVariables) {
   auto* func = MakeEmptyBodyFunction("func", {});
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   auto* foo = MakeCallerBodyFunction(
       "foo", "func",
       ast::FunctionDecorationList{
           create<ast::StageDecoration>(ast::PipelineStage::kVertex),
       });
-  mod->AddFunction(foo);
+  mod->Functions().Add(foo);
 
   auto result = inspector()->GetEntryPoints();
   ASSERT_FALSE(inspector()->has_error()) << inspector()->error();
@@ -851,7 +851,7 @@
       ast::FunctionDecorationList{
           create<ast::StageDecoration>(ast::PipelineStage::kVertex),
       });
-  mod->AddFunction(foo);
+  mod->Functions().Add(foo);
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
 
@@ -875,14 +875,14 @@
 
   auto* func =
       MakeInOutVariableBodyFunction("func", {{"in_var", "out_var"}}, {});
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   auto* foo = MakeCallerBodyFunction(
       "foo", "func",
       ast::FunctionDecorationList{
           create<ast::StageDecoration>(ast::PipelineStage::kVertex),
       });
-  mod->AddFunction(foo);
+  mod->Functions().Add(foo);
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
 
@@ -906,14 +906,14 @@
 
   auto* func =
       MakeInOutVariableBodyFunction("func", {{"in_var", "out_var"}}, {});
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   auto* foo = MakeInOutVariableCallerBodyFunction(
       "foo", "func", {{"in_var", "out_var"}},
       ast::FunctionDecorationList{
           create<ast::StageDecoration>(ast::PipelineStage::kVertex),
       });
-  mod->AddFunction(foo);
+  mod->Functions().Add(foo);
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
 
@@ -940,7 +940,7 @@
       ast::FunctionDecorationList{
           create<ast::StageDecoration>(ast::PipelineStage::kVertex),
       });
-  mod->AddFunction(foo);
+  mod->Functions().Add(foo);
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
 
@@ -970,14 +970,14 @@
 
   auto* func = MakeInOutVariableBodyFunction(
       "func", {{"in_var", "out_var"}, {"in2_var", "out2_var"}}, {});
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   auto* foo = MakeCallerBodyFunction(
       "foo", "func",
       ast::FunctionDecorationList{
           create<ast::StageDecoration>(ast::PipelineStage::kVertex),
       });
-  mod->AddFunction(foo);
+  mod->Functions().Add(foo);
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
 
@@ -1011,14 +1011,14 @@
       ast::FunctionDecorationList{
           create<ast::StageDecoration>(ast::PipelineStage::kVertex),
       });
-  mod->AddFunction(foo);
+  mod->Functions().Add(foo);
 
   auto* bar = MakeInOutVariableBodyFunction(
       "bar", {{"in2_var", "out_var"}},
       ast::FunctionDecorationList{
           create<ast::StageDecoration>(ast::PipelineStage::kCompute),
       });
-  mod->AddFunction(bar);
+  mod->Functions().Add(bar);
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
 
@@ -1057,21 +1057,21 @@
 
   auto* func =
       MakeInOutVariableBodyFunction("func", {{"in2_var", "out2_var"}}, {});
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   auto* foo = MakeInOutVariableCallerBodyFunction(
       "foo", "func", {{"in_var", "out_var"}},
       ast::FunctionDecorationList{
           create<ast::StageDecoration>(ast::PipelineStage::kVertex),
       });
-  mod->AddFunction(foo);
+  mod->Functions().Add(foo);
 
   auto* bar = MakeCallerBodyFunction(
       "bar", "func",
       ast::FunctionDecorationList{
           create<ast::StageDecoration>(ast::PipelineStage::kCompute),
       });
-  mod->AddFunction(bar);
+  mod->Functions().Add(bar);
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
 
@@ -1125,7 +1125,7 @@
 // TODO(rharrison): Reenable once GetRemappedNameForEntryPoint isn't a pass
 // through
 TEST_F(InspectorGetRemappedNameForEntryPointTest, DISABLED_NoEntryPoints) {
-  mod->AddFunction(MakeEmptyBodyFunction("foo", {}));
+  mod->Functions().Add(MakeEmptyBodyFunction("foo", {}));
 
   auto result = inspector()->GetRemappedNameForEntryPoint("foo");
   ASSERT_TRUE(inspector()->has_error());
@@ -1140,7 +1140,7 @@
       "foo", ast::FunctionDecorationList{
                  create<ast::StageDecoration>(ast::PipelineStage::kVertex),
              });
-  mod->AddFunction(foo);
+  mod->Functions().Add(foo);
 
   // TODO(dsinclair): Update to run the namer transform when available.
 
@@ -1158,7 +1158,7 @@
       "foo", ast::FunctionDecorationList{
                  create<ast::StageDecoration>(ast::PipelineStage::kVertex),
              });
-  mod->AddFunction(foo);
+  mod->Functions().Add(foo);
 
   // TODO(dsinclair): Update to run the namer transform when available.
 
@@ -1166,7 +1166,7 @@
       "bar", ast::FunctionDecorationList{
                  create<ast::StageDecoration>(ast::PipelineStage::kCompute),
              });
-  mod->AddFunction(bar);
+  mod->Functions().Add(bar);
 
   {
     auto result = inspector()->GetRemappedNameForEntryPoint("foo");
@@ -1284,14 +1284,14 @@
 
   auto* ub_func = MakeStructVariableReferenceBodyFunction("ub_func", "foo_ub",
                                                           {{0, ty.i32}});
-  mod->AddFunction(ub_func);
+  mod->Functions().Add(ub_func);
 
   auto* ep_func = MakeCallerBodyFunction(
       "ep_func", "ub_func",
       ast::FunctionDecorationList{
           create<ast::StageDecoration>(ast::PipelineStage::kVertex),
       });
-  mod->AddFunction(ep_func);
+  mod->Functions().Add(ep_func);
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
 
@@ -1312,14 +1312,14 @@
 
   auto* ub_func = MakeStructVariableReferenceBodyFunction("ub_func", "foo_ub",
                                                           {{0, ty.i32}});
-  mod->AddFunction(ub_func);
+  mod->Functions().Add(ub_func);
 
   auto* ep_func = MakeCallerBodyFunction(
       "ep_func", "ub_func",
       ast::FunctionDecorationList{
           create<ast::StageDecoration>(ast::PipelineStage::kVertex),
       });
-  mod->AddFunction(ep_func);
+  mod->Functions().Add(ep_func);
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
 
@@ -1337,14 +1337,14 @@
 
   auto* ub_func = MakeStructVariableReferenceBodyFunction("ub_func", "foo_ub",
                                                           {{0, ty.i32}});
-  mod->AddFunction(ub_func);
+  mod->Functions().Add(ub_func);
 
   auto* ep_func = MakeCallerBodyFunction(
       "ep_func", "ub_func",
       ast::FunctionDecorationList{
           create<ast::StageDecoration>(ast::PipelineStage::kVertex),
       });
-  mod->AddFunction(ep_func);
+  mod->Functions().Add(ep_func);
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
 
@@ -1366,14 +1366,14 @@
 
   auto* ub_func = MakeStructVariableReferenceBodyFunction(
       "ub_func", "foo_ub", {{0, ty.i32}, {1, ty.u32}, {2, ty.f32}});
-  mod->AddFunction(ub_func);
+  mod->Functions().Add(ub_func);
 
   auto* ep_func = MakeCallerBodyFunction(
       "ep_func", "ub_func",
       ast::FunctionDecorationList{
           create<ast::StageDecoration>(ast::PipelineStage::kVertex),
       });
-  mod->AddFunction(ep_func);
+  mod->Functions().Add(ep_func);
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
 
@@ -1399,7 +1399,7 @@
                                  const std::string& var_name) {
     auto* ub_func = MakeStructVariableReferenceBodyFunction(
         func_name, var_name, {{0, ty.i32}, {1, ty.u32}, {2, ty.f32}});
-    mod->AddFunction(ub_func);
+    mod->Functions().Add(ub_func);
   };
   AddReferenceFunc("ub_foo_func", "ub_foo");
   AddReferenceFunc("ub_bar_func", "ub_bar");
@@ -1417,7 +1417,7 @@
            ast::FunctionDecorationList{
                create<ast::StageDecoration>(ast::PipelineStage::kVertex),
            });
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
 
@@ -1447,14 +1447,14 @@
 
   auto* ub_func = MakeStructVariableReferenceBodyFunction("ub_func", "foo_ub",
                                                           {{0, ty.i32}});
-  mod->AddFunction(ub_func);
+  mod->Functions().Add(ub_func);
 
   auto* ep_func = MakeCallerBodyFunction(
       "ep_func", "ub_func",
       ast::FunctionDecorationList{
           create<ast::StageDecoration>(ast::PipelineStage::kVertex),
       });
-  mod->AddFunction(ep_func);
+  mod->Functions().Add(ep_func);
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
 
@@ -1476,14 +1476,14 @@
 
   auto* sb_func = MakeStructVariableReferenceBodyFunction("sb_func", "foo_sb",
                                                           {{0, ty.i32}});
-  mod->AddFunction(sb_func);
+  mod->Functions().Add(sb_func);
 
   auto* ep_func = MakeCallerBodyFunction(
       "ep_func", "sb_func",
       ast::FunctionDecorationList{
           create<ast::StageDecoration>(ast::PipelineStage::kVertex),
       });
-  mod->AddFunction(ep_func);
+  mod->Functions().Add(ep_func);
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
 
@@ -1505,14 +1505,14 @@
 
   auto* sb_func = MakeStructVariableReferenceBodyFunction(
       "sb_func", "foo_sb", {{0, ty.i32}, {1, ty.u32}, {2, ty.f32}});
-  mod->AddFunction(sb_func);
+  mod->Functions().Add(sb_func);
 
   auto* ep_func = MakeCallerBodyFunction(
       "ep_func", "sb_func",
       ast::FunctionDecorationList{
           create<ast::StageDecoration>(ast::PipelineStage::kVertex),
       });
-  mod->AddFunction(ep_func);
+  mod->Functions().Add(ep_func);
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
 
@@ -1538,7 +1538,7 @@
                                  const std::string& var_name) {
     auto* sb_func = MakeStructVariableReferenceBodyFunction(
         func_name, var_name, {{0, ty.i32}, {1, ty.u32}, {2, ty.f32}});
-    mod->AddFunction(sb_func);
+    mod->Functions().Add(sb_func);
   };
   AddReferenceFunc("sb_foo_func", "sb_foo");
   AddReferenceFunc("sb_bar_func", "sb_bar");
@@ -1559,7 +1559,7 @@
            ast::FunctionDecorationList{
                create<ast::StageDecoration>(ast::PipelineStage::kVertex),
            });
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
 
@@ -1589,14 +1589,14 @@
 
   auto* sb_func = MakeStructVariableReferenceBodyFunction("sb_func", "foo_sb",
                                                           {{0, ty.i32}});
-  mod->AddFunction(sb_func);
+  mod->Functions().Add(sb_func);
 
   auto* ep_func = MakeCallerBodyFunction(
       "ep_func", "sb_func",
       ast::FunctionDecorationList{
           create<ast::StageDecoration>(ast::PipelineStage::kVertex),
       });
-  mod->AddFunction(ep_func);
+  mod->Functions().Add(ep_func);
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
 
@@ -1618,14 +1618,14 @@
 
   auto* sb_func = MakeStructVariableReferenceBodyFunction("sb_func", "foo_sb",
                                                           {{0, ty.i32}});
-  mod->AddFunction(sb_func);
+  mod->Functions().Add(sb_func);
 
   auto* ep_func = MakeCallerBodyFunction(
       "ep_func", "sb_func",
       ast::FunctionDecorationList{
           create<ast::StageDecoration>(ast::PipelineStage::kVertex),
       });
-  mod->AddFunction(ep_func);
+  mod->Functions().Add(ep_func);
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
 
@@ -1647,14 +1647,14 @@
 
   auto* sb_func = MakeStructVariableReferenceBodyFunction("sb_func", "foo_sb",
                                                           {{0, ty.i32}});
-  mod->AddFunction(sb_func);
+  mod->Functions().Add(sb_func);
 
   auto* ep_func = MakeCallerBodyFunction(
       "ep_func", "sb_func",
       ast::FunctionDecorationList{
           create<ast::StageDecoration>(ast::PipelineStage::kVertex),
       });
-  mod->AddFunction(ep_func);
+  mod->Functions().Add(ep_func);
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
 
@@ -1672,14 +1672,14 @@
 
   auto* sb_func = MakeStructVariableReferenceBodyFunction("sb_func", "foo_sb",
                                                           {{0, ty.i32}});
-  mod->AddFunction(sb_func);
+  mod->Functions().Add(sb_func);
 
   auto* ep_func = MakeCallerBodyFunction(
       "ep_func", "sb_func",
       ast::FunctionDecorationList{
           create<ast::StageDecoration>(ast::PipelineStage::kVertex),
       });
-  mod->AddFunction(ep_func);
+  mod->Functions().Add(ep_func);
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
 
@@ -1707,7 +1707,7 @@
                                  const std::string& var_name) {
     auto* sb_func = MakeStructVariableReferenceBodyFunction(
         func_name, var_name, {{0, ty.i32}, {1, ty.u32}, {2, ty.f32}});
-    mod->AddFunction(sb_func);
+    mod->Functions().Add(sb_func);
   };
   AddReferenceFunc("sb_foo_func", "sb_foo");
   AddReferenceFunc("sb_bar_func", "sb_bar");
@@ -1728,7 +1728,7 @@
            ast::FunctionDecorationList{
                create<ast::StageDecoration>(ast::PipelineStage::kVertex),
            });
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
 
@@ -1759,14 +1759,14 @@
 
   auto* sb_func = MakeStructVariableReferenceBodyFunction("sb_func", "foo_sb",
                                                           {{0, ty.i32}});
-  mod->AddFunction(sb_func);
+  mod->Functions().Add(sb_func);
 
   auto* ep_func = MakeCallerBodyFunction(
       "ep_func", "sb_func",
       ast::FunctionDecorationList{
           create<ast::StageDecoration>(ast::PipelineStage::kVertex),
       });
-  mod->AddFunction(ep_func);
+  mod->Functions().Add(ep_func);
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
 
@@ -1790,14 +1790,14 @@
 
   auto* sb_func = MakeStructVariableReferenceBodyFunction("sb_func", "foo_sb",
                                                           {{0, ty.i32}});
-  mod->AddFunction(sb_func);
+  mod->Functions().Add(sb_func);
 
   auto* ep_func = MakeCallerBodyFunction(
       "ep_func", "sb_func",
       ast::FunctionDecorationList{
           create<ast::StageDecoration>(ast::PipelineStage::kVertex),
       });
-  mod->AddFunction(ep_func);
+  mod->Functions().Add(ep_func);
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
 
@@ -1820,14 +1820,14 @@
 
   auto* sb_func = MakeStructVariableReferenceBodyFunction("sb_func", "foo_sb",
                                                           {{0, ty.i32}});
-  mod->AddFunction(sb_func);
+  mod->Functions().Add(sb_func);
 
   auto* ep_func = MakeCallerBodyFunction(
       "ep_func", "sb_func",
       ast::FunctionDecorationList{
           create<ast::StageDecoration>(ast::PipelineStage::kVertex),
       });
-  mod->AddFunction(ep_func);
+  mod->Functions().Add(ep_func);
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
 
@@ -1849,7 +1849,7 @@
       ast::FunctionDecorationList{
           create<ast::StageDecoration>(ast::PipelineStage::kVertex),
       });
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
 
@@ -1866,7 +1866,7 @@
       "ep_func", ast::FunctionDecorationList{
                      create<ast::StageDecoration>(ast::PipelineStage::kVertex),
                  });
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
 
@@ -1885,14 +1885,14 @@
 
   auto* foo_func = MakeSamplerReferenceBodyFunction(
       "foo_func", "foo_texture", "foo_sampler", "foo_coords", ty.f32, {});
-  mod->AddFunction(foo_func);
+  mod->Functions().Add(foo_func);
 
   auto* ep_func = MakeCallerBodyFunction(
       "ep_func", "foo_func",
       ast::FunctionDecorationList{
           create<ast::StageDecoration>(ast::PipelineStage::kVertex),
       });
-  mod->AddFunction(ep_func);
+  mod->Functions().Add(ep_func);
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
 
@@ -1916,7 +1916,7 @@
       ast::FunctionDecorationList{
           create<ast::StageDecoration>(ast::PipelineStage::kVertex),
       });
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
 
@@ -1936,7 +1936,7 @@
       ast::FunctionDecorationList{
           create<ast::StageDecoration>(ast::PipelineStage::kVertex),
       });
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
 
@@ -1958,7 +1958,7 @@
       ast::FunctionDecorationList{
           create<ast::StageDecoration>(ast::PipelineStage::kVertex),
       });
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
 
@@ -1975,7 +1975,7 @@
       "ep_func", ast::FunctionDecorationList{
                      create<ast::StageDecoration>(ast::PipelineStage::kVertex),
                  });
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
 
@@ -1995,14 +1995,14 @@
   auto* foo_func = MakeComparisonSamplerReferenceBodyFunction(
       "foo_func", "foo_texture", "foo_sampler", "foo_coords", "foo_depth",
       ty.f32, {});
-  mod->AddFunction(foo_func);
+  mod->Functions().Add(foo_func);
 
   auto* ep_func = MakeCallerBodyFunction(
       "ep_func", "foo_func",
       ast::FunctionDecorationList{
           create<ast::StageDecoration>(ast::PipelineStage::kVertex),
       });
-  mod->AddFunction(ep_func);
+  mod->Functions().Add(ep_func);
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
 
@@ -2026,7 +2026,7 @@
       ast::FunctionDecorationList{
           create<ast::StageDecoration>(ast::PipelineStage::kVertex),
       });
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
 
@@ -2046,7 +2046,7 @@
       ast::FunctionDecorationList{
           create<ast::StageDecoration>(ast::PipelineStage::kVertex),
       });
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
 
@@ -2061,7 +2061,7 @@
       "foo", ast::FunctionDecorationList{
                  create<ast::StageDecoration>(ast::PipelineStage::kVertex),
              });
-  mod->AddFunction(foo);
+  mod->Functions().Add(foo);
 
   auto result = inspector()->GetSampledTextureResourceBindings("foo");
   ASSERT_FALSE(inspector()->has_error()) << inspector()->error();
@@ -2084,7 +2084,7 @@
       ast::FunctionDecorationList{
           create<ast::StageDecoration>(ast::PipelineStage::kVertex),
       });
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
 
@@ -2175,7 +2175,7 @@
       ast::FunctionDecorationList{
           create<ast::StageDecoration>(ast::PipelineStage::kVertex),
       });
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
 
@@ -2246,7 +2246,7 @@
       ast::FunctionDecorationList{
           create<ast::StageDecoration>(ast::PipelineStage::kVertex),
       });
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
 
@@ -2301,7 +2301,7 @@
       "foo", ast::FunctionDecorationList{
                  create<ast::StageDecoration>(ast::PipelineStage::kVertex),
              });
-  mod->AddFunction(foo);
+  mod->Functions().Add(foo);
 
   auto result = inspector()->GetSampledTextureResourceBindings("foo");
   ASSERT_FALSE(inspector()->has_error()) << inspector()->error();
@@ -2326,7 +2326,7 @@
       ast::FunctionDecorationList{
           create<ast::StageDecoration>(ast::PipelineStage::kVertex),
       });
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   ASSERT_TRUE(td()->Determine()) << td()->error();
 
diff --git a/src/reader/spirv/function.cc b/src/reader/spirv/function.cc
index 00d7545..30daec5 100644
--- a/src/reader/spirv/function.cc
+++ b/src/reader/spirv/function.cc
@@ -859,7 +859,7 @@
 
   auto& statements = statements_stack_[0].GetStatements();
   auto* body = create<ast::BlockStatement>(Source{}, statements);
-  ast_module_.AddFunction(
+  ast_module_.Functions().Add(
       create<ast::Function>(decl.source, ast_module_.RegisterSymbol(decl.name),
                             std::move(decl.params), decl.return_type, body,
                             std::move(decl.decorations)));
diff --git a/src/reader/wgsl/parser_impl.cc b/src/reader/wgsl/parser_impl.cc
index 7816725..9521365 100644
--- a/src/reader/wgsl/parser_impl.cc
+++ b/src/reader/wgsl/parser_impl.cc
@@ -378,7 +378,7 @@
   if (func.errored)
     errored = true;
   if (func.matched) {
-    module_.AddFunction(func.value);
+    module_.Functions().Add(func.value);
     return true;
   }
 
diff --git a/src/reader/wgsl/parser_impl_global_decl_test.cc b/src/reader/wgsl/parser_impl_global_decl_test.cc
index 7fac54c..3875ca0 100644
--- a/src/reader/wgsl/parser_impl_global_decl_test.cc
+++ b/src/reader/wgsl/parser_impl_global_decl_test.cc
@@ -135,8 +135,8 @@
   ASSERT_FALSE(p->has_error()) << p->error();
 
   auto& m = p->get_module();
-  ASSERT_EQ(m.functions().size(), 1u);
-  EXPECT_EQ(m.SymbolToName(m.functions()[0]->symbol()), "main");
+  ASSERT_EQ(m.Functions().size(), 1u);
+  EXPECT_EQ(m.SymbolToName(m.Functions()[0]->symbol()), "main");
 }
 
 TEST_F(ParserImplTest, GlobalDecl_Function_WithDecoration) {
@@ -145,8 +145,8 @@
   ASSERT_FALSE(p->has_error()) << p->error();
 
   auto& m = p->get_module();
-  ASSERT_EQ(m.functions().size(), 1u);
-  EXPECT_EQ(m.SymbolToName(m.functions()[0]->symbol()), "main");
+  ASSERT_EQ(m.Functions().size(), 1u);
+  EXPECT_EQ(m.SymbolToName(m.Functions()[0]->symbol()), "main");
 }
 
 TEST_F(ParserImplTest, GlobalDecl_Function_Invalid) {
diff --git a/src/reader/wgsl/parser_impl_test.cc b/src/reader/wgsl/parser_impl_test.cc
index 1c21208..3065a08 100644
--- a/src/reader/wgsl/parser_impl_test.cc
+++ b/src/reader/wgsl/parser_impl_test.cc
@@ -15,8 +15,8 @@
 #include "src/reader/wgsl/parser_impl.h"
 
 #include "gtest/gtest.h"
-#include "src/type/i32_type.h"
 #include "src/reader/wgsl/parser_impl_test_helper.h"
+#include "src/type/i32_type.h"
 
 namespace tint {
 namespace reader {
@@ -40,7 +40,7 @@
   ASSERT_TRUE(p->Parse()) << p->error();
 
   auto& m = p->get_module();
-  ASSERT_EQ(1u, m.functions().size());
+  ASSERT_EQ(1u, m.Functions().size());
   ASSERT_EQ(1u, m.global_variables().size());
 }
 
diff --git a/src/reader/wgsl/parser_test.cc b/src/reader/wgsl/parser_test.cc
index 1bb967e..c4b2fe7 100644
--- a/src/reader/wgsl/parser_test.cc
+++ b/src/reader/wgsl/parser_test.cc
@@ -42,7 +42,7 @@
   ASSERT_TRUE(p.Parse()) << p.error();
 
   auto m = p.module();
-  ASSERT_EQ(1u, m.functions().size());
+  ASSERT_EQ(1u, m.Functions().size());
   ASSERT_EQ(1u, m.global_variables().size());
 }
 
diff --git a/src/transform/emit_vertex_point_size.cc b/src/transform/emit_vertex_point_size.cc
index dd2acf0..79dd09b 100644
--- a/src/transform/emit_vertex_point_size.cc
+++ b/src/transform/emit_vertex_point_size.cc
@@ -41,7 +41,7 @@
 Transform::Output EmitVertexPointSize::Run(ast::Module* in) {
   Output out;
 
-  if (!in->HasStage(ast::PipelineStage::kVertex)) {
+  if (!in->Functions().HasStage(ast::PipelineStage::kVertex)) {
     // If the module doesn't have any vertex stages, then there's nothing to do.
     out.module = in->Clone();
     return out;
diff --git a/src/transform/vertex_pulling.cc b/src/transform/vertex_pulling.cc
index 104e80a..8a17e7b 100644
--- a/src/transform/vertex_pulling.cc
+++ b/src/transform/vertex_pulling.cc
@@ -85,8 +85,8 @@
   }
 
   // Find entry point
-  auto* func = in->FindFunctionBySymbolAndStage(
-      in->GetSymbol(cfg.entry_point_name), ast::PipelineStage::kVertex);
+  auto* func = in->Functions().Find(in->GetSymbol(cfg.entry_point_name),
+                                    ast::PipelineStage::kVertex);
   if (func == nullptr) {
     diag::Diagnostic err;
     err.severity = diag::Severity::Error;
diff --git a/src/type_determiner.cc b/src/type_determiner.cc
index cf30907..67875b5 100644
--- a/src/type_determiner.cc
+++ b/src/type_determiner.cc
@@ -115,13 +115,13 @@
     }
   }
 
-  if (!DetermineFunctions(mod_->functions())) {
+  if (!DetermineFunctions(mod_->Functions())) {
     return false;
   }
 
   // Walk over the caller to callee information and update functions with which
   // entry points call those functions.
-  for (auto* func : mod_->functions()) {
+  for (auto* func : mod_->Functions()) {
     if (!func->IsEntryPoint()) {
       continue;
     }
@@ -393,7 +393,7 @@
         caller_to_callee_[current_function_->symbol()].push_back(
             ident->symbol());
 
-        auto* callee_func = mod_->FindFunctionBySymbol(ident->symbol());
+        auto* callee_func = mod_->Functions().Find(ident->symbol());
         if (callee_func == nullptr) {
           set_error(expr->source(), "unable to find called function: " +
                                         mod_->SymbolToName(ident->symbol()));
diff --git a/src/type_determiner_test.cc b/src/type_determiner_test.cc
index 4637ce7..5138838 100644
--- a/src/type_determiner_test.cc
+++ b/src/type_determiner_test.cc
@@ -292,7 +292,7 @@
   ast::VariableList params;
   auto* func = Func("my_func", params, ty.f32, ast::StatementList{},
                     ast::FunctionDecorationList{});
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   // Register the function
   EXPECT_TRUE(td()->Determine());
@@ -319,14 +319,14 @@
                              create<ast::ReturnStatement>(),
                          },
                          ast::FunctionDecorationList{});
-  mod->AddFunction(func_main);
+  mod->Functions().Add(func_main);
 
   auto* func = Func("func", params0, ty.f32,
                     ast::StatementList{
                         create<ast::ReturnStatement>(),
                     },
                     ast::FunctionDecorationList{});
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   EXPECT_FALSE(td()->Determine()) << td()->error();
   EXPECT_EQ(td()->error(),
@@ -471,7 +471,7 @@
   ast::VariableList params;
   auto* func = Func("my_func", params, ty.f32, ast::StatementList{},
                     ast::FunctionDecorationList{});
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   // Register the function
   EXPECT_TRUE(td()->Determine());
@@ -486,7 +486,7 @@
   ast::VariableList params;
   auto* func = Func("my_func", params, ty.f32, ast::StatementList{},
                     ast::FunctionDecorationList{});
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   // Register the function
   EXPECT_TRUE(td()->Determine());
@@ -624,7 +624,7 @@
 TEST_F(TypeDeterminerTest, Expr_Identifier_Function) {
   auto* func = Func("my_func", ast::VariableList{}, ty.f32,
                     ast::StatementList{}, ast::FunctionDecorationList{});
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   // Register the function
   EXPECT_TRUE(td()->Determine());
@@ -663,7 +663,7 @@
       },
       ast::FunctionDecorationList{});
 
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   // Register the function
   EXPECT_TRUE(td()->Determine());
@@ -700,7 +700,7 @@
       },
       ast::FunctionDecorationList{});
 
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   auto* func2 = Func(
       "func", ast::VariableList{}, ty.f32,
@@ -709,7 +709,7 @@
       },
       ast::FunctionDecorationList{});
 
-  mod->AddFunction(func2);
+  mod->Functions().Add(func2);
 
   // Register the function
   EXPECT_TRUE(td()->Determine());
@@ -734,7 +734,7 @@
            },
            ast::FunctionDecorationList{});
 
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   auto* v = Var("var", ast::StorageClass::kFunction, ty.f32);
   td()->RegisterVariableForTesting(v);
@@ -1587,7 +1587,7 @@
   auto* func = Func("func", ast::VariableList{}, ty.i32,
                     ast::StatementList{stmt}, ast::FunctionDecorationList{});
 
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   EXPECT_TRUE(td()->Determine()) << td()->error();
   EXPECT_EQ(var->storage_class(), ast::StorageClass::kFunction);
@@ -1599,7 +1599,7 @@
   auto* func = Func("func", ast::VariableList{}, ty.i32,
                     ast::StatementList{stmt}, ast::FunctionDecorationList{});
 
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   EXPECT_TRUE(td()->Determine()) << td()->error();
   EXPECT_EQ(var->storage_class(), ast::StorageClass::kNone);
@@ -1612,7 +1612,7 @@
   auto* func = Func("func", ast::VariableList{}, ty.i32,
                     ast::StatementList{stmt}, ast::FunctionDecorationList{});
 
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   EXPECT_FALSE(td()->Determine());
   EXPECT_EQ(td()->error(),
@@ -2758,11 +2758,11 @@
                create<ast::StageDecoration>(ast::PipelineStage::kVertex),
            });
 
-  mod->AddFunction(func_b);
-  mod->AddFunction(func_c);
-  mod->AddFunction(func_a);
-  mod->AddFunction(ep_1);
-  mod->AddFunction(ep_2);
+  mod->Functions().Add(func_b);
+  mod->Functions().Add(func_c);
+  mod->Functions().Add(func_a);
+  mod->Functions().Add(ep_1);
+  mod->Functions().Add(ep_2);
 
   mod->AddGlobalVariable(Var("first", ast::StorageClass::kPrivate, ty.f32));
   mod->AddGlobalVariable(Var("second", ast::StorageClass::kPrivate, ty.f32));
diff --git a/src/validator/validator_function_test.cc b/src/validator/validator_function_test.cc
index 1ca339f..73c3ce2 100644
--- a/src/validator/validator_function_test.cc
+++ b/src/validator/validator_function_test.cc
@@ -49,7 +49,7 @@
       ast::FunctionDecorationList{
           create<ast::StageDecoration>(ast::PipelineStage::kVertex),
       });
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   EXPECT_TRUE(td()->Determine()) << td()->error();
 
@@ -68,7 +68,7 @@
            ast::FunctionDecorationList{
                create<ast::StageDecoration>(ast::PipelineStage::kVertex),
            });
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   EXPECT_TRUE(td()->Determine()) << td()->error();
 
@@ -89,7 +89,7 @@
                         create<ast::VariableDeclStatement>(var),
                     },
                     ast::FunctionDecorationList{});
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   EXPECT_TRUE(td()->Determine()) << td()->error();
 
@@ -105,7 +105,7 @@
   auto* func =
       Func(Source{Source::Location{12, 34}}, "func", ast::VariableList{},
            ty.i32, ast::StatementList{}, ast::FunctionDecorationList{});
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   EXPECT_TRUE(td()->Determine()) << td()->error();
 
@@ -127,13 +127,13 @@
            ast::FunctionDecorationList{
                create<ast::StageDecoration>(ast::PipelineStage::kVertex),
            });
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
-  EXPECT_TRUE(td()->DetermineFunctions(mod->functions())) << td()->error();
+  EXPECT_TRUE(td()->DetermineFunctions(mod->Functions())) << td()->error();
 
   ValidatorImpl& v = Build();
 
-  EXPECT_TRUE(v.ValidateFunctions(mod->functions())) << v.error();
+  EXPECT_TRUE(v.ValidateFunctions(mod->Functions())) << v.error();
 }
 
 TEST_F(ValidateFunctionTest, FunctionTypeMustMatchReturnStatementType_fail) {
@@ -144,7 +144,7 @@
                             Source{Source::Location{12, 34}}, Expr(2)),
                     },
                     ast::FunctionDecorationList{});
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   EXPECT_TRUE(td()->Determine()) << td()->error();
 
@@ -165,7 +165,7 @@
                             Source{Source::Location{12, 34}}, Expr(2)),
                     },
                     ast::FunctionDecorationList{});
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   EXPECT_TRUE(td()->Determine()) << td()->error();
 
@@ -194,8 +194,8 @@
                          },
                          ast::FunctionDecorationList{});
 
-  mod->AddFunction(func);
-  mod->AddFunction(func_copy);
+  mod->Functions().Add(func);
+  mod->Functions().Add(func_copy);
 
   EXPECT_TRUE(td()->Determine()) << td()->error();
 
@@ -217,7 +217,7 @@
                          create<ast::ReturnStatement>(),
                      },
                      ast::FunctionDecorationList{});
-  mod->AddFunction(func0);
+  mod->Functions().Add(func0);
 
   EXPECT_TRUE(td()->Determine()) << td()->error();
 
@@ -241,7 +241,7 @@
                          create<ast::ReturnStatement>(Expr(2)),
                      },
                      ast::FunctionDecorationList{});
-  mod->AddFunction(func0);
+  mod->Functions().Add(func0);
 
   EXPECT_TRUE(td()->Determine()) << td()->error();
 
@@ -263,7 +263,7 @@
           create<ast::StageDecoration>(ast::PipelineStage::kVertex),
       });
 
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
   EXPECT_TRUE(td()->Determine()) << td()->error();
 
   ValidatorImpl& v = Build();
@@ -288,7 +288,7 @@
                create<ast::StageDecoration>(ast::PipelineStage::kVertex),
            });
 
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
   EXPECT_TRUE(td()->Determine()) << td()->error();
 
   ValidatorImpl& v = Build();
@@ -313,7 +313,7 @@
           create<ast::StageDecoration>(ast::PipelineStage::kFragment),
       });
 
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
   EXPECT_TRUE(td()->Determine()) << td()->error();
 
   ValidatorImpl& v = Build();
@@ -335,7 +335,7 @@
            ast::FunctionDecorationList{
                create<ast::StageDecoration>(ast::PipelineStage::kVertex),
            });
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   EXPECT_TRUE(td()->Determine()) << td()->error();
 
@@ -351,7 +351,7 @@
                         create<ast::ReturnStatement>(),
                     },
                     ast::FunctionDecorationList{});
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   EXPECT_TRUE(td()->Determine()) << td()->error();
 
diff --git a/src/validator/validator_impl.cc b/src/validator/validator_impl.cc
index c673040..46831e9 100644
--- a/src/validator/validator_impl.cc
+++ b/src/validator/validator_impl.cc
@@ -71,10 +71,10 @@
   if (!ValidateConstructedTypes(module_.constructed_types())) {
     return false;
   }
-  if (!ValidateFunctions(module_.functions())) {
+  if (!ValidateFunctions(module_.Functions())) {
     return false;
   }
-  if (!ValidateEntryPoint(module_.functions())) {
+  if (!ValidateEntryPoint(module_.Functions())) {
     return false;
   }
   function_stack_.pop_scope();
diff --git a/src/validator/validator_test.cc b/src/validator/validator_test.cc
index a4a03d1..9ab31eb 100644
--- a/src/validator/validator_test.cc
+++ b/src/validator/validator_test.cc
@@ -392,7 +392,7 @@
                             Source{Source::Location{12, 34}}, lhs, rhs),
                     },
                     ast::FunctionDecorationList{});
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   ValidatorImpl& v = Build();
 
@@ -420,7 +420,7 @@
       ast::FunctionDecorationList{
           create<ast::StageDecoration>(ast::PipelineStage::kVertex),
       });
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   EXPECT_TRUE(td()->Determine()) << td()->error();
 
@@ -578,7 +578,7 @@
                     },
                     ast::FunctionDecorationList{});
 
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   EXPECT_TRUE(td()->Determine()) << td()->error();
   EXPECT_TRUE(td()->DetermineFunction(func)) << td()->error();
@@ -608,7 +608,7 @@
                     },
                     ast::FunctionDecorationList{});
 
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   EXPECT_TRUE(td()->Determine()) << td()->error();
   EXPECT_TRUE(td()->DetermineFunction(func)) << td()->error();
@@ -707,8 +707,8 @@
                create<ast::StageDecoration>(ast::PipelineStage::kVertex),
            });
 
-  mod->AddFunction(func0);
-  mod->AddFunction(func1);
+  mod->Functions().Add(func0);
+  mod->Functions().Add(func1);
 
   EXPECT_TRUE(td()->Determine()) << td()->error();
 
diff --git a/src/validator/validator_type_test.cc b/src/validator/validator_type_test.cc
index b43078c..30dcad6 100644
--- a/src/validator/validator_type_test.cc
+++ b/src/validator/validator_type_test.cc
@@ -172,7 +172,7 @@
            ast::FunctionDecorationList{
                create<ast::StageDecoration>(ast::PipelineStage::kVertex),
            });
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   EXPECT_TRUE(td()->Determine()) << td()->error();
 
@@ -197,7 +197,7 @@
                         create<ast::ReturnStatement>(),
                     },
                     ast::FunctionDecorationList{});
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   auto* main =
       Func("main", ast::VariableList{}, ty.void_,
@@ -207,7 +207,7 @@
            ast::FunctionDecorationList{
                create<ast::StageDecoration>(ast::PipelineStage::kVertex),
            });
-  mod->AddFunction(main);
+  mod->Functions().Add(main);
 
   EXPECT_TRUE(td()->Determine()) << td()->error();
 
diff --git a/src/writer/hlsl/generator_impl.cc b/src/writer/hlsl/generator_impl.cc
index c30a220..93ab2e6 100644
--- a/src/writer/hlsl/generator_impl.cc
+++ b/src/writer/hlsl/generator_impl.cc
@@ -160,7 +160,7 @@
 
   std::unordered_set<Symbol> emitted_globals;
   // Make sure all entry point data is emitted before the entry point functions
-  for (auto* func : module_->functions()) {
+  for (auto* func : module_->Functions()) {
     if (!func->IsEntryPoint()) {
       continue;
     }
@@ -170,13 +170,13 @@
     }
   }
 
-  for (auto* func : module_->functions()) {
+  for (auto* func : module_->Functions()) {
     if (!EmitFunction(out, func)) {
       return false;
     }
   }
 
-  for (auto* func : module_->functions()) {
+  for (auto* func : module_->Functions()) {
     if (!func->IsEntryPoint()) {
       continue;
     }
@@ -631,7 +631,7 @@
     name = it->second;
   }
 
-  auto* func = module_->FindFunctionBySymbol(ident->symbol());
+  auto* func = module_->Functions().Find(ident->symbol());
   if (func == nullptr) {
     error_ =
         "Unable to find function: " + module_->SymbolToName(ident->symbol());
diff --git a/src/writer/hlsl/generator_impl_binary_test.cc b/src/writer/hlsl/generator_impl_binary_test.cc
index 1786684..704cb5a 100644
--- a/src/writer/hlsl/generator_impl_binary_test.cc
+++ b/src/writer/hlsl/generator_impl_binary_test.cc
@@ -507,7 +507,7 @@
 
   auto* func = Func("foo", ast::VariableList{}, ty.void_, ast::StatementList{},
                     ast::FunctionDecorationList{});
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   ast::ExpressionList params;
   params.push_back(create<ast::BinaryExpression>(ast::BinaryOp::kLogicalAnd,
diff --git a/src/writer/hlsl/generator_impl_call_test.cc b/src/writer/hlsl/generator_impl_call_test.cc
index 23b2176..5b3a25c 100644
--- a/src/writer/hlsl/generator_impl_call_test.cc
+++ b/src/writer/hlsl/generator_impl_call_test.cc
@@ -34,7 +34,7 @@
 
   auto* func = Func("my_func", ast::VariableList{}, ty.void_,
                     ast::StatementList{}, ast::FunctionDecorationList{});
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   GeneratorImpl& gen = Build();
 
@@ -47,7 +47,7 @@
 
   auto* func = Func("my_func", ast::VariableList{}, ty.void_,
                     ast::StatementList{}, ast::FunctionDecorationList{});
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   GeneratorImpl& gen = Build();
 
@@ -60,7 +60,7 @@
 
   auto* func = Func("my_func", ast::VariableList{}, ty.void_,
                     ast::StatementList{}, ast::FunctionDecorationList{});
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   GeneratorImpl& gen = Build();
 
diff --git a/src/writer/hlsl/generator_impl_function_entry_point_data_test.cc b/src/writer/hlsl/generator_impl_function_entry_point_data_test.cc
index 3f4e9ee..e29725fe 100644
--- a/src/writer/hlsl/generator_impl_function_entry_point_data_test.cc
+++ b/src/writer/hlsl/generator_impl_function_entry_point_data_test.cc
@@ -70,7 +70,7 @@
                create<ast::StageDecoration>(ast::PipelineStage::kVertex),
            });
 
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   std::unordered_set<Symbol> globals;
 
@@ -123,7 +123,7 @@
                create<ast::StageDecoration>(ast::PipelineStage::kVertex),
            });
 
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   std::unordered_set<Symbol> globals;
 
@@ -176,7 +176,7 @@
                create<ast::StageDecoration>(ast::PipelineStage::kVertex),
            });
 
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   std::unordered_set<Symbol> globals;
 
@@ -229,7 +229,7 @@
                create<ast::StageDecoration>(ast::PipelineStage::kFragment),
            });
 
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   std::unordered_set<Symbol> globals;
 
@@ -279,7 +279,7 @@
                create<ast::StageDecoration>(ast::PipelineStage::kCompute),
            });
 
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   std::unordered_set<Symbol> globals;
 
@@ -324,7 +324,7 @@
                create<ast::StageDecoration>(ast::PipelineStage::kCompute),
            });
 
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   std::unordered_set<Symbol> globals;
 
@@ -377,7 +377,7 @@
                create<ast::StageDecoration>(ast::PipelineStage::kFragment),
            });
 
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   std::unordered_set<Symbol> globals;
 
diff --git a/src/writer/hlsl/generator_impl_function_test.cc b/src/writer/hlsl/generator_impl_function_test.cc
index e5a8570..d799d0f 100644
--- a/src/writer/hlsl/generator_impl_function_test.cc
+++ b/src/writer/hlsl/generator_impl_function_test.cc
@@ -59,7 +59,7 @@
                     },
                     ast::FunctionDecorationList{});
 
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   GeneratorImpl& gen = Build();
 
@@ -80,7 +80,7 @@
                     },
                     ast::FunctionDecorationList{});
 
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   GeneratorImpl& gen = Build();
 
@@ -105,7 +105,7 @@
            },
            ast::FunctionDecorationList{});
 
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   GeneratorImpl& gen = Build();
 
@@ -128,7 +128,7 @@
                create<ast::StageDecoration>(ast::PipelineStage::kFragment),
            });
 
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   ASSERT_TRUE(td.Determine()) << td.error();
 
@@ -169,7 +169,7 @@
                create<ast::StageDecoration>(ast::PipelineStage::kFragment),
            });
 
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   ASSERT_TRUE(td.Determine()) << td.error();
 
@@ -221,7 +221,7 @@
                create<ast::StageDecoration>(ast::PipelineStage::kFragment),
            });
 
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   ASSERT_TRUE(td.Determine()) << td.error();
 
@@ -276,7 +276,7 @@
                create<ast::StageDecoration>(ast::PipelineStage::kFragment),
            });
 
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   ASSERT_TRUE(td.Determine()) << td.error();
 
@@ -325,7 +325,7 @@
                create<ast::StageDecoration>(ast::PipelineStage::kFragment),
            });
 
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   ASSERT_TRUE(td.Determine()) << td.error();
 
@@ -378,7 +378,7 @@
                create<ast::StageDecoration>(ast::PipelineStage::kFragment),
            });
 
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   ASSERT_TRUE(td.Determine()) << td.error();
 
@@ -431,7 +431,7 @@
                create<ast::StageDecoration>(ast::PipelineStage::kFragment),
            });
 
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   ASSERT_TRUE(td.Determine()) << td.error();
 
@@ -481,7 +481,7 @@
                create<ast::StageDecoration>(ast::PipelineStage::kFragment),
            });
 
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   ASSERT_TRUE(td.Determine()) << td.error();
 
@@ -528,7 +528,7 @@
                create<ast::StageDecoration>(ast::PipelineStage::kFragment),
            });
 
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   ASSERT_TRUE(td.Determine()) << td.error();
 
@@ -582,7 +582,7 @@
       },
       ast::FunctionDecorationList{});
 
-  mod->AddFunction(sub_func);
+  mod->Functions().Add(sub_func);
 
   auto* func_1 = Func(
       "ep_1", ast::VariableList{}, ty.void_,
@@ -594,7 +594,7 @@
           create<ast::StageDecoration>(ast::PipelineStage::kFragment),
       });
 
-  mod->AddFunction(func_1);
+  mod->Functions().Add(func_1);
 
   ASSERT_TRUE(td.Determine()) << td.error();
 
@@ -646,7 +646,7 @@
       },
       ast::FunctionDecorationList{});
 
-  mod->AddFunction(sub_func);
+  mod->Functions().Add(sub_func);
 
   auto* func_1 =
       Func("ep_1", ast::VariableList{}, ty.void_,
@@ -659,7 +659,7 @@
                create<ast::StageDecoration>(ast::PipelineStage::kFragment),
            });
 
-  mod->AddFunction(func_1);
+  mod->Functions().Add(func_1);
 
   ASSERT_TRUE(td.Determine()) << td.error();
 
@@ -715,7 +715,7 @@
       },
       ast::FunctionDecorationList{});
 
-  mod->AddFunction(sub_func);
+  mod->Functions().Add(sub_func);
 
   auto* func_1 =
       Func("ep_1", ast::VariableList{}, ty.void_,
@@ -728,7 +728,7 @@
                create<ast::StageDecoration>(ast::PipelineStage::kFragment),
            });
 
-  mod->AddFunction(func_1);
+  mod->Functions().Add(func_1);
 
   ASSERT_TRUE(td.Determine()) << td.error();
 
@@ -779,7 +779,7 @@
       },
       ast::FunctionDecorationList{});
 
-  mod->AddFunction(sub_func);
+  mod->Functions().Add(sub_func);
 
   auto* var = Var("v", ast::StorageClass::kFunction, ty.f32,
                   Call("sub_func", 1.0f), ast::VariableDecorationList{});
@@ -794,7 +794,7 @@
                create<ast::StageDecoration>(ast::PipelineStage::kFragment),
            });
 
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   ASSERT_TRUE(td.Determine()) << td.error();
 
@@ -839,7 +839,7 @@
       },
       ast::FunctionDecorationList{});
 
-  mod->AddFunction(sub_func);
+  mod->Functions().Add(sub_func);
 
   auto* var = Var("v", ast::StorageClass::kFunction, ty.f32,
                   Call("sub_func", 1.0f), ast::VariableDecorationList{});
@@ -854,7 +854,7 @@
                create<ast::StageDecoration>(ast::PipelineStage::kFragment),
            });
 
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   ASSERT_TRUE(td.Determine()) << td.error();
 
@@ -902,7 +902,7 @@
           create<ast::StageDecoration>(ast::PipelineStage::kFragment),
       });
 
-  mod->AddFunction(func_1);
+  mod->Functions().Add(func_1);
 
   ASSERT_TRUE(td.Determine()) << td.error();
 
@@ -933,7 +933,7 @@
           create<ast::StageDecoration>(ast::PipelineStage::kFragment),
       });
 
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   GeneratorImpl& gen = Build();
 
@@ -956,7 +956,7 @@
                create<ast::StageDecoration>(ast::PipelineStage::kCompute),
            });
 
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   ASSERT_TRUE(td.Determine()) << td.error();
 
@@ -983,7 +983,7 @@
                create<ast::WorkgroupDecoration>(2u, 4u, 6u),
            });
 
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   ASSERT_TRUE(td.Determine()) << td.error();
 
@@ -1008,7 +1008,7 @@
       },
       ast::FunctionDecorationList{});
 
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   GeneratorImpl& gen = Build();
 
@@ -1071,7 +1071,7 @@
                  create<ast::StageDecoration>(ast::PipelineStage::kCompute),
              });
 
-    mod->AddFunction(func);
+    mod->Functions().Add(func);
   }
 
   {
@@ -1088,7 +1088,7 @@
                  create<ast::StageDecoration>(ast::PipelineStage::kCompute),
              });
 
-    mod->AddFunction(func);
+    mod->Functions().Add(func);
   }
 
   ASSERT_TRUE(td.Determine()) << td.error();
diff --git a/src/writer/hlsl/generator_impl_test.cc b/src/writer/hlsl/generator_impl_test.cc
index a4f4ffc..a42c4b9 100644
--- a/src/writer/hlsl/generator_impl_test.cc
+++ b/src/writer/hlsl/generator_impl_test.cc
@@ -30,7 +30,7 @@
 TEST_F(HlslGeneratorImplTest, Generate) {
   auto* func = Func("my_func", ast::VariableList{}, ty.void_,
                     ast::StatementList{}, ast::FunctionDecorationList{});
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   GeneratorImpl& gen = Build();
 
diff --git a/src/writer/msl/generator_impl.cc b/src/writer/msl/generator_impl.cc
index 254ca89..b0be9aa 100644
--- a/src/writer/msl/generator_impl.cc
+++ b/src/writer/msl/generator_impl.cc
@@ -138,7 +138,7 @@
   }
 
   // Make sure all entry point data is emitted before the entry point functions
-  for (auto* func : module_->functions()) {
+  for (auto* func : module_->Functions()) {
     if (!func->IsEntryPoint()) {
       continue;
     }
@@ -148,13 +148,13 @@
     }
   }
 
-  for (auto* func : module_->functions()) {
+  for (auto* func : module_->Functions()) {
     if (!EmitFunction(func)) {
       return false;
     }
   }
 
-  for (auto* func : module_->functions()) {
+  for (auto* func : module_->Functions()) {
     if (!func->IsEntryPoint()) {
       continue;
     }
@@ -525,7 +525,7 @@
     name = it->second;
   }
 
-  auto* func = module_->FindFunctionBySymbol(ident->symbol());
+  auto* func = module_->Functions().Find(ident->symbol());
   if (func == nullptr) {
     error_ =
         "Unable to find function: " + module_->SymbolToName(ident->symbol());
diff --git a/src/writer/msl/generator_impl_call_test.cc b/src/writer/msl/generator_impl_call_test.cc
index 44159f8..679bfb0 100644
--- a/src/writer/msl/generator_impl_call_test.cc
+++ b/src/writer/msl/generator_impl_call_test.cc
@@ -35,7 +35,7 @@
   auto* call = Call("my_func");
   auto* func = Func("my_func", ast::VariableList{}, ty.void_,
                     ast::StatementList{}, ast::FunctionDecorationList{});
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   GeneratorImpl& gen = Build();
 
@@ -47,7 +47,7 @@
   auto* call = Call("my_func", "param1", "param2");
   auto* func = Func("my_func", ast::VariableList{}, ty.void_,
                     ast::StatementList{}, ast::FunctionDecorationList{});
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   GeneratorImpl& gen = Build();
 
@@ -59,7 +59,7 @@
   auto* call = Call("my_func", "param1", "param2");
   auto* func = Func("my_func", ast::VariableList{}, ty.void_,
                     ast::StatementList{}, ast::FunctionDecorationList{});
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   auto* expr = create<ast::CallStatement>(call);
 
diff --git a/src/writer/msl/generator_impl_function_entry_point_data_test.cc b/src/writer/msl/generator_impl_function_entry_point_data_test.cc
index 8271f72..00298f6 100644
--- a/src/writer/msl/generator_impl_function_entry_point_data_test.cc
+++ b/src/writer/msl/generator_impl_function_entry_point_data_test.cc
@@ -71,7 +71,7 @@
                create<ast::StageDecoration>(ast::PipelineStage::kVertex),
            });
 
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   ASSERT_TRUE(td.Determine()) << td.error();
 
@@ -119,7 +119,7 @@
                create<ast::StageDecoration>(ast::PipelineStage::kVertex),
            });
 
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   ASSERT_TRUE(td.Determine()) << td.error();
 
@@ -167,7 +167,7 @@
                create<ast::StageDecoration>(ast::PipelineStage::kFragment),
            });
 
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   ASSERT_TRUE(td.Determine()) << td.error();
 
@@ -215,7 +215,7 @@
                create<ast::StageDecoration>(ast::PipelineStage::kFragment),
            });
 
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   ASSERT_TRUE(td.Determine()) << td.error();
 
@@ -260,7 +260,7 @@
                create<ast::StageDecoration>(ast::PipelineStage::kCompute),
            });
 
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   ASSERT_TRUE(td.Determine()) << td.error();
 
@@ -300,7 +300,7 @@
                create<ast::StageDecoration>(ast::PipelineStage::kCompute),
            });
 
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   ASSERT_TRUE(td.Determine()) << td.error();
 
@@ -345,7 +345,7 @@
                create<ast::StageDecoration>(ast::PipelineStage::kFragment),
            });
 
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   ASSERT_TRUE(td.Determine()) << td.error();
 
diff --git a/src/writer/msl/generator_impl_function_test.cc b/src/writer/msl/generator_impl_function_test.cc
index 80aefa2..0bec2fb 100644
--- a/src/writer/msl/generator_impl_function_test.cc
+++ b/src/writer/msl/generator_impl_function_test.cc
@@ -62,7 +62,7 @@
                     },
                     ast::FunctionDecorationList{});
 
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   GeneratorImpl& gen = Build();
 
@@ -85,7 +85,7 @@
                     },
                     ast::FunctionDecorationList{});
 
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   GeneratorImpl& gen = Build();
 
@@ -112,7 +112,7 @@
                     },
                     ast::FunctionDecorationList{});
 
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   GeneratorImpl& gen = Build();
 
@@ -134,7 +134,7 @@
                     ast::FunctionDecorationList{create<ast::StageDecoration>(
                         ast::PipelineStage::kFragment)});
 
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   ASSERT_TRUE(td.Determine()) << td.error();
 
@@ -174,7 +174,7 @@
            ast::FunctionDecorationList{
                create<ast::StageDecoration>(ast::PipelineStage::kFragment)});
 
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   ASSERT_TRUE(td.Determine()) << td.error();
 
@@ -223,7 +223,7 @@
                     ast::FunctionDecorationList{create<ast::StageDecoration>(
                         ast::PipelineStage::kFragment)});
 
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   ASSERT_TRUE(td.Determine()) << td.error();
 
@@ -278,7 +278,7 @@
                create<ast::StageDecoration>(ast::PipelineStage::kFragment),
            });
 
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   ASSERT_TRUE(td.Determine()) << td.error();
 
@@ -323,7 +323,7 @@
                create<ast::StageDecoration>(ast::PipelineStage::kFragment),
            });
 
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   ASSERT_TRUE(td.Determine()) << td.error();
 
@@ -374,7 +374,7 @@
                create<ast::StageDecoration>(ast::PipelineStage::kFragment),
            });
 
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   ASSERT_TRUE(td.Determine()) << td.error();
 
@@ -428,7 +428,7 @@
                create<ast::StageDecoration>(ast::PipelineStage::kFragment),
            });
 
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   ASSERT_TRUE(td.Determine()) << td.error();
 
@@ -483,7 +483,7 @@
   auto* sub_func =
       Func("sub_func", params, ty.f32, body, ast::FunctionDecorationList{});
 
-  mod->AddFunction(sub_func);
+  mod->Functions().Add(sub_func);
 
   body = ast::StatementList{
       create<ast::AssignmentStatement>(Expr("bar"), Call("sub_func", 1.0f)),
@@ -495,7 +495,7 @@
                create<ast::StageDecoration>(ast::PipelineStage::kFragment),
            });
 
-  mod->AddFunction(func_1);
+  mod->Functions().Add(func_1);
 
   ASSERT_TRUE(td.Determine()) << td.error();
 
@@ -547,7 +547,7 @@
                         },
                         ast::FunctionDecorationList{});
 
-  mod->AddFunction(sub_func);
+  mod->Functions().Add(sub_func);
 
   auto body = ast::StatementList{
       create<ast::AssignmentStatement>(Expr("depth"), Call("sub_func", 1.0f)),
@@ -560,7 +560,7 @@
                create<ast::StageDecoration>(ast::PipelineStage::kFragment),
            });
 
-  mod->AddFunction(func_1);
+  mod->Functions().Add(func_1);
 
   ASSERT_TRUE(td.Determine()) << td.error();
 
@@ -616,7 +616,7 @@
   auto* sub_func =
       Func("sub_func", params, ty.f32, body, ast::FunctionDecorationList{});
 
-  mod->AddFunction(sub_func);
+  mod->Functions().Add(sub_func);
 
   body = ast::StatementList{
       create<ast::AssignmentStatement>(Expr("depth"), Call("sub_func", 1.0f)),
@@ -628,7 +628,7 @@
                create<ast::StageDecoration>(ast::PipelineStage::kFragment),
            });
 
-  mod->AddFunction(func_1);
+  mod->Functions().Add(func_1);
 
   ASSERT_TRUE(td.Determine()) << td.error();
 
@@ -674,7 +674,7 @@
   auto* sub_func =
       Func("sub_func", params, ty.f32, body, ast::FunctionDecorationList{});
 
-  mod->AddFunction(sub_func);
+  mod->Functions().Add(sub_func);
 
   ast::ExpressionList expr;
   expr.push_back(Expr(1.0f));
@@ -692,7 +692,7 @@
                create<ast::StageDecoration>(ast::PipelineStage::kFragment),
            });
 
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   ASSERT_TRUE(td.Determine()) << td.error();
 
@@ -741,7 +741,7 @@
   auto* sub_func =
       Func("sub_func", params, ty.f32, body, ast::FunctionDecorationList{});
 
-  mod->AddFunction(sub_func);
+  mod->Functions().Add(sub_func);
 
   auto* var = Var("v", ast::StorageClass::kFunction, ty.f32,
                   Call("sub_func", 1.0f), ast::VariableDecorationList{});
@@ -756,7 +756,7 @@
                create<ast::StageDecoration>(ast::PipelineStage::kFragment),
            });
 
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   ASSERT_TRUE(td.Determine()) << td.error();
 
@@ -810,7 +810,7 @@
   auto* sub_func =
       Func("sub_func", params, ty.f32, body, ast::FunctionDecorationList{});
 
-  mod->AddFunction(sub_func);
+  mod->Functions().Add(sub_func);
 
   ast::ExpressionList expr;
   expr.push_back(Expr(1.0f));
@@ -828,7 +828,7 @@
                create<ast::StageDecoration>(ast::PipelineStage::kFragment),
            });
 
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   ASSERT_TRUE(td.Determine()) << td.error();
 
@@ -881,7 +881,7 @@
                create<ast::StageDecoration>(ast::PipelineStage::kFragment),
            });
 
-  mod->AddFunction(func_1);
+  mod->Functions().Add(func_1);
 
   ASSERT_TRUE(td.Determine()) << td.error();
 
@@ -914,7 +914,7 @@
                create<ast::StageDecoration>(ast::PipelineStage::kCompute),
            });
 
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   GeneratorImpl& gen = Build();
 
@@ -938,7 +938,7 @@
                     },
                     ast::FunctionDecorationList{});
 
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   GeneratorImpl& gen = Build();
 
@@ -1004,7 +1004,7 @@
                  create<ast::StageDecoration>(ast::PipelineStage::kCompute),
              });
 
-    mod->AddFunction(func);
+    mod->Functions().Add(func);
   }
 
   {
@@ -1018,7 +1018,7 @@
              ast::FunctionDecorationList{
                  create<ast::StageDecoration>(ast::PipelineStage::kCompute)});
 
-    mod->AddFunction(func);
+    mod->Functions().Add(func);
   }
 
   ASSERT_TRUE(td.Determine()) << td.error();
diff --git a/src/writer/msl/generator_impl_test.cc b/src/writer/msl/generator_impl_test.cc
index 42c1514..183c08d 100644
--- a/src/writer/msl/generator_impl_test.cc
+++ b/src/writer/msl/generator_impl_test.cc
@@ -53,7 +53,7 @@
            ast::FunctionDecorationList{
                create<ast::StageDecoration>(ast::PipelineStage::kCompute),
            });
-  mod->AddFunction(func);
+  mod->Functions().Add(func);
 
   GeneratorImpl& gen = Build();
 
diff --git a/src/writer/spirv/builder.cc b/src/writer/spirv/builder.cc
index bfd42d7..d79f622 100644
--- a/src/writer/spirv/builder.cc
+++ b/src/writer/spirv/builder.cc
@@ -302,7 +302,7 @@
     }
   }
 
-  for (auto* func : mod_->functions()) {
+  for (auto* func : mod_->Functions()) {
     if (!GenerateFunction(func)) {
       return false;
     }
diff --git a/src/writer/spirv/builder_function_test.cc b/src/writer/spirv/builder_function_test.cc
index 3796661..58b13b3 100644
--- a/src/writer/spirv/builder_function_test.cc
+++ b/src/writer/spirv/builder_function_test.cc
@@ -261,7 +261,7 @@
                  create<ast::StageDecoration>(ast::PipelineStage::kCompute),
              });
 
-    mod->AddFunction(func);
+    mod->Functions().Add(func);
   }
 
   {
@@ -278,7 +278,7 @@
                  create<ast::StageDecoration>(ast::PipelineStage::kCompute),
              });
 
-    mod->AddFunction(func);
+    mod->Functions().Add(func);
   }
 
   ASSERT_TRUE(td.Determine()) << td.error();
diff --git a/src/writer/spirv/builder_intrinsic_texture_test.cc b/src/writer/spirv/builder_intrinsic_texture_test.cc
index f6bbad2..7afa09e 100644
--- a/src/writer/spirv/builder_intrinsic_texture_test.cc
+++ b/src/writer/spirv/builder_intrinsic_texture_test.cc
@@ -4165,7 +4165,7 @@
                create<ast::StageDecoration>(ast::PipelineStage::kFragment),
            });
 
-  mod->AddFunction(main);
+  mod->Functions().Add(main);
 
   ASSERT_TRUE(td.Determine()) << td.error();
 
diff --git a/src/writer/wgsl/generator_impl.cc b/src/writer/wgsl/generator_impl.cc
index c395c60..520a595 100644
--- a/src/writer/wgsl/generator_impl.cc
+++ b/src/writer/wgsl/generator_impl.cc
@@ -101,7 +101,7 @@
     out_ << std::endl;
   }
 
-  for (auto* func : module_.functions()) {
+  for (auto* func : module_.Functions()) {
     if (!EmitFunction(func)) {
       return false;
     }
@@ -113,8 +113,7 @@
 
 bool GeneratorImpl::GenerateEntryPoint(ast::PipelineStage stage,
                                        const std::string& name) {
-  auto* func =
-      module_.FindFunctionBySymbolAndStage(module_.GetSymbol(name), stage);
+  auto* func = module_.Functions().Find(module_.GetSymbol(name), stage);
   if (func == nullptr) {
     error_ = "Unable to find requested entry point: " + name;
     return false;
@@ -153,7 +152,7 @@
     out_ << std::endl;
   }
 
-  for (auto* f : module_.functions()) {
+  for (auto* f : module_.Functions()) {
     if (!f->HasAncestorEntryPoint(module_.GetSymbol(name))) {
       continue;
     }
diff --git a/src/writer/wgsl/generator_impl_function_test.cc b/src/writer/wgsl/generator_impl_function_test.cc
index 9fbca86..0176f7b 100644
--- a/src/writer/wgsl/generator_impl_function_test.cc
+++ b/src/writer/wgsl/generator_impl_function_test.cc
@@ -212,7 +212,7 @@
                  create<ast::StageDecoration>(ast::PipelineStage::kCompute),
              });
 
-    mod->AddFunction(func);
+    mod->Functions().Add(func);
   }
 
   {
@@ -231,7 +231,7 @@
                  create<ast::StageDecoration>(ast::PipelineStage::kCompute),
              });
 
-    mod->AddFunction(func);
+    mod->Functions().Add(func);
   }
 
   ASSERT_TRUE(td.Determine()) << td.error();
diff --git a/src/writer/wgsl/generator_impl_test.cc b/src/writer/wgsl/generator_impl_test.cc
index 31312fa..bf88db1 100644
--- a/src/writer/wgsl/generator_impl_test.cc
+++ b/src/writer/wgsl/generator_impl_test.cc
@@ -30,8 +30,9 @@
 using WgslGeneratorImplTest = TestHelper;
 
 TEST_F(WgslGeneratorImplTest, Generate) {
-  mod->AddFunction(Func("my_func", ast::VariableList{}, ty.void_,
-                        ast::StatementList{}, ast::FunctionDecorationList{}));
+  mod->Functions().Add(Func("my_func", ast::VariableList{}, ty.void_,
+                            ast::StatementList{},
+                            ast::FunctionDecorationList{}));
 
   GeneratorImpl& gen = Build();
 
