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