/*******************************************************************************
 * Copyright (c) 2001, 2005 IBM Corporation 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jem.internal.proxy.initParser;
/*


 */


import java.io.StringWriter;
import java.util.*;

public class MessageArgument extends Expression {

	protected boolean isComplete = false;
	Expression fExpression;
	ArrayList fExpressionStack = new ArrayList();

public MessageArgument(Expression anExpression){
	fExpression = anExpression;
}
	
public Object evaluate() throws Exception {
	
	return fExpression.evaluate();
	
}	

public Class getTypeClass() throws Exception {
	
	return fExpression.getTypeClass();
	
}

protected String getTypeClassName() {
	return fExpression.getTypeClassName();
}
public boolean isComplete(){
	return isComplete || fExpression.isComplete();
}
	
public Expression push(char[] token , char delimiter){

	// Even if our expression is complete and we receive anything other than a , then the expression must process it as this may be a field or message
	// that is being sent to the expression to make up a complex argument	
	Expression result = fExpression.push(token,delimiter);
	// If the result if a push then push the stack
	if ( result != fExpression ) {
		pushExpressionStack(result);
	} else if (result.isComplete()){
		// If our expression is complete, we are completed with a ) pop the stack so the previous expression can process us
		if (delimiter == DelimiterCloseParen ) {
			isComplete = true;
			popExpressionStack();
		} else if (delimiter == DelimiterComma || delimiter == DelimiterQuote ) {
			// If we receive a comma we pop the stack so the previous expression can process us but we don't flag us as complete
			popExpressionStack();
			// unless our expression is some array argument AND it is complete AND we have a close elipse }
		} else if ( delimiter == DelimiterCloseElipse ) {
			popExpressionStack();
			if ( fExpression instanceof ArrayArguments ) {
				isComplete = true;
			}
		}
	}
	return this;
}	
	
/* Pop the top expression off the stack
 */
protected void popExpressionStack(){

	if ( fExpressionStack.size() > 0 ) {
		Expression lastExpression = (Expression)fExpressionStack.get(fExpressionStack.size() - 1);
		if ( !lastExpression.isComplete() ) {
			fExpression = (Expression) fExpressionStack.remove(fExpressionStack.size() - 1);
		} else { 
			isComplete = true;
		} 
	} else {
		isComplete = true;
	}
}

/* Push the expression onto the stack
 */
protected void pushExpressionStack(Expression anExpression){

	// The current expression should go onto the stack
	fExpressionStack.add(fExpression);
	// The current expression is replaced with the argument
	fExpression = anExpression;
	
}

public boolean isPrimitive(){
	return false;
}
public String toString(){
	StringWriter writer = new StringWriter();
	writer.write("Arg("); //$NON-NLS-1$
	if ( fExpression != null ) {
		writer.write(fExpression.toString());
	}
	writer.write(")"); //$NON-NLS-1$
	return writer.toString();
}
public void contributeArgumentNumber(List argumentNumberList){

	if ( fExpression instanceof ArrayArguments ) {
		((ArrayArguments)fExpression).contributeArgumentNumber(argumentNumberList);
	}	
	
}
}
