package de.dhbwstuttgart.syntaxtree; import org.apache.bcel.generic.ClassGen; import de.dhbwstuttgart.typeinference.Menge; import de.dhbwstuttgart.bytecode.ClassGenerator; 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.typeinference.ConstraintsSet; import de.dhbwstuttgart.typeinference.GenericTypeInsertable; import de.dhbwstuttgart.typeinference.JavaCodeResult; import de.dhbwstuttgart.typeinference.ResultSet; import de.dhbwstuttgart.typeinference.TypeInsertable; import de.dhbwstuttgart.typeinference.Typeable; import de.dhbwstuttgart.typeinference.TypeinferenceResultSet; import de.dhbwstuttgart.typeinference.assumptions.TypeAssumptions; import de.dhbwstuttgart.typeinference.typedeployment.TypeInsertPoint; public abstract class Field extends GTVDeclarationContext implements TypeInsertable, Typeable, Generic, GenericTypeInsertable{ private String name; protected Type typ; private GenericDeclarationList genericParameters; public Field(String name, Type type, int offset){ super(offset); this.name = name; this.typ = type; } @Override public void setOffset(int offset){ this.offset = offset; } @Override public int getOffset(){ return this.offset; } @Override public Type getType() { return typ; } @Override public Menge getGenericParameter() { Menge ret = new Menge<>(); if(this.genericParameters == null)return ret; ret.addAll(this.genericParameters.getGTVList()); return ret; } GenericDeclarationList getGenericDeclarationList(){ return this.genericParameters; } public abstract JavaCodeResult printJavaCode(ResultSet resultSet); /** * Diese Methode generiert die Assumptions für dieses Feld der Klasse classmember * @param classmember * @return */ public abstract TypeAssumptions createTypeAssumptions(Class classmember); public abstract ConstraintsSet TYPE(TypeAssumptions publicAssumptions); public String getIdentifier() { return name; } @Override public String getDescription(){ return this.getIdentifier(); } @Override public TypeInsertPoint createTypeInsertPoint(TypePlaceholder tph, ResultSet resultSet) { return new TypeInsertPoint(this, this, resultSet.getTypeEqualTo(tph), resultSet); } 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ückgegebn if(this.genericParameters != null){ return this.genericParameters.getEndOffset(); }else{ return this.offset; } } @Override public Menge getChildren() { Menge ret = new Menge<>(); if(this.getType()!=null)ret.add(this.getType()); ret.addAll(this.getGenericParameter()); return ret; } @Override public void setGenericParameter(GenericDeclarationList params) { this.genericParameters = params; } @Override public boolean isClass() { return false; } }