package com.github.sommeri.less4j.core.compiler.expressions;
import java.util.List;
import com.github.sommeri.less4j.core.ast.Expression;
import com.github.sommeri.less4j.core.ast.FaultyExpression;
import com.github.sommeri.less4j.core.ast.FunctionExpression;
import com.github.sommeri.less4j.core.parser.HiddenTokenAwareTree;
import com.github.sommeri.less4j.core.problems.ProblemsHandler;
/**
* The function will accept any types of parameters. If they are not compatible with what
* functions do, it will throw an error.
*
*/
abstract class CatchAllMultiParameterFunction extends AbstractMultiParameterFunction {
@Override
public Expression evaluate(List<Expression> parameters, ProblemsHandler problemsHandler, FunctionExpression call, Expression evaluatedParameter) {
if (getMinParameters() == getMaxParameters() && parameters.size()!=getMinParameters()) {
problemsHandler.wrongNumberOfArgumentsToFunction(call, getName(), getMinParameters());
return new FaultyExpression(call);
}
if (parameters.size() < getMinParameters()) {
problemsHandler.wrongNumberOfArgumentsToFunctionMin(call, getName(), getMinParameters());
return new FaultyExpression(call);
}
if (parameters.size() > getMaxParameters()) {
problemsHandler.wrongNumberOfArgumentsToFunctionMax(call, getName(), getMaxParameters());
return new FaultyExpression(call);
}
for (int i = 0; i < parameters.size(); i++) {
if (!validateParameter(parameters.get(i), i, problemsHandler)) {
return new FaultyExpression(call);
}
}
return evaluate(parameters, problemsHandler, call, call.getUnderlyingStructure());
}
protected abstract Expression evaluate(List<Expression> splitParameters, ProblemsHandler problemsHandler, FunctionExpression functionCall, HiddenTokenAwareTree token);
}