package main.nl.uva.parser.expression;
import main.nl.uva.parser.Line;
import main.nl.uva.ui.element.DeclarationUI;
import main.nl.uva.ui.types.ValueUI;
import main.nl.uva.validation.ASTValidation;
import main.nl.uva.validation.Scope;
import main.nl.uva.validation.error.InvalidTypeError;
import main.nl.uva.validation.type.Value;
public class Variable extends Expression implements ExpressionChangeListener {
private final Value.Type _type;
private final String _name;
private Expression _expression;
public Variable(final Value.Type type, final String name, final Expression expression, final Line lineInfo) {
super(lineInfo);
_type = type;
_name = name;
_expression = expression;
_expression.registerListener(this);
}
public Variable(final Value.Type type, final String name, final Line lineInfo) {
this(type, name, type.getAtom(), lineInfo);
}
public boolean setExpression(final Expression newExpression) {
if (!newExpression.getValue().isTypeOf(_type)) {
// Type is not acceptable
return false;
}
_expression = newExpression;
_expression.registerListener(this);
return true;
}
@Override
public ASTValidation validateAndCalculate(final Scope scope) {
ASTValidation valid = _expression.validateAndCalculate(scope);
if (!_expression.getValue().isTypeOf(_type)) {
valid.addError(new InvalidTypeError(this.toString(), getLineInfo()));
}
return valid;
}
public String getName() {
return _name;
}
@Override
public Value getValue() {
return _expression.getValue();
}
public ValueUI getUserInterfaceRepresentation(final DeclarationUI parent) {
return _expression.getValue().getLayout(parent);
}
@Override
public String toString() {
return _name;
}
@Override
public void onChange() {
notifyListenersAboutValueChange();
}
}