package me.tomassetti.turin.parser.ast.statements;
import com.google.common.collect.ImmutableList;
import me.tomassetti.turin.compiler.errorhandling.ErrorCollector;
import me.tomassetti.turin.definitions.ContextDefinition;
import me.tomassetti.turin.parser.ast.Node;
import me.tomassetti.turin.parser.ast.expressions.Expression;
import me.tomassetti.turin.resolvers.SymbolResolver;
import me.tomassetti.turin.symbols.Symbol;
import java.util.Collections;
import java.util.Optional;
public class ContextAssignment extends Node {
private String contextName;
private Expression contextValue;
private Optional<ContextDefinition> contextSymbol;
public ContextAssignment(String contextName, Expression contextValue) {
this.contextName = contextName;
this.contextValue = contextValue;
this.contextValue.setParent(this);
}
public Optional<ContextDefinition> contextSymbol() {
if (contextSymbol == null) {
contextSymbol = symbolResolver().findContextSymbol(contextName, this);
}
return contextSymbol;
}
@Override
protected boolean specificValidate(SymbolResolver resolver, ErrorCollector errorCollector) {
Optional<ContextDefinition> contextSymbolOptional = resolver.findContextSymbol(contextName, this);
if (!contextSymbolOptional.isPresent()) {
errorCollector.recordSemanticError(getPosition(), "Context "+ contextName + " cannot be resolved");
return false;
}
return super.specificValidate(resolver, errorCollector);
}
public Expression getContextValue() {
return contextValue;
}
@Override
public Iterable<Node> getChildren() {
return ImmutableList.of(contextValue);
}
}