private Expression toEnumerable(Expression expression) { final Type type = expression.getType(); if (Types.isArray(type)) { if (Types.toClass(type).getComponentType().isPrimitive()) { expression = Expressions.call(BuiltInMethod.AS_LIST.method, expression); } return Expressions.call(BuiltInMethod.AS_ENUMERABLE.method, expression); } else if (Types.isAssignableFrom(Iterable.class, type) && !Types.isAssignableFrom(Enumerable.class, type)) { return Expressions.call(BuiltInMethod.AS_ENUMERABLE2.method, expression); } else if (Types.isAssignableFrom(Queryable.class, type)) { // Queryable extends Enumerable, but it's too "clever", so we call // Queryable.asEnumerable so that operations such as take(int) will be // evaluated directly. return Expressions.call(expression, BuiltInMethod.QUERYABLE_AS_ENUMERABLE.method); } return expression; }
private Expression toEnumerable(Expression expression) { final Type type = expression.getType(); if (Types.isArray(type)) { if (Types.toClass(type).getComponentType().isPrimitive()) { expression = Expressions.call(BuiltInMethod.AS_LIST.method, expression); } return Expressions.call(BuiltInMethod.AS_ENUMERABLE.method, expression); } else if (Types.isAssignableFrom(Iterable.class, type) && !Types.isAssignableFrom(Enumerable.class, type)) { return Expressions.call(BuiltInMethod.AS_ENUMERABLE2.method, expression); } else if (Types.isAssignableFrom(Queryable.class, type)) { // Queryable extends Enumerable, but it's too "clever", so we call // Queryable.asEnumerable so that operations such as take(int) will be // evaluated directly. return Expressions.call(expression, BuiltInMethod.QUERYABLE_AS_ENUMERABLE.method); } return expression; }