diff options
Diffstat (limited to 'tools/aapt2/process/SymbolTable.cpp')
-rw-r--r-- | tools/aapt2/process/SymbolTable.cpp | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/tools/aapt2/process/SymbolTable.cpp b/tools/aapt2/process/SymbolTable.cpp index fc4c9b537e73..ef2e448b68b8 100644 --- a/tools/aapt2/process/SymbolTable.cpp +++ b/tools/aapt2/process/SymbolTable.cpp @@ -114,6 +114,16 @@ const SymbolTable::Symbol* SymbolTable::FindByName(const ResourceName& name) { return shared_symbol.get(); } +const SymbolTable::Symbol* SymbolTable::FindByNameInAnyPackage(const ResourceName& name) { + for (auto& source : sources_) { + std::string package = source->GetPackageForSymbol(name); + if (!package.empty()) { + return FindByName(ResourceName(package, name.type, name.entry)); + } + } + return {}; +} + const SymbolTable::Symbol* SymbolTable::FindById(const ResourceId& id) { if (const std::shared_ptr<Symbol>& s = id_cache_.get(id)) { return s.get(); @@ -211,6 +221,25 @@ std::unique_ptr<SymbolTable::Symbol> ResourceTableSymbolSource::FindByName( return symbol; } +std::string ResourceTableSymbolSource::GetPackageForSymbol(const ResourceName& name) { + for (auto& package : table_->packages) { + ResourceTableType* type = package->FindType(name.type); + if (type == nullptr) { + continue; + } + ResourceEntry* entry = type->FindEntry(name.entry); + if (entry == nullptr) { + continue; + } + return package->name; + } + if (name.type == ResourceType::kAttr) { + // Recurse and try looking up a private attribute. + return GetPackageForSymbol(ResourceName(name.package, ResourceType::kAttrPrivate, name.entry)); + } + return {}; +} + bool AssetManagerSymbolSource::AddAssetPath(const StringPiece& path) { int32_t cookie = 0; return assets_.addAssetPath(android::String8(path.data(), path.size()), &cookie); |