2013-10-18 11:33:46 +00:00
|
|
|
|
// ino.module.Interface.8582.package
|
|
|
|
|
package mycompiler.myinterface;
|
|
|
|
|
// ino.end
|
|
|
|
|
|
|
|
|
|
// ino.module.Interface.8582.import
|
|
|
|
|
import java.util.Vector;
|
|
|
|
|
import mycompiler.AClassOrInterface;
|
|
|
|
|
import mycompiler.mybytecode.ClassFile;
|
|
|
|
|
import mycompiler.myclass.ClassHelper;
|
|
|
|
|
import mycompiler.myclass.Constant;
|
|
|
|
|
import mycompiler.myclass.FormalParameter;
|
|
|
|
|
import mycompiler.myclass.Method;
|
|
|
|
|
import mycompiler.myclass.ParameterList;
|
|
|
|
|
import mycompiler.myexception.JVMCodeException;
|
|
|
|
|
import mycompiler.mymodifier.Modifiers;
|
|
|
|
|
import mycompiler.mytype.GenericTypeVar;
|
|
|
|
|
import mycompiler.mytype.RefType;
|
|
|
|
|
import mycompiler.mytype.Type;
|
|
|
|
|
import mycompiler.mytypereconstruction.CIntersectionType;
|
2014-02-09 15:07:31 +00:00
|
|
|
|
import mycompiler.mytypereconstruction.TypeinferenceResultSet;
|
2013-10-18 11:33:46 +00:00
|
|
|
|
import mycompiler.mytypereconstruction.set.CTypeAssumptionSet;
|
|
|
|
|
import mycompiler.mytypereconstruction.typeassumption.CInstVarTypeAssumption;
|
|
|
|
|
import mycompiler.mytypereconstruction.typeassumption.CMethodTypeAssumption;
|
|
|
|
|
import mycompiler.mytypereconstruction.typeassumption.CParaTypeAssumption;
|
|
|
|
|
import mycompiler.SourceFile;
|
|
|
|
|
// ino.end
|
|
|
|
|
|
|
|
|
|
// ino.class.Interface.23932.description type=javadoc
|
|
|
|
|
/**
|
|
|
|
|
* Die Klasse stellt die Definition eines Interfaces dar.
|
|
|
|
|
* @author SCJU
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
// ino.end
|
|
|
|
|
// ino.class.Interface.23932.declaration
|
|
|
|
|
public class Interface extends AClassOrInterface
|
|
|
|
|
// ino.end
|
|
|
|
|
// ino.class.Interface.23932.body
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
// ino.attribute.ib.23936.declaration
|
|
|
|
|
private InterfaceBody ib;
|
|
|
|
|
// ino.end
|
|
|
|
|
|
|
|
|
|
// ino.attribute.paralist.23939.decldescription type=line
|
|
|
|
|
// HOTI 29. Apr 06
|
|
|
|
|
// ino.end
|
|
|
|
|
// ino.attribute.paralist.23939.declaration
|
|
|
|
|
private Vector<Type> paralist = new Vector<Type>(); // Parameterliste 'interface xy<para1, para2,...>{}' wird gespeichert
|
|
|
|
|
// ino.end
|
|
|
|
|
|
|
|
|
|
// ino.attribute.containedTypes.23942.declaration
|
|
|
|
|
private Vector<Type> containedTypes;
|
|
|
|
|
// ino.end
|
|
|
|
|
|
|
|
|
|
// ino.method.Interface.23945.defdescription type=line
|
|
|
|
|
// Konstruktoren
|
|
|
|
|
// ino.end
|
|
|
|
|
// ino.method.Interface.23945.definition
|
|
|
|
|
public Interface()
|
|
|
|
|
// ino.end
|
|
|
|
|
// ino.method.Interface.23945.body
|
|
|
|
|
{
|
|
|
|
|
super();
|
|
|
|
|
}
|
|
|
|
|
// ino.end
|
|
|
|
|
|
|
|
|
|
// ino.method.Interface.23948.definition
|
|
|
|
|
public Interface(String name)
|
|
|
|
|
// ino.end
|
|
|
|
|
// ino.method.Interface.23948.body
|
|
|
|
|
{
|
|
|
|
|
super(name);
|
|
|
|
|
}
|
|
|
|
|
// ino.end
|
|
|
|
|
|
|
|
|
|
// ino.method.Interface.23951.definition
|
|
|
|
|
public Interface(String name, Modifiers mod)
|
|
|
|
|
// ino.end
|
|
|
|
|
// ino.method.Interface.23951.body
|
|
|
|
|
{
|
|
|
|
|
super(name, mod);
|
|
|
|
|
}
|
|
|
|
|
// ino.end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// ino.method.getParaList.23954.defdescription type=block
|
|
|
|
|
/*public Vector<Type> complete_paralist(boolean ext)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
Diese Funktion vervollt<EFBFBD>ndigt die Parameterliste f<EFBFBD>r vererbte Klassen
|
|
|
|
|
Vector<Type> child = paralist;
|
|
|
|
|
|
|
|
|
|
paralist = (Vector<Type>)superclassid.get_ParaList();
|
|
|
|
|
|
|
|
|
|
for(Enumeration<Type> e = child.elements();e.hasMoreElements();){
|
|
|
|
|
paralist.addElement(e.nextElement());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return this.paralist;
|
|
|
|
|
}*/
|
|
|
|
|
// ino.end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// ino.method.getParaList.23954.definition
|
|
|
|
|
public Vector<Type> getParaList()
|
|
|
|
|
// ino.end
|
|
|
|
|
// ino.method.getParaList.23954.body
|
|
|
|
|
{
|
|
|
|
|
return this.paralist;
|
|
|
|
|
}
|
|
|
|
|
// ino.end
|
|
|
|
|
// ino.method.setParaList.23957.definition
|
|
|
|
|
public void setParaList(Vector<Type> paralist)
|
|
|
|
|
// ino.end
|
|
|
|
|
// ino.method.setParaList.23957.body
|
|
|
|
|
{
|
|
|
|
|
this.paralist=paralist;
|
|
|
|
|
}
|
|
|
|
|
// ino.end
|
|
|
|
|
// ino.method.setContainedTypes.23960.definition
|
|
|
|
|
public void setContainedTypes(Vector<Type> containedTypes)
|
|
|
|
|
// ino.end
|
|
|
|
|
// ino.method.setContainedTypes.23960.body
|
|
|
|
|
{
|
|
|
|
|
this.containedTypes = containedTypes;
|
|
|
|
|
}
|
|
|
|
|
// ino.end
|
|
|
|
|
|
|
|
|
|
// ino.method.getContainedTypes.23963.definition
|
|
|
|
|
public Vector<Type> getContainedTypes()
|
|
|
|
|
// ino.end
|
|
|
|
|
// ino.method.getContainedTypes.23963.body
|
|
|
|
|
{
|
|
|
|
|
return containedTypes;
|
|
|
|
|
}
|
|
|
|
|
// ino.end
|
|
|
|
|
|
|
|
|
|
// ino.method.codegen.23966.definition
|
|
|
|
|
public void codegen(SourceFile sf)
|
|
|
|
|
throws JVMCodeException
|
|
|
|
|
// ino.end
|
|
|
|
|
// ino.method.codegen.23966.body
|
|
|
|
|
{
|
|
|
|
|
codegenlog.info("Definierte Superinterfaces: " + getSuperInterfaces().size());
|
|
|
|
|
codegenlog.debug("Liste der Interfaces: " + getSuperInterfaces().toString());
|
|
|
|
|
codegenlog.info("Definierte Konstanten: " + ib.getConstantVektor().size());
|
|
|
|
|
codegenlog.info("Definierte Methoden: " + ib.getMethodVektor().size());
|
|
|
|
|
|
|
|
|
|
// Erzeugen einer Classfile auf Basis des Interfaces
|
|
|
|
|
ClassFile classfile = new ClassFile(this, sf);
|
|
|
|
|
|
|
|
|
|
// Handling fuer Generics
|
|
|
|
|
classfile.addGenerics(paralist, null, getSuperInterfaces());
|
|
|
|
|
|
|
|
|
|
// Handling fuer Superinterfaces
|
|
|
|
|
classfile.addSuperInterfaces(getSuperInterfaces());
|
|
|
|
|
|
|
|
|
|
// Codegen fuer Interface-Body
|
|
|
|
|
Vector<Type> paralist = new Vector<Type>();
|
|
|
|
|
if(ib != null) ib.codegen(classfile, paralist);
|
|
|
|
|
|
|
|
|
|
classfile.codegen();
|
|
|
|
|
|
|
|
|
|
codegenlog.info("Compilierung erfolgreich abgeschlossen, "+ getName() + ".class erstellt.");
|
|
|
|
|
}
|
|
|
|
|
// ino.end
|
|
|
|
|
|
|
|
|
|
// ino.method.getInterfaceBody.23969.definition
|
|
|
|
|
public InterfaceBody getInterfaceBody()
|
|
|
|
|
// ino.end
|
|
|
|
|
// ino.method.getInterfaceBody.23969.body
|
|
|
|
|
{
|
|
|
|
|
return ib;
|
|
|
|
|
}
|
|
|
|
|
// ino.end
|
|
|
|
|
|
|
|
|
|
// ino.method.setInterfaceBody.23972.definition
|
|
|
|
|
public void setInterfaceBody(InterfaceBody ib)
|
|
|
|
|
// ino.end
|
|
|
|
|
// ino.method.setInterfaceBody.23972.body
|
|
|
|
|
{
|
|
|
|
|
this.ib = ib;
|
|
|
|
|
}
|
|
|
|
|
// ino.end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// ino.end
|
|
|
|
|
// ino.method.isAGenericType.23978.definition
|
|
|
|
|
public boolean isAGenericType(RefType type)
|
|
|
|
|
// ino.end
|
|
|
|
|
// ino.method.isAGenericType.23978.body
|
|
|
|
|
{
|
|
|
|
|
if(paralist==null)
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
for(int i=0;i<paralist.size();i++){
|
|
|
|
|
if(paralist.get(i) instanceof GenericTypeVar){
|
|
|
|
|
GenericTypeVar gtv=(GenericTypeVar)paralist.get(i);
|
|
|
|
|
if(gtv.getName().equals(type.getName())){
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return(false);
|
|
|
|
|
}
|
|
|
|
|
// ino.end
|
|
|
|
|
// ino.method.wandleRefTypeAttributes2GenericAttributes.23981.defdescription type=javadoc
|
|
|
|
|
/**
|
|
|
|
|
* Alle RefTypes, die hier im Interface definiert sind
|
|
|
|
|
* bspw: E doSomething()
|
|
|
|
|
* und eigentlich Generics sind werden zu generics gewandelt
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
// ino.end
|
|
|
|
|
// ino.method.wandleRefTypeAttributes2GenericAttributes.23981.definition
|
|
|
|
|
public void wandleRefTypeAttributes2GenericAttributes()
|
|
|
|
|
// ino.end
|
|
|
|
|
// ino.method.wandleRefTypeAttributes2GenericAttributes.23981.body
|
|
|
|
|
{
|
|
|
|
|
if(ib==null)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
Vector<Method> methods=ib.MethodVektor;
|
|
|
|
|
|
|
|
|
|
// Alle Methoden durchgehen
|
|
|
|
|
for(int i=0;i<methods.size();i++){
|
|
|
|
|
|
|
|
|
|
Method method=methods.get(i);
|
|
|
|
|
method.wandleRefTypeAttributes2GenericAttributes(paralist);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for(int i=0;i<ib.ConstantVektor.size();i++){
|
|
|
|
|
Constant instVar=(Constant)ib.ConstantVektor.get(i);
|
|
|
|
|
Type type=instVar.getType();
|
|
|
|
|
// Nur wenn es sich um ein RefType-Field handelt
|
|
|
|
|
if(type instanceof RefType){
|
|
|
|
|
GenericTypeVar pendant=ClassHelper.findGenericType(type,paralist,null);
|
|
|
|
|
if(pendant!=null){ //Wenn generisch, dann modifizieren
|
|
|
|
|
instVar.setType(pendant);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// ino.end
|
|
|
|
|
}
|
|
|
|
|
// ino.end
|