diff --git a/muscript/src/main/java/io/gitlab/jfronny/muscript/error/LocationalException.java b/muscript/src/main/java/io/gitlab/jfronny/muscript/error/LocationalException.java index bf17d0d..f4acc69 100644 --- a/muscript/src/main/java/io/gitlab/jfronny/muscript/error/LocationalException.java +++ b/muscript/src/main/java/io/gitlab/jfronny/muscript/error/LocationalException.java @@ -42,7 +42,7 @@ public class LocationalException extends RuntimeException { } public PrettyPrintError asPrintable() { - return PrettyPrintError.builder(location) + return (location.source() == null ? PrettyPrintError.builder() : PrettyPrintError.builder(location)) .setMessage(super.getMessage()) .setCallStack(callStack) .build(); diff --git a/muscript/src/main/java/io/gitlab/jfronny/muscript/error/PrettyPrintError.java b/muscript/src/main/java/io/gitlab/jfronny/muscript/error/PrettyPrintError.java index 036a603..9cceccd 100644 --- a/muscript/src/main/java/io/gitlab/jfronny/muscript/error/PrettyPrintError.java +++ b/muscript/src/main/java/io/gitlab/jfronny/muscript/error/PrettyPrintError.java @@ -10,10 +10,10 @@ import java.util.*; * Can be generated from a LocationalException with asPrintable * * @param message The error message - * @param start The location of the start of this error. Both it and its components must not be null. + * @param start The location of the start of this error. May be null. * @param end The location of the end of this error. May be null. */ -public record PrettyPrintError(String message, Location start, @Nullable Location end, List callStack) { +public record PrettyPrintError(String message, @Nullable Location start, @Nullable Location end, List callStack) { /** * A location in the source code * @@ -22,8 +22,8 @@ public record PrettyPrintError(String message, Location start, @Nullable Locatio * @param row The row of this line, starting with 1 */ public record Location(String line, int column, int row) { - public static Location create(String source, int index) { - if (index < 0) return new Location("", -1, -1); + public static Location create(@Nullable String source, int index) { + if (source == null || index < 0) return new Location("", -1, -1); int lineStart = source.lastIndexOf('\n', index); int lineEnd = source.indexOf('\n', index); if (lineEnd == -1) lineEnd = source.length(); @@ -56,7 +56,7 @@ public record PrettyPrintError(String message, Location start, @Nullable Locatio @Override public String toString() { StringBuilder sb = new StringBuilder(); - if (start.column < 0) sb.append("Error at unknown location: ").append(message); + if (start == null || start.column < 0) sb.append("Error at unknown location: ").append(message); else { sb.append("Error at ").append(start).append(": ").append(message).append("\n"); if (end == null) sb.append(start.prettyPrint()).append("Here"); @@ -96,12 +96,11 @@ public record PrettyPrintError(String message, Location start, @Nullable Locatio } public Builder setLocation(int chStart) { - return setLocation(Location.create(Objects.requireNonNull(source, "source is required to set location"), chStart), null); + return setLocation(Location.create(source, chStart), null); } public Builder setLocation(int chStart, int chEnd) { if (chEnd == chStart) return setLocation(chStart); - Objects.requireNonNull(source, "source is required to set location"); if (chEnd < chStart) { int a = chEnd; chEnd = chStart; @@ -120,7 +119,7 @@ public record PrettyPrintError(String message, Location start, @Nullable Locatio this.callStack = callStack.stream() .map(frame -> frame instanceof StackFrame.Lined lined ? lined - : ((StackFrame.Raw) frame).lined(Objects.requireNonNull(source, "source is required to set call stack"))) + : source == null ? frame : ((StackFrame.Raw) frame).lined(source)) .toList(); return this; }