[msl-writer] Handle remapping remap collisions.
If the remapper give an ident a new name which collides with a future ident name we need to rename the future name to not collide. Bug: tint:7 Change-Id: I162a3071f75ed714cee730b78aebefa8c75c77de Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/24521 Reviewed-by: Ryan Harrison <rharrison@chromium.org>
This commit is contained in:
parent
28ba9a369e
commit
928f59ca46
|
@ -267,7 +267,7 @@ Namer::Namer() = default;
|
|||
Namer::~Namer() = default;
|
||||
|
||||
std::string Namer::NameFor(const std::string& name) {
|
||||
// If it's in the name make we can just return it. There are no shadow names
|
||||
// If it's in the name map we can just return it. There are no shadow names
|
||||
// in WGSL so this has to be unique in the WGSL names, and we've already
|
||||
// checked the name collisions with MSL.
|
||||
auto it = name_map_.find(name);
|
||||
|
@ -288,6 +288,19 @@ std::string Namer::NameFor(const std::string& name) {
|
|||
}
|
||||
i++;
|
||||
}
|
||||
remapped_names_.insert(ret_name);
|
||||
} else {
|
||||
uint32_t i = 0;
|
||||
// Make sure the ident name wasn't assigned by a remapping.
|
||||
while (true) {
|
||||
auto remap_it = remapped_names_.find(ret_name);
|
||||
if (remap_it == remapped_names_.end()) {
|
||||
break;
|
||||
}
|
||||
ret_name = name + "_" + std::to_string(i);
|
||||
i++;
|
||||
}
|
||||
remapped_names_.insert(ret_name);
|
||||
}
|
||||
|
||||
name_map_[name] = ret_name;
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
|
||||
#include <string>
|
||||
#include <unordered_map>
|
||||
#include <unordered_set>
|
||||
|
||||
namespace tint {
|
||||
namespace writer {
|
||||
|
@ -37,6 +38,8 @@ class Namer {
|
|||
private:
|
||||
/// Map of original name to new name. The two names may be the same.
|
||||
std::unordered_map<std::string, std::string> name_map_;
|
||||
// The list of names taken by the remapper
|
||||
std::unordered_set<std::string> remapped_names_;
|
||||
};
|
||||
|
||||
} // namespace msl
|
||||
|
|
|
@ -28,13 +28,21 @@ TEST_F(MslNamerTest, ReturnsName) {
|
|||
EXPECT_EQ("my_name", n.NameFor("my_name"));
|
||||
}
|
||||
|
||||
TEST_F(MslNamerTest, HandlesConflictWithRenamedReservedWord) {
|
||||
TEST_F(MslNamerTest, HandlesConflictWithRenamedReservedWordAfterIdentSeen) {
|
||||
Namer n;
|
||||
EXPECT_EQ("float_tint_0", n.NameFor("float_tint_0"));
|
||||
EXPECT_EQ("float_tint_1", n.NameFor("float"));
|
||||
EXPECT_EQ("float_tint_0", n.NameFor("float_tint_0"));
|
||||
}
|
||||
|
||||
TEST_F(MslNamerTest, HandlesConflictWithRenamedReservedWordBeforeIdentSeen) {
|
||||
Namer n;
|
||||
EXPECT_EQ("float_tint_0", n.NameFor("float"));
|
||||
EXPECT_EQ("float_tint_0_0", n.NameFor("float_tint_0"));
|
||||
EXPECT_EQ("float_tint_0_0_0", n.NameFor("float_tint_0_0"));
|
||||
EXPECT_EQ("float_tint_0_0", n.NameFor("float_tint_0"));
|
||||
}
|
||||
|
||||
using MslReservedNameTest = testing::TestWithParam<std::string>;
|
||||
TEST_P(MslReservedNameTest, Emit) {
|
||||
auto name = GetParam();
|
||||
|
|
Loading…
Reference in New Issue