diff options
author | 2017-10-19 22:23:58 +0000 | |
---|---|---|
committer | 2017-10-19 22:23:58 +0000 | |
commit | c2e67f4b5ca13a847689a6b36fc40efa9c0c5301 (patch) | |
tree | d67e689da858981c284971ae27036a49073a586b | |
parent | 0f56a1014a794e06caf38b1d84a7bd6931e50853 (diff) | |
parent | 5fae742a1e5ff0dcfa870b4521a9db796d9db4f9 (diff) |
Merge "AAPT2: Ensure strings are sorted by configuration" into oc-mr1-dev am: 8da74b1bfd
am: 5fae742a1e
Change-Id: I7dfb1a020b1c3da9e0af5a7096fda0775751eab3
-rw-r--r-- | tools/aapt2/ResourceValues.cpp | 6 | ||||
-rw-r--r-- | tools/aapt2/ResourceValues_test.cpp | 20 | ||||
-rw-r--r-- | tools/aapt2/StringPool.cpp | 7 | ||||
-rw-r--r-- | tools/aapt2/StringPool.h | 5 |
4 files changed, 35 insertions, 3 deletions
diff --git a/tools/aapt2/ResourceValues.cpp b/tools/aapt2/ResourceValues.cpp index e0137290f5ee..608316083f41 100644 --- a/tools/aapt2/ResourceValues.cpp +++ b/tools/aapt2/ResourceValues.cpp @@ -65,7 +65,7 @@ bool RawString::Equals(const Value* value) const { } RawString* RawString::Clone(StringPool* new_pool) const { - RawString* rs = new RawString(new_pool->MakeRef(*value)); + RawString* rs = new RawString(new_pool->MakeRef(value)); rs->comment_ = comment_; rs->source_ = source_; return rs; @@ -207,7 +207,7 @@ bool String::Flatten(android::Res_value* out_value) const { } String* String::Clone(StringPool* new_pool) const { - String* str = new String(new_pool->MakeRef(*value)); + String* str = new String(new_pool->MakeRef(value)); str->comment_ = comment_; str->source_ = source_; str->untranslatable_sections = untranslatable_sections; @@ -290,7 +290,7 @@ bool FileReference::Flatten(android::Res_value* out_value) const { } FileReference* FileReference::Clone(StringPool* new_pool) const { - FileReference* fr = new FileReference(new_pool->MakeRef(*path)); + FileReference* fr = new FileReference(new_pool->MakeRef(path)); fr->file = file; fr->comment_ = comment_; fr->source_ = source_; diff --git a/tools/aapt2/ResourceValues_test.cpp b/tools/aapt2/ResourceValues_test.cpp index 10f9b55ede08..a80a9dc177f1 100644 --- a/tools/aapt2/ResourceValues_test.cpp +++ b/tools/aapt2/ResourceValues_test.cpp @@ -18,6 +18,10 @@ #include "test/Test.h" +using ::testing::Eq; +using ::testing::SizeIs; +using ::testing::StrEq; + namespace aapt { TEST(ResourceValuesTest, PluralEquals) { @@ -148,6 +152,22 @@ TEST(ResourceValuesTest, StyleClone) { EXPECT_TRUE(a->Equals(b.get())); } +TEST(ResourcesValuesTest, StringClones) { + StringPool pool_a; + StringPool pool_b; + + String str_a(pool_a.MakeRef("hello", StringPool::Context(test::ParseConfigOrDie("en")))); + + ASSERT_THAT(pool_a, SizeIs(1u)); + EXPECT_THAT(pool_a.strings()[0]->context.config, Eq(test::ParseConfigOrDie("en"))); + EXPECT_THAT(pool_a.strings()[0]->value, StrEq("hello")); + + std::unique_ptr<String> str_b(str_a.Clone(&pool_b)); + ASSERT_THAT(pool_b, SizeIs(1u)); + EXPECT_THAT(pool_b.strings()[0]->context.config, Eq(test::ParseConfigOrDie("en"))); + EXPECT_THAT(pool_b.strings()[0]->value, StrEq("hello")); +} + TEST(ResourceValuesTest, StyleMerges) { StringPool pool_a; StringPool pool_b; diff --git a/tools/aapt2/StringPool.cpp b/tools/aapt2/StringPool.cpp index 705b1ab052af..3a1a18c01e1c 100644 --- a/tools/aapt2/StringPool.cpp +++ b/tools/aapt2/StringPool.cpp @@ -191,6 +191,13 @@ StringPool::Ref StringPool::MakeRefImpl(const StringPiece& str, const Context& c return Ref(borrow); } +StringPool::Ref StringPool::MakeRef(const Ref& ref) { + if (ref.entry_->pool_ == this) { + return ref; + } + return MakeRef(ref.entry_->value, ref.entry_->context); +} + StringPool::StyleRef StringPool::MakeRef(const StyleString& str) { return MakeRef(str, Context{}); } diff --git a/tools/aapt2/StringPool.h b/tools/aapt2/StringPool.h index 8350d0d09108..3c1f3dc3a1bb 100644 --- a/tools/aapt2/StringPool.h +++ b/tools/aapt2/StringPool.h @@ -49,6 +49,8 @@ struct StyleString { // Otherwise, the style data array would have to be sparse and take up more space. class StringPool { public: + using size_type = size_t; + class Context { public: enum : uint32_t { @@ -165,6 +167,9 @@ class StringPool { // when sorting the string pool. Returns a reference to the string in the pool. Ref MakeRef(const android::StringPiece& str, const Context& context); + // Adds a string from another string pool. Returns a reference to the string in the string pool. + Ref MakeRef(const Ref& ref); + // Adds a style to the string pool and returns a reference to it. StyleRef MakeRef(const StyleString& str); |