forked from JavaTX/JavaCompilerCore
GTVDeclarationContext angefügt. Dadurch Fehler beim Umwandeln von GTZ in TPH behoben
This commit is contained in:
parent
dc7d23d699
commit
16dd89376c
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
@ -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> declid = new Vector<DeclId>(); // 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;
|
||||
}
|
||||
}
|
||||
|
15
src/de/dhbwstuttgart/syntaxtree/GTVDeclarationContext.java
Normal file
15
src/de/dhbwstuttgart/syntaxtree/GTVDeclarationContext.java
Normal file
@ -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();
|
||||
}
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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
|
||||
/**
|
||||
@ -226,6 +227,10 @@ public class GenericTypeVar extends Type
|
||||
//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();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
// ino.end
|
||||
|
@ -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{
|
||||
|
||||
|
@ -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));
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user