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