| /******************************************************************************* |
| * 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; |
| /* |
| * $RCSfile: MessageArgument.java,v $ |
| * $Revision: 1.3 $ $Date: 2005/08/24 20:39:07 $ |
| */ |
| |
| |
| 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); |
| } |
| |
| } |
| } |