Author: cbrisson
Date: Sat Dec 28 12:17:30 2019
New Revision: 1872050

URL: http://svn.apache.org/viewvc?rev=1872050&view=rev
Log:
[engine] Fix VELOCITY-904 again

Modified:
    
velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/directive/VelocimacroProxy.java
    
velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/ASTStringLiteral.java
    
velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/issues/Velocity904TestCase.java

Modified: 
velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/directive/VelocimacroProxy.java
URL: 
http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/directive/VelocimacroProxy.java?rev=1872050&r1=1872049&r2=1872050&view=diff
==============================================================================
--- 
velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/directive/VelocimacroProxy.java
 (original)
+++ 
velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/directive/VelocimacroProxy.java
 Sat Dec 28 12:17:30 2019
@@ -26,6 +26,10 @@ import org.apache.velocity.runtime.Rende
 import org.apache.velocity.runtime.RuntimeConstants;
 import org.apache.velocity.runtime.RuntimeServices;
 import org.apache.velocity.runtime.directive.Macro.MacroArg;
+import org.apache.velocity.runtime.parser.node.ASTMap;
+import org.apache.velocity.runtime.parser.node.ASTObjectArray;
+import org.apache.velocity.runtime.parser.node.ASTReference;
+import org.apache.velocity.runtime.parser.node.ASTStringLiteral;
 import org.apache.velocity.runtime.parser.node.Node;
 import org.apache.velocity.runtime.parser.node.SimpleNode;
 import org.apache.velocity.util.StringUtils;
@@ -266,10 +270,13 @@ public class VelocimacroProxy extends Di
                 {
                     /* allow for nested calls */
                     Deque<String> literalsStack = 
(Deque<String>)context.get(literalArgArray[i]);
-                    literalsStack.removeFirst();
-                    if (literalsStack.size() == 0)
+                    if (literalsStack != null) /* may be null if argument was 
missing in macro call */
                     {
-                        context.remove(literalArgArray[i]);
+                        literalsStack.removeFirst();
+                        if (literalsStack.size() == 0)
+                        {
+                            context.remove(literalArgArray[i]);
+                        }
                     }
                 }
             }
@@ -410,7 +417,15 @@ public class VelocimacroProxy extends Di
                     literalsStack = new LinkedList();
                     context.put(literalArgArray[i], literalsStack);
                 }
-                literalsStack.addFirst(argNode.literal());
+                /* Reflects the strange 1.7 behavor... */
+                if (argNode instanceof ASTReference || argNode instanceof 
ASTStringLiteral || argNode instanceof ASTObjectArray || argNode instanceof 
ASTMap)
+                {
+                    literalsStack.addFirst(argNode.literal());
+                }
+                else
+                {
+                    literalsStack.addFirst('$' + macroArg.name);
+                }
             }
         }
 

Modified: 
velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/ASTStringLiteral.java
URL: 
http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/ASTStringLiteral.java?rev=1872050&r1=1872049&r2=1872050&view=diff
==============================================================================
--- 
velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/ASTStringLiteral.java
 (original)
+++ 
velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/ASTStringLiteral.java
 Sat Dec 28 12:17:30 2019
@@ -104,6 +104,11 @@ public class ASTStringLiteral extends Si
          */
         String img = getFirstToken().image;
 
+        /*
+          the literal string *should* contain enclosing quotes
+         */
+        literal = img;
+
         image = img.substring(1, img.length() - 1);
 
         if (img.startsWith("\""))
@@ -166,11 +171,6 @@ public class ASTStringLiteral extends Si
         return data;
     }
 
-    public String literal()
-    {
-       return image;
-    }
-
     /**
      * Adjust all the line and column numbers that comprise a node so that they
      * are corrected for the string literals position within the template file.

Modified: 
velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/issues/Velocity904TestCase.java
URL: 
http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/issues/Velocity904TestCase.java?rev=1872050&r1=1872049&r2=1872050&view=diff
==============================================================================
--- 
velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/issues/Velocity904TestCase.java
 (original)
+++ 
velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/issues/Velocity904TestCase.java
 Sat Dec 28 12:17:30 2019
@@ -68,4 +68,29 @@ public class Velocity904TestCase extends
         assertEvalEquals("$param$param2$param", "#macro(macro1 
$return)$return#macro2($param2)$return#end#macro(macro2 
$return)$return#end#macro1($param)");
     }
 
+    public void testNoArgNoPreserve()
+    {
+        assertEvalEquals("","#macro(testMacro $param)#end#testMacro()");
+    }
+
+    public void testNoArgPreserve()
+    {
+        assertEvalEquals("","#macro(testMacro $param)#end#testMacro()");
+    }
+
+    public void testConstantSetToNullNoPreserve()
+    {
+        assertEvalEquals("$input", "#macro(mymacro $input)#set($input = 
$null)$input#end#mymacro('string-value')");
+        assertEvalEquals("$input", "#macro(mymacro $input)#set($input = 
$null)$input#end#mymacro(\"interpolated-$bar-value\")");
+        assertEvalEquals("$input", "#macro(mymacro $input)#set($input = 
$null)$input#end#mymacro(true)");
+        assertEvalEquals("$input", "#macro(mymacro $input)#set($input = 
$null)$input#end#mymacro(4.5)");
+    }
+
+    public void testConstantSetToNullPreserve()
+    {
+        assertEvalEquals("'string-value'", "#macro(mymacro $input)#set($input 
= $null)$input#end#mymacro('string-value')");
+        assertEvalEquals("\"interpolated-$bar-value\"", "#macro(mymacro 
$input)#set($input = $null)$input#end#mymacro(\"interpolated-$bar-value\")");
+        assertEvalEquals("$input", "#macro(mymacro $input)#set($input = 
$null)$input#end#mymacro(true)");
+        assertEvalEquals("$input", "#macro(mymacro $input)#set($input = 
$null)$input#end#mymacro(4.5)");
+    }
 }


Reply via email to