diff --git a/src/lib/component/controller/GraphController.cpp b/src/lib/component/controller/GraphController.cpp index 6ab124ec..b001f0a3 100644 --- a/src/lib/component/controller/GraphController.cpp +++ b/src/lib/component/controller/GraphController.cpp @@ -1473,7 +1473,7 @@ void GraphController::addExpandToggleNode(DummyNode* node) const for (const std::shared_ptr& subSubNode : subNode->subNodes) { - if (subSubNode->visible && (!subSubNode->isGraphNode() || !subSubNode->data->isImplicit())) + if (subSubNode->visible && (!subSubNode->isGraphNode() || !subSubNode->data->isImplicit() || node->data->isImplicit())) { visibleSubNodeCount++; } diff --git a/src/lib/data/HierarchyCache.cpp b/src/lib/data/HierarchyCache.cpp index 2143ea1b..1c37f903 100644 --- a/src/lib/data/HierarchyCache.cpp +++ b/src/lib/data/HierarchyCache.cpp @@ -63,6 +63,15 @@ size_t HierarchyCache::HierarchyNode::getNonImplicitChildrenCount() const return count; } +void HierarchyCache::HierarchyNode::addChildIds(std::vector* nodeIds, std::vector* edgeIds) const +{ + for (const HierarchyNode* child : m_children) + { + nodeIds->push_back(child->getNodeId()); + edgeIds->push_back(child->getEdgeId()); + } +} + void HierarchyCache::HierarchyNode::addNonImplicitChildIds(std::vector* nodeIds, std::vector* edgeIds) const { for (const HierarchyNode* child : m_children) @@ -136,7 +145,8 @@ void HierarchyCache::clear() m_nodes.clear(); } -void HierarchyCache::createConnection(Id edgeId, Id fromId, Id toId, bool sourceVisible, bool targetImplicit) +void HierarchyCache::createConnection( + Id edgeId, Id fromId, Id toId, bool sourceVisible, bool sourceImplicit, bool targetImplicit) { HierarchyNode* from = createNode(fromId); HierarchyNode* to = createNode(toId); @@ -145,6 +155,7 @@ void HierarchyCache::createConnection(Id edgeId, Id fromId, Id toId, bool source to->setParent(from); from->setIsVisible(sourceVisible); + from->setIsImplicit(sourceImplicit); to->setEdgeId(edgeId); to->setIsImplicit(targetImplicit); @@ -227,21 +238,35 @@ void HierarchyCache::addAllChildIdsForNodeId(Id nodeId, std::set* nodeIds, s } } -void HierarchyCache::addFirstNonImplicitChildIdsForNodeId(Id nodeId, std::vector* nodeIds, std::vector* edgeIds) const +void HierarchyCache::addFirstChildIdsForNodeId(Id nodeId, std::vector* nodeIds, std::vector* edgeIds) const { HierarchyNode* node = getNode(nodeId); if (node) { - node->addNonImplicitChildIds(nodeIds, edgeIds); + if (node->isImplicit()) + { + node->addChildIds(nodeIds, edgeIds); + } + else + { + node->addNonImplicitChildIds(nodeIds, edgeIds); + } } } -size_t HierarchyCache::getFirstNonImplicitChildIdsCountForNodeId(Id nodeId) const +size_t HierarchyCache::getFirstChildIdsCountForNodeId(Id nodeId) const { HierarchyNode* node = getNode(nodeId); if (node) { - return node->getNonImplicitChildrenCount(); + if (node->isImplicit()) + { + return node->getChildrenCount(); + } + else + { + return node->getNonImplicitChildrenCount(); + } } return 0; } diff --git a/src/lib/data/HierarchyCache.h b/src/lib/data/HierarchyCache.h index d8b4f339..3f3a1e17 100644 --- a/src/lib/data/HierarchyCache.h +++ b/src/lib/data/HierarchyCache.h @@ -13,7 +13,7 @@ class HierarchyCache public: void clear(); - void createConnection(Id edgeId, Id fromId, Id toId, bool sourceVisible, bool targetImplicit); + void createConnection(Id edgeId, Id fromId, Id toId, bool sourceVisible, bool sourceImplicit, bool targetImplicit); void createInheritance(Id edgeId, Id fromId, Id toId); Id getLastVisibleParentNodeId(Id nodeId) const; @@ -22,9 +22,9 @@ public: void addAllVisibleParentIdsForNodeId(Id nodeId, std::set* nodeIds, std::set* edgeIds) const; void addAllChildIdsForNodeId(Id nodeId, std::set* nodeIds, std::set* edgeIds) const; - void addFirstNonImplicitChildIdsForNodeId(Id nodeId, std::vector* nodeIds, std::vector* edgeIds) const; + void addFirstChildIdsForNodeId(Id nodeId, std::vector* nodeIds, std::vector* edgeIds) const; - size_t getFirstNonImplicitChildIdsCountForNodeId(Id nodeId) const; + size_t getFirstChildIdsCountForNodeId(Id nodeId) const; bool isChildOfVisibleNodeOrInvisible(Id nodeId) const; @@ -55,6 +55,7 @@ private: size_t getChildrenCount() const; size_t getNonImplicitChildrenCount() const; + void addChildIds(std::vector* nodeIds, std::vector* edgeIds) const; void addNonImplicitChildIds(std::vector* nodeIds, std::vector* edgeIds) const; void addChildIdsRecursive(std::set* nodeIds, std::set* edgeIds) const; diff --git a/src/lib/data/storage/PersistentStorage.cpp b/src/lib/data/storage/PersistentStorage.cpp index cad67e41..d68c6ff3 100644 --- a/src/lib/data/storage/PersistentStorage.cpp +++ b/src/lib/data/storage/PersistentStorage.cpp @@ -918,7 +918,7 @@ std::shared_ptr PersistentStorage::getGraphForActiveTokenIds( if (nodeType & (Node::NODE_NAMESPACE | Node::NODE_PACKAGE)) { ids.clear(); - m_hierarchyCache.addFirstNonImplicitChildIdsForNodeId(elementId, &ids, &edgeIds); + m_hierarchyCache.addFirstChildIdsForNodeId(elementId, &ids, &edgeIds); edgeIds.clear(); isNamespace = true; @@ -926,7 +926,7 @@ std::shared_ptr PersistentStorage::getGraphForActiveTokenIds( else { nodeIds.push_back(elementId); - m_hierarchyCache.addFirstNonImplicitChildIdsForNodeId(elementId, &nodeIds, &edgeIds); + m_hierarchyCache.addFirstChildIdsForNodeId(elementId, &nodeIds, &edgeIds); edgeIds.clear(); std::vector edges = m_sqliteIndexStorage.getEdgesBySourceOrTargetId(elementId); @@ -1019,7 +1019,7 @@ std::shared_ptr PersistentStorage::getGraphForActiveTokenIds( { if (graph->getNodeById(nodeId)) { - m_hierarchyCache.addFirstNonImplicitChildIdsForNodeId(nodeId, &expandedChildIds, &expandedChildEdgeIds); + m_hierarchyCache.addFirstChildIdsForNodeId(nodeId, &expandedChildIds, &expandedChildEdgeIds); } } @@ -1050,7 +1050,7 @@ std::shared_ptr PersistentStorage::getGraphForChildrenOfNodeId(Id nodeId) std::vector edgeIds; nodeIds.push_back(nodeId); - m_hierarchyCache.addFirstNonImplicitChildIdsForNodeId(nodeId, &nodeIds, &edgeIds); + m_hierarchyCache.addFirstChildIdsForNodeId(nodeId, &nodeIds, &edgeIds); std::shared_ptr graph = std::make_shared(); addNodesToGraph(nodeIds, graph.get(), true); @@ -2171,7 +2171,7 @@ void PersistentStorage::addNodesToGraph(const std::vector& newNodeIds, Graph if (addChildCount) { - node->setChildCount(m_hierarchyCache.getFirstNonImplicitChildIdsCountForNodeId(storageNode.id)); + node->setChildCount(m_hierarchyCache.getFirstChildIdsCountForNodeId(storageNode.id)); } } } @@ -2637,15 +2637,22 @@ void PersistentStorage::buildHierarchyCache() { bool sourceIsVisible = !(sourceNodeTypeMap[edge.sourceNodeId] & Node::NODE_NOT_VISIBLE); + bool sourceIsImplicit = false; + auto it = m_symbolDefinitionKinds.find(edge.sourceNodeId); + if (it != m_symbolDefinitionKinds.end()) + { + sourceIsImplicit = (it->second == DEFINITION_IMPLICIT); + } + bool targetIsImplicit = false; - auto it = m_symbolDefinitionKinds.find(edge.targetNodeId); + it = m_symbolDefinitionKinds.find(edge.targetNodeId); if (it != m_symbolDefinitionKinds.end()) { targetIsImplicit = (it->second == DEFINITION_IMPLICIT); } m_hierarchyCache.createConnection( - edge.id, edge.sourceNodeId, edge.targetNodeId, sourceIsVisible, targetIsImplicit); + edge.id, edge.sourceNodeId, edge.targetNodeId, sourceIsVisible, sourceIsImplicit, targetIsImplicit); } std::vector inheritanceEdges = m_sqliteIndexStorage.getEdgesByType(Edge::typeToInt(Edge::EDGE_INHERITANCE));