package main.nl.uva.parser.statement;
import main.nl.uva.parser.expression.Variable;
import main.nl.uva.ui.UI;
import main.nl.uva.ui.element.DeclarationUI;
import main.nl.uva.ui.element.UIElement;
import main.nl.uva.validation.ASTValidation;
import main.nl.uva.validation.Scope;
import main.nl.uva.validation.error.DuplicatedVariableError;
import main.nl.uva.validation.warning.DuplicateLabelWarning;
public class Declaration extends Statement {
protected final String _label;
protected final Variable _variable;
public Declaration(final Variable variable, final String function) {
super(variable.getLineInfo());
_label = function;
_variable = variable;
}
@Override
public ASTValidation validateAndCalculate(final Scope scope) {
ASTValidation valid = _variable.validateAndCalculate(scope);
if (scope.labelAlreadyDefined(_label)) {
valid.addWarning(new DuplicateLabelWarning(_label, scope.getFirstDeclarationForLabel(_label), getLineInfo()));
} else {
scope.defineLabel(_label, getLineInfo());
}
if (scope.variableAlreadyDefined(_variable.getName())) {
Variable original = scope.getVariable(_variable.getName());
valid.addError(new DuplicatedVariableError(original, getLineInfo()));
} else {
scope.defineVariable(_variable);
}
return valid;
}
@Override
public void removeYourselfFromScope(final Scope scope) {
scope.removeVariable(_variable);
scope.removeLabel(_label);
}
@Override
public UIElement getLayout(final UI parentUI) {
return new DeclarationUI(_variable, _label, parentUI);
}
@Override
public String toString() {
return _variable + " " + _label;
}
}