You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2013/07/18 15:57:18 UTC

svn commit: r1504475 - in /tomcat/trunk: java/org/apache/el/parser/AstFunction.java java/org/apache/el/parser/AstLambdaExpression.java test/org/apache/el/parser/TestAstLambdaExpression.java

Author: markt
Date: Thu Jul 18 13:57:17 2013
New Revision: 1504475

URL: http://svn.apache.org/r1504475
Log:
Fix handling expressions of the form:
v = (x->y->x-y); v(2)(1)

There is still some further clean-up that can be done.

Modified:
    tomcat/trunk/java/org/apache/el/parser/AstFunction.java
    tomcat/trunk/java/org/apache/el/parser/AstLambdaExpression.java
    tomcat/trunk/test/org/apache/el/parser/TestAstLambdaExpression.java

Modified: tomcat/trunk/java/org/apache/el/parser/AstFunction.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/el/parser/AstFunction.java?rev=1504475&r1=1504474&r2=1504475&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/el/parser/AstFunction.java (original)
+++ tomcat/trunk/java/org/apache/el/parser/AstFunction.java Thu Jul 18 13:57:17 2013
@@ -95,15 +95,19 @@ public final class AstFunction extends S
             Object obj =
                     ctx.getELResolver().getValue(ctx, null, this.localName);
             if (obj instanceof LambdaExpression) {
-                LambdaExpression le = (LambdaExpression) obj;
                 // Build arguments
-                // TODO handle multiple sets of arguments
-                int numArgs = this.jjtGetChild(0).jjtGetNumChildren();
-                Object[] args = new Object[numArgs];
-                for (int i = 0; i < numArgs; i++) {
-                    args[i] = jjtGetChild(0).jjtGetChild(i).getValue(ctx);
+                int i = 0;
+                while (obj instanceof LambdaExpression && i < this.jjtGetNumChildren()) {
+                    Node parameters = jjtGetChild(i);
+                    int numArgs = parameters.jjtGetNumChildren();
+                    Object[] args = new Object[numArgs];
+                    for (int j = 0; j < numArgs; j++) {
+                        args[j] = parameters.jjtGetChild(j).getValue(ctx);
+                    }
+                    obj = ((LambdaExpression) obj).invoke(args);
+                    i++;
                 }
-                return le.invoke(ctx, args);
+                return obj;
             }
         }
 

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=1504475&r1=1504474&r2=1504475&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/el/parser/AstLambdaExpression.java (original)
+++ tomcat/trunk/java/org/apache/el/parser/AstLambdaExpression.java Thu Jul 18 13:57:17 2013
@@ -76,7 +76,7 @@ public class AstLambdaExpression extends
         le.setELContext(ctx);
 
         if (jjtGetNumChildren() == 2) {
-            if (formalParameters.isEmpty()) {
+            if (formalParameters.isEmpty() && !(parent instanceof AstLambdaExpression)) {
                 // No formal parameters or method parameters so invoke the
                 // expression. If this is a nested expression inform the outer
                 // expression that an invocation has occurred so the correct set
@@ -130,7 +130,7 @@ public class AstLambdaExpression extends
 
     public void incMethodParameterIndex() {
         Node parent = jjtGetParent();
-        if (parent instanceof AstLambdaExpression) {
+        if (parent instanceof LambdaExpression) {
             // Method parameter index is maintained by outermost lambda
             // expressions as that is where the parameters are
             ((AstLambdaExpression) parent).incMethodParameterIndex();

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=1504475&r1=1504474&r2=1504475&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/el/parser/TestAstLambdaExpression.java (original)
+++ tomcat/trunk/test/org/apache/el/parser/TestAstLambdaExpression.java Thu Jul 18 13:57:17 2013
@@ -144,4 +144,14 @@ public class TestAstLambdaExpression {
                         Integer.class);
         Assert.assertEquals(Integer.valueOf(1), result);
     }
+
+
+    @Test
+    public void testLambdaAsFunction() {
+        ELProcessor processor = new ELProcessor();
+        Object result =
+                processor.getValue("v = (x->y->x-y); v(2)(1)",
+                        Integer.class);
+        Assert.assertEquals(Integer.valueOf(1), result);
+    }
 }



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