From 4e53375f74750923c0009c658af9d8d530752fa8 Mon Sep 17 00:00:00 2001 From: allenflux <26239570+allenflux@users.noreply.github.com> Date: Wed, 14 Oct 2026 11:05:35 +0700 Subject: [PATCH] Preserve Writer failures when a template starts at column zero Generated with OpenAI Codex --- .../handlebars/internal/BaseTemplate.java | 5 ++-- .../handlebars/internal/TemplateTest.java | 25 +++++++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/handlebars/src/main/java/com/github/jknack/handlebars/internal/BaseTemplate.java b/handlebars/src/main/java/com/github/jknack/handlebars/internal/BaseTemplate.java index 2909e066..c5c009ab 100644 --- a/handlebars/src/main/java/com/github/jknack/handlebars/internal/BaseTemplate.java +++ b/handlebars/src/main/java/com/github/jknack/handlebars/internal/BaseTemplate.java @@ -100,10 +100,11 @@ public void apply(final Context context, final Writer writer) throws IOException } catch (Exception ex) { String evidence = toString(); String reason = ex.toString(); - String message = filename + ":" + line + ":" + column + ": " + reason + "\n"; + int errorColumn = Math.max(1, column); + String message = filename + ":" + line + ":" + errorColumn + ": " + reason + "\n"; message += " " + join(split(evidence, "\n"), "\n "); HandlebarsError error = - new HandlebarsError(filename, line, column, reason, evidence, message); + new HandlebarsError(filename, line, errorColumn, reason, evidence, message); HandlebarsException hex = new HandlebarsException(error, ex); // Override the stack-trace hex.setStackTrace(ex.getStackTrace()); diff --git a/handlebars/src/test/java/com/github/jknack/handlebars/internal/TemplateTest.java b/handlebars/src/test/java/com/github/jknack/handlebars/internal/TemplateTest.java index 4c0dd18d..67ed24ee 100644 --- a/handlebars/src/test/java/com/github/jknack/handlebars/internal/TemplateTest.java +++ b/handlebars/src/test/java/com/github/jknack/handlebars/internal/TemplateTest.java @@ -6,8 +6,13 @@ package com.github.jknack.handlebars.internal; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertThrows; +import java.io.FilterWriter; import java.io.IOException; +import java.io.StringWriter; +import java.io.Writer; import java.util.Arrays; import java.util.HashSet; import java.util.List; @@ -17,6 +22,7 @@ import com.github.jknack.handlebars.AbstractTest; import com.github.jknack.handlebars.Handlebars; +import com.github.jknack.handlebars.HandlebarsException; import com.github.jknack.handlebars.TagType; import com.github.jknack.handlebars.Template; @@ -28,6 +34,25 @@ */ public class TemplateTest extends AbstractTest { + @Test + public void preservesWriterFailureAtStartOfLine() throws IOException { + IOException failure = new IOException("Unable to write template output"); + Writer writer = + new FilterWriter(new StringWriter()) { + @Override + public void write(String text, int offset, int length) throws IOException { + throw failure; + } + }; + Template template = newHandlebars().compileInline("Hello {{user}}."); + + HandlebarsException error = + assertThrows(HandlebarsException.class, () -> template.apply("", writer)); + + assertSame(failure, error.getCause()); + assertEquals(1, error.getError().column); + } + @Test public void simpleVarTests() throws IOException { assertVariables("{{v1}}", Arrays.asList("v1"));