Author: cbrisson
Date: Sun Oct 14 21:51:28 2018
New Revision: 1843862

URL: http://svn.apache.org/viewvc?rev=1843862&view=rev
Log:
[VELOCITY-903] #foreach #else #end ready in the parser but not yet taken into 
account (tests do pass)

Modified:
    velocity/engine/trunk/velocity-engine-core/src/main/parser/Parser.jjt

Modified: velocity/engine/trunk/velocity-engine-core/src/main/parser/Parser.jjt
URL: 
http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/main/parser/Parser.jjt?rev=1843862&r1=1843861&r2=1843862&view=diff
==============================================================================
--- velocity/engine/trunk/velocity-engine-core/src/main/parser/Parser.jjt 
(original)
+++ velocity/engine/trunk/velocity-engine-core/src/main/parser/Parser.jjt Sun 
Oct 14 21:51:28 2018
@@ -85,6 +85,7 @@ import org.apache.velocity.exception.Vel
 import org.apache.velocity.runtime.RuntimeServices;
 import org.apache.velocity.runtime.parser.node.*;
 import org.apache.velocity.runtime.directive.Directive;
+import org.apache.velocity.runtime.directive.Foreach;
 import org.apache.velocity.runtime.directive.MacroParseException;
 import org.apache.velocity.runtime.RuntimeConstants;
 
@@ -1652,7 +1653,7 @@ void DirectiveAssign() : {}
  */
 boolean Directive() :
 {
-    Token id = null, t = null, u = null, end = null;
+    Token id = null, t = null, u = null, end = null, _else = null;
     int argType;
     int argPos = 0;
     Directive d;
@@ -1660,9 +1661,9 @@ boolean Directive() :
     boolean isVM = false;
     boolean isMacro = false;
     ArrayList argtypes = new ArrayList(4);
-    boolean newlineAtEnd = false, newlineBeforeStatement = false;
+    boolean afterNewline = false, newlineAtEnd = false;
     String blockPrefix = "";
-    ASTBlock block = null;
+    ASTBlock block = null, elseBlock = null;
 }
 {
     [
@@ -1805,7 +1806,7 @@ boolean Directive() :
           else
           {
               blockPrefix = (t == null ? u.image : t.image + u.image);
-              newlineBeforeStatement = true;
+              afterNewline = true;
           }
           t = u = null;
       }
@@ -1826,23 +1827,70 @@ boolean Directive() :
     (
       (
         (
-          LOOKAHEAD( { getToken(1).kind != END && ( !newlineBeforeStatement || 
getToken(1).kind != WHITESPACE || getToken(2).kind != END ) }) 
newlineBeforeStatement = Statement(newlineBeforeStatement)
+          LOOKAHEAD( { getToken(1).kind != END && getToken(1).kind != ELSE && 
( !afterNewline || getToken(1).kind != WHITESPACE || getToken(2).kind != END && 
getToken(2).kind != ELSE ) }) afterNewline = Statement(afterNewline)
         )*
         {
             block = jjtThis;
             block.setPrefix(blockPrefix);
+            blockPrefix = "";
         }
       )
       #Block
     )
     [
-      LOOKAHEAD( 1, { newlineBeforeStatement })
+      LOOKAHEAD( 1, { afterNewline })
       (t = <WHITESPACE>)
       {
           block.setPostfix(t.image);
           t = null;
       }
     ]
+    /*
+     *  then an optional #else for the #foreach directive
+     */
+    (
+      [
+        LOOKAHEAD( { d != null && (d instanceof Foreach) && getToken(1).kind 
== ELSE } )
+        (
+          (_else = <ELSE>)
+          (
+            [
+              LOOKAHEAD(2) ( [ ( t = <WHITESPACE> ) ] ( u = <NEWLINE> ) )
+              {
+                  jjtThis.setPrefix(t == null ? u.image : t.image + u.image);
+                  t = u = null;
+                  afterNewline = true;
+              }
+            ]
+            (
+              LOOKAHEAD( { getToken(1).kind != END && (!afterNewline || 
getToken(1).kind != WHITESPACE || getToken(2).kind != END) })
+              afterNewline = Statement(afterNewline)
+            )*
+            {
+                elseBlock = jjtThis;
+            }
+          )
+          #Block
+          {
+              int pos = _else.image.lastIndexOf('#');
+              if (pos > 0)
+              {
+                  block.setMorePostfix(_else.image.substring(0, pos));
+              }
+              block = elseBlock;
+          }
+        )
+      ]
+    )
+    [
+      LOOKAHEAD( 1, { afterNewline })
+      (t = <WHITESPACE>)
+      {
+          block.setPostfix(t.image);
+          t = null;
+          afterNewline = false;
+      }
+    ]
     (
       (end = <END>)
       [


Reply via email to