Author: markt
Date: Tue Jul 16 20:01:47 2013
New Revision: 1503857

URL: http://svn.apache.org/r1503857
Log:
Fix handling of nested lambda expressions with method parameters.
Removed:
    tomcat/trunk/java/org/apache/el/parser/AstLambdaExpressionOrInvocation.java
Modified:
    tomcat/trunk/java/javax/el/LambdaExpression.java
    tomcat/trunk/java/org/apache/el/parser/AstLambdaExpression.java
    tomcat/trunk/java/org/apache/el/parser/ELParser.java
    tomcat/trunk/java/org/apache/el/parser/ELParser.jjt
    tomcat/trunk/java/org/apache/el/parser/ELParserTreeConstants.java
    tomcat/trunk/test/org/apache/el/parser/TestAstLambdaExpression.java

Modified: tomcat/trunk/java/javax/el/LambdaExpression.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/javax/el/LambdaExpression.java?rev=1503857&r1=1503856&r2=1503857&view=diff
==============================================================================
--- tomcat/trunk/java/javax/el/LambdaExpression.java (original)
+++ tomcat/trunk/java/javax/el/LambdaExpression.java Tue Jul 16 20:01:47 2013
@@ -24,12 +24,14 @@ public class LambdaExpression {
 
     private final List<String> formalParameters;
     private final ValueExpression expression;
+    private final Map<String,Object> nestedArguments = new HashMap<>();
     private ELContext context = null;
 
     public LambdaExpression(List<String> formalParameters,
             ValueExpression expression) {
         this.formalParameters = formalParameters;
         this.expression = expression;
+
     }
 
     public void setELContext(ELContext context) {
@@ -62,7 +64,10 @@ public class LambdaExpression {
         }
 
         // Build the argument map
+        // Start with the arguments from any outer expressions so if there is
+        // any overlap the local arguments have priority
         Map<String,Object> lambdaArguments = new HashMap<>();
+        lambdaArguments.putAll(nestedArguments);
         for (int i = 0; i < formalParamCount; i++) {
             lambdaArguments.put(formalParameters.get(i), args[i]);
         }
@@ -70,7 +75,14 @@ public class LambdaExpression {
         context.enterLambdaScope(lambdaArguments);
 
         try {
-            return expression.getValue(context);
+            Object result = expression.getValue(context);
+            // Make arguments from this expression available to any nested
+            // expression
+            if (result instanceof LambdaExpression) {
+                ((LambdaExpression) result).nestedArguments.putAll(
+                        lambdaArguments);
+            }
+            return result;
         } finally {
             context.exitLambdaScope();
         }

Modified: tomcat/trunk/java/org/apache/el/parser/AstLambdaExpression.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/el/parser/AstLambdaExpression.java?rev=1503857&r1=1503856&r2=1503857&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/el/parser/AstLambdaExpression.java (original)
+++ tomcat/trunk/java/org/apache/el/parser/AstLambdaExpression.java Tue Jul 16 
20:01:47 2013
@@ -35,11 +35,15 @@ public class AstLambdaExpression extends
     @Override
     public Object getValue(EvaluationContext ctx) throws ELException {
 
-        // Two children - the formal parameters and the expression
+        // First child is always parameters even if there aren't any
         AstLambdaParameters formalParametersNode =
                 (AstLambdaParameters) children[0];
         Node[] formalParamNodes = formalParametersNode.children;
 
+        // Second child is a value expression
+        ValueExpressionImpl ve = new ValueExpressionImpl("", children[1],
+                ctx.getFunctionMapper(), ctx.getVariableMapper(), null);
+
         // Build a LambdaExpression
         List<String> formalParameters = new ArrayList<>();
         if (formalParamNodes != null) {
@@ -47,30 +51,29 @@ public class AstLambdaExpression extends
                 formalParameters.add(formalParamNode.getImage());
             }
         }
-
-        ValueExpressionImpl ve = new ValueExpressionImpl("", children[1],
-                ctx.getFunctionMapper(), ctx.getVariableMapper(), null);
         LambdaExpression le = new LambdaExpression(formalParameters, ve);
         le.setELContext(ctx);
 
         if (formalParameters.isEmpty()) {
-            // No formal parameters - should be able to simply invoke this
+            // No formal parameters - invoke the expression
             return le.invoke(ctx, (Object[]) null);
-        } else {
-            // Has parameters but they aren't provided so return the
-            // LambdaExpression
-            return le;
         }
-    }
 
-    @Override
-    public Object invoke(EvaluationContext ctx, Class<?>[] paramTypes,
-            Object[] paramValues) throws ELException {
-
-        Object result = getValue(ctx);
+        // If there are method parameters, need to invoke the expression with
+        // those parameters. If there are multiple method parameters there
+        // should be that many nested expressions.
+        // If there are more nested expressions that parameters this will 
return
+        // a LambdaExpression
+        Object result = le;
+        int i = 2;
+        while (result instanceof LambdaExpression && i < jjtGetNumChildren()) {
+            result = ((LambdaExpression) result).invoke(
+                    ((AstMethodParameters) children[i]).getParameters(ctx));
+            i++;
+        }
 
-        if (result instanceof LambdaExpression) {
-            result = ((LambdaExpression) result).invoke(ctx, paramValues);
+        if (i < jjtGetNumChildren()) {
+            throw new ELException();
         }
 
         return result;

Modified: tomcat/trunk/java/org/apache/el/parser/ELParser.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/el/parser/ELParser.java?rev=1503857&r1=1503856&r2=1503857&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/el/parser/ELParser.java (original)
+++ tomcat/trunk/java/org/apache/el/parser/ELParser.java Tue Jul 16 20:01:47 
2013
@@ -410,13 +410,40 @@ public class ELParser/*@bgen(jjtree)*/im
  * being bracketed does not mean it is an invocation.
  */
   final public void LambdaExpressionOrInvocation() throws ParseException {
-                                                                     
/*@bgen(jjtree) LambdaExpressionOrInvocation */
-  AstLambdaExpressionOrInvocation jjtn000 = new 
AstLambdaExpressionOrInvocation(JJTLAMBDAEXPRESSIONORINVOCATION);
+                                                         /*@bgen(jjtree) 
LambdaExpression */
+  AstLambdaExpression jjtn000 = new AstLambdaExpression(JJTLAMBDAEXPRESSION);
   boolean jjtc000 = true;
   jjtree.openNodeScope(jjtn000);
     try {
       jj_consume_token(LPAREN);
-      LambdaExpression();
+      LambdaParameters();
+      jj_consume_token(ARROW);
+      if (jj_2_4(3)) {
+        LambdaExpression();
+      } else {
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case START_SET_OR_MAP:
+        case INTEGER_LITERAL:
+        case FLOATING_POINT_LITERAL:
+        case STRING_LITERAL:
+        case TRUE:
+        case FALSE:
+        case NULL:
+        case LPAREN:
+        case LBRACK:
+        case NOT0:
+        case NOT1:
+        case EMPTY:
+        case MINUS:
+        case IDENTIFIER:
+          Choice();
+          break;
+        default:
+          jj_la1[8] = jj_gen;
+          jj_consume_token(-1);
+          throw new ParseException();
+        }
+      }
       jj_consume_token(RPAREN);
       label_5:
       while (true) {
@@ -425,7 +452,7 @@ public class ELParser/*@bgen(jjtree)*/im
           ;
           break;
         default:
-          jj_la1[8] = jj_gen;
+          jj_la1[9] = jj_gen;
           break label_5;
         }
         MethodParameters();
@@ -459,7 +486,7 @@ public class ELParser/*@bgen(jjtree)*/im
     Or();
     label_6:
     while (true) {
-      if (jj_2_4(3)) {
+      if (jj_2_5(3)) {
         ;
       } else {
         break label_6;
@@ -508,7 +535,7 @@ public class ELParser/*@bgen(jjtree)*/im
         ;
         break;
       default:
-        jj_la1[9] = jj_gen;
+        jj_la1[10] = jj_gen;
         break label_7;
       }
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
@@ -519,7 +546,7 @@ public class ELParser/*@bgen(jjtree)*/im
         jj_consume_token(OR1);
         break;
       default:
-        jj_la1[10] = jj_gen;
+        jj_la1[11] = jj_gen;
         jj_consume_token(-1);
         throw new ParseException();
       }
@@ -564,7 +591,7 @@ public class ELParser/*@bgen(jjtree)*/im
         ;
         break;
       default:
-        jj_la1[11] = jj_gen;
+        jj_la1[12] = jj_gen;
         break label_8;
       }
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
@@ -575,7 +602,7 @@ public class ELParser/*@bgen(jjtree)*/im
         jj_consume_token(AND1);
         break;
       default:
-        jj_la1[12] = jj_gen;
+        jj_la1[13] = jj_gen;
         jj_consume_token(-1);
         throw new ParseException();
       }
@@ -622,7 +649,7 @@ public class ELParser/*@bgen(jjtree)*/im
         ;
         break;
       default:
-        jj_la1[13] = jj_gen;
+        jj_la1[14] = jj_gen;
         break label_9;
       }
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
@@ -636,7 +663,7 @@ public class ELParser/*@bgen(jjtree)*/im
           jj_consume_token(EQ1);
           break;
         default:
-          jj_la1[14] = jj_gen;
+          jj_la1[15] = jj_gen;
           jj_consume_token(-1);
           throw new ParseException();
         }
@@ -675,7 +702,7 @@ public class ELParser/*@bgen(jjtree)*/im
           jj_consume_token(NE1);
           break;
         default:
-          jj_la1[15] = jj_gen;
+          jj_la1[16] = jj_gen;
           jj_consume_token(-1);
           throw new ParseException();
         }
@@ -705,7 +732,7 @@ public class ELParser/*@bgen(jjtree)*/im
         }
         break;
       default:
-        jj_la1[16] = jj_gen;
+        jj_la1[17] = jj_gen;
         jj_consume_token(-1);
         throw new ParseException();
       }
@@ -732,7 +759,7 @@ public class ELParser/*@bgen(jjtree)*/im
         ;
         break;
       default:
-        jj_la1[17] = jj_gen;
+        jj_la1[18] = jj_gen;
         break label_10;
       }
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
@@ -746,7 +773,7 @@ public class ELParser/*@bgen(jjtree)*/im
           jj_consume_token(LT1);
           break;
         default:
-          jj_la1[18] = jj_gen;
+          jj_la1[19] = jj_gen;
           jj_consume_token(-1);
           throw new ParseException();
         }
@@ -785,7 +812,7 @@ public class ELParser/*@bgen(jjtree)*/im
           jj_consume_token(GT1);
           break;
         default:
-          jj_la1[19] = jj_gen;
+          jj_la1[20] = jj_gen;
           jj_consume_token(-1);
           throw new ParseException();
         }
@@ -824,7 +851,7 @@ public class ELParser/*@bgen(jjtree)*/im
           jj_consume_token(LE1);
           break;
         default:
-          jj_la1[20] = jj_gen;
+          jj_la1[21] = jj_gen;
           jj_consume_token(-1);
           throw new ParseException();
         }
@@ -863,7 +890,7 @@ public class ELParser/*@bgen(jjtree)*/im
           jj_consume_token(GE1);
           break;
         default:
-          jj_la1[21] = jj_gen;
+          jj_la1[22] = jj_gen;
           jj_consume_token(-1);
           throw new ParseException();
         }
@@ -893,7 +920,7 @@ public class ELParser/*@bgen(jjtree)*/im
         }
         break;
       default:
-        jj_la1[22] = jj_gen;
+        jj_la1[23] = jj_gen;
         jj_consume_token(-1);
         throw new ParseException();
       }
@@ -914,7 +941,7 @@ public class ELParser/*@bgen(jjtree)*/im
         ;
         break;
       default:
-        jj_la1[23] = jj_gen;
+        jj_la1[24] = jj_gen;
         break label_11;
       }
       jj_consume_token(CONCAT);
@@ -959,7 +986,7 @@ public class ELParser/*@bgen(jjtree)*/im
         ;
         break;
       default:
-        jj_la1[24] = jj_gen;
+        jj_la1[25] = jj_gen;
         break label_12;
       }
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
@@ -1018,7 +1045,7 @@ public class ELParser/*@bgen(jjtree)*/im
         }
         break;
       default:
-        jj_la1[25] = jj_gen;
+        jj_la1[26] = jj_gen;
         jj_consume_token(-1);
         throw new ParseException();
       }
@@ -1042,7 +1069,7 @@ public class ELParser/*@bgen(jjtree)*/im
         ;
         break;
       default:
-        jj_la1[26] = jj_gen;
+        jj_la1[27] = jj_gen;
         break label_13;
       }
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
@@ -1083,7 +1110,7 @@ public class ELParser/*@bgen(jjtree)*/im
           jj_consume_token(DIV1);
           break;
         default:
-          jj_la1[27] = jj_gen;
+          jj_la1[28] = jj_gen;
           jj_consume_token(-1);
           throw new ParseException();
         }
@@ -1122,7 +1149,7 @@ public class ELParser/*@bgen(jjtree)*/im
           jj_consume_token(MOD1);
           break;
         default:
-          jj_la1[28] = jj_gen;
+          jj_la1[29] = jj_gen;
           jj_consume_token(-1);
           throw new ParseException();
         }
@@ -1152,7 +1179,7 @@ public class ELParser/*@bgen(jjtree)*/im
         }
         break;
       default:
-        jj_la1[29] = jj_gen;
+        jj_la1[30] = jj_gen;
         jj_consume_token(-1);
         throw new ParseException();
       }
@@ -1202,7 +1229,7 @@ public class ELParser/*@bgen(jjtree)*/im
         jj_consume_token(NOT1);
         break;
       default:
-        jj_la1[30] = jj_gen;
+        jj_la1[31] = jj_gen;
         jj_consume_token(-1);
         throw new ParseException();
       }
@@ -1271,7 +1298,7 @@ public class ELParser/*@bgen(jjtree)*/im
       Value();
       break;
     default:
-      jj_la1[31] = jj_gen;
+      jj_la1[32] = jj_gen;
       jj_consume_token(-1);
       throw new ParseException();
     }
@@ -1295,7 +1322,7 @@ public class ELParser/*@bgen(jjtree)*/im
           ;
           break;
         default:
-          jj_la1[32] = jj_gen;
+          jj_la1[33] = jj_gen;
           break label_14;
         }
         ValueSuffix();
@@ -1342,7 +1369,7 @@ public class ELParser/*@bgen(jjtree)*/im
       NonLiteral();
       break;
     default:
-      jj_la1[33] = jj_gen;
+      jj_la1[34] = jj_gen;
       jj_consume_token(-1);
       throw new ParseException();
     }
@@ -1361,7 +1388,7 @@ public class ELParser/*@bgen(jjtree)*/im
       BracketSuffix();
       break;
     default:
-      jj_la1[34] = jj_gen;
+      jj_la1[35] = jj_gen;
       jj_consume_token(-1);
       throw new ParseException();
     }
@@ -1370,7 +1397,7 @@ public class ELParser/*@bgen(jjtree)*/im
       MethodParameters();
       break;
     default:
-      jj_la1[35] = jj_gen;
+      jj_la1[36] = jj_gen;
       ;
     }
   }
@@ -1464,7 +1491,7 @@ public class ELParser/*@bgen(jjtree)*/im
             ;
             break;
           default:
-            jj_la1[36] = jj_gen;
+            jj_la1[37] = jj_gen;
             break label_15;
           }
           jj_consume_token(COMMA);
@@ -1472,7 +1499,7 @@ public class ELParser/*@bgen(jjtree)*/im
         }
         break;
       default:
-        jj_la1[37] = jj_gen;
+        jj_la1[38] = jj_gen;
         ;
       }
       jj_consume_token(RPAREN);
@@ -1502,7 +1529,7 @@ public class ELParser/*@bgen(jjtree)*/im
  * For Grouped Operations, Identifiers, and Functions
  */
   final public void NonLiteral() throws ParseException {
-    if (jj_2_5(3)) {
+    if (jj_2_6(3)) {
       LambdaExpressionOrInvocation();
     } else {
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
@@ -1512,8 +1539,8 @@ public class ELParser/*@bgen(jjtree)*/im
         jj_consume_token(RPAREN);
         break;
       default:
-        jj_la1[38] = jj_gen;
-        if (jj_2_6(2147483647)) {
+        jj_la1[39] = jj_gen;
+        if (jj_2_7(2147483647)) {
           Function();
         } else {
           switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
@@ -1521,8 +1548,8 @@ public class ELParser/*@bgen(jjtree)*/im
             Identifier();
             break;
           default:
-            jj_la1[39] = jj_gen;
-            if (jj_2_7(3)) {
+            jj_la1[40] = jj_gen;
+            if (jj_2_8(3)) {
               SetData();
             } else {
               switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
@@ -1533,7 +1560,7 @@ public class ELParser/*@bgen(jjtree)*/im
                 MapData();
                 break;
               default:
-                jj_la1[40] = jj_gen;
+                jj_la1[41] = jj_gen;
                 jj_consume_token(-1);
                 throw new ParseException();
               }
@@ -1544,6 +1571,11 @@ public class ELParser/*@bgen(jjtree)*/im
     }
   }
 
+/*
+ * Note that both an empty Set and an empty Map are represented by {}. The
+ * parser will always parse {} as an empty Set and special handling is required
+ * to convert it to an empty Map when appropriate.
+ */
   final public void SetData() throws ParseException {
                           /*@bgen(jjtree) SetData */
   AstSetData jjtn000 = new AstSetData(JJTSETDATA);
@@ -1574,7 +1606,7 @@ public class ELParser/*@bgen(jjtree)*/im
             ;
             break;
           default:
-            jj_la1[41] = jj_gen;
+            jj_la1[42] = jj_gen;
             break label_16;
           }
           jj_consume_token(COMMA);
@@ -1582,7 +1614,7 @@ public class ELParser/*@bgen(jjtree)*/im
         }
         break;
       default:
-        jj_la1[42] = jj_gen;
+        jj_la1[43] = jj_gen;
         ;
       }
       jj_consume_token(RBRACE);
@@ -1637,7 +1669,7 @@ public class ELParser/*@bgen(jjtree)*/im
             ;
             break;
           default:
-            jj_la1[43] = jj_gen;
+            jj_la1[44] = jj_gen;
             break label_17;
           }
           jj_consume_token(COMMA);
@@ -1645,7 +1677,7 @@ public class ELParser/*@bgen(jjtree)*/im
         }
         break;
       default:
-        jj_la1[44] = jj_gen;
+        jj_la1[45] = jj_gen;
         ;
       }
       jj_consume_token(RBRACK);
@@ -1670,6 +1702,11 @@ public class ELParser/*@bgen(jjtree)*/im
     }
   }
 
+/*
+ * Note that both an empty Set and an empty Map are represented by {}. The
+ * parser will always parse {} as an empty Set and special handling is required
+ * to convert it to an empty Map when appropriate.
+ */
   final public void MapData() throws ParseException {
                           /*@bgen(jjtree) MapData */
   AstMapData jjtn000 = new AstMapData(JJTMAPDATA);
@@ -1700,7 +1737,7 @@ public class ELParser/*@bgen(jjtree)*/im
             ;
             break;
           default:
-            jj_la1[45] = jj_gen;
+            jj_la1[46] = jj_gen;
             break label_18;
           }
           jj_consume_token(COMMA);
@@ -1708,7 +1745,7 @@ public class ELParser/*@bgen(jjtree)*/im
         }
         break;
       default:
-        jj_la1[46] = jj_gen;
+        jj_la1[47] = jj_gen;
         ;
       }
       jj_consume_token(RBRACE);
@@ -1795,7 +1832,7 @@ public class ELParser/*@bgen(jjtree)*/im
     jjtree.openNodeScope(jjtn000);Token t0 = null;
     Token t1 = null;
     try {
-      if (jj_2_8(2)) {
+      if (jj_2_9(2)) {
         t0 = jj_consume_token(IDENTIFIER);
         jj_consume_token(COLON);
       } else {
@@ -1832,7 +1869,7 @@ public class ELParser/*@bgen(jjtree)*/im
             ;
             break;
           default:
-            jj_la1[47] = jj_gen;
+            jj_la1[48] = jj_gen;
             break label_19;
           }
           jj_consume_token(COMMA);
@@ -1840,7 +1877,7 @@ public class ELParser/*@bgen(jjtree)*/im
         }
         break;
       default:
-        jj_la1[48] = jj_gen;
+        jj_la1[49] = jj_gen;
         ;
       }
       jj_consume_token(RPAREN);
@@ -1888,7 +1925,7 @@ public class ELParser/*@bgen(jjtree)*/im
       Null();
       break;
     default:
-      jj_la1[49] = jj_gen;
+      jj_la1[50] = jj_gen;
       jj_consume_token(-1);
       throw new ParseException();
     }
@@ -1925,7 +1962,7 @@ public class ELParser/*@bgen(jjtree)*/im
       }
       break;
     default:
-      jj_la1[50] = jj_gen;
+      jj_la1[51] = jj_gen;
       jj_consume_token(-1);
       throw new ParseException();
     }
@@ -2068,49 +2105,11 @@ public class ELParser/*@bgen(jjtree)*/im
     finally { jj_save(7, xla); }
   }
 
-  private boolean jj_3R_49() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(35)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(36)) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3_8() {
-    if (jj_scan_token(IDENTIFIER)) return true;
-    if (jj_scan_token(COLON)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_96() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_8()) jj_scanpos = xsp;
-    if (jj_scan_token(IDENTIFIER)) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_44() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_48()) {
-    jj_scanpos = xsp;
-    if (jj_3R_49()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3R_48() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(33)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(34)) return true;
-    }
-    return false;
+  private boolean jj_2_9(int xla) {
+    jj_la = xla; jj_lastpos = jj_scanpos = token;
+    try { return !jj_3_9(); }
+    catch(LookaheadSuccess ls) { return true; }
+    finally { jj_save(8, xla); }
   }
 
   private boolean jj_3R_40() {
@@ -2133,13 +2132,18 @@ public class ELParser/*@bgen(jjtree)*/im
     return false;
   }
 
-  private boolean jj_3R_42() {
-    if (jj_scan_token(COMMA)) return true;
+  private boolean jj_3R_103() {
+    if (jj_3R_35()) return true;
     return false;
   }
 
-  private boolean jj_3R_37() {
-    if (jj_scan_token(IDENTIFIER)) return true;
+  private boolean jj_3R_102() {
+    if (jj_3R_103()) return true;
+    return false;
+  }
+
+  private boolean jj_3R_42() {
+    if (jj_scan_token(COMMA)) return true;
     return false;
   }
 
@@ -2153,6 +2157,11 @@ public class ELParser/*@bgen(jjtree)*/im
     return false;
   }
 
+  private boolean jj_3R_36() {
+    if (jj_scan_token(COMMA)) return true;
+    return false;
+  }
+
   private boolean jj_3R_34() {
     Token xsp;
     xsp = jj_scanpos;
@@ -2163,21 +2172,20 @@ public class ELParser/*@bgen(jjtree)*/im
     return false;
   }
 
-  private boolean jj_3R_36() {
-    if (jj_scan_token(COMMA)) return true;
+  private boolean jj_3R_98() {
+    if (jj_scan_token(START_SET_OR_MAP)) return true;
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_102()) jj_scanpos = xsp;
+    if (jj_scan_token(RBRACE)) return true;
     return false;
   }
 
-  private boolean jj_3R_103() {
+  private boolean jj_3R_101() {
     if (jj_3R_35()) return true;
     return false;
   }
 
-  private boolean jj_3R_102() {
-    if (jj_3R_103()) return true;
-    return false;
-  }
-
   private boolean jj_3R_29() {
     if (jj_3R_33()) return true;
     Token xsp;
@@ -2188,39 +2196,39 @@ public class ELParser/*@bgen(jjtree)*/im
     return false;
   }
 
-  private boolean jj_3R_38() {
-    if (jj_3R_37()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_42()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3_4() {
+  private boolean jj_3_5() {
     if (jj_scan_token(QUESTIONMARK)) return true;
     if (jj_3R_22()) return true;
     if (jj_scan_token(COLON)) return true;
     return false;
   }
 
-  private boolean jj_3R_101() {
-    if (jj_3R_35()) return true;
+  private boolean jj_3R_97() {
+    if (jj_scan_token(LBRACK)) return true;
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_101()) jj_scanpos = xsp;
+    if (jj_scan_token(RBRACK)) return true;
     return false;
   }
 
-  private boolean jj_3R_98() {
-    if (jj_scan_token(START_SET_OR_MAP)) return true;
+  private boolean jj_3R_38() {
+    if (jj_3R_37()) return true;
     Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_102()) jj_scanpos = xsp;
-    if (jj_scan_token(RBRACE)) return true;
+    while (true) {
+      xsp = jj_scanpos;
+      if (jj_3R_42()) { jj_scanpos = xsp; break; }
+    }
     return false;
   }
 
-  private boolean jj_3_3() {
-    if (jj_3R_21()) return true;
+  private boolean jj_3R_30() {
+    if (jj_3R_35()) return true;
+    Token xsp;
+    while (true) {
+      xsp = jj_scanpos;
+      if (jj_3R_36()) { jj_scanpos = xsp; break; }
+    }
     return false;
   }
 
@@ -2229,36 +2237,27 @@ public class ELParser/*@bgen(jjtree)*/im
     Token xsp;
     while (true) {
       xsp = jj_scanpos;
-      if (jj_3_4()) { jj_scanpos = xsp; break; }
+      if (jj_3_5()) { jj_scanpos = xsp; break; }
     }
     return false;
   }
 
-  private boolean jj_3R_97() {
-    if (jj_scan_token(LBRACK)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_101()) jj_scanpos = xsp;
-    if (jj_scan_token(RBRACK)) return true;
+  private boolean jj_3_3() {
+    if (jj_3R_21()) return true;
     return false;
   }
 
-  private boolean jj_3R_30() {
-    if (jj_3R_35()) return true;
+  private boolean jj_3R_25() {
+    if (jj_scan_token(START_SET_OR_MAP)) return true;
     Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_36()) { jj_scanpos = xsp; break; }
-    }
+    xsp = jj_scanpos;
+    if (jj_3R_30()) jj_scanpos = xsp;
+    if (jj_scan_token(RBRACE)) return true;
     return false;
   }
 
-  private boolean jj_3R_32() {
-    if (jj_scan_token(LPAREN)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_38()) jj_scanpos = xsp;
-    if (jj_scan_token(RPAREN)) return true;
+  private boolean jj_3_4() {
+    if (jj_3R_21()) return true;
     return false;
   }
 
@@ -2268,7 +2267,7 @@ public class ELParser/*@bgen(jjtree)*/im
     return false;
   }
 
-  private boolean jj_3_6() {
+  private boolean jj_3_7() {
     Token xsp;
     xsp = jj_scanpos;
     if (jj_3R_24()) jj_scanpos = xsp;
@@ -2277,18 +2276,12 @@ public class ELParser/*@bgen(jjtree)*/im
     return false;
   }
 
-  private boolean jj_3R_23() {
+  private boolean jj_3R_32() {
     if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_21()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_25() {
-    if (jj_scan_token(START_SET_OR_MAP)) return true;
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_30()) jj_scanpos = xsp;
-    if (jj_scan_token(RBRACE)) return true;
+    if (jj_3R_38()) jj_scanpos = xsp;
+    if (jj_scan_token(RPAREN)) return true;
     return false;
   }
 
@@ -2302,7 +2295,14 @@ public class ELParser/*@bgen(jjtree)*/im
     return false;
   }
 
-  private boolean jj_3_7() {
+  private boolean jj_3R_23() {
+    if (jj_scan_token(LPAREN)) return true;
+    if (jj_3R_27()) return true;
+    if (jj_scan_token(ARROW)) return true;
+    return false;
+  }
+
+  private boolean jj_3_8() {
     if (jj_3R_25()) return true;
     return false;
   }
@@ -2323,22 +2323,7 @@ public class ELParser/*@bgen(jjtree)*/im
     return false;
   }
 
-  private boolean jj_3R_31() {
-    if (jj_3R_37()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_27() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_31()) {
-    jj_scanpos = xsp;
-    if (jj_3R_32()) return true;
-    }
-    return false;
-  }
-
-  private boolean jj_3_5() {
+  private boolean jj_3_6() {
     if (jj_3R_23()) return true;
     return false;
   }
@@ -2346,7 +2331,7 @@ public class ELParser/*@bgen(jjtree)*/im
   private boolean jj_3R_76() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3_5()) {
+    if (jj_3_6()) {
     jj_scanpos = xsp;
     if (jj_3R_84()) {
     jj_scanpos = xsp;
@@ -2354,7 +2339,7 @@ public class ELParser/*@bgen(jjtree)*/im
     jj_scanpos = xsp;
     if (jj_3R_86()) {
     jj_scanpos = xsp;
-    if (jj_3_7()) {
+    if (jj_3_8()) {
     jj_scanpos = xsp;
     if (jj_3R_87()) {
     jj_scanpos = xsp;
@@ -2368,6 +2353,21 @@ public class ELParser/*@bgen(jjtree)*/im
     return false;
   }
 
+  private boolean jj_3R_31() {
+    if (jj_3R_37()) return true;
+    return false;
+  }
+
+  private boolean jj_3R_27() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_31()) {
+    jj_scanpos = xsp;
+    if (jj_3R_32()) return true;
+    }
+    return false;
+  }
+
   private boolean jj_3_1() {
     if (jj_scan_token(ASSIGN)) return true;
     if (jj_3R_20()) return true;
@@ -2391,6 +2391,11 @@ public class ELParser/*@bgen(jjtree)*/im
     return false;
   }
 
+  private boolean jj_3R_90() {
+    if (jj_scan_token(LBRACK)) return true;
+    return false;
+  }
+
   private boolean jj_3R_26() {
     if (jj_3R_22()) return true;
     Token xsp;
@@ -2401,6 +2406,11 @@ public class ELParser/*@bgen(jjtree)*/im
     return false;
   }
 
+  private boolean jj_3R_78() {
+    if (jj_3R_90()) return true;
+    return false;
+  }
+
   private boolean jj_3_2() {
     if (jj_3R_21()) return true;
     return false;
@@ -2416,13 +2426,8 @@ public class ELParser/*@bgen(jjtree)*/im
     return false;
   }
 
-  private boolean jj_3R_90() {
-    if (jj_scan_token(LBRACK)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_78() {
-    if (jj_3R_90()) return true;
+  private boolean jj_3R_89() {
+    if (jj_scan_token(DOT)) return true;
     return false;
   }
 
@@ -2436,16 +2441,6 @@ public class ELParser/*@bgen(jjtree)*/im
     return false;
   }
 
-  private boolean jj_3R_89() {
-    if (jj_scan_token(DOT)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_35() {
-    if (jj_3R_41()) return true;
-    return false;
-  }
-
   private boolean jj_3R_77() {
     if (jj_3R_89()) return true;
     return false;
@@ -2461,6 +2456,11 @@ public class ELParser/*@bgen(jjtree)*/im
     return false;
   }
 
+  private boolean jj_3R_35() {
+    if (jj_3R_41()) return true;
+    return false;
+  }
+
   private boolean jj_3R_71() {
     if (jj_3R_74()) return true;
     return false;
@@ -2496,6 +2496,11 @@ public class ELParser/*@bgen(jjtree)*/im
     return false;
   }
 
+  private boolean jj_3R_95() {
+    if (jj_scan_token(NULL)) return true;
+    return false;
+  }
+
   private boolean jj_3R_65() {
     if (jj_3R_69()) return true;
     return false;
@@ -2540,8 +2545,8 @@ public class ELParser/*@bgen(jjtree)*/im
     return false;
   }
 
-  private boolean jj_3R_95() {
-    if (jj_scan_token(NULL)) return true;
+  private boolean jj_3R_94() {
+    if (jj_scan_token(STRING_LITERAL)) return true;
     return false;
   }
 
@@ -2555,6 +2560,11 @@ public class ELParser/*@bgen(jjtree)*/im
     return false;
   }
 
+  private boolean jj_3R_93() {
+    if (jj_scan_token(INTEGER_LITERAL)) return true;
+    return false;
+  }
+
   private boolean jj_3R_67() {
     Token xsp;
     xsp = jj_scanpos;
@@ -2565,11 +2575,6 @@ public class ELParser/*@bgen(jjtree)*/im
     return false;
   }
 
-  private boolean jj_3R_94() {
-    if (jj_scan_token(STRING_LITERAL)) return true;
-    return false;
-  }
-
   private boolean jj_3R_59() {
     Token xsp;
     xsp = jj_scanpos;
@@ -2598,8 +2603,8 @@ public class ELParser/*@bgen(jjtree)*/im
     return false;
   }
 
-  private boolean jj_3R_93() {
-    if (jj_scan_token(INTEGER_LITERAL)) return true;
+  private boolean jj_3R_92() {
+    if (jj_scan_token(FLOATING_POINT_LITERAL)) return true;
     return false;
   }
 
@@ -2608,6 +2613,11 @@ public class ELParser/*@bgen(jjtree)*/im
     return false;
   }
 
+  private boolean jj_3R_100() {
+    if (jj_scan_token(FALSE)) return true;
+    return false;
+  }
+
   private boolean jj_3R_57() {
     Token xsp;
     xsp = jj_scanpos;
@@ -2623,31 +2633,6 @@ public class ELParser/*@bgen(jjtree)*/im
     return false;
   }
 
-  private boolean jj_3R_92() {
-    if (jj_scan_token(FLOATING_POINT_LITERAL)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_50() {
-    if (jj_3R_56()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_57()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_100() {
-    if (jj_scan_token(FALSE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_51() {
-    if (jj_scan_token(CONCAT)) return true;
-    return false;
-  }
-
   private boolean jj_3R_99() {
     if (jj_scan_token(TRUE)) return true;
     return false;
@@ -2663,12 +2648,12 @@ public class ELParser/*@bgen(jjtree)*/im
     return false;
   }
 
-  private boolean jj_3R_46() {
-    if (jj_3R_50()) return true;
+  private boolean jj_3R_50() {
+    if (jj_3R_56()) return true;
     Token xsp;
     while (true) {
       xsp = jj_scanpos;
-      if (jj_3R_51()) { jj_scanpos = xsp; break; }
+      if (jj_3R_57()) { jj_scanpos = xsp; break; }
     }
     return false;
   }
@@ -2683,6 +2668,11 @@ public class ELParser/*@bgen(jjtree)*/im
     return false;
   }
 
+  private boolean jj_3R_51() {
+    if (jj_scan_token(CONCAT)) return true;
+    return false;
+  }
+
   private boolean jj_3R_81() {
     if (jj_3R_93()) return true;
     return false;
@@ -2693,16 +2683,6 @@ public class ELParser/*@bgen(jjtree)*/im
     return false;
   }
 
-  private boolean jj_3R_55() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(29)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(30)) return true;
-    }
-    return false;
-  }
-
   private boolean jj_3R_75() {
     Token xsp;
     xsp = jj_scanpos;
@@ -2727,6 +2707,26 @@ public class ELParser/*@bgen(jjtree)*/im
     return false;
   }
 
+  private boolean jj_3R_46() {
+    if (jj_3R_50()) return true;
+    Token xsp;
+    while (true) {
+      xsp = jj_scanpos;
+      if (jj_3R_51()) { jj_scanpos = xsp; break; }
+    }
+    return false;
+  }
+
+  private boolean jj_3R_55() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_scan_token(29)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(30)) return true;
+    }
+    return false;
+  }
+
   private boolean jj_3R_54() {
     Token xsp;
     xsp = jj_scanpos;
@@ -2773,6 +2773,21 @@ public class ELParser/*@bgen(jjtree)*/im
     return false;
   }
 
+  private boolean jj_3_9() {
+    if (jj_scan_token(IDENTIFIER)) return true;
+    if (jj_scan_token(COLON)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_96() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3_9()) jj_scanpos = xsp;
+    if (jj_scan_token(IDENTIFIER)) return true;
+    if (jj_scan_token(LPAREN)) return true;
+    return false;
+  }
+
   private boolean jj_3R_43() {
     if (jj_3R_46()) return true;
     Token xsp;
@@ -2783,11 +2798,46 @@ public class ELParser/*@bgen(jjtree)*/im
     return false;
   }
 
+  private boolean jj_3R_49() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_scan_token(35)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(36)) return true;
+    }
+    return false;
+  }
+
+  private boolean jj_3R_44() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_48()) {
+    jj_scanpos = xsp;
+    if (jj_3R_49()) return true;
+    }
+    return false;
+  }
+
+  private boolean jj_3R_48() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_scan_token(33)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(34)) return true;
+    }
+    return false;
+  }
+
   private boolean jj_3R_28() {
     if (jj_3R_22()) return true;
     return false;
   }
 
+  private boolean jj_3R_37() {
+    if (jj_scan_token(IDENTIFIER)) return true;
+    return false;
+  }
+
   /** Generated Token Manager. */
   public ELParserTokenManager token_source;
   SimpleCharStream jj_input_stream;
@@ -2799,7 +2849,7 @@ public class ELParser/*@bgen(jjtree)*/im
   private Token jj_scanpos, jj_lastpos;
   private int jj_la;
   private int jj_gen;
-  final private int[] jj_la1 = new int[51];
+  final private int[] jj_la1 = new int[52];
   static private int[] jj_la1_0;
   static private int[] jj_la1_1;
   static {
@@ -2807,12 +2857,12 @@ public class ELParser/*@bgen(jjtree)*/im
       jj_la1_init_1();
    }
    private static void jj_la1_init_0() {
-      jj_la1_0 = new int[] 
{0xe,0xe,0x800000,0x15ed00,0x15ed00,0x1000000,0x0,0x40000,0x40000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xfe000000,0x18000000,0x6000000,0x80000000,0x60000000,0xfe000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x15ed00,0x120000,0x15ed00,0x120000,0x40000,0x1000000,0x15ed00,0x40000,0x0,0x100100,0x1000000,0x15ed00,0x1000000,0x15ed00,0x1000000,0x15ed00,0x1000000,0x15ed00,0x1ec00,0xc000,};
+      jj_la1_0 = new int[] 
{0xe,0xe,0x800000,0x15ed00,0x15ed00,0x1000000,0x0,0x40000,0x15ed00,0x40000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xfe000000,0x18000000,0x6000000,0x80000000,0x60000000,0xfe000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x15ed00,0x120000,0x15ed00,0x120000,0x40000,0x1000000,0x15ed00,0x40000,0x0,0x100100,0x1000000,0x15ed00,0x1000000,0x15ed00,0x1000000,0x15ed00,0x1000000,0x15ed00,0x1ec00,0xc000,};
    }
    private static void jj_la1_init_1() {
-      jj_la1_1 = new int[] 
{0x0,0x0,0x0,0x1008860,0x1008860,0x0,0x1000000,0x1000000,0x0,0x600,0x600,0x180,0x180,0x1e,0x6,0x18,0x1e,0x1,0x0,0x0,0x1,0x0,0x1,0x200000,0xc000,0xc000,0x1e2000,0x60000,0x180000,0x1e2000,0x60,0x1008860,0x0,0x1000000,0x0,0x0,0x0,0x1008860,0x0,0x1000000,0x0,0x0,0x1008860,0x0,0x1008860,0x0,0x1008860,0x0,0x1008860,0x0,0x0,};
+      jj_la1_1 = new int[] 
{0x0,0x0,0x0,0x1008860,0x1008860,0x0,0x1000000,0x1000000,0x1008860,0x0,0x600,0x600,0x180,0x180,0x1e,0x6,0x18,0x1e,0x1,0x0,0x0,0x1,0x0,0x1,0x200000,0xc000,0xc000,0x1e2000,0x60000,0x180000,0x1e2000,0x60,0x1008860,0x0,0x1000000,0x0,0x0,0x0,0x1008860,0x0,0x1000000,0x0,0x0,0x1008860,0x0,0x1008860,0x0,0x1008860,0x0,0x1008860,0x0,0x0,};
    }
-  final private JJCalls[] jj_2_rtns = new JJCalls[8];
+  final private JJCalls[] jj_2_rtns = new JJCalls[9];
   private boolean jj_rescan = false;
   private int jj_gc = 0;
 
@@ -2827,7 +2877,7 @@ public class ELParser/*@bgen(jjtree)*/im
     token = new Token();
     jj_ntk = -1;
     jj_gen = 0;
-    for (int i = 0; i < 51; i++) jj_la1[i] = -1;
+    for (int i = 0; i < 52; i++) jj_la1[i] = -1;
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
   }
 
@@ -2843,7 +2893,7 @@ public class ELParser/*@bgen(jjtree)*/im
     jj_ntk = -1;
     jjtree.reset();
     jj_gen = 0;
-    for (int i = 0; i < 51; i++) jj_la1[i] = -1;
+    for (int i = 0; i < 52; i++) jj_la1[i] = -1;
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
   }
 
@@ -2854,7 +2904,7 @@ public class ELParser/*@bgen(jjtree)*/im
     token = new Token();
     jj_ntk = -1;
     jj_gen = 0;
-    for (int i = 0; i < 51; i++) jj_la1[i] = -1;
+    for (int i = 0; i < 52; i++) jj_la1[i] = -1;
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
   }
 
@@ -2866,7 +2916,7 @@ public class ELParser/*@bgen(jjtree)*/im
     jj_ntk = -1;
     jjtree.reset();
     jj_gen = 0;
-    for (int i = 0; i < 51; i++) jj_la1[i] = -1;
+    for (int i = 0; i < 52; i++) jj_la1[i] = -1;
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
   }
 
@@ -2876,7 +2926,7 @@ public class ELParser/*@bgen(jjtree)*/im
     token = new Token();
     jj_ntk = -1;
     jj_gen = 0;
-    for (int i = 0; i < 51; i++) jj_la1[i] = -1;
+    for (int i = 0; i < 52; i++) jj_la1[i] = -1;
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
   }
 
@@ -2887,7 +2937,7 @@ public class ELParser/*@bgen(jjtree)*/im
     jj_ntk = -1;
     jjtree.reset();
     jj_gen = 0;
-    for (int i = 0; i < 51; i++) jj_la1[i] = -1;
+    for (int i = 0; i < 52; i++) jj_la1[i] = -1;
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
   }
 
@@ -3004,7 +3054,7 @@ public class ELParser/*@bgen(jjtree)*/im
       la1tokens[jj_kind] = true;
       jj_kind = -1;
     }
-    for (int i = 0; i < 51; i++) {
+    for (int i = 0; i < 52; i++) {
       if (jj_la1[i] == jj_gen) {
         for (int j = 0; j < 32; j++) {
           if ((jj_la1_0[i] & (1<<j)) != 0) {
@@ -3043,7 +3093,7 @@ public class ELParser/*@bgen(jjtree)*/im
 
   private void jj_rescan_token() {
     jj_rescan = true;
-    for (int i = 0; i < 8; i++) {
+    for (int i = 0; i < 9; i++) {
     try {
       JJCalls p = jj_2_rtns[i];
       do {
@@ -3058,6 +3108,7 @@ public class ELParser/*@bgen(jjtree)*/im
             case 5: jj_3_6(); break;
             case 6: jj_3_7(); break;
             case 7: jj_3_8(); break;
+            case 8: jj_3_9(); break;
           }
         }
         p = p.next;

Modified: tomcat/trunk/java/org/apache/el/parser/ELParser.jjt
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/el/parser/ELParser.jjt?rev=1503857&r1=1503856&r2=1503857&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/el/parser/ELParser.jjt (original)
+++ tomcat/trunk/java/org/apache/el/parser/ELParser.jjt Tue Jul 16 20:01:47 2013
@@ -136,9 +136,14 @@ void LambdaParameters() #LambdaParameter
  * Possible invocation of lambda expression. Invocations must be bracketed but
  * being bracketed does not mean it is an invocation.
  */
-void LambdaExpressionOrInvocation() #LambdaExpressionOrInvocation : {}
+void LambdaExpressionOrInvocation() #LambdaExpression : {}
 {
-    <LPAREN> LambdaExpression() <RPAREN> ( MethodParameters() )*
+    <LPAREN> 
+        LambdaParameters()
+        <ARROW>
+        ( LOOKAHEAD(3) LambdaExpression() | Choice() )
+    <RPAREN>
+    ( MethodParameters() )*
 }
 
 /*

Modified: tomcat/trunk/java/org/apache/el/parser/ELParserTreeConstants.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/el/parser/ELParserTreeConstants.java?rev=1503857&r1=1503856&r2=1503857&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/el/parser/ELParserTreeConstants.java (original)
+++ tomcat/trunk/java/org/apache/el/parser/ELParserTreeConstants.java Tue Jul 
16 20:01:47 2013
@@ -12,41 +12,40 @@ public interface ELParserTreeConstants
   public int JJTASSIGN = 6;
   public int JJTLAMBDAEXPRESSION = 7;
   public int JJTLAMBDAPARAMETERS = 8;
-  public int JJTLAMBDAEXPRESSIONORINVOCATION = 9;
-  public int JJTCHOICE = 10;
-  public int JJTOR = 11;
-  public int JJTAND = 12;
-  public int JJTEQUAL = 13;
-  public int JJTNOTEQUAL = 14;
-  public int JJTLESSTHAN = 15;
-  public int JJTGREATERTHAN = 16;
-  public int JJTLESSTHANEQUAL = 17;
-  public int JJTGREATERTHANEQUAL = 18;
-  public int JJTCONCATENATION = 19;
-  public int JJTPLUS = 20;
-  public int JJTMINUS = 21;
-  public int JJTMULT = 22;
-  public int JJTDIV = 23;
-  public int JJTMOD = 24;
-  public int JJTNEGATIVE = 25;
-  public int JJTNOT = 26;
-  public int JJTEMPTY = 27;
-  public int JJTVALUE = 28;
-  public int JJTDOTSUFFIX = 29;
-  public int JJTBRACKETSUFFIX = 30;
-  public int JJTMETHODPARAMETERS = 31;
-  public int JJTSETDATA = 32;
-  public int JJTLISTDATA = 33;
-  public int JJTMAPDATA = 34;
-  public int JJTMAPENTRY = 35;
-  public int JJTIDENTIFIER = 36;
-  public int JJTFUNCTION = 37;
-  public int JJTTRUE = 38;
-  public int JJTFALSE = 39;
-  public int JJTFLOATINGPOINT = 40;
-  public int JJTINTEGER = 41;
-  public int JJTSTRING = 42;
-  public int JJTNULL = 43;
+  public int JJTCHOICE = 9;
+  public int JJTOR = 10;
+  public int JJTAND = 11;
+  public int JJTEQUAL = 12;
+  public int JJTNOTEQUAL = 13;
+  public int JJTLESSTHAN = 14;
+  public int JJTGREATERTHAN = 15;
+  public int JJTLESSTHANEQUAL = 16;
+  public int JJTGREATERTHANEQUAL = 17;
+  public int JJTCONCATENATION = 18;
+  public int JJTPLUS = 19;
+  public int JJTMINUS = 20;
+  public int JJTMULT = 21;
+  public int JJTDIV = 22;
+  public int JJTMOD = 23;
+  public int JJTNEGATIVE = 24;
+  public int JJTNOT = 25;
+  public int JJTEMPTY = 26;
+  public int JJTVALUE = 27;
+  public int JJTDOTSUFFIX = 28;
+  public int JJTBRACKETSUFFIX = 29;
+  public int JJTMETHODPARAMETERS = 30;
+  public int JJTSETDATA = 31;
+  public int JJTLISTDATA = 32;
+  public int JJTMAPDATA = 33;
+  public int JJTMAPENTRY = 34;
+  public int JJTIDENTIFIER = 35;
+  public int JJTFUNCTION = 36;
+  public int JJTTRUE = 37;
+  public int JJTFALSE = 38;
+  public int JJTFLOATINGPOINT = 39;
+  public int JJTINTEGER = 40;
+  public int JJTSTRING = 41;
+  public int JJTNULL = 42;
 
 
   public String[] jjtNodeName = {
@@ -59,7 +58,6 @@ public interface ELParserTreeConstants
     "Assign",
     "LambdaExpression",
     "LambdaParameters",
-    "LambdaExpressionOrInvocation",
     "Choice",
     "Or",
     "And",
@@ -96,4 +94,4 @@ public interface ELParserTreeConstants
     "Null",
   };
 }
-/* JavaCC - OriginalChecksum=23b494fccd3ecfb960d2779462d5457d (do not edit 
this line) */
+/* JavaCC - OriginalChecksum=96680d397165a1214a1ad1f24011d5c1 (do not edit 
this line) */

Modified: tomcat/trunk/test/org/apache/el/parser/TestAstLambdaExpression.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/el/parser/TestAstLambdaExpression.java?rev=1503857&r1=1503856&r2=1503857&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/el/parser/TestAstLambdaExpression.java 
(original)
+++ tomcat/trunk/test/org/apache/el/parser/TestAstLambdaExpression.java Tue Jul 
16 20:01:47 2013
@@ -64,4 +64,14 @@ public class TestAstLambdaExpression {
                         Integer.class);
         Assert.assertEquals(Integer.valueOf(120), result);
     }
+
+
+    @Test
+    public void testSpec06() {
+        ELProcessor processor = new ELProcessor();
+        Object result =
+                processor.getValue("(x->y->x-y)(2)(1)",
+                        Integer.class);
+        Assert.assertEquals(Integer.valueOf(1), result);
+    }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to