forked from JavaTX/JavaCompilerCore
TYPE erstellt bei LambdaExpression nun zwei constraints, falls die Parameter/RetType nicht vom Typ ? extends sind. Dann werden die Constraints einmal mit dem eigentlichen Typ T und einem ? extends/super T -Typ generiert
This commit is contained in:
parent
c53eff4f2c
commit
2c6bce344d
@ -22,9 +22,11 @@ import de.dhbwstuttgart.syntaxtree.type.RefType;
|
|||||||
import de.dhbwstuttgart.syntaxtree.type.SuperWildcardType;
|
import de.dhbwstuttgart.syntaxtree.type.SuperWildcardType;
|
||||||
import de.dhbwstuttgart.syntaxtree.type.Type;
|
import de.dhbwstuttgart.syntaxtree.type.Type;
|
||||||
import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder;
|
import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.type.WildcardType;
|
||||||
import de.dhbwstuttgart.typeinference.ConstraintsSet;
|
import de.dhbwstuttgart.typeinference.ConstraintsSet;
|
||||||
import de.dhbwstuttgart.typeinference.FunN;
|
import de.dhbwstuttgart.typeinference.FunN;
|
||||||
import de.dhbwstuttgart.typeinference.JavaCodeResult;
|
import de.dhbwstuttgart.typeinference.JavaCodeResult;
|
||||||
|
import de.dhbwstuttgart.typeinference.OderConstraint;
|
||||||
import de.dhbwstuttgart.typeinference.ResultSet;
|
import de.dhbwstuttgart.typeinference.ResultSet;
|
||||||
import de.dhbwstuttgart.typeinference.SingleConstraint;
|
import de.dhbwstuttgart.typeinference.SingleConstraint;
|
||||||
import de.dhbwstuttgart.typeinference.Typeable;
|
import de.dhbwstuttgart.typeinference.Typeable;
|
||||||
@ -158,12 +160,32 @@ public class LambdaExpression extends Expr{
|
|||||||
TypePlaceholder tph = TypePlaceholder.fresh(this);
|
TypePlaceholder tph = TypePlaceholder.fresh(this);
|
||||||
tphParamTypes.add(tph);
|
tphParamTypes.add(tph);
|
||||||
// PN < TPH PN
|
// PN < TPH PN
|
||||||
|
if(pT instanceof WildcardType){
|
||||||
ret.add(new SingleConstraint(tph.TYPE(assumptions, this), pT.TYPE(assumptions, this)));
|
ret.add(new SingleConstraint(tph.TYPE(assumptions, this), pT.TYPE(assumptions, this)));
|
||||||
|
}else{
|
||||||
|
OderConstraint orCons = new OderConstraint();
|
||||||
|
SuperWildcardType superpT = new SuperWildcardType(pT.getOffset(), (ObjectType) pT);
|
||||||
|
SingleConstraint cons1 = new SingleConstraint(tph.TYPE(assumptions, this), superpT.TYPE(assumptions, this));
|
||||||
|
SingleConstraint cons2 = new SingleConstraint(tph.TYPE(assumptions, this), pT.TYPE(assumptions, this));
|
||||||
|
orCons.addConstraint(cons1);
|
||||||
|
orCons.addConstraint(cons2);
|
||||||
|
ret.add(orCons);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Type retType = method_body.getType();
|
Type retType = method_body.getType();
|
||||||
Type tphRetType = TypePlaceholder.fresh(this);
|
Type tphRetType = TypePlaceholder.fresh(this);
|
||||||
// PN < TPH PN
|
// PN < TPH PN
|
||||||
|
if(retType instanceof WildcardType){
|
||||||
ret.add(new SingleConstraint(retType.TYPE(assumptions, this), tphRetType.TYPE(assumptions, this)));
|
ret.add(new SingleConstraint(retType.TYPE(assumptions, this), tphRetType.TYPE(assumptions, this)));
|
||||||
|
}else{
|
||||||
|
OderConstraint orCons = new OderConstraint();
|
||||||
|
SuperWildcardType superretType = new SuperWildcardType(retType.getOffset(), (ObjectType) retType);
|
||||||
|
SingleConstraint cons1 = new SingleConstraint(tphRetType.TYPE(assumptions, this), superretType.TYPE(assumptions, this));
|
||||||
|
SingleConstraint cons2 = new SingleConstraint(tphRetType.TYPE(assumptions, this), retType.TYPE(assumptions, this));
|
||||||
|
orCons.addConstraint(cons1);
|
||||||
|
orCons.addConstraint(cons2);
|
||||||
|
ret.add(orCons);
|
||||||
|
}
|
||||||
|
|
||||||
ret.add(new SingleConstraint(new FunN(tphRetType, tphParamTypes).TYPE(assumptions, this),this.getType().TYPE(assumptions, this)));
|
ret.add(new SingleConstraint(new FunN(tphRetType, tphParamTypes).TYPE(assumptions, this),this.getType().TYPE(assumptions, this)));
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
class BoundedGenericTest<A extends String>{
|
class BoundedGenericTest{
|
||||||
var = "test";
|
var = "test";
|
||||||
<B extends A> B methode(){
|
methode(){
|
||||||
return var;
|
return var;
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user