Skip to content

Commit 55e9873

Browse files
find all classes and fields of interest
1 parent aae00c1 commit 55e9873

File tree

5 files changed

+79
-90
lines changed

5 files changed

+79
-90
lines changed

src/main/java/anthonisen/felix/astParsing/Covariancer.java

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,34 +4,50 @@
44
import com.github.javaparser.utils.CodeGenerationUtils;
55
import com.github.javaparser.utils.SourceRoot;
66

7+
import anthonisen.felix.astParsing.util.MethodData;
8+
import anthonisen.felix.astParsing.visitors.CastInsertionVisitor;
9+
import anthonisen.felix.astParsing.visitors.MethodCollector;
10+
import anthonisen.felix.astParsing.visitors.TypeEraserVisitor;
11+
import anthonisen.felix.astParsing.visitors.VariableCollector;
12+
import anthonisen.felix.astParsing.visitors.ClassCollector;
13+
714
import java.io.File;
815
import java.nio.file.Paths;
916
import java.util.Arrays;
1017
import java.util.HashMap;
18+
import java.util.HashSet;
1119
import java.util.Map;
20+
import java.util.Set;
1221

1322
public class Covariancer {
1423

1524
public void makeCovariant() {
16-
String sourceFolder = "src/main/java/anthonisen/felix/example";
25+
String sourceFolder = "example";
1726
SourceRoot sourceRoot = new SourceRoot(
1827
CodeGenerationUtils.mavenModuleRoot(Covariancer.class).resolve(sourceFolder));
1928
MethodCollector collector = new MethodCollector(Arrays.asList("T"));
2029
Map<String, MethodData> methodMap = new HashMap<>();
30+
Set<String> classesToWatch = new HashSet<String>();
2131
sourceRoot.parse("", "Herd.java").accept(collector, methodMap);
2232

2333
File dir = Paths.get(sourceFolder).toFile();
2434
assert dir.exists();
2535
assert dir.isDirectory();
26-
2736
for (File file : dir.listFiles()) {
2837
CompilationUnit cu = sourceRoot.parse("", file.getName());
29-
CastInsertionVisitor vis = new CastInsertionVisitor("catHerd", methodMap);
30-
cu.accept(vis, null);
31-
System.out.println(cu);
38+
cu.accept(new ClassCollector(), classesToWatch);
39+
}
40+
for (File file : dir.listFiles()) {
41+
CompilationUnit cu = sourceRoot.parse("", file.getName());
42+
Set<String> varsToWatch = new HashSet<>();
43+
cu.accept(new VariableCollector(classesToWatch), varsToWatch);
44+
cu.accept(new TypeEraserVisitor(), null);
45+
for (String var : varsToWatch) {
46+
CastInsertionVisitor castInsertionVisitor = new CastInsertionVisitor(var, methodMap);
47+
cu.accept(castInsertionVisitor, null);
48+
49+
}
3250
}
33-
3451
sourceRoot.saveAll(CodeGenerationUtils.mavenModuleRoot(Covariancer.class).resolve(Paths.get("output")));
35-
3652
}
3753
}

src/main/java/anthonisen/felix/astParsing/util/TypeReplacer.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ public static boolean replaceTypes(Type type, String targetTypeName, String newT
88
boolean found = false;
99
if (type instanceof ClassOrInterfaceType) {
1010
ClassOrInterfaceType classType = (ClassOrInterfaceType) type;
11-
System.out.println(type);
1211
if (classType.asString().equals(targetTypeName)) {
1312
found = true;
1413
classType.replace(new ClassOrInterfaceType(null, newTypeName));
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package anthonisen.felix.astParsing.visitors;
2+
3+
import java.util.Set;
4+
5+
import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
6+
import com.github.javaparser.ast.visitor.VoidVisitorAdapter;
7+
8+
public class ClassCollector extends VoidVisitorAdapter<Set<String>> {
9+
@Override
10+
public void visit(ClassOrInterfaceDeclaration n, Set<String> arg) {
11+
super.visit(n, arg);
12+
if (n.getTypeParameters().isNonEmpty()) {
13+
arg.add(n.getNameAsString());
14+
}
15+
}
16+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package anthonisen.felix.astParsing.visitors;
2+
3+
import java.util.Set;
4+
5+
import com.github.javaparser.ast.body.Parameter;
6+
import com.github.javaparser.ast.body.VariableDeclarator;
7+
import com.github.javaparser.ast.visitor.VoidVisitorAdapter;
8+
import com.github.javaparser.ast.type.ClassOrInterfaceType;
9+
import com.github.javaparser.ast.type.Type;
10+
11+
public class VariableCollector extends VoidVisitorAdapter<Set<String>> {
12+
Set<String> classesToWatch;
13+
14+
public VariableCollector(Set<String> classesToWatch) {
15+
this.classesToWatch = classesToWatch;
16+
}
17+
18+
@Override
19+
public void visit(VariableDeclarator n, Set<String> arg) {
20+
super.visit(n, arg);
21+
handleType(n.getNameAsString(), n.getType(), arg);
22+
}
23+
24+
@Override
25+
public void visit(Parameter n, Set<String> arg) {
26+
super.visit(n, arg);
27+
handleType(n.getNameAsString(), n.getType(), arg);
28+
}
29+
30+
private void handleType(String varName, Type type, Set<String> arg) {
31+
if (!(type instanceof ClassOrInterfaceType))
32+
return;
33+
34+
ClassOrInterfaceType classType = (ClassOrInterfaceType) type;
35+
36+
if (!classesToWatch.contains(classType.getNameAsString()))
37+
return; // visit typeparams, if present
38+
arg.add(varName);
39+
}
40+
}

src/main/java/anthonisen/felix/misc/TypeEraser.java

Lines changed: 0 additions & 82 deletions
This file was deleted.

0 commit comments

Comments
 (0)