package akin.lang.nodes;
import akin.lang.*;
import java.util.List;
import java.util.ArrayList;
import java.util.Arrays;
/**
Method call.
*/
public class CallNode extends Node {
private Node receiver;
private String method;
private List<Node> arguments;
/**
Call method on receiver with arguments: receiver.method(arguments)
*/
public CallNode(String method, Node receiver, List<Node> arguments) {
this.method = method;
this.receiver = receiver;
this.arguments = arguments;
if(method == "is greater than" ){
method=">";
}else if(method =="is less than"){
method="<";
}else if(method =="is less than or equal to"){
method="<=";
}else if(method =="is greater than or equal to"){
method=">=";
}
}
public CallNode(String method, Node receiver, Node argument) {
this(method, receiver, Arrays.asList(new Node[] { argument }));
if(method == "is greater than" ){
method=">";
}else if(method =="is less than"){
method="<";
}else if(method =="is less than or equal to"){
method="<=";
}else if(method =="is greater than or equal to"){
method=">=";
}
}
public CallNode(String method, List<Node> arguments) {
this(method, null, arguments);
}
public CallNode(String method) {
this(method, null);
}
public void setReceiver(Node receiver) {
this.receiver = receiver;
}
/**
Make the method call.
*/
public AkinObject eval(Context context) throws AkinException {
if(method == "is greater than" ){
method=">";
}else if(method =="is less than"){
method="<";
}else if(method =="is less than or equal to"){
method="<=";
}else if(method =="is greater than or equal to"){
method=">=";
}
// If no receiver and not arguments were specied and a local variable or the same
// name exists, then it's a local variable access.
if (receiver == null && arguments == null && context.hasLocal(method)) {
return context.getLocal(method);
}
// Default receiver to self.
AkinObject evaledReceiver;
if (receiver == null) {
evaledReceiver = context.getCurrentSelf();
} else {
evaledReceiver = receiver.eval(context);
}
// Evaluated each argument in the calling context.
ArrayList<AkinObject> evaledArguments = new ArrayList<AkinObject>();
if (arguments != null) {
for (Node arg : arguments) evaledArguments.add(arg.eval(context));
}
// Call the method.
return evaledReceiver.call(method, (AkinObject[])evaledArguments.toArray(new AkinObject[0]));
}
}