This is an automated email from the ASF dual-hosted git repository. henrib pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-jexl.git
The following commit(s) were added to refs/heads/master by this push: new ca41392 JEXL-309: generate comment lines when replacing verbatims in templates to keep line number in sync Task #JEXL-309 - Line numbers are not correct when template generate errors ca41392 is described below commit ca41392409e8e1fb6760d4b452d728edb5a06c6f Author: henrib <hen...@apache.org> AuthorDate: Wed Aug 7 10:24:04 2019 +0200 JEXL-309: generate comment lines when replacing verbatims in templates to keep line number in sync Task #JEXL-309 - Line numbers are not correct when template generate errors --- RELEASE-NOTES.txt | 1 + .../commons/jexl3/internal/TemplateEngine.java | 2 +- .../commons/jexl3/internal/TemplateScript.java | 20 ++++++-- src/site/xdoc/changes.xml | 3 ++ .../org/apache/commons/jexl3/Issues300Test.java | 59 ++++++++++++++++++++++ 5 files changed, 81 insertions(+), 4 deletions(-) diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt index 58f0499..eeca54d 100644 --- a/RELEASE-NOTES.txt +++ b/RELEASE-NOTES.txt @@ -73,6 +73,7 @@ New Features in 3.2: Bugs Fixed in 3.2: ================== +* JEXL-309: Line numbers are not correct when template report errors * JEXL-306: Ternary operator ? protects also its branches from resolution errors * JEXL-305: Script debugger produces incorrect syntax * JEXL-304: Error parsing overview.limit.var diff --git a/src/main/java/org/apache/commons/jexl3/internal/TemplateEngine.java b/src/main/java/org/apache/commons/jexl3/internal/TemplateEngine.java index 076ba1d..43a3023 100644 --- a/src/main/java/org/apache/commons/jexl3/internal/TemplateEngine.java +++ b/src/main/java/org/apache/commons/jexl3/internal/TemplateEngine.java @@ -1077,7 +1077,7 @@ public final class TemplateEngine extends JxltEngine { BlockType type = null; int prefixLen; Iterator<CharSequence> lines = readLines(reader); - int lineno = 0; + int lineno = 1; int start = 0; while (lines.hasNext()) { CharSequence line = lines.next(); diff --git a/src/main/java/org/apache/commons/jexl3/internal/TemplateScript.java b/src/main/java/org/apache/commons/jexl3/internal/TemplateScript.java index 23ab623..9d6c7bc 100644 --- a/src/main/java/org/apache/commons/jexl3/internal/TemplateScript.java +++ b/src/main/java/org/apache/commons/jexl3/internal/TemplateScript.java @@ -77,18 +77,31 @@ public final class TemplateScript implements JxltEngine.Template { StringBuilder strb = new StringBuilder(); int nuexpr = 0; int codeStart = -1; + int line = 1; for (int b = 0; b < blocks.size(); ++b) { Block block = blocks.get(b); + int bl = block.getLine(); + while(line < bl) { + strb.append("//\n"); + line += 1; + } if (block.getType() == BlockType.VERBATIM) { strb.append("jexl:print("); strb.append(nuexpr++); strb.append(");\n"); + line += 1; } else { // keep track of first block of code, the frame creator if (codeStart < 0) { codeStart = b; } - strb.append(block.getBody()); + String body = block.getBody(); + strb.append(body); + for(int c = 0; c < body.length(); ++c) { + if (body.charAt(c) == '\n') { + line += 1; + } + } } } // create the script @@ -96,7 +109,7 @@ public final class TemplateScript implements JxltEngine.Template { info = jxlt.getEngine().createInfo(); } // allow lambda defining params - script = jxlt.getEngine().parse(info.at(0, 0), false, strb.toString(), scope).script(); + script = jxlt.getEngine().parse(info.at(1, 1), false, strb.toString(), scope).script(); scope = script.getScope(); // create the exprs using the code frame for those appearing after the first block of code for (int b = 0; b < blocks.size(); ++b) { @@ -104,7 +117,7 @@ public final class TemplateScript implements JxltEngine.Template { if (block.getType() == BlockType.VERBATIM) { uexprs.add( jxlt.parseExpression( - info.at(block.getLine(), 0), + info.at(block.getLine(), 1), block.getBody(), b > codeStart ? scope : null) ); @@ -164,6 +177,7 @@ public final class TemplateScript implements JxltEngine.Template { for (Block block : source) { if (block.getType() == BlockType.DIRECTIVE) { strb.append(prefix); + strb.append(block.getBody()); } else { exprs[e++].asString(strb); } diff --git a/src/site/xdoc/changes.xml b/src/site/xdoc/changes.xml index 800064e..7d7ffa6 100644 --- a/src/site/xdoc/changes.xml +++ b/src/site/xdoc/changes.xml @@ -26,6 +26,9 @@ </properties> <body> <release version="3.2" date="unreleased"> + <action dev="henrib" type="fix" issue="JEXL-309"> + Line numbers are not correct when template report errors + </action> <action dev="henrib" type="fix" issue="JEXL-306" due-to="Dmitri Blinov"> Ternary operator ? protects also its branches from resolution errors </action> diff --git a/src/test/java/org/apache/commons/jexl3/Issues300Test.java b/src/test/java/org/apache/commons/jexl3/Issues300Test.java index d91ea0c..527d124 100644 --- a/src/test/java/org/apache/commons/jexl3/Issues300Test.java +++ b/src/test/java/org/apache/commons/jexl3/Issues300Test.java @@ -175,4 +175,63 @@ public class Issues300Test { o = e.execute(null); Assert.assertEquals(2, o); } + + @Test + public void testIssue309a() throws Exception { + String src = "<html lang=\"en\">\n" + + " <body>\n" + + " <h1>Hello World!</h1>\n" + + "$$ var i = 12++;\n" + + " </body>\n" + + "</html>"; + JexlEngine jexl = new JexlBuilder().safe(true).create(); + JxltEngine jxlt = jexl.createJxltEngine(); + JexlInfo info = new JexlInfo("template", 1, 1); + try { + JxltEngine.Template tmplt = jxlt.createTemplate(info, src); + Assert.fail("shoud have thrown exception"); + } catch (JexlException.Parsing xerror) { + Assert.assertEquals(4, xerror.getInfo().getLine()); + } + } + + @Test + public void testIssue309b() throws Exception { + String src = "<html lang=\"en\">\n" + + " <body>\n" + + " <h1>Hello World!</h1>\n" + + "$$ var i = a b c;\n" + + " </body>\n" + + "</html>"; + JexlEngine jexl = new JexlBuilder().safe(true).create(); + JxltEngine jxlt = jexl.createJxltEngine(); + JexlInfo info = new JexlInfo("template", 1, 1); + try { + JxltEngine.Template tmplt = jxlt.createTemplate(info, src); + Assert.fail("shoud have thrown exception"); + } catch (JexlException.Parsing xerror) { + Assert.assertEquals(4, xerror.getInfo().getLine()); + } + } + + @Test + public void testIssue309c() throws Exception { + String src = "<html lang=\"en\">\n" + + " <body>\n" + + " <h1>Hello World!</h1>\n" + + "$$ var i =12;\n" + + " </body>\n" + + "</html>"; + JexlEngine jexl = new JexlBuilder().safe(true).create(); + JxltEngine jxlt = jexl.createJxltEngine(); + JexlInfo info = new JexlInfo("template", 1, 1); + try { + JxltEngine.Template tmplt = jxlt.createTemplate(info, src); + String src1 = tmplt.asString(); + String src2 = tmplt.toString(); + Assert.assertEquals(src1, src2); + } catch (JexlException.Parsing xerror) { + Assert.assertEquals(4, xerror.getInfo().getLine()); + } + } }