Änderung an der Constraint Erstellung für LambdaExpressions
This commit is contained in:
parent
3b258c3880
commit
7f2d64e73b
@ -40,6 +40,17 @@ Die einzusetzenden Generischen Variablen werden erst beim Einsetzen eines Typs g
|
|||||||
* 5. Alle Unbekannten TPHs herausfiltern (von den Pairs nur TA2)
|
* 5. Alle Unbekannten TPHs herausfiltern (von den Pairs nur TA2)
|
||||||
* 6. Alle unbekannten TPHs + Pairs als GenericTypeInsertPoint deklarieren.
|
* 6. Alle unbekannten TPHs + Pairs als GenericTypeInsertPoint deklarieren.
|
||||||
|
|
||||||
|
## Lambda Ausdrücke und FunN
|
||||||
|
### Erstellen der Typconstraints für einen Lambda Ausdruck
|
||||||
|
* Return-Type des Lambda Ausdrucks: retT
|
||||||
|
* Parameter Typen: pT1 ... pTN
|
||||||
|
* Für jeden Typ einen TPH generieren
|
||||||
|
* für Return Typ: TPH R
|
||||||
|
* für Parameter Typen: TPH P1 ... TPH PN
|
||||||
|
* Es gilt:
|
||||||
|
* TPH R < retT
|
||||||
|
* pTN < TPH PN
|
||||||
|
|
||||||
## Ablauf Typinferenz:
|
## Ablauf Typinferenz:
|
||||||
|
|
||||||
1. Parsen
|
1. Parsen
|
||||||
|
@ -152,27 +152,20 @@ public class LambdaExpression extends Expr{
|
|||||||
//ArgumentAssumptions + assumptions ergeben die Assumptions für die Statements innerhalb des Lambda-Bodys:
|
//ArgumentAssumptions + assumptions ergeben die Assumptions für die Statements innerhalb des Lambda-Bodys:
|
||||||
ret.add(method_body.TYPEStmt(ArgumentAssumptions.add(assumptions))); //Es gibt die LambdaExpression nur mit einem Block als Method Body, nicht mit einer einzelnen Expression
|
ret.add(method_body.TYPEStmt(ArgumentAssumptions.add(assumptions))); //Es gibt die LambdaExpression nur mit einem Block als Method Body, nicht mit einer einzelnen Expression
|
||||||
|
|
||||||
//TODO: OderConstraint erstellen mit normalem Typ und ? extemds/super Type
|
//Die Constraints für ParameterTypen und Ret Typ erstellen:
|
||||||
//Die Typen innerhalb von FunN anpassen:
|
Vector<Type> tphParamTypes = new Vector<>();
|
||||||
Vector<Type> superParamTypes = new Vector<>();
|
|
||||||
for(Type pT : paramTypes){
|
for(Type pT : paramTypes){
|
||||||
if(pT instanceof ObjectType){
|
TypePlaceholder tph = TypePlaceholder.fresh(this);
|
||||||
superParamTypes.add(new SuperWildcardType(pT.getOffset(), (ObjectType) pT));
|
tphParamTypes.add(tph);
|
||||||
}else{ //pT ist weder Void noch ein ObjectType (TPH, GTV, RefType)
|
// PN < TPH PN
|
||||||
superParamTypes.add(pT);
|
ret.add(new SingleConstraint(tph.TYPE(assumptions, this), pT.TYPE(assumptions, this)));
|
||||||
}
|
|
||||||
}
|
}
|
||||||
Type retType = method_body.getType();
|
Type retType = method_body.getType();
|
||||||
Type extRetType = retType;
|
Type tphRetType = TypePlaceholder.fresh(this);
|
||||||
if(!(retType instanceof de.dhbwstuttgart.syntaxtree.type.Void)){
|
// PN < TPH PN
|
||||||
if(retType instanceof ObjectType){
|
ret.add(new SingleConstraint(retType.TYPE(assumptions, this), tphRetType.TYPE(assumptions, this)));
|
||||||
extRetType = new ExtendsWildcardType(retType.getOffset(), (ObjectType) retType);
|
|
||||||
}else{ //retType ist weder Void noch ein ObjectType (TPH, GTV, RefType)
|
|
||||||
extRetType = retType;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ret.add(new SingleConstraint(new FunN(extRetType, superParamTypes).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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user