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