diff --git a/doc/documentation.md b/doc/documentation.md index 958f64056..0b88a6bc0 100644 --- a/doc/documentation.md +++ b/doc/documentation.md @@ -8,10 +8,12 @@ * In folgenden Fällen als TPH: * Die Generische Variable ist nicht in dem Bereich definiert, in dem sie benutzt wird. * Es kann auch vorkommen, dass die Generische Variable in der gleichen Klasse definiert wurde, aber für eine andere Methode gilt. + * In folgenden Fällen als GTV: * Die Generische Variable ist für den Bereich definiert, in dem der Constraint generiert wird. * In der selben Methode oder der selben Klasse. Dies lässt sich überprüfen, indem man die Klasse in welcher die GTV deklariert wurde mit der Klasse in welcher deren Typ benutzt wird vergleicht. - + * Ist die GTV als Klassenparameter definiert und aus der selben Klasse wird darauf zugegriffen. + * Die GTV ist in einer Methode oder FieldDeclaration definiert, aber nicht dem selben wie darauf zugegriffen wird. ## ResultSet diff --git a/src/de/dhbwstuttgart/syntaxtree/Class.java b/src/de/dhbwstuttgart/syntaxtree/Class.java index 8e05b2d39..d0e0b24a9 100755 --- a/src/de/dhbwstuttgart/syntaxtree/Class.java +++ b/src/de/dhbwstuttgart/syntaxtree/Class.java @@ -36,7 +36,7 @@ import de.dhbwstuttgart.typeinference.unify.Unify; // ino.class.Class.23010.declaration -public class Class extends SyntaxTreeNode implements AClassOrInterface, IItemWithOffset, Generic, GenericTypeInsertable +public class Class extends GTVDeclarationContext implements AClassOrInterface, IItemWithOffset, Generic, GenericTypeInsertable // ino.end // ino.class.Class.23010.body { @@ -1298,5 +1298,9 @@ public class Class extends SyntaxTreeNode implements AClassOrInterface, IItemWit public Type getSuperClass(){ return this.superClass; } + @Override + public boolean isClass() { + return true; + } } // ino.end diff --git a/src/de/dhbwstuttgart/syntaxtree/Field.java b/src/de/dhbwstuttgart/syntaxtree/Field.java index 2ba3ce6b9..9b5a375cd 100644 --- a/src/de/dhbwstuttgart/syntaxtree/Field.java +++ b/src/de/dhbwstuttgart/syntaxtree/Field.java @@ -18,7 +18,7 @@ import de.dhbwstuttgart.typeinference.Typeable; import de.dhbwstuttgart.typeinference.assumptions.TypeAssumptions; import de.dhbwstuttgart.typeinference.typedeployment.TypeInsertPoint; -public abstract class Field extends SyntaxTreeNode implements TypeInsertable, Typeable, Generic, GenericTypeInsertable{ +public abstract class Field extends GTVDeclarationContext implements TypeInsertable, Typeable, Generic, GenericTypeInsertable{ protected Vector declid = new Vector(); // Vector, da 'int a, b, c, ...' auch eingeparst werden muss @@ -166,4 +166,8 @@ public abstract class Field extends SyntaxTreeNode implements TypeInsertable, Ty public void setGenericParameter(GenericDeclarationList params) { this.genericParameters = params; } + @Override + public boolean isClass() { + return false; + } } diff --git a/src/de/dhbwstuttgart/syntaxtree/GTVDeclarationContext.java b/src/de/dhbwstuttgart/syntaxtree/GTVDeclarationContext.java new file mode 100644 index 000000000..e2ff91a78 --- /dev/null +++ b/src/de/dhbwstuttgart/syntaxtree/GTVDeclarationContext.java @@ -0,0 +1,15 @@ +package de.dhbwstuttgart.syntaxtree; + +import java.util.Vector; + +/** + * Beischreibt eine SyntaxTreeNode, welcher die Eigenschaft besitzt, + * dass bei seiner Deklaration auch Generische Typvariablen deklariert wurden. + */ +public abstract class GTVDeclarationContext extends SyntaxTreeNode { + @Override + public GTVDeclarationContext getGTVDeclarationContext(){ + return this; + } + public abstract boolean isClass(); +} diff --git a/src/de/dhbwstuttgart/syntaxtree/SyntaxTreeNode.java b/src/de/dhbwstuttgart/syntaxtree/SyntaxTreeNode.java index 3eed701bb..d5e210631 100644 --- a/src/de/dhbwstuttgart/syntaxtree/SyntaxTreeNode.java +++ b/src/de/dhbwstuttgart/syntaxtree/SyntaxTreeNode.java @@ -110,4 +110,20 @@ public abstract class SyntaxTreeNode implements IItemWithOffset{ //TODO: Implementieren. Hier sollte ein Lookup in die Assumptions dieses Knotens erfolgen return false; } + + public SyntaxTreeNode getMatchingParentNode(SyntaxTreeNode inNode) { + SyntaxTreeNode node = inNode; + while(node!=null){ + if(node.equals(this))return this; + node = inNode.getParent(); + } + if(this.getParent()!=null)return this.getParent().getMatchingParentNode(inNode); + return null; + } + + public GTVDeclarationContext getGTVDeclarationContext(){ + if(this.getParent()==null)return null; + return this.getParent().getGTVDeclarationContext(); + } + } diff --git a/src/de/dhbwstuttgart/syntaxtree/type/GenericTypeVar.java b/src/de/dhbwstuttgart/syntaxtree/type/GenericTypeVar.java index 93516ef65..658e75361 100755 --- a/src/de/dhbwstuttgart/syntaxtree/type/GenericTypeVar.java +++ b/src/de/dhbwstuttgart/syntaxtree/type/GenericTypeVar.java @@ -20,6 +20,7 @@ import de.dhbwstuttgart.typeinference.exceptions.TypeinferenceException; import de.dhbwstuttgart.typeinference.typedeployment.TypeInsertPoint; import de.dhbwstuttgart.parser.JavaClassName; import de.dhbwstuttgart.syntaxtree.Class; +import de.dhbwstuttgart.syntaxtree.GTVDeclarationContext; import de.dhbwstuttgart.syntaxtree.SyntaxTreeNode; // ino.class.GenericTypeVar.26505.description type=javadoc /** @@ -225,6 +226,10 @@ public class GenericTypeVar extends Type super.parserPostProcessing(parent); //if(parentTemp != null)this.parent = parentTemp; //Der Parenttype einer GenericVar soll sich nicht ändern können, falls einmal gesetzt. } + + public GTVDeclarationContext getDeclarationContext() { + return this.getGTVDeclarationContext(); + } } diff --git a/src/de/dhbwstuttgart/typeinference/assumptions/GenericVarAssumption.java b/src/de/dhbwstuttgart/typeinference/assumptions/GenericVarAssumption.java index 3460bed97..02bcd8c02 100644 --- a/src/de/dhbwstuttgart/typeinference/assumptions/GenericVarAssumption.java +++ b/src/de/dhbwstuttgart/typeinference/assumptions/GenericVarAssumption.java @@ -1,10 +1,15 @@ package de.dhbwstuttgart.typeinference.assumptions; import de.dhbwstuttgart.parser.JavaClassName; +import de.dhbwstuttgart.syntaxtree.FieldDeclaration; +import de.dhbwstuttgart.syntaxtree.GTVDeclarationContext; +import de.dhbwstuttgart.syntaxtree.Method; +import de.dhbwstuttgart.syntaxtree.SyntaxTreeNode; import de.dhbwstuttgart.syntaxtree.statement.LocalVarDecl; import de.dhbwstuttgart.syntaxtree.type.GenericTypeVar; import de.dhbwstuttgart.syntaxtree.type.RefType; import de.dhbwstuttgart.syntaxtree.type.Type; +import de.dhbwstuttgart.syntaxtree.Class; public class GenericVarAssumption extends Assumption{ diff --git a/src/de/dhbwstuttgart/typeinference/assumptions/TypeAssumptions.java b/src/de/dhbwstuttgart/typeinference/assumptions/TypeAssumptions.java index 48830f1f0..0d9804595 100755 --- a/src/de/dhbwstuttgart/typeinference/assumptions/TypeAssumptions.java +++ b/src/de/dhbwstuttgart/typeinference/assumptions/TypeAssumptions.java @@ -8,6 +8,7 @@ import de.dhbwstuttgart.logger.Logger; import de.dhbwstuttgart.logger.Section; import de.dhbwstuttgart.parser.JavaClassName; import de.dhbwstuttgart.syntaxtree.Class; +import de.dhbwstuttgart.syntaxtree.GTVDeclarationContext; import de.dhbwstuttgart.syntaxtree.SyntaxTreeNode; import de.dhbwstuttgart.syntaxtree.type.GenericTypeVar; import de.dhbwstuttgart.syntaxtree.type.RefType; @@ -328,8 +329,9 @@ public class TypeAssumptions { //if(ass.inheritsType(t))return t; if(ass.getIdentifier().equals(t.getName())){ //Generische Variable gefunden! - - if(! ass.getAssumedType().getParentClass().equals(inNode.getParentClass())){ //hier muss nach der ParentClass von inNode gefragt werden, da die ParentClass von t nicht immer korrekt ist! (TODO: Überprüfen) + GTVDeclarationContext gtvDeclNode = ass.getAssumedType().getDeclarationContext(); + if(gtvDeclNode == null || gtvDeclNode.isClass() + || !gtvDeclNode.equals(inNode.getGTVDeclarationContext())){ //hier muss nach der ParentClass von inNode gefragt werden, da die ParentClass von t nicht immer korrekt ist! (TODO: Überprüfen) TypeAssumptions.log.debug(t+" ist NICHT in Klasse: "+ass.getAssumedType().getParentClass(), Section.ASSUMPTIONS); //Ist die Generische Variable nicht aus dieser Klasse, so muss sie zu einem TPH umgewandelt werden: return new ConstraintType(ass.getAssumedType().getTypePlaceHolder(inNode)); @@ -391,7 +393,6 @@ public class TypeAssumptions { */ public void addGenericVarAssumption( GenericTypeVar genericTypeVar) { - //TODO: Hier müssen alle Bounds einzeln geaddet werden. Die Bounds müssen hierbei nicht gespeichert werden, deren Constraints generiert die TYPE-Methode der GenericVarDeclarations this.genericVarAssumptions.add(new GenericVarAssumption(genericTypeVar)); }