summaryrefslogtreecommitdiff
path: root/tools/aapt2/ResourceUtils.cpp
diff options
context:
space:
mode:
authorAdam Lesinski <adamlesinski@google.com>2015-11-16 17:35:44 -0800
committerAdam Lesinski <adamlesinski@google.com>2015-11-19 14:46:53 -0800
commit467f171315f9c2037fcd3eb5edcfabc40671bf7b (patch)
tree3b14762e3d9e42a660479d0d5722883b391f835b /tools/aapt2/ResourceUtils.cpp
parentabf83cbe4f63cd76043aab89cd0e08525560fea2 (diff)
AAPT2: Fail compiling when private symbols are referenced
Also moved some XML specific stuff into its own directory, and refactored ReferenceLinker a bit. Change-Id: I912247a82023c1bbf72dc191fbdaf62858cbec0c
Diffstat (limited to 'tools/aapt2/ResourceUtils.cpp')
-rw-r--r--tools/aapt2/ResourceUtils.cpp60
1 files changed, 43 insertions, 17 deletions
diff --git a/tools/aapt2/ResourceUtils.cpp b/tools/aapt2/ResourceUtils.cpp
index b1a4c7dee73f..ffe6595cf0b6 100644
--- a/tools/aapt2/ResourceUtils.cpp
+++ b/tools/aapt2/ResourceUtils.cpp
@@ -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) {