blob: f76079a5d37a7f70c495a971e1cdd8eedb077300 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009 - 2010 Cloudsmith Inc. and others.
* 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:
* Cloudsmith Inc. - initial API and implementation
*******************************************************************************/
package org.eclipse.equinox.p2.metadata.expression;
import java.util.List;
/**
* This inteface provides all the factory methods needed to create the
* nodes of the expression tree.
*/
public interface IExpressionFactory {
String FUNC_BOOLEAN = "boolean"; //$NON-NLS-1$
String FUNC_VERSION = "version"; //$NON-NLS-1$
String FUNC_CLASS = "class"; //$NON-NLS-1$
String FUNC_RANGE = "range"; //$NON-NLS-1$
String FUNC_FILTER = "filter"; //$NON-NLS-1$
IExpression[] NO_ARGS = new IExpression[0];
/**
* Create a collection filter that yields true if the <code>lambda</code> yields true for
* all of the elements of the <code>collection</code>
* @param collection The collection providing the elements to test
* @param lambda The lambda that performs the test
* @return A boolean expression
*/
IExpression all(IExpression collection, IExpression lambda);
/**
* Create a logical <i>and</i> of its <code>operands</code>.
* @param operands The boolean operands
* @return A boolean expression
*/
IExpression and(IExpression... operands);
/**
* Create an lookup of <code>key</code> in the <code>target</code>.
* The key expression should evaluate to a string or an integer.
* @param target The target for the lookup
* @param key The key to use for the lookup
* @return A lookup expression
*/
IExpression at(IExpression target, IExpression key);
/**
* Create an evaluation context with one single variable
* @param params Indexed parameters to use in the expression
* @return the context
*/
IEvaluationContext createContext(Object... params);
/**
* Create an evaluation context with one single variable
* @param params Indexed parameters to use in the expression
* @param variables The variables that will be maintained by the context
* @return the context
*/
IEvaluationContext createContext(IExpression[] variables, Object... params);
/**
* Creates an expression that evaluates to the constant <code>value</code>.
* @param value The constant
* @return A constant expression
*/
IExpression constant(Object value);
/**
* Create an expression that tests if <code>lhs</code> is equal to <code>rhs</code>.
* @param lhs The left hand side value.
* @param rhs The right hand side value.
* @return A boolean expression
*/
IExpression equals(IExpression lhs, IExpression rhs);
/**
* Create a collection filter that yields true if the <code>lambda</code> yields true for
* at least one of the elements of the <code>collection</code>
* @param collection The collection providing the elements to test
* @param lambda The lambda that performs the test
* @return A boolean expression
*/
IExpression exists(IExpression collection, IExpression lambda);
/**
* Creates a top level expression suitable for predicate matching
* @param expression The boolean expression
* @return A top level predicate expression
*/
IFilterExpression filterExpression(IExpression expression);
/**
* Create an expression that tests if <code>lhs</code> is greater than <code>rhs</code>.
* @param lhs The left hand side value.
* @param rhs The right hand side value.
* @return A boolean expression
*/
IExpression greater(IExpression lhs, IExpression rhs);
/**
* Create an expression that tests if <code>lhs</code> is greater than or equal to <code>rhs</code>.
* @param lhs The left hand side value.
* @param rhs The right hand side value.
* @return A boolean expression
*/
IExpression greaterEqual(IExpression lhs, IExpression rhs);
/**
* Creates an indexed parameter expression
* @param index The index to use
* @return a parameter expression
*/
IExpression indexedParameter(int index);
/**
* Creates a lambda expression that takes exactly one variable. Suitable for use
* in most collection expressions.
* @param variable The element variable that the lambda uses
* @param body The body of the lambda
* @return A lambda expression
*/
IExpression lambda(IExpression variable, IExpression body);
/**
* Create an expression that tests if <code>lhs</code> is less than <code>rhs</code>.
* @param lhs The left hand side value.
* @param rhs The right hand side value.
* @return A boolean expression
*/
IExpression less(IExpression lhs, IExpression rhs);
/**
* Create an expression that tests if <code>lhs</code> is less than or equal to <code>rhs</code>.
* @param lhs The left hand side value.
* @param rhs The right hand side value.
* @return A boolean expression
*/
IExpression lessEqual(IExpression lhs, IExpression rhs);
/**
* Performs boolean normalizations on the expression to create a canonical form.
* @param operands The operands to normalize
* @param expressionType The type (must be either {@link IExpression#TYPE_AND}
* or {@link IExpression#TYPE_OR}.
* @return The normalized expression
*/
IExpression normalize(List<? extends IExpression> operands, int expressionType);
/**
* Create an expression that tests if <code>lhs</code> matches <code>rhs</code>.
* @param lhs The left hand side value.
* @param rhs The right hand side value.
* @return A boolean expression
*/
IExpression matches(IExpression lhs, IExpression rhs);
/**
* Creates a parameterized top level expression suitable for predicate matching
* @param expression The boolean expression
* @param parameters The parameters to use in the call
* @return A top level predicate expression
*/
<T> IMatchExpression<T> matchExpression(IExpression expression, Object... parameters);
/**
* Creates a member accessor expression.
* @param target The target for the member access
* @param name The name of the member
* @return A member expression
*/
IExpression member(IExpression target, String name);
/**
* Creates an expression that negates the result of evaluating its <code>operand</code>.
* @param operand The boolean expression to negate
* @return A boolean expression
*/
IExpression not(IExpression operand);
/**
* Create a logical <i>or</i> of its <code>operands</code>.
* @param operands The boolean operands
* @return A boolean expression
*/
IExpression or(IExpression... operands);
/**
* Returns the variable that represents <code>this</this> in an expression
* @return The <code>this</this> variable.
*/
IExpression thisVariable();
/**
* Creates an expression that represents a variable
* @param name The name of the variable
* @return A variable expression
*/
IExpression variable(String name);
}