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());
+        }
+    }
 }