package net.sourceforge.phpdt.internal.compiler.ast; import net.sourceforge.phpdt.internal.compiler.parser.Outlineable; import net.sourceforge.phpdt.internal.compiler.ast.declarations.VariableUsage; import net.sourceforge.phpdt.internal.ui.PHPUiImages; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.text.Position; import java.util.List; import java.util.ArrayList; /** * A variable declaration. * @author Matthieu Casanova */ public class VariableDeclaration extends AbstractVariableDeclaration implements Outlineable { public static final int EQUAL = 0; public static final int PLUS_EQUAL = 1; public static final int MINUS_EQUAL = 2; public static final int STAR_EQUAL = 3; public static final int SLASH_EQUAL = 4; public static final int AND_EQUAL = 5; public static final int OR_EQUAL = 6; public static final int XOR_EQUAL = 7; public static final int DOT_EQUAL = 8; public static final int REM_EQUAL = 9; public static final int TILDE_EQUAL = 10; public static final int LSHIFT_EQUAL = 11; public static final int RSIGNEDSHIFT_EQUAL = 12; /** The value for variable initialization. */ public Expression initialization; private Object parent; private boolean reference; private Position position; private int operator; /** * Create a variable. * @param initialization the initialization * @param name the name of the variable * @param sourceStart the start point */ public VariableDeclaration(final Object parent, final char[] name, final Expression initialization, final int operator, final int sourceStart) { super(name, sourceStart, initialization.sourceEnd); this.initialization = initialization; this.operator = operator; this.parent = parent; position = new Position(sourceStart, sourceEnd); } /** * Create a variable. * @param name the name of the variable * @param sourceStart the start point */ public VariableDeclaration(final Object parent, final char[] name, final int sourceStart, final int sourceEnd) { super(name, sourceStart, sourceEnd); this.parent = parent; } public void setReference(final boolean reference) { this.reference = reference; } /** * Create a variable. * @param initialization the initialization * @param name the name of the variable * @param sourceStart the start point */ public VariableDeclaration(final char[] name, final Expression initialization, final int operator, final int sourceStart) { super(name, sourceStart, initialization.sourceEnd); this.initialization = initialization; this.operator = operator; } /** * Create a variable. * @param name the name of the variable * @param sourceStart the start point */ public VariableDeclaration(final char[] name, final int sourceStart) { super(name, sourceStart, sourceStart + name.length); } /** * Return the operator as String. * @return the operator */ public final String operatorToString() { switch (operator) { case EQUAL: return "="; //$NON-NLS-1$ case PLUS_EQUAL: return "+="; //$NON-NLS-1$ case MINUS_EQUAL: return "-="; //$NON-NLS-1$ case STAR_EQUAL: return "*="; //$NON-NLS-1$ case SLASH_EQUAL: return "/="; //$NON-NLS-1$ case AND_EQUAL: return "<="; //$NON-NLS-1$ case OR_EQUAL: return "|=";//$NON-NLS-1$ case XOR_EQUAL: return "^=";//$NON-NLS-1$ case DOT_EQUAL: return ".="; //$NON-NLS-1$ case REM_EQUAL: return "%="; //$NON-NLS-1$ case TILDE_EQUAL: return "~="; //$NON-NLS-1$ case LSHIFT_EQUAL: return "<<="; //$NON-NLS-1$ case RSIGNEDSHIFT_EQUAL: return ">>="; //$NON-NLS-1$ } return " unknown operator ";//$NON-NLS-1$ } /** * Return the variable into String. * @return a String */ public String toStringExpression() { final StringBuffer buff; if (reference) { buff = new StringBuffer("&$"); //$NON-NLS-1$ } else { buff = new StringBuffer("$");//$NON-NLS-1$ } buff.append(name); if (initialization != null) { buff.append(operatorToString()); //$NON-NLS-1$ buff.append(initialization.toStringExpression()); } return buff.toString(); } public Object getParent() { return parent; } public String toString() { return toStringExpression(); } /** * Get the image of a variable. * @return the image that represents a php variable */ public ImageDescriptor getImage() { return PHPUiImages.DESC_VAR; } public Position getPosition() { return position; } /** * Get the name of the field as String. * @return the name of the String */ public String name() { return new String(name); } /** * Get the variables from outside (parameters, globals ...) * @return the variables from outside */ public List getOutsideVariable() { return new ArrayList(); } /** * get the modified variables. * @return the variables from we change value */ public List getModifiedVariable() { final ArrayList list = new ArrayList(); list.add(new VariableUsage(new String(name), sourceStart)); if (initialization != null) { list.addAll(initialization.getModifiedVariable()); } return list; } /** * Get the variables used. * @return the variables used */ public List getUsedVariable() { final ArrayList list = new ArrayList(); if (initialization != null) { list.addAll(initialization.getModifiedVariable());//yes it's getModified variable (in a variable declaration $a = $b, $a is modified, event if you have only $a and no initialization } return list; } }