Author: markt
Date: Sun Jul 14 21:07:26 2013
New Revision: 1503056

URL: http://svn.apache.org/r1503056
Log:
Start to implement the lambda expression syntax. Very basic expressions work. I 
expect further changes to be required for more complex expressions.
Includes the initial unit tests for this syntax.

Added:
    tomcat/trunk/test/org/apache/el/parser/TestAstLambdaExpression.java   (with 
props)
Modified:
    tomcat/trunk/java/org/apache/el/Messages.properties
    tomcat/trunk/java/org/apache/el/parser/AstIdentifier.java
    tomcat/trunk/java/org/apache/el/parser/AstLambdaExpression.java
    tomcat/trunk/java/org/apache/el/parser/AstLambdaExpressionOrInvocation.java

Modified: tomcat/trunk/java/org/apache/el/Messages.properties
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/el/Messages.properties?rev=1503056&r1=1503055&r2=1503056&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/el/Messages.properties (original)
+++ tomcat/trunk/java/org/apache/el/Messages.properties Sun Jul 14 21:07:26 2013
@@ -51,4 +51,7 @@ error.fnMapper.paramcount=Function ''{0}
 error.context.null=ELContext was null
 
 # Parser
-error.identifier.notjava=The identifier [{0}] is not a valid Java identifier 
as required by section 1.19 of the EL specification (Identifier ::= Java 
language identifier). This check can be disabled by setting the system property 
org.apache.el.parser.SKIP_IDENTIFIER_CHECK to true.
\ No newline at end of file
+error.identifier.notjava=The identifier [{0}] is not a valid Java identifier 
as required by section 1.19 of the EL specification (Identifier ::= Java 
language identifier). This check can be disabled by setting the system property 
org.apache.el.parser.SKIP_IDENTIFIER_CHECK to true.
+
+# AstLambdaExpression
+error.args.tooFew=Only [{0}] arguments were provided for a lambda expression 
that requires at least [{1}]

Modified: tomcat/trunk/java/org/apache/el/parser/AstIdentifier.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/el/parser/AstIdentifier.java?rev=1503056&r1=1503055&r2=1503056&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/el/parser/AstIdentifier.java (original)
+++ tomcat/trunk/java/org/apache/el/parser/AstIdentifier.java Sun Jul 14 
21:07:26 2013
@@ -61,6 +61,12 @@ public final class AstIdentifier extends
 
     @Override
     public Object getValue(EvaluationContext ctx) throws ELException {
+        // Lambda parameters
+        if (ctx.isLambdaArgument(this.image)) {
+            return ctx.getLambdaArgument(this.image);
+        }
+
+        // Variable mapper
         VariableMapper varMapper = ctx.getVariableMapper();
         if (varMapper != null) {
             ValueExpression expr = varMapper.resolveVariable(this.image);
@@ -68,6 +74,8 @@ public final class AstIdentifier extends
                 return expr.getValue(ctx.getELContext());
             }
         }
+
+        // EL Resolvers
         ctx.setPropertyResolved(false);
         Object result = ctx.getELResolver().getValue(ctx, null, this.image);
         if (!ctx.isPropertyResolved()) {

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=1503056&r1=1503055&r2=1503056&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/el/parser/AstLambdaExpression.java (original)
+++ tomcat/trunk/java/org/apache/el/parser/AstLambdaExpression.java Sun Jul 14 
21:07:26 2013
@@ -17,10 +17,53 @@
 /* Generated By:JJTree: Do not edit this line. AstLambdaExpression.java 
Version 4.3 */
 package org.apache.el.parser;
 
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.el.ELException;
+
+import org.apache.el.lang.EvaluationContext;
+import org.apache.el.util.MessageFactory;
+
 public class AstLambdaExpression extends SimpleNode {
 
     public AstLambdaExpression(int id) {
         super(id);
     }
+
+    @SuppressWarnings("null") // paramValues[i] can't be null due to checks
+    @Override
+    public Object invoke(EvaluationContext ctx, Class<?>[] paramTypes,
+            Object[] paramValues) throws ELException {
+
+        // Two children - the formal parameters and the expression
+        AstLambdaParameters formalParameters =
+                (AstLambdaParameters) children[0];
+
+        int paramCount = formalParameters.children.length;
+        int argCount = 0;
+        if (paramValues != null) {
+            argCount = paramValues.length;
+        }
+        if (paramCount > argCount) {
+            throw new ELException(MessageFactory.get("error.args.tooFew",
+                    Integer.valueOf(argCount), Integer.valueOf(paramCount)));
+        }
+
+        // Build the argument map
+        Map<String,Object> lambdaArgumnents = new HashMap<>();
+        for (int i = 0; i < formalParameters.children.length; i++) {
+            lambdaArgumnents.put(formalParameters.children[i].getImage(),
+                    paramValues[i]);
+        }
+
+        ctx.enterLambdaScope(lambdaArgumnents);
+
+        try {
+            return children[1].getValue(ctx);
+        } finally {
+            ctx.exitLambdaScope();
+        }
+    }
 }
 /* JavaCC - OriginalChecksum=071159eff10c8e15ec612c765ae4480a (do not edit 
this line) */

Modified: 
tomcat/trunk/java/org/apache/el/parser/AstLambdaExpressionOrInvocation.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/el/parser/AstLambdaExpressionOrInvocation.java?rev=1503056&r1=1503055&r2=1503056&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/el/parser/AstLambdaExpressionOrInvocation.java 
(original)
+++ tomcat/trunk/java/org/apache/el/parser/AstLambdaExpressionOrInvocation.java 
Sun Jul 14 21:07:26 2013
@@ -17,10 +17,33 @@
 /* Generated By:JJTree: Do not edit this line. 
AstLambdaExpressionOrInvocation.java Version 4.3 */
 package org.apache.el.parser;
 
-public
-class AstLambdaExpressionOrInvocation extends SimpleNode {
-  public AstLambdaExpressionOrInvocation(int id) {
-    super(id);
-  }
+import javax.el.ELException;
+
+import org.apache.el.lang.EvaluationContext;
+
+public class AstLambdaExpressionOrInvocation extends SimpleNode {
+
+    public AstLambdaExpressionOrInvocation(int id) {
+        super(id);
+    }
+
+
+    @Override
+    public Object getValue(EvaluationContext ctx) throws ELException {
+
+        if (children.length == 2) {
+            AstLambdaExpression lambdaExpression =
+                    (AstLambdaExpression) children[0];
+
+
+            Object[] args =
+                    ((AstMethodParameters) children[1]).getParameters(ctx);
+
+            return lambdaExpression.invoke(ctx, null, args);
+        }
+
+        // TODO Auto-generated method stub
+        return super.getValue(ctx);
+    }
 }
 /* JavaCC - OriginalChecksum=6b3dd15b31540457a41bd55974037ed9 (do not edit 
this line) */

Added: 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=1503056&view=auto
==============================================================================
--- tomcat/trunk/test/org/apache/el/parser/TestAstLambdaExpression.java (added)
+++ tomcat/trunk/test/org/apache/el/parser/TestAstLambdaExpression.java Sun Jul 
14 21:07:26 2013
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.el.parser;
+
+import javax.el.ELProcessor;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class TestAstLambdaExpression {
+
+    @Test
+    public void testSpec01() {
+        ELProcessor processor = new ELProcessor();
+        Object result = processor.getValue("(x->x+1)(1)", Integer.class);
+        Assert.assertEquals(Integer.valueOf(2), result);
+    }
+}

Propchange: tomcat/trunk/test/org/apache/el/parser/TestAstLambdaExpression.java
------------------------------------------------------------------------------
    svn:eol-style = native



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

Reply via email to