package org.smoothbuild.lang.function.def;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
import static java.util.Arrays.asList;
import static org.smoothbuild.task.base.Computer.virtualComputer;
import java.util.List;
import org.smoothbuild.db.values.ValuesDb;
import org.smoothbuild.lang.expr.Expression;
import org.smoothbuild.lang.function.base.AbstractFunction;
import org.smoothbuild.lang.function.base.Signature;
import org.smoothbuild.lang.function.nativ.NativeFunction;
import org.smoothbuild.lang.message.CodeLocation;
import org.smoothbuild.task.base.Computer;
/**
* Smooth function defined in smooth language via smooth expression.
*
* @see NativeFunction
*/
public class DefinedFunction extends AbstractFunction {
private final Expression root;
public DefinedFunction(Signature signature, Expression root) {
super(signature);
this.root = checkNotNull(root);
}
public Expression root() {
return root;
}
public Expression createCallExpression(List<Expression> args, boolean isGenerated,
CodeLocation codeLocation) {
checkArgument(args.isEmpty());
checkArgument(!isGenerated);
return new Expression(type(), asList(root), codeLocation) {
public Computer createComputer(ValuesDb valuesDb) {
return virtualComputer(DefinedFunction.this, codeLocation());
}
};
}
}