AAPT2: Fix overlay support
Supports the <add-resource> tag and mimics old AAPT behavior of
not allowing new resources defined unless <add-resource> was used
or --auto-add-overlay was specified.
Change-Id: I9b461137357617ade37fd7045b418b8e6450b9c4
diff --git a/tools/aapt2/ResourceTable.cpp b/tools/aapt2/ResourceTable.cpp
index 73d8585..8a3d047 100644
--- a/tools/aapt2/ResourceTable.cpp
+++ b/tools/aapt2/ResourceTable.cpp
@@ -101,7 +101,7 @@
if (iter != last && (*iter)->type == type) {
return iter->get();
}
- return types.emplace(iter, new ResourceTableType{ type })->get();
+ return types.emplace(iter, new ResourceTableType(type))->get();
}
ResourceEntry* ResourceTableType::findEntry(const StringPiece16& name) {
@@ -121,7 +121,7 @@
if (iter != last && name == (*iter)->name) {
return iter->get();
}
- return entries.emplace(iter, new ResourceEntry{ name })->get();
+ return entries.emplace(iter, new ResourceEntry(name))->get();
}
/**
@@ -342,11 +342,6 @@
IDiagnostics* diag) {
assert(diag && "diagnostics can't be nullptr");
- if (symbol.state == SymbolState::kUndefined) {
- // Nothing to do.
- return true;
- }
-
auto badCharIter = util::findNonAlphaNumericAndNotInSet(name.entry, validChars);
if (badCharIter != name.entry.end()) {
diag->error(DiagMessage(symbol.source)
@@ -400,23 +395,30 @@
return false;
}
- // Only mark the type state as public, it doesn't care about being private.
- if (symbol.state == SymbolState::kPublic) {
- type->symbolStatus.state = SymbolState::kPublic;
- }
-
- // Downgrading to a private symbol from a public one is not allowed.
- if (entry->symbolStatus.state != SymbolState::kPublic) {
- if (entry->symbolStatus.state != symbol.state) {
- entry->symbolStatus = std::move(symbol);
- }
- }
-
if (resId.isValid()) {
package->id = resId.packageId();
type->id = resId.typeId();
entry->id = resId.entryId();
}
+
+ // Only mark the type state as public, it doesn't care about being private.
+ if (symbol.state == SymbolState::kPublic) {
+ type->symbolStatus.state = SymbolState::kPublic;
+ }
+
+ if (symbol.state == SymbolState::kUndefined &&
+ entry->symbolStatus.state != SymbolState::kUndefined) {
+ // We can't undefine a symbol (remove its visibility). Ignore.
+ return true;
+ }
+
+ if (symbol.state == SymbolState::kPrivate &&
+ entry->symbolStatus.state == SymbolState::kPublic) {
+ // We can't downgrade public to private. Ignore.
+ return true;
+ }
+
+ entry->symbolStatus = std::move(symbol);
return true;
}