package me.tomassetti.turin.resolvers; import me.tomassetti.turin.parser.ast.Node; import java.util.IdentityHashMap; import java.util.Map; import java.util.Optional; public enum ResolverRegistry implements ResolverProvider { INSTANCE; public void record(Node node, SymbolResolver resolver) { if (!node.isRoot()) { throw new IllegalArgumentException(); } resolvers.put(node, resolver); } @Override public Optional<SymbolResolver> findResolver(Node node) { Node root = node.getRoot(); if (resolvers.containsKey(root)) { return Optional.of(resolvers.get(root)); } else { return Optional.empty(); } } @Override public SymbolResolver requireResolver(Node node) { Optional<SymbolResolver> or = findResolver(node); if (or.isPresent()) { return or.get(); } else { throw new IllegalStateException(node.toString()); } } private Map<Node, SymbolResolver> resolvers = new IdentityHashMap<>(); }