diff --git a/src/main/java/DocumentIndexer.java b/src/main/java/DocumentIndexer.java index 0a1118cd..08b3819b 100644 --- a/src/main/java/DocumentIndexer.java +++ b/src/main/java/DocumentIndexer.java @@ -12,15 +12,22 @@ import com.github.javaparser.ast.expr.VariableDeclarationExpr; import com.github.javaparser.ast.nodeTypes.NodeWithSimpleName; import com.github.javaparser.ast.visitor.VoidVisitorAdapter; +import com.github.javaparser.resolution.Resolvable; +import com.github.javaparser.resolution.UnsolvedSymbolException; import com.github.javaparser.resolution.declarations.ResolvedClassDeclaration; import com.github.javaparser.resolution.declarations.ResolvedDeclaration; +import com.github.javaparser.resolution.declarations.ResolvedMethodDeclaration; import com.github.javaparser.resolution.types.ResolvedType; import com.github.javaparser.symbolsolver.JavaSymbolSolver; import com.github.javaparser.symbolsolver.javaparsermodel.declarations.*; import com.github.javaparser.symbolsolver.model.resolution.TypeSolver; +import com.github.javaparser.symbolsolver.reflectionmodel.ReflectionMethodDeclaration; import com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver; +import com.github.javaparser.symbolsolver.resolution.typesolvers.JarTypeSolver; import com.github.javaparser.symbolsolver.resolution.typesolvers.JavaParserTypeSolver; import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver; +import com.github.javaparser.symbolsolver.utils.SymbolSolverCollectionStrategy; +import com.github.javaparser.utils.ProjectRoot; import java.io.File; import java.io.FileNotFoundException; @@ -41,6 +48,7 @@ public class DocumentIndexer { private boolean indexed = false; private Set rangeIds = new HashSet<>(); private Map definitions = new HashMap<>(); + private CompilationUnit cu; public DocumentIndexer( String projectRoot, @@ -48,7 +56,8 @@ public DocumentIndexer( String pathname, String projectId, Emitter emitter, - Map indexers + Map indexers, + CompilationUnit cu ) { this.projectRoot = projectRoot; this.noContents = noContents; @@ -56,6 +65,7 @@ public DocumentIndexer( this.projectId = projectId; this.emitter = emitter; this.indexers = indexers; + this.cu = cu; } public int numDefinitions() { @@ -72,10 +82,6 @@ public void index() { } private void doIndex() { - JavaSymbolSolver symbolSolver = getSymbolSolver(); - StaticJavaParser.getConfiguration().setSymbolResolver(symbolSolver); - CompilationUnit cu = parse(); - Map args = Map.of( "languageId", "java", "uri", String.format("file://%s", Paths.get(pathname).toAbsolutePath().toString()) @@ -91,7 +97,7 @@ private void doIndex() { } this.documentId = emitter.emitVertex("document", args); - cu.accept(new LSIFVisitor(symbolSolver), null); + this.cu.accept(new LSIFVisitor(), null); } public void postIndex() { @@ -103,25 +109,6 @@ public void postIndex() { emitter.emitEdge("contains", Map.of("outV", documentId, "inVs", rangeIds.stream().sorted().toArray())); } - private JavaSymbolSolver getSymbolSolver() { - return new JavaSymbolSolver(getTypeSolver()); - } - - private TypeSolver getTypeSolver() { - CombinedTypeSolver typeSolver = new CombinedTypeSolver(); - typeSolver.add(new JavaParserTypeSolver(projectRoot)); - typeSolver.add(new ReflectionTypeSolver()); - return typeSolver; - } - - private CompilationUnit parse() { - try { - return StaticJavaParser.parse(new File(pathname)); - } catch (FileNotFoundException ex) { - throw new RuntimeException(String.format("Failed to parse %s", pathname)); - } - } - private void linkUses(DefinitionMeta meta, String documentId) { String resultId = emitter.emitVertex("referenceResult", Map.of()); @@ -144,10 +131,9 @@ private void linkUses(DefinitionMeta meta, String documentId) { } private class LSIFVisitor extends VoidVisitorAdapter { - private JavaSymbolSolver symbolSolver; + private boolean log; - public LSIFVisitor(JavaSymbolSolver symbolSolver) { - this.symbolSolver = symbolSolver; + public LSIFVisitor() { } // TODO - field access @@ -158,7 +144,16 @@ public LSIFVisitor(JavaSymbolSolver symbolSolver) { @Override public void visit(final MethodCallExpr n, final Void arg) { super.visit(n, arg); - emitUse(n); + if (n.getName().getIdentifier().equals("postIndex")) { + this.log = true; + } + try { + System.out.println(n.resolve()); + emitUse(n, n.getScope().resolve()); + } catch (RuntimeException e) { + System.out.println(e.getMessage()); + } + this.log = false; } @Override @@ -176,7 +171,11 @@ public void visit(final MethodDeclaration n, final Void arg) { @Override public void visit(final NameExpr n, final Void arg) { super.visit(n, arg); - emitUse(n); + try { + emitUse(n, n.resolve()); + } catch (RuntimeException e) { + System.out.println(e.getMessage()); + } } @Override @@ -214,18 +213,14 @@ private void emitDefinition(Node n) { definitions.put(range, new DefinitionMeta(rangeId, resultSetId)); // + contents? } - private void emitUse(Node n) { - ResolvedDeclaration definition; - try { - definition = symbolSolver.resolveDeclaration(n, ResolvedDeclaration.class); - } catch (RuntimeException ex) { - // ignore - return; - } - - Node definitionNode = getNode(definition); + private void emitUse(Node n, ResolvedDeclaration decl) { + Node definitionNode = getNode(decl); + if (this.log) System.out.println(decl); if (definitionNode == null) { + if (this.log) System.out.println("NO DEF"); return; + } else { + if (this.log) System.out.println("DEF"); } Optional definitionPathContainer = definitionNode.findCompilationUnit() @@ -254,10 +249,13 @@ private Node getNode(ResolvedDeclaration def) { : JavaParserSymbolDeclaration.class.isInstance(def) ? JavaParserSymbolDeclaration.class.cast(def).getWrappedNode() // : JavaParserTypeVariableDeclaration.class.isInstance(def) ? JavaParserTypeVariableDeclaration.class.cast(def).getWrappedNode() : JavaParserVariableDeclaration.class.isInstance(def) ? JavaParserVariableDeclaration.class.cast(def).getWrappedNode() +// : ReflectionMethodDeclaration.class.isInstance(def) ? JavaParserMethodDeclaration.class.cast(def).getWrappedNode() : null; } private void emitUse(Node n, Node definition, String definitionPath) { + if (this.log) System.out.println("emitUse2..."); + DocumentIndexer indexer = indexers.get(definitionPath); Optional rangeContainer = getRange(n); @@ -277,6 +275,7 @@ private void emitUse(Node n, Node definition, String definitionPath) { String rangeId = emitter.emitVertex("range", createRange(range)); emitter.emitEdge("next", Map.of("outV", rangeId, "inV", meta.resultSetId)); + if (this.log) System.out.println("emitUse2 edge..."); if (meta.definitionResultId == null) { String resultId = emitter.emitVertex("definitionResult", Map.of()); diff --git a/src/main/java/ProjectIndexer.java b/src/main/java/ProjectIndexer.java index c6f9f656..3e518414 100644 --- a/src/main/java/ProjectIndexer.java +++ b/src/main/java/ProjectIndexer.java @@ -1,3 +1,9 @@ +import com.github.javaparser.ParseResult; +import com.github.javaparser.ast.CompilationUnit; +import com.github.javaparser.symbolsolver.utils.SymbolSolverCollectionStrategy; +import com.github.javaparser.utils.ProjectRoot; +import com.github.javaparser.utils.SourceRoot; + import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -31,30 +37,36 @@ public void index() { "kind", "java" )); - List files = createFileStream() - .map(x -> x.toString()) - .filter(f -> f.endsWith(".java")) - .sorted() - .collect(Collectors.toList()); - Map indexers = new HashMap<>(); - for (String pathname : files) { - indexers.put(pathname, new DocumentIndexer( - arguments.projectRoot, - arguments.noContents, - pathname, - projectId, - emitter, - indexers - )); + + ProjectRoot root = new SymbolSolverCollectionStrategy().collect(Paths.get(arguments.projectRoot)); + for (SourceRoot sr : root.getSourceRoots()) { + try { + sr.tryToParse(); + } catch (IOException e) { + e.printStackTrace(); + } + for (CompilationUnit cu : sr.getCompilationUnits()) { + // .accept(visitor) + String pathname = cu.getStorage().get().getPath().toAbsolutePath().toString(); + indexers.put(pathname, new DocumentIndexer( + arguments.projectRoot, + arguments.noContents, + pathname, + projectId, + emitter, + indexers, + cu + )); + } } - for (String pathname : files) { - indexers.get(pathname).index(); + for (DocumentIndexer indexer : indexers.values()) { + indexer.index(); } - for (String pathname : files) { - indexers.get(pathname).postIndex(); + for (DocumentIndexer indexer : indexers.values()) { + indexer.postIndex(); } for (DocumentIndexer indexer : indexers.values()) { @@ -62,12 +74,4 @@ public void index() { numDefinitions += indexer.numDefinitions(); } } - - private Stream createFileStream() { - try { - return Files.walk(Paths.get(arguments.projectRoot)); - } catch (IOException ex) { - throw new RuntimeException(String.format("Failed to walk files in %s", arguments.projectRoot)); - } - } }