2014-02-11 01:47:39 +00:00
|
|
|
|
package mycompiler.myclass;
|
|
|
|
|
|
|
|
|
|
import java.util.Vector;
|
|
|
|
|
|
2014-02-11 15:30:38 +00:00
|
|
|
|
import mycompiler.SyntaxTreeNode;
|
2014-02-11 01:47:39 +00:00
|
|
|
|
import mycompiler.mybytecode.ClassFile;
|
|
|
|
|
import mycompiler.myexception.JVMCodeException;
|
2014-03-27 15:43:07 +00:00
|
|
|
|
import mycompiler.mytype.GenericTypeVar;
|
2014-04-14 16:05:24 +00:00
|
|
|
|
import mycompiler.mytype.RefType;
|
2014-02-11 01:47:39 +00:00
|
|
|
|
import mycompiler.mytype.Type;
|
2014-03-25 03:41:07 +00:00
|
|
|
|
import mycompiler.mytype.TypePlaceholder;
|
2014-02-11 01:47:39 +00:00
|
|
|
|
import mycompiler.mytypereconstruction.replacementlistener.CReplaceTypeEvent;
|
2014-02-12 21:10:33 +00:00
|
|
|
|
import typinferenz.ConstraintsSet;
|
2014-07-16 08:33:34 +00:00
|
|
|
|
import typinferenz.GenericTypeInsertable;
|
2014-02-11 01:47:39 +00:00
|
|
|
|
import typinferenz.JavaCodeResult;
|
|
|
|
|
import typinferenz.ResultSet;
|
2014-02-11 15:30:38 +00:00
|
|
|
|
import typinferenz.Typeable;
|
2014-02-11 01:47:39 +00:00
|
|
|
|
import typinferenz.TypeInsertable;
|
|
|
|
|
import typinferenz.assumptions.TypeAssumptions;
|
2014-06-19 17:40:13 +00:00
|
|
|
|
import typinferenz.typedeployment.TypeInsertPoint;
|
2014-02-11 01:47:39 +00:00
|
|
|
|
|
2014-07-16 08:33:34 +00:00
|
|
|
|
public abstract class Field extends SyntaxTreeNode implements TypeInsertable, Typeable, Generic, GenericTypeInsertable{
|
2014-02-12 01:12:12 +00:00
|
|
|
|
|
2014-02-11 01:47:39 +00:00
|
|
|
|
protected Vector<DeclId> declid = new Vector<DeclId>(); // Vector, da 'int a, b, c, ...' auch eingeparst werden muss
|
|
|
|
|
|
|
|
|
|
private Type typ;
|
2014-02-12 01:12:12 +00:00
|
|
|
|
|
2014-02-12 21:10:33 +00:00
|
|
|
|
private int offset;
|
2014-06-25 15:30:31 +00:00
|
|
|
|
|
|
|
|
|
private GenericDeclarationList genericParameters;
|
2014-02-11 01:47:39 +00:00
|
|
|
|
|
2014-03-09 11:10:03 +00:00
|
|
|
|
public Field(int offset){
|
|
|
|
|
this.offset = offset;
|
|
|
|
|
}
|
|
|
|
|
|
2014-02-12 21:10:33 +00:00
|
|
|
|
@Override
|
|
|
|
|
public void setOffset(int offset){
|
|
|
|
|
this.offset = offset;
|
|
|
|
|
}
|
|
|
|
|
@Override
|
|
|
|
|
public int getOffset(){
|
|
|
|
|
return this.offset;
|
|
|
|
|
}
|
|
|
|
|
|
2014-02-11 01:47:39 +00:00
|
|
|
|
@Override
|
2014-02-11 15:30:38 +00:00
|
|
|
|
public void setType(Type typ) {
|
2014-02-11 01:47:39 +00:00
|
|
|
|
this.typ = typ;
|
|
|
|
|
}
|
|
|
|
|
@Override
|
2014-02-11 15:30:38 +00:00
|
|
|
|
public Type getType() {
|
2014-02-11 01:47:39 +00:00
|
|
|
|
return typ;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public abstract void codegen(ClassFile classfile, Vector paralist)
|
|
|
|
|
throws JVMCodeException;
|
|
|
|
|
|
2014-07-16 08:33:34 +00:00
|
|
|
|
@Override
|
|
|
|
|
public Iterable<GenericTypeVar> getGenericParameter() {
|
|
|
|
|
if(this.genericParameters == null)return new Vector<GenericTypeVar>();
|
|
|
|
|
return this.genericParameters;
|
|
|
|
|
}
|
2014-02-11 01:47:39 +00:00
|
|
|
|
|
|
|
|
|
public void set_DeclId(DeclId did)
|
|
|
|
|
{
|
|
|
|
|
this.declid.addElement(did);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public Vector<DeclId> get_Name()
|
|
|
|
|
{
|
|
|
|
|
return declid;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public Vector<DeclId> getDeclIdVector()
|
|
|
|
|
{
|
|
|
|
|
// otth: ganzer Vektor zur<75>ckgeben, um ihn zu kopieren (vgl. MyCompiler - Konstruktor in Methode umwandeln)
|
|
|
|
|
return declid;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void setDeclIdVector( Vector<DeclId> vDeclId )
|
|
|
|
|
{
|
|
|
|
|
// otth: kompletter Vektor setzen, um ihn zu kopieren (vgl. MyCompiler - Konstruktor in Methode umwandeln)
|
|
|
|
|
declid = vDeclId;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public abstract JavaCodeResult printJavaCode(ResultSet resultSet);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Diese Methode generiert die Assumptions f<EFBFBD>r dieses Feld der Klasse classmember
|
|
|
|
|
* @param classmember
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
public abstract TypeAssumptions createTypeAssumptions(Class classmember);
|
2014-02-12 01:12:12 +00:00
|
|
|
|
|
2014-02-12 21:10:33 +00:00
|
|
|
|
public abstract ConstraintsSet TYPE(TypeAssumptions publicAssumptions);
|
2014-02-19 04:20:54 +00:00
|
|
|
|
|
|
|
|
|
public String getIdentifier() {
|
|
|
|
|
return this.get_Name().firstElement().get_Name();
|
|
|
|
|
}
|
2014-03-12 14:27:26 +00:00
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public String getDescription(){
|
|
|
|
|
return this.getIdentifier();
|
|
|
|
|
}
|
2014-03-25 03:41:07 +00:00
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public TypeInsertPoint createTypeInsertPoint(TypePlaceholder tph,
|
|
|
|
|
ResultSet resultSet) {
|
2014-04-16 14:02:16 +00:00
|
|
|
|
return new TypeInsertPoint(this, resultSet.getTypeEqualTo(tph), resultSet);
|
2014-03-25 03:41:07 +00:00
|
|
|
|
}
|
|
|
|
|
|
2014-04-09 12:12:55 +00:00
|
|
|
|
/**
|
|
|
|
|
* Wird im Zuge des ParserPostProcessing aufgerufen.
|
|
|
|
|
* Der Parser kann den Unterschied zwischen einem RefType und einer GTV nicht erkennen.
|
|
|
|
|
* Diese Methode ersetzt die RefTypes gegebenenfalls durch eine GTV.
|
|
|
|
|
* @param paralist
|
|
|
|
|
*/
|
2014-03-27 15:43:07 +00:00
|
|
|
|
public void wandleRefTypeAttributes2GenericAttributes(Vector<Type> paralist){
|
|
|
|
|
// Zuerst Returntype untersuchen
|
|
|
|
|
Type type=getType();
|
2014-04-14 16:05:24 +00:00
|
|
|
|
Type pendantReturnType = null;
|
|
|
|
|
if(type instanceof RefType)pendantReturnType = ((RefType)type).findGenericType(paralist, new Vector<GenericTypeVar>());//GenericTypeVar pendantReturnType=ClassHelper.findGenericType(type, paralist,new Vector<GenericTypeVar>());
|
2014-03-27 15:43:07 +00:00
|
|
|
|
if(pendantReturnType!=null){ //Wenn generisch, dann modifizieren
|
|
|
|
|
setType(pendantReturnType);
|
|
|
|
|
}
|
|
|
|
|
}
|
2014-04-14 16:05:24 +00:00
|
|
|
|
|
|
|
|
|
public boolean isPublic() {
|
|
|
|
|
//TODO: momentan ist jedes Feld public!
|
|
|
|
|
return true;
|
|
|
|
|
}
|
2014-05-07 06:10:55 +00:00
|
|
|
|
|
|
|
|
|
|
2014-06-25 15:30:31 +00:00
|
|
|
|
@Override
|
|
|
|
|
public int getGenericDeclOffset() {
|
|
|
|
|
//TODO: Falls Generische Parameterliste vorhanden, hier Wert der Liste zur<75>ckgegebn
|
2014-07-16 08:33:34 +00:00
|
|
|
|
return this.offset;
|
2014-06-25 15:30:31 +00:00
|
|
|
|
}
|
2014-05-07 06:10:55 +00:00
|
|
|
|
|
2014-06-25 15:30:31 +00:00
|
|
|
|
@Override
|
|
|
|
|
public void setGenericParameter(GenericDeclarationList params) {
|
|
|
|
|
this.genericParameters = params;
|
|
|
|
|
}
|
2014-02-11 01:47:39 +00:00
|
|
|
|
}
|