package com.form.language.ast.expression.variable; import com.form.language.ast.expression.Expression; import com.form.language.ast.type.ErrorType; import com.form.language.ast.type.Type; import com.form.language.ast.values.GenericValue; import com.form.language.issue.Error; import com.form.language.issue.QLToken; import com.form.language.memory.Context; public class Reference extends Expression { private ReferenceName name; public Reference(String value, QLToken tokenInfo) { super(tokenInfo); this.name = new ReferenceName(value); } public String getName() { return name.getValue(); } @Override public GenericValue evaluate(Context context) { return context.getValue(name.getValue()); } @Override public Type getType(Context context) { return getTypeFromMemory(context); } private Type getTypeFromMemory(Context context) { Type typeFromMemory = context.getIdType(this); if (typeFromMemory == null) { context.addError(new Error(tokenInfo, "Undeclared variable reference")); return new ErrorType(); } else { return typeFromMemory; } } @Override public void collectIds(ReferenceCollection referenceCollection) { referenceCollection.addId(this); } }