blob: 94e10430cf6c1acd57ac37f2a5de28bb6d37c467 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 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.instantiation.impl;
import java.text.MessageFormat;
import java.util.List;
import org.eclipse.jem.internal.instantiation.*;
/**
* This naively flattens the ParseTree. It just works with what's there.
*
* @since 1.0.0
*/
public class NaiveExpressionFlattener extends ParseVisitor {
private StringBuffer buffer = new StringBuffer(100);
protected final StringBuffer getStringBuffer() {
return buffer;
}
/**
* Return the string result of the flattening.
* @return The flattened string.
*
* @since 1.0.0
*/
public String getResult() {
return buffer.toString();
}
/**
* Reset the result so that flattener can be used again.
*
* @since 1.0.0
*/
public void reset() {
buffer.setLength(0);
}
/* (non-Javadoc)
* @see org.eclipse.jem.internal.instantiation.ParseVisitor#visit(org.eclipse.jem.internal.instantiation.PTAnonymousClassDeclaration)
*/
public boolean visit(PTAnonymousClassDeclaration node) {
buffer.append(node.getDeclaration());
return false;
}
/* (non-Javadoc)
* @see org.eclipse.jem.internal.instantiation.ParseVisitor#visit(org.eclipse.jem.internal.instantiation.PTArrayAccess)
*/
public boolean visit(PTArrayAccess node) {
node.getArray().accept(this);
if (!node.getIndexes().isEmpty()) {
List indexes = node.getIndexes();
for (int i = 0; i < indexes.size(); i++) {
buffer.append('[');
((PTExpression) indexes.get(i)).accept(this);
buffer.append(']');
}
}
return false;
}
/* (non-Javadoc)
* @see org.eclipse.jem.internal.instantiation.ParseVisitor#visit(org.eclipse.jem.internal.instantiation.PTArrayCreation)
*/
public boolean visit(PTArrayCreation node) {
String arrayType = node.getType();
int ob = arrayType.indexOf('[');
String type = handleQualifiedName(arrayType.substring(0, ob));
buffer.append("new "); //$NON-NLS-1$
buffer.append(type);
int realdims = 0;
while (ob != -1) {
realdims++;
ob = arrayType.indexOf('[',ob+1);
}
List dims = node.getDimensions();
for (int i = 0; i < dims.size(); i++) {
buffer.append('[');
((PTExpression) dims.get(i)).accept(this);
buffer.append(']');
}
for (int i=dims.size(); i < realdims; i++) {
buffer.append("[]"); //$NON-NLS-1$
}
if (node.getInitializer() != null) {
buffer.append(' ');
((PTExpression) node.getInitializer()).accept(this);
}
return false;
}
/* (non-Javadoc)
* @see org.eclipse.jem.internal.instantiation.ParseVisitor#visit(org.eclipse.jem.internal.instantiation.PTArrayInitializer)
*/
public boolean visit(PTArrayInitializer node) {
buffer.append('{');
List exp = node.getExpressions();
for (int i = 0; i < exp.size(); i++) {
if (i != 0)
buffer.append(", "); //$NON-NLS-1$
((PTExpression) exp.get(i)).accept(this);
}
buffer.append('}');
return false;
}
/* (non-Javadoc)
* @see org.eclipse.jem.internal.instantiation.ParseVisitor#visit(org.eclipse.jem.internal.instantiation.PTBooleanLiteral)
*/
public boolean visit(PTBooleanLiteral node) {
buffer.append(node.isBooleanValue() ? "true" : "false"); //$NON-NLS-1$ //$NON-NLS-2$
return false;
}
/* (non-Javadoc)
* @see org.eclipse.jem.internal.instantiation.ParseVisitor#visit(org.eclipse.jem.internal.instantiation.PTCastExpression)
*/
public boolean visit(PTCastExpression node) {
buffer.append('(');
buffer.append(handleQualifiedName(node.getType()));
buffer.append(") "); //$NON-NLS-1$
node.getExpression().accept(this);
return false;
}
/* (non-Javadoc)
* @see org.eclipse.jem.internal.instantiation.ParseVisitor#visit(org.eclipse.jem.internal.instantiation.PTCharacterLiteral)
*/
public boolean visit(PTCharacterLiteral node) {
buffer.append(node.getEscapedValue());
return false;
}
/* (non-Javadoc)
* @see org.eclipse.jem.internal.instantiation.ParseVisitor#visit(org.eclipse.jem.internal.instantiation.PTClassInstanceCreation)
*/
public boolean visit(PTClassInstanceCreation node) {
buffer.append("new "); //$NON-NLS-1$
buffer.append(handleQualifiedName(node.getType()));
buffer.append('(');
List args = node.getArguments();
for (int i = 0; i < args.size(); i++) {
if (i != 0)
buffer.append(", "); //$NON-NLS-1$
((PTExpression) args.get(i)).accept(this);
}
buffer.append(')');
return false;
}
/* (non-Javadoc)
* @see org.eclipse.jem.internal.instantiation.ParseVisitor#visit(org.eclipse.jem.internal.instantiation.PTConditionalExpression)
*/
public boolean visit(PTConditionalExpression node) {
node.getCondition().accept(this);
buffer.append(" ? "); //$NON-NLS-1$
node.getTrue().accept(this);
buffer.append(" : "); //$NON-NLS-1$
node.getFalse().accept(this);
return false;
}
/* (non-Javadoc)
* @see org.eclipse.jem.internal.instantiation.ParseVisitor#visit(org.eclipse.jem.internal.instantiation.PTFieldAccess)
*/
public boolean visit(PTFieldAccess node) {
node.getReceiver().accept(this);
buffer.append('.');
buffer.append(node.getField());
return false;
}
/* (non-Javadoc)
* @see org.eclipse.jem.internal.instantiation.ParseVisitor#visit(org.eclipse.jem.internal.instantiation.PTInfixExpression)
*/
public boolean visit(PTInfixExpression node) {
node.getLeftOperand().accept(this);
buffer.append(' ');
String oper = node.getOperator().getOperator();
buffer.append(oper);
buffer.append(' ');
node.getRightOperand().accept(this);
List ext = node.getExtendedOperands();
for (int i = 0; i < ext.size(); i++) {
buffer.append(' ');
buffer.append(oper);
buffer.append(' ');
((PTExpression) ext.get(i)).accept(this);
}
return false;
}
/* (non-Javadoc)
* @see org.eclipse.jem.internal.instantiation.ParseVisitor#visit(org.eclipse.jem.internal.instantiation.PTInstanceof)
*/
public boolean visit(PTInstanceof node) {
node.getOperand().accept(this);
buffer.append(" instanceof "); //$NON-NLS-1$
buffer.append(handleQualifiedName(node.getType()));
return false;
}
/* (non-Javadoc)
* @see org.eclipse.jem.internal.instantiation.ParseVisitor#visit(org.eclipse.jem.internal.instantiation.PTInvalidExpression)
*/
public boolean visit(PTInvalidExpression node) {
buffer.append(MessageFormat.format(InstantiationImplMessages.NaiveExpressionFlattener_InvalidExpression, new Object[]{node.getMessage()}));
return false;
}
/* (non-Javadoc)
* @see org.eclipse.jem.internal.instantiation.ParseVisitor#visit(org.eclipse.jem.internal.instantiation.PTMethodInvocation)
*/
public boolean visit(PTMethodInvocation node) {
if (node.getReceiver() != null) {
node.getReceiver().accept(this);
buffer.append('.');
}
buffer.append(node.getName());
buffer.append('(');
List args = node.getArguments();
for (int i = 0; i < args.size(); i++) {
if (i != 0)
buffer.append(", "); //$NON-NLS-1$
((PTExpression) args.get(i)).accept(this);
}
buffer.append(')');
return false;
}
/* (non-Javadoc)
* @see org.eclipse.jem.internal.instantiation.ParseVisitor#visit(org.eclipse.jem.internal.instantiation.PTName)
*/
public boolean visit(PTName node) {
buffer.append(handleQualifiedName(node.getName()));
return false;
}
/* (non-Javadoc)
* @see org.eclipse.jem.internal.instantiation.ParseVisitor#visit(org.eclipse.jem.internal.instantiation.PTNullLiteral)
*/
public boolean visit(PTNullLiteral node) {
buffer.append("null"); //$NON-NLS-1$
return false;
}
/* (non-Javadoc)
* @see org.eclipse.jem.internal.instantiation.ParseVisitor#visit(org.eclipse.jem.internal.instantiation.PTNumberLiteral)
*/
public boolean visit(PTNumberLiteral node) {
buffer.append(node.getToken());
return false;
}
/* (non-Javadoc)
* @see org.eclipse.jem.internal.instantiation.ParseVisitor#visit(org.eclipse.jem.internal.instantiation.PTParenthesizedExpression)
*/
public boolean visit(PTParenthesizedExpression node) {
buffer.append('(');
node.getExpression().accept(this);
buffer.append(')');
return false;
}
/* (non-Javadoc)
* @see org.eclipse.jem.internal.instantiation.ParseVisitor#visit(org.eclipse.jem.internal.instantiation.PTPrefixExpression)
*/
public boolean visit(PTPrefixExpression node) {
buffer.append(node.getOperator().getOperator());
node.getExpression().accept(this);
return false;
}
/* (non-Javadoc)
* @see org.eclipse.jem.internal.instantiation.ParseVisitor#visit(org.eclipse.jem.internal.instantiation.PTStringLiteral)
*/
public boolean visit(PTStringLiteral node) {
buffer.append(node.getEscapedValue());
return false;
}
/* (non-Javadoc)
* @see org.eclipse.jem.internal.instantiation.ParseVisitor#visit(org.eclipse.jem.internal.instantiation.PTThisLiteral)
*/
public boolean visit(PTThisLiteral node) {
buffer.append("this"); //$NON-NLS-1$
return false;
}
/* (non-Javadoc)
* @see org.eclipse.jem.internal.instantiation.ParseVisitor#visit(org.eclipse.jem.internal.instantiation.PTTypeLiteral)
*/
public boolean visit(PTTypeLiteral node) {
buffer.append(handleQualifiedName(node.getType()));
buffer.append(".class"); //$NON-NLS-1$
return false;
}
/**
* This method enables one to overide the handling of qualified names.
* The default operation is to do nothing.
*
* Overriders may choose to use short names, relying on import statement handling.
*
* @param qName
* @return Name to use for the flattened result
*/
protected String handleQualifiedName(String qName) {
return qName;
}
}