package me.august.lumen.compile; import me.august.lumen.common.TextualSnippet; import me.august.lumen.compile.codegen.BuildContext; import me.august.lumen.compile.scanner.pos.Span; import org.fusesource.jansi.Ansi; import java.util.HashMap; import java.util.Map; import static org.fusesource.jansi.Ansi.Attribute.*; import static org.fusesource.jansi.Ansi.Color.*; import static org.fusesource.jansi.Ansi.ansi; public class CompileBuildContext implements BuildContext { private static final int CLASS_VERSION = 51; private Map<Object, Span> positionMap = new HashMap<>(); private boolean cont = true; private String source; public CompileBuildContext(String source) { this.source = source; } public CompileBuildContext() {} @Override public int classVersion() { return CLASS_VERSION; } @Override public void error(String msg, boolean fatal, Object reference) { if (source == null || !positionMap.containsKey(reference)) { Ansi ansi = ansi().a(INTENSITY_BOLD).fg(RED).a("Error: " + msg).reset(); System.out.println(ansi); ansi = ansi().a(INTENSITY_BOLD).fg(RED).a("(Unknown location)").reset(); System.out.println(ansi); } else { Span span = positionMap.get(reference); TextualSnippet snippet = TextualSnippet.selectLines(source, span.getStart(), span.getEnd()); snippet.printError(msg); } System.exit(1); } @Override public boolean canContinue() { return cont; } @Override public void canContinue(boolean val) { cont = val; } @Override public Map<Object, Span> positionMap() { return positionMap; } }