From 38e5ed333eb78a33b0dc8514610a3dfd03cf9af0 Mon Sep 17 00:00:00 2001 From: Peter Menhart Date: Mon, 21 Oct 2019 20:16:16 -0400 Subject: [PATCH 1/2] Improved description of parsing errors * ANTLRErrorListener callbacks from Lexer and Parser provide information about the error in parameter 'msg'. * RecognitionException message often contains additional details that are worth including as a 'cause'. Example: Template.parse("Invalid {{end bracket} }") liqp.exceptions.LiquidException: lexer error "token recognition error at: '}'" on line 1, index 23 Cause: LexerNoViableAltException('}') --- src/main/java/liqp/Template.java | 4 ++-- src/main/java/liqp/exceptions/LiquidException.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/liqp/Template.java b/src/main/java/liqp/Template.java index bdbd6f23..eaa2671f 100644 --- a/src/main/java/liqp/Template.java +++ b/src/main/java/liqp/Template.java @@ -154,7 +154,7 @@ private ParseTree parse(LiquidLexer lexer) { lexer.addErrorListener(new BaseErrorListener(){ @Override public void syntaxError(Recognizer recognizer, Object offendingSymbol, int line, int charPositionInLine, String msg, RecognitionException e) { - throw new LiquidException(String.format("lexer error on line %s, index %s", line, charPositionInLine), line, charPositionInLine); + throw new LiquidException(String.format("lexer error \"%s\" on line %s, index %s", msg, line, charPositionInLine), line, charPositionInLine, e); } }); @@ -166,7 +166,7 @@ public void syntaxError(Recognizer recognizer, Object offendingSymbol, int parser.addErrorListener(new BaseErrorListener(){ @Override public void syntaxError(Recognizer recognizer, Object offendingSymbol, int line, int charPositionInLine, String msg, RecognitionException e) { - throw new LiquidException(String.format("parser error on line %s, index %s", line, charPositionInLine), line, charPositionInLine); + throw new LiquidException(String.format("parser error \"%s\" on line %s, index %s", msg, line, charPositionInLine), line, charPositionInLine, e); } }); diff --git a/src/main/java/liqp/exceptions/LiquidException.java b/src/main/java/liqp/exceptions/LiquidException.java index a9487b26..b9a0e8aa 100644 --- a/src/main/java/liqp/exceptions/LiquidException.java +++ b/src/main/java/liqp/exceptions/LiquidException.java @@ -27,8 +27,8 @@ public LiquidException(String message, ParserRuleContext ctx) { this.charPositionInLine = ctx.start.getCharPositionInLine(); } - public LiquidException(String message, int line, int charPositionInLine) { - super(message); + public LiquidException(String message, int line, int charPositionInLine, Throwable cause) { + super(message, cause); this.line = line; this.charPositionInLine = charPositionInLine; } From 6b34dc5ef18e87183659e0188afc524ff730d543 Mon Sep 17 00:00:00 2001 From: Peter Menhart Date: Mon, 21 Oct 2019 20:21:52 -0400 Subject: [PATCH 2/2] Simplified render exceptions * Most errors result in a RuntimeException, there is no need to wrap them in another RuntimeException. --- src/main/java/liqp/Template.java | 6 +++++- src/test/java/liqp/tags/IncludeTest.java | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/liqp/Template.java b/src/main/java/liqp/Template.java index eaa2671f..c6f979b7 100644 --- a/src/main/java/liqp/Template.java +++ b/src/main/java/liqp/Template.java @@ -403,7 +403,11 @@ public String renderUnguarded(final Map variables) { return rendered == null ? "" : String.valueOf(rendered); } catch (Exception e) { - throw new RuntimeException(e); + if (e instanceof RuntimeException) { + throw e; + } else { + throw new RuntimeException(e); + } } } diff --git a/src/test/java/liqp/tags/IncludeTest.java b/src/test/java/liqp/tags/IncludeTest.java index 7a028db4..d5eac32d 100644 --- a/src/test/java/liqp/tags/IncludeTest.java +++ b/src/test/java/liqp/tags/IncludeTest.java @@ -134,7 +134,7 @@ public void renderTestWithIncludeSubdirectorySpecifiedInLiquidFlavorWithStrictVa @Test public void renderTestWithIncludeSubdirectorySpecifiedInLiquidFlavorWithStrictVariablesException() throws Exception { - thrown.expectCause(new NestedCauseMatcher<>(isA(VariableNotExistException.class))); + thrown.expectCause(isA(VariableNotExistException.class)); File index = new File("src/test/jekyll/index_with_variables.html"); Template template = Template.parse(