/******************************************************************************* * 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; /* */ /** */ public class Block extends Expression { protected boolean fIsClosed = false; protected boolean fIsComplete = false; protected boolean fMessageOrField = false; public Block(Expression anExpression){ currentExpression = anExpression; } public Block(ClassLoader fClassLoader){ currentExpression = new Statement(fClassLoader); } public Object evaluate() throws Exception { return currentExpression.evaluate(); } public boolean isComplete() { return fIsComplete; } public Class getTypeClass() throws Exception { return currentExpression.getTypeClass(); } public Expression push(char[] token, char tokenDelimiter) { // If we are closed (i.e. completed with a )) and we get a ) or , then we are all finished up // We should not forward this token to the expression, as it isComplete if ((fIsClosed || currentExpression.isComplete()) && (tokenDelimiter == DelimiterCloseParen || tokenDelimiter == DelimiterComma)){ fIsComplete = true; return this; } // If we are a message of field and we get a ( we are message or a field otherwise if (fMessageOrField){ fMessageOrField = false; // The problem now is that we are a block of an expression and we need to create a message // where we are the receiver. However we are on the stack and going to be popped when the message finishes // so we must alter ourself to be a block whose current expression is message whose argument // is a copy of us if ( tokenDelimiter == DelimiterOpenParen){ Message message = new Message(currentExpression,token,fClassLoader); currentExpression = message; return message; } else { Field field = new Field(currentExpression,token,fClassLoader); currentExpression = field; return field; } } // If we are closed and we get a . then we must begin a message or field expression if (currentExpression.isComplete() && tokenDelimiter == DelimiterPeriod ){ fMessageOrField = true; return this; } Expression result = currentExpression.push(token,tokenDelimiter); // If the result if a push then push the stack if ( result != currentExpression ) { pushExpressionStack(result); } // If our current expression is complete and we are receiving a close parent then we are closed if (currentExpression.isComplete() && tokenDelimiter == DelimiterCloseParen){ fIsClosed = true; } // If we are here the current expression is still processing tokens so we should return it return currentExpression; } public boolean isPrimitive() throws Exception { return false; } public String toString(){ StringBuffer buffer = new StringBuffer(); buffer.append("Block("); //$NON-NLS-1$ if ( currentExpression != null ) { buffer.append(currentExpression.toString()); } buffer.append(')'); return buffer.toString(); } /* (non-Javadoc) * @see org.eclipse.jem.internal.proxy.core.initParser.Expression#getTypeClassName() */ protected String getTypeClassName() { return currentExpression.getTypeClassName(); } }