/
SymbolSolver.java
68 lines (55 loc) · 2.71 KB
/
SymbolSolver.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package me.tomassetti.symbolsolver.model;
import com.github.javaparser.ast.Node;
import com.github.javaparser.ast.type.ClassOrInterfaceType;
import com.github.javaparser.ast.type.ReferenceType;
import com.github.javaparser.ast.type.Type;
import me.tomassetti.symbolsolver.model.javaparser.JavaParserFactory;
import me.tomassetti.symbolsolver.model.javaparser.UnsolvedSymbolException;
import java.util.List;
/**
* Created by federico on 28/07/15.
*/
public class SymbolSolver {
private TypeSolver typeSolver;
public SymbolSolver(TypeSolver typeSolver){
if (typeSolver == null) throw new IllegalArgumentException();
this.typeSolver = typeSolver;
}
public SymbolReference solveSymbol(String name, Context context) {
return context.solveSymbol(name, typeSolver);
}
public SymbolReference solveSymbol(String name, Node node) {
return solveSymbol(name, JavaParserFactory.getContext(node));
}
public SymbolReference<me.tomassetti.symbolsolver.model.TypeDeclaration> solveType(String name, Context context) {
return context.solveType(name, typeSolver);
}
public SymbolReference<me.tomassetti.symbolsolver.model.TypeDeclaration> solveType(String name, Node node) {
return solveType(name, JavaParserFactory.getContext(node));
}
public SymbolReference<MethodDeclaration> solveMethod(String methodName, List<TypeUsage> params, Context context) {
return context.solveMethod(methodName, params, typeSolver);
}
public SymbolReference<MethodDeclaration> solveMethod(String methodName, List<TypeUsage> params, Node node) {
return solveMethod(methodName, params, JavaParserFactory.getContext(node));
}
public me.tomassetti.symbolsolver.model.TypeDeclaration solveType(Type type) {
if (type instanceof ReferenceType) {
ReferenceType referenceType = (ReferenceType) type;
// TODO consider array modifiers
return solveType(referenceType.getType());
} else if (type instanceof ClassOrInterfaceType) {
ClassOrInterfaceType classType = (ClassOrInterfaceType) type;
SymbolReference<SymbolDeclaration> ref = solveSymbol(classType.getName(), type);
if (!ref.isSolved()) {
throw new UnsolvedSymbolException(JavaParserFactory.getContext(type), classType.getName());
}
if (!(ref.getCorrespondingDeclaration().isType())) {
throw new IllegalStateException(ref.getCorrespondingDeclaration().toString());
}
return ref.getCorrespondingDeclaration().asTypeDeclaration();
} else {
throw new UnsupportedOperationException(type.getClass().getCanonicalName());
}
}
}