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

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

Merge "AAPT2: Add Inline Complex XML support"

parents 9af92f3c 5eeaaddf
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ LOCAL_PATH:= $(call my-dir)
main := Main.cpp
sources := \
	compile/IdAssigner.cpp \
	compile/InlineXmlFormatParser.cpp \
	compile/Png.cpp \
	compile/PseudolocaleGenerator.cpp \
	compile/Pseudolocalizer.cpp \
@@ -31,6 +32,7 @@ sources := \
	flatten/Archive.cpp \
	flatten/TableFlattener.cpp \
	flatten/XmlFlattener.cpp \
	io/File.cpp \
	io/FileSystem.cpp \
	io/ZipArchive.cpp \
	link/AutoVersioner.cpp \
@@ -77,6 +79,7 @@ sources += Format.proto

testSources := \
	compile/IdAssigner_test.cpp \
	compile/InlineXmlFormatParser_test.cpp \
	compile/PseudolocaleGenerator_test.cpp \
	compile/Pseudolocalizer_test.cpp \
	compile/XmlIdCollector_test.cpp \
+54 −0
Original line number Diff line number Diff line
@@ -247,5 +247,59 @@ void Debug::dumpHex(const void* data, size_t len) {
    }
}

namespace {

class XmlPrinter : public xml::Visitor {
public:
    using xml::Visitor::visit;

    void visit(xml::Element* el) override {
        std::cerr << mPrefix;
        std::cerr << "E: ";
        if (!el->namespaceUri.empty()) {
            std::cerr << el->namespaceUri << ":";
        }
        std::cerr << el->name << " (line=" << el->lineNumber << ")\n";

        for (const xml::Attribute& attr : el->attributes) {
            std::cerr << mPrefix << "  A: ";
            if (!attr.namespaceUri.empty()) {
                std::cerr << attr.namespaceUri << ":";
            }
            std::cerr << attr.name << "=" << attr.value << "\n";
        }

        const size_t previousSize = mPrefix.size();
        mPrefix += "  ";
        xml::Visitor::visit(el);
        mPrefix.resize(previousSize);
    }

    void visit(xml::Namespace* ns) override {
        std::cerr << mPrefix;
        std::cerr << "N: " << ns->namespacePrefix << "=" << ns->namespaceUri
                << " (line=" << ns->lineNumber << ")\n";

        const size_t previousSize = mPrefix.size();
        mPrefix += "  ";
        xml::Visitor::visit(ns);
        mPrefix.resize(previousSize);
    }

    void visit(xml::Text* text) override {
        std::cerr << mPrefix;
        std::cerr << "T: '" << text->text << "'\n";
    }

private:
    std::string mPrefix;
};

} // namespace

void Debug::dumpXml(xml::XmlResource* doc) {
    XmlPrinter printer;
    doc->root->accept(&printer);
}

} // namespace aapt
+2 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@

#include "Resource.h"
#include "ResourceTable.h"
#include "xml/XmlDom.h"

// Include for printf-like debugging.
#include <iostream>
@@ -34,6 +35,7 @@ struct Debug {
    static void printStyleGraph(ResourceTable* table,
                                const ResourceName& targetStyle);
    static void dumpHex(const void* data, size_t len);
    static void dumpXml(xml::XmlResource* doc);
};

} // namespace aapt
+2 −31
Original line number Diff line number Diff line
@@ -925,35 +925,6 @@ Maybe<Attribute::Symbol> ResourceParser::parseEnumOrFlagItem(xml::XmlPullParser*
            Reference(ResourceNameRef({}, ResourceType::kId, maybeName.value())), val.data };
}

static Maybe<Reference> parseXmlAttributeName(StringPiece str) {
    str = util::trimWhitespace(str);
    const char* start = str.data();
    const char* const end = start + str.size();
    const char* p = start;

    Reference ref;
    if (p != end && *p == '*') {
        ref.privateReference = true;
        start++;
        p++;
    }

    StringPiece package;
    StringPiece name;
    while (p != end) {
        if (*p == ':') {
            package = StringPiece(start, p - start);
            name = StringPiece(p + 1, end - (p + 1));
            break;
        }
        p++;
    }

    ref.name = ResourceName(package.toString(), ResourceType::kAttr,
                        name.empty() ? str.toString() : name.toString());
    return Maybe<Reference>(std::move(ref));
}

bool ResourceParser::parseStyleItem(xml::XmlPullParser* parser, Style* style) {
    const Source source = mSource.withLine(parser->getLineNumber());

@@ -963,7 +934,7 @@ bool ResourceParser::parseStyleItem(xml::XmlPullParser* parser, Style* style) {
        return false;
    }

    Maybe<Reference> maybeKey = parseXmlAttributeName(maybeName.value());
    Maybe<Reference> maybeKey = ResourceUtils::parseXmlAttributeName(maybeName.value());
    if (!maybeKey) {
        mDiag->error(DiagMessage(source) << "invalid attribute name '" << maybeName.value() << "'");
        return false;
@@ -1226,7 +1197,7 @@ bool ResourceParser::parseDeclareStyleable(xml::XmlPullParser* parser,

            // If this is a declaration, the package name may be in the name. Separate these out.
            // Eg. <attr name="android:text" />
            Maybe<Reference> maybeRef = parseXmlAttributeName(maybeName.value());
            Maybe<Reference> maybeRef = ResourceUtils::parseXmlAttributeName(maybeName.value());
            if (!maybeRef) {
                mDiag->error(DiagMessage(itemSource) << "<attr> tag has invalid name '"
                             << maybeName.value() << "'");
+1 −1
Original line number Diff line number Diff line
@@ -327,7 +327,7 @@ bool ResourceTable::addFileReferenceImpl(const ResourceNameRef& name,
    fileRef->setSource(source);
    fileRef->file = file;
    return addResourceImpl(name, ResourceId{}, config, StringPiece{}, std::move(fileRef),
                           kValidNameChars, resolveValueCollision, diag);
                           validChars, resolveValueCollision, diag);
}

bool ResourceTable::addResourceAllowMangled(const ResourceNameRef& name,
Loading