diff --git a/java_indexer/src/io/coati/JavaIndexer.java b/java_indexer/src/io/coati/JavaIndexer.java index ce5a28c6..7f3f2b65 100644 --- a/java_indexer/src/io/coati/JavaIndexer.java +++ b/java_indexer/src/io/coati/JavaIndexer.java @@ -49,8 +49,8 @@ public class JavaIndexer } CompilationUnit cu = JavaParser.parse(new StringReader(fileContent), true); - // JavaAstVisitor astVisitor = new JavaAstVisitor(address, filePath, new FileContent(fileContent), typeSolver); - JavaAstVisitor astVisitor = new ASTDumper(address, filePath, new FileContent(fileContent), typeSolver); + JavaAstVisitor astVisitor = new JavaAstVisitor(address, filePath, new FileContent(fileContent), typeSolver); + // JavaAstVisitor astVisitor = new ASTDumper(address, filePath, new FileContent(fileContent), typeSolver); cu.accept(astVisitor, null); } catch (ParseException e) diff --git a/src/lib/data/PersistentStorage.cpp b/src/lib/data/PersistentStorage.cpp index 9c8fa04d..4581721e 100644 --- a/src/lib/data/PersistentStorage.cpp +++ b/src/lib/data/PersistentStorage.cpp @@ -285,31 +285,13 @@ void PersistentStorage::clearCaches() std::set PersistentStorage::getDependingFilePaths(const std::set& filePaths) { TRACE(); - - std::set dependingFilePaths; - for (const FilePath& filePath: filePaths) - { - std::set dependingFilePathsSubset = getDependingFilePaths(filePath); - dependingFilePaths.insert(dependingFilePathsSubset.begin(), dependingFilePathsSubset.end()); - } - return dependingFilePaths; -} - -std::set PersistentStorage::getDependingFilePaths(const FilePath& filePath) -{ std::set dependingFilePaths; - std::vector incomingEdges = m_sqliteStorage.getEdgesByTargetType( - getFileNodeId(filePath), Edge::typeToInt(Edge::EDGE_INCLUDE) - ); - for (const StorageEdge& incomingEdge: incomingEdges) - { - FilePath dependingFilePath = getFileNodePath(incomingEdge.sourceNodeId); - dependingFilePaths.insert(dependingFilePath); + std::set dependingFilePathsForIncludes = getDependingFilePathsForIncludes(filePaths); + dependingFilePaths.insert(dependingFilePathsForIncludes.begin(), dependingFilePathsForIncludes.end()); - std::set dependingFilePathsSubset = getDependingFilePaths(dependingFilePath); - dependingFilePaths.insert(dependingFilePathsSubset.begin(), dependingFilePathsSubset.end()); - } + std::set dependingFilePathsForImports = getDependingFilePathsForImports(filePaths); + dependingFilePaths.insert(dependingFilePathsForImports.begin(), dependingFilePathsForImports.end()); return dependingFilePaths; } @@ -1163,6 +1145,90 @@ FilePath PersistentStorage::getFileNodePath(Id fileId) const return FilePath(); } +std::set PersistentStorage::getDependingFilePathsForIncludes(const std::set& filePaths) +{ + std::set dependingFilePaths; + for (const FilePath& filePath: filePaths) + { + std::set dependingFilePathsSubset = getDependingFilePathsForIncludes(filePath); + dependingFilePaths.insert(dependingFilePathsSubset.begin(), dependingFilePathsSubset.end()); + } + return dependingFilePaths; +} + +std::set PersistentStorage::getDependingFilePathsForIncludes(const FilePath& filePath) +{ + std::set dependingFilePaths; + + std::vector incomingEdges = m_sqliteStorage.getEdgesByTargetType( + getFileNodeId(filePath), Edge::typeToInt(Edge::EDGE_INCLUDE) + ); + for (const StorageEdge& incomingEdge: incomingEdges) + { + FilePath dependingFilePath = getFileNodePath(incomingEdge.sourceNodeId); + dependingFilePaths.insert(dependingFilePath); + + std::set dependingFilePathsSubset = getDependingFilePathsForIncludes(dependingFilePath); + dependingFilePaths.insert(dependingFilePathsSubset.begin(), dependingFilePathsSubset.end()); + } + + return dependingFilePaths; +} + +std::set PersistentStorage::getDependingFilePathsForImports(const std::set& filePaths) +{ + std::map> fileIdToDependingFileIds; + + for (const StorageEdge& importEdge: m_sqliteStorage.getEdgesByType(Edge::typeToInt(Edge::EDGE_IMPORT))) + { + for (const StorageSourceLocation& importedElementLoc: m_sqliteStorage.getTokenLocationsForElementId(importEdge.targetNodeId)) + { + fileIdToDependingFileIds[importedElementLoc.fileNodeId].insert(importEdge.sourceNodeId); + } + } + + std::set dependingFileNodeIds; + + std::set working; + for (const FilePath& filePath: filePaths) + { + working.insert(getFileNodeId(filePath)); + } + + std::set tempWorking; + while (working.size() > 0) + { + for (Id id: working) + { + std::map>::const_iterator it = fileIdToDependingFileIds.find(id); + if (it != fileIdToDependingFileIds.end()) + { + for (Id dependingFileNodeId: it->second) + { + const size_t countBeforeInsert = dependingFileNodeIds.size(); + dependingFileNodeIds.insert(dependingFileNodeId); + const size_t countAfterInsert = dependingFileNodeIds.size(); + if (countBeforeInsert != countAfterInsert) + { + tempWorking.insert(dependingFileNodeId); + } + } + } + } + working = tempWorking; + tempWorking.clear(); + } + + std::set dependingFilePaths; + + for (Id id: dependingFileNodeIds) + { + dependingFilePaths.insert(getFileNodePath(id)); + } + + return dependingFilePaths; +} + Id PersistentStorage::getLastVisibleParentNodeId(const Id nodeId) const { return m_hierarchyCache.getLastVisibleParentNodeId(nodeId); diff --git a/src/lib/data/PersistentStorage.h b/src/lib/data/PersistentStorage.h index 02bba738..b0906e8b 100644 --- a/src/lib/data/PersistentStorage.h +++ b/src/lib/data/PersistentStorage.h @@ -60,7 +60,6 @@ public: void clearCaches(); std::set getDependingFilePaths(const std::set& filePaths); - std::set getDependingFilePaths(const FilePath& filePath); void clearFileElements(const std::vector& filePaths); @@ -123,6 +122,10 @@ private: Id getFileNodeId(const FilePath& filePath) const; FilePath getFileNodePath(Id fileId) const; + std::set getDependingFilePathsForIncludes(const std::set& filePaths); + std::set getDependingFilePathsForIncludes(const FilePath& filePath); + std::set getDependingFilePathsForImports(const std::set& filePaths); + Id getLastVisibleParentNodeId(const Id nodeId) const; std::vector getAllChildNodeIds(const Id nodeId) const;