data: increased parse and graph assembly performance

* removed header search in subdirectories of header search paths
* cache file node ids in Storage for faster lookup
* retrieve node names from SearchIndex
* fixed addNodeAndAllChildren also called for member edges
* added check if node already present in addEdgeAndAllChildren
This commit is contained in:
Eberhard Graether
2015-09-23 09:26:03 +02:00
parent e9d45a507a
commit 78c1b32797
27 changed files with 308 additions and 260 deletions
@@ -49,13 +49,13 @@ void CodeController::handleMessage(MessageActivateTokens* message)
return;
}
TokenLocationCollection collection = m_storageAccess->getTokenLocationsForTokenIds(activeTokenIds);
view->showCodeSnippets(getSnippetsForActiveTokenLocations(collection, declarationId));
std::shared_ptr<TokenLocationCollection> collection = m_storageAccess->getTokenLocationsForTokenIds(activeTokenIds);
view->showCodeSnippets(getSnippetsForActiveTokenLocations(collection.get(), declarationId));
if (!message->isFromSystem)
{
size_t fileCount = collection.getTokenLocationFileCount();
size_t referenceCount = collection.getTokenLocationCount();
size_t fileCount = collection->getTokenLocationFileCount();
size_t referenceCount = collection->getTokenLocationCount();
std::stringstream ss;
ss << message->tokenIds.size() << ' ';
@@ -123,17 +123,17 @@ void CodeController::handleMessage(MessageShowFile* message)
void CodeController::handleMessage(MessageShowScope* message)
{
TokenLocationCollection collection =
std::shared_ptr<TokenLocationCollection> collection =
m_storageAccess->getTokenLocationsForLocationIds(std::vector<Id>(1, message->scopeLocationId));
TokenLocation* location = collection.findTokenLocationById(message->scopeLocationId);
TokenLocation* location = collection->findTokenLocationById(message->scopeLocationId);
if (!location || !location->isScopeTokenLocation() || !location->getOtherTokenLocation())
{
LOG_ERROR("MessageShowScope did not contain a valid scope location id");
return;
}
std::vector<CodeView::CodeSnippetParams> snippets = getSnippetsForActiveTokenLocations(collection, 0);
std::vector<CodeView::CodeSnippetParams> snippets = getSnippetsForActiveTokenLocations(collection.get(), 0);
if (snippets.size() != 1)
{
@@ -150,11 +150,11 @@ CodeView* CodeController::getView()
}
std::vector<CodeView::CodeSnippetParams> CodeController::getSnippetsForActiveTokenLocations(
const TokenLocationCollection& collection, Id declarationId
const TokenLocationCollection* collection, Id declarationId
) const {
std::vector<CodeView::CodeSnippetParams> snippets;
collection.forEachTokenLocationFile(
collection->forEachTokenLocationFile(
[&](std::shared_ptr<TokenLocationFile> file) -> void
{
std::vector<CodeView::CodeSnippetParams> fileSnippets = getSnippetsForFile(file);
@@ -47,7 +47,7 @@ private:
CodeView* getView();
std::vector<CodeView::CodeSnippetParams> getSnippetsForActiveTokenLocations(
const TokenLocationCollection& collection, Id declarationId) const;
const TokenLocationCollection* collection, Id declarationId) const;
std::vector<CodeView::CodeSnippetParams> getSnippetsForFile(std::shared_ptr<TokenLocationFile> file) const;
std::shared_ptr<SnippetMerger> buildMergerHierarchy(
TokenLocation* location, SnippetMerger& fileScopedMerger, std::map<int, std::shared_ptr<SnippetMerger>>& mergers) const;
@@ -164,6 +164,11 @@ void GraphController::createDummyGraphForTokenIds(const std::vector<Id>& tokenId
}
);
for (DummyNode& node : dummyNodes)
{
node.hasParent = false;
}
m_dummyNodes = dummyNodes;
autoExpandActiveNode(tokenIds);
@@ -290,14 +295,14 @@ std::vector<DummyNode> GraphController::splitNamespaceNodesRecursive(const Dummy
std::vector<DummyNode> nodes;
active |= node.active;
if (node.isGraphNode() && node.data->isType(Node::NODE_UNDEFINED | Node::NODE_NAMESPACE))
if (node.isGraphNode() && node.data->isType(Node::NODE_NOT_VISIBLE))
{
for (const DummyNode& subNode : node.subNodes)
{
std::vector<DummyNode> newNodes = splitNamespaceNodesRecursive(subNode, active, false);
for (DummyNode& newNode : newNodes)
{
newNode.hasNamespace = true;
newNode.hasParent = false;
}
nodes.insert(nodes.end(), newNodes.begin(), newNodes.end());
@@ -416,7 +421,7 @@ void GraphController::setNodeVisibilityRecursiveTopDown(DummyNode& node, bool pa
if ((node.isGraphNode() && node.isExpanded()) ||
(node.isAccessNode() && parentExpanded) ||
(node.isGraphNode() && node.data->isType(Node::NODE_ENUM)) ||
(node.isGraphNode() && node.data->isType(Node::NODE_NAMESPACE | Node::NODE_UNDEFINED)))
(node.isGraphNode() && node.data->isType(Node::NODE_NOT_VISIBLE)))
{
for (DummyNode& subNode : node.subNodes)
{
@@ -681,7 +686,7 @@ void GraphController::layoutNestingRecursive(DummyNode& node) const
if (node.isGraphNode())
{
if (node.hasNamespace)
if (!node.hasParent)
{
width = margins.charWidth * node.data->getFullName().size();
}
@@ -887,7 +892,7 @@ DummyNode* GraphController::findTopLevelDummyNodeRecursive(std::vector<DummyNode
{
if (node.isGraphNode())
{
if (node.data->isType(Node::NODE_UNDEFINED | Node::NODE_NAMESPACE))
if (node.data->isType(Node::NODE_NOT_VISIBLE))
{
DummyNode* result = findDummyNodeRecursive(node.subNodes, tokenId);
if (result != nullptr)
@@ -52,6 +52,9 @@ private:
void createDummyGraphForTokenIds(const std::vector<Id>& tokenIds);
DummyNode createDummyNodeTopDown(Node* node);
void splitNamespaceNodes();
std::vector<DummyNode> splitNamespaceNodesRecursive(const DummyNode& node, bool active, bool topLevel);
void autoExpandActiveNode(const std::vector<Id>& activeTokenIds);
void setActiveAndVisibility(const std::vector<Id>& activeTokenIds);
@@ -59,9 +62,6 @@ private:
bool setNodeVisibilityRecursiveBottomUp(DummyNode& node) const;
void setNodeVisibilityRecursiveTopDown(DummyNode& node, bool parentExpanded) const;
void splitNamespaceNodes();
std::vector<DummyNode> splitNamespaceNodesRecursive(const DummyNode& node, bool active, bool topLevel);
void bundleNodes();
void bundleNodesMatching(std::function<bool(const DummyNode&)> matcher, size_t count, const std::string& name);
bool isTypeNodeWithSingleAggregation(const DummyNode& node, TokenComponentAggregation::Direction direction) const;
@@ -21,7 +21,7 @@ public:
, active(false)
, connected(false)
, expanded(false)
, hasNamespace(false)
, hasParent(true)
, accessType(TokenComponentAccess::ACCESS_NONE)
, invisibleSubNodeCount(0)
{
@@ -117,7 +117,7 @@ public:
bool active;
bool connected;
bool expanded;
bool hasNamespace;
bool hasParent;
// AccessNode
TokenComponentAccess::AccessType accessType;