package openmods.calc.parsing;
import com.google.common.collect.Maps;
import java.util.List;
import java.util.Map;
import openmods.utils.CollectionUtils;
public class MappedCompilerState<E> implements ICompilerState<E> {
private final IAstParser<E> parser;
private final Map<String, ISymbolCallStateTransition<E>> symbolTransitions = Maps.newHashMap();
private final Map<String, IModifierStateTransition<E>> modifierTransitions = Maps.newHashMap();
public MappedCompilerState(IAstParser<E> parser) {
this.parser = parser;
}
@Override
public IAstParser<E> getParser() {
return parser;
}
@Override
public ISymbolCallStateTransition<E> getStateForSymbolCall(String symbol) {
final ISymbolCallStateTransition<E> stateTransition = symbolTransitions.get(symbol);
return stateTransition != null? stateTransition : createDefaultSymbolCallStateTransition(symbol);
}
protected ISymbolCallStateTransition<E> createDefaultSymbolCallStateTransition(final String symbol) {
return new ISymbolCallStateTransition<E>() {
@Override
public ICompilerState<E> getState() {
return MappedCompilerState.this;
}
@Override
public IExprNode<E> createRootNode(List<IExprNode<E>> children) {
return createDefaultSymbolNode(symbol, children);
}
};
}
protected IExprNode<E> createDefaultSymbolNode(String symbol, List<IExprNode<E>> children) {
return new SymbolCallNode<E>(symbol, children);
}
@Override
public IModifierStateTransition<E> getStateForModifier(String modifier) {
final IModifierStateTransition<E> stateTransition = modifierTransitions.get(modifier);
return stateTransition != null? stateTransition : createDefaultModifierStateTransition(modifier);
}
private IModifierStateTransition<E> createDefaultModifierStateTransition(String modifier) {
throw new UnsupportedOperationException(modifier);
}
public MappedCompilerState<E> addStateTransition(String symbol, ISymbolCallStateTransition<E> transition) {
CollectionUtils.putOnce(symbolTransitions, symbol, transition);
return this;
}
public MappedCompilerState<E> addStateTransition(String symbol, IModifierStateTransition<E> transition) {
CollectionUtils.putOnce(modifierTransitions, symbol, transition);
return this;
}
}