modified: ../../../../main/java/de/dhbwstuttgart/bytecode/TPHExtractor.java
modified: ../../../../main/java/de/dhbwstuttgart/bytecode/genericsGenerator/GeneratedGenericsFinder.java modified: ../../../../main/java/de/dhbwstuttgart/bytecode/insertGenerics/FamilyOfGeneratedGenerics.java modified: ../../../../main/java/de/dhbwstuttgart/bytecode/utilities/MethodAndTPH.java modified: ../../../java/constraintSimplify/FamilyOfGenerics.java modified: ../../../java/insertGenerics/TestTPHsAndGenerics.java
This commit is contained in:
parent
f270686b3c
commit
5980f1c7b8
@ -9,6 +9,7 @@ import java.util.HashSet;
|
|||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Optional;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import de.dhbwstuttgart.bytecode.constraint.ExtendsConstraint;
|
import de.dhbwstuttgart.bytecode.constraint.ExtendsConstraint;
|
||||||
@ -26,10 +27,16 @@ import de.dhbwstuttgart.syntaxtree.Method;
|
|||||||
import de.dhbwstuttgart.syntaxtree.ParameterList;
|
import de.dhbwstuttgart.syntaxtree.ParameterList;
|
||||||
import de.dhbwstuttgart.syntaxtree.SourceFile;
|
import de.dhbwstuttgart.syntaxtree.SourceFile;
|
||||||
import de.dhbwstuttgart.syntaxtree.statement.Assign;
|
import de.dhbwstuttgart.syntaxtree.statement.Assign;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.AssignToField;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.Expression;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.LambdaExpression;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.ExpressionReceiver;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.FieldVar;
|
||||||
import de.dhbwstuttgart.syntaxtree.statement.LocalVar;
|
import de.dhbwstuttgart.syntaxtree.statement.LocalVar;
|
||||||
import de.dhbwstuttgart.syntaxtree.statement.LocalVarDecl;
|
import de.dhbwstuttgart.syntaxtree.statement.LocalVarDecl;
|
||||||
import de.dhbwstuttgart.syntaxtree.statement.MethodCall;
|
import de.dhbwstuttgart.syntaxtree.statement.MethodCall;
|
||||||
import de.dhbwstuttgart.syntaxtree.statement.Return;
|
import de.dhbwstuttgart.syntaxtree.statement.Return;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.Statement;
|
||||||
import de.dhbwstuttgart.syntaxtree.type.GenericRefType;
|
import de.dhbwstuttgart.syntaxtree.type.GenericRefType;
|
||||||
import de.dhbwstuttgart.syntaxtree.type.RefType;
|
import de.dhbwstuttgart.syntaxtree.type.RefType;
|
||||||
import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric;
|
import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric;
|
||||||
@ -45,13 +52,17 @@ import de.dhbwstuttgart.typeinference.result.ResultSet;
|
|||||||
public class TPHExtractor extends AbstractASTWalker {
|
public class TPHExtractor extends AbstractASTWalker {
|
||||||
// Alle TPHs der Felder werden iKopf der Klasse definiert
|
// Alle TPHs der Felder werden iKopf der Klasse definiert
|
||||||
// alle TPHs der Klasse: (TPH, is in Method?)
|
// alle TPHs der Klasse: (TPH, is in Method?)
|
||||||
public final SourceFile sf;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ordnet den Methodennamen ihre jeweiligen Methodenrespraesentationen in der abstrakte Syntax zu
|
* ordnet den Methodennamen ihre jeweiligen Methodenrespraesentationen der abstrakte Syntax in der jeweiligen aktuellen Klasse zu
|
||||||
*/
|
*/
|
||||||
public final HashMap<String, Method> nameToMeth;
|
public HashMap<String, Method> nameToMeth;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ordnet den Methodennamen ihre jeweiligen Methodenrespraesentationen der abstrakte Syntax in der jeweiligen aktuellen Klasse zu
|
||||||
|
*/
|
||||||
|
public HashMap<String,Expression> nameToField;
|
||||||
public final HashMap<String, Boolean> allTPHS = new HashMap<>();
|
public final HashMap<String, Boolean> allTPHS = new HashMap<>();
|
||||||
public final List<String> tphsClass = new ArrayList<>();
|
public final List<String> tphsClass = new ArrayList<>();
|
||||||
MethodAndTPH methodAndTph;
|
MethodAndTPH methodAndTph;
|
||||||
@ -65,12 +76,8 @@ public class TPHExtractor extends AbstractASTWalker {
|
|||||||
private ResultSet resultSet;
|
private ResultSet resultSet;
|
||||||
private Resolver resolver;
|
private Resolver resolver;
|
||||||
|
|
||||||
public TPHExtractor(SourceFile sf) {
|
public TPHExtractor() {
|
||||||
this.sf = sf;
|
|
||||||
this.nameToMeth = new HashMap<>();
|
|
||||||
for(Method m : sf.getAllMethods()) {
|
|
||||||
this.nameToMeth.put(m.getName(), m);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setResultSet(ResultSet resultSet) {
|
public void setResultSet(ResultSet resultSet) {
|
||||||
@ -214,6 +221,28 @@ public class TPHExtractor extends AbstractASTWalker {
|
|||||||
ListOfMethodsAndTph.add(methodAndTph);
|
ListOfMethodsAndTph.add(methodAndTph);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(ClassOrInterface classOrInterface) {
|
||||||
|
Optional<Constructor> optInitialConstructor = classOrInterface.getfieldInitializations();
|
||||||
|
this.nameToField = new HashMap<>();
|
||||||
|
if (optInitialConstructor.isPresent()) {
|
||||||
|
classOrInterface.getfieldInitializations()
|
||||||
|
.get()
|
||||||
|
.block
|
||||||
|
.statements
|
||||||
|
.stream()
|
||||||
|
.filter(s -> s instanceof Assign)
|
||||||
|
.forEach(as ->
|
||||||
|
this.nameToField.put(((AssignToField)(((Assign)as).lefSide)).field.fieldVarName, ((Assign)as).rightSide));
|
||||||
|
}
|
||||||
|
|
||||||
|
this.nameToMeth = new HashMap<>();
|
||||||
|
for(Method m : classOrInterface.getMethods()) {
|
||||||
|
this.nameToMeth.put(m.getName(), m);
|
||||||
|
}
|
||||||
|
super.visit(classOrInterface);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visit(Constructor cons) {
|
public void visit(Constructor cons) {
|
||||||
inMethod = false;
|
inMethod = false;
|
||||||
@ -252,9 +281,20 @@ public class TPHExtractor extends AbstractASTWalker {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visit(MethodCall methodCall) {
|
public void visit(MethodCall methodCall) {
|
||||||
|
String fieldOrMethName;
|
||||||
super.visit(methodCall);
|
super.visit(methodCall);
|
||||||
if (nameToMeth.keySet().contains(methodCall.name)) {//Method-call of a method in the actuial Sourcefile
|
if (nameToMeth.keySet().contains(fieldOrMethName = methodCall.name) //Method-call of a method in the actuial Sourcefile
|
||||||
Iterator<FormalParameter> paraIt = nameToMeth.get(methodCall.name).getParameterList().iterator();
|
|| (methodCall.name.equals("apply") &&
|
||||||
|
(methodCall.receiver instanceof ExpressionReceiver) &&
|
||||||
|
(((ExpressionReceiver)methodCall.receiver).expr instanceof FieldVar) &&
|
||||||
|
nameToField.keySet().contains(fieldOrMethName=((FieldVar)((ExpressionReceiver)methodCall.receiver).expr).fieldVarName)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
{
|
||||||
|
Iterator<FormalParameter> paraIt =
|
||||||
|
methodCall.name.equals("apply")
|
||||||
|
? ((LambdaExpression)nameToField.get(fieldOrMethName)).params.iterator()
|
||||||
|
: nameToMeth.get(methodCall.name).getParameterList().iterator();
|
||||||
methodCall.getArgumentList()
|
methodCall.getArgumentList()
|
||||||
.getArguments()
|
.getArguments()
|
||||||
.forEach(x -> {
|
.forEach(x -> {
|
||||||
|
@ -86,7 +86,7 @@ public class GeneratedGenericsFinder implements ASTVisitor {
|
|||||||
public GeneratedGenericsFinder(SourceFile sf, Collection<ResultSet> listOfResultSets) {
|
public GeneratedGenericsFinder(SourceFile sf, Collection<ResultSet> listOfResultSets) {
|
||||||
this.sf = sf;
|
this.sf = sf;
|
||||||
this.listOfResultSets = listOfResultSets;
|
this.listOfResultSets = listOfResultSets;
|
||||||
this.tphExtractor = new TPHExtractor(sf);
|
this.tphExtractor = new TPHExtractor();
|
||||||
}
|
}
|
||||||
|
|
||||||
public GenericGenratorResultForSourceFile findGeneratedGenerics() {
|
public GenericGenratorResultForSourceFile findGeneratedGenerics() {
|
||||||
|
@ -4,10 +4,14 @@ import de.dhbwstuttgart.bytecode.TPHExtractor;
|
|||||||
import de.dhbwstuttgart.bytecode.constraint.TPHConstraint;
|
import de.dhbwstuttgart.bytecode.constraint.TPHConstraint;
|
||||||
import de.dhbwstuttgart.bytecode.constraint.TPHConstraint.Relation;
|
import de.dhbwstuttgart.bytecode.constraint.TPHConstraint.Relation;
|
||||||
import de.dhbwstuttgart.bytecode.utilities.MethodAndTPH;
|
import de.dhbwstuttgart.bytecode.utilities.MethodAndTPH;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder;
|
||||||
|
import de.dhbwstuttgart.typeinference.result.ResultPair;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import org.objectweb.asm.Type;
|
import org.objectweb.asm.Type;
|
||||||
|
|
||||||
public class FamilyOfGeneratedGenerics {
|
public class FamilyOfGeneratedGenerics {
|
||||||
@ -15,7 +19,7 @@ public class FamilyOfGeneratedGenerics {
|
|||||||
// HashMap speichert ob TPH in einer Methode oder in der Klasse ist; und wenn es in der Methode ist, in welcher Methode
|
// HashMap speichert ob TPH in einer Methode oder in der Klasse ist; und wenn es in der Methode ist, in welcher Methode
|
||||||
public HashMap<String, List<PairTphMethod<PositionFinder.Position, String>>> posOfTPHs = new HashMap<>();
|
public HashMap<String, List<PairTphMethod<PositionFinder.Position, String>>> posOfTPHs = new HashMap<>();
|
||||||
public List<ClassConstraint> classConstraints = new ArrayList<>();
|
public List<ClassConstraint> classConstraints = new ArrayList<>();
|
||||||
public List<MethodConstraint> methodConstraints = new ArrayList<>();
|
//public List<MethodConstraint> methodConstraints = new ArrayList<>();
|
||||||
public HashMap<String, List<MethodConstraint>> methodConstraintsWithPosition = new HashMap<>();
|
public HashMap<String, List<MethodConstraint>> methodConstraintsWithPosition = new HashMap<>();
|
||||||
|
|
||||||
private static final String objectType = Type.getInternalName(Object.class);
|
private static final String objectType = Type.getInternalName(Object.class);
|
||||||
@ -24,7 +28,7 @@ public class FamilyOfGeneratedGenerics {
|
|||||||
this.allConstraints = tphExtractor.allCons;
|
this.allConstraints = tphExtractor.allCons;
|
||||||
this.posOfTPHs = positionConverter(tphExtractor.allTPHS, tphExtractor.ListOfMethodsAndTph);
|
this.posOfTPHs = positionConverter(tphExtractor.allTPHS, tphExtractor.ListOfMethodsAndTph);
|
||||||
this.classConstraints = getClassConstraints(allConstraints,posOfTPHs);
|
this.classConstraints = getClassConstraints(allConstraints,posOfTPHs);
|
||||||
this.methodConstraints = getMethodConstraints(allConstraints,classConstraints,posOfTPHs, tphExtractor.ListOfMethodsAndTph);
|
//this.methodConstraints = getMethodConstraints(allConstraints,classConstraints,posOfTPHs, null, tphExtractor.ListOfMethodsAndTph);
|
||||||
this.methodConstraintsWithPosition = getMethodConstraintsWithPosition(allConstraints,classConstraints,posOfTPHs, tphExtractor.ListOfMethodsAndTph);
|
this.methodConstraintsWithPosition = getMethodConstraintsWithPosition(allConstraints,classConstraints,posOfTPHs, tphExtractor.ListOfMethodsAndTph);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -59,10 +63,19 @@ public class FamilyOfGeneratedGenerics {
|
|||||||
return cs_cl;
|
return cs_cl;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static List<MethodConstraint> getMethodConstraints(List<TPHConstraint> cs, List<ClassConstraint> cs_cl, HashMap<String, List<PairTphMethod<PositionFinder.Position, String>>> posOfTphs, List<MethodAndTPH> listOfMethodsAndTph) {
|
public static List<MethodConstraint> getMethodConstraints(List<TPHConstraint> cs,
|
||||||
|
List<ClassConstraint> cs_cl,
|
||||||
|
HashMap<String, List<PairTphMethod<PositionFinder.Position, String>>> posOfTphs,
|
||||||
|
ArrayList<ResultPair<TypePlaceholder, TypePlaceholder>> methodConstraints1Pairs,
|
||||||
|
List<MethodAndTPH> listOfMethodsAndTph) {
|
||||||
List<MethodConstraint> cs_m = new ArrayList<>();
|
List<MethodConstraint> cs_m = new ArrayList<>();
|
||||||
List<MethodConstraint> methodConstraints1 = typeOfTheMethodInClSigma(cs, posOfTphs);
|
List<MethodConstraint> methodConstraints1 = typeOfTheMethodInClSigma(cs, posOfTphs);
|
||||||
//List<MethodConstraint> methodConstraints1 = listOfMethodsAndTph.
|
|
||||||
|
List<MethodConstraint> methodConstraints1prime =
|
||||||
|
methodConstraints1Pairs.stream()
|
||||||
|
.map(p -> new MethodConstraint(p.getLeft().getName(), p.getRight().getName(), Relation.EXTENDS))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
for (MethodConstraint cons: methodConstraints1) {
|
for (MethodConstraint cons: methodConstraints1) {
|
||||||
if (!checkForDuplicates(cons, cs_m)) {
|
if (!checkForDuplicates(cons, cs_m)) {
|
||||||
cs_m.add(cons);
|
cs_m.add(cons);
|
||||||
@ -123,7 +136,7 @@ public class FamilyOfGeneratedGenerics {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
listOfThisMethod = getMethodConstraints(cs,cs_cl,posOfTPHsForThisMethod,listOfMethodsAndTph);
|
listOfThisMethod = getMethodConstraints(cs,cs_cl,posOfTPHsForThisMethod, method.getBasePairs(),listOfMethodsAndTph);
|
||||||
tempMethodConstraintsWithPosition.put(currentMethod, listOfThisMethod);
|
tempMethodConstraintsWithPosition.put(currentMethod, listOfThisMethod);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -54,4 +54,8 @@ public class MethodAndTPH {
|
|||||||
return returnType;
|
return returnType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ArrayList<ResultPair<TypePlaceholder, TypePlaceholder>> getBasePairs() {
|
||||||
|
return basePairs;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -24,7 +24,7 @@ public class FamilyOfGenerics {
|
|||||||
public void generateBC() throws Exception {
|
public void generateBC() throws Exception {
|
||||||
SourceFile sf = generateAST();
|
SourceFile sf = generateAST();
|
||||||
PositionFinder.getPositionOfTPH(sf, null);
|
PositionFinder.getPositionOfTPH(sf, null);
|
||||||
TPHExtractor tphExtractor = new TPHExtractor(sf);
|
TPHExtractor tphExtractor = new TPHExtractor();
|
||||||
List<ResultSet> results = new ArrayList<ResultSet>();
|
List<ResultSet> results = new ArrayList<ResultSet>();
|
||||||
GeneratedGenericsFinder generatedGenericsFinder = new GeneratedGenericsFinder(sf, results);
|
GeneratedGenericsFinder generatedGenericsFinder = new GeneratedGenericsFinder(sf, results);
|
||||||
}
|
}
|
||||||
|
@ -12,6 +12,9 @@ import org.junit.Test;
|
|||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.net.URLClassLoader;
|
||||||
import java.nio.charset.Charset;
|
import java.nio.charset.Charset;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
@ -20,53 +23,36 @@ import java.util.HashSet;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
|
||||||
public class TestTPHsAndGenerics {
|
public class TestTPHsAndGenerics {
|
||||||
|
|
||||||
public static final String rootDirectory = System.getProperty("user.dir")+"/src/test/resources/insertGenericsJav/";
|
private static final String rootDirectory = System.getProperty("user.dir")+"/src/test/resources/insertGenericsJav/";
|
||||||
|
private String pathToClassFile = System.getProperty("user.dir")+"/src/test/resources/testBytecode/generatedBC/";
|
||||||
|
private static ClassLoader loader;
|
||||||
|
private static Class<?> classToTest;
|
||||||
|
private static Object instanceOfClass;
|
||||||
|
private static String className = "TestTPHsAndGenerics";
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void ggFinder() throws IOException, ClassNotFoundException {
|
public void ggFinder() throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {
|
||||||
execute(new File(rootDirectory+"TestTPHSAndGenerics.jav"));
|
execute(new File(rootDirectory+className+".jav"));
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class TestResultSet{
|
private static class TestResultSet{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public TestResultSet execute(File fileToTest) throws IOException, ClassNotFoundException {
|
public TestResultSet execute(File fileToTest) throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {
|
||||||
JavaTXCompiler compiler = new JavaTXCompiler(fileToTest);
|
JavaTXCompiler compiler = new JavaTXCompiler(fileToTest);
|
||||||
for(File f : compiler.sourceFiles.keySet()){
|
|
||||||
SourceFile sf = compiler.sourceFiles.get(f);
|
|
||||||
}
|
|
||||||
List<ResultSet> results = compiler.typeInference();
|
List<ResultSet> results = compiler.typeInference();
|
||||||
List<GenericGenratorResultForSourceFile> simplifyResultsForAllSourceFiles = compiler.getGeneratedGenericResultsForAllSourceFiles(results);
|
List<GenericGenratorResultForSourceFile> simplifyResultsForAllSourceFiles = compiler.getGeneratedGenericResultsForAllSourceFiles(results);
|
||||||
//compiler.generateBytecode(rootDirectory+"xxx.class", results, simplifyResultsForAllSourceFiles);
|
/*
|
||||||
for(File f : compiler.sourceFiles.keySet()){
|
compiler.generateBytecode(new File(pathToClassFile), results, simplifyResultsForAllSourceFiles);
|
||||||
SourceFile sf = compiler.sourceFiles.get(f);
|
loader = new URLClassLoader(new URL[] {new URL("file://"+pathToClassFile)});
|
||||||
System.out.println(ASTTypePrinter.print(sf));
|
classToTest = loader.loadClass(className);
|
||||||
System.out.println(ASTPrinter.print(sf));
|
instanceOfClass = classToTest.getDeclaredConstructor().newInstance();
|
||||||
//List<ResultSet> results = compiler.typeInference(); PL 2017-10-03 vor die For-Schleife gezogen
|
*/
|
||||||
assert results.size()>0;
|
|
||||||
Set<String> insertedTypes = new HashSet<>();
|
|
||||||
for(ResultSet resultSet : results){
|
|
||||||
Set<TypeInsert> result = TypeInsertFactory.createTypeInsertPoints(sf, resultSet, results, simplifyResultsForAllSourceFiles);
|
|
||||||
assert result.size()>0;
|
|
||||||
String content = readFile(f.getPath(), StandardCharsets.UTF_8);
|
|
||||||
for(TypeInsert tip : result){
|
|
||||||
insertedTypes.add(tip.insert(content));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for(String s : insertedTypes){
|
|
||||||
System.out.println(s);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return new TestResultSet();
|
return new TestResultSet();
|
||||||
}
|
|
||||||
|
|
||||||
static String readFile(String path, Charset encoding)
|
|
||||||
throws IOException
|
|
||||||
{
|
|
||||||
byte[] encoded = Files.readAllBytes(Paths.get(path));
|
|
||||||
return new String(encoded, encoding);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user