Add reader::spv::SuggestSanitizedName Bug: tint:3 Change-Id: Ie53bbb7a0b2523a2098b485b6a5bb3d5fa4e52f9 Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/17422 Reviewed-by: dan sinclair <dsinclair@google.com>
diff --git a/src/reader/spirv/namer.cc b/src/reader/spirv/namer.cc index a864a35..d2353b4 100644 --- a/src/reader/spirv/namer.cc +++ b/src/reader/spirv/namer.cc
@@ -76,6 +76,15 @@ 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))); +} + } // namespace spirv } // namespace reader } // namespace tint
diff --git a/src/reader/spirv/namer.h b/src/reader/spirv/namer.h index ede1c7a..3c9d455 100644 --- a/src/reader/spirv/namer.h +++ b/src/reader/spirv/namer.h
@@ -75,6 +75,13 @@ /// @returns true if the ID did not have a previously registered name. bool SaveName(uint32_t id, const std::string& name); + /// Saves a sanitized name for the given ID, if that ID does not yet + /// have a registered name. + /// @param id the SPIR-V ID + /// @param suggested_name the suggested name + /// @returns true if a name was newly registered for the ID + bool SuggestSanitizedName(uint32_t id, const std::string& suggested_name); + private: FailStream fail_stream_;
diff --git a/src/reader/spirv/namer_test.cc b/src/reader/spirv/namer_test.cc index d2a8373..e744a9d 100644 --- a/src/reader/spirv/namer_test.cc +++ b/src/reader/spirv/namer_test.cc
@@ -143,6 +143,38 @@ EXPECT_FALSE(error().empty()); } +TEST_F(SpvNamerTest, SuggestSanitizedName_TakeSuggestionWhenNoConflict) { + Namer namer(fail_stream_); + + EXPECT_TRUE(namer.SuggestSanitizedName(1, "father")); + EXPECT_THAT(namer.GetName(1), Eq("father")); +} + +TEST_F(SpvNamerTest, + SuggestSanitizedName_RejectSuggestionWhenConflictOnSameId) { + Namer namer(fail_stream_); + + namer.SaveName(1, "lennon"); + EXPECT_FALSE(namer.SuggestSanitizedName(1, "mccartney")); + EXPECT_THAT(namer.GetName(1), Eq("lennon")); +} + +TEST_F(SpvNamerTest, SuggestSanitizedName_SanitizeSuggestion) { + Namer namer(fail_stream_); + + EXPECT_TRUE(namer.SuggestSanitizedName(9, "m:kenzie")); + EXPECT_THAT(namer.GetName(9), Eq("m_kenzie")); +} + +TEST_F(SpvNamerTest, + SuggestSanitizedName_GenerateNewNameWhenConflictOnDifferentId) { + Namer namer(fail_stream_); + + namer.SaveName(7, "rice"); + EXPECT_TRUE(namer.SuggestSanitizedName(9, "rice")); + EXPECT_THAT(namer.GetName(9), Eq("rice_1")); +} + } // namespace } // namespace spirv } // namespace reader