diff options
author | Adam Lesinski <adamlesinski@google.com> | 2015-11-16 17:35:44 -0800 |
---|---|---|
committer | Adam Lesinski <adamlesinski@google.com> | 2015-11-19 14:46:53 -0800 |
commit | 467f171315f9c2037fcd3eb5edcfabc40671bf7b (patch) | |
tree | 3b14762e3d9e42a660479d0d5722883b391f835b /tools/aapt2/ResourceUtils.cpp | |
parent | abf83cbe4f63cd76043aab89cd0e08525560fea2 (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.cpp | 60 |
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) { |