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 911180b  JEXL-307: template interpreter need lexical unit Task 
#JEXL-307 - Variable redeclaration option
911180b is described below

commit 911180be2e527cb42aa5839991ef0a5ada621d19
Author: Henri Biestro <hbies...@gmail.com>
AuthorDate: Fri Nov 1 16:03:24 2019 +0100

    JEXL-307: template interpreter need lexical unit
    Task #JEXL-307 - Variable redeclaration option
---
 .../jexl3/internal/TemplateInterpreter.java        | 26 +++++++++++++---------
 .../java/org/apache/commons/jexl3/LexicalTest.java | 20 +++++++++++++++++
 2 files changed, 36 insertions(+), 10 deletions(-)

diff --git 
a/src/main/java/org/apache/commons/jexl3/internal/TemplateInterpreter.java 
b/src/main/java/org/apache/commons/jexl3/internal/TemplateInterpreter.java
index f1ba7c0..295d900 100644
--- a/src/main/java/org/apache/commons/jexl3/internal/TemplateInterpreter.java
+++ b/src/main/java/org/apache/commons/jexl3/internal/TemplateInterpreter.java
@@ -142,7 +142,7 @@ public class TemplateInterpreter extends Interpreter {
         }
         return super.visit(node, data);
     }
-    
+
     @Override
     protected Object visit(ASTJexlScript node, Object data) {
         if (node instanceof ASTJexlLambda && !((ASTJexlLambda) 
node).isTopLevel()) {
@@ -153,15 +153,21 @@ public class TemplateInterpreter extends Interpreter {
                 }
             };
         }
-        // otherwise...
-        final int numChildren = node.jjtGetNumChildren();
-        Object result = null;
-        for (int i = 0; i < numChildren; i++) {
-            JexlNode child = node.jjtGetChild(i);
-            result = child.jjtAccept(this, data);
-            cancelCheck(child);
+        final LexicalScope lexical = block;
+        block = new LexicalScope(frame, null);
+        try {
+            // otherwise...
+            final int numChildren = node.jjtGetNumChildren();
+            Object result = null;
+            for (int i = 0; i < numChildren; i++) {
+                JexlNode child = node.jjtGetChild(i);
+                result = child.jjtAccept(this, data);
+                cancelCheck(child);
+            }
+            return result;
+        } finally {
+            block = lexical;
         }
-        return result;
     }
-    
+
 }
diff --git a/src/test/java/org/apache/commons/jexl3/LexicalTest.java 
b/src/test/java/org/apache/commons/jexl3/LexicalTest.java
index d14add0..686d65e 100644
--- a/src/test/java/org/apache/commons/jexl3/LexicalTest.java
+++ b/src/test/java/org/apache/commons/jexl3/LexicalTest.java
@@ -16,6 +16,8 @@
  */
 package org.apache.commons.jexl3;
 
+import java.io.StringReader;
+import java.io.StringWriter;
 import java.util.Set;
 import org.junit.Assert;
 import org.junit.Test;
@@ -248,4 +250,22 @@ public class LexicalTest {
         o = e.execute(jc);
         Assert.assertTrue(((Set)o).contains(1));
     }
+
+    @Test
+    public void testLexical4() throws Exception {
+        JexlEngine Jexl = new 
JexlBuilder().silent(false).strict(true).lexical(true).create();
+        JxltEngine Jxlt = Jexl.createJxltEngine();
+        JexlContext ctxt = new MapContext();
+        String rpt
+                = "<report>\n"
+                + "\n$$var y = 1; var x = 2;"
+                + "\n${x + y}"
+                + "\n</report>\n";
+        JxltEngine.Template t = Jxlt.createTemplate("$$", new 
StringReader(rpt));
+        StringWriter strw = new StringWriter();
+        t.evaluate(ctxt, strw);
+        String output = strw.toString();
+        String ctl = "<report>\n\n3\n</report>\n";
+        Assert.assertEquals(ctl, output);
+    }
 }

Reply via email to