spirv-reader: SaveName -> Register, add RegisterWithoutId

Change-Id: Iab2eaa3b2d13a3cbb8f6bca01ed79be14dedbfd1
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/49141
Commit-Queue: David Neto <dneto@google.com>
Auto-Submit: David Neto <dneto@google.com>
Reviewed-by: Ben Clayton <bclayton@google.com>
diff --git a/src/reader/spirv/namer.cc b/src/reader/spirv/namer.cc
index 9c5385f..67450d1 100644
--- a/src/reader/spirv/namer.cc
+++ b/src/reader/spirv/namer.cc
@@ -18,6 +18,8 @@
 #include <sstream>
 #include <unordered_set>
 
+#include "src/debug.h"
+
 namespace tint {
 namespace reader {
 namespace spirv {
@@ -120,28 +122,39 @@
 
 std::string Namer::MakeDerivedName(const std::string& base_name) {
   auto result = FindUnusedDerivedName(base_name);
-  // Register it.
-  name_to_id_[result] = 0;
+  const bool registered = RegisterWithoutId(result);
+  TINT_ASSERT(registered);
   return result;
 }
 
-bool Namer::SaveName(uint32_t id, const std::string& name) {
+bool Namer::Register(uint32_t id, const std::string& name) {
   if (HasName(id)) {
     return Fail() << "internal error: ID " << id
                   << " already has registered name: " << id_to_name_[id];
   }
+  if (!RegisterWithoutId(name)) {
+    return false;
+  }
   id_to_name_[id] = name;
   name_to_id_[name] = id;
   return true;
 }
 
+bool Namer::RegisterWithoutId(const std::string& name) {
+  if (IsRegistered(name)) {
+    return Fail() << "internal error: name already registered: " << name;
+  }
+  name_to_id_[name] = 0;
+  return true;
+}
+
 bool Namer::SuggestSanitizedName(uint32_t id,
                                  const std::string& suggested_name) {
   if (HasName(id)) {
     return false;
   }
 
-  return SaveName(id, FindUnusedDerivedName(Sanitize(suggested_name)));
+  return Register(id, FindUnusedDerivedName(Sanitize(suggested_name)));
 }
 
 bool Namer::SuggestSanitizedMemberName(uint32_t struct_id,
diff --git a/src/reader/spirv/namer.h b/src/reader/spirv/namer.h
index 5957ae5..e4ee8c4 100644
--- a/src/reader/spirv/namer.h
+++ b/src/reader/spirv/namer.h
@@ -106,7 +106,13 @@
   /// @param id the SPIR-V ID
   /// @param name the name to map to the ID
   /// @returns true if the ID did not have a previously registered name.
-  bool SaveName(uint32_t id, const std::string& name);
+  bool Register(uint32_t id, const std::string& name);
+
+  /// Registers a name, but not associated to any ID. Fails if the name
+  /// was already registered.
+  /// @param name the name to register
+  /// @returns true if the name was not already reegistered.
+  bool RegisterWithoutId(const std::string& name);
 
   /// Saves a sanitized name for the given ID, if that ID does not yet
   /// have a registered name, and if the sanitized name has not already
diff --git a/src/reader/spirv/namer_test.cc b/src/reader/spirv/namer_test.cc
index 52e38e1..79f271b 100644
--- a/src/reader/spirv/namer_test.cc
+++ b/src/reader/spirv/namer_test.cc
@@ -87,15 +87,15 @@
 
 TEST_F(SpvNamerTest, FindUnusedDerivedName_HasRecordedName) {
   Namer namer(fail_stream_);
-  namer.SaveName(12, "rigby");
+  namer.Register(12, "rigby");
   EXPECT_THAT(namer.FindUnusedDerivedName("rigby"), Eq("rigby_1"));
 }
 
 TEST_F(SpvNamerTest, FindUnusedDerivedName_HasMultipleConflicts) {
   Namer namer(fail_stream_);
-  namer.SaveName(12, "rigby");
-  namer.SaveName(13, "rigby_1");
-  namer.SaveName(14, "rigby_3");
+  namer.Register(12, "rigby");
+  namer.Register(13, "rigby_1");
+  namer.Register(14, "rigby_3");
   // It picks the first non-conflicting suffix.
   EXPECT_THAT(namer.FindUnusedDerivedName("rigby"), Eq("rigby_2"));
 }
@@ -107,7 +107,7 @@
 
 TEST_F(SpvNamerTest, IsRegistered_RegisteredById) {
   Namer namer(fail_stream_);
-  namer.SaveName(1, "abbey");
+  namer.Register(1, "abbey");
   EXPECT_TRUE(namer.IsRegistered("abbey"));
 }
 
@@ -127,25 +127,60 @@
 
 TEST_F(SpvNamerTest, MakeDerivedName_HasRecordedName) {
   Namer namer(fail_stream_);
-  namer.SaveName(12, "rigby");
+  namer.Register(12, "rigby");
   EXPECT_THAT(namer.MakeDerivedName("rigby"), Eq("rigby_1"));
 }
 
 TEST_F(SpvNamerTest, MakeDerivedName_HasMultipleConflicts) {
   Namer namer(fail_stream_);
-  namer.SaveName(12, "rigby");
-  namer.SaveName(13, "rigby_1");
-  namer.SaveName(14, "rigby_3");
+  namer.Register(12, "rigby");
+  namer.Register(13, "rigby_1");
+  namer.Register(14, "rigby_3");
   // It picks the first non-conflicting suffix.
   EXPECT_THAT(namer.MakeDerivedName("rigby"), Eq("rigby_2"));
 }
 
-TEST_F(SpvNamerTest, SaveNameOnce) {
+TEST_F(SpvNamerTest, RegisterWithoutId_Once) {
+  Namer namer(fail_stream_);
+
+  const std::string n("abbey");
+  EXPECT_FALSE(namer.IsRegistered(n));
+  EXPECT_TRUE(namer.RegisterWithoutId(n));
+  EXPECT_TRUE(namer.IsRegistered(n));
+  EXPECT_TRUE(success_);
+  EXPECT_TRUE(error().empty());
+}
+
+TEST_F(SpvNamerTest, RegisterWithoutId_Twice) {
+  Namer namer(fail_stream_);
+
+  const std::string n("abbey");
+  EXPECT_FALSE(namer.IsRegistered(n));
+  EXPECT_TRUE(namer.RegisterWithoutId(n));
+  // Fails on second attempt.
+  EXPECT_FALSE(namer.RegisterWithoutId(n));
+  EXPECT_FALSE(success_);
+  EXPECT_EQ(error(),"internal error: name already registered: abbey");
+}
+
+TEST_F(SpvNamerTest, RegisterWithoutId_ConflictsWithIdRegisteredName) {
+  Namer namer(fail_stream_);
+
+  const std::string n("abbey");
+  EXPECT_TRUE(namer.Register(1,n));
+  EXPECT_TRUE(namer.IsRegistered(n));
+  // Fails on attempt to register without ID.
+  EXPECT_FALSE(namer.RegisterWithoutId(n));
+  EXPECT_FALSE(success_);
+  EXPECT_EQ(error(),"internal error: name already registered: abbey");
+}
+
+TEST_F(SpvNamerTest, Register_Once) {
   Namer namer(fail_stream_);
 
   const uint32_t id = 9;
   EXPECT_FALSE(namer.HasName(id));
-  const bool save_result = namer.SaveName(id, "abbey road");
+  const bool save_result = namer.Register(id, "abbey road");
   EXPECT_TRUE(save_result);
   EXPECT_TRUE(namer.HasName(id));
   EXPECT_EQ(namer.GetName(id), "abbey road");
@@ -153,13 +188,13 @@
   EXPECT_TRUE(error().empty());
 }
 
-TEST_F(SpvNamerTest, SaveNameTwoIds) {
+TEST_F(SpvNamerTest, Register_TwoIds) {
   Namer namer(fail_stream_);
 
   EXPECT_FALSE(namer.HasName(8));
   EXPECT_FALSE(namer.HasName(9));
-  EXPECT_TRUE(namer.SaveName(8, "abbey road"));
-  EXPECT_TRUE(namer.SaveName(9, "rubber soul"));
+  EXPECT_TRUE(namer.Register(8, "abbey road"));
+  EXPECT_TRUE(namer.Register(9, "rubber soul"));
   EXPECT_TRUE(namer.HasName(8));
   EXPECT_TRUE(namer.HasName(9));
   EXPECT_EQ(namer.GetName(9), "rubber soul");
@@ -168,12 +203,12 @@
   EXPECT_TRUE(error().empty());
 }
 
-TEST_F(SpvNamerTest, SaveNameFailsDueToIdReuse) {
+TEST_F(SpvNamerTest, Register_FailsDueToIdReuse) {
   Namer namer(fail_stream_);
 
   const uint32_t id = 9;
-  EXPECT_TRUE(namer.SaveName(id, "abbey road"));
-  EXPECT_FALSE(namer.SaveName(id, "rubber soul"));
+  EXPECT_TRUE(namer.Register(id, "abbey road"));
+  EXPECT_FALSE(namer.Register(id, "rubber soul"));
   EXPECT_TRUE(namer.HasName(id));
   EXPECT_EQ(namer.GetName(id), "abbey road");
   EXPECT_FALSE(success_);
@@ -191,7 +226,7 @@
        SuggestSanitizedName_RejectSuggestionWhenConflictOnSameId) {
   Namer namer(fail_stream_);
 
-  namer.SaveName(1, "lennon");
+  namer.Register(1, "lennon");
   EXPECT_FALSE(namer.SuggestSanitizedName(1, "mccartney"));
   EXPECT_THAT(namer.GetName(1), Eq("lennon"));
 }
@@ -207,7 +242,7 @@
        SuggestSanitizedName_GenerateNewNameWhenConflictOnDifferentId) {
   Namer namer(fail_stream_);
 
-  namer.SaveName(7, "rice");
+  namer.Register(7, "rice");
   EXPECT_TRUE(namer.SuggestSanitizedName(9, "rice"));
   EXPECT_THAT(namer.GetName(9), Eq("rice_1"));
 }
@@ -260,13 +295,13 @@
 
 TEST_F(SpvNamerTest, Name_GeneratesNameWithoutConflict) {
   Namer namer(fail_stream_);
-  namer.SaveName(42, "x_14");
+  namer.Register(42, "x_14");
   EXPECT_THAT(namer.Name(14), Eq("x_14_1"));
 }
 
 TEST_F(SpvNamerTest, Name_ReturnsRegisteredName) {
   Namer namer(fail_stream_);
-  namer.SaveName(14, "hello");
+  namer.Register(14, "hello");
   EXPECT_THAT(namer.Name(14), Eq("hello"));
 }