/
ClassDeclaration.java
57 lines (48 loc) · 2.16 KB
/
ClassDeclaration.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
package me.tomassetti.symbolsolver.model.declarations;
import me.tomassetti.symbolsolver.resolution.TypeSolver;
import me.tomassetti.symbolsolver.model.typesystem.ReferenceTypeUsage;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.stream.Collectors;
/**
* A class declaration.
*/
public interface ClassDeclaration extends TypeDeclaration, TypeParametrized {
@Override
default boolean isClass() {
return true;
}
ClassDeclaration getSuperClass(TypeSolver typeSolvers);
List<InterfaceDeclaration> getInterfaces(TypeSolver typeSolver);
default List<ClassDeclaration> getAllSuperClasses(TypeSolver typeSolver) {
// TODO it could specify type parameters: they should appear
List<ClassDeclaration> superclasses = new ArrayList<>();
ClassDeclaration superClass = getSuperClass(typeSolver);
if (superClass != null) {
superclasses.add(superClass);
superclasses.addAll(superClass.getAllSuperClasses(typeSolver));
}
return superclasses;
}
default List<InterfaceDeclaration> getAllInterfaces(TypeSolver typeSolver) {
// TODO it could specify type parameters: they should appear
List<InterfaceDeclaration> interfaces = new ArrayList<>();
ClassDeclaration superClass = getSuperClass(typeSolver);
for (InterfaceDeclaration interfaceDeclaration : getInterfaces(typeSolver)){
interfaces.add(interfaceDeclaration);
interfaces.addAll(interfaceDeclaration.getAllInterfacesExtended(typeSolver));
}
return interfaces;
}
@Override
default List<ReferenceTypeUsage> getAllAncestors(TypeSolver typeSolver) {
List<ReferenceTypeUsage> ancestors = new LinkedList<>();
if (getSuperClass(typeSolver) != null) {
ancestors.add(new ReferenceTypeUsage(getSuperClass(typeSolver)));
ancestors.addAll(getSuperClass(typeSolver).getAllAncestors(typeSolver));
}
ancestors.addAll(getAllInterfaces(typeSolver).stream().map((i)->new ReferenceTypeUsage(i)).collect(Collectors.<ReferenceTypeUsage>toList()));
return ancestors;
}
}