From 8f754be165a1c698270a0f33a8a84b4c89950f41 Mon Sep 17 00:00:00 2001 From: Eberhard Graether Date: Wed, 4 Apr 2018 01:02:11 +0200 Subject: [PATCH] logic: Show symbols defined within file within file node when activating a file (issue #268) --- .../component/controller/GraphController.cpp | 60 +++++++++------- .../component/controller/GraphController.h | 2 + src/lib/component/view/GraphViewStyle.cpp | 1 - src/lib/data/NodeType.cpp | 5 +- src/lib/data/storage/PersistentStorage.cpp | 69 ++++++++++++++++++- src/lib/data/storage/PersistentStorage.h | 3 +- src/lib_gui/qt/view/QtGraphView.cpp | 2 +- .../qt/view/graphElements/QtGraphNodeData.cpp | 3 +- .../qt/view/graphElements/QtGraphNodeData.h | 2 +- 9 files changed, 111 insertions(+), 36 deletions(-) diff --git a/src/lib/component/controller/GraphController.cpp b/src/lib/component/controller/GraphController.cpp index 8ae46d62..d26cbdf9 100644 --- a/src/lib/component/controller/GraphController.cpp +++ b/src/lib/component/controller/GraphController.cpp @@ -553,32 +553,7 @@ void GraphController::createDummyGraph(const std::shared_ptr graph) } ); - for (const std::shared_ptr& node : dummyNodes) - { - node->hasParent = false; - - if (node->data->getType().isPackage()) - { - node->name = node->data->getFullName(); - } - else - { - node->name = node->data->getName(); - - NameHierarchy qualifier = node->data->getNameHierarchy(); - qualifier.pop(); - - if (qualifier.size()) - { - std::shared_ptr qualifierNode = std::make_shared(DummyNode::DUMMY_QUALIFIER); - qualifierNode->qualifierName = qualifier; - qualifierNode->visible = true; - - node->subNodes.push_back(qualifierNode); - node->hasQualifier = true; - } - } - } + updateDummyNodeNamesAndAddQualifiers(dummyNodes); m_dummyNodes = dummyNodes; @@ -674,6 +649,39 @@ std::vector> GraphController::createDummyNodeTopDown( return nodes; } +void GraphController::updateDummyNodeNamesAndAddQualifiers( + const std::vector>& dummyNodes) +{ + for (const std::shared_ptr& node : dummyNodes) + { + if (node->isGroupNode() || !node->data || node->data->getType().isFile()) + { + updateDummyNodeNamesAndAddQualifiers(node->subNodes); + } + else if (node->data->getType().isPackage()) + { + node->name = node->data->getFullName(); + } + else + { + node->name = node->data->getName(); + + NameHierarchy qualifier = node->data->getNameHierarchy(); + qualifier.pop(); + + if (qualifier.size()) + { + std::shared_ptr qualifierNode = std::make_shared(DummyNode::DUMMY_QUALIFIER); + qualifierNode->qualifierName = qualifier; + qualifierNode->visible = true; + + node->subNodes.push_back(qualifierNode); + node->hasQualifier = true; + } + } + } +} + std::vector GraphController::getExpandedNodeIds() const { std::vector nodeIds; diff --git a/src/lib/component/controller/GraphController.h b/src/lib/component/controller/GraphController.h index a0891b0f..4c668d69 100644 --- a/src/lib/component/controller/GraphController.h +++ b/src/lib/component/controller/GraphController.h @@ -78,6 +78,8 @@ private: const std::vector& tokenIds, const std::shared_ptr graph, bool keepExpandedNodesExpanded); std::vector> createDummyNodeTopDown(Node* node, Id ancestorId); + void updateDummyNodeNamesAndAddQualifiers(const std::vector>& dummyNodes); + std::vector getExpandedNodeIds() const; void setExpandedNodeIds(const std::vector& nodeIds); void autoExpandActiveNode(const std::vector& activeTokenIds); diff --git a/src/lib/component/view/GraphViewStyle.cpp b/src/lib/component/view/GraphViewStyle.cpp index 16abacbf..fc220dba 100644 --- a/src/lib/component/view/GraphViewStyle.cpp +++ b/src/lib/component/view/GraphViewStyle.cpp @@ -655,7 +655,6 @@ GraphViewStyle::EdgeStyle GraphViewStyle::getStyleForEdgeType( } break; case Edge::EDGE_INCLUDE: - case Edge::EDGE_MACRO_USAGE: style.zValue = isActive ? 2 : -3; default: break; diff --git a/src/lib/data/NodeType.cpp b/src/lib/data/NodeType.cpp index 916bfaf4..4ece709c 100644 --- a/src/lib/data/NodeType.cpp +++ b/src/lib/data/NodeType.cpp @@ -141,11 +141,12 @@ bool NodeType::isCollapsible() const NodeType::NODE_SYMBOL | NodeType::NODE_TYPE | NodeType::NODE_BUILTIN_TYPE | - NodeType::NODE_CLASS | NodeType::NODE_STRUCT | + NodeType::NODE_CLASS | + NodeType::NODE_INTERFACE | NodeType::NODE_ENUM | NodeType::NODE_UNION | - NodeType::NODE_INTERFACE; + NodeType::NODE_FILE; return ((m_type & mask) > 0); } diff --git a/src/lib/data/storage/PersistentStorage.cpp b/src/lib/data/storage/PersistentStorage.cpp index b6608519..88843c37 100644 --- a/src/lib/data/storage/PersistentStorage.cpp +++ b/src/lib/data/storage/PersistentStorage.cpp @@ -886,6 +886,8 @@ std::shared_ptr PersistentStorage::getGraphForActiveTokenIds( bool addAggregations = false; std::vector edgesToAggregate; + bool addFileContents = false; + if (tokenIds.size() == 1) { const Id elementId = tokenIds[0]; @@ -936,7 +938,14 @@ std::shared_ptr PersistentStorage::getGraphForActiveTokenIds( } } - addAggregations = true; + if (nodeType.isFile()) + { + addFileContents = true; + } + else + { + addAggregations = true; + } } } else if (m_sqliteIndexStorage.isEdge(elementId)) @@ -995,6 +1004,10 @@ std::shared_ptr PersistentStorage::getGraphForActiveTokenIds( { addAggregationEdgesToGraph(tokenIds[0], edgesToAggregate, graph); } + else if (addFileContents) + { + addFileContentsToGraph(tokenIds[0], graph); + } if (!isPackage) { @@ -2368,7 +2381,7 @@ void PersistentStorage::addNodesWithParentsAndEdgesToGraph( } void PersistentStorage::addAggregationEdgesToGraph( - const Id nodeId, const std::vector& edgesToAggregate, Graph* graph) const + Id nodeId, const std::vector& edgesToAggregate, Graph* graph) const { TRACE(); @@ -2469,6 +2482,58 @@ void PersistentStorage::addAggregationEdgesToGraph( } } +void PersistentStorage::addFileContentsToGraph(Id fileId, Graph* graph) const +{ + FilePath path = getFileNodePath(fileId); + if (path.empty()) + { + return; + } + + std::vector tokenIds; + std::set tokenIdsSet; + + std::shared_ptr locationFile = m_sqliteIndexStorage.getSourceLocationsForFile(path); + locationFile->forEachStartSourceLocation( + [this, &tokenIds, &tokenIdsSet](SourceLocation* location) + { + if (location->getType() != LOCATION_TOKEN) + { + return; + } + + for (Id tokenId : location->getTokenIds()) + { + if (tokenIdsSet.insert(tokenId).second) + { + auto it = m_symbolDefinitionKinds.find(tokenId); + if (it == m_symbolDefinitionKinds.end() || it->second != DEFINITION_IMPLICIT) + { + tokenIds.push_back(tokenId); + } + } + } + } + ); + + addNodesWithParentsAndEdgesToGraph(tokenIds, { }, graph, true); + + Node* fileNode = graph->getNodeById(fileId); + Id memberEdgeId = 0; + for (Id tokenId : tokenIds) + { + Id nodeId = m_hierarchyCache.getLastVisibleParentNodeId(tokenId); + Node* node = graph->getNodeById(nodeId); + if (node && !node->getMemberEdge()) + { + // Set first bit to 1 to avoid collisions + graph->createEdge(~(~Id(0) >> 1) + memberEdgeId++, Edge::EDGE_MEMBER, fileNode, node); + } + } + + fileNode->setChildCount(memberEdgeId); +} + void PersistentStorage::addComponentAccessToGraph(Graph* graph) const { TRACE(); diff --git a/src/lib/data/storage/PersistentStorage.h b/src/lib/data/storage/PersistentStorage.h index 98b24306..26154204 100644 --- a/src/lib/data/storage/PersistentStorage.h +++ b/src/lib/data/storage/PersistentStorage.h @@ -172,7 +172,8 @@ private: void addNodesWithParentsAndEdgesToGraph( const std::vector& nodeIds, const std::vector& edgeIds, Graph* graphh, bool addChildCount) const; - void addAggregationEdgesToGraph(const Id nodeId, const std::vector& edgesToAggregate, Graph* graph) const; + void addAggregationEdgesToGraph(Id nodeId, const std::vector& edgesToAggregate, Graph* graph) const; + void addFileContentsToGraph(Id fileId, Graph* graph) const; void addComponentAccessToGraph(Graph* graph) const; void addCompleteFlagsToSourceLocationCollection(SourceLocationCollection* collection) const; diff --git a/src/lib_gui/qt/view/QtGraphView.cpp b/src/lib_gui/qt/view/QtGraphView.cpp index 50c54e57..8760c32b 100644 --- a/src/lib_gui/qt/view/QtGraphView.cpp +++ b/src/lib_gui/qt/view/QtGraphView.cpp @@ -869,7 +869,7 @@ QtGraphNode* QtGraphView::createNodeRecursive( QtGraphNode* newNode = nullptr; if (node->isGraphNode()) { - newNode = new QtGraphNodeData(node->data, node->name, node->hasParent, node->childVisible, node->hasQualifier); + newNode = new QtGraphNodeData(node->data, node->name, node->childVisible, node->hasQualifier); } else if (node->isAccessNode()) { diff --git a/src/lib_gui/qt/view/graphElements/QtGraphNodeData.cpp b/src/lib_gui/qt/view/graphElements/QtGraphNodeData.cpp index 95926c3a..f03f19ae 100644 --- a/src/lib_gui/qt/view/graphElements/QtGraphNodeData.cpp +++ b/src/lib_gui/qt/view/graphElements/QtGraphNodeData.cpp @@ -9,13 +9,12 @@ #include "data/graph/token_component/TokenComponentFilePath.h" -QtGraphNodeData::QtGraphNodeData(const Node* data, const std::wstring& name, bool hasParent, bool childVisible, bool hasQualifier) +QtGraphNodeData::QtGraphNodeData(const Node* data, const std::wstring& name, bool childVisible, bool hasQualifier) : m_data(data) , m_childVisible(childVisible) , m_hasQualifier(hasQualifier) { this->setAcceptHoverEvents(true); - this->setName(name); } diff --git a/src/lib_gui/qt/view/graphElements/QtGraphNodeData.h b/src/lib_gui/qt/view/graphElements/QtGraphNodeData.h index 60c1e1c9..7b30ac0b 100644 --- a/src/lib_gui/qt/view/graphElements/QtGraphNodeData.h +++ b/src/lib_gui/qt/view/graphElements/QtGraphNodeData.h @@ -10,7 +10,7 @@ class QtGraphNodeData { Q_OBJECT public: - QtGraphNodeData(const Node* data, const std::wstring& name, bool hasParent, bool childVisible, bool hasQualifier); + QtGraphNodeData(const Node* data, const std::wstring& name, bool childVisible, bool hasQualifier); virtual ~QtGraphNodeData(); const Node* getData() const;