// ino.module.NewClass.8642.package package de.dhbwstuttgart.syntaxtree.statement; import java.util.ArrayList; // ino.end // ino.module.NewClass.8642.import import java.util.Enumeration; import java.util.Hashtable; import java.util.Iterator; import java.util.List; import org.apache.bcel.Constants; import org.apache.bcel.generic.ClassGen; import org.apache.bcel.generic.InstructionConstants; import org.apache.bcel.generic.InstructionList; import org.apache.bcel.generic.ObjectType; import de.dhbwstuttgart.typeinference.Menge; import de.dhbwstuttgart.bytecode.ClassGenerator; import de.dhbwstuttgart.logger.Logger; import de.dhbwstuttgart.syntaxtree.Class; import de.dhbwstuttgart.syntaxtree.ParameterList; import de.dhbwstuttgart.syntaxtree.SyntaxTreeNode; import de.dhbwstuttgart.syntaxtree.misc.UsedId; import de.dhbwstuttgart.syntaxtree.type.FunN; import de.dhbwstuttgart.syntaxtree.type.GenericTypeVar; import de.dhbwstuttgart.syntaxtree.type.RefType; import de.dhbwstuttgart.syntaxtree.type.Type; import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder; import de.dhbwstuttgart.syntaxtree.type.Void; import de.dhbwstuttgart.typeinference.ConstraintsSet; import de.dhbwstuttgart.typeinference.JavaCodeResult; import de.dhbwstuttgart.typeinference.ResultSet; import de.dhbwstuttgart.typeinference.TypeinferenceResultSet; import de.dhbwstuttgart.typeinference.UndConstraint; import de.dhbwstuttgart.typeinference.assumptions.ConstructorAssumption; import de.dhbwstuttgart.typeinference.assumptions.TypeAssumptions; import de.dhbwstuttgart.typeinference.exceptions.TypeinferenceException; // ino.class.NewClass.25830.declaration public class NewClass extends Expr // ino.end // ino.class.NewClass.25830.body { // ino.method.NewClass.25834.definition public NewClass(int offset,int variableLength) // ino.end // ino.method.NewClass.25834.body { super(offset,variableLength); } // ino.end // ino.attribute.arglist.25837.declaration private ArgumentList arglist; private boolean isStatement = false; private List parameterList = new ArrayList<>(); // ino.end // ino.attribute.parserlog.25840.declaration protected static Logger parserlog = Logger.getLogger("parser"); // ino.end // ino.method.getArgumentList.25843.definition public ArgumentList getArgumentList() // ino.end // ino.method.getArgumentList.25843.body { return this.arglist; } // ino.end // ino.method.get_Name.25846.definition public String get_Name() // ino.end // ino.method.get_Name.25846.body { return this.usedid.get_Name_1Element(); } // ino.end // ino.method.set_UsedId.25849.definition public void set_UsedId( UsedId t) // ino.end // ino.method.set_UsedId.25849.body { this.usedid = t; } // ino.end // ino.method.set_ArgumentList.25855.definition public void set_ArgumentList(ArgumentList al) // ino.end // ino.method.set_ArgumentList.25855.body { this.arglist = al; } // ino.end // ino.method.toString.25867.defdescription type=javadoc /** *
Author: Martin Pl�micke * @return */ // ino.end // ino.method.toString.25867.definition public String toString() // ino.end // ino.method.toString.25867.body { String ret = "NEW "; Type thisType = getType(); if(thisType != null)ret += thisType.toString(); else ret += this.get_Name(); return ret; } // ino.end // ino.method.wandleRefTypeAttributes2GenericAttributes.25870.definition public void wandleRefTypeAttributes2GenericAttributes(Menge paralist, Menge genericMethodParameters) // ino.end // ino.method.wandleRefTypeAttributes2GenericAttributes.25870.body { } // ino.end @Override public ConstraintsSet TYPEExpr(TypeAssumptions assumptions) { ConstraintsSet ret = new ConstraintsSet(); UndConstraint callConstraints = new UndConstraint(); int numArgs = 0; if(this.arglist != null)numArgs = this.arglist.size(); ConstructorAssumption cA = assumptions.getConstructorAssumption(this.get_Name(), numArgs); if(cA == null)throw new TypeinferenceException("Der Konstruktor "+this.get_Name()+" mit "+numArgs+" Parametern ist nicht vorhanden.", this); for(int i=0; i it = this.arglist.expr.iterator(); while(it.hasNext()){ Expr arg = it.next(); ret.attach(arg.printJavaCode(resultSet)); if(it.hasNext())ret.attach(", "); } //ret = ret.substring(0, ret.length()-2); } ret.attach(")"); return ret; } @Override public Menge getChildren() { Menge ret = new Menge(); if(this.arglist!=null)for(Expr e : this.arglist.expr){ ret.add(e); } return ret; } @Override public InstructionList genByteCode(ClassGenerator _cg, TypeinferenceResultSet rs) { InstructionList il = new InstructionList(); //il.append(_cg.getInstructionFactory().createNew(get_Name())); il.append(_cg.getInstructionFactory().createNew(this.getType().getBytecodeType(_cg, rs).toString())); il.append(InstructionConstants.DUP); String signature = getType().getBytecodeSignature(_cg, rs); String description = signature.substring(1, signature.length()-1); if(arglist!=null){ il.append(arglist.generateBytecode(_cg, rs)); il.append(_cg.getInstructionFactory().createInvoke(description, "", org.apache.bcel.generic.Type.VOID, this.arglist.getBytecodeTypeList(_cg, rs), Constants.INVOKESPECIAL)); }else{ il.append(_cg.getInstructionFactory().createInvoke(description, "", org.apache.bcel.generic.Type.VOID, new org.apache.bcel.generic.Type[]{}, Constants.INVOKESPECIAL)); } if(this.isStatement){ il.append(InstructionConstants.POP); } return il; } } // ino.end