package scotch.compiler.syntax.util; import static scotch.compiler.syntax.type.Types.t; import static scotch.symbol.Symbol.unqualified; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; import scotch.compiler.syntax.type.VariableType; import scotch.symbol.Symbol; public class DefaultSymbolGenerator implements SymbolGenerator { private final Map<List<String>, AtomicInteger> counters; private int nextSymbol; private int nextType; public DefaultSymbolGenerator() { counters = new HashMap<>(); } @Override public Symbol reserveSymbol() { return unqualified(String.valueOf(nextSymbol++)); } @Override public Symbol reserveSymbol(List<String> nestings) { List<String> memberNames = new ArrayList<>(); memberNames.addAll(nestings); memberNames.add(String.valueOf(counters.computeIfAbsent(nestings, k -> new AtomicInteger()).getAndIncrement())); return unqualified(memberNames); } @Override public VariableType reserveType() { return t(nextType++); } @Override public void startTypesAt(int counter) { nextType = counter; } }