blob: d2b123cc87eca73d52b83e9289aada0de62063db [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.util.List;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.impl.EObjectImpl;
import org.eclipse.jem.internal.instantiation.*;
import org.eclipse.jem.internal.instantiation.PTExpression;
import org.eclipse.jem.internal.instantiation.InstantiationPackage;
/**
* <!-- begin-user-doc -->
* An implementation of the model object '<em><b>Expression</b></em>'.
* <!-- end-user-doc -->
* <p>
* </p>
*
* @generated
*/
public abstract class PTExpressionImpl extends EObjectImpl implements PTExpression {
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
protected PTExpressionImpl() {
super();
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
protected EClass eStaticClass() {
return InstantiationPackage.eINSTANCE.getPTExpression();
}
/*
* (non-Javadoc)
* @see org.eclipse.jem.internal.instantiation.Expression#accept(org.eclipse.jem.internal.instantiation.ParseVisitor)
*/
public final void accept(ParseVisitor visitor) {
try {
childAccept0(visitor);
} catch (ParseVisitor.StopVisiting e) {
// Do nothing, this is a normal way to just stop visiting.
}
}
/**
* Accepts the given visitor on a type-specific visit of the current node.
* This method must be implemented in all concrete Expression node types.
* <p>
* General template for implementation on each concrete ASTNode class:
* <pre>
* <code>
* boolean visitChildren = visitor.visit(this);
* if (visitChildren) {
* // visit children in normal left to right reading order
* acceptChild(visitor, getProperty1());
* acceptChildren(visitor, rawListProperty);
* acceptChild(visitor, getProperty2());
* }
* visitor.endVisit(this);
* </code>
* </pre>
* Note that the caller (<code>accept</code>) take cares of invoking
* <code>visitor.preVisit(this)</code> and <code>visitor.postVisit(this)</code>.
* </p>
*
* @param visitor the visitor object
*/
protected abstract void accept0(ParseVisitor visitor);
/**
* Accepts the given visitor on a visit of the current node.
* <p>
* This method should be used by the concrete implementations of
* <code>accept0</code> to traverse optional properties. Equivalent
* to <code>child.accept(visitor)</code> if <code>child</code>
* is not <code>null</code>.
* </p>
*
* @param visitor the visitor object
* @param child the child Expression node to dispatch too, or <code>null</code>
* if none. It actually must be an instance of PTExpressionImpl, but
* it would be too difficult to put the cast in each call to acceptChild.
*/
protected final void acceptChild(ParseVisitor visitor, PTExpression child) {
if (child == null) {
return;
}
((PTExpressionImpl) child).childAccept0(visitor);
}
/**
* Called ONLY by PTExpressionImpl for the child to accept the visitor, but
* it doesn't catch StopVisiting.
* @param visitor
*
* @since 1.1.0.1
*/
protected final void childAccept0(ParseVisitor visitor) {
if (visitor == null) {
throw new IllegalArgumentException();
}
// begin with the generic pre-visit
visitor.preVisit(this);
// dynamic dispatch to internal method for type-specific visit/endVisit
accept0(visitor);
// end with the generic post-visit
visitor.postVisit(this);
}
/**
* Accepts the given visitor on a visit of the given live list of
* child nodes.
* @param visitor the visitor object
* @param children the child Expression nodes to dispatch to, or <code>null</code> if none.
*/
protected final void acceptChildren(ParseVisitor visitor, List children) {
if (children != null) {
int size = children.size();
for (int i = 0; i < size; i++) {
acceptChild(visitor, (PTExpression) children.get(i));
}
}
}
public String toString() {
// allocate a buffer that is large enough to hold an average compilation unit
StringBuffer buffer = new StringBuffer(6000);
int p = buffer.length();
try {
appendDebugString(buffer);
} catch (RuntimeException e) {
// since debugger sometimes call toString methods, problems can easily happen when
// toString is called on an instance that is being initialized
buffer.setLength(p);
buffer.append("!"); //$NON-NLS-1$
buffer.append(standardToString());
}
// convert to a string, but lose the extra space in the string buffer by copying
return buffer.toString();
}
protected final String standardToString() {
return super.toString();
}
protected void appendDebugString(StringBuffer buffer) {
// print the subtree by default
appendPrintString(buffer);
}
/*
* Appends a standard Java source code representation of this subtree to the given
* string buffer.
*
* @param buffer the string buffer to append to
*/
protected final void appendPrintString(StringBuffer buffer) {
NaiveExpressionFlattener printer = new NaiveExpressionFlattener();
this.accept(printer);
buffer.append(printer.getResult());
}
} //ExpressionImpl