improved parser string handling
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpdt / internal / compiler / ast / VariableDeclaration.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.ui.PHPUiImages;
5 import org.eclipse.jface.resource.ImageDescriptor;
6 import org.eclipse.jface.text.Position;
7
8 import java.util.List;
9
10 /**
11  * A variable declaration.
12  * 
13  * @author Matthieu Casanova
14  */
15 public class VariableDeclaration extends Expression implements Outlineable {
16
17   public static final int EQUAL = 0;
18   public static final int PLUS_EQUAL = 1;
19   public static final int MINUS_EQUAL = 2;
20   public static final int STAR_EQUAL = 3;
21   public static final int SLASH_EQUAL = 4;
22   public static final int AND_EQUAL = 5;
23   public static final int OR_EQUAL = 6;
24   public static final int XOR_EQUAL = 7;
25   public static final int DOT_EQUAL = 8;
26   public static final int REM_EQUAL = 9;
27   public static final int TILDE_EQUAL = 10;
28   public static final int LSHIFT_EQUAL = 11;
29   public static final int RSIGNEDSHIFT_EQUAL = 12;
30
31   protected final AbstractVariable variable;
32
33   /** The value for variable initialization. */
34   public Expression initialization;
35
36   private Object parent;
37   protected boolean reference;
38
39   private Position position;
40
41   private int operator;
42
43   /**
44    * Create a variable.
45    * 
46    * @param variable       the name of the variable
47    * @param initialization the initialization
48    * @param operator       the assign operator
49    * @param sourceStart    the start point
50    */
51   public VariableDeclaration(final Object parent,
52                              final AbstractVariable variable,
53                              final Expression initialization,
54                              final int operator,
55                              final int sourceStart) {
56     super(sourceStart, initialization.sourceEnd);
57     this.initialization = initialization;
58     this.variable = variable;
59     this.operator = operator;
60     this.parent = parent;
61     position = new Position(sourceStart, sourceEnd);
62   }
63
64   /**
65    * Create a variable.
66    * 
67    * @param variable    a variable (in case of $$variablename)
68    * @param sourceStart the start point
69    */
70   public VariableDeclaration(final Object parent,
71                              final AbstractVariable variable,
72                              final int sourceStart,
73                              final int sourceEnd) {
74     super(sourceStart, sourceEnd);
75     this.variable = variable;
76     this.parent = parent;
77     position = new Position(sourceStart, sourceEnd);
78   }
79
80   public final void setReference(final boolean reference) {
81     this.reference = reference;
82   }
83
84   /**
85    * Create a variable.
86    * 
87    * @param initialization the initialization
88    * @param variable       a variable (in case of $$variablename)
89    * @param sourceStart    the start point
90    */
91   public VariableDeclaration(final AbstractVariable variable,
92                              final Expression initialization,
93                              final int operator,
94                              final int sourceStart) {
95     super(sourceStart, initialization.sourceEnd);
96     this.variable = variable;
97     this.initialization = initialization;
98     this.operator = operator;
99   }
100
101   /**
102    * Create a variable.
103    * 
104    * @param variable    a variable (in case of $$variablename)
105    * @param sourceStart the start point
106    */
107   public VariableDeclaration(final AbstractVariable variable,
108                              final int sourceStart) {
109     super(sourceStart, variable.sourceEnd);
110     this.variable = variable;
111   }
112
113   /**
114    * Return the operator as String.
115    * 
116    * @return the operator
117    */
118   private String operatorToString() {
119     switch (operator) {
120       case EQUAL:
121         return "="; //$NON-NLS-1$
122       case PLUS_EQUAL:
123         return "+=";   //$NON-NLS-1$
124       case MINUS_EQUAL:
125         return "-=";   //$NON-NLS-1$
126       case STAR_EQUAL:
127         return "*="; //$NON-NLS-1$
128       case SLASH_EQUAL:
129         return "/="; //$NON-NLS-1$
130       case AND_EQUAL:
131         return "<="; //$NON-NLS-1$
132       case OR_EQUAL:
133         return "|=";//$NON-NLS-1$
134       case XOR_EQUAL:
135         return "^=";//$NON-NLS-1$
136       case DOT_EQUAL:
137         return ".="; //$NON-NLS-1$
138       case REM_EQUAL:
139         return "%="; //$NON-NLS-1$
140       case TILDE_EQUAL:
141         return "~="; //$NON-NLS-1$
142       case LSHIFT_EQUAL:
143         return "<<="; //$NON-NLS-1$
144       case RSIGNEDSHIFT_EQUAL:
145         return ">>="; //$NON-NLS-1$
146     }
147     return " unknown operator ";//$NON-NLS-1$
148   }
149
150   /**
151    * Return the variable into String.
152    * 
153    * @return a String
154    */
155   public String toStringExpression() {
156     final String variableString = variable.toStringExpression();
157     if (initialization == null) {
158       if (reference) return '&' + variableString; else return variableString;
159     } else {
160       final String operatorString = operatorToString();
161       final String initString = initialization.toStringExpression();
162       final StringBuffer buff = new StringBuffer(variableString.length() +
163                                                  operatorString.length() +
164                                                  initString.length() +
165                                                  1);
166       buff.append(variableString);
167       buff.append(operatorString); //$NON-NLS-1$
168       buff.append(initString);
169       return buff.toString();
170     }
171   }
172
173   public final Object getParent() {
174     return parent;
175   }
176
177   public final String toString() {
178     return toStringExpression();
179   }
180
181   /**
182    * Get the image of a variable.
183    * 
184    * @return the image that represents a php variable
185    */
186   public final ImageDescriptor getImage() {
187     return PHPUiImages.DESC_VAR;
188   }
189
190   public final Position getPosition() {
191     return position;
192   }
193
194   /**
195    * Get the name of the field as String.
196    * 
197    * @return the name of the String
198    */
199   public final String name() {
200     return variable.getName();
201   }
202
203   /**
204    * Get the variables from outside (parameters, globals ...)
205    */
206   public final void getOutsideVariable(final List list) {
207   }
208
209   /**
210    * get the modified variables.
211    */
212   public final void getModifiedVariable(final List list) {
213     variable.getUsedVariable(list);
214     if (initialization != null) {
215       initialization.getModifiedVariable(list);
216     }
217   }
218
219   /**
220    * Get the variables used.
221    */
222   public final void getUsedVariable(final List list) {
223     if (initialization != null) {
224       initialization.getUsedVariable(list);
225     }
226   }
227 }