From 7f2d64e73bd91c9c37e608108d2afdcd1262c7ef Mon Sep 17 00:00:00 2001 From: JanUlrich Date: Wed, 11 Mar 2015 12:39:08 +0100 Subject: [PATCH] =?UTF-8?q?=C3=84nderung=20an=20der=20Constraint=20Erstell?= =?UTF-8?q?ung=20f=C3=BCr=20LambdaExpressions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/documentation.md | 11 ++++++++ .../statement/LambdaExpression.java | 27 +++++++------------ 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/doc/documentation.md b/doc/documentation.md index 74c5add5..1609c390 100644 --- a/doc/documentation.md +++ b/doc/documentation.md @@ -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) * 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: 1. Parsen diff --git a/src/de/dhbwstuttgart/syntaxtree/statement/LambdaExpression.java b/src/de/dhbwstuttgart/syntaxtree/statement/LambdaExpression.java index 57af4a02..132fa399 100755 --- a/src/de/dhbwstuttgart/syntaxtree/statement/LambdaExpression.java +++ b/src/de/dhbwstuttgart/syntaxtree/statement/LambdaExpression.java @@ -152,27 +152,20 @@ public class LambdaExpression extends Expr{ //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 - //TODO: OderConstraint erstellen mit normalem Typ und ? extemds/super Type - //Die Typen innerhalb von FunN anpassen: - Vector superParamTypes = new Vector<>(); + //Die Constraints für ParameterTypen und Ret Typ erstellen: + Vector tphParamTypes = new Vector<>(); for(Type pT : paramTypes){ - if(pT instanceof ObjectType){ - superParamTypes.add(new SuperWildcardType(pT.getOffset(), (ObjectType) pT)); - }else{ //pT ist weder Void noch ein ObjectType (TPH, GTV, RefType) - superParamTypes.add(pT); - } + TypePlaceholder tph = TypePlaceholder.fresh(this); + tphParamTypes.add(tph); + // PN < TPH PN + ret.add(new SingleConstraint(tph.TYPE(assumptions, this), pT.TYPE(assumptions, this))); } Type retType = method_body.getType(); - Type extRetType = retType; - if(!(retType instanceof de.dhbwstuttgart.syntaxtree.type.Void)){ - if(retType instanceof ObjectType){ - extRetType = new ExtendsWildcardType(retType.getOffset(), (ObjectType) retType); - }else{ //retType ist weder Void noch ein ObjectType (TPH, GTV, RefType) - extRetType = retType; - } - } + Type tphRetType = TypePlaceholder.fresh(this); + // PN < TPH PN + ret.add(new SingleConstraint(retType.TYPE(assumptions, this), tphRetType.TYPE(assumptions, this))); - 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; }