Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
79 changes: 39 additions & 40 deletions src/main/java/DocumentIndexer.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -41,21 +48,24 @@ public class DocumentIndexer {
private boolean indexed = false;
private Set<String> rangeIds = new HashSet<>();
private Map<Range, DefinitionMeta> definitions = new HashMap<>();
private CompilationUnit cu;

public DocumentIndexer(
String projectRoot,
boolean noContents,
String pathname,
String projectId,
Emitter emitter,
Map<String, DocumentIndexer> indexers
Map<String, DocumentIndexer> indexers,
CompilationUnit cu
) {
this.projectRoot = projectRoot;
this.noContents = noContents;
this.pathname = pathname;
this.projectId = projectId;
this.emitter = emitter;
this.indexers = indexers;
this.cu = cu;
}

public int numDefinitions() {
Expand All @@ -72,10 +82,6 @@ public void index() {
}

private void doIndex() {
JavaSymbolSolver symbolSolver = getSymbolSolver();
StaticJavaParser.getConfiguration().setSymbolResolver(symbolSolver);
CompilationUnit cu = parse();

Map<String, Object> args = Map.of(
"languageId", "java",
"uri", String.format("file://%s", Paths.get(pathname).toAbsolutePath().toString())
Expand All @@ -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() {
Expand All @@ -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());

Expand All @@ -144,10 +131,9 @@ private void linkUses(DefinitionMeta meta, String documentId) {
}

private class LSIFVisitor extends VoidVisitorAdapter<Void> {
private JavaSymbolSolver symbolSolver;
private boolean log;

public LSIFVisitor(JavaSymbolSolver symbolSolver) {
this.symbolSolver = symbolSolver;
public LSIFVisitor() {
}

// TODO - field access
Expand All @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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<String> definitionPathContainer = definitionNode.findCompilationUnit()
Expand Down Expand Up @@ -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<Range> rangeContainer = getRange(n);
Expand All @@ -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());
Expand Down
58 changes: 31 additions & 27 deletions src/main/java/ProjectIndexer.java
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -31,43 +37,41 @@ public void index() {
"kind", "java"
));

List<String> files = createFileStream()
.map(x -> x.toString())
.filter(f -> f.endsWith(".java"))
.sorted()
.collect(Collectors.toList());

Map<String, DocumentIndexer> 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()) {
numFiles++;
numDefinitions += indexer.numDefinitions();
}
}

private Stream<Path> 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));
}
}
}