You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by he...@apache.org on 2019/08/07 08:24:29 UTC
[commons-jexl] branch master updated: 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
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 <he...@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());
+ }
+ }
}