package me.tomassetti.turin.parser.ast.expressions; import com.google.common.collect.ImmutableList; import me.tomassetti.turin.compiler.errorhandling.ErrorCollector; import me.tomassetti.turin.resolvers.SymbolResolver; import me.tomassetti.turin.parser.ast.Node; import me.tomassetti.turin.typesystem.TypeUsage; public class AssignmentExpression extends Expression { private Expression target; private Expression value; @Override public String toString() { return "AssignmentStatement{" + "target=" + target + ", value=" + value + '}'; } public AssignmentExpression(Expression target, Expression value) { this.target = target; this.target.setParent(this); this.value = value; this.value.setParent(this); } @Override protected boolean specificValidate(SymbolResolver resolver, ErrorCollector errorCollector) { if (!this.target.canBeAssigned(resolver)) { errorCollector.recordSemanticError(this.target.getPosition(), "Cannot be assigned"); return false; } return super.specificValidate(resolver, errorCollector); } public Expression getTarget() { return target; } public Expression getValue() { return value; } @Override public Iterable<Node> getChildren() { return ImmutableList.of(target, value); } @Override public TypeUsage calcType() { return getTarget().calcType(); } }