2014-09-02 08:33:54 +00:00
package de.dhbwstuttgart.syntaxtree ;
2013-10-18 11:33:46 +00:00
2015-05-27 13:57:15 +00:00
import org.apache.bcel.Constants ;
import org.apache.bcel.classfile.ConstantPool ;
import org.apache.bcel.generic.ClassGen ;
import org.apache.bcel.generic.ConstantPoolGen ;
import org.apache.bcel.generic.InstructionFactory ;
import org.apache.bcel.generic.InstructionHandle ;
import org.apache.bcel.generic.InstructionList ;
import org.apache.bcel.generic.MethodGen ;
2014-02-19 04:20:54 +00:00
2015-05-27 13:57:15 +00:00
import de.dhbwstuttgart.typeinference.Menge ;
2014-09-04 14:35:44 +00:00
import de.dhbwstuttgart.myexception.JVMCodeException ;
2014-09-05 09:49:31 +00:00
import de.dhbwstuttgart.parser.JavaClassName ;
2014-09-02 08:33:54 +00:00
import de.dhbwstuttgart.syntaxtree.misc.DeclId ;
2014-09-05 09:49:31 +00:00
import de.dhbwstuttgart.syntaxtree.modifier.Modifiers ;
2014-09-02 08:33:54 +00:00
import de.dhbwstuttgart.syntaxtree.statement.Block ;
import de.dhbwstuttgart.syntaxtree.type.GenericTypeVar ;
import de.dhbwstuttgart.syntaxtree.type.RefType ;
import de.dhbwstuttgart.syntaxtree.type.Type ;
2015-02-25 15:34:29 +00:00
import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder ;
2014-09-02 08:33:54 +00:00
import de.dhbwstuttgart.typeinference.ConstraintsSet ;
import de.dhbwstuttgart.typeinference.JavaCodeResult ;
import de.dhbwstuttgart.typeinference.ResultSet ;
import de.dhbwstuttgart.typeinference.SingleConstraint ;
import de.dhbwstuttgart.typeinference.assumptions.ConstructorAssumption ;
import de.dhbwstuttgart.typeinference.assumptions.MethodAssumption ;
2015-02-25 17:29:44 +00:00
import de.dhbwstuttgart.typeinference.assumptions.ParameterAssumption ;
2014-09-02 08:33:54 +00:00
import de.dhbwstuttgart.typeinference.assumptions.TypeAssumptions ;
import de.dhbwstuttgart.typeinference.exceptions.TypeinferenceException ;
2015-02-25 15:34:29 +00:00
import de.dhbwstuttgart.typeinference.typedeployment.TypeInsertPoint ;
import de.dhbwstuttgart.typeinference.typedeployment.TypeInsertSet ;
2015-02-25 17:51:48 +00:00
import de.dhbwstuttgart.syntaxtree.type.Void ;
2014-02-19 04:20:54 +00:00
2014-02-14 16:31:55 +00:00
public class Constructor extends Method {
private Method methode ;
2013-10-18 11:33:46 +00:00
2014-02-14 16:31:55 +00:00
/ * *
* 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 .
* /
2015-02-25 15:34:29 +00:00
public Constructor ( Method methode ) {
2015-02-25 17:29:44 +00:00
super ( methode . get_Method_Name ( ) , methode . getType ( ) , methode . getParameterList ( ) , methode . get_Block ( ) , methode . getGenericDeclarationList ( ) , methode . getOffset ( ) ) ;
}
@Override
public TypeAssumptions createTypeAssumptions ( Class classmember ) {
this . parent = classmember ;
Class parentClass = this . getParentClass ( ) ;
TypeAssumptions ret = new TypeAssumptions ( ) ;
ret . addAssumption ( new ConstructorAssumption ( this , parentClass ) ) ;
return ret ;
}
2015-05-27 13:57:15 +00:00
@Override
public void genByteCode ( ClassGen cg ) {
2015-06-16 11:08:11 +00:00
//ConstantPoolGen _cp = cg.getConstantPool();
//InstructionFactory _factory = new InstructionFactory(cg, _cp);
//InstructionList il = new InstructionList();
2015-05-27 13:57:15 +00:00
Class parentClass = this . getParentClass ( ) ;
//TODO: Hier return type und Argument-Typen dynamisch generieren. return type mittels method.getReturnType() ermitteln
2015-06-16 09:55:15 +00:00
//Hier m<> sste drin stehen: Kreiere einen Block, welcher ein Statement enth<74> lt, welches ein Super Statement ist.
2015-06-16 11:08:11 +00:00
MethodGen method = new MethodGen ( Constants . ACC_PUBLIC , org . apache . bcel . generic . Type . getReturnType ( methode . getType ( ) . get_Name ( ) ) , org . apache . bcel . generic . Type . NO_ARGS , new String [ ] { } , " <init> " , parentClass . name , il , _cp ) ;
2015-06-16 09:55:15 +00:00
2015-06-16 11:08:11 +00:00
//il.dispose();
2015-05-27 13:57:15 +00:00
}
2015-06-16 09:55:15 +00:00
// super statement muss drin sein
// stmt genByteCode + im block genByteCode implementieren & dann Hierarchie ausprobieren
// de.dhbw.systanxtree.stmts supercall
// Aufrufhierarchie: Class->Felder->Konstruktor->Methode innerhalb Konstruktor->Block->Statements (in diesem Fall nur super())->hier wird bytecode f<> r superaufruf generiert
2015-05-27 13:57:15 +00:00
2015-02-25 17:29:44 +00:00
@Override
public void parserPostProcessing ( SyntaxTreeNode parent ) {
if ( this . parameterlist ! = null ) {
for ( FormalParameter fp : this . parameterlist ) {
fp . parserPostProcessing ( this ) ;
}
}
for ( GenericTypeVar gtv : this . getGenericParameter ( ) ) {
gtv . parserPostProcessing ( this ) ;
}
}
2015-06-16 09:55:15 +00:00
2015-02-25 17:29:44 +00:00
@Override
public ConstraintsSet TYPE ( TypeAssumptions ass ) {
2015-02-25 17:51:48 +00:00
//super.setType(this.getParentClass().getType());
super . setType ( new Void ( this , 0 ) ) ;
2015-02-25 17:29:44 +00:00
return super . TYPE ( ass ) ;
}
@Override
public void setType ( Type t ) {
2015-02-26 14:50:23 +00:00
super . setType ( new Void ( this , this . getOffset ( ) ) ) ;
//throw new TypeinferenceException("Einem Konstruktor kann kein Typ zugewiesen werden", this);
2015-02-25 17:29:44 +00:00
//this.methode.setType(t);
2015-02-25 15:34:29 +00:00
}
2015-06-16 09:55:15 +00:00
/ * public Constructor ( Method methode ) {
2014-03-09 11:10:03 +00:00
super ( methode . getOffset ( ) ) ;
2014-02-14 16:31:55 +00:00
this . methode = methode ;
2015-04-22 19:40:22 +00:00
this . setDeclIdMenge ( methode . getDeclIdMenge ( ) ) ;
2014-03-20 10:35:57 +00:00
this . methode . setType ( this . methode . getParentClass ( ) . getType ( ) ) ;
2015-06-16 09:55:15 +00:00
} * /
2014-02-19 04:20:54 +00:00
2015-02-25 15:34:29 +00:00
@Override
2015-04-22 19:40:22 +00:00
public Menge < GenericTypeVar > getGenericParameter ( ) {
2015-02-25 15:34:29 +00:00
return this . methode . getGenericParameter ( ) ;
}
2014-03-09 11:10:03 +00:00
2014-02-19 04:20:54 +00:00
@Override
2015-02-25 15:34:29 +00:00
public TypeInsertPoint createTypeInsertPoint ( TypePlaceholder tph ,
ResultSet resultSet ) {
return this . methode . createTypeInsertPoint ( tph , resultSet ) ;
}
@Override
public boolean isPublic ( ) {
return this . methode . isPublic ( ) ;
2014-02-19 04:20:54 +00:00
}
2015-02-25 15:34:29 +00:00
2014-02-19 04:20:54 +00:00
@Override
2015-02-25 15:34:29 +00:00
public String getGenericVarDeclarationString ( String genericVarDeclaration ) {
return this . methode . getGenericVarDeclarationString ( genericVarDeclaration ) ;
2014-02-19 04:20:54 +00:00
}
2015-02-25 15:34:29 +00:00
@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 ) ;
}
2014-02-19 04:20:54 +00:00
@Override
2014-09-02 16:49:19 +00:00
public JavaClassName getTypeName ( ) {
2014-02-19 04:20:54 +00:00
2014-02-19 16:32:43 +00:00
return this . getType ( ) . getName ( ) ;
2014-02-19 04:20:54 +00:00
}
@Override
public Block get_Block ( ) {
return this . methode . get_Block ( ) ;
}
2014-02-19 16:32:43 +00:00
2014-02-19 04:20:54 +00:00
@Override
public void set_Block ( Block blo ) {
this . methode . set_Block ( blo ) ;
}
@Override
public void set_Modifiers ( Modifiers modif ) {
this . methode . set_Modifiers ( modif ) ;
}
@Override
public void set_ExceptionList ( ExceptionList exlist ) {
this . methode . set_ExceptionList ( exlist ) ;
}
@Override
public void setParameterList ( ParameterList paralist ) {
this . methode . setParameterList ( paralist ) ;
}
@Override
public ParameterList getParameterList ( ) {
return this . methode . getParameterList ( ) ;
}
@Override
public int getParameterCount ( ) {
return this . methode . getParameterCount ( ) ;
}
@Override
public ExceptionList get_ExceptionList ( ) {
return this . methode . get_ExceptionList ( ) ;
}
@Override
public int getOverloadedID ( ) {
return this . methode . getOverloadedID ( ) ;
}
@Override
public void setOverloadedID ( int overloadedID ) {
this . methode . setOverloadedID ( overloadedID ) ;
}
2015-06-16 09:55:15 +00:00
/ * @Override
2015-04-22 19:40:22 +00:00
public String get_codegen_Param_Type ( Menge paralist ) {
2014-02-19 04:20:54 +00:00
return this . methode . get_codegen_Param_Type ( paralist ) ;
2015-06-16 09:55:15 +00:00
} * /
2014-02-19 04:20:54 +00:00
@Override
public String get_Method_Name ( ) {
return this . methode . get_Method_Name ( ) ;
}
@Override
2015-04-22 19:40:22 +00:00
public Menge get_Type_Paralist ( ) {
2014-02-19 04:20:54 +00:00
return this . methode . get_Type_Paralist ( ) ;
}
2015-06-16 09:55:15 +00:00
/ * @Override
2015-04-22 19:40:22 +00:00
public void codegen ( ClassFile classfile , Menge paralist )
2014-02-19 04:20:54 +00:00
throws JVMCodeException {
this . methode . codegen ( classfile , paralist ) ;
2015-06-16 09:55:15 +00:00
} * /
2014-02-19 04:20:54 +00:00
@Override
public int getLineNumber ( ) {
return this . methode . getLineNumber ( ) ;
}
@Override
public void setLineNumber ( int lineNumber ) {
this . methode . setLineNumber ( lineNumber ) ;
}
@Override
public int getOffset ( ) {
return this . methode . getOffset ( ) ;
}
@Override
public int getVariableLength ( ) {
return this . methode . getVariableLength ( ) ;
}
@Override
public void setOffset ( int Offset ) {
this . methode . setOffset ( Offset ) ;
}
@Override
public int getTypeLineNumber ( ) {
return this . methode . getTypeLineNumber ( ) ;
}
@Override
public String toString ( ) {
return this . methode . toString ( ) ;
}
@Override
public void setAbstract ( boolean b ) {
this . methode . setAbstract ( b ) ;
}
@Override
public boolean isAbstract ( ) {
return this . methode . isAbstract ( ) ;
}
@Override
2015-04-22 19:40:22 +00:00
public void wandleRefTypeAttributes2GenericAttributes ( Menge < Type > paralist ) {
2014-02-19 04:20:54 +00:00
this . methode . wandleRefTypeAttributes2GenericAttributes ( paralist ) ;
}
@Override
public void set_Method_Name ( String string ) {
this . methode . set_Method_Name ( string ) ;
}
2015-06-16 09:55:15 +00:00
/ * public ConstraintsSet TYPE ( TypeAssumptions ass ) {
2014-02-19 05:09:59 +00:00
ConstraintsSet ret = new ConstraintsSet ( ) ;
ret . add ( this . methode . get_Block ( ) . TYPEStmt ( ass ) ) ;
return ret ;
2015-06-16 09:55:15 +00:00
} * /
2014-02-19 04:20:54 +00:00
@Override
public String getTypeInformation ( ) {
return this . methode . getTypeInformation ( ) ;
}
@Override
public JavaCodeResult printJavaCode ( ResultSet resultSet ) {
return this . methode . printJavaCode ( resultSet ) ;
}
2015-06-16 09:55:15 +00:00
/ * @Override
2014-02-19 04:20:54 +00:00
public TypeAssumptions createTypeAssumptions ( Class classmember ) {
2014-03-18 19:18:57 +00:00
Class parentClass = this . getParentClass ( ) ;
TypeAssumptions ret = new TypeAssumptions ( ) ;
2014-04-09 12:12:55 +00:00
ret . addAssumption ( new ConstructorAssumption ( this , parentClass ) ) ;
2014-03-18 19:18:57 +00:00
return ret ;
2015-06-16 09:55:15 +00:00
} * /
2014-02-19 04:20:54 +00:00
2014-03-18 19:18:57 +00:00
@Override
public SyntaxTreeNode getParent ( ) {
return this . methode . getParent ( ) ;
}
2015-06-16 09:55:15 +00:00
/ * @Override
2014-02-19 04:20:54 +00:00
public void parserPostProcessing ( SyntaxTreeNode parent ) {
this . methode . parserPostProcessing ( parent ) ;
2015-06-16 09:55:15 +00:00
} * /
2014-02-19 04:20:54 +00:00
@Override
2015-04-22 19:40:22 +00:00
public Menge < SyntaxTreeNode > getChildren ( ) {
2014-02-19 04:20:54 +00:00
return this . methode . getChildren ( ) ;
}
2015-06-16 09:55:15 +00:00
/ * @Override
2014-02-19 04:20:54 +00:00
public void setType ( Type t ) {
2014-04-15 12:56:20 +00:00
throw new TypeinferenceException ( " Einem Konstruktor kann kein Typ zugewiesen werden " , this ) ;
2014-02-19 16:32:43 +00:00
//this.methode.setType(t);
2015-06-16 09:55:15 +00:00
} * /
2014-02-19 04:20:54 +00:00
@Override
public Type getType ( ) {
2014-02-19 16:32:43 +00:00
return this . methode . getType ( ) ;
2014-02-14 16:31:55 +00:00
}
2014-03-19 14:14:50 +00:00
@Override
public boolean equals ( Object obj ) {
return this . methode . equals ( obj ) ;
}
@Override
public void set_DeclId ( DeclId did ) {
this . methode . set_DeclId ( did ) ;
}
@Override
2015-04-22 19:40:22 +00:00
public Menge < DeclId > get_Name ( ) {
2014-03-19 14:14:50 +00:00
return this . methode . get_Name ( ) ;
}
@Override
2015-04-22 19:40:22 +00:00
public Menge < DeclId > getDeclIdMenge ( ) {
return this . methode . getDeclIdMenge ( ) ;
2014-03-19 14:14:50 +00:00
}
@Override
2015-04-22 19:40:22 +00:00
public void setDeclIdMenge ( Menge < DeclId > vDeclId ) {
this . methode . setDeclIdMenge ( vDeclId ) ;
2014-03-19 14:14:50 +00:00
}
@Override
public String getIdentifier ( ) {
return this . methode . getIdentifier ( ) ;
}
@Override
public String getDescription ( ) {
return this . methode . getDescription ( ) ;
}
@Override
public Class getParentClass ( ) {
return this . methode . getParentClass ( ) ;
}
2015-06-16 09:55:15 +00:00
2014-02-19 04:20:54 +00:00
2013-10-18 11:33:46 +00:00
}
2014-03-27 15:43:07 +00:00
/ *
// ino.class.Constructor.23267.declaration
public class Constructor_Backup extends Method
// ino.end
// ino.class.Constructor.23267.body
{
// ino.method.Constructor.23271.definition
public Constructor_Backup ( )
// ino.end
// ino.method.Constructor.23271.body
{
this . setParameterList ( null ) ;
// #JB# 04.06.2005
// ###########################################################
DeclId decl = new DeclId ( ) ;
decl . set_Name ( " <init> " ) ;
this . set_DeclId ( decl ) ;
// ###########################################################
}
// ino.end
// ino.method.get_codegen_Param_Type.23274.definition
2015-04-22 19:40:22 +00:00
public String get_codegen_Param_Type ( Menge paralist )
2014-03-27 15:43:07 +00:00
// ino.end
// ino.method.get_codegen_Param_Type.23274.body
{
String ret = new String ( ) ;
if ( this . getParameterList ( ) = = null )
{
ret + = " () " ;
}
else
{
ret + = this . getParameterList ( ) . get_codegen_ParameterList ( paralist ) ;
}
ret + = " V " ;
return ret ;
}
// ino.end
// ino.method.codegen.23277.definition
2015-04-22 19:40:22 +00:00
public void codegen ( ClassFile classfile , Menge paralist )
2014-03-27 15:43:07 +00:00
throws JVMCodeException
// ino.end
// ino.method.codegen.23277.body
{
classfile . set_constructor_founded ( true ) ;
classfile . add_method ( " <init> " , this . get_codegen_Param_Type ( paralist ) , this . getParameterList ( ) , null , get_Block ( ) , declid . firstElement ( ) . get_access_flags ( ) , paralist , false ) ;
}
// ino.end
}
* /