This()-Aufruf anfügen. Änderungen an Constructor vornehmen. Keine lauffähige Version

This commit is contained in:
JanUlrich 2015-02-25 16:34:29 +01:00
parent 9261518e5a
commit 9e99a5b20b
10 changed files with 1130 additions and 981 deletions

File diff suppressed because it is too large Load Diff

View File

@ -1444,6 +1444,9 @@ statement :statementwithouttrailingsubstatement
$$=$1; $$=$1;
} }
|forstatement |forstatement
{
$$=$1;
}| explicitconstructorinvocation
{ {
$$=$1; $$=$1;
} }

View File

@ -1170,7 +1170,6 @@ public class Class extends GTVDeclarationContext implements AClassOrInterface, I
@Override @Override
public void parserPostProcessing(SyntaxTreeNode parent) { public void parserPostProcessing(SyntaxTreeNode parent) {
super.parserPostProcessing(parent);
//Wenn keine Superklasse, dann erbt die Klasse zwangsweise von Object: //Wenn keine Superklasse, dann erbt die Klasse zwangsweise von Object:
if(superclassid == null || superclassid.get_Name().size()<1){ if(superclassid == null || superclassid.get_Name().size()<1){
@ -1183,7 +1182,7 @@ public class Class extends GTVDeclarationContext implements AClassOrInterface, I
for(Field f : this.getFields()){ for(Field f : this.getFields()){
if(f instanceof Method && !(f instanceof Constructor)){ if(f instanceof Method && !(f instanceof Constructor)){
Method method = (Method)f; Method method = (Method)f;
if(method.get_Method_Name().equals(this.getName()) ){ if(method.get_Method_Name().equals(this.getName().toString()) ){
tempFields.add(new Constructor(method)); tempFields.add(new Constructor(method));
}else{ }else{
tempFields.add(f); tempFields.add(f);
@ -1214,9 +1213,11 @@ public class Class extends GTVDeclarationContext implements AClassOrInterface, I
else this.genericClassParameters.add(new GenericTypeVar(t.get_Name(),this,-1)); else this.genericClassParameters.add(new GenericTypeVar(t.get_Name(),this,-1));
} }
*/ */
/*
for(Type t : this.get_ParaList()){ for(Type t : this.get_ParaList()){
t.parserPostProcessing(this); t.parserPostProcessing(this);
} }
*/
/* /*
for(GenericTypeVar gtv : this.getGenericParameter()){ for(GenericTypeVar gtv : this.getGenericParameter()){
gtv.setParentClass(this);; gtv.setParentClass(this);;
@ -1225,6 +1226,9 @@ public class Class extends GTVDeclarationContext implements AClassOrInterface, I
//TODO: Umwandlung zu RefTypes funktioniert noch nicht richtig. (siehe LambdaTest2) //TODO: Umwandlung zu RefTypes funktioniert noch nicht richtig. (siehe LambdaTest2)
//Als RefType geparste Generische Variablen umwandeln: //Als RefType geparste Generische Variablen umwandeln:
this.wandleRefTypeAttributes2GenericAttributes(); this.wandleRefTypeAttributes2GenericAttributes();
//Erst am Schluss, nachdem Methoden zu Konstruktoren umgewandelt wurden:
super.parserPostProcessing(parent);
} }
@Override @Override
@ -1235,9 +1239,11 @@ public class Class extends GTVDeclarationContext implements AClassOrInterface, I
@Override @Override
public Vector<SyntaxTreeNode> getChildren() { public Vector<SyntaxTreeNode> getChildren() {
Vector<SyntaxTreeNode> ret = new Vector<SyntaxTreeNode>(); Vector<SyntaxTreeNode> ret = new Vector<SyntaxTreeNode>();
for(Field f : this.getFields()){ //for(Field f : this.getFields()){
ret.add(f); // ret.add(f);
} //}
ret.addAll(this.getFields());
ret.addAll(this.get_ParaList());
ret.addAll(this.getGenericParameter()); ret.addAll(this.getGenericParameter());
return ret; return ret;
} }

View File

@ -11,6 +11,7 @@ import de.dhbwstuttgart.syntaxtree.statement.Block;
import de.dhbwstuttgart.syntaxtree.type.GenericTypeVar; import de.dhbwstuttgart.syntaxtree.type.GenericTypeVar;
import de.dhbwstuttgart.syntaxtree.type.RefType; import de.dhbwstuttgart.syntaxtree.type.RefType;
import de.dhbwstuttgart.syntaxtree.type.Type; import de.dhbwstuttgart.syntaxtree.type.Type;
import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder;
import de.dhbwstuttgart.typeinference.ConstraintsSet; import de.dhbwstuttgart.typeinference.ConstraintsSet;
import de.dhbwstuttgart.typeinference.JavaCodeResult; import de.dhbwstuttgart.typeinference.JavaCodeResult;
import de.dhbwstuttgart.typeinference.ResultSet; import de.dhbwstuttgart.typeinference.ResultSet;
@ -19,6 +20,8 @@ import de.dhbwstuttgart.typeinference.assumptions.ConstructorAssumption;
import de.dhbwstuttgart.typeinference.assumptions.MethodAssumption; import de.dhbwstuttgart.typeinference.assumptions.MethodAssumption;
import de.dhbwstuttgart.typeinference.assumptions.TypeAssumptions; import de.dhbwstuttgart.typeinference.assumptions.TypeAssumptions;
import de.dhbwstuttgart.typeinference.exceptions.TypeinferenceException; import de.dhbwstuttgart.typeinference.exceptions.TypeinferenceException;
import de.dhbwstuttgart.typeinference.typedeployment.TypeInsertPoint;
import de.dhbwstuttgart.typeinference.typedeployment.TypeInsertSet;
public class Constructor extends Method { public class Constructor extends Method {
private Method methode; private Method methode;
@ -27,6 +30,11 @@ public class Constructor extends Method {
* Parser kann nicht zwischen einem Konstruktor und einer Methode unterscheiden. * Parser kann nicht zwischen einem Konstruktor und einer Methode unterscheiden.
* Diese Klasse beherbegt den als Methode geparsten Konstruktor und wandelt sein verhalten zu dem eines Konstruktors ab. * Diese Klasse beherbegt den als Methode geparsten Konstruktor und wandelt sein verhalten zu dem eines Konstruktors ab.
*/ */
public Constructor(Method methode){
super(methode.get_Method_Name(), methode.getParameterList(),methode.get_Block(), methode.getGenericDeclarationList(), methode.getOffset());
}
/*
public Constructor(Method methode){ public Constructor(Method methode){
super(methode.getOffset()); super(methode.getOffset());
this.methode = methode; this.methode = methode;
@ -34,21 +42,60 @@ public class Constructor extends Method {
this.methode.setType(this.methode.getParentClass().getType()); this.methode.setType(this.methode.getParentClass().getType());
} }
/*
@Override @Override
public void setGenericMethodParameters( public Vector<GenericTypeVar> getGenericParameter() {
Vector<GenericTypeVar> genericMethodParameters) { return this.methode.getGenericParameter();
this.methode.setGenericMethodParameters(genericMethodParameters);
} }
@Override @Override
public Vector<GenericTypeVar> getGenericMethodParameters() { public TypeInsertPoint createTypeInsertPoint(TypePlaceholder tph,
ResultSet resultSet) {
return this.methode.getGenericMethodParameters(); return this.methode.createTypeInsertPoint(tph, resultSet);
} }
*/
@Override
public boolean isPublic() {
return this.methode.isPublic();
}
@Override
public String getGenericVarDeclarationString(String genericVarDeclaration) {
return this.methode.getGenericVarDeclarationString(genericVarDeclaration);
}
@Override
public int getGenericVarDeclarationOffset() {
return this.methode.getGenericVarDeclarationOffset();
}
@Override
public void setGenericParameter(GenericDeclarationList params) {
this.methode.setGenericParameter(params);
}
@Override
public GTVDeclarationContext getGTVDeclarationContext() {
return this;
}
@Override
public void addTypeInsertPoints(TypeInsertSet insertSet, ResultSet result) {
this.methode.addTypeInsertPoints(insertSet, result);
}
@Override
public boolean seesType(Type tA2) {
return this.methode.seesType(tA2);
}
@Override @Override
public JavaClassName getTypeName() { public JavaClassName getTypeName() {
@ -310,7 +357,7 @@ public class Constructor extends Method {
public Class getParentClass() { public Class getParentClass() {
return this.methode.getParentClass(); return this.methode.getParentClass();
} }
*/
} }

View File

@ -61,6 +61,10 @@ public abstract class Field extends GTVDeclarationContext implements TypeInserta
return ret; return ret;
} }
GenericDeclarationList getGenericDeclarationList(){
return this.genericParameters;
}
public void set_DeclId(DeclId did) public void set_DeclId(DeclId did)
{ {
this.declid.addElement(did); this.declid.addElement(did);

View File

@ -98,6 +98,19 @@ public class Method extends Field implements IItemWithOffset, TypeInsertable
super(offset); super(offset);
} }
public Method(String name, ParameterList parameterList, Block block, GenericDeclarationList gtvDeclarations, int offset){
this(offset);
/*
if(parameterList != null)parameterList.parserPostProcessing(this);
if(block != null)block.parserPostProcessing(this);
if(gtvDeclarations != null)gtvDeclarations.parserPostProcessing(this);
*/
this.set_Method_Name(name);
this.setParameterList(parameterList);
this.set_Block(block);
this.setGenericParameter(gtvDeclarations);
}
/* /*
// ino.method.setGenericMethodParameters.23521.definition // ino.method.setGenericMethodParameters.23521.definition
public void setGenericMethodParameters(Vector<GenericTypeVar> genericMethodParameters) public void setGenericMethodParameters(Vector<GenericTypeVar> genericMethodParameters)
@ -503,15 +516,12 @@ public class Method extends Field implements IItemWithOffset, TypeInsertable
} }
*/ */
} }
// ino.end
// ino.method.set_Method_Name.23617.definition
public void set_Method_Name(String string) public void set_Method_Name(String string)
// ino.end
// ino.method.set_Method_Name.23617.body
{ {
if(declid.size()==0)declid.add(0, new DeclId(string));
declid.set(0,new DeclId(string)); declid.set(0,new DeclId(string));
} }
// ino.end
@ -584,7 +594,7 @@ public class Method extends Field implements IItemWithOffset, TypeInsertable
*/ */
@Override @Override
public TypeAssumptions createTypeAssumptions(Class classmember) { public TypeAssumptions createTypeAssumptions(Class classmember) {
Class parentClass = this.getParentClass(); Class parentClass = classmember;//this.getParentClass();
TypeAssumptions ret = new TypeAssumptions(); TypeAssumptions ret = new TypeAssumptions();
ret.addAssumption(new MethodAssumption(this, parentClass)); ret.addAssumption(new MethodAssumption(this, parentClass));
return ret; return ret;
@ -673,7 +683,7 @@ public class Method extends Field implements IItemWithOffset, TypeInsertable
super.parserPostProcessing(parent); super.parserPostProcessing(parent);
if(this.getType()==null)this.setType(TypePlaceholder.fresh(this)); if(this.getType()==null)this.setType(TypePlaceholder.fresh(this));
//Bei dem Elterntyp der Methode darf es sich nur um eine Klasse handeln, daher Cast ohne Prüfung: //Bei dem Elterntyp der Methode darf es sich nur um eine Klasse handeln, daher Cast ohne Prüfung:
Class parentClass = (Class)parent; //Class parentClass = (Class)parent;
if(this.returntype == null)this.returntype = TypePlaceholder.fresh(this); if(this.returntype == null)this.returntype = TypePlaceholder.fresh(this);
this.returntype.parserPostProcessing(this); this.returntype.parserPostProcessing(this);
if(this.parameterlist != null){ if(this.parameterlist != null){
@ -690,9 +700,7 @@ public class Method extends Field implements IItemWithOffset, TypeInsertable
public Vector<SyntaxTreeNode> getChildren() { public Vector<SyntaxTreeNode> getChildren() {
Vector<SyntaxTreeNode> ret = new Vector<SyntaxTreeNode>(); Vector<SyntaxTreeNode> ret = new Vector<SyntaxTreeNode>();
ret.add(this.block); ret.add(this.block);
for(FormalParameter param : this.parameterlist){ ret.add(this.parameterlist);
ret.add(param);
}
ret.addAll(this.getGenericParameter()); ret.addAll(this.getGenericParameter());
return ret; return ret;
} }

View File

@ -20,7 +20,7 @@ import de.dhbwstuttgart.typeinference.ResultSet;
// ino.class.ParameterList.23620.declaration // ino.class.ParameterList.23620.declaration
public class ParameterList implements Iterable<FormalParameter> public class ParameterList extends SyntaxTreeNode implements Iterable<FormalParameter>
// ino.end // ino.end
// ino.class.ParameterList.23620.body // ino.class.ParameterList.23620.body
{ {
@ -168,5 +168,22 @@ public class ParameterList implements Iterable<FormalParameter>
if(this.formalparameter!=null)return this.formalparameter.equals(equals.formalparameter); if(this.formalparameter!=null)return this.formalparameter.equals(equals.formalparameter);
return true; return true;
} }
@Override
public int getOffset() {
if(formalparameter == null || formalparameter.size()==0)return 0;
return formalparameter.firstElement().getOffset();
}
@Override
public int getVariableLength() {
return 0;
}
@Override
public Vector<? extends SyntaxTreeNode> getChildren() {
return formalparameter;
}
} }
// ino.end // ino.end

View File

@ -38,7 +38,7 @@ public abstract class SyntaxTreeNode implements IItemWithOffset{
return this.parent; return this.parent;
} }
public abstract Vector<SyntaxTreeNode> getChildren(); public abstract Vector<? extends SyntaxTreeNode> getChildren();
public Class getParentClass(){ public Class getParentClass(){
SyntaxTreeNode parent = this.getParent(); SyntaxTreeNode parent = this.getParent();

View File

@ -31,6 +31,13 @@ public class MethodCall extends Expr
// ino.end // ino.end
// ino.class.MethodCall.25623.body // ino.class.MethodCall.25623.body
{ {
public MethodCall(Receiver receiver, String methodName, ArgumentList argumentList, int offset){
this(offset, 0);
this.set_Receiver(receiver);
this.set_Name(methodName);
this.set_ArgumentList(argumentList);
}
// ino.method.MethodCall.25627.definition // ino.method.MethodCall.25627.definition
public MethodCall(int offset, int variableLength) public MethodCall(int offset, int variableLength)
// ino.end // ino.end

View File

@ -13,6 +13,7 @@ import de.dhbwstuttgart.myexception.CTypeReconstructionException;
import de.dhbwstuttgart.myexception.JVMCodeException; import de.dhbwstuttgart.myexception.JVMCodeException;
import de.dhbwstuttgart.myexception.SCStatementException; import de.dhbwstuttgart.myexception.SCStatementException;
import de.dhbwstuttgart.syntaxtree.Class; import de.dhbwstuttgart.syntaxtree.Class;
import de.dhbwstuttgart.syntaxtree.Constructor;
import de.dhbwstuttgart.syntaxtree.SyntaxTreeNode; import de.dhbwstuttgart.syntaxtree.SyntaxTreeNode;
import de.dhbwstuttgart.syntaxtree.misc.UsedId; import de.dhbwstuttgart.syntaxtree.misc.UsedId;
import de.dhbwstuttgart.syntaxtree.type.GenericTypeVar; import de.dhbwstuttgart.syntaxtree.type.GenericTypeVar;
@ -22,6 +23,7 @@ import de.dhbwstuttgart.typeinference.ConstraintsSet;
import de.dhbwstuttgart.typeinference.JavaCodeResult; import de.dhbwstuttgart.typeinference.JavaCodeResult;
import de.dhbwstuttgart.typeinference.ResultSet; import de.dhbwstuttgart.typeinference.ResultSet;
import de.dhbwstuttgart.typeinference.assumptions.TypeAssumptions; import de.dhbwstuttgart.typeinference.assumptions.TypeAssumptions;
import de.dhbwstuttgart.typeinference.exceptions.TypeinferenceException;
import de.dhbwstuttgart.typeinference.unify.CSubstitutionSet; import de.dhbwstuttgart.typeinference.unify.CSubstitutionSet;
@ -125,7 +127,27 @@ public class This extends Expr
return ret; return ret;
} }
public String toString() /**
* This kann auch als Konstruktoraufruf in einem Konstruktor-Block vorkommen.
*/
@Override
public ConstraintsSet TYPEStmt(TypeAssumptions assumptions) {
ConstraintsSet ret = new ConstraintsSet();
//Kontrollieren, dass sich this(...) in einem Konstruktor und dort als erstes Statement befindet:
SyntaxTreeNode p = this.getGTVDeclarationContext();
if(p instanceof Constructor &&
((Constructor)p).get_Block().statements.firstElement().equals(this)){
//Constraints generieren:
MethodCall constructorCall = new MethodCall(new Receiver(this), this.getParentClass().getName().toString(), arglist, this.getOffset());
ret.add(constructorCall.TYPEStmt(assumptions));
return ret;
}else{
//Ansonsten Fehler ausgeben:
throw new TypeinferenceException("This()-Aufruf hier nicht möglich", this);
}
}
public String toString()
// ino.end // ino.end
// ino.method.toString.25738.body // ino.method.toString.25738.body
{ {