Browse Source

lambda 支持其他类型表达式

kangjie 5 years ago
parent
commit
54e15eb45d

+ 0 - 14
src/main/java/org/ssssssss/expression/ExpressionEngine.java

@@ -11,21 +11,7 @@ public class ExpressionEngine {
 		return ExpressionTemplate.create(expression).render(context);
 	}
 
-	public static void main(String[] args) {
 
-		ExpressionEngine engine = new ExpressionEngine();
-
-		Map<String, Object> params = new HashMap<>();
-		params.put("abc", "876");
-		ArrayList<Object> list = new ArrayList<>();
-		list.add("987654321");
-		list.add("");
-		params.put("e", list);
-		Object result = engine.execute("${e.map(e->123)}", params);
-		System.out.println(result);
-
-
-	}
 	
 	public Object executeWrap(String expression, Map<String, Object> variables) {
 		return execute("${" + expression + "}", variables);

+ 4 - 4
src/main/java/org/ssssssss/expression/parsing/ArrayLikeLambdaExecutor.java

@@ -18,10 +18,10 @@ public class ArrayLikeLambdaExecutor {
 
     private static void addSupport(Map<String, Method> temp, String name) {
         SUPPORT_METHOD.add(name);
-        init(temp, name);
+        addMethod(temp, name);
     }
 
-    private static void init(Map<String, Method> initialMap, String name) {
+    private static void addMethod(Map<String, Method> initialMap, String name) {
         try {
             initialMap.put(name, ArrayLikeLambdaExecutor.class.getMethod(name, Object.class, Object[].class));
         } catch (NoSuchMethodException e) {
@@ -46,9 +46,9 @@ public class ArrayLikeLambdaExecutor {
         } else if (arrayLike.getClass().isArray()) {
             return results.toArray();
         } else if (arrayLike instanceof Iterator) {
-
+            return results;
         } else if (arrayLike instanceof Enumeration) {
-
+            return results;
         }
         throw new RuntimeException("未实现");
     }

+ 23 - 0
src/main/java/org/ssssssss/expression/parsing/Ast.java

@@ -16,6 +16,7 @@ import java.io.IOException;
 import java.lang.reflect.Array;
 import java.lang.reflect.InvocationTargetException;
 import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
 import java.util.function.Supplier;
 import java.util.stream.Collectors;
 
@@ -1012,12 +1013,34 @@ public abstract class Ast {
 					VariableAccess arrLike = (VariableAccess) object;
 					String parName = arrLike.getVariableName().getText();
 					Object arrLikeObj = context.get(parName);
+					if (arrLikeObj.getClass().isArray()) {
+						try {
+							Integer size = (Integer) arrLikeObj.getClass().getDeclaredField("length").get(arrLikeObj);
+							List<Object> list = new ArrayList<>(size);
+							for (int i = 0; i < size; i++) {
+								list.add(Array.get(arrLikeObj, i));
+							}
+							arrLikeObj = list;
+						} catch (Exception e) {
+							e.printStackTrace();
+						}
+					} else if (arrLikeObj instanceof Iterator) {
+						Iterator<?> it = (Iterator<?>) arrLikeObj;
+						List<Object> list = new ArrayList<>();
+						it.forEachRemaining(list::add);
+						arrLikeObj = list;
+					} else if (arrLikeObj instanceof Enumeration) {
+						Enumeration<?> en = (Enumeration<?>) arrLikeObj;
+						arrLikeObj = Collections.list(en);
+					}
 					if (arrLikeObj instanceof Collection) {
 						Collection<?> coll = (Collection<?>) arrLikeObj;
+						AtomicInteger ai = new AtomicInteger();
 						return coll.stream().map(o -> ((Supplier) () -> {
 							try {
 								context.push();
 								context.setOnCurrentScope(getElement().getSpan().getText(), o);
+								context.setOnCurrentScope("_i", ai.getAndIncrement());
 								Object res = function.evaluate(template, context);
 								context.pop();
 								return res;

+ 5 - 5
src/main/java/org/ssssssss/expression/parsing/Parser.java

@@ -1,9 +1,9 @@
-package com.ssssssss.expression.parsing;
+package org.ssssssss.expression.parsing;
 
 
-import com.ssssssss.expression.ExpressionError;
-import com.ssssssss.expression.ExpressionTemplate;
-import com.ssssssss.expression.parsing.Ast.*;
+import org.ssssssss.expression.ExpressionError;
+import org.ssssssss.expression.ExpressionTemplate;
+import org.ssssssss.expression.parsing.Ast.*;
 
 import javax.xml.transform.Source;
 import java.util.ArrayList;
@@ -16,7 +16,7 @@ public class Parser {
 
 	/** Parses a {@link Source} into a {@link ExpressionTemplate}. **/
 	public static List<Node> parse (String source) {
-		List<Node> nodes = new ArrayList<Node>();
+		List<Node> nodes = new ArrayList<Ast.Node>();
 		TokenStream stream = new TokenStream(new Tokenizer().tokenize(source));
 		while (stream.hasMore()) {
 			nodes.add(parseStatement(stream));