JavaPatternMatching/src/mycompiler/myclass/Field.java

164 lines
4.4 KiB
Java
Raw Normal View History

2014-02-11 01:47:39 +00:00
package mycompiler.myclass;
import java.util.Vector;
import mycompiler.SyntaxTreeNode;
2014-02-11 01:47:39 +00:00
import mycompiler.mybytecode.ClassFile;
import mycompiler.myexception.JVMCodeException;
import mycompiler.mytype.GenericTypeVar;
import mycompiler.mytype.RefType;
2014-02-11 01:47:39 +00:00
import mycompiler.mytype.Type;
import mycompiler.mytype.TypePlaceholder;
2014-02-11 01:47:39 +00:00
import mycompiler.mytypereconstruction.replacementlistener.CReplaceTypeEvent;
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;
import typinferenz.Typeable;
2014-02-11 01:47:39 +00:00
import typinferenz.TypeInsertable;
import typinferenz.assumptions.TypeAssumptions;
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
private int offset;
private GenericDeclarationList genericParameters;
2014-02-11 01:47:39 +00:00
public Field(int offset){
this.offset = offset;
}
@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
public void setType(Type typ) {
2014-02-11 01:47:39 +00:00
this.typ = typ;
}
@Override
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() {
2014-07-16 16:38:55 +00:00
Vector<GenericTypeVar> ret = new Vector<>();
if(this.genericParameters == null)return ret;
ret.addAll(this.genericParameters);
return ret;
2014-07-16 08:33:34 +00:00
}
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
public abstract ConstraintsSet TYPE(TypeAssumptions publicAssumptions);
2014-02-19 04:20:54 +00:00
public String getIdentifier() {
return this.get_Name().firstElement().get_Name();
}
@Override
public String getDescription(){
return this.getIdentifier();
}
@Override
public TypeInsertPoint createTypeInsertPoint(TypePlaceholder tph,
ResultSet resultSet) {
return new TypeInsertPoint(this, resultSet.getTypeEqualTo(tph), resultSet);
}
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
*/
public void wandleRefTypeAttributes2GenericAttributes(Vector<Type> paralist){
// Zuerst Returntype untersuchen
Type type=getType();
Type pendantReturnType = null;
if(type instanceof RefType)pendantReturnType = ((RefType)type).findGenericType(paralist, new Vector<GenericTypeVar>());//GenericTypeVar pendantReturnType=ClassHelper.findGenericType(type, paralist,new Vector<GenericTypeVar>());
if(pendantReturnType!=null){ //Wenn generisch, dann modifizieren
setType(pendantReturnType);
}
}
public boolean isPublic() {
//TODO: momentan ist jedes Feld public!
return true;
}
@Override
public String getGenericVarDeclarationString(String genericVarDeclaration) {
if(this.genericParameters != null){
return ", "+genericVarDeclaration;
}else{
return "<"+genericVarDeclaration+">";
}
}
@Override
public int getGenericVarDeclarationOffset(){
// Falls Generische Parameterliste vorhanden, hier Wert der Liste zur<75>ckgegebn
if(this.genericParameters != null){
return this.genericParameters.getOffsetOfLastElement();
}else{
return this.offset;
}
}
@Override
public void setGenericParameter(GenericDeclarationList params) {
this.genericParameters = params;
}
2014-07-16 16:38:55 +00:00
2014-02-11 01:47:39 +00:00
}