blob: 74bad262124b6494294f12bf9ac101b1da9ebd46 [file] [log] [blame]
/*******************************************************************************
* 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 Statement extends Expression {
public boolean isStringObject = false;
public boolean isCast = false;
protected boolean messageOrFieldStarted;
/**
* Statement constructor comment.
*/
public Statement(ClassLoader aClassLoader) {
super();
fClassLoader = aClassLoader;
}
public boolean isComplete(){
return currentExpression != null && currentExpression.isComplete();
}
/** Defer this to the expression
*/
public Object evaluate() throws Exception {
if ( currentExpression != null ) {
return currentExpression.evaluate();
} else {
throw new RuntimeException(ProxyInitParserMessages.getString(ProxyInitParserMessages.STATEMENT_UNEXPECTED_EXECUTION)); // This is not an evaluation error, it shouldn't of occured, so it is a parser error.
}
}
/**
*/
public Class getTypeClass() throws Exception {
return currentExpression.getTypeClass();
//throw new RuntimeException(ProxyBaseVMNLS.RESBUNDLE.getString(ProxyBaseVMNLS.STATEMENT_UNEXPECTED_EVALUATION));
}
protected String getTypeClassName() {
return currentExpression.getTypeClassName();
}
/** There are several types of token that can begin a statement.
* new , ' ' - Create a constructor
* 1-10, true, false, etc... - Create a literal
* Foo, '.' - Create a Type
*/
public Expression push(char[] token , char delimiter){
// If messageOrFieldStart is true then our expression is complete and either a message or field is being created
// See which it is and create the correct expression
if (messageOrFieldStarted){
messageOrFieldStarted = false;
if ( delimiter == DelimiterOpenParen){
Message message = new Message(currentExpression,token,fClassLoader);
currentExpression = message;
return message;
} else {
Field field = new Field(currentExpression,token,fClassLoader);
currentExpression = field;
return field;
}
}
// Look for "new " for a constructor"
if ( delimiter == DelimiterSpace && compare( token , ConstantNew ) ) {
// If we thought we were a possible cast and we now aren't then we must be a block expression
if ( isCast ) {
currentExpression = new Block(new Constructor(fClassLoader));
} else {
currentExpression = new Constructor(fClassLoader);
}
isCast = false; // Can't be a cast now
return currentExpression;
}
// Look for "null"
if ( compare( token , ConstantNull ) ) {
currentExpression = new NullLiteral();
isCast = false; // Can't be a cast now
// Null cannot process anything so we return the statement
return this;
}
// Look for a number
if ( isNumber( token ) || delimiter == OperMinus ) {
currentExpression = new NumberLiteral();
currentExpression = currentExpression.push(token,delimiter);
isCast = false; // Can't be a cast now
return currentExpression;
}
if ( compare( token , ConstantTrue ) ) {
currentExpression = new BooleanLiteral(true);
// true cannot process anything so we return the statement
isCast = false; // Can't be a cast now
return currentExpression;
// return this;
}
if ( compare( token , ConstantFalse ) ) {
// false cannot process anything so we return the statement
currentExpression = new BooleanLiteral(false);
isCast = false; // Can't be a cast now
return this;
}
if ( delimiter == DelimiterQuote ) {
currentExpression = new StringLiteral();
isCast = false; // Can't be a cast now
return currentExpression;
}
if ( delimiter == DelimiterSingleQuote ) {
currentExpression = new CharLiteral();
isCast = false; // Can't be a cast now
return currentExpression;
}
if (delimiter == DelimiterPeriod && token.length == 0 && currentExpression != null){
if (currentExpression instanceof StringLiteral){
//String s = "\"" + (String)(currentExpression.evaluate()) + "\"" ;
//return new Constructor(s);
isStringObject = true;
return this;
}
}
if (isStringObject && (token.length > 0) && (delimiter == DelimiterOpenParen)){
return new Message(currentExpression, token,fClassLoader);
}
//handle type casting
if ((token.length == 0) && (delimiter == DelimiterOpenParen)){
// If we are a already a cast then we must be a block.
if ( isCast ) {
currentExpression = new Block(fClassLoader);
} else {
isCast = true; // Possibly a cast
}
return this;
}
if (isCast && (delimiter == DelimiterCloseParen || token.length != 0)){
Static aStatic = new Static(fClassLoader);
Cast aCast = new Cast(aStatic,fClassLoader);
currentExpression = aCast.push(token,delimiter);
return currentExpression;
}
if ( token.length != 0 ) {
currentExpression = new Static(fClassLoader).push(token,delimiter);
return currentExpression;
}
// If we get a { then we are part of an array argument
if (delimiter == DelimiterOpenElipse){
currentExpression = new ArrayArguments();
return currentExpression;
}
// If our expression is closed and we receive a . we are either a message or a field. We won't know this until
// the next token we receive, which will be either be delimited by a ( in which case it is a message, else it is a field
if (currentExpression != null && currentExpression.isComplete() && delimiter == DelimiterPeriod){
messageOrFieldStarted = true;
}
return this;
}
public String toString(){
StringBuffer buffer = new StringBuffer();
buffer.append("Statement{"); //$NON-NLS-1$
if ( currentExpression != null ) {
buffer.append(currentExpression.toString());
}
buffer.append('}');
return buffer.toString();
}
/**
* Is this statement a primitive.
*/
public boolean isPrimitive() throws Exception {
if ( currentExpression != null ) {
return currentExpression.isPrimitive();
} else {
throw new RuntimeException(ProxyInitParserMessages.getString(ProxyInitParserMessages.STATEMENT_UNEXPECTED_EXECUTION));
}
}
}