package scotch.compiler.parser; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.antlr.v4.runtime.ParserRuleContext; import scotch.compiler.parser.ScotchParser.ModuleContext; import scotch.compiler.parser.ScotchParser.ModulesContext; public class ModulesMapper { public Map<String, List<ModuleContext>> map(List<? extends ParserRuleContext> ctx) { return new State().map(ctx); } private final class State extends ScotchParserBaseVisitor<Void> { private final Map<String, List<ModuleContext>> moduleMap; public State() { moduleMap = new HashMap<>(); } public Map<String, List<ModuleContext>> map(List<? extends ParserRuleContext> ctxs) { ctxs.forEach(ctx -> ctx.accept(this)); return moduleMap; } @Override public Void visitModule(ModuleContext ctx) { moduleMap.computeIfAbsent(ctx.moduleName().getText(), k -> new ArrayList<>()).add(ctx); return null; } @Override public Void visitModules(ModulesContext ctx) { ctx.module().forEach(module -> module.accept(this)); return null; } @Override protected Void defaultResult() { return null; } } }