a lot of fixes
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpdt / internal / compiler / ast / Variable.java
index 443de28..add462f 100644 (file)
@@ -18,13 +18,41 @@ public class Variable extends AbstractVariable {
   /** A variable inside ($$varname). */
   private AbstractVariable variable;
 
+  /** the variable is defined like this ${expression} */
+  private Expression expression;
+
+  public static final String _GET = "_GET";
+  public static final String _POST = "_POST";
+  public static final String _REQUEST = "_REQUEST";
+  public static final String _SERVER = "_SERVER";
+  public static final String _SESSION = "_SESSION";
+  public static final String _this = "this";
+  public static final String GLOBALS = "GLOBALS";
+  public static final String _COOKIE = "_COOKIE";
+  public static final String _FILES = "_FILES";
+  public static final String _ENV = "_ENV";
+
+  /** Here is an array of all superglobals variables and the special "this". */
+  public static final String[] SPECIAL_VARS = {_GET,
+                                               _POST,
+                                               _REQUEST,
+                                               _SERVER,
+                                               _SESSION,
+                                               _this,
+                                               GLOBALS,
+                                               _COOKIE,
+                                               _FILES,
+                                               _ENV};
+
   /**
    * Create a new simple variable.
    * @param name the name
    * @param sourceStart the starting position
    * @param sourceEnd the ending position
    */
-  public Variable(final String name, final int sourceStart, final int sourceEnd) {
+  public Variable(final String name,
+                  final int sourceStart,
+                  final int sourceEnd) {
     super(sourceStart, sourceEnd);
     this.name = name;
   }
@@ -35,12 +63,27 @@ public class Variable extends AbstractVariable {
    * @param sourceStart the starting position
    * @param sourceEnd the ending position
    */
-  public Variable(final AbstractVariable variable, final int sourceStart, final int sourceEnd) {
+  public Variable(final AbstractVariable variable,
+                  final int sourceStart,
+                  final int sourceEnd) {
     super(sourceStart, sourceEnd);
     this.variable = variable;
   }
 
   /**
+   * Create a special variable ($$toto for example).
+   * @param expression the variable contained
+   * @param sourceStart the starting position
+   * @param sourceEnd the ending position
+   */
+  public Variable(final Expression expression,
+                  final int sourceStart,
+                  final int sourceEnd) {
+    super(sourceStart, sourceEnd);
+    this.expression = expression;
+  }
+
+  /**
    * Return the expression as String.
    * @return the expression
    */
@@ -49,10 +92,13 @@ public class Variable extends AbstractVariable {
   }
 
   public String getName() {
-    if (variable == null) {
+    if (name != null) {
       return name;
     }
-    return variable.toStringExpression();
+    if (variable != null) {
+      return variable.toStringExpression();
+    }
+    return "{" + expression.toStringExpression() + "}";
   }
 
   /**
@@ -76,12 +122,19 @@ public class Variable extends AbstractVariable {
    * @return the variables used
    */
   public List getUsedVariable() {
-    final ArrayList list = new ArrayList(1);
-    if (name == null) {
-      list.add(new VariableUsage(variable.getName(), sourceStart));
+    final String varName;
+    if (name != null) {
+      varName = name;
+    } else if (variable != null) {
+      varName = variable.getName();
     } else {
-      list.add(new VariableUsage(name, sourceStart));
+      varName = expression.toStringExpression();//todo : do a better thing like evaluate this ??
+    }
+    if (arrayContains(SPECIAL_VARS, name)) {
+      return new ArrayList(1);
     }
+    final ArrayList list = new ArrayList(1);
+    list.add(new VariableUsage(varName, sourceStart));
     return list;
   }
 }