Remove Function::name().

This CL removes the function name accessor and changes all usages to use
the symbol.

Change-Id: I19b92bf1bc557ba14e68ef8cb381487a4ad1f7ee
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/36821
Reviewed-by: Ben Clayton <bclayton@google.com>
diff --git a/src/ast/function.h b/src/ast/function.h
index 4f22016..151794f 100644
--- a/src/ast/function.h
+++ b/src/ast/function.h
@@ -74,7 +74,7 @@
   /// @returns the function symbol
   Symbol symbol() const { return symbol_; }
   /// @returns the function name
-  const std::string& name() { return name_; }
+  const std::string& name_for_clone() { return name_; }
   /// @returns the function params
   const VariableList& params() const { return params_; }
 
diff --git a/src/ast/function_test.cc b/src/ast/function_test.cc
index 039bc28..548aedc 100644
--- a/src/ast/function_test.cc
+++ b/src/ast/function_test.cc
@@ -36,7 +36,6 @@
   auto* f =
       Func("func", params, ty.void_, StatementList{}, FunctionDecorationList{});
   EXPECT_EQ(f->symbol(), mod->RegisterSymbol("func"));
-  EXPECT_EQ(f->name(), "func");
   ASSERT_EQ(f->params().size(), 1u);
   EXPECT_EQ(f->return_type(), ty.void_);
   EXPECT_EQ(f->params()[0], var);
diff --git a/src/inspector/inspector.cc b/src/inspector/inspector.cc
index a06bd77..47995d1 100644
--- a/src/inspector/inspector.cc
+++ b/src/inspector/inspector.cc
@@ -57,8 +57,8 @@
     }
 
     EntryPoint entry_point;
-    entry_point.name = func->name();
-    entry_point.remapped_name = func->name();
+    entry_point.name = module_.SymbolToName(func->symbol());
+    entry_point.remapped_name = namer_->NameFor(func->symbol());
     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();
diff --git a/src/reader/wgsl/parser_impl_function_decl_test.cc b/src/reader/wgsl/parser_impl_function_decl_test.cc
index c8de535..519e408 100644
--- a/src/reader/wgsl/parser_impl_function_decl_test.cc
+++ b/src/reader/wgsl/parser_impl_function_decl_test.cc
@@ -37,7 +37,7 @@
   EXPECT_TRUE(f.matched);
   ASSERT_NE(f.value, nullptr);
 
-  EXPECT_EQ(f->name(), "main");
+  EXPECT_EQ(f->symbol(), p->get_module().RegisterSymbol("main"));
   ASSERT_NE(f->return_type(), nullptr);
   EXPECT_TRUE(f->return_type()->Is<ast::type::Void>());
 
@@ -65,7 +65,7 @@
   EXPECT_TRUE(f.matched);
   ASSERT_NE(f.value, nullptr);
 
-  EXPECT_EQ(f->name(), "main");
+  EXPECT_EQ(f->symbol(), p->get_module().RegisterSymbol("main"));
   ASSERT_NE(f->return_type(), nullptr);
   EXPECT_TRUE(f->return_type()->Is<ast::type::Void>());
   ASSERT_EQ(f->params().size(), 0u);
@@ -103,7 +103,7 @@
   EXPECT_TRUE(f.matched);
   ASSERT_NE(f.value, nullptr);
 
-  EXPECT_EQ(f->name(), "main");
+  EXPECT_EQ(f->symbol(), p->get_module().RegisterSymbol("main"));
   ASSERT_NE(f->return_type(), nullptr);
   EXPECT_TRUE(f->return_type()->Is<ast::type::Void>());
   ASSERT_EQ(f->params().size(), 0u);
@@ -148,7 +148,7 @@
   EXPECT_TRUE(f.matched);
   ASSERT_NE(f.value, nullptr);
 
-  EXPECT_EQ(f->name(), "main");
+  EXPECT_EQ(f->symbol(), p->get_module().RegisterSymbol("main"));
   ASSERT_NE(f->return_type(), nullptr);
   EXPECT_TRUE(f->return_type()->Is<ast::type::Void>());
   ASSERT_EQ(f->params().size(), 0u);
diff --git a/src/transform/transform.cc b/src/transform/transform.cc
index 51fe645..3b6da17 100644
--- a/src/transform/transform.cc
+++ b/src/transform/transform.cc
@@ -32,7 +32,7 @@
     statements.emplace_back(ctx->Clone(s));
   }
   return ctx->mod->create<ast::Function>(
-      ctx->Clone(in->source()), ctx->Clone(in->symbol()), in->name(),
+      ctx->Clone(in->source()), ctx->Clone(in->symbol()), in->name_for_clone(),
       ctx->Clone(in->params()), ctx->Clone(in->return_type()),
       ctx->mod->create<ast::BlockStatement>(ctx->Clone(in->body()->source()),
                                             statements),
diff --git a/src/type_determiner.cc b/src/type_determiner.cc
index 967f0e2..d6a94be 100644
--- a/src/type_determiner.cc
+++ b/src/type_determiner.cc
@@ -121,7 +121,7 @@
     if (!func->IsEntryPoint()) {
       continue;
     }
-    for (const auto& callee : caller_to_callee_[func->name()]) {
+    for (const auto& callee : caller_to_callee_[func->symbol().value()]) {
       set_entry_points(callee, func->symbol());
     }
   }
@@ -129,11 +129,10 @@
   return true;
 }
 
-void TypeDeterminer::set_entry_points(const std::string& fn_name,
-                                      Symbol ep_sym) {
-  name_to_function_[fn_name]->add_ancestor_entry_point(ep_sym);
+void TypeDeterminer::set_entry_points(const Symbol& fn_sym, Symbol ep_sym) {
+  symbol_to_function_[fn_sym.value()]->add_ancestor_entry_point(ep_sym);
 
-  for (const auto& callee : caller_to_callee_[fn_name]) {
+  for (const auto& callee : caller_to_callee_[fn_sym.value()]) {
     set_entry_points(callee, ep_sym);
   }
 }
@@ -148,7 +147,7 @@
 }
 
 bool TypeDeterminer::DetermineFunction(ast::Function* func) {
-  name_to_function_[func->name()] = func;
+  symbol_to_function_[func->symbol().value()] = func;
 
   current_function_ = func;
 
@@ -387,13 +386,13 @@
       }
     } else {
       if (current_function_) {
-        caller_to_callee_[current_function_->name()].push_back(ident->name());
+        caller_to_callee_[current_function_->symbol().value()].push_back(
+            ident->symbol());
 
-        auto* callee_func =
-            mod_->FindFunctionBySymbol(mod_->GetSymbol(ident->name()));
+        auto* callee_func = mod_->FindFunctionBySymbol(ident->symbol());
         if (callee_func == nullptr) {
-          set_error(expr->source(),
-                    "unable to find called function: " + ident->name());
+          set_error(expr->source(), "unable to find called function: " +
+                                        mod_->SymbolToName(ident->symbol()));
           return false;
         }
 
@@ -416,10 +415,10 @@
   }
 
   if (!expr->func()->result_type()) {
-    auto func_name = expr->func()->As<ast::IdentifierExpression>()->name();
-    set_error(
-        expr->source(),
-        "v-0005: function must be declared before use: '" + func_name + "'");
+    auto func_sym = expr->func()->As<ast::IdentifierExpression>()->symbol();
+    set_error(expr->source(),
+              "v-0005: function must be declared before use: '" +
+                  mod_->SymbolToName(func_sym) + "'");
     return false;
   }
 
@@ -858,7 +857,6 @@
 }
 
 bool TypeDeterminer::DetermineIdentifier(ast::IdentifierExpression* expr) {
-  auto name = expr->name();
   auto symbol = expr->symbol();
   ast::Variable* var;
   if (variable_stack_.get(symbol, &var)) {
@@ -877,15 +875,16 @@
     return true;
   }
 
-  auto iter = name_to_function_.find(name);
-  if (iter != name_to_function_.end()) {
+  auto iter = symbol_to_function_.find(symbol.value());
+  if (iter != symbol_to_function_.end()) {
     expr->set_result_type(iter->second->return_type());
     return true;
   }
 
   if (!SetIntrinsicIfNeeded(expr)) {
     set_error(expr->source(),
-              "v-0006: identifier must be declared before use: " + name);
+              "v-0006: identifier must be declared before use: " +
+                  mod_->SymbolToName(symbol));
     return false;
   }
   return true;
diff --git a/src/type_determiner.h b/src/type_determiner.h
index 51f6801..d13b97c 100644
--- a/src/type_determiner.h
+++ b/src/type_determiner.h
@@ -113,7 +113,7 @@
  private:
   void set_error(const Source& src, const std::string& msg);
   void set_referenced_from_function_if_needed(ast::Variable* var, bool local);
-  void set_entry_points(const std::string& fn_name, Symbol ep_sym);
+  void set_entry_points(const Symbol& fn_sym, Symbol ep_sym);
 
   bool DetermineArrayAccessor(ast::ArrayAccessorExpression* expr);
   bool DetermineBinary(ast::BinaryExpression* expr);
@@ -129,11 +129,11 @@
   ast::Module* mod_;
   std::string error_;
   ScopeStack<ast::Variable*> variable_stack_;
-  std::unordered_map<std::string, ast::Function*> name_to_function_;
+  std::unordered_map<uint32_t, ast::Function*> symbol_to_function_;
   ast::Function* current_function_ = nullptr;
 
   // Map from caller functions to callee functions.
-  std::unordered_map<std::string, std::vector<std::string>> caller_to_callee_;
+  std::unordered_map<uint32_t, std::vector<Symbol>> caller_to_callee_;
 };
 
 }  // namespace tint
diff --git a/src/validator/validator_impl.cc b/src/validator/validator_impl.cc
index 484b3e9..5aa6f0a 100644
--- a/src/validator/validator_impl.cc
+++ b/src/validator/validator_impl.cc
@@ -160,14 +160,14 @@
       if (!func->params().empty()) {
         add_error(func->source(), "v-0023",
                   "Entry point function must accept no parameters: '" +
-                      func->name() + "'");
+                      module_.SymbolToName(func->symbol()) + "'");
         return false;
       }
 
       if (!func->return_type()->Is<ast::type::Void>()) {
-        add_error(
-            func->source(), "v-0024",
-            "Entry point function must return void: '" + func->name() + "'");
+        add_error(func->source(), "v-0024",
+                  "Entry point function must return void: '" +
+                      module_.SymbolToName(func->symbol()) + "'");
         return false;
       }
       auto stage_deco_count = 0;
diff --git a/src/writer/spirv/builder.cc b/src/writer/spirv/builder.cc
index f45ef18..37093fe 100644
--- a/src/writer/spirv/builder.cc
+++ b/src/writer/spirv/builder.cc
@@ -448,7 +448,7 @@
   // OperandList operands = {Operand::Int(stage), Operand::Int(id),
   //                         Operand::String(func->name())};
   OperandList operands = {Operand::Int(stage), Operand::Int(id),
-                          Operand::String(func->name())};
+                          Operand::String(namer_->NameFor(func->symbol()))};
 
   for (const auto* var : func->referenced_module_variables()) {
     // For SPIR-V 1.3 we only output Input/output variables. If we update to
@@ -593,8 +593,7 @@
 
   scope_stack_.pop_scope();
 
-  func_name_to_id_[func->name()] = func_id;
-  func_name_to_func_[func->name()] = func;
+  func_symbol_to_id_[func->symbol().value()] = func_id;
 
   return true;
 }
@@ -1820,7 +1819,7 @@
 
   OperandList ops = {Operand::Int(type_id), result};
 
-  auto func_id = func_name_to_id_[ident->name()];
+  auto func_id = func_symbol_to_id_[ident->symbol().value()];
   if (func_id == 0) {
     error_ = "unable to find called function: " + ident->name();
     return 0;
diff --git a/src/writer/spirv/builder.h b/src/writer/spirv/builder.h
index 451c961..900af20 100644
--- a/src/writer/spirv/builder.h
+++ b/src/writer/spirv/builder.h
@@ -490,16 +490,6 @@
   /// automatically.
   Operand result_op();
 
-  /// Retrives the id for the given function name
-  /// @param name the function name to search for
-  /// @returns the id for the given name or 0 on failure
-  uint32_t id_for_func_name(const std::string& name) {
-    if (func_name_to_id_.count(name) == 0) {
-      return 0;
-    }
-    return func_name_to_id_[name];
-  }
-
   ast::Module* mod_;
   std::unique_ptr<Namer> namer_;
   std::string error_;
@@ -517,8 +507,7 @@
   std::vector<Function> functions_;
 
   std::unordered_map<std::string, uint32_t> import_name_to_id_;
-  std::unordered_map<std::string, uint32_t> func_name_to_id_;
-  std::unordered_map<std::string, ast::Function*> func_name_to_func_;
+  std::unordered_map<uint32_t, uint32_t> func_symbol_to_id_;
   std::unordered_map<std::string, uint32_t> type_name_to_id_;
   std::unordered_map<std::string, uint32_t> const_to_id_;
   std::unordered_map<std::string, uint32_t>
diff --git a/src/writer/wgsl/generator_impl.cc b/src/writer/wgsl/generator_impl.cc
index 5440330..bf70039 100644
--- a/src/writer/wgsl/generator_impl.cc
+++ b/src/writer/wgsl/generator_impl.cc
@@ -361,7 +361,7 @@
   }
 
   make_indent();
-  out_ << "fn " << func->name() << "(";
+  out_ << "fn " << module_.SymbolToName(func->symbol()) << "(";
 
   bool first = true;
   for (auto* v : func->params()) {