package net.sourceforge.phpdt.internal.compiler.ast; import net.sourceforge.phpdt.internal.compiler.parser.OutlineableWithChildren; import net.sourceforge.phpdt.internal.compiler.parser.Outlineable; import net.sourceforge.phpdt.internal.ui.PHPUiImages; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.text.Position; import java.util.Hashtable; import java.util.Enumeration; import java.util.ArrayList; /** * A Method declaration. * @author Matthieu Casanova */ public class MethodDeclaration extends Statement implements OutlineableWithChildren { /** The name of the method. */ public char[] name; public Hashtable arguments; public Statement[] statements; public int bodyStart; public int bodyEnd = -1; /** Tell if the method is a class constructor. */ public boolean isConstructor; /** The parent object. */ private Object parent; /** The outlineable children (those will be in the node array too. */ private ArrayList children = new ArrayList(); /** Tell if the method returns a reference. */ public boolean reference; private Position position; public MethodDeclaration(Object parent, char[] name, Hashtable arguments, boolean reference, int sourceStart, int sourceEnd) { super(sourceStart, sourceEnd); this.name = name; this.arguments = arguments; this.parent = parent; this.reference = reference; position = new Position(sourceStart, sourceEnd); } /** * Return method into String, with a number of tabs * @param tab the number of tabs * @return the String containing the method */ public String toString(int tab) { StringBuffer buff = new StringBuffer(tabString(tab)); buff.append(toStringHeader()); buff.append(toStringStatements(tab + 1)); return buff.toString(); } public String toStringHeader() { StringBuffer buff = new StringBuffer(); buff.append("function ");//$NON-NLS-1$ if (reference) { buff.append('&');//$NON-NLS-1$ } buff.append(name).append("(");//$NON-NLS-1$ if (arguments != null) { Enumeration values = arguments.elements(); int i = 0; while (values.hasMoreElements()) { VariableDeclaration o = (VariableDeclaration) values.nextElement(); buff.append(o.toStringExpression()); if (i != (arguments.size() - 1)) { buff.append(", "); //$NON-NLS-1$ } i++; } } buff.append(")"); //$NON-NLS-1$ return buff.toString(); } /** * Return the statements of the method into Strings * @param tab the number of tabs * @return the String containing the statements */ public String toStringStatements(int tab) { StringBuffer buff = new StringBuffer(" {"); //$NON-NLS-1$ if (statements != null) { for (int i = 0; i < statements.length; i++) { buff.append("\n").append(statements[i].toString(tab)); //$NON-NLS-1$ if (!(statements[i] instanceof Block)) { buff.append(";"); //$NON-NLS-1$ } } } buff.append("\n").append(tabString(tab == 0 ? 0 : tab - 1)).append("}"); //$NON-NLS-2$ //$NON-NLS-1$ return buff.toString(); } /** * Get the image of a class. * @return the image that represents a php class */ public ImageDescriptor getImage() { return PHPUiImages.DESC_FUN; } public void setParent(Object parent) { this.parent = parent; } public Object getParent() { return parent; } public boolean add(Outlineable o) { return children.add(o); } public Outlineable get(int index) { return (Outlineable) children.get(index); } public int size() { return children.size(); } public String toString() { return toStringHeader(); } public Position getPosition() { return position; } }