Loading tools/aapt2/Debug.cpp +8 −4 Original line number Diff line number Diff line Loading @@ -52,13 +52,17 @@ struct PrintVisitor : public ValueVisitor { void visit(Style* style) override { std::cout << "(style)"; if (style->parent) { const Reference& parentRef = style->parent.value(); std::cout << " parent="; if (style->parent.value().name) { std::cout << style->parent.value().name.value() << " "; if (parentRef.name) { if (parentRef.privateReference) { std::cout << "*"; } std::cout << parentRef.name.value() << " "; } if (style->parent.value().id) { std::cout << style->parent.value().id.value(); if (parentRef.id) { std::cout << parentRef.id.value(); } } Loading tools/aapt2/ResourceParser_test.cpp +18 −8 Original line number Diff line number Diff line Loading @@ -215,7 +215,7 @@ TEST_F(ResourceParserTest, ParseFlagAttr) { ASSERT_TRUE(testParse(input)); Attribute* flagAttr = test::getValue<Attribute>(&mTable, u"@attr/foo"); ASSERT_NE(flagAttr, nullptr); ASSERT_NE(nullptr, flagAttr); EXPECT_EQ(flagAttr->typeMask, android::ResTable_map::TYPE_FLAGS); ASSERT_EQ(flagAttr->symbols.size(), 3u); Loading @@ -233,7 +233,7 @@ TEST_F(ResourceParserTest, ParseFlagAttr) { std::unique_ptr<BinaryPrimitive> flagValue = ResourceUtils::tryParseFlagSymbol(flagAttr, u"baz|bat"); ASSERT_NE(flagValue, nullptr); ASSERT_NE(nullptr, flagValue); EXPECT_EQ(flagValue->value.data, 1u | 2u); } Loading @@ -255,7 +255,7 @@ TEST_F(ResourceParserTest, ParseStyle) { ASSERT_TRUE(testParse(input)); Style* style = test::getValue<Style>(&mTable, u"@style/foo"); ASSERT_NE(style, nullptr); ASSERT_NE(nullptr, style); AAPT_ASSERT_TRUE(style->parent); AAPT_ASSERT_TRUE(style->parent.value().name); EXPECT_EQ(test::parseNameOrDie(u"@style/fu"), style->parent.value().name.value()); Loading @@ -276,7 +276,7 @@ TEST_F(ResourceParserTest, ParseStyleWithShorthandParent) { ASSERT_TRUE(testParse(input)); Style* style = test::getValue<Style>(&mTable, u"@style/foo"); ASSERT_NE(style, nullptr); ASSERT_NE(nullptr, style); AAPT_ASSERT_TRUE(style->parent); AAPT_ASSERT_TRUE(style->parent.value().name); EXPECT_EQ(test::parseNameOrDie(u"@com.app:style/Theme"), style->parent.value().name.value()); Loading @@ -288,7 +288,7 @@ TEST_F(ResourceParserTest, ParseStyleWithPackageAliasedParent) { ASSERT_TRUE(testParse(input)); Style* style = test::getValue<Style>(&mTable, u"@style/foo"); ASSERT_NE(style, nullptr); ASSERT_NE(nullptr, style); AAPT_ASSERT_TRUE(style->parent); AAPT_ASSERT_TRUE(style->parent.value().name); EXPECT_EQ(test::parseNameOrDie(u"@android:style/Theme"), style->parent.value().name.value()); Loading @@ -302,7 +302,7 @@ TEST_F(ResourceParserTest, ParseStyleWithPackageAliasedItems) { ASSERT_TRUE(testParse(input)); Style* style = test::getValue<Style>(&mTable, u"@style/foo"); ASSERT_NE(style, nullptr); ASSERT_NE(nullptr, style); ASSERT_EQ(1u, style->entries.size()); EXPECT_EQ(test::parseNameOrDie(u"@android:attr/bar"), style->entries[0].key.name.value()); } Loading @@ -312,7 +312,7 @@ TEST_F(ResourceParserTest, ParseStyleWithInferredParent) { ASSERT_TRUE(testParse(input)); Style* style = test::getValue<Style>(&mTable, u"@style/foo.bar"); ASSERT_NE(style, nullptr); ASSERT_NE(nullptr, style); AAPT_ASSERT_TRUE(style->parent); AAPT_ASSERT_TRUE(style->parent.value().name); EXPECT_EQ(style->parent.value().name.value(), test::parseNameOrDie(u"@style/foo")); Loading @@ -324,11 +324,21 @@ TEST_F(ResourceParserTest, ParseStyleWithInferredParentOverridenByEmptyParentAtt ASSERT_TRUE(testParse(input)); Style* style = test::getValue<Style>(&mTable, u"@style/foo.bar"); ASSERT_NE(style, nullptr); ASSERT_NE(nullptr, style); AAPT_EXPECT_FALSE(style->parent); EXPECT_FALSE(style->parentInferred); } TEST_F(ResourceParserTest, ParseStyleWithPrivateParentReference) { std::string input = R"EOF(<style name="foo" parent="*android:style/bar" />)EOF"; ASSERT_TRUE(testParse(input)); Style* style = test::getValue<Style>(&mTable, u"@style/foo"); ASSERT_NE(nullptr, style); AAPT_ASSERT_TRUE(style->parent); EXPECT_TRUE(style->parent.value().privateReference); } TEST_F(ResourceParserTest, ParseAutoGeneratedIdReference) { std::string input = "<string name=\"foo\">@+id/bar</string>"; ASSERT_TRUE(testParse(input)); Loading tools/aapt2/ResourceUtils.cpp +9 −8 Original line number Diff line number Diff line Loading @@ -176,10 +176,10 @@ bool isAttributeReference(const StringPiece16& str) { /* * Style parent's are a bit different. We accept the following formats: * * @[package:]style/<entry> * ?[package:]style/<entry> * <package>:[style/]<entry> * [package:style/]<entry> * @[[*]package:]style/<entry> * ?[[*]package:]style/<entry> * <[*]package>:[style/]<entry> * [[*]package:style/]<entry> */ Maybe<Reference> parseStyleParentReference(const StringPiece16& str, std::string* outError) { if (str.empty()) { Loading @@ -195,11 +195,12 @@ Maybe<Reference> parseStyleParentReference(const StringPiece16& str, std::string if (name.data()[0] == u'@' || name.data()[0] == u'?') { hasLeadingIdentifiers = true; name = name.substr(1, name.size() - 1); } if (name.data()[0] == u'*') { privateRef = true; name = name.substr(1, name.size() - 1); } } ResourceNameRef ref; ref.type = ResourceType::kStyle; Loading tools/aapt2/ResourceUtils_test.cpp +5 −0 Original line number Diff line number Diff line Loading @@ -157,6 +157,11 @@ TEST(ResourceUtilsTest, ParseStyleParentReference) { ref = ResourceUtils::parseStyleParentReference(u"foo", &errStr); AAPT_ASSERT_TRUE(ref); EXPECT_EQ(ref.value().name.value(), kStyleFooName); ref = ResourceUtils::parseStyleParentReference(u"*android:style/foo", &errStr); AAPT_ASSERT_TRUE(ref); EXPECT_EQ(ref.value().name.value(), kAndroidStyleFooName); EXPECT_TRUE(ref.value().privateReference); } } // namespace aapt tools/aapt2/ResourceValues.cpp +3 −0 Original line number Diff line number Diff line Loading @@ -457,6 +457,9 @@ Style* Style::clone(StringPool* newPool) const { void Style::print(std::ostream* out) const { *out << "(style) "; if (parent && parent.value().name) { if (parent.value().privateReference) { *out << "*"; } *out << parent.value().name.value(); } *out << " [" Loading Loading
tools/aapt2/Debug.cpp +8 −4 Original line number Diff line number Diff line Loading @@ -52,13 +52,17 @@ struct PrintVisitor : public ValueVisitor { void visit(Style* style) override { std::cout << "(style)"; if (style->parent) { const Reference& parentRef = style->parent.value(); std::cout << " parent="; if (style->parent.value().name) { std::cout << style->parent.value().name.value() << " "; if (parentRef.name) { if (parentRef.privateReference) { std::cout << "*"; } std::cout << parentRef.name.value() << " "; } if (style->parent.value().id) { std::cout << style->parent.value().id.value(); if (parentRef.id) { std::cout << parentRef.id.value(); } } Loading
tools/aapt2/ResourceParser_test.cpp +18 −8 Original line number Diff line number Diff line Loading @@ -215,7 +215,7 @@ TEST_F(ResourceParserTest, ParseFlagAttr) { ASSERT_TRUE(testParse(input)); Attribute* flagAttr = test::getValue<Attribute>(&mTable, u"@attr/foo"); ASSERT_NE(flagAttr, nullptr); ASSERT_NE(nullptr, flagAttr); EXPECT_EQ(flagAttr->typeMask, android::ResTable_map::TYPE_FLAGS); ASSERT_EQ(flagAttr->symbols.size(), 3u); Loading @@ -233,7 +233,7 @@ TEST_F(ResourceParserTest, ParseFlagAttr) { std::unique_ptr<BinaryPrimitive> flagValue = ResourceUtils::tryParseFlagSymbol(flagAttr, u"baz|bat"); ASSERT_NE(flagValue, nullptr); ASSERT_NE(nullptr, flagValue); EXPECT_EQ(flagValue->value.data, 1u | 2u); } Loading @@ -255,7 +255,7 @@ TEST_F(ResourceParserTest, ParseStyle) { ASSERT_TRUE(testParse(input)); Style* style = test::getValue<Style>(&mTable, u"@style/foo"); ASSERT_NE(style, nullptr); ASSERT_NE(nullptr, style); AAPT_ASSERT_TRUE(style->parent); AAPT_ASSERT_TRUE(style->parent.value().name); EXPECT_EQ(test::parseNameOrDie(u"@style/fu"), style->parent.value().name.value()); Loading @@ -276,7 +276,7 @@ TEST_F(ResourceParserTest, ParseStyleWithShorthandParent) { ASSERT_TRUE(testParse(input)); Style* style = test::getValue<Style>(&mTable, u"@style/foo"); ASSERT_NE(style, nullptr); ASSERT_NE(nullptr, style); AAPT_ASSERT_TRUE(style->parent); AAPT_ASSERT_TRUE(style->parent.value().name); EXPECT_EQ(test::parseNameOrDie(u"@com.app:style/Theme"), style->parent.value().name.value()); Loading @@ -288,7 +288,7 @@ TEST_F(ResourceParserTest, ParseStyleWithPackageAliasedParent) { ASSERT_TRUE(testParse(input)); Style* style = test::getValue<Style>(&mTable, u"@style/foo"); ASSERT_NE(style, nullptr); ASSERT_NE(nullptr, style); AAPT_ASSERT_TRUE(style->parent); AAPT_ASSERT_TRUE(style->parent.value().name); EXPECT_EQ(test::parseNameOrDie(u"@android:style/Theme"), style->parent.value().name.value()); Loading @@ -302,7 +302,7 @@ TEST_F(ResourceParserTest, ParseStyleWithPackageAliasedItems) { ASSERT_TRUE(testParse(input)); Style* style = test::getValue<Style>(&mTable, u"@style/foo"); ASSERT_NE(style, nullptr); ASSERT_NE(nullptr, style); ASSERT_EQ(1u, style->entries.size()); EXPECT_EQ(test::parseNameOrDie(u"@android:attr/bar"), style->entries[0].key.name.value()); } Loading @@ -312,7 +312,7 @@ TEST_F(ResourceParserTest, ParseStyleWithInferredParent) { ASSERT_TRUE(testParse(input)); Style* style = test::getValue<Style>(&mTable, u"@style/foo.bar"); ASSERT_NE(style, nullptr); ASSERT_NE(nullptr, style); AAPT_ASSERT_TRUE(style->parent); AAPT_ASSERT_TRUE(style->parent.value().name); EXPECT_EQ(style->parent.value().name.value(), test::parseNameOrDie(u"@style/foo")); Loading @@ -324,11 +324,21 @@ TEST_F(ResourceParserTest, ParseStyleWithInferredParentOverridenByEmptyParentAtt ASSERT_TRUE(testParse(input)); Style* style = test::getValue<Style>(&mTable, u"@style/foo.bar"); ASSERT_NE(style, nullptr); ASSERT_NE(nullptr, style); AAPT_EXPECT_FALSE(style->parent); EXPECT_FALSE(style->parentInferred); } TEST_F(ResourceParserTest, ParseStyleWithPrivateParentReference) { std::string input = R"EOF(<style name="foo" parent="*android:style/bar" />)EOF"; ASSERT_TRUE(testParse(input)); Style* style = test::getValue<Style>(&mTable, u"@style/foo"); ASSERT_NE(nullptr, style); AAPT_ASSERT_TRUE(style->parent); EXPECT_TRUE(style->parent.value().privateReference); } TEST_F(ResourceParserTest, ParseAutoGeneratedIdReference) { std::string input = "<string name=\"foo\">@+id/bar</string>"; ASSERT_TRUE(testParse(input)); Loading
tools/aapt2/ResourceUtils.cpp +9 −8 Original line number Diff line number Diff line Loading @@ -176,10 +176,10 @@ bool isAttributeReference(const StringPiece16& str) { /* * Style parent's are a bit different. We accept the following formats: * * @[package:]style/<entry> * ?[package:]style/<entry> * <package>:[style/]<entry> * [package:style/]<entry> * @[[*]package:]style/<entry> * ?[[*]package:]style/<entry> * <[*]package>:[style/]<entry> * [[*]package:style/]<entry> */ Maybe<Reference> parseStyleParentReference(const StringPiece16& str, std::string* outError) { if (str.empty()) { Loading @@ -195,11 +195,12 @@ Maybe<Reference> parseStyleParentReference(const StringPiece16& str, std::string if (name.data()[0] == u'@' || name.data()[0] == u'?') { hasLeadingIdentifiers = true; name = name.substr(1, name.size() - 1); } if (name.data()[0] == u'*') { privateRef = true; name = name.substr(1, name.size() - 1); } } ResourceNameRef ref; ref.type = ResourceType::kStyle; Loading
tools/aapt2/ResourceUtils_test.cpp +5 −0 Original line number Diff line number Diff line Loading @@ -157,6 +157,11 @@ TEST(ResourceUtilsTest, ParseStyleParentReference) { ref = ResourceUtils::parseStyleParentReference(u"foo", &errStr); AAPT_ASSERT_TRUE(ref); EXPECT_EQ(ref.value().name.value(), kStyleFooName); ref = ResourceUtils::parseStyleParentReference(u"*android:style/foo", &errStr); AAPT_ASSERT_TRUE(ref); EXPECT_EQ(ref.value().name.value(), kAndroidStyleFooName); EXPECT_TRUE(ref.value().privateReference); } } // namespace aapt
tools/aapt2/ResourceValues.cpp +3 −0 Original line number Diff line number Diff line Loading @@ -457,6 +457,9 @@ Style* Style::clone(StringPool* newPool) const { void Style::print(std::ostream* out) const { *out << "(style) "; if (parent && parent.value().name) { if (parent.value().privateReference) { *out << "*"; } *out << parent.value().name.value(); } *out << " [" Loading