a bugfix on variables
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpdt / internal / compiler / ast / Variable.java
1 package net.sourceforge.phpdt.internal.compiler.ast;
2
3 import net.sourceforge.phpdt.internal.compiler.ast.declarations.VariableUsage;
4
5 import java.util.List;
6 import java.util.ArrayList;
7
8 /**
9  * A variable.
10  * It could be a simple variable, or contains another variable.
11  * @author Matthieu Casanova
12  */
13 public class Variable extends AbstractVariable {
14
15   /** The name of the variable. */
16   private String name;
17
18   /** A variable inside ($$varname). */
19   private AbstractVariable variable;
20
21   /** the variable is defined like this ${expression} */
22   private Expression expression;
23
24   public static final String _GET = "_GET";
25   public static final String _POST = "_POST";
26   public static final String _REQUEST = "_REQUEST";
27   public static final String _SERVER = "_SERVER";
28   public static final String _SESSION = "_SESSION";
29   public static final String _this = "this";
30   public static final String GLOBALS = "GLOBALS";
31   public static final String _COOKIE = "_COOKIE";
32   public static final String _FILES = "_FILES";
33   public static final String _ENV = "_ENV";
34
35   /** Here is an array of all superglobals variables and the special "this". */
36   public static final String[] SPECIAL_VARS = {_GET,
37                                                _POST,
38                                                _REQUEST,
39                                                _SERVER,
40                                                _SESSION,
41                                                _this,
42                                                GLOBALS,
43                                                _COOKIE,
44                                                _FILES,
45                                                _ENV};
46
47   /**
48    * Create a new simple variable.
49    * @param name the name
50    * @param sourceStart the starting position
51    * @param sourceEnd the ending position
52    */
53   public Variable(final String name,
54                   final int sourceStart,
55                   final int sourceEnd) {
56     super(sourceStart, sourceEnd);
57     this.name = name;
58   }
59
60   /**
61    * Create a special variable ($$toto for example).
62    * @param variable the variable contained
63    * @param sourceStart the starting position
64    * @param sourceEnd the ending position
65    */
66   public Variable(final AbstractVariable variable,
67                   final int sourceStart,
68                   final int sourceEnd) {
69     super(sourceStart, sourceEnd);
70     this.variable = variable;
71   }
72
73   /**
74    * Create a special variable ($$toto for example).
75    * @param expression the variable contained
76    * @param sourceStart the starting position
77    * @param sourceEnd the ending position
78    */
79   public Variable(final Expression expression,
80                   final int sourceStart,
81                   final int sourceEnd) {
82     super(sourceStart, sourceEnd);
83     this.expression = expression;
84   }
85
86   /**
87    * Return the expression as String.
88    * @return the expression
89    */
90   public String toStringExpression() {
91     return "$" + getName();
92   }
93
94   public String getName() {
95     if (name != null) {
96       return name;
97     }
98     if (variable != null) {
99       return variable.toStringExpression();
100     }
101     return "{" + expression.toStringExpression() + "}";
102   }
103
104   /**
105    * Get the variables from outside (parameters, globals ...)
106    * @return the variables from outside
107    */
108   public List getOutsideVariable() {
109     return new ArrayList(1);
110   }
111
112   /**
113    * get the modified variables.
114    * @return the variables modified
115    */
116   public List getModifiedVariable() {
117     return new ArrayList(1);
118   }
119
120   /**
121    * Get the variables used.
122    * @return the variables used
123    */
124   public List getUsedVariable() {
125     final String varName;
126     if (name != null) {
127       varName = name;
128     } else if (variable != null) {
129       varName = variable.getName();
130     } else {
131       varName = expression.toStringExpression();//todo : do a better thing like evaluate this ??
132     }
133     if (arrayContains(SPECIAL_VARS, name)) {
134       return new ArrayList(1);
135     }
136     final ArrayList list = new ArrayList(1);
137     list.add(new VariableUsage(varName, sourceStart));
138     return list;
139   }
140 }