// ino.module.NewClass.8642.package package de.dhbwstuttgart.syntaxtree.statement; // ino.end // ino.module.NewClass.8642.import import java.util.Enumeration; import java.util.Hashtable; import java.util.Iterator; import java.util.Vector; import de.dhbwstuttgart.logger.Logger; import de.dhbwstuttgart.bytecode.ClassFile; import de.dhbwstuttgart.bytecode.CodeAttribute; import de.dhbwstuttgart.bytecode.JVMCode; import de.dhbwstuttgart.myexception.CTypeReconstructionException; import de.dhbwstuttgart.myexception.JVMCodeException; import de.dhbwstuttgart.myexception.SCExcept; import de.dhbwstuttgart.myexception.SCStatementException; import de.dhbwstuttgart.syntaxtree.Class; import de.dhbwstuttgart.syntaxtree.SyntaxTreeNode; import de.dhbwstuttgart.syntaxtree.misc.UsedId; 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.FunN; import de.dhbwstuttgart.typeinference.JavaCodeResult; import de.dhbwstuttgart.typeinference.ResultSet; import de.dhbwstuttgart.typeinference.SingleConstraint; import de.dhbwstuttgart.typeinference.UndConstraint; import de.dhbwstuttgart.typeinference.assumptions.ConstructorAssumption; import de.dhbwstuttgart.typeinference.assumptions.TypeAssumptions; import de.dhbwstuttgart.typeinference.exceptions.TypeinferenceException; import de.dhbwstuttgart.typeinference.unify.CSubstitutionSet; // 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; // 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.codegen.25858.definition public void codegen(ClassFile classfile, CodeAttribute code, Vector paralist) throws JVMCodeException // ino.end // ino.method.codegen.25858.body { String class_name = this.get_UsedId().get_codegen_UsedId(); String arg; // Argumentliste verarbeiten if (arglist != null) { arg = arglist.get_codegen_ArgumentList(paralist); } else { arg = "()"; } code.add_code(JVMCode.new_); code.add_code_short(classfile.add_CONSTANT_Class_info(class_name)); code.add_code(JVMCode.dup); // Vor invokespecial die Parameter auf den Stack legen if (arglist != null) { // Die einzelnen Argumente generieren for (int i=0; i< arglist.expr.size(); i++) { arglist.expr.elementAt(i).codegen(classfile, code, paralist); } } code.add_code(JVMCode.invokespecial); code.add_code_short(classfile.add_method_ref(class_name, "", arg + "V")); } // 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(Vector paralist, Vector genericMethodParameters) // ino.end // ino.method.wandleRefTypeAttributes2GenericAttributes.25870.body { } // ino.end @Override public ConstraintsSet TYPEExpr(TypeAssumptions assumptions) { //TODO: Das hier noch vervollständigen ConstraintsSet ret = new ConstraintsSet(); UndConstraint callConstraints = new UndConstraint(); //Die Auskommentierten Zeilen gehören zu MethodRefNew //Vector argumentTypeList = new Vector(); //for(Expr expr : this.arglist.expr){ // argumentTypeList.add(expr.getTypeVariable()); //} //FunN funN= new FunN(null,argumentTypeList); //Constraint newClassTypeConstraint = new Constraint(null,null); //ret.add(newClassTypeConstraint); 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 MethodCall newAufruf = new MethodCall(0,0); this.setType(assumptions.getTypeFor(new RefType(this.get_Name(),0))); newAufruf.type = this.getType(); newAufruf.set_Name(""); newAufruf.set_Receiver(null); ret.add(new Overloading(assumptions, newAufruf, this.getType()).generateConsstraints()); */ return ret; } /** * Spezifikation: * TYPEStmt( Ass, stmt ) = * let (stmt : rty, ConS) = TYPEExpr( Ass, stmt ) * in (stmt : Void, ConS) */ @Override public ConstraintsSet TYPEStmt(TypeAssumptions assumptions){ ConstraintsSet ret = this.TYPEExpr(assumptions); //TypeExpr aufrufen this.setType(new Void(this,0)); //Typ des Statments auf Void setzen. return ret; } @Override public JavaCodeResult printJavaCode(ResultSet resultSet) { JavaCodeResult ret = new JavaCodeResult("new "); ret.attach(this.get_Name()); ret.attach("("); if(this.arglist!=null && this.arglist.expr != null){ Iterator 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 Vector getChildren() { Vector ret = new Vector(); if(this.arglist!=null)for(Expr e : this.arglist.expr){ ret.add(e); } return ret; } } // ino.end