1 /*******************************************************************************
2 * Copyright (c) 2000, 2003 IBM Corporation and others.
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Common Public License v1.0
5 * which accompanies this distribution, and is available at
6 * http://www.eclipse.org/legal/cpl-v10.html
9 * IBM Corporation - initial API and implementation
10 *******************************************************************************/
11 package net.sourceforge.phpeclipse.internal.compiler.ast;
13 import net.sourceforge.phpdt.internal.compiler.IAbstractSyntaxTreeVisitor;
14 import net.sourceforge.phpdt.internal.compiler.impl.Constant;
15 import net.sourceforge.phpdt.internal.compiler.lookup.ArrayBinding;
16 import net.sourceforge.phpdt.internal.compiler.lookup.BaseTypes;
17 import net.sourceforge.phpdt.internal.compiler.lookup.BlockScope;
18 import net.sourceforge.phpdt.internal.compiler.lookup.CompilerModifiers;
19 import net.sourceforge.phpdt.internal.compiler.lookup.FieldBinding;
20 import net.sourceforge.phpdt.internal.compiler.lookup.MethodBinding;
21 import net.sourceforge.phpdt.internal.compiler.lookup.ReferenceBinding;
22 import net.sourceforge.phpdt.internal.compiler.lookup.Scope;
23 import net.sourceforge.phpdt.internal.compiler.lookup.TypeBinding;
24 import net.sourceforge.phpdt.internal.compiler.lookup.TypeConstants;
25 import net.sourceforge.phpdt.internal.compiler.lookup.TypeIds;
28 public abstract class AstNode implements BaseTypes, CompilerModifiers, TypeConstants, TypeIds {
30 public int sourceStart, sourceEnd;
32 //some global provision for the hierarchy
33 public final static Constant NotAConstant = Constant.NotAConstant;
35 // storage for internal flags (32 bits) BIT USAGE
36 public final static int Bit1 = 0x1; // return type (operators) | name reference kind (name ref) | add assertion (type decl)
37 public final static int Bit2 = 0x2; // return type (operators) | name reference kind (name ref) | has local type (type, method, field decl)
38 public final static int Bit3 = 0x4; // return type (operators) | name reference kind (name ref) | implicit this (this ref)
39 public final static int Bit4 = 0x8; // return type (operators) | first assignment to local (local decl)
40 public final static int Bit5 = 0x10; // value for return (binary expression) |
41 public final static int Bit6 = 0x20; // depth (name ref, msg) | only value required (binary expression)
42 public final static int Bit7 = 0x40; // depth (name ref, msg) | operator (operators)
43 public final static int Bit8 = 0x80; // depth (name ref, msg) | operator (operators)
44 public final static int Bit9 = 0x100; // depth (name ref, msg) | operator (operators)
45 public final static int Bit10= 0x200; // depth (name ref, msg) | operator (operators)
46 public final static int Bit11 = 0x400; // depth (name ref, msg) | operator (operators)
47 public final static int Bit12 = 0x800; // depth (name ref, msg) | operator (operators)
48 public final static int Bit13 = 0x1000; // depth (name ref, msg)
49 public final static int Bit14 = 0x2000; // assigned (reference lhs)
50 public final static int Bit15 = 0x4000;
51 public final static int Bit16 = 0x8000;
52 public final static int Bit17 = 0x10000;
53 public final static int Bit18 = 0x20000;
54 public final static int Bit19 = 0x40000;
55 public final static int Bit20 = 0x80000;
56 public final static int Bit21 = 0x100000;
57 public final static int Bit22 = 0x200000; // parenthesis count (expression)
58 public final static int Bit23 = 0x400000; // parenthesis count (expression)
59 public final static int Bit24 = 0x800000; // parenthesis count (expression)
60 public final static int Bit25 = 0x1000000; // parenthesis count (expression)
61 public final static int Bit26 = 0x2000000; // parenthesis count (expression)
62 public final static int Bit27 = 0x4000000; // parenthesis count (expression)
63 public final static int Bit28 = 0x8000000; // parenthesis count (expression)
64 public final static int Bit29 = 0x10000000; // parenthesis count (expression)
65 public final static int Bit30 = 0x20000000; // assignment with no effect (assignment)
66 public final static int Bit31 = 0x40000000; // local declaration reachable (local decl)
67 public final static int Bit32 = 0x80000000; // reachable (statement)
69 public int bits = IsReachableMASK; // reachable by default
72 public static final int ReturnTypeIDMASK = Bit1|Bit2|Bit3|Bit4;
73 public static final int OperatorSHIFT = 6; // Bit7 -> Bit12
74 public static final int OperatorMASK = Bit7|Bit8|Bit9|Bit10|Bit11|Bit12; // 6 bits for operator ID
76 // for binary expressions
77 public static final int ValueForReturnMASK = Bit5;
78 public static final int OnlyValueRequiredMASK = Bit6;
80 // for name references
81 public static final int RestrictiveFlagMASK = Bit1|Bit2|Bit3;
82 public static final int FirstAssignmentToLocalMASK = Bit4;
85 public static final int IsImplicitThisMask = Bit3;
87 // for single name references
88 public static final int DepthSHIFT = 5; // Bit6 -> Bit13
89 public static final int DepthMASK = Bit6|Bit7|Bit8|Bit9|Bit10|Bit11|Bit12|Bit13; // 8 bits for actual depth value (max. 255)
92 public static final int IsReachableMASK = Bit32;
93 public static final int IsLocalDeclarationReachableMASK = Bit31;
95 // for type declaration
96 public static final int AddAssertionMASK = Bit1;
98 // for type, method and field declarations
99 public static final int HasLocalTypeMASK = Bit2; // cannot conflict with AddAssertionMASK
102 public static final int ParenthesizedSHIFT = 21; // Bit22 -> Bit29
103 public static final int ParenthesizedMASK = Bit22|Bit23|Bit24|Bit25|Bit26|Bit27|Bit28|Bit29; // 8 bits for parenthesis count value (max. 255)
106 public static final int IsAssignmentWithNoEffectMASK = Bit30;
108 // for references on lhs of assignment (set only for true assignments, as opposed to compound ones)
109 public static final int IsStrictlyAssignedMASK = Bit14;
116 public boolean cannotReturn() {
120 public AstNode concreteStatement() {
124 /* Answer true if the field use is considered deprecated.
125 * An access in the same compilation unit is allowed.
127 public final boolean isFieldUseDeprecated(FieldBinding field, Scope scope) {
129 if (field.isPrivate() && !scope.isDefinedInField(field)) {
130 // ignore cases where field is used from within inside itself
131 field.modifiers |= AccPrivateUsed;
134 if (!field.isViewedAsDeprecated()) return false;
136 // inside same unit - no report
137 if (scope.isDefinedInSameUnit(field.declaringClass)) return false;
139 // if context is deprecated, may avoid reporting
140 // if (!scope.environment().options.reportDeprecationInsideDeprecatedCode && scope.isInsideDeprecatedCode()) return false;
144 public boolean isImplicitThis() {
149 /* Answer true if the method use is considered deprecated.
150 * An access in the same compilation unit is allowed.
152 public final boolean isMethodUseDeprecated(MethodBinding method, Scope scope) {
154 if (method.isPrivate() && !scope.isDefinedInMethod(method)) {
155 // ignore cases where method is used from within inside itself (e.g. direct recursions)
156 method.modifiers |= AccPrivateUsed;
159 if (!method.isViewedAsDeprecated()) return false;
161 // inside same unit - no report
162 if (scope.isDefinedInSameUnit(method.declaringClass)) return false;
164 // if context is deprecated, may avoid reporting
165 // if (!scope.environment().options.reportDeprecationInsideDeprecatedCode && scope.isInsideDeprecatedCode()) return false;
169 public boolean isSuper() {
174 public boolean isThis() {
179 /* Answer true if the type use is considered deprecated.
180 * An access in the same compilation unit is allowed.
182 public final boolean isTypeUseDeprecated(TypeBinding type, Scope scope) {
184 if (type.isArrayType())
185 type = ((ArrayBinding) type).leafComponentType;
186 if (type.isBaseType())
189 ReferenceBinding refType = (ReferenceBinding) type;
191 if (refType.isPrivate() && !scope.isDefinedInType(refType)) {
192 // ignore cases where type is used from within inside itself
193 refType.modifiers |= AccPrivateUsed;
196 if (!refType.isViewedAsDeprecated()) return false;
198 // inside same unit - no report
199 if (scope.isDefinedInSameUnit(refType)) return false;
201 // if context is deprecated, may avoid reporting
202 // if (!scope.environment().options.reportDeprecationInsideDeprecatedCode && scope.isInsideDeprecatedCode()) return false;
206 public static String modifiersString(int modifiers) {
208 String s = ""; //$NON-NLS-1$
209 if ((modifiers & AccPublic) != 0)
210 s = s + "public "; //$NON-NLS-1$
211 if ((modifiers & AccPrivate) != 0)
212 s = s + "private "; //$NON-NLS-1$
213 if ((modifiers & AccProtected) != 0)
214 s = s + "protected "; //$NON-NLS-1$
215 if ((modifiers & AccStatic) != 0)
216 s = s + "static "; //$NON-NLS-1$
217 if ((modifiers & AccFinal) != 0)
218 s = s + "final "; //$NON-NLS-1$
219 // if ((modifiers & AccSynchronized) != 0)
220 // s = s + "synchronized "; //$NON-NLS-1$
221 // if ((modifiers & AccVolatile) != 0)
222 // s = s + "volatile "; //$NON-NLS-1$
223 // if ((modifiers & AccTransient) != 0)
224 // s = s + "transient "; //$NON-NLS-1$
225 // if ((modifiers & AccNative) != 0)
226 // s = s + "native "; //$NON-NLS-1$
227 if ((modifiers & AccAbstract) != 0)
228 s = s + "abstract "; //$NON-NLS-1$
233 * @deprecated - use field instead
235 public int sourceEnd() {
240 * @deprecated - use field instead
242 public int sourceStart() {
246 public static String tabString(int tab) {
248 String s = ""; //$NON-NLS-1$
249 for (int i = tab; i > 0; i--)
250 s = s + " "; //$NON-NLS-1$
254 public String toString() {
259 public String toString(int tab) {
261 return "****" + super.toString() + "****"; //$NON-NLS-2$ //$NON-NLS-1$
264 public void traverse(IAbstractSyntaxTreeVisitor visitor, BlockScope scope) {