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

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

Merge "AAPT2: Fail compiling when private symbols are referenced"

parents 7c149b52 467f1713
Loading
Loading
Loading
Loading
+6 −4
Original line number Diff line number Diff line
@@ -58,8 +58,9 @@ sources := \
	ResourceValues.cpp \
	SdkConstants.cpp \
	StringPool.cpp \
	XmlDom.cpp \
	XmlPullParser.cpp
	xml/XmlDom.cpp \
	xml/XmlPullParser.cpp \
	xml/XmlUtil.cpp

testSources := \
	compile/IdAssigner_test.cpp \
@@ -90,8 +91,9 @@ testSources := \
	ResourceUtils_test.cpp \
	StringPool_test.cpp \
	ValueVisitor_test.cpp \
	XmlDom_test.cpp \
	XmlPullParser_test.cpp
	xml/XmlDom_test.cpp \
	xml/XmlPullParser_test.cpp \
	xml/XmlUtil_test.cpp

toolSources := \
	compile/Compile.cpp \
+109 −130

File changed.

Preview size limit exceeded, changes collapsed.

+20 −20
Original line number Diff line number Diff line
@@ -22,10 +22,9 @@
#include "ResourceTable.h"
#include "ResourceValues.h"
#include "StringPool.h"
#include "XmlPullParser.h"

#include "util/Maybe.h"
#include "util/StringPiece.h"
#include "xml/XmlPullParser.h"

#include <memory>

@@ -57,7 +56,7 @@ public:

    ResourceParser(const ResourceParser&) = delete; // No copy.

    bool parse(XmlPullParser* parser);
    bool parse(xml::XmlPullParser* parser);

private:
    /*
@@ -66,7 +65,7 @@ private:
     * contains the escaped and whitespace trimmed text, while `outRawString`
     * contains the unescaped text. Returns true on success.
     */
    bool flattenXmlSubtree(XmlPullParser* parser, std::u16string* outRawString,
    bool flattenXmlSubtree(xml::XmlPullParser* parser, std::u16string* outRawString,
                           StyleString* outStyleString);

    /*
@@ -75,24 +74,25 @@ private:
     * If `allowRawValue` is true and the subtree can not be parsed as a regular Item, then a
     * RawString is returned. Otherwise this returns false;
     */
    std::unique_ptr<Item> parseXml(XmlPullParser* parser, const uint32_t typeMask,
    std::unique_ptr<Item> parseXml(xml::XmlPullParser* parser, const uint32_t typeMask,
                                   const bool allowRawValue);

    bool parseResources(XmlPullParser* parser);
    bool parseString(XmlPullParser* parser, ParsedResource* outResource);
    bool parseColor(XmlPullParser* parser, ParsedResource* outResource);
    bool parsePrimitive(XmlPullParser* parser, ParsedResource* outResource);
    bool parsePublic(XmlPullParser* parser, ParsedResource* outResource);
    bool parsePublicGroup(XmlPullParser* parser, ParsedResource* outResource);
    bool parseSymbol(XmlPullParser* parser, ParsedResource* outResource);
    bool parseAttr(XmlPullParser* parser, ParsedResource* outResource);
    bool parseAttrImpl(XmlPullParser* parser, ParsedResource* outResource, bool weak);
    Maybe<Attribute::Symbol> parseEnumOrFlagItem(XmlPullParser* parser, const StringPiece16& tag);
    bool parseStyle(XmlPullParser* parser, ParsedResource* outResource);
    bool parseStyleItem(XmlPullParser* parser, Style* style);
    bool parseDeclareStyleable(XmlPullParser* parser, ParsedResource* outResource);
    bool parseArray(XmlPullParser* parser, ParsedResource* outResource, uint32_t typeMask);
    bool parsePlural(XmlPullParser* parser, ParsedResource* outResource);
    bool parseResources(xml::XmlPullParser* parser);
    bool parseString(xml::XmlPullParser* parser, ParsedResource* outResource);
    bool parseColor(xml::XmlPullParser* parser, ParsedResource* outResource);
    bool parsePrimitive(xml::XmlPullParser* parser, ParsedResource* outResource);
    bool parsePublic(xml::XmlPullParser* parser, ParsedResource* outResource);
    bool parsePublicGroup(xml::XmlPullParser* parser, ParsedResource* outResource);
    bool parseSymbol(xml::XmlPullParser* parser, ParsedResource* outResource);
    bool parseAttr(xml::XmlPullParser* parser, ParsedResource* outResource);
    bool parseAttrImpl(xml::XmlPullParser* parser, ParsedResource* outResource, bool weak);
    Maybe<Attribute::Symbol> parseEnumOrFlagItem(xml::XmlPullParser* parser,
                                                 const StringPiece16& tag);
    bool parseStyle(xml::XmlPullParser* parser, ParsedResource* outResource);
    bool parseStyleItem(xml::XmlPullParser* parser, Style* style);
    bool parseDeclareStyleable(xml::XmlPullParser* parser, ParsedResource* outResource);
    bool parseArray(xml::XmlPullParser* parser, ParsedResource* outResource, uint32_t typeMask);
    bool parsePlural(xml::XmlPullParser* parser, ParsedResource* outResource);

    IDiagnostics* mDiag;
    ResourceTable* mTable;
+22 −4
Original line number Diff line number Diff line
@@ -18,9 +18,8 @@
#include "ResourceTable.h"
#include "ResourceUtils.h"
#include "ResourceValues.h"
#include "XmlPullParser.h"

#include "test/Context.h"
#include "xml/XmlPullParser.h"

#include <gtest/gtest.h>
#include <sstream>
@@ -36,7 +35,7 @@ TEST(ResourceParserSingleTest, FailToParseWithNoRootResourcesElement) {
    input << "<attr name=\"foo\"/>" << std::endl;
    ResourceTable table;
    ResourceParser parser(context->getDiagnostics(), &table, Source{ "test" }, {});
    XmlPullParser xmlParser(input);
    xml::XmlPullParser xmlParser(input);
    ASSERT_FALSE(parser.parse(&xmlParser));
}

@@ -56,7 +55,7 @@ struct ResourceParserTest : public ::testing::Test {
        parserOptions.product = product;
        ResourceParser parser(mContext->getDiagnostics(), &mTable, Source{ "test" }, {},
                              parserOptions);
        XmlPullParser xmlParser(input);
        xml::XmlPullParser xmlParser(input);
        if (parser.parse(&xmlParser)) {
            return ::testing::AssertionSuccess();
        }
@@ -360,6 +359,25 @@ TEST_F(ResourceParserTest, ParseAttributesDeclareStyleable) {
    EXPECT_EQ(test::parseNameOrDie(u"@attr/bat"), styleable->entries[1].name.value());
}

TEST_F(ResourceParserTest, ParsePrivateAttributesDeclareStyleable) {
    std::string input = "<declare-styleable name=\"foo\" xmlns:privAndroid=\"http://schemas.android.com/apk/prv/res/android\">\n"
                        "  <attr name=\"*android:bar\" />\n"
                        "  <attr name=\"privAndroid:bat\" />\n"
                        "</declare-styleable>";
    ASSERT_TRUE(testParse(input));
    Styleable* styleable = test::getValue<Styleable>(&mTable, u"@styleable/foo");
    ASSERT_NE(nullptr, styleable);
    ASSERT_EQ(2u, styleable->entries.size());

    EXPECT_TRUE(styleable->entries[0].privateReference);
    AAPT_ASSERT_TRUE(styleable->entries[0].name);
    EXPECT_EQ(std::u16string(u"android"), styleable->entries[0].name.value().package);

    EXPECT_TRUE(styleable->entries[1].privateReference);
    AAPT_ASSERT_TRUE(styleable->entries[1].name);
    EXPECT_EQ(std::u16string(u"android"), styleable->entries[1].name.value().package);
}

TEST_F(ResourceParserTest, ParseArray) {
    std::string input = "<array name=\"foo\">\n"
                        "  <item>@string/ref</item>\n"
+43 −17
Original line number Diff line number Diff line
@@ -15,6 +15,7 @@
 */

#include "ResourceUtils.h"
#include "flatten/ResourceTypeExtensions.h"
#include "util/Util.h"

#include <androidfw/ResourceTypes.h>
@@ -47,6 +48,42 @@ bool extractResourceName(const StringPiece16& str, StringPiece16* outPackage,
    return !(hasPackageSeparator && outPackage->empty()) && !(hasTypeSeparator && outType->empty());
}

bool parseResourceName(const StringPiece16& str, ResourceNameRef* outRef, bool* outPrivate) {
    size_t offset = 0;
    bool priv = false;
    if (str.data()[0] == u'*') {
        priv = true;
        offset = 1;
    }

    StringPiece16 package;
    StringPiece16 type;
    StringPiece16 entry;
    if (!extractResourceName(str.substr(offset, str.size() - offset), &package, &type, &entry)) {
        return false;
    }

    const ResourceType* parsedType = parseResourceType(type);
    if (!parsedType) {
        return false;
    }

    if (entry.empty()) {
        return false;
    }

    if (outRef) {
        outRef->package = package;
        outRef->type = *parsedType;
        outRef->entry = entry;
    }

    if (outPrivate) {
        *outPrivate = priv;
    }
    return true;
}

bool tryParseReference(const StringPiece16& str, ResourceNameRef* outRef, bool* outCreate,
                       bool* outPrivate) {
    StringPiece16 trimmedStr(util::trimWhitespace(str));
@@ -61,35 +98,24 @@ bool tryParseReference(const StringPiece16& str, ResourceNameRef* outRef, bool*
        if (trimmedStr.data()[1] == u'+') {
            create = true;
            offset += 1;
        } else if (trimmedStr.data()[1] == u'*') {
            priv = true;
            offset += 1;
        }
        StringPiece16 package;
        StringPiece16 type;
        StringPiece16 entry;
        if (!extractResourceName(trimmedStr.substr(offset, trimmedStr.size() - offset),
                                 &package, &type, &entry)) {
            return false;
        }

        const ResourceType* parsedType = parseResourceType(type);
        if (!parsedType) {
        ResourceNameRef name;
        if (!parseResourceName(trimmedStr.substr(offset, trimmedStr.size() - offset),
                               &name, &priv)) {
            return false;
        }

        if (entry.empty()) {
        if (create && priv) {
            return false;
        }

        if (create && *parsedType != ResourceType::kId) {
        if (create && name.type != ResourceType::kId) {
            return false;
        }

        if (outRef) {
            outRef->package = package;
            outRef->type = *parsedType;
            outRef->entry = entry;
            *outRef = name;
        }

        if (outCreate) {
Loading