11
11
import com .github .javaparser .ast .type .TypeParameter ;
12
12
import com .github .javaparser .ast .visitor .ModifierVisitor ;
13
13
import com .github .javaparser .ast .visitor .Visitable ;
14
+ import com .github .javaparser .symbolsolver .JavaSymbolSolver ;
15
+ import com .github .javaparser .symbolsolver .resolution .typesolvers .CombinedTypeSolver ;
16
+ import com .github .javaparser .symbolsolver .resolution .typesolvers .JavaParserTypeSolver ;
17
+ import com .github .javaparser .symbolsolver .resolution .typesolvers .ReflectionTypeSolver ;
14
18
import com .github .javaparser .utils .CodeGenerationUtils ;
15
19
import com .github .javaparser .utils .SourceRoot ;
16
20
import io .github .bldl .annotationProcessing .annotations .MyVariance ;
@@ -46,9 +50,14 @@ public class AstManipulator {
46
50
public AstManipulator (Messager messager , String sourceFolder ) {
47
51
this .messager = messager ;
48
52
this .sourceFolder = sourceFolder ;
53
+ CombinedTypeSolver typeSolver = new CombinedTypeSolver ();
54
+ typeSolver .add (new ReflectionTypeSolver ());
55
+ typeSolver .add (new JavaParserTypeSolver (Paths .get ("src/main/java" )));
56
+ JavaSymbolSolver symbolSolver = new JavaSymbolSolver (typeSolver );
49
57
sourceRoot = new SourceRoot (
50
58
CodeGenerationUtils .mavenModuleRoot (AstManipulator .class ).resolve (sourceFolder ));
51
- classHierarchy = computeClassHierarchy ();
59
+ sourceRoot .getParserConfiguration ().setSymbolResolver (symbolSolver );
60
+ classHierarchy = (new ClassHierarchyComputer (sourceRoot , messager , sourceFolder )).computeClassHierarchy ();
52
61
}
53
62
54
63
public void applyChanges () {
@@ -110,13 +119,6 @@ public Visitable visit(TypeParameter n, Void arg) {
110
119
}, null );
111
120
}
112
121
113
- public ClassHierarchyGraph <String > computeClassHierarchy () {
114
- ClassHierarchyGraph <String > g = new ClassHierarchyGraph <>();
115
- g .addVertex ("Object" );
116
- computeClassHierarchyRec (g , Paths .get (sourceFolder ).toFile (), "" );
117
- return g ;
118
- }
119
-
120
122
private ClassData computeClassData (String cls , String packageName , Map <String , MyVariance > mp ) {
121
123
CompilationUnit cu = sourceRoot .parse (packageName , cls );
122
124
Map <String , ParamData > indexAndBound = new HashMap <>();
@@ -151,9 +153,7 @@ private void changeAST(File dir, ClassData classData, Map<String, MethodData> me
151
153
Set <Pair <String , ClassOrInterfaceType >> varsToWatch = new HashSet <>();
152
154
cu .accept (new VariableCollector (classData ), varsToWatch );
153
155
cu .accept (
154
- new SubtypingCheckVisitor (collectMethodParams (cu , classData ), collectMethodTypes (cu ), messager ,
155
- varsToWatch , classData ,
156
- classHierarchy ),
156
+ new SubtypingCheckVisitor (collectMethodParams (cu , classData ), messager , classData , classHierarchy ),
157
157
null );
158
158
cu .accept (new TypeEraserVisitor (classData ), null );
159
159
for (Pair <String , ClassOrInterfaceType > var : varsToWatch ) {
@@ -163,35 +163,7 @@ private void changeAST(File dir, ClassData classData, Map<String, MethodData> me
163
163
}
164
164
}
165
165
166
- private void computeClassHierarchyRec (ClassHierarchyGraph <String > g , File dir , String packageName ) {
167
- for (File file : dir .listFiles ()) {
168
- String fileName = file .getName ();
169
- if (file .isDirectory ()) {
170
- if (!fileName .equals (OUTPUT_NAME ))
171
- computeClassHierarchyRec (g , file , appendPackageDeclaration (packageName , fileName ));
172
- continue ;
173
- }
174
- if (!isJavaFile (file ))
175
- continue ;
176
-
177
- CompilationUnit cu = sourceRoot .parse (packageName , fileName );
178
-
179
- cu .findAll (ClassOrInterfaceDeclaration .class ).forEach (cls -> {
180
- NodeList <ClassOrInterfaceType > supertypes = cls .getExtendedTypes ();
181
- supertypes .addAll (cls .getImplementedTypes ());
182
- g .addVertex (cls .getNameAsString ());
183
- for (ClassOrInterfaceType supertype : supertypes ) {
184
- if (!g .containsVertex (supertype .getNameAsString ()))
185
- g .addVertex (supertype .getNameAsString ());
186
- g .addEdge (supertype .getNameAsString (), cls .getNameAsString ());
187
- }
188
- if (supertypes .isEmpty ())
189
- g .addEdge ("Object" , cls .getNameAsString ());
190
- });
191
- }
192
- }
193
-
194
- private boolean isJavaFile (File file ) {
166
+ public static boolean isJavaFile (File file ) {
195
167
return file .getName ().endsWith (".java" );
196
168
}
197
169
@@ -200,38 +172,27 @@ private void changePackageDeclaration(CompilationUnit cu) {
200
172
cu .setPackageDeclaration (new PackageDeclaration (new Name (newPackageName )));
201
173
}
202
174
203
- private String appendPackageDeclaration (String existing , String toAppend ) {
175
+ public static String appendPackageDeclaration (String existing , String toAppend ) {
204
176
if (existing .equals ("" ))
205
177
return toAppend ;
206
178
return existing + "." + toAppend ;
207
179
}
208
180
209
181
private Map <String , Map <Integer , Type >> collectMethodParams (CompilationUnit cu , ClassData classData ) {
210
- Map <String , Map <Integer , Type >> mp = new HashMap <>();
182
+ Map <String , Map <Integer , Type >> methodParams = new HashMap <>();
211
183
cu .findAll (MethodDeclaration .class ).forEach (dec -> {
184
+ String methodName = dec .getNameAsString ();
185
+ if (methodParams .containsKey (methodName )) {
186
+ messager .printMessage (Kind .ERROR , "Duplicate methods inside a class. Can't handle polymorphism." );
187
+ return ;
188
+ }
189
+ methodParams .put (methodName , new HashMap <>());
212
190
NodeList <Parameter > params = dec .getParameters ();
213
191
for (int i = 0 ; i < params .size (); ++i ) {
214
- Parameter param = params .get (i );
215
- if (!(param .getType () instanceof ClassOrInterfaceType ))
216
- continue ;
217
- ClassOrInterfaceType type = ((ClassOrInterfaceType ) param .getType ());
218
- String methodName = dec .getNameAsString ();
219
- if (type .getNameAsString ().equals (classData .className ())) {
220
- mp .putIfAbsent (methodName , new HashMap <>());
221
- mp .get (methodName ).put (i ,
222
- type );
223
- }
192
+ Type type = params .get (i ).getType ();
193
+ methodParams .get (methodName ).put (i , type );
224
194
}
225
195
});
226
- return mp ;
227
- }
228
-
229
- private Map <String , Type > collectMethodTypes (CompilationUnit cu ) {
230
- Map <String , Type > mp = new HashMap <>();
231
- cu .findAll (MethodDeclaration .class ).forEach (dec -> {
232
- String methodName = dec .getNameAsString ();
233
- mp .put (methodName , dec .getType ());
234
- });
235
- return mp ;
196
+ return methodParams ;
236
197
}
237
198
}
0 commit comments