From 8bf02140b2b53ac6741a9b3828742e4692f6d345 Mon Sep 17 00:00:00 2001 From: Eberhard Graether Date: Fri, 9 Dec 2016 20:43:46 +0100 Subject: [PATCH] logic: Aggregate type use edges to make referencing symbols appear collapsed --- src/lib/data/PersistentStorage.cpp | 45 ++++++++++++++++++++++-------- src/lib/data/PersistentStorage.h | 2 +- src/lib/data/graph/Node.cpp | 2 ++ src/lib/data/graph/Node.h | 1 + 4 files changed, 37 insertions(+), 13 deletions(-) diff --git a/src/lib/data/PersistentStorage.cpp b/src/lib/data/PersistentStorage.cpp index 726e77bd..64893db5 100644 --- a/src/lib/data/PersistentStorage.cpp +++ b/src/lib/data/PersistentStorage.cpp @@ -699,7 +699,9 @@ std::shared_ptr PersistentStorage::getGraphForActiveTokenIds(const std::v std::vector nodeIds; std::vector edgeIds; + bool addAggregations = false; + std::vector edgesToAggregate; if (tokenIds.size() == 1) { @@ -708,8 +710,8 @@ std::shared_ptr PersistentStorage::getGraphForActiveTokenIds(const std::v if (node.id > 0) { - if (Node::intToType(node.type) == Node::NODE_NAMESPACE || // TODO: use & here - Node::intToType(node.type) == Node::NODE_PACKAGE) + Node::NodeType nodeType = Node::intToType(node.type); + if (nodeType & (Node::NODE_NAMESPACE | Node::NODE_PACKAGE)) { ids.clear(); m_hierarchyCache.addFirstChildIdsForNodeId(elementId, &ids); @@ -723,7 +725,17 @@ std::shared_ptr PersistentStorage::getGraphForActiveTokenIds(const std::v std::vector edges = m_sqliteStorage.getEdgesBySourceOrTargetId(elementId); for (const StorageEdge& edge : edges) { - if (Edge::intToType(edge.type) != Edge::EDGE_MEMBER) + Edge::EdgeType edgeType = Edge::intToType(edge.type); + if (edgeType == Edge::EDGE_MEMBER) + { + continue; + } + + if ((nodeType & Node::NODE_USEABLE_TYPE) && (edgeType & Edge::EDGE_TYPE_USAGE)) + { + edgesToAggregate.push_back(edge); + } + else { edgeIds.push_back(edge.id); } @@ -773,7 +785,7 @@ std::shared_ptr PersistentStorage::getGraphForActiveTokenIds(const std::v if (addAggregations) { - addAggregationEdgesToGraph(tokenIds[0], graph); + addAggregationEdgesToGraph(tokenIds[0], edgesToAggregate, graph); } addComponentAccessToGraph(graph); @@ -1373,7 +1385,8 @@ void PersistentStorage::addNodesWithChildrenAndEdgesToGraph( addEdgesToGraph(allEdgeIds, graph); } -void PersistentStorage::addAggregationEdgesToGraph(const Id nodeId, Graph* graph) const +void PersistentStorage::addAggregationEdgesToGraph( + const Id nodeId, const std::vector& edgesToAggregate, Graph* graph) const { TRACE(); @@ -1386,30 +1399,38 @@ void PersistentStorage::addAggregationEdgesToGraph(const Id nodeId, Graph* graph // build aggregation edges: // get all children of the active node std::vector childNodeIds = getAllChildNodeIds(nodeId); - if (childNodeIds.size() == 0) + if (childNodeIds.size() == 0 && edgesToAggregate.size() == 0) { return; } // get all edges of the children std::map> connectedNodeIds; + for (const StorageEdge& edge : edgesToAggregate) + { + bool isSource = nodeId == edge.sourceNodeId; + EdgeInfo edgeInfo; + edgeInfo.edgeId = edge.id; + edgeInfo.forward = isSource; + connectedNodeIds[isSource ? edge.targetNodeId : edge.sourceNodeId].push_back(edgeInfo); + } std::vector outgoingEdges = m_sqliteStorage.getEdgesBySourceIds(childNodeIds); - for (size_t j = 0; j < outgoingEdges.size(); j++) + for (const StorageEdge& outEdge : outgoingEdges) { EdgeInfo edgeInfo; - edgeInfo.edgeId = outgoingEdges[j].id; + edgeInfo.edgeId = outEdge.id; edgeInfo.forward = true; - connectedNodeIds[outgoingEdges[j].targetNodeId].push_back(edgeInfo); + connectedNodeIds[outEdge.targetNodeId].push_back(edgeInfo); } std::vector incomingEdges = m_sqliteStorage.getEdgesByTargetIds(childNodeIds); - for (size_t j = 0; j < incomingEdges.size(); j++) + for (const StorageEdge& inEdge : incomingEdges) { EdgeInfo edgeInfo; - edgeInfo.edgeId = incomingEdges[j].id; + edgeInfo.edgeId = inEdge.id; edgeInfo.forward = false; - connectedNodeIds[incomingEdges[j].sourceNodeId].push_back(edgeInfo); + connectedNodeIds[inEdge.sourceNodeId].push_back(edgeInfo); } // get all parent nodes of all connected nodes (up to last level except namespace/undefined) diff --git a/src/lib/data/PersistentStorage.h b/src/lib/data/PersistentStorage.h index d8558ce5..8c7032df 100644 --- a/src/lib/data/PersistentStorage.h +++ b/src/lib/data/PersistentStorage.h @@ -139,7 +139,7 @@ private: const std::vector& edgeIds, Graph* graph ) const; - void addAggregationEdgesToGraph(const Id nodeId, Graph* graph) const; + void addAggregationEdgesToGraph(const Id nodeId, const std::vector& edgesToAggregate, Graph* graph) const; void addComponentAccessToGraph(Graph* graph) const; void buildSearchIndex(); diff --git a/src/lib/data/graph/Node.cpp b/src/lib/data/graph/Node.cpp index 94d1af95..7f67a27b 100644 --- a/src/lib/data/graph/Node.cpp +++ b/src/lib/data/graph/Node.cpp @@ -12,6 +12,8 @@ #include "data/graph/token_component/TokenComponentSignature.h" const Node::NodeTypeMask Node::NODE_NOT_VISIBLE = Node::NODE_UNDEFINED | Node::NODE_NAMESPACE | Node::NODE_PACKAGE; +const Node::NodeTypeMask Node::NODE_USEABLE_TYPE = Node::NODE_UNDEFINED | Node::NODE_BUILTIN_TYPE | + Node::NODE_BUILTIN_TYPE | Node::NODE_STRUCT | Node::NODE_CLASS | Node::NODE_INTERFACE | Node::NODE_TYPEDEF; std::string Node::getTypeString(NodeType type) { diff --git a/src/lib/data/graph/Node.h b/src/lib/data/graph/Node.h index d4b8edb3..717077f8 100644 --- a/src/lib/data/graph/Node.h +++ b/src/lib/data/graph/Node.h @@ -53,6 +53,7 @@ public: static NodeType intToType(int value); static const NodeTypeMask NODE_NOT_VISIBLE; + static const NodeTypeMask NODE_USEABLE_TYPE; Node(Id id, NodeType type, NameHierarchy nameHierarchy, bool defined); virtual ~Node();