diff options
Diffstat (limited to 'tools/aapt2/Debug.cpp')
-rw-r--r-- | tools/aapt2/Debug.cpp | 158 |
1 files changed, 87 insertions, 71 deletions
diff --git a/tools/aapt2/Debug.cpp b/tools/aapt2/Debug.cpp index cf222c68de55..84f438520e90 100644 --- a/tools/aapt2/Debug.cpp +++ b/tools/aapt2/Debug.cpp @@ -17,7 +17,8 @@ #include "Debug.h" #include "ResourceTable.h" #include "ResourceValues.h" -#include "Util.h" +#include "util/Util.h" +#include "ValueVisitor.h" #include <algorithm> #include <iostream> @@ -29,102 +30,119 @@ namespace aapt { -struct PrintVisitor : ConstValueVisitor { - void visit(const Attribute& attr, ValueVisitorArgs&) override { +struct PrintVisitor : public ValueVisitor { + using ValueVisitor::visit; + + void visit(Attribute* attr) override { std::cout << "(attr) type="; - attr.printMask(std::cout); + attr->printMask(&std::cout); static constexpr uint32_t kMask = android::ResTable_map::TYPE_ENUM | android::ResTable_map::TYPE_FLAGS; - if (attr.typeMask & kMask) { - for (const auto& symbol : attr.symbols) { - std::cout << "\n " - << symbol.symbol.name.entry << " (" << symbol.symbol.id << ") = " - << symbol.value; + if (attr->typeMask & kMask) { + for (const auto& symbol : attr->symbols) { + std::cout << "\n " << symbol.symbol.name.value().entry; + if (symbol.symbol.id) { + std::cout << " (" << symbol.symbol.id.value() << ")"; + } + std::cout << " = " << symbol.value; } } } - void visit(const Style& style, ValueVisitorArgs&) override { + void visit(Style* style) override { std::cout << "(style)"; - if (style.parent.name.isValid() || style.parent.id.isValid()) { + if (style->parent) { std::cout << " parent="; - if (style.parent.name.isValid()) { - std::cout << style.parent.name << " "; + if (style->parent.value().name) { + std::cout << style->parent.value().name.value() << " "; } - if (style.parent.id.isValid()) { - std::cout << style.parent.id; + if (style->parent.value().id) { + std::cout << style->parent.value().id.value(); } } - for (const auto& entry : style.entries) { + for (const auto& entry : style->entries) { std::cout << "\n "; - if (entry.key.name.isValid()) { - std::cout << entry.key.name.package << ":" << entry.key.name.entry; + if (entry.key.name) { + std::cout << entry.key.name.value().package << ":" << entry.key.name.value().entry; } - if (entry.key.id.isValid()) { - std::cout << "(" << entry.key.id << ")"; + if (entry.key.id) { + std::cout << "(" << entry.key.id.value() << ")"; } std::cout << "=" << *entry.value; } } - void visit(const Array& array, ValueVisitorArgs&) override { - array.print(std::cout); + void visit(Array* array) override { + array->print(&std::cout); } - void visit(const Plural& plural, ValueVisitorArgs&) override { - plural.print(std::cout); + void visit(Plural* plural) override { + plural->print(&std::cout); } - void visit(const Styleable& styleable, ValueVisitorArgs&) override { - styleable.print(std::cout); + void visit(Styleable* styleable) override { + styleable->print(&std::cout); } - void visitItem(const Item& item, ValueVisitorArgs& args) override { - item.print(std::cout); + void visitItem(Item* item) override { + item->print(&std::cout); } }; -void Debug::printTable(const std::shared_ptr<ResourceTable>& table) { - std::cout << "Package name=" << table->getPackage(); - if (table->getPackageId() != ResourceTable::kUnsetPackageId) { - std::cout << " id=" << std::hex << table->getPackageId() << std::dec; - } - std::cout << std::endl; - - for (const auto& type : *table) { - std::cout << " type " << type->type; - if (type->typeId != ResourceTableType::kUnsetTypeId) { - std::cout << " id=" << std::hex << type->typeId << std::dec; - } - std::cout << " entryCount=" << type->entries.size() << std::endl; - - std::vector<const ResourceEntry*> sortedEntries; - for (const auto& entry : type->entries) { - auto iter = std::lower_bound(sortedEntries.begin(), sortedEntries.end(), entry.get(), - [](const ResourceEntry* a, const ResourceEntry* b) -> bool { - return a->entryId < b->entryId; - }); - sortedEntries.insert(iter, entry.get()); +void Debug::printTable(ResourceTable* table) { + for (auto& package : table->packages) { + std::cout << "Package name=" << package->name; + if (package->id) { + std::cout << " id=" << std::hex << (int) package->id.value() << std::dec; } + std::cout << std::endl; - for (const ResourceEntry* entry : sortedEntries) { - ResourceId id = { table->getPackageId(), type->typeId, entry->entryId }; - ResourceName name = { table->getPackage(), type->type, entry->name }; - std::cout << " spec resource " << id << " " << name; - if (entry->publicStatus.isPublic) { - std::cout << " PUBLIC"; + for (const auto& type : package->types) { + std::cout << " type " << type->type; + if (type->id) { + std::cout << " id=" << std::hex << (int) type->id.value() << std::dec; + } + std::cout << " entryCount=" << type->entries.size() << std::endl; + + std::vector<const ResourceEntry*> sortedEntries; + for (const auto& entry : type->entries) { + auto iter = std::lower_bound(sortedEntries.begin(), sortedEntries.end(), entry.get(), + [](const ResourceEntry* a, const ResourceEntry* b) -> bool { + if (a->id && b->id) { + return a->id.value() < b->id.value(); + } else if (a->id) { + return true; + } else { + return false; + } + }); + sortedEntries.insert(iter, entry.get()); } - std::cout << std::endl; - PrintVisitor visitor; - for (const auto& value : entry->values) { - std::cout << " (" << value.config << ") "; - value.value->accept(visitor, {}); + for (const ResourceEntry* entry : sortedEntries) { + ResourceId id = { + package->id ? package->id.value() : uint8_t(0), + type->id ? type->id.value() : uint8_t(0), + entry->id ? entry->id.value() : uint16_t(0) + }; + + ResourceName name = { package->name, type->type, entry->name }; + std::cout << " spec resource " << id << " " << name; + if (entry->publicStatus.isPublic) { + std::cout << " PUBLIC"; + } std::cout << std::endl; + + PrintVisitor visitor; + for (const auto& value : entry->values) { + std::cout << " (" << value.config << ") "; + value.value->accept(&visitor); + std::cout << std::endl; + } } } } @@ -136,8 +154,7 @@ static size_t getNodeIndex(const std::vector<ResourceName>& names, const Resourc return std::distance(names.begin(), iter); } -void Debug::printStyleGraph(const std::shared_ptr<ResourceTable>& table, - const ResourceName& targetStyle) { +void Debug::printStyleGraph(ResourceTable* table, const ResourceName& targetStyle) { std::map<ResourceName, std::set<ResourceName>> graph; std::queue<ResourceName> stylesToVisit; @@ -150,17 +167,16 @@ void Debug::printStyleGraph(const std::shared_ptr<ResourceTable>& table, continue; } - const ResourceTableType* type; - const ResourceEntry* entry; - std::tie(type, entry) = table->findResource(styleName); - if (entry) { + Maybe<ResourceTable::SearchResult> result = table->findResource(styleName); + if (result) { + ResourceEntry* entry = result.value().entry; for (const auto& value : entry->values) { - visitFunc<Style>(*value.value, [&](const Style& style) { - if (style.parent.name.isValid()) { - parents.insert(style.parent.name); - stylesToVisit.push(style.parent.name); + if (Style* style = valueCast<Style>(value.value.get())) { + if (style->parent && style->parent.value().name) { + parents.insert(style->parent.value().name.value()); + stylesToVisit.push(style->parent.value().name.value()); } - }); + } } } } |