mirror of
https://github.com/apple/pkl.git
synced 2026-08-27 22:24:03 +02:00
Fix negative caret width rendering multi-line expression errors (#1793)
The expression preamble length was subtracted from endColumn even when endColumn came from the already-stripped sourceLine.length(), so multi-line frames got a negative caret width and String.repeat threw. Apply the offset only to the frame-derived columns. --------- Co-authored-by: Dan Chao <dan.chao@apple.com>
This commit is contained in:
@@ -128,17 +128,13 @@ public final class StackTraceRenderer {
|
|||||||
sourceLine = sourceLine.substring(PREAMBLE_LENGTH);
|
sourceLine = sourceLine.substring(PREAMBLE_LENGTH);
|
||||||
hasPreamble = true;
|
hasPreamble = true;
|
||||||
}
|
}
|
||||||
var startColumn = frame.getStartColumn() - leadingWhitespace;
|
var preambleOffset = hasPreamble ? PREAMBLE_LENGTH : 0;
|
||||||
|
var startColumn = frame.getStartColumn() - leadingWhitespace - preambleOffset;
|
||||||
var endColumn =
|
var endColumn =
|
||||||
frame.getStartLine() == frame.getEndLine()
|
frame.getStartLine() == frame.getEndLine()
|
||||||
? frame.getEndColumn() - leadingWhitespace
|
? frame.getEndColumn() - leadingWhitespace - preambleOffset
|
||||||
: sourceLine.length();
|
: sourceLine.length();
|
||||||
|
|
||||||
if (hasPreamble) {
|
|
||||||
startColumn -= PREAMBLE_LENGTH;
|
|
||||||
endColumn -= PREAMBLE_LENGTH;
|
|
||||||
}
|
|
||||||
|
|
||||||
var prefix = frame.getStartLine() + " | ";
|
var prefix = frame.getStartLine() + " | ";
|
||||||
out.append(AnsiTheme.STACK_TRACE_MARGIN, leftMargin)
|
out.append(AnsiTheme.STACK_TRACE_MARGIN, leftMargin)
|
||||||
.append(AnsiTheme.STACK_TRACE_LINE_NUMBER, prefix);
|
.append(AnsiTheme.STACK_TRACE_LINE_NUMBER, prefix);
|
||||||
|
|||||||
@@ -165,6 +165,40 @@ class EvaluateExpressionTest {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `evaluate throwing multi-line expression renders without crashing`() {
|
||||||
|
val error =
|
||||||
|
assertThrows<PklException> {
|
||||||
|
evaluate(
|
||||||
|
"x = 1",
|
||||||
|
"""
|
||||||
|
let (_a = 1)
|
||||||
|
let (_b = 2)
|
||||||
|
throw("boom")
|
||||||
|
"""
|
||||||
|
.trimIndent(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
assertThat(error.message)
|
||||||
|
.isEqualTo(
|
||||||
|
"""
|
||||||
|
–– Pkl Error ––
|
||||||
|
boom
|
||||||
|
|
||||||
|
3 | throw("boom")
|
||||||
|
^^^^^^^^^^^^^
|
||||||
|
at (repl:text)
|
||||||
|
|
||||||
|
1 | let (_a = 1)
|
||||||
|
^^^^^^^^^^^^
|
||||||
|
at repl:text.<let expr> (repl:text)
|
||||||
|
|
||||||
|
"""
|
||||||
|
.trimIndent()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `evaluate import`() {
|
fun `evaluate import`() {
|
||||||
val result = evaluate("import \"pkl:base\"", "base")
|
val result = evaluate("import \"pkl:base\"", "base")
|
||||||
|
|||||||
Reference in New Issue
Block a user