summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Adam Lesinski <adamlesinski@google.com> 2017-10-19 22:23:58 +0000
committer android-build-merger <android-build-merger@google.com> 2017-10-19 22:23:58 +0000
commitc2e67f4b5ca13a847689a6b36fc40efa9c0c5301 (patch)
treed67e689da858981c284971ae27036a49073a586b
parent0f56a1014a794e06caf38b1d84a7bd6931e50853 (diff)
parent5fae742a1e5ff0dcfa870b4521a9db796d9db4f9 (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.cpp6
-rw-r--r--tools/aapt2/ResourceValues_test.cpp20
-rw-r--r--tools/aapt2/StringPool.cpp7
-rw-r--r--tools/aapt2/StringPool.h5
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);