diff --git a/javatx-src/main/java/de/dhbwstuttgart/typeinference/assumptions/TypeInferenceBlockInformation.jav b/javatx-src/main/java/de/dhbwstuttgart/typeinference/assumptions/TypeInferenceBlockInformation.java similarity index 90% rename from javatx-src/main/java/de/dhbwstuttgart/typeinference/assumptions/TypeInferenceBlockInformation.jav rename to javatx-src/main/java/de/dhbwstuttgart/typeinference/assumptions/TypeInferenceBlockInformation.java index 0972e76..3e0f0fe 100644 --- a/javatx-src/main/java/de/dhbwstuttgart/typeinference/assumptions/TypeInferenceBlockInformation.jav +++ b/javatx-src/main/java/de/dhbwstuttgart/typeinference/assumptions/TypeInferenceBlockInformation.java @@ -9,7 +9,11 @@ import de.dhbwstuttgart.syntaxtree.GenericTypeVar; import de.dhbwstuttgart.syntaxtree.Method; import de.dhbwstuttgart.syntaxtree.TypeScope; import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric; -import de.dhbwstuttgart.assumptions.TypeInferenceInformation; + +import java.lang.System; +import java.io.PrintStream; +import de.dhbwstuttgart.typeinference.assumptions.TypeInferenceInformation; +import de.dhbwstuttgart.typeinference.assumptions.TypeScopeContainer; import java.util.ArrayList; import java.util.Collection; diff --git a/javatx-src/main/java/de/dhbwstuttgart/typeinference/constraints/Constraint.jav-back b/javatx-src/main/java/de/dhbwstuttgart/typeinference/constraints/Constraint.jav-back new file mode 100644 index 0000000..83f4fe8 --- /dev/null +++ b/javatx-src/main/java/de/dhbwstuttgart/typeinference/constraints/Constraint.jav-back @@ -0,0 +1,81 @@ +package de.dhbwstuttgart.typeinference.constraints; + +import de.dhbwstuttgart.typeinference.unify.model.UnifyPair; + +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; + +import java.lang.String; +import java.lang.Boolean; +import java.lang.Long; + +public class Constraint extends HashSet { + private static final Long serialVersionUID = 1L; + private Boolean isInherited = false;//wird beides nur für die Method-Constraints benoetigt + private Boolean isImplemented = false; + + /* + * wird verwendet um bei der Codegenerierung die richtige Methoden - Signatur + * auszuwaehlen + */ + /*private*/ Set methodSignatureConstraint = new HashSet<>(); + + private Constraint extendConstraint = null; + + public Constraint() { + super(); + } + + public Constraint( isInherited, isImplemented) { + this.isInherited = isInherited; + this.isImplemented = isImplemented; + } + + public Constraint(isInherited, isImplemented, extendConstraint, methodSignatureConstraint) { + this.isInherited = isInherited; + this.isImplemented = isImplemented; + this.extendConstraint = extendConstraint; + this.methodSignatureConstraint = methodSignatureConstraint; + } + + public setIsInherited(isInherited) { + this.isInherited = isInherited; + } + + public isInherited() { + return isInherited; + } + + public isImplemented() { + return isImplemented; + } + + public getExtendConstraint() { + return extendConstraint; + } + + public setExtendConstraint(c) { + extendConstraint = c; + } + + public getmethodSignatureConstraint() { + return methodSignatureConstraint; + } + + public setmethodSignatureConstraint(c) { + methodSignatureConstraint = c; + } + + public toString() { + return super.toString() + "\nisInherited = " + isInherited.toString() + " isOveridden = " + isImplemented.toString() + + methodSignatureConstraint.toString() + //" + extendsContraint: " + (extendConstraint != null ? extendConstraint.toStringBase() : "null" ) + + "\n" ; + } + + public toStringBase() { + return super.toString(); + } + +} diff --git a/javatx-src/main/java/de/dhbwstuttgart/typeinference/constraints/ConstraintSet.java b/javatx-src/main/java/de/dhbwstuttgart/typeinference/constraints/ConstraintSet.java index 1482189..be31fa0 100644 --- a/javatx-src/main/java/de/dhbwstuttgart/typeinference/constraints/ConstraintSet.java +++ b/javatx-src/main/java/de/dhbwstuttgart/typeinference/constraints/ConstraintSet.java @@ -31,7 +31,7 @@ public class ConstraintSet { this.oderConstraints.addAll(allOderConstraints); } - public void addAll(ConstraintSet constraints) { + public void addAll(ConstraintSet constraints) { this.addAllUndConstraint(constraints.undConstraints); this.addAllOderConstraint(constraints.oderConstraints); } diff --git a/javatx-src/main/java/de/dhbwstuttgart/typeinference/constraints/Pair.jav-back b/javatx-src/main/java/de/dhbwstuttgart/typeinference/constraints/Pair.jav-back new file mode 100644 index 0000000..c8f12a6 --- /dev/null +++ b/javatx-src/main/java/de/dhbwstuttgart/typeinference/constraints/Pair.jav-back @@ -0,0 +1,161 @@ +package de.dhbwstuttgart.typeinference.constraints; +import java.io.Serializable; +import java.util.HashMap; +import java.util.Map; + +import de.dhbwstuttgart.parser.NullToken; +import de.dhbwstuttgart.parser.SourceLoc; +import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric; +import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder; +import de.dhbwstuttgart.typeinference.unify.model.PairOperator; +import org.antlr.v4.runtime.Token; + +import java.lang.String; +import java.lang.Boolean; +import java.lang.NullPointerException; +import java.lang.Object; +import java.lang.Integer; +import de.dhbwstuttgart.typeinference.constraints.ConstraintSet; + +public class Pair implements Serializable +{ + public final RefTypeOrTPHOrWildcardOrGeneric TA1; + public final RefTypeOrTPHOrWildcardOrGeneric TA2; + + private SourceLoc location; + + private PairOperator eOperator = PairOperator.SMALLER; + private Boolean noUnification = false; + + + private Pair(RefTypeOrTPHOrWildcardOrGeneric TA1, RefTypeOrTPHOrWildcardOrGeneric TA2 ) + { + this.TA1 = TA1; + this.TA2 = TA2; + if(TA1 == null || TA2 == null) + throw new NullPointerException(); + eOperator = PairOperator.SMALLER; + } + + public Pair(RefTypeOrTPHOrWildcardOrGeneric TA1, RefTypeOrTPHOrWildcardOrGeneric TA2, PairOperator eOp) + { + // Konstruktor + this(TA1,TA2); + this.eOperator = eOp; + } + + public Pair(RefTypeOrTPHOrWildcardOrGeneric TA1, RefTypeOrTPHOrWildcardOrGeneric TA2, PairOperator e0p, SourceLoc location) { + this(TA1, TA2, e0p); + this.location = location; + } + + public Pair(RefTypeOrTPHOrWildcardOrGeneric TA1, RefTypeOrTPHOrWildcardOrGeneric TA2, PairOperator eOp, Boolean noUnification) + { + // Konstruktor + this(TA1,TA2); + this.eOperator = eOp; + this.noUnification = noUnification; + } + + public SourceLoc getLocation() { + return this.location; + } + + public String toString() + { + // otth: Gibt ein Paar als String aus --> zum Debuggen und Vergleichen + String strElement1 = "NULL"; + String strElement2 = "NULL"; + String Operator = "<."; + + if( TA1 != null ) + strElement1 = TA1.toString(); + + if( TA2 != null ) + strElement2 = TA2.toString(); + + /* PL ausskommentiert 2018-05-24 + if(OperatorEqual()) + Operator = "="; + if(OperatorSmaller()) + Operator = "<."; + if(OperatorSmallerExtends()) + Operator = "Author: J�rg B�uerle + * @param obj + * @return + */ + public boolean equals(Object obj) + { + boolean ret = true; + ret = ret & ((obj instanceof Pair) ? 1 : 0); + if(!ret)return ret; + ret = ret & (((Pair)obj).TA1.equals(this.TA1) ? 1 : 0); + ret = ret & (((Pair)obj).TA2.equals(this.TA2) ? 1 : 0); + return ret; + } + + /** + * Author: Arne Lüdtke
+ * Abfrage, ob Operator vom Typ Equal ist. + */ + public boolean OperatorEqual() + { + return eOperator == PairOperator.EQUALSDOT; + } + + /** + * Author: Arne Lüdtke
+ * Abfrage, ob Operator vom Typ Smaller ist. + */ + public boolean OperatorSmaller() + { + return eOperator == PairOperator.SMALLER; + } + + /** + * Author: Arne Lüdtke
+ * Abfrage, ob Operator vom Typ SmallerExtends ist. + */ + public boolean OperatorSmallerExtends() + { + return eOperator == PairOperator.SMALLERDOTWC; + } + + /** + * Author: Arne Lüdtke
+ * Gibt den Operator zurück. + */ + public PairOperator GetOperator() + { + return eOperator; + } + + 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/javatx-src/main/java/de/dhbwstuttgart/typeinference/typeAlgo/TYPE.jav-back b/javatx-src/main/java/de/dhbwstuttgart/typeinference/typeAlgo/TYPE.jav-back new file mode 100644 index 0000000..2d98221 --- /dev/null +++ b/javatx-src/main/java/de/dhbwstuttgart/typeinference/typeAlgo/TYPE.jav-back @@ -0,0 +1,115 @@ +package de.dhbwstuttgart.typeinference.typeAlgo; + +import de.dhbwstuttgart.exceptions.DebugException; +import de.dhbwstuttgart.parser.scope.JavaClassName; +import de.dhbwstuttgart.syntaxtree.*; +import de.dhbwstuttgart.syntaxtree.factory.ASTFactory; +import de.dhbwstuttgart.syntaxtree.statement.Statement; +import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric; +import de.dhbwstuttgart.typeinference.assumptions.TypeInferenceBlockInformation; +import de.dhbwstuttgart.typeinference.assumptions.TypeInferenceInformation; +import de.dhbwstuttgart.typeinference.constraints.ConstraintSet; + +import de.dhbwstuttgart.util.BiRelation; + +import java.lang.Object; +import java.util.Set; +import java.util.HashSet; +import java.util.Optional; +import java.util.Collection; +import java.util.List; +import java.util.AbstractSet; + +import de.dhbwstuttgart.syntaxtree.SourceFile; +import de.dhbwstuttgart.syntaxtree.ClassOrInterface; +import de.dhbwstuttgart.syntaxtree.Method; +import de.dhbwstuttgart.syntaxtree.Constructor; +import de.dhbwstuttgart.syntaxtree.statement.Block; +import de.dhbwstuttgart.syntaxtree.statement.Statement; +import de.dhbwstuttgart.syntaxtree.ASTVisitor; +import de.dhbwstuttgart.syntaxtree.StatementVisitor; +import de.dhbwstuttgart.syntaxtree.statement.Statement; +import de.dhbwstuttgart.typeinference.result.ResultSetVisitor; + +import de.dhbwstuttgart.typeinference.typeAlgo.TYPEStmt; + +public class TYPE { + + private final SourceFile sf; + private final Set allAvailableClasses; + + public TYPE(sf, allAvailableClasses){ + this.sf = sf; + this.allAvailableClasses = allAvailableClasses; + } + + public getConstraints() { + var ret = new ConstraintSet<>(); + for ( cl : sf.KlassenVektor) { + var allClasses = new HashSet<>(); + allClasses.addAll(allAvailableClasses); + allClasses.addAll(sf.availableClasses); + ret.addAll(getConstraintsClass(cl, new TypeInferenceInformation(allClasses))); + } + return ret; + } + + private getConstraintsClass(cl, info) { + var ret = new ConstraintSet<>(); + var methConstrains; + for(m : cl.getMethods()){ + methConstrains = getConstraintsMethod(m, info, cl); + ret.addAll(methConstrains); + m.constraints.addAll(methConstrains); + } + for(m : cl.getConstructors()){ + ret.addAll(getConstraintsConstructor(m,info, cl)); + } + if (cl.getfieldInitializations().isPresent()) { + ret.addAll(getConstraintsConstructor(cl.getfieldInitializations().get(), info, cl)); + } + if (cl.getStaticInitializer().isPresent()) { + ret.addAll(getConstraintsMethod(cl.getStaticInitializer().get(), info, cl)); + } + + return ret; + } + /* + TODO: Hier eine Information erstellen nur mit den importierte Klassen einer einzigen SourceFile + private TypeInferenceInformation getTypeInferenceInformation(sourceFile) { + DirectoryClassLoader classLoader = DirectoryClassLoader.getSystemClassLoader(); + Set classes = new HashSet<>(); + + for(SourceFile sourceFile : sfs){ + for(JavaClassName importName : sourceFile.imports){ + System.out.println(importName); + try { + classes.add(ASTFactory.createClass(classLoader.loadClass(importName.toString()))); + } catch (ClassNotFoundException e) { + throw new DebugException("Klasse " + importName + " konnte nicht geladen werden"); + } + } + classes.addAll(sourceFile.KlassenVektor); + } + + return new TypeInferenceInformation(classes); + } + */ + + private getConstraintsMethod(m, info, currentClass) { + if(m.block == null)return new ConstraintSet<>(); //Abstrakte Methoden generieren keine Constraints + var blockInfo = new TypeInferenceBlockInformation(info.getAvailableClasses(), currentClass, m); + var methodScope = new TYPEStmt(blockInfo); + m.block.accept(methodScope); + return methodScope.getConstraints(); + } + + private getConstraintsConstructor(m, info, currentClass) { + var blockInfo = new TypeInferenceBlockInformation(info.getAvailableClasses(), currentClass, m); + var methodScope = new TYPEStmt(blockInfo); + //for(Statement stmt : m.fieldInitializations)stmt.accept(methodScope); + var ret = this.getConstraintsMethod(m, info, currentClass); + ret.addAll(methodScope.getConstraints()); + return ret; + } +} \ No newline at end of file diff --git a/javatx-src/main/java/de/dhbwstuttgart/typeinference/typeAlgo/TYPE.java b/javatx-src/main/java/de/dhbwstuttgart/typeinference/typeAlgo/TYPE.java index 8da1624..c763cfe 100644 --- a/javatx-src/main/java/de/dhbwstuttgart/typeinference/typeAlgo/TYPE.java +++ b/javatx-src/main/java/de/dhbwstuttgart/typeinference/typeAlgo/TYPE.java @@ -9,29 +9,9 @@ import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric; import de.dhbwstuttgart.typeinference.assumptions.TypeInferenceBlockInformation; import de.dhbwstuttgart.typeinference.assumptions.TypeInferenceInformation; import de.dhbwstuttgart.typeinference.constraints.ConstraintSet; - import de.dhbwstuttgart.util.BiRelation; -import java.lang.Object; -import java.util.Set; -import java.util.HashSet; -import java.util.Optional; -import java.util.Collection; -import java.util.List; -import java.util.AbstractSet; - -import de.dhbwstuttgart.syntaxtree.SourceFile; -import de.dhbwstuttgart.syntaxtree.ClassOrInterface; -import de.dhbwstuttgart.syntaxtree.Method; -import de.dhbwstuttgart.syntaxtree.Constructor; -import de.dhbwstuttgart.syntaxtree.statement.Block; -import de.dhbwstuttgart.syntaxtree.statement.Statement; -import de.dhbwstuttgart.syntaxtree.ASTVisitor; -import de.dhbwstuttgart.syntaxtree.StatementVisitor; -import de.dhbwstuttgart.syntaxtree.statement.Statement; -import de.dhbwstuttgart.typeinference.result.ResultSetVisitor; - -import de.dhbwstuttgart.typeinference.typeAlgo.TYPEStmt; +import java.util.*; public class TYPE { @@ -111,4 +91,4 @@ public class TYPE { ret.addAll(methodScope.getConstraints()); return ret; } -} \ No newline at end of file +} diff --git a/javatx-src/main/java/de/dhbwstuttgart/typeinference/typeAlgo/TYPEStmt.java b/javatx-src/main/java/de/dhbwstuttgart/typeinference/typeAlgo/TYPEStmt.java index be402d0..5ede3c3 100644 --- a/javatx-src/main/java/de/dhbwstuttgart/typeinference/typeAlgo/TYPEStmt.java +++ b/javatx-src/main/java/de/dhbwstuttgart/typeinference/typeAlgo/TYPEStmt.java @@ -2,7 +2,12 @@ package de.dhbwstuttgart.typeinference.typeAlgo; import java.sql.Ref; -import java.util.*; +import java.util.List; +import java.util.Set; +import java.util.HashSet; +import java.util.Stack; +import java.util.Arrays; +import java.util.ArrayList; import java.util.stream.Collectors; import de.dhbwstuttgart.exceptions.NotImplementedException; @@ -11,10 +16,59 @@ import de.dhbwstuttgart.parser.NullToken; import de.dhbwstuttgart.parser.SourceLoc; import de.dhbwstuttgart.parser.SyntaxTreeGenerator.AssignToLocal; import de.dhbwstuttgart.parser.scope.JavaClassName; -import de.dhbwstuttgart.syntaxtree.*; + +import de.dhbwstuttgart.syntaxtree.Method; +import de.dhbwstuttgart.syntaxtree.ClassOrInterface; +import de.dhbwstuttgart.syntaxtree.GenericTypeVar; +import de.dhbwstuttgart.syntaxtree.StatementVisitor; +import de.dhbwstuttgart.syntaxtree.TypeScope; +import de.dhbwstuttgart.syntaxtree.Pattern; +import de.dhbwstuttgart.syntaxtree.ParameterList; +import de.dhbwstuttgart.syntaxtree.FormalParameter; + import de.dhbwstuttgart.syntaxtree.factory.ASTFactory; import de.dhbwstuttgart.syntaxtree.factory.NameGenerator; -import de.dhbwstuttgart.syntaxtree.statement.*; + +import de.dhbwstuttgart.syntaxtree.statement.Assign; +import de.dhbwstuttgart.syntaxtree.statement.ArgumentList; +import de.dhbwstuttgart.syntaxtree.statement.LambdaExpression; +import de.dhbwstuttgart.syntaxtree.statement.Switch; +import de.dhbwstuttgart.syntaxtree.statement.Block; +import de.dhbwstuttgart.syntaxtree.statement.Statement; +import de.dhbwstuttgart.syntaxtree.statement.CastExpr; +import de.dhbwstuttgart.syntaxtree.statement.EmptyStmt; +import de.dhbwstuttgart.syntaxtree.statement.FieldVar; +import de.dhbwstuttgart.syntaxtree.statement.ForStmt; +import de.dhbwstuttgart.syntaxtree.statement.ForEachStmt; +import de.dhbwstuttgart.syntaxtree.statement.IfStmt; +import de.dhbwstuttgart.syntaxtree.statement.InstanceOf; +import de.dhbwstuttgart.syntaxtree.statement.LocalVar; +import de.dhbwstuttgart.syntaxtree.statement.LocalVarDecl; +import de.dhbwstuttgart.syntaxtree.statement.MethodCall; +import de.dhbwstuttgart.syntaxtree.statement.NewArray; +import de.dhbwstuttgart.syntaxtree.statement.NewClass; +import de.dhbwstuttgart.syntaxtree.statement.ExpressionReceiver; +import de.dhbwstuttgart.syntaxtree.statement.UnaryExpr; +import de.dhbwstuttgart.syntaxtree.statement.BinaryExpr; +import de.dhbwstuttgart.syntaxtree.statement.Literal; +import de.dhbwstuttgart.syntaxtree.statement.BoolExpression; +import de.dhbwstuttgart.syntaxtree.statement.Return; +import de.dhbwstuttgart.syntaxtree.statement.Throw; +import de.dhbwstuttgart.syntaxtree.statement.Ternary; +import de.dhbwstuttgart.syntaxtree.statement.ReturnVoid; +import de.dhbwstuttgart.syntaxtree.statement.StaticClassName; +import de.dhbwstuttgart.syntaxtree.statement.Break; +import de.dhbwstuttgart.syntaxtree.statement.This; +import de.dhbwstuttgart.syntaxtree.statement.Super; +import de.dhbwstuttgart.syntaxtree.statement.WhileStmt; +import de.dhbwstuttgart.syntaxtree.statement.DoStmt; +import de.dhbwstuttgart.syntaxtree.statement.ThisCall; +import de.dhbwstuttgart.syntaxtree.statement.SuperCall; +import de.dhbwstuttgart.syntaxtree.statement.AssignToField; +import de.dhbwstuttgart.syntaxtree.statement.SwitchBlock; +import de.dhbwstuttgart.syntaxtree.statement.Yield; +import de.dhbwstuttgart.syntaxtree.statement.SwitchLabel; + import de.dhbwstuttgart.syntaxtree.type.ExtendsWildcardType; import de.dhbwstuttgart.syntaxtree.type.GenericRefType; import de.dhbwstuttgart.syntaxtree.type.RefType;