JavaPatternMatching/src/de/dhbwstuttgart/syntaxtree/statement/SuperCall.java

104 lines
4.0 KiB
Java
Raw Normal View History

2015-02-26 16:41:29 +00:00
// ino.module.This.8654.package
package de.dhbwstuttgart.syntaxtree.statement;
// ino.end
// ino.module.This.8654.import
import java.util.Hashtable;
2015-06-17 10:03:54 +00:00
import org.apache.bcel.Constants;
import org.apache.bcel.generic.ClassGen;
import org.apache.bcel.generic.InstructionFactory;
import org.apache.bcel.generic.InstructionHandle;
import org.apache.bcel.generic.InstructionList;
import de.dhbwstuttgart.typeinference.Menge;
2015-02-26 16:41:29 +00:00
import de.dhbwstuttgart.logger.Logger;
import de.dhbwstuttgart.myexception.CTypeReconstructionException;
import de.dhbwstuttgart.myexception.JVMCodeException;
import de.dhbwstuttgart.myexception.SCStatementException;
import de.dhbwstuttgart.syntaxtree.Class;
import de.dhbwstuttgart.syntaxtree.Constructor;
import de.dhbwstuttgart.syntaxtree.SyntaxTreeNode;
import de.dhbwstuttgart.syntaxtree.misc.ConstructorCall;
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.Void;
import de.dhbwstuttgart.typeinference.ConstraintsSet;
import de.dhbwstuttgart.typeinference.JavaCodeResult;
import de.dhbwstuttgart.typeinference.ResultSet;
import de.dhbwstuttgart.typeinference.assumptions.ConstructorAssumption;
import de.dhbwstuttgart.typeinference.assumptions.TypeAssumptions;
import de.dhbwstuttgart.typeinference.exceptions.TypeinferenceException;
import de.dhbwstuttgart.typeinference.unify.CSubstitutionSet;
2015-02-26 16:46:04 +00:00
public class SuperCall extends ThisCall
2015-02-26 16:41:29 +00:00
{
public SuperCall(int offset,int variableLength)
{
super(offset,variableLength);
}
public SuperCall(SyntaxTreeNode parent){
this(0,0);
this.parent = parent;
}
@Override
public ConstraintsSet TYPEExpr(TypeAssumptions assumptions) {
2015-02-26 16:46:04 +00:00
throw new TypeinferenceException("super(...)-Aufruf kann nicht als Ausdruck verwendet werden",this);
2015-02-26 16:41:29 +00:00
}
/**
* This kann auch als Konstruktoraufruf in einem Konstruktor-Block vorkommen.
*/
@Override
public ConstraintsSet TYPEStmt(TypeAssumptions assumptions) {
String className = this.getParentClass().getSuperClass().getName().toString();
ConstraintsSet ret = new ConstraintsSet();
this.setType(new Void(this,this.getOffset()));
//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 ConstructorCall(new Receiver(new This(this)), className, arglist, this.getOffset());
ret.add(constructorCall.TYPEStmt(assumptions));
return ret;
}else{
//Ansonsten Fehler ausgeben:
throw new TypeinferenceException("super()-Aufruf hier nicht möglich", this);
2015-02-26 16:41:29 +00:00
}
}
public String toString()
{
//return receiver/*.toString()*/ + " " + usedid.toString();
return "(" + "super" +"(" + this.getArgumentList() + "))";
}
@Override
public JavaCodeResult printJavaCode(ResultSet resultSet) {
String argList = "";
if(this.getArgumentList() != null)argList = this.getArgumentList().printJavaCode(resultSet).getJavaCode();
return new JavaCodeResult("super("+argList+")");
2015-06-17 10:03:54 +00:00
}
@Override
public InstructionList genByteCode(ClassGen cg) {
InstructionFactory _factory = new InstructionFactory(cg, cg.getConstantPool());
InstructionList il = new InstructionList();
Type superClass = this.getParentClass().getSuperClass();
//Instructionhandle dynamisch
InstructionHandle ih_0 = il.append(_factory.createLoad(org.apache.bcel.generic.Type.OBJECT, 0));
il.append(_factory.createInvoke(superClass.getName().toString(), "<init>", org.apache.bcel.generic.Type.VOID, org.apache.bcel.generic.Type.NO_ARGS, Constants.INVOKESPECIAL));
InstructionHandle ih_4 = il.append(_factory.createReturn(org.apache.bcel.generic.Type.VOID));
return il;
2015-02-26 16:46:04 +00:00
}
2015-02-26 16:41:29 +00:00
}