From a6fe345be955368a13aea76aefb4db821aad11df Mon Sep 17 00:00:00 2001 From: Adam Lesinski Date: Wed, 9 Dec 2015 15:20:52 -0800 Subject: AAPT2: Fix overlay support Supports the tag and mimics old AAPT behavior of not allowing new resources defined unless was used or --auto-add-overlay was specified. Change-Id: I9b461137357617ade37fd7045b418b8e6450b9c4 --- tools/aapt2/ResourceParser.cpp | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) (limited to 'tools/aapt2/ResourceParser.cpp') diff --git a/tools/aapt2/ResourceParser.cpp b/tools/aapt2/ResourceParser.cpp index c2ddb5c233c1..d4c536f61c45 100644 --- a/tools/aapt2/ResourceParser.cpp +++ b/tools/aapt2/ResourceParser.cpp @@ -173,7 +173,7 @@ struct ParsedResource { ResourceName name; Source source; ResourceId id; - SymbolState symbolState = SymbolState::kUndefined; + Maybe symbolState; std::u16string comment; std::unique_ptr value; std::list childResources; @@ -182,9 +182,9 @@ struct ParsedResource { // Recursively adds resources to the ResourceTable. static bool addResourcesToTable(ResourceTable* table, const ConfigDescription& config, IDiagnostics* diag, ParsedResource* res) { - if (res->symbolState != SymbolState::kUndefined) { + if (res->symbolState) { Symbol symbol; - symbol.state = res->symbolState; + symbol.state = res->symbolState.value(); symbol.source = res->source; symbol.comment = res->comment; if (!table->setSymbolState(res->name, res->id, symbol, diag)) { @@ -325,6 +325,8 @@ bool ResourceParser::parseResources(xml::XmlPullParser* parser) { result = parseSymbol(parser, &parsedResource); } else if (elementName == u"public-group") { result = parsePublicGroup(parser, &parsedResource); + } else if (elementName == u"add-resource") { + result = parseAddResource(parser, &parsedResource); } else { // Try parsing the elementName (or type) as a resource. These shall only be // resources like 'layout' or 'xml' and they can only be references. @@ -643,7 +645,7 @@ bool ResourceParser::parsePublicGroup(xml::XmlPullParser* parser, ParsedResource return !error; } -bool ResourceParser::parseSymbol(xml::XmlPullParser* parser, ParsedResource* outResource) { +bool ResourceParser::parseSymbolImpl(xml::XmlPullParser* parser, ParsedResource* outResource) { const Source source = mSource.withLine(parser->getLineNumber()); Maybe maybeType = xml::findNonEmptyAttribute(parser, u"type"); @@ -661,10 +663,25 @@ bool ResourceParser::parseSymbol(xml::XmlPullParser* parser, ParsedResource* out } outResource->name.type = *parsedType; - outResource->symbolState = SymbolState::kPrivate; return true; } +bool ResourceParser::parseSymbol(xml::XmlPullParser* parser, ParsedResource* outResource) { + if (parseSymbolImpl(parser, outResource)) { + outResource->symbolState = SymbolState::kPrivate; + return true; + } + return false; +} + +bool ResourceParser::parseAddResource(xml::XmlPullParser* parser, ParsedResource* outResource) { + if (parseSymbolImpl(parser, outResource)) { + outResource->symbolState = SymbolState::kUndefined; + return true; + } + return false; +} + static uint32_t parseFormatType(const StringPiece16& piece) { if (piece == u"reference") return android::ResTable_map::TYPE_REFERENCE; else if (piece == u"string") return android::ResTable_map::TYPE_STRING; @@ -870,7 +887,7 @@ Maybe ResourceParser::parseEnumOrFlagItem(xml::XmlPullParser* } return Attribute::Symbol{ - Reference(ResourceName({}, ResourceType::kId, maybeName.value().toString())), + Reference(ResourceNameRef({}, ResourceType::kId, maybeName.value())), val.data }; } -- cgit v1.2.3-59-g8ed1b