diff --git a/pom.xml b/pom.xml
index 6f54967a..b90b76e2 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,88 +1,175 @@
-
-
- 4.0.0
- de.dhbwstuttgart
- JavaTXcompiler
- jar
- 0.1
- JavaTXcompiler
- http://maven.apache.org
-
-
- junit
- junit
- 4.0
- test
-
-
- org.antlr
- antlr4
- 4.7
-
-
- commons-io
- commons-io
- 2.6
-
-
-com.google.guava
- guava
- 22.0
-
-
- org.reflections
- reflections
- 0.9.11
-
-
- org.ow2.asm
- asm-all
- [4.0.0,)
-
-
-
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+http://maven.apache.org/maven-v4_0_0.xsd">
+ 4.0.0
+ de.dhbwstuttgart
+ JavaTXcompiler
+ jar
-
- target
- target/classes
- ${artifactId}-${version}
- target/test-classes
- src/
- test/
-
-
- org.antlr
- antlr4-maven-plugin
- 4.7
-
-
- antlr
-
- antlr4
-
-
- src/de/dhbwstuttgart/parser/antlr/
- src/de/dhbwstuttgart/parser/antlr/
-
- -package
- de.dhbwstuttgart.parser.antlr
-
-
-
-
-
-
-
-
- 1.8
- 1.8
-
+ 0.1
+ JavaTXcompiler
+ http://maven.apache.org
+
+
+ junit
+ junit
+ 4.0
+ test
+
+
+ org.antlr
+ antlr4
+ 4.7
+
+
+ commons-io
+ commons-io
+ 2.6
+
+
+ com.google.guava
+ guava
+ 22.0
+
+
+ org.reflections
+ reflections
+ 0.9.11
+
+
+
+ org.ow2.asm
+ asm
+ 7.0
+
+
+
+
+
+
+ target
+ target/classes
+ ${project.artifactId}-${project.version}
+ target/test-classes
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ 3.0.0-M3
+
+ true
+
+
+
+ org.antlr
+ antlr4-maven-plugin
+ 4.7
+
+
+ antlr
+
+ antlr4
+
+
+ src/main/antlr4/java8
+ ${project.basedir}/target/generated-sources/antlr4/de/dhbwstuttgart/parser/antlr
+
+ -package
+ de.dhbwstuttgart.parser.antlr
+
+
+
+
+ aspParser
+
+ antlr4
+
+
+ src/main/antlr4/sat
+ ${project.basedir}/target/generated-sources/antlr4/de/dhbwstuttgart/sat/asp/parser/antlr
+
+ -package
+ de.dhbwstuttgart.sat.asp.parser.antlr
+
+
+
+
+
+
+
+ maven-assembly-plugin
+
+
+ package
+
+ single
+
+
+
+
+
+ jar-with-dependencies
+
+
+
+
+ org.reficio
+ p2-maven-plugin
+ 1.1.2-SNAPSHOT
+
+
+ default-cli
+
+
+
+
+
+ de.dhbwstuttgart:JavaTXcompiler:0.1
+
+
+ org.reflections:reflections:0.9.11
+
+
+ com.google.guava:guava:22.0
+
+
+ javax.annotation:javax.annotation-api:1.3.1
+
+
+ org.glassfish:javax.annotation:3.1.1
+
+
+
+
+
+
+
+
+
+
+ reficio
+ http://repo.reficio.org/maven/
+
+
+
+
+ maven-repository
+ file:///${project.basedir}/target
+
+
+
+ 1.8
+ 1.8
+ 0.23.0
+
+
+
+ maven-repository
+ MyCo Internal Repository
+ file:///${project.basedir}/maven-repository/
+
+
diff --git a/src/main/java/de/dhbwstuttgart/bytecode/BytecodeGen.java b/src/main/java/de/dhbwstuttgart/bytecode/BytecodeGen.java
index 0dea801d..fec01c10 100644
--- a/src/main/java/de/dhbwstuttgart/bytecode/BytecodeGen.java
+++ b/src/main/java/de/dhbwstuttgart/bytecode/BytecodeGen.java
@@ -147,23 +147,7 @@ public class BytecodeGen implements ASTVisitor {
if(!tphExtractor.allTPHS.get(t))
tphsClass.add(t);
}
-
- ArrayList consClass = new ArrayList<>();
- for(TPHConstraint cons : tphExtractor.allCons) {
- TypePlaceholder right = null;
- for(TypePlaceholder tph : tphsClass) {
- if(cons.getLeft().equals(tph.getName())) {
-
- consClass.add(cons);
- right = getTPH(cons.getRight());
- }
- }
- if(right != null) {
- tphsClass.add(right);
- removeFromMethod(right.getName());
- right = null;
- }
- }
+
String sig = null;
/* if class has generics then creates signature
* Signature looks like:
@@ -172,6 +156,23 @@ public class BytecodeGen implements ASTVisitor {
if(classOrInterface.getGenerics().iterator().hasNext() || !commonPairs.isEmpty() ||
classOrInterface.getSuperClass().acceptTV(new TypeToSignature()).contains("<")
|| !tphsClass.isEmpty()) {
+ HashMap> constraints = Simplify.simplifyConstraintsClass(tphExtractor,tphsClass);
+ ArrayList consClass = new ArrayList<>();
+ for(TPHConstraint cons : constraints.keySet()) {
+ TypePlaceholder right = null;
+ for(TypePlaceholder tph : tphsClass) {
+ if(cons.getLeft().equals(tph.getName())) {
+
+ consClass.add(cons);
+ right = getTPH(cons.getRight());
+ }
+ }
+ if(right != null) {
+ tphsClass.add(right);
+ removeFromMethod(right.getName());
+ right = null;
+ }
+ }
Signature signature = new Signature(classOrInterface, genericsAndBounds,commonPairs,tphsClass, consClass);
sig = signature.toString();
System.out.println("Signature: => " + sig);
diff --git a/src/main/java/de/dhbwstuttgart/bytecode/BytecodeGenMethod.java b/src/main/java/de/dhbwstuttgart/bytecode/BytecodeGenMethod.java
index d4670289..b1ea614f 100644
--- a/src/main/java/de/dhbwstuttgart/bytecode/BytecodeGenMethod.java
+++ b/src/main/java/de/dhbwstuttgart/bytecode/BytecodeGenMethod.java
@@ -140,7 +140,8 @@ public class BytecodeGenMethod implements StatementVisitor {
}
public BytecodeGenMethod(LambdaExpression lambdaExpression, ArrayList usedVars, ResultSet resultSet, MethodVisitor mv,
- int indexOfFirstParamLam, boolean isInterface, HashMap classFiles, String path, int lamCounter, SourceFile sf) {
+ int indexOfFirstParamLam, boolean isInterface, HashMap classFiles, String path, int lamCounter, SourceFile sf,HashMap genericsAndBoundsMethod,
+ HashMap genericsAndBounds) {
this.resultSet = resultSet;
this.mv = mv;
@@ -149,6 +150,9 @@ public class BytecodeGenMethod implements StatementVisitor {
this.path = path;
this.lamCounter = lamCounter;
this.sf = sf;
+ this.genericsAndBoundsMethod = genericsAndBoundsMethod;
+ this.genericsAndBounds = genericsAndBounds;
+
Iterator itr = lambdaExpression.params.iterator();
int i = indexOfFirstParamLam;
@@ -644,7 +648,8 @@ public class BytecodeGenMethod implements StatementVisitor {
ArrayList usedVars = kindOfLambda.getUsedVars();
new BytecodeGenMethod(lambdaExpression, usedVars,this.resultSet, mvLambdaBody, indexOfFirstParamLam, isInterface,
- classFiles,this.path, lamCounter, sf);
+ classFiles,this.path, lamCounter, sf, genericsAndBoundsMethod,
+ genericsAndBounds);
mvLambdaBody.visitMaxs(0, 0);
mvLambdaBody.visitEnd();
@@ -744,6 +749,13 @@ public class BytecodeGenMethod implements StatementVisitor {
statement = new IfStatement(ifStmt.expr, ifStmt.then_block, ifStmt.else_block);
isBinaryExp = statement.isExprBinary();
ifStmt.expr.accept(this);
+ if(!(ifStmt.expr instanceof BinaryExpr)) {
+ doUnboxing(getResolvedType(ifStmt.expr.getType()));
+ Label branchLabel = new Label();
+ Label endLabel = new Label();
+ mv.visitJumpInsn(Opcodes.IFEQ, branchLabel);
+ statement.genBCForRelOp(mv, branchLabel, endLabel, this);
+ }
statement = null;
}
@@ -758,84 +770,90 @@ public class BytecodeGenMethod implements StatementVisitor {
System.out.println("In MethodCall = " + methodCall.name);
String receiverName = getResolvedType(methodCall.receiver.getType());
System.out.println("Methods of " + receiverName + " ");
- ClassLoader cLoader = ClassLoader.getSystemClassLoader();
- // This will be used if the class is not standard class (not in API)
- ClassLoader cLoader2;
java.lang.reflect.Method methodRefl = null;
String clazz = receiverName.replace("/", ".");
- String methCallType = resultSet.resolveType(methodCall.getType()).resolvedType.acceptTV(new TypeToDescriptor());
- String[] typesOfParams = getTypes(methodCall.arglist.getArguments());
- try {
- if(receiverName.contains("<")) {
- clazz = clazz.substring(0, receiverName.indexOf("<"));
- }
+// if(!receiverName.equals(className)) {
+ ClassLoader cLoader = ClassLoader.getSystemClassLoader();
+ // This will be used if the class is not standard class (not in API)
+ ClassLoader cLoader2;
- java.lang.reflect.Method[] methods = cLoader.loadClass(clazz).getMethods();
- System.out.println("Methods of " + receiverName + " ");
- methodRefl = getMethod(methodCall.name,methodCall.arglist.getArguments().size(),methods);
-
- } catch (Exception e) {
-// try {
-// cLoader2 = new URLClassLoader(new URL[] {new URL("file://"+path)});
-// java.lang.reflect.Method[] methods = cLoader2.loadClass(clazz).getMethods();
-// System.out.println("Methods of " + receiverName + " ");
-// for(int i = 0; i Refl != null");
receiverRefl = methodRefl.getAnnotatedReceiverType().getType().toString();
for(Parameter p:methodRefl.getParameters()) {
System.out.println(p.getName() + " und is Primitive = " + p.getType().isPrimitive());
@@ -863,7 +882,7 @@ public class BytecodeGenMethod implements StatementVisitor {
}
}
- System.out.println("Methodcall Desc : " + mDesc);
+ System.out.println("Methodcall ("+ methodCall.name +") Desc : " + mDesc);
// methodCall.arglist.accept(this);
@@ -1195,6 +1214,7 @@ public class BytecodeGenMethod implements StatementVisitor {
break;
case "java/lang/Boolean":
+ mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Boolean", "booleanValue", "()Z", false);
break;
case "java/lang/Byte":
mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Byte", "byteValue", "()B", false);
diff --git a/src/main/java/de/dhbwstuttgart/bytecode/TPHExtractor.java b/src/main/java/de/dhbwstuttgart/bytecode/TPHExtractor.java
index d9a95311..c100eb4a 100644
--- a/src/main/java/de/dhbwstuttgart/bytecode/TPHExtractor.java
+++ b/src/main/java/de/dhbwstuttgart/bytecode/TPHExtractor.java
@@ -5,13 +5,19 @@ package de.dhbwstuttgart.bytecode;
import java.util.ArrayList;
import java.util.HashMap;
+import java.util.Iterator;
import de.dhbwstuttgart.bytecode.constraint.ExtendsConstraint;
import de.dhbwstuttgart.bytecode.constraint.TPHConstraint;
import de.dhbwstuttgart.bytecode.constraint.TPHConstraint.Relation;
import de.dhbwstuttgart.bytecode.utilities.MethodAndTPH;
import de.dhbwstuttgart.syntaxtree.AbstractASTWalker;
+import de.dhbwstuttgart.syntaxtree.Constructor;
+import de.dhbwstuttgart.syntaxtree.FormalParameter;
import de.dhbwstuttgart.syntaxtree.Method;
+import de.dhbwstuttgart.syntaxtree.ParameterList;
+import de.dhbwstuttgart.syntaxtree.statement.LocalVar;
+import de.dhbwstuttgart.syntaxtree.statement.LocalVarDecl;
import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder;
import de.dhbwstuttgart.typeinference.result.GenericInsertPair;
import de.dhbwstuttgart.typeinference.result.ResultSet;
@@ -20,36 +26,42 @@ import de.dhbwstuttgart.typeinference.result.ResultSet;
* @author Fayez Abu Alia
*
*/
-public class TPHExtractor extends AbstractASTWalker{
+public class TPHExtractor extends AbstractASTWalker {
// Alle TPHs der Felder werden iKopf der Klasse definiert
// alle TPHs der Klasse: (TPH, is in Method?)
- final HashMap allTPHS = new HashMap<>();
+ final HashMap allTPHS = new HashMap<>();
MethodAndTPH methodAndTph;
+
Boolean inMethod = false;
+ boolean inLocalOrParam = false;
+
public final ArrayList ListOfMethodsAndTph = new ArrayList<>();
final ArrayList allPairs = new ArrayList<>();
public final ArrayList allCons = new ArrayList<>();
private ResultSet resultSet;
-
+
public TPHExtractor() {
-
+
}
-
+
public void setResultSet(ResultSet resultSet) {
this.resultSet = resultSet;
}
-
+
@Override
public void visit(TypePlaceholder tph) {
- if(resultSet.resolveType(tph).resolvedType instanceof TypePlaceholder) {
+ if (resultSet.resolveType(tph).resolvedType instanceof TypePlaceholder) {
TypePlaceholder resolvedTPH = (TypePlaceholder) resultSet.resolveType(tph).resolvedType;
- if(inMethod)
+ if (inMethod) {
methodAndTph.getTphs().add(resolvedTPH.getName());
-
- allTPHS.put(resolvedTPH,inMethod);
- resultSet.resolveType(tph).additionalGenerics.forEach(ag ->{
- if(ag.contains(resolvedTPH)&&ag.TA1.equals(resolvedTPH)&&!contains(allPairs,ag)) {
- if(inMethod)
+ if (inLocalOrParam)
+ methodAndTph.getLocalTphs().add(resolvedTPH.getName());
+ }
+
+ allTPHS.put(resolvedTPH, inMethod);
+ resultSet.resolveType(tph).additionalGenerics.forEach(ag -> {
+ if (ag.contains(resolvedTPH) && ag.TA1.equals(resolvedTPH) && !contains(allPairs, ag)) {
+ if (inMethod)
methodAndTph.getPairs().add(ag);
allPairs.add(ag);
TPHConstraint con = new ExtendsConstraint(ag.TA1.getName(), ag.TA2.getName(), Relation.EXTENDS);
@@ -58,14 +70,16 @@ public class TPHExtractor extends AbstractASTWalker{
});
}
}
+
private boolean contains(ArrayList pairs, GenericInsertPair genPair) {
- for(int i=0; i allConstaints;
+
+ public ConstraintsFinder(List allConstaints) {
+ super();
+ this.allConstaints = allConstaints;
+ }
+
+ public List> findConstraints() {
+ List> result = new ArrayList<>();
+
+ List visitedCons = new ArrayList<>();
+ for(TPHConstraint c : allConstaints) {
+ if(c.getRel() == Relation.EXTENDS) {
+ // get constraints with the same left side
+ List cons = getConstraints(c,visitedCons);
+ if(cons.size()>1)
+ result.add(cons);
+ }
+ }
+
+ return result;
+ }
+
+ private List getConstraints(TPHConstraint c, List visitedCons) {
+ List res = new ArrayList<>();
+ for(TPHConstraint cons : allConstaints) {
+ if(!isVisited(cons,visitedCons) && cons.getLeft().equals(c.getLeft())) {
+ res.add(cons);
+ visitedCons.add(cons);
+ }
+ }
+ return res;
+ }
+
+ private boolean isVisited(TPHConstraint cons, List visitedCons) {
+ for(TPHConstraint c : visitedCons) {
+ if(c.getLeft().equals(cons.getLeft()) && c.getRight().equals(cons.getRight()))
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/src/main/java/de/dhbwstuttgart/bytecode/utilities/MethodAndTPH.java b/src/main/java/de/dhbwstuttgart/bytecode/utilities/MethodAndTPH.java
index 7175f108..e21f974c 100644
--- a/src/main/java/de/dhbwstuttgart/bytecode/utilities/MethodAndTPH.java
+++ b/src/main/java/de/dhbwstuttgart/bytecode/utilities/MethodAndTPH.java
@@ -10,6 +10,8 @@ public class MethodAndTPH {
private String name;
private final ArrayList tphs = new ArrayList<>();
private final ArrayList pairs = new ArrayList<>();
+ // tphs of local variables and parameters
+ private final ArrayList localTphs = new ArrayList<>();
public MethodAndTPH(String name) {
this.name = name;
@@ -26,4 +28,9 @@ public class MethodAndTPH {
public String getName() {
return name;
}
+
+ public ArrayList getLocalTphs() {
+ return localTphs;
+ }
+
}
diff --git a/src/main/java/de/dhbwstuttgart/bytecode/utilities/NameReplacer.java b/src/main/java/de/dhbwstuttgart/bytecode/utilities/NameReplacer.java
new file mode 100644
index 00000000..bc3c1b98
--- /dev/null
+++ b/src/main/java/de/dhbwstuttgart/bytecode/utilities/NameReplacer.java
@@ -0,0 +1,49 @@
+package de.dhbwstuttgart.bytecode.utilities;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import de.dhbwstuttgart.bytecode.constraint.TPHConstraint;
+import de.dhbwstuttgart.syntaxtree.factory.NameGenerator;
+
+public class NameReplacer {
+ private List constraints;
+ private List allConstraints;
+ private List tphs;
+ private List localTphs;
+
+ public NameReplacer(List constraints, List allConstraints,List tphs, ArrayList localTphs) {
+ super();
+ this.constraints = constraints;
+ this.allConstraints = allConstraints;
+ this.tphs = tphs;
+ this.localTphs = localTphs;
+ }
+
+ public Map> replaceNames() {
+ String newName = NameGenerator.makeNewName();
+ ArrayList names = new ArrayList<>();
+ for(TPHConstraint cons : constraints) {
+ names.add(cons.getRight());
+ cons.setRight(newName);
+ }
+
+ for(TPHConstraint cons : allConstraints) {
+ if(names.contains(cons.getLeft()))
+ cons.setLeft(newName);
+ if(names.contains(cons.getRight()))
+ cons.setRight(newName);
+ }
+
+ tphs.removeAll(names);
+ tphs.add(newName);
+ localTphs.removeAll(names);
+ localTphs.add(newName);
+
+ HashMap> res = new HashMap<>();
+ res.put(newName, names);
+ return res;
+ }
+}
diff --git a/src/main/java/de/dhbwstuttgart/bytecode/utilities/Simplify.java b/src/main/java/de/dhbwstuttgart/bytecode/utilities/Simplify.java
index d19d38dc..89b55efb 100644
--- a/src/main/java/de/dhbwstuttgart/bytecode/utilities/Simplify.java
+++ b/src/main/java/de/dhbwstuttgart/bytecode/utilities/Simplify.java
@@ -4,6 +4,8 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
import org.objectweb.asm.Type;
@@ -15,125 +17,145 @@ import de.dhbwstuttgart.bytecode.constraint.TPHConstraint.Relation;
import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder;
public class Simplify {
-
- public static HashMap> simplifyConstraints(String name, TPHExtractor tphExtractor, ArrayList tphsClass) {
+
+ public static HashMap> simplifyConstraints(String name, TPHExtractor tphExtractor,
+ ArrayList tphsClass) {
// 1. check if there are any simple cycles like L set L=R and:
- // * remove both constraints
- // * substitute L with R in all constraint
- // b)no => go to next step
- // 2. check the result of step 1 if there are any equal-constraints like L=R, M=R ..
- // a) yes => put all such TPhs in a map and define "key-Cons"
- // -- key-Cons = TPH < Object --
- // put this Constraint and the
- // b) no
+ // a) yes => set L=R and:
+ // * remove both constraints
+ // * substitute L with R in all constraint
+ // b)no => go to next step
+ // 2. check the result of step 1 if there are any equal-constraints like L=R,
+ // M=R ..
+ // a) yes => put all such TPhs in a map and define "key-Cons"
+ // -- key-Cons = TPH < Object --
+ // put this Constraint and the
+ // b) no
// 3. is
-
+
// all constraints that will be simplified
- ArrayList allCons = tphExtractor.allCons;
+// ArrayList allCons = tphExtractor.allCons;
+ ArrayList allCons = new ArrayList<>();
+
+ for(TPHConstraint c : tphExtractor.allCons) {
+ TPHConstraint nc = new TPHConstraint(c.getLeft(), c.getRight(), c.getRel());
+ allCons.add(nc);
+ }
ArrayList consToRemove = new ArrayList<>();
-
+
+ // get all tph of the method
+ ArrayList methodTphs = new ArrayList<>();
+ ArrayList localTphs = new ArrayList<>();
+ for (MethodAndTPH m : tphExtractor.ListOfMethodsAndTph) {
+ if (m.getName().equals(name)) {
+ methodTphs = m.getTphs();
+ localTphs = m.getLocalTphs();
+ break;
+ }
+ }
+
// step 1:
- for(TPHConstraint c : allCons) {
-
+ for (TPHConstraint c : allCons) {
+
String left = c.getLeft();
String right = c.getRight();
- if(c.getRel() == Relation.EXTENDS) {
- TPHConstraint revCon = getReverseConstraint(allCons,left,right);
- if(revCon != null) {
+ if (c.getRel() == Relation.EXTENDS) {
+ TPHConstraint revCon = getReverseConstraint(allCons, left, right);
+ if (revCon != null) {
revCon.setRel(Relation.EQUAL);
- // the reverse constraint is removed because
- // otherwise there is the same constraint twice
- // (e.g. A A=B and B=A)
+ // the reverse constraint is removed because
+ // otherwise there is the same constraint twice
+ // (e.g. A A=B and B=A)
consToRemove.add(revCon);
c.setRel(Relation.EQUAL);
- substituteTPH(allCons,left, right);
+ substituteTPH(allCons, left, right);
}
}
}
-
+
System.out.println();
System.out.println("NEW ALL CONST: " + allCons.size());
- allCons.forEach(c->System.out.println(c.toString()));
+ allCons.forEach(c -> System.out.println(c.toString()));
System.out.println("----------------");
allCons.removeAll(consToRemove);
consToRemove = new ArrayList<>();
-
+
int size = allCons.size();
-
+
System.out.println("AFTER DELETE ALL CONST: " + allCons.size());
- allCons.forEach(c->System.out.println(c.toString()));
+ allCons.forEach(c -> System.out.println(c.toString()));
System.out.println("----------------");
HashMap> result = new HashMap<>();
-
+
// check if there is any long cycle (e.g. A allTypes = new LinkedList<>();
// we will put all constraints which are in the cycle, in this ArrayList.
// Later these contraints will be converted to equal-constraints
ArrayList constraints = new ArrayList<>(size);
int visited = 0;
-
+
// contains all constraints
- HashMap ss1 = new HashMap<>();
-
- for(TPHConstraint constr : allCons) {
+ HashMap ss1 = new HashMap<>();
+
+ for (TPHConstraint constr : allCons) {
ss1.put(constr.getLeft(), constr.getRight());
}
-
- for(TPHConstraint c : allCons) {
-
- if(visited >= size)
+
+ for (TPHConstraint c : allCons) {
+
+ if (visited >= size)
break;
// Only extends-constraints will be checked
- if(c.getRel() == Relation.EXTENDS) {
+ if (c.getRel() == Relation.EXTENDS) {
++visited;
-
+
String left = c.getLeft();
String right = c.getRight();
// put the types in linked list
allTypes.add(left);
allTypes.add(right);
-
+
constraints.add(c);
-
+
boolean isCycle = false;
-
+
// iterate through the map to check if there is a cycle
- while(ss1.containsKey(right)) {
+ while (ss1.containsKey(right)) {
++visited;
String oldRight = right;
right = ss1.get(right);
-
+
TPHConstraint toAdd = getConstraint(oldRight, right, allCons);
-
- if(toAdd != null)
+
+ if (toAdd != null)
constraints.add(toAdd);
-
- if(left.equals(right)) {
+
+ if (left.equals(right)) {
isCycle = true;
break;
}
-
+
allTypes.add(right);
}
-
- if(isCycle) {
+
+ if (isCycle) {
// convert all constraints to equal constraints
setAllEqual(constraints);
// these constraints will be removed from allCons
consToRemove.addAll(constraints);
// all equal types will be substitute with one type
- substituteAllTPH(allCons,constraints,left);
-
+ substituteAllTPH(allCons, constraints, left);
+
HashSet eq = new HashSet<>();
// put all equal types in a set
- for(String t:allTypes) {
+ for (String t : allTypes) {
eq.add(t);
}
// generate a new constraint (left < Object)
- TPHConstraint constraint = new ExtendsConstraint(left, Type.getInternalName(Object.class), Relation.EXTENDS);
+ TPHConstraint constraint = new ExtendsConstraint(left, Type.getInternalName(Object.class),
+ Relation.EXTENDS);
// put the generated constraint and its equal set into result set
result.put(constraint, eq);
constraints.clear();
@@ -141,15 +163,260 @@ public class Simplify {
allTypes.clear();
}
}
+
+ for (TPHConstraint ec : allCons) {
+
+ if(ec.getRel() == Relation.EQUAL) {
+ if(!localTphs.contains(ec.getRight())) {
+ localTphs.add(ec.getRight());
+ }
+ if(!methodTphs.contains(ec.getRight())) {
+ methodTphs.add(ec.getRight());
+ }
+
+ }
+ }
// build an equal set that contains all types
- // which are equal and for each equal constraint put left side and right side
+ // which are equal and for each equal constraint put left side and right side
// in this set Then generate a constraint type < Object and put it
// with the equal set into the result.
- for(TPHConstraint c : allCons) {
- if(c.getRel()==Relation.EQUAL) {
- if(!isTPHInResEqual(result, c.getLeft())) {
+// for(TPHConstraint c : allCons) {
+// if(c.getRel()==Relation.EQUAL) {
+// if(!isTPHInResEqual(result, c.getLeft())) {
+// HashSet equalTPHs = getEqualsTPHs(result, c);
+// TPHConstraint constraint = getKeyConstraint(result,c);
+// equalTPHs.add(c.getLeft());
+// equalTPHs.add(c.getRight());
+// result.put(constraint, equalTPHs);
+// }
+// consToRemove.add(c);
+// size--;
+// }
+// }
+
+ System.out.println("Step 2 Result: ");
+ result.forEach((c, hs) -> {
+ System.out.print(c.toString() + " -> ");
+ hs.forEach(s -> {
+ System.out.print(s + ", ");
+ });
+ System.out.println();
+ });
+ System.out.println("----------------");
+
+ if (!allCons.isEmpty() && allCons.size() < 2) {
+ TPHConstraint cons = allCons.get(0);
+ if (!result.containsKey(cons)) {
+ result.put(cons, null);
+ if (!cons.getRight().equals(Type.getInternalName(Object.class)))
+ result.put(new ExtendsConstraint(cons.getRight(), Type.getInternalName(Object.class),
+ Relation.EXTENDS), null);
+ }
+
+ return result;
+ }
+
+ size += result.keySet().size();
+ // all constraints which have Object on the right side will
+ // be ignored, because they are simplified and can not be changed.
+ for (TPHConstraint c : allCons) {
+ if (c.getRight().equals(Type.getInternalName(Object.class)))
+ size--;
+ }
+
+ // finder looks for constraints that have the same left hand side
+ // and put them in a list
+ ConstraintsFinder finder = new ConstraintsFinder(allCons);
+ List> foundCons = finder.findConstraints();
+
+ ArrayList eqCons = new ArrayList<>();
+
+ for (List list : foundCons) {
+ // generate a new name and replace the right hand side for each constraint
+ // in list with the new name
+ NameReplacer replacer = new NameReplacer(list, allCons, methodTphs, localTphs);
+ // new name -> [all old names]
+ Map> replRes = replacer.replaceNames();
+ // create an equal constraint for each value in repres
+ String key = replRes.keySet().iterator().next();
+ for (String val : replRes.values().iterator().next()) {
+ EqualConstraint ec = new EqualConstraint(val, key, Relation.EQUAL);
+ eqCons.add(ec);
+ }
+ for (TPHConstraint c : allCons) {
+ if (c.getRel() == Relation.EQUAL && key.equals(c.getRight())) {
+ eqCons.add(c);
+ }
+ }
+ updateEqualCons(replRes, eqCons);
+
+ TPHConstraint c = list.get(0);
+ allCons.removeAll(list);
+ allCons.add(c);
+ }
+
+ // check if there are multiple constraint with the same left side.
+ // if yes => check if the super type in the method, if not
+ // then ignore it.
+// HashMap subAndSuper = new HashMap<>();
+// ArrayList eqCons = new ArrayList<>();
+// for(TPHConstraint c : allCons) {
+// if(subAndSuper.containsKey(c.getLeft())) {
+// LinkedList all = new LinkedList<>();
+// all.add(c.getLeft());
+// String sup =c.getRight();
+// all.add(sup);
+// HashMap ss = new HashMap<>();
+// for(TPHConstraint constr : allCons) {
+// ss.put(constr.getLeft(), constr.getRight());
+// }
+// while(ss.containsKey(sup)) {
+// sup = ss.get(sup);
+// all.add(sup);
+// }
+// if(!containTPH(methodTphs, all.getLast()))
+// continue;
+// }
+// if(subAndSuper.containsKey(c.getLeft())) {
+// System.out.println(c.getLeft());
+// String r = c.getRight();
+// String r2 = subAndSuper.get(c.getLeft());
+// EqualConstraint eq = new EqualConstraint(r2, r, Relation.EQUAL);
+// eqCons.add(eq);
+// substituteInMap(subAndSuper,eqCons,allCons,r,r2);
+// }
+// subAndSuper.put(c.getLeft(), c.getRight());
+// }
+//
+// System.out.println("SAME LEFT SIDE: ");
+// subAndSuper.forEach((c,hs)->{
+// if(c!=null) {
+// System.out.print(c+ " -> " + hs);
+//
+// }
+//
+//
+// System.out.println();
+// });
+// System.out.println("----------------");
+ HashMap subAndSuper = new HashMap<>();
+
+ for (TPHConstraint c : allCons) {
+ if (c.getRel() == Relation.EXTENDS)
+ subAndSuper.put(c.getLeft(), c.getRight());
+ }
+
+ for (TPHConstraint ec : allCons) {
+ if(ec.getRel() == Relation.EQUAL) {
+ methodTphs.remove(ec.getLeft());
+ localTphs.remove(ec.getLeft());
+ if(!localTphs.contains(ec.getRight())) {
+ localTphs.add(ec.getRight());
+ }
+ if(!methodTphs.contains(ec.getRight())) {
+ methodTphs.add(ec.getRight());
+ }
+ }
+
+ }
+
+ int numOfVisitedPairs = 0;
+ for (String sub : subAndSuper.keySet()) {
+ if (isTPHInConstraint(result, sub))
+ continue;
+
+ if (!containTPH(methodTphs, sub))
+ continue;
+
+ if (numOfVisitedPairs >= size)
+ break;
+ LinkedList tphInRel = new LinkedList<>();
+ tphInRel.add(sub);
+ String superT = subAndSuper.get(sub);
+ tphInRel.add(superT);
+
+ numOfVisitedPairs++;
+ while (!localTphs.contains(superT) && subAndSuper.containsKey(superT)) {
+ superT = subAndSuper.get(superT);
+ if (tphInRel.contains(superT)) {
+ break;
+ }
+ tphInRel.add(superT);
+ numOfVisitedPairs++;
+ }
+
+ // Subtype
+ String subTphRes = tphInRel.getFirst();
+ // Die größte Supertype
+ String superTphRes = tphInRel.getLast();
+
+ // if there is any constraint X < subTph, then
+ // add X at the beginning of the list.
+ while (!localTphs.contains(subTphRes) && subAndSuper.containsValue(subTphRes)) {
+ for (String tph : subAndSuper.keySet()) {
+ if (containTPH(methodTphs, tph) && subAndSuper.get(tph).equals(subTphRes)) {
+ subTphRes = tph;
+ break;
+ }
+ }
+ if (subTphRes.equals(tphInRel.getFirst())) {
+ break;
+ }
+
+ if (isTPHInConstraint(result, subTphRes))
+ break;
+
+ tphInRel.addFirst(subTphRes);
+ numOfVisitedPairs++;
+ }
+
+ subTphRes = tphInRel.getFirst();
+ // if the last type in the list not a type in method-types
+ // then find the last type in front of this type, which is
+ // a type in method-types
+ int i = 2;
+ while (!containTPH(methodTphs, superTphRes) && (tphInRel.size() - i) > 0) {
+ superTphRes = tphInRel.get(tphInRel.size() - i);
+ i++;
+ }
+
+ if (!containTPH(methodTphs, superTphRes)) {
+ HashSet equals = getEqualsTphsFromEqualCons(eqCons, superTphRes);
+ if (classTPHSContainsTPH(tphsClass, superTphRes)) {
+ result.put(new ExtendsConstraint(subTphRes, superTphRes, Relation.EXTENDS), equals);
+ } else {
+ result.put(new ExtendsConstraint(subTphRes, Type.getInternalName(Object.class), Relation.EXTENDS),
+ equals);
+ }
+
+ } else {
+ HashSet equals = getEqualsTphsFromEqualCons(eqCons, subTphRes);
+ result.put(new ExtendsConstraint(subTphRes, superTphRes, Relation.EXTENDS), equals);
+ if (!isTPHInConstraint(result, superTphRes) && !isTphInEqualSet(result, superTphRes)) {
+ HashSet equals2 = getEqualsTphsFromEqualCons(eqCons, superTphRes);
+ result.put(new ExtendsConstraint(superTphRes, Type.getInternalName(Object.class), Relation.EXTENDS),
+ equals2);
+ }
+ }
+ }
+
+// for(String tph : methodTphs) {
+ for (String tph : localTphs) {
+ if (!isTPHInConstraint(result, tph) && !isTphInEqualSet(result, tph)) {
+ HashSet equals = getEqualsTphsFromEqualCons(eqCons, tph);
+ result.put(new ExtendsConstraint(tph, Type.getInternalName(Object.class), Relation.EXTENDS), equals);
+ }
+ }
+
+ // build an equal set that contains all types
+ // which are equal and for each equal constraint put left side and right side
+ // in this set Then generate a constraint type < Object and put it
+ // with the equal set into the result.
+ for (TPHConstraint c : allCons) {
+ if (c.getRel() == Relation.EQUAL) {
+ if (!isTPHInResEqual(result, c.getLeft())) {
HashSet equalTPHs = getEqualsTPHs(result, c);
- TPHConstraint constraint = getKeyConstraint(result,c);
+ TPHConstraint constraint = getKeyConstraint(result, c);
equalTPHs.add(c.getLeft());
equalTPHs.add(c.getRight());
result.put(constraint, equalTPHs);
@@ -158,206 +425,290 @@ public class Simplify {
size--;
}
}
-
- System.out.println("Step 2 Result: ");
- result.forEach((c,hs)->{
- System.out.print(c.toString() + " -> ");
- hs.forEach(s->{
- System.out.print(s + ", ");
- });
- System.out.println();
- });
- System.out.println("----------------");
+
// remove all equal-constraints
allCons.removeAll(consToRemove);
- // add all generated constraints to allCons
+ // add all generated constraints to allCons
allCons.addAll(result.keySet());
-
- if(!allCons.isEmpty() && allCons.size()<2) {
- TPHConstraint cons = allCons.get(0);
- if(!result.containsKey(cons)) {
- result.put(cons, null);
- result.put(new ExtendsConstraint(cons.getRight(), Type.getInternalName(Object.class), Relation.EXTENDS), null);
- }
-
- return result;
- }
-
- size += result.keySet().size();
- // all constraints which have Object on the right side will
- // be ignored, because they are simplified and can not be changed.
- for(TPHConstraint c : allCons) {
- if(c.getRight().equals(Type.getInternalName(Object.class)))
- size--;
- }
- // get all tph of the method
- ArrayList methodTphs = new ArrayList<>();
- for(MethodAndTPH m : tphExtractor.ListOfMethodsAndTph) {
- if(m.getName().equals(name)) {
- methodTphs = m.getTphs();
- break;
- }
- }
- // check if there are multiple constraint with the same left side.
- // if yes => check if the super type in the method, if not
- // then ignore it.
- HashMap subAndSuper = new HashMap<>();
- ArrayList eqCons = new ArrayList<>();
- for(TPHConstraint c : allCons) {
- if(subAndSuper.containsKey(c.getLeft())) {
- LinkedList all = new LinkedList<>();
- all.add(c.getLeft());
- String sup =c.getRight();
- all.add(sup);
- HashMap ss = new HashMap<>();
- for(TPHConstraint constr : allCons) {
- ss.put(constr.getLeft(), constr.getRight());
- }
- while(ss.containsKey(sup)) {
- sup = ss.get(sup);
- all.add(sup);
- }
- if(!containTPH(methodTphs, all.getLast()))
- continue;
- }
- if(subAndSuper.containsKey(c.getLeft())) {
- System.out.println(c.getLeft());
- String r = c.getRight();
- String r2 = subAndSuper.get(c.getLeft());
- EqualConstraint eq = new EqualConstraint(r2, r, Relation.EQUAL);
- eqCons.add(eq);
- substituteInMap(subAndSuper,eqCons,allCons,r,r2);
- }
- subAndSuper.put(c.getLeft(), c.getRight());
- }
-
- System.out.println("SAME LEFT SIDE: ");
- subAndSuper.forEach((c,hs)->{
- if(c!=null) {
- System.out.print(c+ " -> " + hs);
-
- }
-
-
- System.out.println();
- });
- System.out.println("----------------");
- int numOfVisitedPairs = 0;
- for(String sub : subAndSuper.keySet()) {
- if(isTPHInConstraint(result,sub))
- continue;
-
- if(!containTPH(methodTphs,sub))
- continue;
-
- if(numOfVisitedPairs>=size)
- break;
- LinkedList tphInRel = new LinkedList<>();
- tphInRel.add(sub);
- String superT = subAndSuper.get(sub);
- tphInRel.add(superT);
-
- numOfVisitedPairs++;
- while(subAndSuper.containsKey(superT)) {
- superT = subAndSuper.get(superT);
- if(tphInRel.contains(superT)) {
- break;
- }
- tphInRel.add(superT);
- numOfVisitedPairs++;
- }
-
- // Subtype
- String subTphRes = tphInRel.getFirst();
- // Die größte Supertype
- String superTphRes = tphInRel.getLast();
-
- // if there is any constraint X < subTph, then
- // add X at the beginning of the list.
- while(subAndSuper.containsValue(subTphRes)) {
- for(String tph : subAndSuper.keySet()) {
- if(containTPH(methodTphs,tph) && subAndSuper.get(tph).equals(subTphRes)) {
- subTphRes = tph;
- break;
- }
- }
- if(subTphRes.equals(tphInRel.getFirst())) {
- break;
- }
-
- if(isTPHInConstraint(result, subTphRes))
- break;
-
- tphInRel.addFirst(subTphRes);
- numOfVisitedPairs++;
- }
-
- subTphRes = tphInRel.getFirst();
- // if the last type in the list not a type in method-types
- // then find the last type in front of this type, which is
- // a type in method-types
- int i = 2;
- while(!containTPH(methodTphs,superTphRes) && (tphInRel.size()-i) >0) {
- superTphRes = tphInRel.get(tphInRel.size()-i);
- i++;
- }
-
- if(!containTPH(methodTphs, superTphRes)) {
- HashSet equals = getEqualsTphsFromEqualCons(eqCons,superTphRes);
- if(classTPHSContainsTPH(tphsClass,superTphRes)) {
- result.put(new ExtendsConstraint(subTphRes, superTphRes, Relation.EXTENDS), equals);
- } else {
- result.put(new ExtendsConstraint(subTphRes, Type.getInternalName(Object.class), Relation.EXTENDS), equals);
- }
-
- } else {
- HashSet equals = getEqualsTphsFromEqualCons(eqCons,subTphRes);
- result.put(new ExtendsConstraint(subTphRes, superTphRes, Relation.EXTENDS), equals);
- if(!isTPHInConstraint(result, superTphRes) && !isTphInEqualSet(result,superTphRes)) {
- HashSet equals2 = getEqualsTphsFromEqualCons(eqCons,superTphRes);
- result.put(new ExtendsConstraint(superTphRes, Type.getInternalName(Object.class), Relation.EXTENDS), equals2);
- }
- }
- }
-
- for(String tph : methodTphs) {
- if(!isTPHInConstraint(result, tph) && !isTphInEqualSet(result,tph)) {
- HashSet equals = getEqualsTphsFromEqualCons(eqCons,tph);
- result.put(new ExtendsConstraint(tph, Type.getInternalName(Object.class), Relation.EXTENDS), equals);
- }
- }
-
+
System.out.println("EndResult: ");
- result.forEach((c,hs)->{
- if(c!=null) {
+ result.forEach((c, hs) -> {
+ if (c != null) {
System.out.print(c.toString() + " -> ");
- if(hs == null) {
+ if (hs == null) {
System.out.print(" [] ");
- }else {
- hs.forEach(s->{
+ } else {
+ hs.forEach(s -> {
System.out.print(s + ", ");
});
}
}
-
-
+
System.out.println();
});
System.out.println("----------------");
return result;
}
-
+
+ private static void updateEqualCons(Map> replRes, ArrayList eqCons) {
+ List oldNames = replRes.values().iterator().next();
+ String newName = replRes.keySet().iterator().next();
+ for (TPHConstraint c : eqCons) {
+// if(oldNames.contains(c.getLeft()))
+// c.setLeft(newName);
+ if (oldNames.contains(c.getRight()))
+ c.setRight(newName);
+ }
+
+ }
+
+ public static HashMap> simplifyConstraintsClass(TPHExtractor tphExtractor,
+ ArrayList tphsClass) {
+ // all constraints that will be simplified
+ ArrayList allCons = tphExtractor.allCons;
+ ArrayList consToRemove = new ArrayList<>();
+
+ // step 1:
+ for (TPHConstraint c : allCons) {
+
+ String left = c.getLeft();
+ String right = c.getRight();
+ if (c.getRel() == Relation.EXTENDS) {
+ TPHConstraint revCon = getReverseConstraint(allCons, left, right);
+ if (revCon != null) {
+ revCon.setRel(Relation.EQUAL);
+ // the reverse constraint is removed because
+ // otherwise there is the same constraint twice
+ // (e.g. A A=B and B=A)
+ consToRemove.add(revCon);
+ c.setRel(Relation.EQUAL);
+ substituteTPH(allCons, left, right);
+ }
+ }
+ }
+
+ allCons.removeAll(consToRemove);
+ consToRemove = new ArrayList<>();
+
+ int size = allCons.size();
+
+ HashMap> result = new HashMap<>();
+
+ // check if there is any long cycle (e.g. A allTypes = new LinkedList<>();
+ // we will put all constraints which are in the cycle, in this ArrayList.
+ // Later these contraints will be converted to equal-constraints
+ ArrayList constraints = new ArrayList<>(size);
+ int visited = 0;
+
+ // contains all constraints
+ HashMap ss1 = new HashMap<>();
+
+ for (TPHConstraint constr : allCons) {
+ ss1.put(constr.getLeft(), constr.getRight());
+ }
+
+ for (TPHConstraint c : allCons) {
+
+ if (visited >= size)
+ break;
+ // Only extends-constraints will be checked
+ if (c.getRel() == Relation.EXTENDS) {
+ ++visited;
+
+ String left = c.getLeft();
+ String right = c.getRight();
+ // put the types in linked list
+ allTypes.add(left);
+ allTypes.add(right);
+
+ constraints.add(c);
+
+ boolean isCycle = false;
+
+ // iterate through the map to check if there is a cycle
+ while (ss1.containsKey(right)) {
+ ++visited;
+ String oldRight = right;
+ right = ss1.get(right);
+
+ TPHConstraint toAdd = getConstraint(oldRight, right, allCons);
+
+ if (toAdd != null)
+ constraints.add(toAdd);
+
+ if (left.equals(right)) {
+ isCycle = true;
+ break;
+ }
+
+ allTypes.add(right);
+ }
+
+ if (isCycle) {
+ // convert all constraints to equal constraints
+ setAllEqual(constraints);
+ // these constraints will be removed from allCons
+ consToRemove.addAll(constraints);
+ // all equal types will be substitute with one type
+ substituteAllTPH(allCons, constraints, left);
+
+ HashSet eq = new HashSet<>();
+ // put all equal types in a set
+ for (String t : allTypes) {
+ eq.add(t);
+ }
+ // generate a new constraint (left < Object)
+ TPHConstraint constraint = new ExtendsConstraint(left, Type.getInternalName(Object.class),
+ Relation.EXTENDS);
+ // put the generated constraint and its equal set into result set
+ result.put(constraint, eq);
+ constraints.clear();
+ }
+ allTypes.clear();
+ }
+ }
+ // build an equal set that contains all types
+ // which are equal and for each equal constraint put left side and right side
+ // in this set Then generate a constraint type < Object and put it
+ // with the equal set into the result.
+ for (TPHConstraint c : allCons) {
+ if (c.getRel() == Relation.EQUAL) {
+ if (!isTPHInResEqual(result, c.getLeft())) {
+ HashSet equalTPHs = getEqualsTPHs(result, c);
+ TPHConstraint constraint = getKeyConstraint(result, c);
+ equalTPHs.add(c.getLeft());
+ equalTPHs.add(c.getRight());
+ result.put(constraint, equalTPHs);
+ }
+ consToRemove.add(c);
+ size--;
+ }
+ }
+
+ // remove all equal-constraints
+ allCons.removeAll(consToRemove);
+ // add all generated constraints to allCons
+ allCons.addAll(result.keySet());
+
+ if (!allCons.isEmpty() && allCons.size() < 2) {
+ TPHConstraint cons = allCons.get(0);
+ if (!result.containsKey(cons)) {
+ result.put(cons, null);
+ result.put(new ExtendsConstraint(cons.getRight(), Type.getInternalName(Object.class), Relation.EXTENDS),
+ null);
+ }
+
+ return result;
+ }
+
+ size += result.keySet().size();
+ // all constraints which have Object on the right side will
+ // be ignored, because they are simplified and can not be changed.
+ for (TPHConstraint c : allCons) {
+ if (c.getRight().equals(Type.getInternalName(Object.class)))
+ size--;
+ }
+
+ // check if there are multiple constraint with the same left side.
+ // if yes => check if the super type in the method, if not
+ // then ignore it.
+ HashMap subAndSuper = new HashMap<>();
+ ArrayList eqCons = new ArrayList<>();
+ for (TPHConstraint c : allCons) {
+
+ subAndSuper.put(c.getLeft(), c.getRight());
+ }
+
+ int numOfVisitedPairs = 0;
+ for (String sub : subAndSuper.keySet()) {
+ if (isTPHInConstraint(result, sub))
+ continue;
+
+ if (!classTPHSContainsTPH(tphsClass, sub))
+ continue;
+
+ if (numOfVisitedPairs >= size)
+ break;
+ LinkedList tphInRel = new LinkedList<>();
+ tphInRel.add(sub);
+ String superT = subAndSuper.get(sub);
+ tphInRel.add(superT);
+
+ numOfVisitedPairs++;
+ while (subAndSuper.containsKey(superT)) {
+ superT = subAndSuper.get(superT);
+ if (tphInRel.contains(superT)) {
+ break;
+ }
+ tphInRel.add(superT);
+ numOfVisitedPairs++;
+ }
+
+ // Subtype
+ String subTphRes = tphInRel.getFirst();
+ // Die größte Supertype
+ String superTphRes = tphInRel.getLast();
+
+ // if there is any constraint X < subTph, then
+ // add X at the beginning of the list.
+ while (subAndSuper.containsValue(subTphRes)) {
+ for (String tph : subAndSuper.keySet()) {
+ if (classTPHSContainsTPH(tphsClass, tph) && subAndSuper.get(tph).equals(subTphRes)) {
+ subTphRes = tph;
+ break;
+ }
+ }
+ if (subTphRes.equals(tphInRel.getFirst())) {
+ break;
+ }
+
+ if (isTPHInConstraint(result, subTphRes))
+ break;
+
+ tphInRel.addFirst(subTphRes);
+ numOfVisitedPairs++;
+ }
+
+ subTphRes = tphInRel.getFirst();
+
+ HashSet equals = getEqualsTphsFromEqualCons(eqCons, superTphRes);
+ result.put(new ExtendsConstraint(subTphRes, superTphRes, Relation.EXTENDS), equals);
+
+ }
+
+ System.out.println("EndResult: ");
+ result.forEach((c, hs) -> {
+ if (c != null) {
+ System.out.print(c.toString() + " -> ");
+ if (hs == null) {
+ System.out.print(" [] ");
+ } else {
+ hs.forEach(s -> {
+ System.out.print(s + ", ");
+ });
+ }
+ }
+
+ System.out.println();
+ });
+ System.out.println("----------------");
+ return result;
+ }
+
private static boolean classTPHSContainsTPH(ArrayList tphsClass, String superTphRes) {
- for(TypePlaceholder tph : tphsClass) {
- if(tph.getName().equals(superTphRes))
+ for (TypePlaceholder tph : tphsClass) {
+ if (tph.getName().equals(superTphRes))
return true;
}
return false;
}
private static boolean isTphInEqualSet(HashMap> result, String tph) {
- for(HashSet hs: result.values()) {
- if(hs.contains(tph))
+ for (HashSet hs : result.values()) {
+ if (hs.contains(tph))
return true;
}
return false;
@@ -365,44 +716,44 @@ public class Simplify {
private static HashSet getEqualsTphsFromEqualCons(ArrayList eqCons, String tph) {
HashSet ee = new HashSet<>();
- for(TPHConstraint c : eqCons) {
- if(c.getLeft().equals(tph))
+ for (TPHConstraint c : eqCons) {
+ if (c.getLeft().equals(tph))
ee.add(c.getRight());
- if(c.getRight().equals(tph))
+ if (c.getRight().equals(tph))
ee.add(c.getLeft());
}
return ee;
}
- private static void substituteInMap(HashMap subAndSuper, ArrayList allCons,ArrayList eqCons, String toSubs,
- String tph) {
+ private static void substituteInMap(HashMap subAndSuper, ArrayList allCons,
+ ArrayList eqCons, String toSubs, String tph) {
substituteTPH(allCons, toSubs, tph);
- if(subAndSuper.containsKey(toSubs) && subAndSuper.containsKey(tph)) {
+ if (subAndSuper.containsKey(toSubs) && subAndSuper.containsKey(tph)) {
toSubs = subAndSuper.remove(toSubs);
EqualConstraint eq = new EqualConstraint(subAndSuper.get(tph), toSubs, Relation.EQUAL);
eqCons.add(eq);
- substituteInMap(subAndSuper, allCons,eqCons,toSubs, subAndSuper.get(tph));
- } else if(subAndSuper.containsKey(toSubs) && !subAndSuper.containsKey(tph)) {
+ substituteInMap(subAndSuper, allCons, eqCons, toSubs, subAndSuper.get(tph));
+ } else if (subAndSuper.containsKey(toSubs) && !subAndSuper.containsKey(tph)) {
String val = subAndSuper.remove(toSubs);
subAndSuper.put(tph, val);
} else {
- for(String k : subAndSuper.keySet()) {
+ for (String k : subAndSuper.keySet()) {
subAndSuper.replace(k, toSubs, tph);
}
}
}
private static TPHConstraint getConstraint(String oldRight, String right, ArrayList allCons) {
- for(TPHConstraint c : allCons) {
- if(c.getLeft().equals(oldRight) && c.getRight().equals(right))
+ for (TPHConstraint c : allCons) {
+ if (c.getLeft().equals(oldRight) && c.getRight().equals(right))
return c;
}
return null;
}
private static boolean isTPHInResEqual(HashMap> result, String left) {
- for(HashSet eq : result.values()) {
- if(eq.contains(left)) {
+ for (HashSet eq : result.values()) {
+ if (eq.contains(left)) {
return true;
}
}
@@ -411,75 +762,77 @@ public class Simplify {
private static void substituteAllTPH(ArrayList allCons, ArrayList constraints,
String first) {
- for(TPHConstraint c : allCons) {
- for(TPHConstraint c2 : constraints) {
- if(c.getRel() == Relation.EXTENDS) {
- if(c2.getLeft().equals(c.getLeft()) || c2.getRight().equals(c.getLeft()))
+ for (TPHConstraint c : allCons) {
+ for (TPHConstraint c2 : constraints) {
+ if (c.getRel() == Relation.EXTENDS) {
+ if (c2.getLeft().equals(c.getLeft()) || c2.getRight().equals(c.getLeft()))
c.setLeft(first);
- if(c2.getLeft().equals(c.getRight()) || c2.getRight().equals(c.getRight()))
+ if (c2.getLeft().equals(c.getRight()) || c2.getRight().equals(c.getRight()))
c.setRight(first);
}
-
+
}
}
}
private static void setAllEqual(ArrayList constraints) {
- for(TPHConstraint c:constraints) {
+ for (TPHConstraint c : constraints) {
c.setRel(Relation.EQUAL);
}
}
- public static HashMap> simplifyContraints(HashMap> allConstraints) {
+ public static HashMap> simplifyContraints(
+ HashMap> allConstraints) {
// 1. check if there are any cycles like L set L=R and:
- // * remove both constraints
- // * substitute L with R in all constraint
- // b)no => go to next step
- // 2. check the result of step 1 if there are any equal-constraints like L=R, M=R ..
- // a) yes => put all such TPhs in a map and define "key-Cons"
- // -- key-Cons = TPH < Object --
- // put this Constraint and the
- // b) no
+ // a) yes => set L=R and:
+ // * remove both constraints
+ // * substitute L with R in all constraint
+ // b)no => go to next step
+ // 2. check the result of step 1 if there are any equal-constraints like L=R,
+ // M=R ..
+ // a) yes => put all such TPhs in a map and define "key-Cons"
+ // -- key-Cons = TPH < Object --
+ // put this Constraint and the
+ // b) no
// 3. is
ArrayList allCons = new ArrayList<>();
- for(TPHConstraint tphCons : allConstraints.keySet()) {
+ for (TPHConstraint tphCons : allConstraints.keySet()) {
allCons.add(tphCons);
}
ArrayList consToRemove = new ArrayList<>();
// step 1:
- for(TPHConstraint c : allCons) {
-
+ for (TPHConstraint c : allCons) {
+
String left = c.getLeft();
String right = c.getRight();
- if(c.getRel() == Relation.EXTENDS) {
- TPHConstraint revCon = getReverseConstraint(allCons,left,right);
- if(revCon != null) {
+ if (c.getRel() == Relation.EXTENDS) {
+ TPHConstraint revCon = getReverseConstraint(allCons, left, right);
+ if (revCon != null) {
revCon.setRel(Relation.EQUAL);
consToRemove.add(revCon);
c.setRel(Relation.EQUAL);
- substituteTPH(allCons,left, right);
+ substituteTPH(allCons, left, right);
}
}
}
System.out.println();
System.out.println("NEW ALL CONST: " + allCons.size());
- allCons.forEach(c->System.out.println(c.toString()));
+ allCons.forEach(c -> System.out.println(c.toString()));
System.out.println("----------------");
allCons.removeAll(consToRemove);
consToRemove = new ArrayList<>();
-
+
// int size = allCons.size();
-
+
System.out.println("AFTER DELETE ALL CONST: " + allCons.size());
- allCons.forEach(c->System.out.println(c.toString()));
+ allCons.forEach(c -> System.out.println(c.toString()));
System.out.println("----------------");
HashMap> result = new HashMap<>();
-
- for(TPHConstraint c : allCons) {
- if(c.getRel()==Relation.EQUAL) {
+
+ for (TPHConstraint c : allCons) {
+ if (c.getRel() == Relation.EQUAL) {
HashSet equalTPHs = getEqualsTPHs(result, c);
- TPHConstraint constraint = getKeyConstraint(result,c);
+ TPHConstraint constraint = getKeyConstraint(result, c);
equalTPHs.add(c.getLeft());
equalTPHs.add(c.getRight());
result.put(constraint, equalTPHs);
@@ -488,9 +841,9 @@ public class Simplify {
}
}
System.out.println("Step 2 Result: ");
- result.forEach((c,hs)->{
+ result.forEach((c, hs) -> {
System.out.print(c.toString() + " -> ");
- hs.forEach(s->{
+ hs.forEach(s -> {
System.out.print(s + ", ");
});
System.out.println();
@@ -498,33 +851,33 @@ public class Simplify {
System.out.println("----------------");
allCons.removeAll(consToRemove);
allCons.addAll(result.keySet());
-
- if(!allCons.isEmpty() && allCons.size()<2) {
- if(!result.containsKey(allCons.get(0)))
+ if (!allCons.isEmpty() && allCons.size() < 2) {
+
+ if (!result.containsKey(allCons.get(0)))
result.put(allCons.get(0), null);
-
+
return result;
}
-
+
// size += result.keySet().size();
-
+
// for(TPHConstraint c : allCons) {
// if(c.getRight().equals(Type.getInternalName(Object.class)))
// size--;
// }
-
+
HashMap subAndSuper = new HashMap<>();
-
- for(TPHConstraint c : allCons) {
+
+ for (TPHConstraint c : allCons) {
subAndSuper.put(c.getLeft(), c.getRight());
}
-
+
// int numOfVisitedPairs = 0;
- for(String sub : subAndSuper.keySet()) {
- if(isTPHInConstraint(result,sub))
+ for (String sub : subAndSuper.keySet()) {
+ if (isTPHInConstraint(result, sub))
continue;
-
+
// if(numOfVisitedPairs>=size)
// break;
@@ -532,118 +885,137 @@ public class Simplify {
tphInRel.add(sub);
String superT = subAndSuper.get(sub);
tphInRel.add(superT);
-
+
// numOfVisitedPairs++;
- while(subAndSuper.containsKey(superT)) {
+ while (subAndSuper.containsKey(superT)) {
superT = subAndSuper.get(superT);
- if(tphInRel.contains(superT)) {
+ if (tphInRel.contains(superT)) {
break;
}
tphInRel.add(superT);
// numOfVisitedPairs++;
}
-
+
// Subtype
String subTphRes = tphInRel.getFirst();
// Die größte Supertype
String superTphRes = tphInRel.getLast();
-
- while(subAndSuper.containsValue(subTphRes)) {
- for(String tph : subAndSuper.keySet()) {
- if(subAndSuper.get(tph).equals(subTphRes)) {
+
+ while (subAndSuper.containsValue(subTphRes)) {
+ for (String tph : subAndSuper.keySet()) {
+ if (subAndSuper.get(tph).equals(subTphRes)) {
subTphRes = tph;
break;
}
}
- if(subTphRes.equals(tphInRel.getFirst())) {
+ if (subTphRes.equals(tphInRel.getFirst())) {
break;
}
tphInRel.addFirst(subTphRes);
// numOfVisitedPairs++;
}
-
+
subTphRes = tphInRel.getFirst();
-
+
int i = 2;
- while(superTphRes.equals(Type.getInternalName(Object.class)) && (tphInRel.size()-i) >0) {
- superTphRes = tphInRel.get(tphInRel.size()-i);
+ while (superTphRes.equals(Type.getInternalName(Object.class)) && (tphInRel.size() - i) > 0) {
+ superTphRes = tphInRel.get(tphInRel.size() - i);
i++;
}
- if(superTphRes.equals(Type.getInternalName(Object.class))) {
- result.put(new ExtendsConstraint(subTphRes, Type.getInternalName(Object.class), Relation.EXTENDS), null);
+ if (superTphRes.equals(Type.getInternalName(Object.class))) {
+ result.put(new ExtendsConstraint(subTphRes, Type.getInternalName(Object.class), Relation.EXTENDS),
+ null);
} else {
result.put(new ExtendsConstraint(subTphRes, superTphRes, Relation.EXTENDS), null);
- result.put(new ExtendsConstraint(superTphRes, Type.getInternalName(Object.class), Relation.EXTENDS), null);
+ result.put(new ExtendsConstraint(superTphRes, Type.getInternalName(Object.class), Relation.EXTENDS),
+ null);
}
-
+
}
System.out.println("EndResult: ");
- result.forEach((c,hs)->{
- if(c!=null) {
+ result.forEach((c, hs) -> {
+ if (c != null) {
System.out.print(c.toString() + " -> ");
- if(hs == null) {
+ if (hs == null) {
System.out.print(" [] ");
- }else {
- hs.forEach(s->{
+ } else {
+ hs.forEach(s -> {
System.out.print(s + ", ");
});
}
}
-
-
+
System.out.println();
});
System.out.println("----------------");
return result;
}
-
- private static void substituteTPH(ArrayList allCons,String left ,String right) {
- allCons.forEach(c->{
- if(c.getRel() == Relation.EXTENDS) {
- if(c.getLeft().equals(left))
+
+ private static void substituteTPH(ArrayList allCons, String left, String right) {
+ allCons.forEach(c -> {
+ if (c.getRel() == Relation.EXTENDS) {
+ if (c.getLeft().equals(left))
c.setLeft(right);
- if(c.getRight().equals(left))
+ if (c.getRight().equals(left))
c.setRight(right);
}
});
}
private static TPHConstraint getReverseConstraint(ArrayList allCons, String left, String right) {
- for(TPHConstraint c : allCons) {
- if(c.getLeft().equals(right) && c.getRight().equals(left)){
+ for (TPHConstraint c : allCons) {
+ if (c.getLeft().equals(right) && c.getRight().equals(left)) {
return c;
}
}
return null;
}
-
+
private static boolean isTPHInConstraint(HashMap> result, String sub) {
- for(TPHConstraint c : result.keySet()) {
- if(c.getLeft().equals(sub))
+ for (TPHConstraint c : result.keySet()) {
+ if (c.getLeft().equals(sub))
return true;
}
return false;
}
private static boolean containTPH(ArrayList methodTphs, String sub) {
- for(String tph : methodTphs) {
- if(tph.equals(sub))
+ for (String tph : methodTphs) {
+ if (tph.equals(sub))
return true;
}
return false;
}
- private static TPHConstraint getKeyConstraint(HashMap> result, TPHConstraint toFind) {
- for(TPHConstraint c : result.keySet()) {
- if(c.containTPH(toFind.getLeft()) || c.containTPH(toFind.getRight()))
+ private static TPHConstraint getKeyConstraint(HashMap> result, TPHConstraint toFind,
+ ArrayList allCons) {
+
+ for (TPHConstraint c : result.keySet()) {
+ if (c.containTPH(toFind.getLeft()))
return c;
}
+ for (TPHConstraint c : allCons) {
+ if (toFind.getRight().equals(c.getLeft()))
+ return c;
+ }
+
return new ExtendsConstraint(toFind.getRight(), Type.getInternalName(Object.class), Relation.EXTENDS);
}
- private static HashSet getEqualsTPHs(HashMap> result, TPHConstraint toFind) {
- for(TPHConstraint c : result.keySet()) {
- if(c.containTPH(toFind.getLeft()) || c.containTPH(toFind.getRight()))
+ private static TPHConstraint getKeyConstraint(HashMap> result,
+ TPHConstraint toFind) {
+
+ for (TPHConstraint c : result.keySet()) {
+ if (c.containTPH(toFind.getLeft()) || c.containTPH(toFind.getRight()))
+ return c;
+ }
+
+ return new ExtendsConstraint(toFind.getRight(), Type.getInternalName(Object.class), Relation.EXTENDS);
+ }
+
+ private static HashSet getEqualsTPHs(HashMap> result, TPHConstraint toFind) {
+ for (TPHConstraint c : result.keySet()) {
+ if (c.containTPH(toFind.getLeft()) || c.containTPH(toFind.getRight()))
return result.get(c);
}
return new HashSet<>();
diff --git a/src/main/java/de/dhbwstuttgart/core/JavaTXCompiler.java b/src/main/java/de/dhbwstuttgart/core/JavaTXCompiler.java
index a860adf9..b84c9441 100644
--- a/src/main/java/de/dhbwstuttgart/core/JavaTXCompiler.java
+++ b/src/main/java/de/dhbwstuttgart/core/JavaTXCompiler.java
@@ -1,3 +1,4 @@
+//PL 2018-12-19: typeInferenceOld nach typeInference uebertragen
package de.dhbwstuttgart.core;
@@ -15,6 +16,7 @@ import de.dhbwstuttgart.syntaxtree.ParameterList;
import de.dhbwstuttgart.syntaxtree.SourceFile;
import de.dhbwstuttgart.syntaxtree.factory.ASTFactory;
import de.dhbwstuttgart.syntaxtree.factory.UnifyTypeFactory;
+import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric;
import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder;
import de.dhbwstuttgart.syntaxtree.visual.ASTTypePrinter;
import de.dhbwstuttgart.typeinference.constraints.Constraint;
@@ -25,26 +27,37 @@ import de.dhbwstuttgart.typeinference.typeAlgo.TYPE;
import de.dhbwstuttgart.typeinference.unify.RuleSet;
import de.dhbwstuttgart.typeinference.unify.TypeUnify;
import de.dhbwstuttgart.typeinference.unify.distributeVariance;
+import de.dhbwstuttgart.typeinference.unify.interfaces.IFiniteClosure;
import de.dhbwstuttgart.typeinference.unify.model.FiniteClosure;
import de.dhbwstuttgart.typeinference.unify.model.PairOperator;
import de.dhbwstuttgart.typeinference.unify.model.PlaceholderType;
import de.dhbwstuttgart.typeinference.unify.model.UnifyPair;
+import de.dhbwstuttgart.typeinference.unify.model.UnifyType;
import de.dhbwstuttgart.typeinference.unify.TypeUnifyTask;
+import de.dhbwstuttgart.typeinference.unify.UnifyResultListener;
+import de.dhbwstuttgart.typeinference.unify.UnifyResultListenerImpl;
+import de.dhbwstuttgart.typeinference.unify.UnifyResultModel;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;
+import org.antlr.v4.parse.ANTLRParser.throwsSpec_return;
+import org.apache.commons.io.output.NullOutputStream;
+
public class JavaTXCompiler {
final CompilationEnvironment environment;
+ Boolean resultmodel = true;
public final Map sourceFiles = new HashMap<>();
- Boolean log = true; //gibt an ob ein Log-File nach System.getProperty("user.dir")+"/test/logFiles/log" geschrieben werden soll?
+ Boolean log = true; //gibt an ob ein Log-File nach System.getProperty("user.dir")+"src/test/java/logFiles" geschrieben werden soll?
public JavaTXCompiler(File sourceFile) throws IOException, ClassNotFoundException {
this(Arrays.asList(sourceFile));
@@ -103,7 +116,8 @@ public class JavaTXCompiler {
return new ArrayList<>(allClasses);
}
- public List typeInference() throws ClassNotFoundException {
+/*
+ public List typeInferenceOld() throws ClassNotFoundException {
List allClasses = new ArrayList<>();//environment.getAllAvailableClasses();
//Alle Importierten Klassen in allen geparsten Sourcefiles kommen ins FC
for(SourceFile sf : this.sourceFiles.values()) {
@@ -187,10 +201,7 @@ public class JavaTXCompiler {
}
}
return x;//HIER DIE JEWEILS RECHT BZW. LINKE SEITE AUF GLEICHE VARIANZ SETZEN WIE DIE JEWEILS ANDERE SEITE
- })
- /* PL 2018-11-07 wird in varianceInheritance erledigt
- .map( y -> {
-
+ }).map( y -> {
if ((y.getLhsType() instanceof PlaceholderType) && (y.getRhsType() instanceof PlaceholderType)) {
if (((PlaceholderType)y.getLhsType()).getVariance() != 0 && ((PlaceholderType)y.getRhsType()).getVariance() == 0) {
((PlaceholderType)y.getRhsType()).setVariance(((PlaceholderType)y.getLhsType()).getVariance());
@@ -200,20 +211,16 @@ public class JavaTXCompiler {
}
}
return y; } )
- */
.collect(Collectors.toCollection(HashSet::new));
- varianceInheritance(xConsSet);
-
-
-
- Set> result = unify.unifySequential(xConsSet, finiteClosure, logFile, log);
- //Set> result = unify.unify(xConsSet, finiteClosure);
- System.out.println("RESULT: " + result);
- logFile.write("RES: " + result.toString()+"\n");
- logFile.flush();
- results.addAll(result);
+ varianceInheritance(xConsSet);
+ Set> result = unify.unifySequential(xConsSet, finiteClosure, logFile, log);
+ //Set> result = unify.unify(xConsSet, finiteClosure);
+ System.out.println("RESULT: " + result);
+ logFile.write("RES: " + result.toString()+"\n");
+ logFile.flush();
+ results.addAll(result);
}
-
+
results = results.stream().map(x -> {
Optional> res = new RuleSet().subst(x.stream().map(y -> {
if (y.getPairOp() == PairOperator.SMALLERDOTWC) y.setPairOp(PairOperator.EQUALSDOT);
@@ -236,12 +243,14 @@ public class JavaTXCompiler {
return results.stream().map((unifyPairs ->
new ResultSet(UnifyTypeFactory.convert(unifyPairs, generateTPHMap(cons))))).collect(Collectors.toList());
}
-
+ */
/**
- * Vererbt alle Variancen
+ * Vererbt alle Variancen bei Paaren (a <. theta) oder (Theta <. a)
+ * wenn a eine Variance !=0 hat auf alle Typvariablen in Theta.
* @param eq The set of constraints
*/
- private void varianceInheritance(Set eq) {
+ /*
+ private void varianceInheritance(Set eq) {
Set usedTPH = new HashSet<>();
Set phSet = eq.stream().map(x -> {
Set pair = new HashSet<>();
@@ -267,20 +276,365 @@ public class JavaTXCompiler {
phSetVariance.removeIf(x -> (x.getVariance() == 0 || usedTPH.contains(x)));
}
}
+ */
+
+ public UnifyResultModel typeInferenceAsync(UnifyResultListener resultListener) throws ClassNotFoundException {
+ List allClasses = new ArrayList<>();//environment.getAllAvailableClasses();
+ //Alle Importierten Klassen in allen geparsten Sourcefiles kommen ins FC
+ for(SourceFile sf : this.sourceFiles.values()) {
+ allClasses.addAll(getAvailableClasses(sf));
+ allClasses.addAll(sf.getClasses());
+ }
- private Map generateTPHMap(ConstraintSet constraints) {
- HashMap ret = new HashMap<>();
- constraints.map((Pair p) -> {
- if (p.TA1 instanceof TypePlaceholder) {
- ret.put(((TypePlaceholder) p.TA1).getName(), (TypePlaceholder) p.TA1);
- }
- if (p.TA2 instanceof TypePlaceholder) {
- ret.put(((TypePlaceholder) p.TA2).getName(), (TypePlaceholder) p.TA2);
- }
- return null;
- });
- return ret;
+ final ConstraintSet cons = getConstraints();
+ Set> results = new HashSet<>();
+ UnifyResultModel urm = new UnifyResultModel();
+ urm.addUnifyResultListener(resultListener);
+ try {
+ Writer logFile = new OutputStreamWriter(new NullOutputStream());
+ //new FileWriter(new File("log_"+sourceFiles.keySet().iterator().next().getName()));
+
+ IFiniteClosure finiteClosure = UnifyTypeFactory.generateFC(allClasses,logFile);
+ System.out.println(finiteClosure);
+ ConstraintSet unifyCons = UnifyTypeFactory.convert(cons);
+
+ Function distributeInnerVars =
+ x -> {
+ UnifyType lhs, rhs;
+ if (((lhs = x.getLhsType()) instanceof PlaceholderType)
+ && ((rhs = x.getRhsType()) instanceof PlaceholderType)
+ && (((PlaceholderType)lhs).isInnerType()
+ || ((PlaceholderType)rhs).isInnerType()))
+ {
+ ((PlaceholderType)lhs).setInnerType(true);
+ ((PlaceholderType)rhs).setInnerType(true);
+ }
+ return x;
+
+ };
+ logFile.write(unifyCons.toString());
+ unifyCons = unifyCons.map(distributeInnerVars);
+ logFile.write(unifyCons.toString());
+ TypeUnify unify = new TypeUnify();
+ //Set> results = new HashSet<>(); Nach vorne gezogen
+ logFile.write("FC:\\" + finiteClosure.toString()+"\n");
+ for(SourceFile sf : this.sourceFiles.values()) {
+ logFile.write(ASTTypePrinter.print(sf));
+ }
+ logFile.flush();
+
+ Set methodParaTypeVarNames = allClasses.stream().map(x -> x.getMethods().stream().map(y -> y.getParameterList().getFormalparalist()
+ .stream().filter(z -> z.getType() instanceof TypePlaceholder)
+ .map(z -> ((TypePlaceholder)z.getType()).getName()).collect(Collectors.toCollection(HashSet::new)))
+ .reduce(new HashSet(), (a,b) -> { a.addAll(b); return a;}, (a,b) -> { a.addAll(b); return a;} ) )
+ .reduce(new HashSet(), (a,b) -> { a.addAll(b); return a;} );
+
+ Set constructorParaTypeVarNames = allClasses.stream().map(x -> x.getConstructors().stream().map(y -> y.getParameterList().getFormalparalist()
+ .stream().filter(z -> z.getType() instanceof TypePlaceholder)
+ .map(z -> ((TypePlaceholder)z.getType()).getName()).collect(Collectors.toCollection(HashSet::new)))
+ .reduce(new HashSet(), (a,b) -> { a.addAll(b); return a;}, (a,b) -> { a.addAll(b); return a;} ) )
+ .reduce(new HashSet(), (a,b) -> { a.addAll(b); return a;} );
+
+ Set paraTypeVarNames = methodParaTypeVarNames;
+ paraTypeVarNames.addAll(constructorParaTypeVarNames);
+
+
+ Set returnTypeVarNames = allClasses.stream().map(x -> x.getMethods().stream().filter(y -> y.getReturnType() instanceof TypePlaceholder)
+ .map(z -> ((TypePlaceholder)z.getReturnType()).getName()).collect(Collectors.toCollection(HashSet::new))).reduce((a,b) -> { a.addAll(b); return a;} ).get();
+
+ Set fieldTypeVarNames = allClasses.stream().map(x -> x.getFieldDecl().stream().filter(y -> y.getReturnType() instanceof TypePlaceholder)
+ .map(z -> ((TypePlaceholder)z.getReturnType()).getName()).collect(Collectors.toCollection(HashSet::new))).reduce((a,b) -> { a.addAll(b); return a;} ).get();
+
+ returnTypeVarNames.addAll(fieldTypeVarNames);
+
+ unifyCons = unifyCons.map(x -> {
+ //Hier muss ueberlegt werden, ob
+ //1. alle Argument- und Retuntyp-Variablen in allen UnifyPairs
+ // mit disableWildcardtable() werden.
+ //2. alle Typvariablen mit Argument- oder Retuntyp-Variablen
+ //in Beziehung auch auf disableWildcardtable() gesetzt werden muessen
+ //PL 2018-04-23
+ if ((x.getLhsType() instanceof PlaceholderType)) {
+ if (paraTypeVarNames.contains(x.getLhsType().getName())) {
+ ((PlaceholderType)x.getLhsType()).setVariance((byte)1);
+ ((PlaceholderType)x.getLhsType()).disableWildcardtable();
+ }
+ if (returnTypeVarNames.contains(x.getLhsType().getName())) {
+ ((PlaceholderType)x.getLhsType()).setVariance((byte)-1);
+ ((PlaceholderType)x.getLhsType()).disableWildcardtable();
+ }
+ }
+ if ((x.getRhsType() instanceof PlaceholderType)) {
+ if (paraTypeVarNames.contains(x.getRhsType().getName())) {
+ ((PlaceholderType)x.getRhsType()).setVariance((byte)1);
+ ((PlaceholderType)x.getRhsType()).disableWildcardtable();
+ }
+ if (returnTypeVarNames.contains(x.getRhsType().getName())) {
+ ((PlaceholderType)x.getRhsType()).setVariance((byte)-1);
+ ((PlaceholderType)x.getRhsType()).disableWildcardtable();
+ }
+ }
+ return x;//HIER DIE JEWEILS RECHT BZW. LINKE SEITE AUF GLEICHE VARIANZ SETZEN WIE DIE JEWEILS ANDERE SEITE
+ });
+ Set varianceTPHold;
+ Set varianceTPH = new HashSet<>();
+ varianceTPH = varianceInheritanceConstraintSet(unifyCons);
+
+ /* PL 2018-11-07 wird in varianceInheritanceConstraintSet erledigt
+ do { //PL 2018-11-05 Huellenbildung Variance auf alle TPHs der Terme auf der jeweiligen
+ //anderen Seite übertragen
+ varianceTPHold = new HashSet<>(varianceTPH);
+ varianceTPH = varianceInheritanceConstraintSet(unifyCons);
+ unifyCons.map( y -> {
+ if ((y.getLhsType() instanceof PlaceholderType) && (y.getRhsType() instanceof PlaceholderType)) {
+ if (((PlaceholderType)y.getLhsType()).getVariance() != 0 && ((PlaceholderType)y.getRhsType()).getVariance() == 0) {
+ ((PlaceholderType)y.getRhsType()).setVariance(((PlaceholderType)y.getLhsType()).getVariance());
+ }
+ if (((PlaceholderType)y.getLhsType()).getVariance() == 0 && ((PlaceholderType)y.getRhsType()).getVariance() != 0) {
+ ((PlaceholderType)y.getLhsType()).setVariance(((PlaceholderType)y.getRhsType()).getVariance());
+ }
+ }
+ return y; } ); }
+ while (!varianceTPHold.equals(varianceTPH));
+ */
+
+ //Set> result = unify.unifySequential(xConsSet, finiteClosure, logFile, log);
+ //Set> result = unify.unify(xConsSet, finiteClosure);
+ List>> oderConstraints = unifyCons.getOderConstraints().stream().map(x -> {
+ Set> ret = new HashSet<>();
+ for (Constraint y : x) {
+ ret.add(new HashSet<>(y));
+ }
+ return ret;
+ }).collect(Collectors.toCollection(ArrayList::new));
+ unify.unifyAsync(unifyCons.getUndConstraints(), oderConstraints, finiteClosure, logFile, log, cons, urm);
+ }
+ catch (IOException e) {
+ System.err.println("kein LogFile");
+ }
+ return urm;
}
+
+
+ public List typeInference() throws ClassNotFoundException {
+ List allClasses = new ArrayList<>();//environment.getAllAvailableClasses();
+ //Alle Importierten Klassen in allen geparsten Sourcefiles kommen ins FC
+ for(SourceFile sf : this.sourceFiles.values()) {
+ allClasses.addAll(getAvailableClasses(sf));
+ allClasses.addAll(sf.getClasses());
+ }
+
+ final ConstraintSet cons = getConstraints();
+ Set> results = new HashSet<>();
+ try {
+ Writer logFile = new OutputStreamWriter(new NullOutputStream());
+ //new FileWriter(new File("log_"+sourceFiles.keySet().iterator().next().getName()));
+
+ IFiniteClosure finiteClosure = UnifyTypeFactory.generateFC(allClasses,logFile);
+ System.out.println(finiteClosure);
+ ConstraintSet unifyCons = UnifyTypeFactory.convert(cons);
+
+ Function distributeInnerVars =
+ x -> {
+ UnifyType lhs, rhs;
+ if (((lhs = x.getLhsType()) instanceof PlaceholderType)
+ && ((rhs = x.getRhsType()) instanceof PlaceholderType)
+ && (((PlaceholderType)lhs).isInnerType()
+ || ((PlaceholderType)rhs).isInnerType()))
+ {
+ ((PlaceholderType)lhs).setInnerType(true);
+ ((PlaceholderType)rhs).setInnerType(true);
+ }
+ return x;
+
+ };
+ logFile.write(unifyCons.toString());
+ unifyCons = unifyCons.map(distributeInnerVars);
+ logFile.write(unifyCons.toString());
+ TypeUnify unify = new TypeUnify();
+ //Set> results = new HashSet<>(); Nach vorne gezogen
+ logFile.write("FC:\\" + finiteClosure.toString()+"\n");
+ for(SourceFile sf : this.sourceFiles.values()) {
+ logFile.write(ASTTypePrinter.print(sf));
+ }
+ logFile.flush();
+
+ Set methodParaTypeVarNames = allClasses.stream().map(x -> x.getMethods().stream().map(y -> y.getParameterList().getFormalparalist()
+ .stream().filter(z -> z.getType() instanceof TypePlaceholder)
+ .map(z -> ((TypePlaceholder)z.getType()).getName()).collect(Collectors.toCollection(HashSet::new)))
+ .reduce(new HashSet(), (a,b) -> { a.addAll(b); return a;}, (a,b) -> { a.addAll(b); return a;} ) )
+ .reduce(new HashSet(), (a,b) -> { a.addAll(b); return a;} );
+
+ Set constructorParaTypeVarNames = allClasses.stream().map(x -> x.getConstructors().stream().map(y -> y.getParameterList().getFormalparalist()
+ .stream().filter(z -> z.getType() instanceof TypePlaceholder)
+ .map(z -> ((TypePlaceholder)z.getType()).getName()).collect(Collectors.toCollection(HashSet::new)))
+ .reduce(new HashSet(), (a,b) -> { a.addAll(b); return a;}, (a,b) -> { a.addAll(b); return a;} ) )
+ .reduce(new HashSet(), (a,b) -> { a.addAll(b); return a;} );
+
+ Set paraTypeVarNames = methodParaTypeVarNames;
+ paraTypeVarNames.addAll(constructorParaTypeVarNames);
+
+
+ Set returnTypeVarNames = allClasses.stream().map(x -> x.getMethods().stream().filter(y -> y.getReturnType() instanceof TypePlaceholder)
+ .map(z -> ((TypePlaceholder)z.getReturnType()).getName()).collect(Collectors.toCollection(HashSet::new))).reduce((a,b) -> { a.addAll(b); return a;} ).get();
+
+ Set fieldTypeVarNames = allClasses.stream().map(x -> x.getFieldDecl().stream().filter(y -> y.getReturnType() instanceof TypePlaceholder)
+ .map(z -> ((TypePlaceholder)z.getReturnType()).getName()).collect(Collectors.toCollection(HashSet::new))).reduce((a,b) -> { a.addAll(b); return a;} ).get();
+
+ returnTypeVarNames.addAll(fieldTypeVarNames);
+
+ unifyCons = unifyCons.map(x -> {
+ //Hier muss ueberlegt werden, ob
+ //1. alle Argument- und Retuntyp-Variablen in allen UnifyPairs
+ // mit disableWildcardtable() werden.
+ //2. alle Typvariablen mit Argument- oder Retuntyp-Variablen
+ //in Beziehung auch auf disableWildcardtable() gesetzt werden muessen
+ //PL 2018-04-23
+ if ((x.getLhsType() instanceof PlaceholderType)) {
+ if (paraTypeVarNames.contains(x.getLhsType().getName())) {
+ ((PlaceholderType)x.getLhsType()).setVariance((byte)1);
+ ((PlaceholderType)x.getLhsType()).disableWildcardtable();
+ }
+ if (returnTypeVarNames.contains(x.getLhsType().getName())) {
+ ((PlaceholderType)x.getLhsType()).setVariance((byte)-1);
+ ((PlaceholderType)x.getLhsType()).disableWildcardtable();
+ }
+ }
+ if ((x.getRhsType() instanceof PlaceholderType)) {
+ if (paraTypeVarNames.contains(x.getRhsType().getName())) {
+ ((PlaceholderType)x.getRhsType()).setVariance((byte)1);
+ ((PlaceholderType)x.getRhsType()).disableWildcardtable();
+ }
+ if (returnTypeVarNames.contains(x.getRhsType().getName())) {
+ ((PlaceholderType)x.getRhsType()).setVariance((byte)-1);
+ ((PlaceholderType)x.getRhsType()).disableWildcardtable();
+ }
+ }
+ return x;//HIER DIE JEWEILS RECHT BZW. LINKE SEITE AUF GLEICHE VARIANZ SETZEN WIE DIE JEWEILS ANDERE SEITE
+ });
+ Set varianceTPHold;
+ Set varianceTPH = new HashSet<>();
+ varianceTPH = varianceInheritanceConstraintSet(unifyCons);
+
+ /* PL 2018-11-07 wird in varianceInheritanceConstraintSet erledigt
+ do { //PL 2018-11-05 Huellenbildung Variance auf alle TPHs der Terme auf der jeweiligen
+ //anderen Seite übertragen
+ varianceTPHold = new HashSet<>(varianceTPH);
+ varianceTPH = varianceInheritanceConstraintSet(unifyCons);
+ unifyCons.map( y -> {
+ if ((y.getLhsType() instanceof PlaceholderType) && (y.getRhsType() instanceof PlaceholderType)) {
+ if (((PlaceholderType)y.getLhsType()).getVariance() != 0 && ((PlaceholderType)y.getRhsType()).getVariance() == 0) {
+ ((PlaceholderType)y.getRhsType()).setVariance(((PlaceholderType)y.getLhsType()).getVariance());
+ }
+ if (((PlaceholderType)y.getLhsType()).getVariance() == 0 && ((PlaceholderType)y.getRhsType()).getVariance() != 0) {
+ ((PlaceholderType)y.getLhsType()).setVariance(((PlaceholderType)y.getRhsType()).getVariance());
+ }
+ }
+ return y; } ); }
+ while (!varianceTPHold.equals(varianceTPH));
+ */
+
+ //Set> result = unify.unifySequential(xConsSet, finiteClosure, logFile, log);
+ //Set> result = unify.unify(xConsSet, finiteClosure);
+ List>> oderConstraints = unifyCons.getOderConstraints().stream().map(x -> {
+ Set> ret = new HashSet<>();
+ for (Constraint y : x) {
+ ret.add(new HashSet<>(y));
+ }
+ return ret;
+ }).collect(Collectors.toCollection(ArrayList::new));
+ if (resultmodel) {
+ /* UnifyResultModel Anfang */
+ UnifyResultModel urm = new UnifyResultModel();
+ UnifyResultListenerImpl li = new UnifyResultListenerImpl();
+ urm.addUnifyResultListener(li);
+ unify.unifyParallel(unifyCons.getUndConstraints(), oderConstraints, finiteClosure, logFile, log, cons, urm);
+ System.out.println("RESULT Final: " + li.getResults());
+ logFile.write("RES_FINAL: " + li.getResults().toString()+"\n");
+ logFile.flush();
+ return li.getResults();
+ }
+ /* UnifyResultModel End */
+ else {
+ Set> result = unify.unify(unifyCons.getUndConstraints(), oderConstraints, finiteClosure, logFile, log, cons);
+ //Set> result = unify.unifyOderConstraints(unifyCons.getUndConstraints(), oderConstraints, finiteClosure, logFile, log, cons);
+ System.out.println("RESULT: " + result);
+ logFile.write("RES: " + result.toString()+"\n");
+ logFile.flush();
+ results.addAll(result);
+
+
+ results = results.stream().map(x -> {
+ Optional> res = new RuleSet().subst(x.stream().map(y -> {
+ if (y.getPairOp() == PairOperator.SMALLERDOTWC) y.setPairOp(PairOperator.EQUALSDOT);
+ return y; //alle Paare a <.? b erden durch a =. b ersetzt
+ }).collect(Collectors.toCollection(HashSet::new)));
+ if (res.isPresent()) {//wenn subst ein Erg liefert wurde was veraendert
+ return new TypeUnifyTask().applyTypeUnificationRules(res.get(), finiteClosure);
+ }
+ else return x; //wenn nichts veraendert wurde wird x zurueckgegeben
+ }).collect(Collectors.toCollection(HashSet::new));
+ System.out.println("RESULT Final: " + results);
+ logFile.write("RES_FINAL: " + results.toString()+"\n");
+ logFile.flush();
+ logFile.write("PLACEHOLDERS: " + PlaceholderType.EXISTING_PLACEHOLDERS);
+ logFile.flush();
+ }}
+ catch (IOException e) {
+ System.err.println("kein LogFile");
+ }
+ return results.stream().map((unifyPairs ->
+ new ResultSet(UnifyTypeFactory.convert(unifyPairs, Pair.generateTPHMap(cons))))).collect(Collectors.toList());
+ }
+
+
+
+ /**
+ * Vererbt alle Variancen bei Paaren (a <. theta) oder (Theta <. a)
+ * wenn a eine Variance !=0 hat auf alle Typvariablen in Theta.
+ * @param eq The set of constraints
+ */
+ private Set varianceInheritanceConstraintSet(ConstraintSet cons) {
+ Set eq = cons.getAll();
+ Set usedTPH = new HashSet<>();
+ Set phSet = eq.stream().map(x -> {
+ Set pair = new HashSet<>();
+ if (x.getLhsType() instanceof PlaceholderType) pair.add((PlaceholderType)x.getLhsType());
+ if (x.getRhsType() instanceof PlaceholderType) pair.add((PlaceholderType)x.getRhsType());
+ return pair;
+ }).reduce(new HashSet<>(), (a,b) -> { a.addAll(b); return a;} , (c,d) -> { c.addAll(d); return c;});
+
+ ArrayList phSetVariance = new ArrayList<>(phSet);
+ phSetVariance.removeIf(x -> (x.getVariance() == 0));
+ while(!phSetVariance.isEmpty()) {
+ PlaceholderType a = phSetVariance.remove(0);
+ usedTPH.add(a);
+ //HashMap ht = new HashMap<>();
+ //ht.put(a, a.getVariance());
+ //ConstraintSet eq1 = cons;
+ //eq1.removeIf(x -> !(x.getLhsType() instanceof PlaceholderType && ((PlaceholderType)x.getLhsType()).equals(a)));
+ //durch if-Abfrage im foreach geloest
+ cons.forEach(x -> {
+ if (x.getLhsType() instanceof PlaceholderType && ((PlaceholderType)x.getLhsType()).equals(a)) {
+ x.getRhsType().accept(new distributeVariance(), a.getVariance());
+ }
+ });
+ //` eq1 = new HashSet<>(eq);
+ //eq1.removeIf(x -> !(x.getRhsType() instanceof PlaceholderType && ((PlaceholderType)x.getRhsType()).equals(a)));
+ //durch if-Abfrage im foreach geloest
+ cons.forEach(x -> {
+ if (x.getRhsType() instanceof PlaceholderType && ((PlaceholderType)x.getRhsType()).equals(a)) {
+ x.getLhsType().accept(new distributeVariance(), a.getVariance());
+ }
+ });
+ phSetVariance = new ArrayList<>(phSet); //macht vermutlich keinen Sinn PL 2018-10-18, doch, es koennen neue TPHs mit Variancen dazugekommen sein PL 2018-11-07
+ phSetVariance.removeIf(x -> (x.getVariance() == 0 || usedTPH.contains(x)));
+ }
+ return usedTPH;
+ }
+
+
+
private SourceFile parse(File sourceFile) throws IOException, java.lang.ClassNotFoundException {
CompilationUnitContext tree = JavaTXParser.parse(sourceFile);
diff --git a/src/main/java/de/dhbwstuttgart/syntaxtree/AbstractASTWalker.java b/src/main/java/de/dhbwstuttgart/syntaxtree/AbstractASTWalker.java
index bf9fe263..6fd83f3b 100644
--- a/src/main/java/de/dhbwstuttgart/syntaxtree/AbstractASTWalker.java
+++ b/src/main/java/de/dhbwstuttgart/syntaxtree/AbstractASTWalker.java
@@ -80,6 +80,9 @@ public abstract class AbstractASTWalker implements ASTVisitor{
for(Field f : classOrInterface.getFieldDecl()){
f.accept(this);
}
+ for(Constructor c : classOrInterface.getConstructors()){
+ c.accept(this);
+ }
for(Method m : classOrInterface.getMethods()){
m.accept(this);
}
diff --git a/src/main/java/de/dhbwstuttgart/syntaxtree/factory/UnifyTypeFactory.java b/src/main/java/de/dhbwstuttgart/syntaxtree/factory/UnifyTypeFactory.java
index 71985334..a764db6e 100644
--- a/src/main/java/de/dhbwstuttgart/syntaxtree/factory/UnifyTypeFactory.java
+++ b/src/main/java/de/dhbwstuttgart/syntaxtree/factory/UnifyTypeFactory.java
@@ -1,5 +1,7 @@
package de.dhbwstuttgart.syntaxtree.factory;
+import java.io.FileWriter;
+import java.io.Writer;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -29,7 +31,7 @@ public class UnifyTypeFactory {
private static ArrayList PLACEHOLDERS = new ArrayList<>();
- public static FiniteClosure generateFC(List fromClasses) throws ClassNotFoundException {
+ public static FiniteClosure generateFC(List fromClasses, Writer logFile) throws ClassNotFoundException {
/*
Die transitive Hülle muss funktionieren.
Man darf schreiben List extends AL
@@ -40,7 +42,7 @@ public class UnifyTypeFactory {
Generell dürfen sie immer die gleichen Namen haben.
TODO: die transitive Hülle bilden
*/
- return new FiniteClosure(FCGenerator.toUnifyFC(fromClasses));
+ return new FiniteClosure(FCGenerator.toUnifyFC(fromClasses), logFile);
}
public static UnifyPair generateSmallerPair(UnifyType tl, UnifyType tr){
@@ -63,26 +65,26 @@ public class UnifyTypeFactory {
* Convert from
* ASTType -> UnifyType
*/
- public static UnifyType convert(RefTypeOrTPHOrWildcardOrGeneric t){
+ public static UnifyType convert(RefTypeOrTPHOrWildcardOrGeneric t, Boolean innerType){
if(t instanceof GenericRefType){
- return UnifyTypeFactory.convert((GenericRefType)t);
+ return UnifyTypeFactory.convert((GenericRefType)t, innerType);
}else
if(t instanceof FunN){
- return UnifyTypeFactory.convert((FunN)t);
+ return UnifyTypeFactory.convert((FunN)t, innerType);
}else if(t instanceof TypePlaceholder){
- return UnifyTypeFactory.convert((TypePlaceholder)t);
+ return UnifyTypeFactory.convert((TypePlaceholder)t, innerType);
}else if(t instanceof ExtendsWildcardType){
- return UnifyTypeFactory.convert((ExtendsWildcardType)t);
+ return UnifyTypeFactory.convert((ExtendsWildcardType)t, innerType);
}else if(t instanceof SuperWildcardType){
- return UnifyTypeFactory.convert((SuperWildcardType)t);
+ return UnifyTypeFactory.convert((SuperWildcardType)t, innerType);
}else if(t instanceof RefType){
- return UnifyTypeFactory.convert((RefType)t);
+ return UnifyTypeFactory.convert((RefType)t, innerType);
}
//Es wurde versucht ein Typ umzuwandeln, welcher noch nicht von der Factory abgedeckt ist
throw new NotImplementedException("Der Typ "+t+" kann nicht umgewandelt werden");
}
- public static UnifyType convert(RefType t){
+ public static UnifyType convert(RefType t, Boolean innerType){
//Check if it is a FunN Type:
Pattern p = Pattern.compile("Fun(\\d+)");
Matcher m = p.matcher(t.getName().toString());
@@ -90,14 +92,14 @@ public class UnifyTypeFactory {
if(b){
Integer N = Integer.valueOf(m.group(1));
if((N + 1) == t.getParaList().size()){
- return convert(new FunN(t.getParaList()));
+ return convert(new FunN(t.getParaList()), false);
}
}
UnifyType ret;
if(t.getParaList() != null && t.getParaList().size() > 0){
List params = new ArrayList<>();
for(RefTypeOrTPHOrWildcardOrGeneric pT : t.getParaList()){
- params.add(UnifyTypeFactory.convert(pT));
+ params.add(UnifyTypeFactory.convert(pT, true));
}
ret = new ReferenceType(t.getName().toString(),new TypeParams(params));
}else{
@@ -106,39 +108,45 @@ public class UnifyTypeFactory {
return ret;
}
- public static UnifyType convert(FunN t){
+ public static UnifyType convert(FunN t, Boolean innerType){
UnifyType ret;
List params = new ArrayList<>();
if(t.getParaList() != null && t.getParaList().size() > 0){
for(RefTypeOrTPHOrWildcardOrGeneric pT : t.getParaList()){
- params.add(UnifyTypeFactory.convert(pT));
+ params.add(UnifyTypeFactory.convert(pT, false));
}
}
ret = FunNType.getFunNType(new TypeParams(params));
return ret;
}
- public static UnifyType convert(TypePlaceholder tph){
+ public static UnifyType convert(TypePlaceholder tph, Boolean innerType){
+ if (tph.getName().equals("AFR")) {
+ System.out.println("XXX"+innerType);
+ }
PlaceholderType ntph = new PlaceholderType(tph.getName());
int in = PLACEHOLDERS.indexOf(ntph);
if (in == -1) {
PLACEHOLDERS.add(ntph);
+ ntph.setInnerType(innerType);
return ntph;
}
else {
- return PLACEHOLDERS.get(in);
+ PlaceholderType oldpht = PLACEHOLDERS.get(in);
+ oldpht.setInnerType(oldpht.isInnerType() || innerType);
+ return oldpht;
}
}
- public static UnifyType convert(GenericRefType t){
+ public static UnifyType convert(GenericRefType t, Boolean innerType){
return new ReferenceType(t.getParsedName());
}
- public static UnifyType convert(WildcardType t){
+ public static UnifyType convert(WildcardType t, Boolean innerType){
if(t.isExtends())
- return new ExtendsType(UnifyTypeFactory.convert(t.getInnerType()));
+ return new ExtendsType(UnifyTypeFactory.convert(t.getInnerType(), false));
else if(t.isSuper())
- return new SuperType(UnifyTypeFactory.convert(t.getInnerType()));
+ return new SuperType(UnifyTypeFactory.convert(t.getInnerType(), false));
else throw new NotImplementedException();
}
@@ -152,22 +160,42 @@ public class UnifyTypeFactory {
}
public static UnifyPair convert(Pair p) {
+ UnifyPair ret = null;
if(p.GetOperator().equals(PairOperator.SMALLERDOT)) {
- UnifyPair ret = generateSmallerDotPair(UnifyTypeFactory.convert(p.TA1)
- , UnifyTypeFactory.convert(p.TA2));
- return ret;
+ ret = generateSmallerDotPair(UnifyTypeFactory.convert(p.TA1, false)
+ , UnifyTypeFactory.convert(p.TA2, false));
+ //return ret;
}else if(p.GetOperator().equals(PairOperator.SMALLERNEQDOT)) {
- UnifyPair ret = generateSmallNotEqualDotPair(UnifyTypeFactory.convert(p.TA1)
- , UnifyTypeFactory.convert(p.TA2));
- return ret;
+ ret = generateSmallNotEqualDotPair(UnifyTypeFactory.convert(p.TA1, false)
+ , UnifyTypeFactory.convert(p.TA2, false));
+ //return ret;
}else if(p.GetOperator().equals(PairOperator.EQUALSDOT)) {
- UnifyPair ret = generateEqualDotPair(UnifyTypeFactory.convert(p.TA1)
- , UnifyTypeFactory.convert(p.TA2));
- return ret;
+ ret = generateEqualDotPair(UnifyTypeFactory.convert(p.TA1, false)
+ , UnifyTypeFactory.convert(p.TA2, false));
+ //return ret;
}else if(p.GetOperator().equals(PairOperator.SMALLER)){
- return generateSmallerPair(UnifyTypeFactory.convert(p.TA1),
- UnifyTypeFactory.convert(p.TA2));
+ ret = generateSmallerPair(UnifyTypeFactory.convert(p.TA1, false),
+ UnifyTypeFactory.convert(p.TA2, false));
}else throw new NotImplementedException();
+ UnifyType lhs, rhs;
+ if (((lhs = ret.getLhsType()) instanceof PlaceholderType)
+ && ((PlaceholderType)lhs).isWildcardable()
+ && (rhs = ret.getLhsType()) instanceof PlaceholderType) {
+ if (lhs.getName().equals("AQ")) {
+ System.out.println("");
+ }
+ ((PlaceholderType)rhs).enableWildcardtable();
+ }
+
+ if (((rhs = ret.getLhsType()) instanceof PlaceholderType)
+ && ((PlaceholderType)rhs).isWildcardable()
+ && (lhs = ret.getLhsType()) instanceof PlaceholderType) {
+ if (rhs.getName().equals("AQ")) {
+ System.out.println("");
+ }
+ ((PlaceholderType)lhs).enableWildcardtable();
+ }
+ return ret;
}
/**
diff --git a/src/main/java/de/dhbwstuttgart/typeinference/constraints/ConstraintSet.java b/src/main/java/de/dhbwstuttgart/typeinference/constraints/ConstraintSet.java
index 01356fe9..581f9fbd 100644
--- a/src/main/java/de/dhbwstuttgart/typeinference/constraints/ConstraintSet.java
+++ b/src/main/java/de/dhbwstuttgart/typeinference/constraints/ConstraintSet.java
@@ -1,6 +1,7 @@
package de.dhbwstuttgart.typeinference.constraints;
+import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder;
import de.dhbwstuttgart.typeinference.unify.GuavaSetOperations;
import de.dhbwstuttgart.typeinference.unify.model.UnifyPair;
diff --git a/src/main/java/de/dhbwstuttgart/typeinference/constraints/Pair.java b/src/main/java/de/dhbwstuttgart/typeinference/constraints/Pair.java
index 98679f7d..0c8ad7a5 100644
--- a/src/main/java/de/dhbwstuttgart/typeinference/constraints/Pair.java
+++ b/src/main/java/de/dhbwstuttgart/typeinference/constraints/Pair.java
@@ -1,7 +1,10 @@
package de.dhbwstuttgart.typeinference.constraints;
import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Map;
import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric;
+import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder;
import de.dhbwstuttgart.typeinference.unify.model.PairOperator;
@@ -110,5 +113,20 @@ public class Pair implements Serializable
public boolean OperatorSmallerDot() {
return eOperator == PairOperator.SMALLERDOT;
}
+
+
+ static public Map generateTPHMap(ConstraintSet constraints) {
+ HashMap ret = new HashMap<>();
+ constraints.map((Pair p) -> {
+ if (p.TA1 instanceof TypePlaceholder) {
+ ret.put(((TypePlaceholder) p.TA1).getName(), (TypePlaceholder) p.TA1);
+ }
+ if (p.TA2 instanceof TypePlaceholder) {
+ ret.put(((TypePlaceholder) p.TA2).getName(), (TypePlaceholder) p.TA2);
+ }
+ return null;
+ });
+ return ret;
+ }
}
// ino.end
diff --git a/src/main/java/de/dhbwstuttgart/typeinference/unify/RuleSet.java b/src/main/java/de/dhbwstuttgart/typeinference/unify/RuleSet.java
index d4e6b551..e333bdfe 100644
--- a/src/main/java/de/dhbwstuttgart/typeinference/unify/RuleSet.java
+++ b/src/main/java/de/dhbwstuttgart/typeinference/unify/RuleSet.java
@@ -28,6 +28,7 @@ import de.dhbwstuttgart.typeinference.unify.distributeVariance;
import java.io.FileWriter;
import java.io.IOException;
+import java.io.Writer;
/**
* Implementation of the type inference rules.
@@ -36,13 +37,13 @@ import java.io.IOException;
*/
public class RuleSet implements IRuleSet{
- FileWriter logFile;
+ Writer logFile;
public RuleSet() {
super();
}
- RuleSet(FileWriter logFile) {
+ RuleSet(Writer logFile) {
this.logFile = logFile;
}
@@ -319,13 +320,21 @@ public class RuleSet implements IRuleSet{
UnifyType lhsType = pair.getLhsType();
ReferenceType lhsSType;
+ UnifyType rhsType = pair.getRhsType();
+ ReferenceType rhsSType;
- if(lhsType instanceof ReferenceType)
+ if ((lhsType instanceof ReferenceType) && (rhsType instanceof ReferenceType)) {
lhsSType = (ReferenceType) lhsType;
- else if(lhsType instanceof WildcardType) {
+ rhsSType = (ReferenceType) rhsType;
+ }
+ else if (((lhsType instanceof ExtendsType) && (rhsType instanceof ExtendsType))
+ || ((lhsType instanceof SuperType) && (rhsType instanceof SuperType))) {
UnifyType lhsSTypeRaw = ((WildcardType) lhsType).getWildcardedType();
- if(lhsSTypeRaw instanceof ReferenceType)
+ UnifyType rhsSTypeRaw = ((WildcardType) rhsType).getWildcardedType();
+ if ((lhsSTypeRaw instanceof ReferenceType) && (rhsSTypeRaw instanceof ReferenceType)) {
lhsSType = (ReferenceType) lhsSTypeRaw;
+ rhsSType = (ReferenceType) rhsSTypeRaw;
+ }
else
return Optional.empty();
}
@@ -334,7 +343,8 @@ public class RuleSet implements IRuleSet{
if(lhsSType.getTypeParams().empty())
return Optional.empty();
-
+
+ /* PL 2018-01-22 in obere Teil integriert
UnifyType rhsType = pair.getRhsType();
ReferenceType rhsSType;
@@ -349,6 +359,7 @@ public class RuleSet implements IRuleSet{
}
else
return Optional.empty();
+ */
if(!rhsSType.getName().equals(lhsSType.getName()))
return Optional.empty();
diff --git a/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnify.java b/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnify.java
index fa190cb7..974581a9 100644
--- a/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnify.java
+++ b/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnify.java
@@ -1,25 +1,54 @@
package de.dhbwstuttgart.typeinference.unify;
import java.io.FileWriter;
+import java.io.Writer;
+import java.util.List;
import java.util.Set;
import java.util.concurrent.ForkJoinPool;
+import de.dhbwstuttgart.typeinference.constraints.Constraint;
+import de.dhbwstuttgart.typeinference.constraints.ConstraintSet;
+import de.dhbwstuttgart.typeinference.constraints.Pair;
import de.dhbwstuttgart.typeinference.unify.interfaces.IFiniteClosure;
+import de.dhbwstuttgart.typeinference.unify.model.FiniteClosure;
import de.dhbwstuttgart.typeinference.unify.model.UnifyPair;
public class TypeUnify {
- public Set> unify(Set eq, IFiniteClosure fc, FileWriter logFile, Boolean log) {
- TypeUnifyTask unifyTask = new TypeUnifyTask(eq, fc, true, logFile, log);
+ public Set> unify(Set undConstrains, List>> oderConstraints, IFiniteClosure fc, Writer logFile, Boolean log, ConstraintSet cons) {
+ TypeUnifyTask unifyTask = new TypeUnifyTask(undConstrains, oderConstraints, fc, true, logFile, log, 0, new UnifyResultModel(), cons);
ForkJoinPool pool = new ForkJoinPool();
pool.invoke(unifyTask);
Set> res = unifyTask.join();
return res;
}
+ public UnifyResultModel unifyAsync(Set undConstrains, List>> oderConstraints, IFiniteClosure fc, Writer logFile, Boolean log, ConstraintSet cons, UnifyResultModel ret) {
+ TypeUnifyTask unifyTask = new TypeUnifyTask(undConstrains, oderConstraints, fc, true, logFile, log, 0, ret, cons);
+ ForkJoinPool pool = new ForkJoinPool();
+ pool.invoke(unifyTask);
+ return ret;
+ }
+
+ public UnifyResultModel unifyParallel(Set undConstrains, List>> oderConstraints, IFiniteClosure fc, Writer logFile, Boolean log, ConstraintSet cons, UnifyResultModel ret) {
+ TypeUnifyTask unifyTask = new TypeUnifyTask(undConstrains, oderConstraints, fc, true, logFile, log, 0, ret, cons);
+ ForkJoinPool pool = new ForkJoinPool();
+ pool.invoke(unifyTask);
+ Set> res = unifyTask.join();
+ return ret;
+ }
+
+ /*
public Set> unifySequential(Set eq, IFiniteClosure fc, FileWriter logFile, Boolean log) {
TypeUnifyTask unifyTask = new TypeUnifyTask(eq, fc, false, logFile, log);
Set> res = unifyTask.compute();
return res;
}
+ */
+
+ public Set> unifyOderConstraints(Set undConstrains, List>> oderConstraints, IFiniteClosure fc, FileWriter logFile, Boolean log, ConstraintSet cons) {
+ TypeUnifyTask unifyTask = new TypeUnifyTask(undConstrains, oderConstraints, fc, false, logFile, log, 0, new UnifyResultModel(), cons);
+ Set> res = unifyTask.compute();
+ return res;
+ }
}
diff --git a/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnify2Task.java b/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnify2Task.java
new file mode 100644
index 00000000..ac6f04bb
--- /dev/null
+++ b/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnify2Task.java
@@ -0,0 +1,38 @@
+package de.dhbwstuttgart.typeinference.unify;
+
+import java.io.FileWriter;
+import java.io.Writer;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import de.dhbwstuttgart.typeinference.constraints.Constraint;
+import de.dhbwstuttgart.typeinference.constraints.ConstraintSet;
+import de.dhbwstuttgart.typeinference.constraints.Pair;
+import de.dhbwstuttgart.typeinference.unify.interfaces.IFiniteClosure;
+import de.dhbwstuttgart.typeinference.unify.model.UnifyPair;
+
+public class TypeUnify2Task extends TypeUnifyTask {
+
+ Set> setToFlatten;
+
+ public TypeUnify2Task(Set