package com.github.forax.smartass.ast; import java.util.HashMap; import java.util.Objects; import java.util.function.BiConsumer; public class VoidVisitor<E> { private final HashMap<Class<?>, BiConsumer<Expr, ? super E>> consumerMap = new HashMap<>(); @SuppressWarnings("unchecked") public <T extends Expr> VoidVisitor<E> when(Class<T> type, BiConsumer<? super T, ? super E> function) { consumerMap.put(type, (BiConsumer<Expr,? super E>)function); return this; } public void visit(Expr expr, E env) { Objects.requireNonNull(expr, "expr is null"); Objects.requireNonNull(env, "env is null"); Class<? extends Expr> type = expr.getClass(); BiConsumer<Expr, ? super E> biConsumer = consumerMap.get(type); if (biConsumer == null) { throw new IllegalStateException("no method visit for " + type.getName()); } biConsumer.accept(expr, env); } }