Merge "AAPT2: Ensure strings are sorted by configuration" into oc-mr1-dev

This commit is contained in:
TreeHugger Robot
2017-10-19 21:31:10 +00:00
committed by Android (Google) Code Review
4 changed files with 35 additions and 3 deletions

View File

@@ -55,7 +55,7 @@ bool RawString::Equals(const Value* value) const {
} }
RawString* RawString::Clone(StringPool* new_pool) 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->comment_ = comment_;
rs->source_ = source_; rs->source_ = source_;
return rs; return rs;
@@ -197,7 +197,7 @@ bool String::Flatten(android::Res_value* out_value) const {
} }
String* String::Clone(StringPool* new_pool) 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->comment_ = comment_;
str->source_ = source_; str->source_ = source_;
str->untranslatable_sections = untranslatable_sections; str->untranslatable_sections = untranslatable_sections;
@@ -280,7 +280,7 @@ bool FileReference::Flatten(android::Res_value* out_value) const {
} }
FileReference* FileReference::Clone(StringPool* new_pool) 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->file = file;
fr->comment_ = comment_; fr->comment_ = comment_;
fr->source_ = source_; fr->source_ = source_;

View File

@@ -18,6 +18,10 @@
#include "test/Test.h" #include "test/Test.h"
using ::testing::Eq;
using ::testing::SizeIs;
using ::testing::StrEq;
namespace aapt { namespace aapt {
TEST(ResourceValuesTest, PluralEquals) { TEST(ResourceValuesTest, PluralEquals) {
@@ -148,6 +152,22 @@ TEST(ResourceValuesTest, StyleClone) {
EXPECT_TRUE(a->Equals(b.get())); 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) { TEST(ResourceValuesTest, StyleMerges) {
StringPool pool_a; StringPool pool_a;
StringPool pool_b; StringPool pool_b;

View File

@@ -191,6 +191,13 @@ StringPool::Ref StringPool::MakeRefImpl(const StringPiece& str, const Context& c
return Ref(borrow); 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) { StringPool::StyleRef StringPool::MakeRef(const StyleString& str) {
return MakeRef(str, Context{}); return MakeRef(str, Context{});
} }

View File

@@ -49,6 +49,8 @@ struct StyleString {
// Otherwise, the style data array would have to be sparse and take up more space. // Otherwise, the style data array would have to be sparse and take up more space.
class StringPool { class StringPool {
public: public:
using size_type = size_t;
class Context { class Context {
public: public:
enum : uint32_t { enum : uint32_t {
@@ -165,6 +167,9 @@ class StringPool {
// when sorting the string pool. Returns a reference to the string in the pool. // when sorting the string pool. Returns a reference to the string in the pool.
Ref MakeRef(const android::StringPiece& str, const Context& context); 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. // Adds a style to the string pool and returns a reference to it.
StyleRef MakeRef(const StyleString& str); StyleRef MakeRef(const StyleString& str);