AAPT2: Debug: Dump only targetted style
Change-Id: Id7c5a4b5d0880520e1fea05e5a31d398946c5f05
diff --git a/tools/aapt2/Debug.cpp b/tools/aapt2/Debug.cpp
index a7b9bba..cf222c6 100644
--- a/tools/aapt2/Debug.cpp
+++ b/tools/aapt2/Debug.cpp
@@ -23,6 +23,7 @@
#include <iostream>
#include <map>
#include <memory>
+#include <queue>
#include <set>
#include <vector>
@@ -135,43 +136,53 @@
return std::distance(names.begin(), iter);
}
-void Debug::printStyleGraph(const std::shared_ptr<ResourceTable>& table) {
- std::vector<ResourceName> names;
+void Debug::printStyleGraph(const std::shared_ptr<ResourceTable>& table,
+ const ResourceName& targetStyle) {
std::map<ResourceName, std::set<ResourceName>> graph;
- for (const auto& type : *table) {
- for (const auto& entry : type->entries) {
- ResourceName name = { table->getPackage(), type->type, entry->name };
+ std::queue<ResourceName> stylesToVisit;
+ stylesToVisit.push(targetStyle);
+ for (; !stylesToVisit.empty(); stylesToVisit.pop()) {
+ const ResourceName& styleName = stylesToVisit.front();
+ std::set<ResourceName>& parents = graph[styleName];
+ if (!parents.empty()) {
+ // We've already visited this style.
+ continue;
+ }
+
+ const ResourceTableType* type;
+ const ResourceEntry* entry;
+ std::tie(type, entry) = table->findResource(styleName);
+ if (entry) {
for (const auto& value : entry->values) {
visitFunc<Style>(*value.value, [&](const Style& style) {
if (style.parent.name.isValid()) {
- names.push_back(style.parent.name);
- names.push_back(name);
- graph[style.parent.name].insert(name);
+ parents.insert(style.parent.name);
+ stylesToVisit.push(style.parent.name);
}
});
}
}
}
- std::sort(names.begin(), names.end());
- auto it1 = std::unique(names.begin(), names.end());
- names.resize(std::distance(names.begin(), it1));
+ std::vector<ResourceName> names;
+ for (const auto& entry : graph) {
+ names.push_back(entry.first);
+ }
std::cout << "digraph styles {\n";
-
for (const auto& name : names) {
std::cout << " node_" << getNodeIndex(names, name)
- << " [label=\"" << name.entry << "\"];\n";
+ << " [label=\"" << name << "\"];\n";
}
for (const auto& entry : graph) {
- const ResourceName& parent = entry.first;
- size_t parentNodeIndex = getNodeIndex(names, parent);
+ const ResourceName& styleName = entry.first;
+ size_t styleNodeIndex = getNodeIndex(names, styleName);
- for (const auto& childName : entry.second) {
- std::cout << "node_" << getNodeIndex(names, childName) << " -> "
- << "node_" << parentNodeIndex << ";\n";
+ for (const auto& parentName : entry.second) {
+ std::cout << " node_" << styleNodeIndex << " -> "
+ << "node_" << getNodeIndex(names, parentName) << ";\n";
}
}