4
4
5
5
import javax .lang .model .element .TypeElement ;
6
6
import javax .lang .model .element .TypeParameterElement ;
7
- import javax .lang .model .type .DeclaredType ;
8
- import javax .lang .model .type .TypeKind ;
9
7
import javax .lang .model .type .TypeMirror ;
10
8
import java .util .ArrayList ;
11
9
import java .util .Collections ;
12
10
import java .util .HashMap ;
13
- import java .util .LinkedHashMap ;
14
11
import java .util .List ;
15
12
import java .util .Map ;
16
- import java .util .Map .Entry ;
17
13
import java .util .Optional ;
18
14
19
15
import static net .jbock .compiler .HierarchyUtil .getTypeTree ;
20
16
21
17
class Resolver {
22
18
23
- private final Map <Integer , String > names ;
24
- private final Map <String , TypeMirror > results = new HashMap <>();
25
- private final List <Extension > extensions = new ArrayList <>();
19
+ private final List <Extension > extensions ;
26
20
27
- private Resolver (Map <Integer , String > names ) {
28
- this .names = names ;
29
- }
30
-
31
- private void setResults (Map <String , TypeMirror > results ) {
32
- this .results .clear ();
33
- this .results .putAll (results );
34
- }
35
-
36
- private void setNames (Map <Integer , String > names ) {
37
- this .names .clear ();
38
- this .names .putAll (names );
39
- }
40
-
41
- private void clearNames () {
42
- this .names .clear ();
43
- }
44
-
45
- private void step (Extension extension ) {
46
- TypeElement b = extension .baseClass ();
47
- DeclaredType x = extension .extensionClass ();
48
- Map <Integer , String > newNames = new LinkedHashMap <>();
49
- Map <String , TypeMirror > newResults = new LinkedHashMap <>(results );
50
- List <? extends TypeMirror > xParams = x .getTypeArguments ();
51
- List <? extends TypeParameterElement > bParams = b .getTypeParameters ();
52
- for (Entry <Integer , String > entry : names .entrySet ()) {
53
- if (xParams .isEmpty ()) {
54
- // failure: raw type
55
- results .clear ();
56
- return ;
57
- }
58
- TypeMirror xParam = xParams .get (entry .getKey ());
59
- if (xParam .getKind () == TypeKind .TYPEVAR ) {
60
- for (int i = 0 ; i < bParams .size (); i ++) {
61
- TypeParameterElement bParam = bParams .get (i );
62
- if (bParam .toString ().equals (xParam .toString ())) {
63
- newNames .put (i , entry .getValue ());
64
- break ;
65
- }
66
- }
67
- } else {
68
- newResults .put (entry .getValue (), xParam );
69
- }
70
- }
71
- setResults (newResults );
72
- setNames (newNames );
73
- }
74
-
75
- static Resolver resolve (TypeMirror goal , TypeMirror start , String ... typevars ) {
76
- Map <Integer , String > map = new HashMap <>();
77
- for (int i = 0 ; i < typevars .length ; i ++) {
78
- String typevar = typevars [i ];
79
- map .put (i , typevar );
80
- }
81
- return resolve (goal , start , map );
21
+ private Resolver (List <Extension > extensions ) {
22
+ List <Extension > reversed = new ArrayList <>(extensions );
23
+ Collections .reverse (reversed );
24
+ this .extensions = Collections .unmodifiableList (reversed );
82
25
}
83
26
84
- private static Resolver resolve (
27
+ static Resolver resolve (
85
28
TypeMirror goal ,
86
- TypeMirror start ,
87
- Map <Integer , String > names ) {
29
+ TypeMirror start ) {
88
30
List <TypeElement > family = getTypeTree (start );
89
- Resolver resolver = new Resolver (names );
90
31
Extension extension ;
91
32
TypeTool tool = TypeTool .get ();
92
33
TypeMirror nextGoal = tool .erasure (goal );
34
+ List <Extension > extensions = new ArrayList <>();
93
35
while ((extension = findExtension (family , nextGoal )) != null ) {
94
- resolver .step (extension );
95
- resolver .extensions .add (extension );
36
+ extensions .add (extension );
96
37
nextGoal = tool .erasure (extension .baseClass ().asType ());
97
38
}
98
- if (resolver .names .isEmpty ()) {
99
- // everything resolved
100
- return resolver ;
101
- }
102
- if (tool .eql (nextGoal , tool .erasure (start ))) {
103
- List <? extends TypeMirror > typeargs = tool .typeargs (start );
104
- Map <String , TypeMirror > results = new LinkedHashMap <>();
105
- for (Entry <Integer , String > entry : resolver .names .entrySet ()) {
106
- if (entry .getKey () < typeargs .size ()) {
107
- results .put (entry .getValue (), typeargs .get (entry .getKey ()));
108
- }
109
- }
110
- results .putAll (resolver .results );
111
- resolver .clearNames ();
112
- resolver .setResults (results );
113
- }
114
- return resolver ;
39
+ return new Resolver (extensions );
115
40
}
116
41
117
42
private static Extension findExtension (List <TypeElement > family , TypeMirror qname ) {
@@ -138,17 +63,10 @@ private static Extension findExtension(TypeElement typeElement, TypeMirror qname
138
63
return null ;
139
64
}
140
65
141
- private List <Extension > reverseExtensions () {
142
- List <Extension > reversed = new ArrayList <>(this .extensions );
143
- Collections .reverse (reversed );
144
- return reversed ;
145
- }
146
-
147
66
Optional <TypeMirror > resolveTypevars () {
148
67
if (extensions .isEmpty ()) {
149
68
return Optional .empty ();
150
69
}
151
- List <Extension > extensions = reverseExtensions ();
152
70
TypeMirror x = extensions .get (0 ).extensionClass ();
153
71
for (int i = 1 ; i < extensions .size (); i ++) {
154
72
Extension extension = extensions .get (i );
@@ -169,6 +87,6 @@ private static TypeMirror resolveStep(TypeMirror x, Extension ex1) {
169
87
170
88
@ Override
171
89
public String toString () {
172
- return String . format ( "%s %s" , names , results );
90
+ return extensions . toString ( );
173
91
}
174
92
}
0 commit comments