JavaPatternMatching/src/de/dhbwstuttgart/syntaxtree/Constructor.java

484 lines
12 KiB
Java
Raw Normal View History

2014-09-02 08:33:54 +00:00
package de.dhbwstuttgart.syntaxtree;
2013-10-18 11:33:46 +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
import de.dhbwstuttgart.typeinference.Menge;
2014-09-04 14:35:44 +00:00
import de.dhbwstuttgart.myexception.JVMCodeException;
import de.dhbwstuttgart.parser.JavaClassName;
2014-09-02 08:33:54 +00:00
import de.dhbwstuttgart.syntaxtree.misc.DeclId;
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;
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;
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;
import de.dhbwstuttgart.typeinference.typedeployment.TypeInsertPoint;
import de.dhbwstuttgart.typeinference.typedeployment.TypeInsertSet;
import de.dhbwstuttgart.syntaxtree.type.Void;
2014-02-19 04:20:54 +00:00
public class Constructor extends Method {
private Method methode;
2013-10-18 11:33:46 +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.
*/
public Constructor(Method methode){
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;
}
@Override
public void genByteCode(ClassGen cg) {
ConstantPoolGen _cp = cg.getConstantPool();
//InstructionFactory _factory = new InstructionFactory(cg, _cp);
InstructionList il = new InstructionList();
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.
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
//il.dispose();
}
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
@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
@Override
public ConstraintsSet TYPE(TypeAssumptions ass) {
//super.setType(this.getParentClass().getType());
super.setType(new Void(this, 0));
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);
//this.methode.setType(t);
}
2015-06-16 09:55:15 +00:00
/*public Constructor(Method methode){
super(methode.getOffset());
this.methode = methode;
this.setDeclIdMenge(methode.getDeclIdMenge());
this.methode.setType(this.methode.getParentClass().getType());
2015-06-16 09:55:15 +00:00
}*/
2014-02-19 04:20:54 +00:00
@Override
public Menge<GenericTypeVar> getGenericParameter() {
return this.methode.getGenericParameter();
}
2014-02-19 04:20:54 +00:00
@Override
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
}
2014-02-19 04:20:54 +00:00
@Override
public String getGenericVarDeclarationString(String genericVarDeclaration) {
return this.methode.getGenericVarDeclarationString(genericVarDeclaration);
2014-02-19 04:20:54 +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
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
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
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
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
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();
}
@Override
public boolean equals(Object obj) {
return this.methode.equals(obj);
}
@Override
public void set_DeclId(DeclId did) {
this.methode.set_DeclId(did);
}
@Override
public Menge<DeclId> get_Name() {
return this.methode.get_Name();
}
@Override
public Menge<DeclId> getDeclIdMenge() {
return this.methode.getDeclIdMenge();
}
@Override
public void setDeclIdMenge(Menge<DeclId> vDeclId) {
this.methode.setDeclIdMenge(vDeclId);
}
@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
}
/*
// 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
public String get_codegen_Param_Type(Menge paralist)
// 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
public void codegen(ClassFile classfile, Menge paralist)
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
}
*/