package net.sourceforge.phpdt.internal.compiler.ast; import java.util.ArrayList; import java.util.List; import net.sourceforge.phpdt.internal.compiler.parser.Outlineable; import net.sourceforge.phpdt.internal.compiler.parser.OutlineableWithChildren; import net.sourceforge.phpdt.internal.ui.PHPUiImages; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.text.Position; /** * This class is my ClassDeclaration declaration for php. * It is similar to org.eclipse.jdt.internal.compiler.ast.TypeDeclaration * It directly extends AstNode because a class cannot appear anywhere in php * @author Matthieu Casanova */ public class ClassDeclaration extends Statement implements OutlineableWithChildren { /** The name of the class. */ public String name; /** The superclass. */ public String superclass; public int declarationSourceStart; public int declarationSourceEnd; public int bodyStart; public int bodyEnd; /** The methods of the class. */ private final ArrayList methods = new ArrayList(); /** The constructor of the class. */ public MethodDeclaration constructor; /** The fields of the class. */ private ArrayList fields = new ArrayList(); private Object parent; /** The outlineable children (those will be in the node array too. */ private ArrayList children = new ArrayList(); private Position position; /** * Create a class giving starting and ending offset * @param sourceStart starting offset * @param sourceEnd ending offset */ public ClassDeclaration(final Object parent, final String name, final String superclass, final int sourceStart, final int sourceEnd) { super(sourceStart, sourceEnd); this.parent = parent; this.name = name; this.superclass = superclass; position = new Position(sourceStart, name.length()); } /** * Create a class giving starting and ending offset * @param sourceStart starting offset * @param sourceEnd ending offset */ public ClassDeclaration(final Object parent, final String name, final int sourceStart, final int sourceEnd) { super(sourceStart, sourceEnd); this.parent = parent; this.name = name; position = new Position(sourceStart, name.length()); } /** * Add a method to the class. * @param method the method declaration */ public void addMethod(final MethodDeclaration method) { methods.add(method); add(method); if (method.name.equals(name)) { constructor = method; } } public void addField(final FieldDeclaration var) { for (int i = 0; i < var.vars.length; i++) { final VariableDeclaration c = var.vars[i]; children.add(c); } fields.add(var); } public boolean add(final Outlineable o) { return children.add(o); } /** * Tell if the class has a constructor. * @return a boolean */ public boolean hasConstructor() { return constructor != null; } /** * Return the class as String. * @param tab how many tabs before the class * @return the code of this class into String */ public String toString(final int tab) { return tabString(tab) + toStringHeader() + toStringBody(tab); } /** * Return the body of the class as String. * @param tab how many tabs before the body of the class * @return the body as String */ public String toStringBody(final int tab) { final StringBuffer buff = new StringBuffer(" {");//$NON-NLS-1$ if (fields != null) { for (int i = 0; i < fields.size(); i++) { final FieldDeclaration field = (FieldDeclaration) fields.get(i); buff.append("\n"); //$NON-NLS-1$ buff.append(field.toString(tab + 1)); buff.append(";");//$NON-NLS-1$ } } for (int i = 0; i < methods.size(); i++) { final MethodDeclaration o = (MethodDeclaration) methods.get(i); buff.append("\n");//$NON-NLS-1$ buff.append(o.toString(tab + 1)); } buff.append("\n").append(tabString(tab)).append("}"); //$NON-NLS-2$ //$NON-NLS-1$ return buff.toString(); } /** * Return the header of the class as String. * @return the header of the class */ public String toStringHeader() { final StringBuffer buff = new StringBuffer("class ").append(name);//$NON-NLS-1$ if (superclass != null) { buff.append(" extends "); //$NON-NLS-1$ buff.append(superclass); } return buff.toString(); } /** * Get the image of a class. * @return the image that represents a php class */ public ImageDescriptor getImage() { return PHPUiImages.DESC_CLASS; } public Object getParent() { return parent; } public Outlineable get(final int index) { return (Outlineable) children.get(index); } public int size() { return children.size(); } public String toString() { final StringBuffer buff = new StringBuffer(name); if (superclass != null) { buff.append(":"); //$NON-NLS-1$ buff.append(superclass); } return buff.toString(); } public Position getPosition() { return position; } public List getList() { return children; } /** * Get the variables from outside (parameters, globals ...) */ public void getOutsideVariable(final List list) { } /** * get the modified variables. */ public void getModifiedVariable(final List list) { } /** * Get the variables used. */ public void getUsedVariable(final List list) { } }