summaryrefslogtreecommitdiff
path: root/tools/aapt2/ResourceParser.cpp
diff options
context:
space:
mode:
author Adam Lesinski <adamlesinski@google.com> 2015-10-22 20:34:36 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2015-10-22 20:34:36 +0000
commit3b7acbb86207df78eccfeb40aabcc8543703a58f (patch)
tree83f34be40fa67c390d4edbbec8d7b85e450cc879 /tools/aapt2/ResourceParser.cpp
parent1b433617675c58e6878e5eccf1635a43b5377135 (diff)
parent9e10ac70155c993e7053323ad36beaea7bf7d54f (diff)
Merge "AAPT2: Process <java-symbols> and private symbol package"
Diffstat (limited to 'tools/aapt2/ResourceParser.cpp')
-rw-r--r--tools/aapt2/ResourceParser.cpp37
1 files changed, 32 insertions, 5 deletions
diff --git a/tools/aapt2/ResourceParser.cpp b/tools/aapt2/ResourceParser.cpp
index 63629f0d6c10..bfef9d06d742 100644
--- a/tools/aapt2/ResourceParser.cpp
+++ b/tools/aapt2/ResourceParser.cpp
@@ -18,10 +18,11 @@
#include "ResourceTable.h"
#include "ResourceUtils.h"
#include "ResourceValues.h"
-#include "util/Util.h"
#include "ValueVisitor.h"
#include "XmlPullParser.h"
+#include "util/Util.h"
+
#include <sstream>
namespace aapt {
@@ -184,7 +185,7 @@ struct ParsedResource {
ResourceName name;
Source source;
ResourceId id;
- bool markPublic = false;
+ SymbolState symbolState = SymbolState::kUndefined;
std::unique_ptr<Value> value;
std::list<ParsedResource> childResources;
};
@@ -192,8 +193,10 @@ struct ParsedResource {
// Recursively adds resources to the ResourceTable.
static bool addResourcesToTable(ResourceTable* table, const ConfigDescription& config,
IDiagnostics* diag, ParsedResource* res) {
- if (res->markPublic && !table->markPublic(res->name, res->id, res->source, diag)) {
- return false;
+ if (res->symbolState != SymbolState::kUndefined) {
+ if (!table->setSymbolState(res->name, res->id, res->source, res->symbolState, diag)) {
+ return false;
+ }
}
if (!res->value) {
@@ -318,6 +321,8 @@ bool ResourceParser::parseResources(XmlPullParser* parser) {
result = parseAttr(parser, &parsedResource);
} else if (elementName == u"public") {
result = parsePublic(parser, &parsedResource);
+ } else if (elementName == u"java-symbol" || elementName == u"symbol") {
+ result = parseSymbol(parser, &parsedResource);
} else {
mDiag->warn(DiagMessage(mSource.withLine(parser->getLineNumber()))
<< "unknown resource type '" << elementName << "'");
@@ -506,7 +511,29 @@ bool ResourceParser::parsePublic(XmlPullParser* parser, ParsedResource* outResou
outResource->value = util::make_unique<Id>();
}
- outResource->markPublic = true;
+ outResource->symbolState = SymbolState::kPublic;
+ return true;
+}
+
+bool ResourceParser::parseSymbol(XmlPullParser* parser, ParsedResource* outResource) {
+ const Source source = mSource.withLine(parser->getLineNumber());
+
+ Maybe<StringPiece16> maybeType = findNonEmptyAttribute(parser, u"type");
+ if (!maybeType) {
+ mDiag->error(DiagMessage(source) << "<" << parser->getElementName() << "> must have a "
+ "'type' attribute");
+ return false;
+ }
+
+ const ResourceType* parsedType = parseResourceType(maybeType.value());
+ if (!parsedType) {
+ mDiag->error(DiagMessage(source) << "invalid resource type '" << maybeType.value()
+ << "' in <" << parser->getElementName() << ">");
+ return false;
+ }
+
+ outResource->name.type = *parsedType;
+ outResource->symbolState = SymbolState::kPrivate;
return true;
}