/* Copyright (c) 2008 Arno Haase, Andr� Arnold. All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html Contributors: Arno Haase - initial API and implementation Andr� Arnold */ package org.eclipse.xtend.backend.expr; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.eclipse.xtend.backend.common.ExecutionContext; import org.eclipse.xtend.backend.common.ExpressionBase; import org.eclipse.xtend.backend.common.QualifiedName; import org.eclipse.xtend.backend.common.SourcePos; import org.eclipse.xtend.backend.common.SyntaxConstants; import org.eclipse.xtend.backend.syslib.CollectionOperations; /** * * @author Arno Haase (http://www.haase-consulting.com) * @author Andr� Arnold */ public final class InvocationOnCollectionExpression extends ExpressionBase { private final ExpressionBase _coll; private final QualifiedName _functionName; private final List<ExpressionBase> _params; public InvocationOnCollectionExpression (ExpressionBase coll, QualifiedName functionName, List<ExpressionBase> params, SourcePos sourcePos) { super (sourcePos); _coll = coll; _functionName = functionName; _params = params; } public ExpressionBase getCollection() { return _coll; } public QualifiedName getFunctionName() { return _functionName; } public List<ExpressionBase> getParams() { return _params; } @Override protected Object evaluateInternal(ExecutionContext ctx) { final Collection<?> coll = (Collection<?>) _coll.evaluate(ctx); boolean firstParamIsThis = false; if (_params.size() > 0 && _params.get(0) instanceof LocalVarEvalExpression) if (((LocalVarEvalExpression)_params.get(0)).getLocalVarName().equals(SyntaxConstants.THIS)) firstParamIsThis = true; if (coll == null) { ctx.logNullDeRef (getPos()); return null; } final List<Object> params = new ArrayList<Object>(); params.add (null); //placeholder for (ExpressionBase expr: _params) params.add (expr.evaluate (ctx)); final Collection<Object> result = CollectionOperations.createMatchingCollection (coll); for (Object o: coll) { params.set (0, o); CollectionOperations.addFlattened (result, ctx.getFunctionDefContext().invoke (ctx, _functionName, params, firstParamIsThis)); } return result; } }