diff --git a/src/lib/data/NodeTypeSet.cpp b/src/lib/data/NodeTypeSet.cpp index fdee2af5..d579ee10 100644 --- a/src/lib/data/NodeTypeSet.cpp +++ b/src/lib/data/NodeTypeSet.cpp @@ -80,21 +80,39 @@ NodeTypeSet NodeTypeSet::getWithRemoved(const NodeTypeSet& typeSet) const return ret; } -void NodeTypeSet::removeIf(const std::function condition) +void NodeTypeSet::keepMatching(const std::function& matcher) { for (const NodeType& type : s_allNodeTypes) { - if (m_nodeTypeMask & nodeTypeToMask(type) && condition(type)) + if (m_nodeTypeMask & nodeTypeToMask(type) && !matcher(type)) { remove(type); } } } -NodeTypeSet NodeTypeSet::getWithRemovedIf(const std::function condition) const +NodeTypeSet NodeTypeSet::getWithMatchingKept(const std::function& matcher) const { NodeTypeSet ret(*this); - ret.removeIf(condition); + ret.keepMatching(matcher); + return ret; +} + +void NodeTypeSet::removeMatching(const std::function& matcher) +{ + for (const NodeType& type : s_allNodeTypes) + { + if (m_nodeTypeMask & nodeTypeToMask(type) && matcher(type)) + { + remove(type); + } + } +} + +NodeTypeSet NodeTypeSet::getWithMatchingRemoved(const std::function& matcher) const +{ + NodeTypeSet ret(*this); + ret.removeMatching(matcher); return ret; } @@ -108,6 +126,18 @@ bool NodeTypeSet::contains(const NodeType& type) const return m_nodeTypeMask & nodeTypeToMask(type); } +bool NodeTypeSet::containsMatching(const std::function& matcher) const +{ + for (const NodeType& type : s_allNodeTypes) + { + if (m_nodeTypeMask & nodeTypeToMask(type) && matcher(type)) + { + return true; + } + } + return false; +} + bool NodeTypeSet::intersectsWith(const NodeTypeSet& typeSet) const { return m_nodeTypeMask & typeSet.m_nodeTypeMask; diff --git a/src/lib/data/NodeTypeSet.h b/src/lib/data/NodeTypeSet.h index b4db22ee..159ec576 100644 --- a/src/lib/data/NodeTypeSet.h +++ b/src/lib/data/NodeTypeSet.h @@ -29,11 +29,15 @@ public: void remove(const NodeTypeSet& typeSet); NodeTypeSet getWithRemoved(const NodeTypeSet& typeSet) const; - void removeIf(const std::function condition); - NodeTypeSet getWithRemovedIf(const std::function condition) const; + void keepMatching(const std::function& matcher); + NodeTypeSet getWithMatchingKept(const std::function& matcher) const; + + void removeMatching(const std::function& matcher); + NodeTypeSet getWithMatchingRemoved(const std::function& matcher) const; bool isEmpty() const; bool contains(const NodeType& type) const; + bool containsMatching(const std::function& matcher) const; bool intersectsWith(const NodeTypeSet& typeSet) const; std::vector getNodeTypeIds() const; diff --git a/src/lib/data/name/NameHierarchy.cpp b/src/lib/data/name/NameHierarchy.cpp index 6f794965..88a29924 100644 --- a/src/lib/data/name/NameHierarchy.cpp +++ b/src/lib/data/name/NameHierarchy.cpp @@ -162,6 +162,16 @@ std::string NameHierarchy::getRawNameWithSignature() const return ""; } +bool NameHierarchy::hasSignature() const +{ + if (m_elements.size()) + { + return m_elements.back()->hasSignature(); + } + + return false; +} + NameElement::Signature NameHierarchy::getSignature() const { if (m_elements.size()) diff --git a/src/lib/data/name/NameHierarchy.h b/src/lib/data/name/NameHierarchy.h index ab555faf..131abe38 100644 --- a/src/lib/data/name/NameHierarchy.h +++ b/src/lib/data/name/NameHierarchy.h @@ -37,6 +37,7 @@ public: std::string getRawName() const; std::string getRawNameWithSignature() const; + bool hasSignature() const; NameElement::Signature getSignature() const; private: diff --git a/src/lib/data/storage/PersistentStorage.cpp b/src/lib/data/storage/PersistentStorage.cpp index efad83f4..c2c2d76b 100644 --- a/src/lib/data/storage/PersistentStorage.cpp +++ b/src/lib/data/storage/PersistentStorage.cpp @@ -563,12 +563,12 @@ std::vector PersistentStorage::getAutocompletionMatches(const std:: // create SearchMatches std::vector matches; - if (!acceptedNodeTypes.getWithRemovedIf([](const NodeType& type) { return type.isFile(); }).isEmpty()) + if (!acceptedNodeTypes.getWithMatchingRemoved([](const NodeType& type) { return type.isFile(); }).isEmpty()) { utility::append(matches, getAutocompletionSymbolMatches(query, acceptedNodeTypes, maxResultsCount, maxBestScoredResultsLength)); } - if (!acceptedNodeTypes.getWithRemovedIf([](const NodeType& type) { return !type.isFile(); }).isEmpty()) + if (acceptedNodeTypes.containsMatching([](const NodeType& type) { return type.isFile(); })) { utility::append(matches, getAutocompletionFileMatches(query, maxResultsCount)); } @@ -685,7 +685,12 @@ std::vector PersistentStorage::getAutocompletionSymbolMatches( std::vector PersistentStorage::getAutocompletionFileMatches(const std::string& query, size_t maxResultsCount) const { - std::vector results = m_fileIndex.search(query, NodeTypeSet(NodeType::NODE_FILE), maxResultsCount, 100); + std::vector results = m_fileIndex.search( + query, + NodeTypeSet::all().getWithMatchingKept([](const NodeType& type) { return type.isFile(); }), + maxResultsCount, + 100 + ); // create SearchMatches std::vector matches; @@ -849,7 +854,7 @@ std::shared_ptr PersistentStorage::getGraphForNodeTypes(NodeTypeSet nodeT } } - if (nodeTypes.contains(NodeType(NodeType::NODE_FILE))) + if (nodeTypes.containsMatching([](const NodeType& type) { return type.isFile(); })) { for (const auto& p : m_fileNodePaths) { @@ -868,7 +873,7 @@ std::shared_ptr PersistentStorage::getGraphForActiveTokenIds( TRACE(); std::vector ids(tokenIds); - bool isNamespace = false; + bool isPackage = false; std::vector nodeIds; std::vector edgeIds; @@ -884,13 +889,13 @@ std::shared_ptr PersistentStorage::getGraphForActiveTokenIds( if (node.id > 0) { NodeType nodeType = utility::intToType(node.type); - if (nodeType.getType() & (NodeType::NODE_NAMESPACE | NodeType::NODE_PACKAGE)) + if (nodeType.isPackage()) { ids.clear(); m_hierarchyCache.addFirstChildIdsForNodeId(elementId, &ids, &edgeIds); edgeIds.clear(); - isNamespace = true; + isPackage = true; } else { @@ -936,12 +941,12 @@ std::shared_ptr PersistentStorage::getGraphForActiveTokenIds( } } - if (ids.size() >= 1 || isNamespace) + if (ids.size() >= 1 || isPackage) { std::set symbolIds; for (const StorageSymbol& symbol : m_sqliteIndexStorage.getAllByIds(ids)) { - if (symbol.id > 0 && (!isNamespace || intToDefinitionKind(symbol.definitionKind) != DEFINITION_IMPLICIT)) + if (symbol.id > 0 && (!isPackage || intToDefinitionKind(symbol.definitionKind) != DEFINITION_IMPLICIT)) { nodeIds.push_back(symbol.id); } @@ -955,7 +960,7 @@ std::shared_ptr PersistentStorage::getGraphForActiveTokenIds( } } - if (!isNamespace) + if (!isPackage) { if (nodeIds.size() != ids.size()) { @@ -974,7 +979,7 @@ std::shared_ptr PersistentStorage::getGraphForActiveTokenIds( std::shared_ptr g = std::make_shared(); Graph* graph = g.get(); - if (isNamespace) + if (isPackage) { addNodesToGraph(nodeIds, graph, false); } @@ -988,7 +993,7 @@ std::shared_ptr PersistentStorage::getGraphForActiveTokenIds( addAggregationEdgesToGraph(tokenIds[0], edgesToAggregate, graph); } - if (!isNamespace) + if (!isPackage) { std::vector expandedChildIds; std::vector expandedChildEdgeIds; @@ -1014,7 +1019,7 @@ std::shared_ptr PersistentStorage::getGraphForActiveTokenIds( if (isActiveNamespace) { - *isActiveNamespace = isNamespace; + *isActiveNamespace = isPackage; } return g; @@ -1205,7 +1210,7 @@ std::shared_ptr PersistentStorage::getSourceLocationsF if (path.empty() && m_symbolDefinitionKinds.find(tokenId) == m_symbolDefinitionKinds.end()) { StorageNode fileNode = m_sqliteIndexStorage.getNodeById(tokenId); - if (utility::intToType(fileNode.type) == NodeType::NODE_FILE) + if (NodeType(utility::intToType(fileNode.type)).isFile()) { path = FilePath(NameHierarchy::deserialize(fileNode.serializedName).getQualifiedName()); } @@ -1767,7 +1772,7 @@ TooltipSnippet PersistentStorage::getTooltipSnippetForNode(const StorageNode& no snippet.locationFile = std::make_shared( FilePath(nameHierarchy.getDelimiter() == NAME_DELIMITER_JAVA ? "main.java" : "main.cpp"), true, true); - if (utility::intToType(node.type) & (NodeType::NODE_FUNCTION | NodeType::NODE_METHOD | NodeType::NODE_FIELD | NodeType::NODE_GLOBAL_VARIABLE)) + if (nameHierarchy.hasSignature()) { snippet.code = utility::breakSignature( nameHierarchy.getSignature().getPrefix(), @@ -1857,20 +1862,20 @@ TooltipInfo PersistentStorage::getTooltipInfoForSourceLocationIdsAndLocalSymbolI TooltipInfo info; - if (!locationIds.size() && !localSymbolIds.size()) + if (locationIds.empty() && localSymbolIds.empty()) { return info; } if (locationIds.size()) { - std::vector tokenIds = getNodeIdsForLocationIds(locationIds); + const std::vector nodeIds = getNodeIdsForLocationIds(locationIds); - for (const StorageNode& node : m_sqliteIndexStorage.getAllByIds(tokenIds)) + for (const StorageNode& node : m_sqliteIndexStorage.getAllByIds(nodeIds)) { TooltipSnippet snippet; - NameHierarchy nameHierarchy = NameHierarchy::deserialize(node.serializedName); + const NameHierarchy nameHierarchy = NameHierarchy::deserialize(node.serializedName); snippet.code = nameHierarchy.getQualifiedName(); snippet.locationFile = std::make_shared( FilePath(nameHierarchy.getDelimiter() == NAME_DELIMITER_JAVA ? "main.java" : "main.cpp"), true, true); @@ -1878,7 +1883,7 @@ TooltipInfo PersistentStorage::getTooltipInfoForSourceLocationIdsAndLocalSymbolI snippet.locationFile->addSourceLocation( LOCATION_TOKEN, 0, std::vector(1, node.id), 1, 1, 1, snippet.code.size()); - if (utility::intToType(node.type) & (NodeType::NODE_METHOD | NodeType::NODE_FUNCTION)) + if (NodeType(utility::intToType(node.type)).isCallable()) { snippet.code += "()"; }