/
TypeDeclaration.java
97 lines (75 loc) · 3.03 KB
/
TypeDeclaration.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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
package me.tomassetti.symbolsolver.model.declarations;
import com.github.javaparser.ast.Node;
import me.tomassetti.symbolsolver.resolution.Context;
import me.tomassetti.symbolsolver.resolution.SymbolReference;
import me.tomassetti.symbolsolver.resolution.TypeSolver;
import me.tomassetti.symbolsolver.model.typesystem.MethodUsage;
import me.tomassetti.symbolsolver.model.typesystem.TypeUsage;
import me.tomassetti.symbolsolver.model.typesystem.ReferenceTypeUsage;
import java.util.List;
import java.util.Optional;
/**
* A declaration of a type. It could be a primitive type, an enum, a class, an interface or a type variable.
* It cannot be an annotation or an array.
*
* @author Federico Tomassetti
*/
public interface TypeDeclaration extends Declaration, TypeParametrized {
String getQualifiedName();
Context getContext();
default SymbolReference<MethodDeclaration> solveMethod(String name, List<TypeUsage> parameterTypes, TypeSolver typeSolver) {
return getContext().solveMethod(name, parameterTypes, typeSolver);
}
default Optional<MethodUsage> solveMethodAsUsage(String name, List<TypeUsage> parameterTypes, TypeSolver typeSolver, Context invokationContext, List<TypeUsage> typeParameterValues) {
return getContext().solveMethodAsUsage(name, parameterTypes, typeSolver);
}
/**
* Get how the type is used in the given context.
* @param node
* @return
*/
@Deprecated
TypeUsage getUsage(Node node);
boolean isAssignableBy(TypeUsage typeUsage, TypeSolver typeSolver);
default boolean canBeAssignedTo(TypeDeclaration other, TypeSolver typeSolver) {
return other.isAssignableBy(this, typeSolver);
}
FieldDeclaration getField(String name, TypeSolver typeSolver);
boolean hasField(String name, TypeSolver typeSolver);
default boolean isAssignableBy(TypeDeclaration other, TypeSolver typeSolver) {
return isAssignableBy(new ReferenceTypeUsage(other), typeSolver);
}
SymbolReference<? extends ValueDeclaration> solveSymbol(String substring, TypeSolver typeSolver);
/**
* Try to solve a symbol just in the declaration, it does not delegate to the container.
* @param substring
* @param typeSolver
* @return
*/
SymbolReference<TypeDeclaration> solveType(String substring, TypeSolver typeSolver);
List<ReferenceTypeUsage> getAllAncestors(TypeSolver typeSolver);
default boolean isClass() {
return false;
}
default boolean isInterface() {
return false;
}
default boolean isEnum() {
return false;
}
default boolean isTypeVariable() { return false; }
@Override
default boolean isType() {
return true;
}
@Override
default TypeDeclaration asType() {
return this;
}
default ClassDeclaration asClass() {
throw new UnsupportedOperationException(this.getClass().getCanonicalName());
}
default InterfaceDeclaration asInterface() {
throw new UnsupportedOperationException(this.getClass().getCanonicalName());
}
}