
public class CallNode extends Node {
	private Node operator;
	private ConsNode operands;
	public CallNode(Node operator, ConsNode operands) {
		this.setOperator(operator);
		this.setOperands(operands);
	}
	public CallNode(Node operator, Node[] aoperands) {
		this.operator = operator;
		ConsNode lastCons = null;
		ConsNode consNode = null;
		for(Node operand : aoperands) {
			if(operand == null)
				break;
			assert(operand != null);
			consNode = new ConsNode(operand, null);
			if(lastCons != null)
				lastCons.setRest(consNode);
			else
				this.operands = consNode;
			lastCons = consNode;
		}
	}
	public void setOperands(ConsNode operands) {
		this.operands = operands;
	}
	public ConsNode getOperands() {
		return operands;
	}
	public void setOperator(Node operator) {
		this.operator = operator;
	}
	public Node getOperator() {
		return operator;
	}
	public static boolean isTraditionalOperator(Symbol ID) {
		return ID == Tokenizer.S_plus || 
		       ID == Tokenizer.S_dash || 
		       ID == Tokenizer.S_star || 
		       ID == Tokenizer.S_ampersand || 
		       ID == Tokenizer.S_equal || 
		       ID == Tokenizer.S_equalequal || 
		       ID == Tokenizer.S_questionmark; // FIXME more. 
	}
	public static boolean isTraditionalOperator(Node node) {
		if(node instanceof SymbolResolveNode)
			return isTraditionalOperator(((SymbolResolveNode) node).getName());
		else
			return false;
	}
	@Override
	public String toIndentedString(int surroundingIndentation) {
		Node operator = this.operator;
		if(isTraditionalOperator(operator)) {
			assert(operands != null);
			if(operands.getRest() != null) { // at least binary
				Object head = operands.getHead();
				Object head2 = operands.getRest().getHead();
				if(operands.getRest().getRest() != null) { // ternary
					Object head3 = operands.getRest().getRest().getHead();
					if(head2 instanceof BlockNode || head3 instanceof BlockNode) {
						//operator = new SymbolResolveNode(Symbol.intern("if"), ((SymbolResolveNode) operator).getScope());
						return String.format("if(%s) %s else %s", head.toString(), Node.toIndentedString(head2, surroundingIndentation), Node.toIndentedString(head3, surroundingIndentation));
					}
					return String.format("(%s) %s %s : %s)", head.toString(), operator.toString(), Node.toIndentedString(head2, surroundingIndentation), Node.toIndentedString(head3, surroundingIndentation));
				} else
					return String.format("(%s %s %s)", head.toString(), operator.toString(), head2.toString());
			} else
				return String.format("%s%s", operator.toString(), operands.getHead());
		} else
			return String.format("%s(%s)", operator.toString(), operands != null ? operands.toString() : null);
	}
}
