Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f68f066c authored by Adam Lesinski's avatar Adam Lesinski Committed by Android (Google) Code Review
Browse files

Merge "AAPT2: Fix references to private parent"

parents 457a7e74 24b8ff0f
Loading
Loading
Loading
Loading
+8 −4
Original line number Diff line number Diff line
@@ -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();
            }
        }

+18 −8
Original line number Diff line number Diff line
@@ -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);

@@ -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);
}

@@ -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());
@@ -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());
@@ -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());
@@ -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());
}
@@ -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"));
@@ -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));
+9 −8
Original line number Diff line number Diff line
@@ -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()) {
@@ -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;
+5 −0
Original line number Diff line number Diff line
@@ -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
+3 −0
Original line number Diff line number Diff line
@@ -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