misc
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpdt / internal / compiler / ast / ClassDeclaration.java
1 package net.sourceforge.phpdt.internal.compiler.ast;
2
3 import net.sourceforge.phpdt.internal.compiler.parser.Outlineable;
4 import net.sourceforge.phpdt.internal.compiler.parser.OutlineableWithChildren;
5 import net.sourceforge.phpdt.internal.ui.PHPUiImages;
6 import org.eclipse.jface.resource.ImageDescriptor;
7 import org.eclipse.jface.text.Position;
8
9 import java.util.ArrayList;
10 import java.util.List;
11
12
13 /**
14  * This class is my ClassDeclaration declaration for php.
15  * It is similar to org.eclipse.jdt.internal.compiler.ast.TypeDeclaration
16  * It directly extends AstNode because a class cannot appear anywhere in php
17  * @author Matthieu Casanova
18  */
19 public class ClassDeclaration extends Statement implements OutlineableWithChildren {
20
21   /** The name of the class. */
22   public String name;
23   /** The superclass. */
24   public String superclass;
25
26   public int declarationSourceStart;
27   public int declarationSourceEnd;
28   public int bodyStart;
29   public int bodyEnd;
30   /** The methods of the class. */
31   private final ArrayList methods = new ArrayList();
32   /** The constructor of the class. */
33   public MethodDeclaration constructor;
34   /** The fields of the class. */
35   private ArrayList fields = new ArrayList();
36
37   private Object parent;
38   /** The outlineable children (those will be in the node array too. */
39   private ArrayList children = new ArrayList();
40
41   private Position position;
42
43   /**
44    * Create a class giving starting and ending offset
45    * @param sourceStart starting offset
46    * @param sourceEnd ending offset
47    */
48   public ClassDeclaration(final Object parent,
49                           final String name,
50                           final String superclass,
51                           final int sourceStart,
52                           final int sourceEnd) {
53     super(sourceStart, sourceEnd);
54     this.parent = parent;
55     this.name = name;
56     this.superclass = superclass;
57     position = new Position(sourceStart, name.length());
58   }
59
60   /**
61    * Create a class giving starting and ending offset
62    * @param sourceStart starting offset
63    * @param sourceEnd ending offset
64    */
65   public ClassDeclaration(final Object parent,
66                           final String name,
67                           final int sourceStart,
68                           final int sourceEnd) {
69     super(sourceStart, sourceEnd);
70     this.parent = parent;
71     this.name = name;
72     position = new Position(sourceStart, name.length());
73   }
74
75   /**
76    * Add a method to the class.
77    * @param method the method declaration
78    */
79   public void addMethod(final MethodDeclaration method) {
80     methods.add(method);
81     add(method);
82     if (method.name.equals(name)) {
83       constructor = method;
84     }
85   }
86
87   public void addField(final FieldDeclaration var) {
88     for (int i = 0; i < var.vars.length; i++) {
89       final VariableDeclaration c = var.vars[i];
90       children.add(c);
91     }
92     fields.add(var);
93   }
94
95   public boolean add(final Outlineable o) {
96     return children.add(o);
97   }
98
99   /**
100    * Tell if the class has a constructor.
101    * @return a boolean
102    */
103   public boolean hasConstructor() {
104     return constructor != null;
105   }
106
107   /**
108    * Return the class as String.
109    * @param tab how many tabs before the class
110    * @return the code of this class into String
111    */
112   public String toString(final int tab) {
113     return tabString(tab) + toStringHeader() + toStringBody(tab);
114   }
115
116   /**
117    * Return the body of the class as String.
118    * @param tab how many tabs before the body of the class
119    * @return the body as String
120    */
121   public String toStringBody(final int tab) {
122     final StringBuffer buff = new StringBuffer(" {");//$NON-NLS-1$
123     if (fields != null) {
124       for (int i = 0; i < fields.size(); i++) {
125         final FieldDeclaration field = (FieldDeclaration) fields.get(i);
126         buff.append("\n"); //$NON-NLS-1$
127         buff.append(field.toString(tab + 1));
128         buff.append(";");//$NON-NLS-1$
129       }
130     }
131     for (int i = 0; i < methods.size(); i++) {
132       final MethodDeclaration o = (MethodDeclaration) methods.get(i);
133       buff.append("\n");//$NON-NLS-1$
134       buff.append(o.toString(tab + 1));
135     }
136     buff.append("\n").append(tabString(tab)).append("}"); //$NON-NLS-2$ //$NON-NLS-1$
137     return buff.toString();
138   }
139
140   /**
141    * Return the header of the class as String.
142    * @return the header of the class
143    */
144   public String toStringHeader() {
145     final StringBuffer buff = new StringBuffer("class ").append(name);//$NON-NLS-1$
146     if (superclass != null) {
147       buff.append(" extends "); //$NON-NLS-1$
148       buff.append(superclass);
149     }
150     return buff.toString();
151   }
152
153   /**
154    * Get the image of a class.
155    * @return the image that represents a php class
156    */
157   public ImageDescriptor getImage() {
158     return PHPUiImages.DESC_CLASS;
159   }
160
161   public Object getParent() {
162     return parent;
163   }
164
165   public Outlineable get(final int index) {
166     return (Outlineable) children.get(index);
167   }
168
169   public int size() {
170     return children.size();
171   }
172
173   public String toString() {
174     final StringBuffer buff = new StringBuffer(name);
175     if (superclass != null) {
176       buff.append(":"); //$NON-NLS-1$
177       buff.append(superclass);
178     }
179     return buff.toString();
180   }
181
182   public Position getPosition() {
183     return position;
184   }
185
186   public List getList() {
187     return children;
188   }
189
190   /**
191    * Get the variables from outside (parameters, globals ...)
192    * @return the variables from outside
193    */
194   public List getOutsideVariable() {
195     return new ArrayList(1);
196   }
197
198   /**
199    * get the modified variables.
200    * @return the variables from we change value
201    */
202   public List getModifiedVariable() {
203     return new ArrayList(1);
204   }
205
206   /**
207    * Get the variables used.
208    * @return the variables used
209    */
210   public List getUsedVariable() {
211     return new ArrayList(1);
212   }
213 }