package edu.ucsd.arcum.interpreter.ast; import static edu.ucsd.arcum.util.Accessor.getFunction; import java.util.List; import com.google.common.base.Function; import edu.ucsd.arcum.interpreter.query.EntityType; public class FormalParameter { // EXAMPLE: Good example of auto-generated code: it drops out of any getter public static final Function<FormalParameter, String> getIdentifier = new Function<FormalParameter, String>() { @Override public String apply(FormalParameter formal) { return formal.getIdentifier(); } }; public static final Function<FormalParameter, String> getIdentifier2 = getFunction(FormalParameter.class, String.class, "getIdentifier"); public static final Function<FormalParameter, EntityType> getType = new Function<FormalParameter, EntityType>() { @Override public EntityType apply(FormalParameter formal) { return formal.getType(); } }; private EntityType type; private String identifier; private List<FormalParameter> traitArguments; // EXAMPLE: InternalField private Object defaultBody; // EXAMPLE: InternalField public FormalParameter(EntityType type, String identifier) { this.type = type; this.identifier = identifier; } @Override public String toString() { return type.toString() + " " + identifier; } @Override public boolean equals(Object other) { if (other == null || other.getClass() != this.getClass()) { return false; } else { FormalParameter param = (FormalParameter)other; return type.equals(param.type) && identifier.equals(param.identifier); } } @Override public int hashCode() { return type.hashCode() * 31 + identifier.hashCode(); } public String getIdentifier() { return identifier; } public EntityType getType() { return type; } public static int findIndex(List<FormalParameter> params, String variable) { int len = params.size(); for (int i = 0; i < len; ++i) { FormalParameter param = params.get(i); if (param.getIdentifier().equals(variable)) { return i; } } return -1; } public void addTraitArguments(List<FormalParameter> traitArguments) { this.traitArguments = traitArguments; } public boolean isSubTrait() { return traitArguments != null; } // EXAMPLE: For the future: be sure that this is called only in contexts where // isSubTrait has returned true public List<FormalParameter> getTraitArguments() { return traitArguments; } // Either a ConstraintExpression or a String public void addDefaultValue(Object defaultBody) { this.defaultBody = defaultBody; } public TraitSignature getSubTraitType() { TraitSignature result = TraitSignature.makeStaticDefinition(identifier, traitArguments.toArray(new FormalParameter[0])); return result; } }