Refactory: smarty.ui plugin.
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpdt / internal / compiler / lookup / ReferenceBinding.java
index d72bc99..d2dd308 100644 (file)
 /*******************************************************************************
- * Copyright (c) 2000, 2001, 2002 International Business Machines Corp. and others.
+ * Copyright (c) 2000, 2003 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v0.5 
+ * are made available under the terms of the Common Public License v1.0
  * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v05.html
+ * http://www.eclipse.org/legal/cpl-v10.html
  * 
  * Contributors:
  *     IBM Corporation - initial API and implementation
- ******************************************************************************/
+ *******************************************************************************/
 package net.sourceforge.phpdt.internal.compiler.lookup;
 
+import net.sourceforge.phpdt.core.compiler.CharOperation;
 import net.sourceforge.phpdt.internal.compiler.env.IDependent;
-import net.sourceforge.phpdt.internal.compiler.util.CharOperation;
 
 /*
-Not all fields defined by this type (& its subclasses) are initialized when it is created.
-Some are initialized only when needed.
-
-Accessors have been provided for some public fields so all TypeBindings have the same API...
-but access public fields directly whenever possible.
-Non-public fields have accessors which should be used everywhere you expect the field to be initialized.
-
-null is NOT a valid value for a non-public field... it just means the field is not initialized.
-*/
+ * Not all fields defined by this type (& its subclasses) are initialized when
+ * it is created. Some are initialized only when needed.
+ * 
+ * Accessors have been provided for some public fields so all TypeBindings have
+ * the same API... but access public fields directly whenever possible.
+ * Non-public fields have accessors which should be used everywhere you expect
+ * the field to be initialized.
+ * 
+ * null is NOT a valid value for a non-public field... it just means the field
+ * is not initialized.
+ */
 
-abstract public class ReferenceBinding extends TypeBinding implements IDependent {
+abstract public class ReferenceBinding extends TypeBinding implements
+               IDependent {
        public char[][] compoundName;
+
        public char[] sourceName;
+
        public int modifiers;
+
        public PackageBinding fPackage;
 
        char[] fileName;
+
        char[] constantPoolName;
+
        char[] signature;
 
-public FieldBinding[] availableFields() {
-       return fields();
-}
+       public FieldBinding[] availableFields() {
+               return fields();
+       }
 
-public MethodBinding[] availableMethods() {
-       return methods();
-}      
-/* Answer true if the receiver can be instantiated
-*/
+       public MethodBinding[] availableMethods() {
+               return methods();
+       }
 
-public boolean canBeInstantiated() {
-       return !(isAbstract() || isInterface());
-}
-/* Answer true if the receiver is visible to the invocationPackage.
-*/
+       /*
+        * Answer true if the receiver can be instantiated
+        */
 
-public final boolean canBeSeenBy(PackageBinding invocationPackage) {
-       if (isPublic()) return true;
-       if (isPrivate()) return false;
+       public boolean canBeInstantiated() {
+               return !(isAbstract() || isInterface());
+       }
 
-       // isProtected() or isDefault()
-       return invocationPackage == fPackage;
-}
-/* Answer true if the receiver is visible to the receiverType and the invocationType.
-*/
+       /*
+        * Answer true if the receiver is visible to the invocationPackage.
+        */
+
+       public final boolean canBeSeenBy(PackageBinding invocationPackage) {
+               if (isPublic())
+                       return true;
+               if (isPrivate())
+                       return false;
+
+               // isProtected() or isDefault()
+               return invocationPackage == fPackage;
+       }
+
+       /*
+        * Answer true if the receiver is visible to the receiverType and the
+        * invocationType.
+        */
+
+       public final boolean canBeSeenBy(ReferenceBinding receiverType,
+                       SourceTypeBinding invocationType) {
+               if (isPublic())
+                       return true;
+
+               if (invocationType == this && invocationType == receiverType)
+                       return true;
 
-public final boolean canBeSeenBy(ReferenceBinding receiverType, SourceTypeBinding invocationType) {
-       if (isPublic()) return true;
+               if (isProtected()) {
 
-       if (invocationType == this && invocationType == receiverType) return true;
+                       // answer true if the invocationType is the declaringClass or they
+                       // are in the same package
+                       // OR the invocationType is a subclass of the declaringClass
+                       // AND the invocationType is the invocationType or its subclass
+                       // OR the type is a static method accessed directly through a type
+                       // OR previous assertions are true for one of the enclosing type
+                       if (invocationType == this)
+                               return true;
+                       if (invocationType.fPackage == fPackage)
+                               return true;
+
+                       ReferenceBinding currentType = invocationType;
+                       ReferenceBinding declaringClass = enclosingType(); // protected
+                                                                                                                               // types always
+                                                                                                                               // have an
+                                                                                                                               // enclosing one
+                       if (declaringClass == null)
+                               return false; // could be null if incorrect top-level
+                                                               // protected type
+                       // int depth = 0;
+                       do {
+                               if (declaringClass == invocationType)
+                                       return true;
+                               if (declaringClass.isSuperclassOf(currentType))
+                                       return true;
+                               // depth++;
+                               currentType = currentType.enclosingType();
+                       } while (currentType != null);
+                       return false;
+               }
 
-       if (isProtected()) {
+               if (isPrivate()) {
+                       // answer true if the receiverType is the receiver or its
+                       // enclosingType
+                       // AND the invocationType and the receiver have a common
+                       // enclosingType
+                       if (!(receiverType == this || receiverType == enclosingType()))
+                               return false;
+
+                       if (invocationType != this) {
+                               ReferenceBinding outerInvocationType = invocationType;
+                               ReferenceBinding temp = outerInvocationType.enclosingType();
+                               while (temp != null) {
+                                       outerInvocationType = temp;
+                                       temp = temp.enclosingType();
+                               }
+
+                               ReferenceBinding outerDeclaringClass = this;
+                               temp = outerDeclaringClass.enclosingType();
+                               while (temp != null) {
+                                       outerDeclaringClass = temp;
+                                       temp = temp.enclosingType();
+                               }
+                               if (outerInvocationType != outerDeclaringClass)
+                                       return false;
+                       }
+                       return true;
+               }
 
-               // answer true if the invocationType is the declaringClass or they are in the same package
-               // OR the invocationType is a subclass of the declaringClass
-               //    AND the invocationType is the invocationType or its subclass
-               //    OR the type is a static method accessed directly through a type
-               //    OR previous assertions are true for one of the enclosing type
-               if (invocationType == this) return true;
-               if (invocationType.fPackage == fPackage) return true;
+               // isDefault()
+               if (invocationType.fPackage != fPackage)
+                       return false;
 
-               ReferenceBinding currentType = invocationType;
-               ReferenceBinding declaringClass = enclosingType(); // protected types always have an enclosing one
-               if (declaringClass == null) return false; // could be null if incorrect top-level protected type
-               //int depth = 0;
+               ReferenceBinding type = receiverType;
+               ReferenceBinding declaringClass = enclosingType() == null ? this
+                               : enclosingType();
                do {
-                       if (declaringClass == invocationType) return true;
-                       if (declaringClass.isSuperclassOf(currentType)) return true;
-                       //depth++;
-                       currentType = currentType.enclosingType();
-               } while (currentType != null);
+                       if (declaringClass == type)
+                               return true;
+                       if (fPackage != type.fPackage)
+                               return false;
+               } while ((type = type.superclass()) != null);
                return false;
        }
 
-       if (isPrivate()) {
-               // answer true if the receiverType is the receiver or its enclosingType
-               // AND the invocationType and the receiver have a common enclosingType
-               if (!(receiverType == this || receiverType == enclosingType())) return false;
-               
-               if (invocationType != this) {
+       /*
+        * Answer true if the receiver is visible to the type provided by the scope.
+        */
+
+       public final boolean canBeSeenBy(Scope scope) {
+
+               if (isPublic())
+                       return true;
+
+               if (scope.kind == Scope.COMPILATION_UNIT_SCOPE) {
+                       return this.canBeSeenBy(((CompilationUnitScope) scope).fPackage);
+               }
+
+               SourceTypeBinding invocationType = scope.enclosingSourceType();
+               if (invocationType == this)
+                       return true;
+
+               if (isProtected()) {
+                       // answer true if the invocationType is the declaringClass or they
+                       // are in the same package
+                       // OR the invocationType is a subclass of the declaringClass
+                       // AND the invocationType is the invocationType or its subclass
+                       // OR the type is a static method accessed directly through a type
+                       // OR previous assertions are true for one of the enclosing type
+                       if (invocationType.fPackage == fPackage)
+                               return true;
+
+                       ReferenceBinding currentType = invocationType;
+                       ReferenceBinding declaringClass = enclosingType(); // protected
+                                                                                                                               // types always
+                                                                                                                               // have an
+                                                                                                                               // enclosing one
+                       if (declaringClass == null)
+                               return false; // could be null if incorrect top-level
+                                                               // protected type
+                       // int depth = 0;
+                       do {
+                               if (declaringClass == invocationType)
+                                       return true;
+                               if (declaringClass.isSuperclassOf(currentType))
+                                       return true;
+                               // depth++;
+                               currentType = currentType.enclosingType();
+                       } while (currentType != null);
+                       return false;
+               }
+               if (isPrivate()) {
+                       // answer true if the receiver and the invocationType have a common
+                       // enclosingType
+                       // already know they are not the identical type
                        ReferenceBinding outerInvocationType = invocationType;
                        ReferenceBinding temp = outerInvocationType.enclosingType();
                        while (temp != null) {
@@ -107,493 +225,526 @@ public final boolean canBeSeenBy(ReferenceBinding receiverType, SourceTypeBindin
                                outerDeclaringClass = temp;
                                temp = temp.enclosingType();
                        }
-                       if (outerInvocationType != outerDeclaringClass) return false;
+                       return outerInvocationType == outerDeclaringClass;
                }
-               return true;
+
+               // isDefault()
+               return invocationType.fPackage == fPackage;
        }
 
-       // isDefault()
-       if (invocationType.fPackage != fPackage) return false;
+       // public void computeId() {
+       // if (compoundName.length != 3) {
+       // if (compoundName.length == 4 &&
+       // CharOperation.equals(JAVA_LANG_REFLECT_CONSTRUCTOR, compoundName)) {
+       // id = T_JavaLangReflectConstructor;
+       // return;
+       // }
+       // return; // all other types are in java.*.*
+       // }
+       //
+       // if (!CharOperation.equals(JAVA, compoundName[0]))
+       // return; // assumes we only look up types in java
+       //
+       // if (!CharOperation.equals(LANG, compoundName[1])) {
+       // if (CharOperation.equals(JAVA_IO_PRINTSTREAM, compoundName)) {
+       // id = T_JavaIoPrintStream;
+       // return;
+       // }
+       // return; // all other types are in java.lang
+       // }
+       //
+       // if (CharOperation.equals(JAVA_LANG_OBJECT, compoundName)) {
+       // id = T_JavaLangObject;
+       // return;
+       // }
+       // if (CharOperation.equals(JAVA_LANG_STRING, compoundName)) {
+       // id = T_JavaLangString;
+       // return;
+       // }
+       //
+       // // well-known exception types
+       // if (CharOperation.equals(JAVA_LANG_THROWABLE, compoundName)) {
+       // id = T_JavaLangThrowable;
+       // return;
+       // }
+       // if (CharOperation.equals(JAVA_LANG_ERROR, compoundName)) {
+       // id = T_JavaLangError;
+       // return;
+       // }
+       // if (CharOperation.equals(JAVA_LANG_EXCEPTION, compoundName)) {
+       // id = T_JavaLangException;
+       // return;
+       // }
+       // if (CharOperation.equals(JAVA_LANG_CLASSNOTFOUNDEXCEPTION, compoundName))
+       // {
+       // id = T_JavaLangClassNotFoundException;
+       // return;
+       // }
+       // if (CharOperation.equals(JAVA_LANG_NOCLASSDEFERROR, compoundName)) {
+       // id = T_JavaLangNoClassDefError;
+       // return;
+       // }
+       //
+       // // other well-known types
+       // if (CharOperation.equals(JAVA_LANG_CLASS, compoundName)) {
+       // id = T_JavaLangClass;
+       // return;
+       // }
+       // if (CharOperation.equals(JAVA_LANG_STRINGBUFFER, compoundName)) {
+       // id = T_JavaLangStringBuffer;
+       // return;
+       // }
+       // if (CharOperation.equals(JAVA_LANG_SYSTEM, compoundName)) {
+       // id = T_JavaLangSystem;
+       // return;
+       // }
+       //
+       // if (CharOperation.equals(JAVA_LANG_INTEGER, compoundName)) {
+       // id = T_JavaLangInteger;
+       // return;
+       // }
+       //
+       // if (CharOperation.equals(JAVA_LANG_BYTE, compoundName)) {
+       // id = T_JavaLangByte;
+       // return;
+       // }
+       //
+       // if (CharOperation.equals(JAVA_LANG_CHARACTER, compoundName)) {
+       // id = T_JavaLangCharacter;
+       // return;
+       // }
+       //
+       // if (CharOperation.equals(JAVA_LANG_FLOAT, compoundName)) {
+       // id = T_JavaLangFloat;
+       // return;
+       // }
+       //
+       // if (CharOperation.equals(JAVA_LANG_DOUBLE, compoundName)) {
+       // id = T_JavaLangDouble;
+       // return;
+       // }
+       //
+       // if (CharOperation.equals(JAVA_LANG_BOOLEAN, compoundName)) {
+       // id = T_JavaLangBoolean;
+       // return;
+       // }
+       //
+       // if (CharOperation.equals(JAVA_LANG_SHORT, compoundName)) {
+       // id = T_JavaLangShort;
+       // return;
+       // }
+       //
+       // if (CharOperation.equals(JAVA_LANG_LONG, compoundName)) {
+       // id = T_JavaLangLong;
+       // return;
+       // }
+       //
+       // if (CharOperation.equals(JAVA_LANG_VOID, compoundName)) {
+       // id = T_JavaLangVoid;
+       // return;
+       // }
+       //      
+       // if (CharOperation.equals(JAVA_LANG_ASSERTIONERROR, compoundName)) {
+       // id = T_JavaLangAssertionError;
+       // return;
+       // }
+       // }
+       /*
+        * Answer the receiver's constant pool name.
+        * 
+        * NOTE: This method should only be used during/after code gen.
+        */
+
+       public char[] constantPoolName() /* java/lang/Object */{
+               if (constantPoolName != null)
+                       return constantPoolName;
+               return constantPoolName = CharOperation.concatWith(compoundName, '/');
+       }
 
-       ReferenceBinding type = receiverType;
-       ReferenceBinding declaringClass = enclosingType() == null ? this : enclosingType();
-       do {
-               if (declaringClass == type) return true;
-               if (fPackage != type.fPackage) return false;
-       } while ((type = type.superclass()) != null);
-       return false;
-}
-/* Answer true if the receiver is visible to the type provided by the scope.
-*
-* NOTE: Cannot invoke this method with a compilation unit scope.
-*/
-
-public final boolean canBeSeenBy(Scope scope) {
-       if (isPublic()) return true;
-
-       SourceTypeBinding invocationType = scope.enclosingSourceType();
-       if (invocationType == this) return true;
-
-       if (isProtected()) {
-               // answer true if the receiver (or its enclosing type) is the superclass 
-               //      of the invocationType or in the same package
-               return invocationType.fPackage == fPackage 
-                               || isSuperclassOf(invocationType)
-                               || enclosingType().isSuperclassOf(invocationType); // protected types always have an enclosing one
-       }
-
-       if (isProtected()) {
-               // answer true if the invocationType is the declaringClass or they are in the same package
-               // OR the invocationType is a subclass of the declaringClass
-               //    AND the invocationType is the invocationType or its subclass
-               //    OR the type is a static method accessed directly through a type
-               //    OR previous assertions are true for one of the enclosing type
-               if (invocationType.fPackage == fPackage) return true;
-
-               ReferenceBinding currentType = invocationType;
-               ReferenceBinding declaringClass = enclosingType(); // protected types always have an enclosing one
-               if (declaringClass == null) return false; // could be null if incorrect top-level protected type
-               // int depth = 0;
-               do {
-                       if (declaringClass == invocationType) return true;
-                       if (declaringClass.isSuperclassOf(currentType)) return true;
-                       // depth++;
-                       currentType = currentType.enclosingType();
-               } while (currentType != null);
-               return false;
+       String debugName() {
+               return (compoundName != null) ? new String(readableName())
+                               : "UNNAMED TYPE"; //$NON-NLS-1$
        }
-       if (isPrivate()) {
-               // answer true if the receiver and the invocationType have a common enclosingType
-               // already know they are not the identical type
-               ReferenceBinding outerInvocationType = invocationType;
-               ReferenceBinding temp = outerInvocationType.enclosingType();
-               while (temp != null) {
-                       outerInvocationType = temp;
-                       temp = temp.enclosingType();
-               }
 
-               ReferenceBinding outerDeclaringClass = this;
-               temp = outerDeclaringClass.enclosingType();
-               while (temp != null) {
-                       outerDeclaringClass = temp;
-                       temp = temp.enclosingType();
-               }
-               return outerInvocationType == outerDeclaringClass;
+       public final int depth() {
+               int depth = 0;
+               ReferenceBinding current = this;
+               while ((current = current.enclosingType()) != null)
+                       depth++;
+               return depth;
        }
 
-       // isDefault()
-       return invocationType.fPackage == fPackage;
-}
-public void computeId() {
-       if (compoundName.length != 3) {
-               if (compoundName.length == 4 && CharOperation.equals(JAVA_LANG_REFLECT_CONSTRUCTOR, compoundName)) {
-                       id = T_JavaLangReflectConstructor;
-                       return;
-               }
-               return;         // all other types are in java.*.*
+       /*
+        * Answer the receiver's enclosing type... null if the receiver is a top
+        * level type.
+        */
+
+       public ReferenceBinding enclosingType() {
+               return null;
        }
 
-       if (!CharOperation.equals(JAVA, compoundName[0]))
-               return;         // assumes we only look up types in java
+       public final ReferenceBinding enclosingTypeAt(int relativeDepth) {
+               ReferenceBinding current = this;
+               while (relativeDepth-- > 0 && current != null)
+                       current = current.enclosingType();
+               return current;
+       }
 
-       if (!CharOperation.equals(LANG, compoundName[1])) {
-               if (CharOperation.equals(JAVA_IO_PRINTSTREAM, compoundName)) {
-                       id = T_JavaIoPrintStream;
-                       return;
-               }
-               return;         // all other types are in java.lang
+       public int fieldCount() {
+               return fields().length;
        }
 
-       if (CharOperation.equals(JAVA_LANG_OBJECT, compoundName)) {
-               id = T_JavaLangObject;
-               return;
+       public FieldBinding[] fields() {
+               return NoFields;
        }
-       if (CharOperation.equals(JAVA_LANG_STRING, compoundName)) {
-               id = T_JavaLangString;
-               return;
+
+       public final int getAccessFlags() {
+               return modifiers & AccJustFlag;
        }
 
-       // well-known exception types
-       if (CharOperation.equals(JAVA_LANG_THROWABLE, compoundName)) {
-               id = T_JavaLangThrowable;
-               return;
+       public MethodBinding getExactConstructor(TypeBinding[] argumentTypes) {
+               return null;
        }
-       if (CharOperation.equals(JAVA_LANG_ERROR, compoundName)) {
-               id = T_JavaLangError;
-               return;
+
+       public MethodBinding getExactMethod(char[] selector,
+                       TypeBinding[] argumentTypes) {
+               return null;
        }
-       if (CharOperation.equals(JAVA_LANG_EXCEPTION, compoundName)) {
-               id = T_JavaLangException;
-               return;
+
+       public FieldBinding getField(char[] fieldName) {
+               return null;
        }
-       if (CharOperation.equals(JAVA_LANG_CLASSNOTFOUNDEXCEPTION, compoundName)) {
-               id = T_JavaLangClassNotFoundException;
-               return;
+
+       /**
+        * Answer the file name which defines the type.
+        * 
+        * The path part (optional) must be separated from the actual file proper
+        * name by a java.io.File.separator.
+        * 
+        * The proper file name includes the suffix extension (e.g. ".java")
+        * 
+        * e.g. "c:/com/ibm/compiler/java/api/Compiler.java"
+        */
+
+       public char[] getFileName() {
+               return fileName;
        }
-       if (CharOperation.equals(JAVA_LANG_NOCLASSDEFERROR, compoundName)) {
-               id = T_JavaLangNoClassDefError;
-               return;
+
+       public ReferenceBinding getMemberType(char[] typeName) {
+               ReferenceBinding[] memberTypes = memberTypes();
+               for (int i = memberTypes.length; --i >= 0;)
+                       if (CharOperation.equals(memberTypes[i].sourceName, typeName))
+                               return memberTypes[i];
+               return null;
        }
 
-       // other well-known types
-       if (CharOperation.equals(JAVA_LANG_CLASS, compoundName)) {
-               id = T_JavaLangClass;
-               return;
+       public MethodBinding[] getMethods(char[] selector) {
+               return NoMethods;
        }
-       if (CharOperation.equals(JAVA_LANG_STRINGBUFFER, compoundName)) {
-               id = T_JavaLangStringBuffer;
-               return;
+
+       public PackageBinding getPackage() {
+               return fPackage;
        }
-       if (CharOperation.equals(JAVA_LANG_SYSTEM, compoundName)) {
-               id = T_JavaLangSystem;
-               return;
+
+       /*
+        * Answer true if the receiver implements anInterface or is identical to
+        * anInterface. If searchHierarchy is true, then also search the receiver's
+        * superclasses.
+        * 
+        * NOTE: Assume that anInterface is an interface.
+        */
+
+       public boolean implementsInterface(ReferenceBinding anInterface,
+                       boolean searchHierarchy) {
+               if (this == anInterface)
+                       return true;
+
+               ReferenceBinding[][] interfacesToVisit = new ReferenceBinding[5][];
+               int lastPosition = -1;
+               ReferenceBinding currentType = this;
+               do {
+                       ReferenceBinding[] itsInterfaces = currentType.superInterfaces();
+                       if (itsInterfaces != NoSuperInterfaces) {
+                               if (++lastPosition == interfacesToVisit.length)
+                                       System
+                                                       .arraycopy(
+                                                                       interfacesToVisit,
+                                                                       0,
+                                                                       interfacesToVisit = new ReferenceBinding[lastPosition * 2][],
+                                                                       0, lastPosition);
+                               interfacesToVisit[lastPosition] = itsInterfaces;
+                       }
+               } while (searchHierarchy
+                               && (currentType = currentType.superclass()) != null);
+
+               for (int i = 0; i <= lastPosition; i++) {
+                       ReferenceBinding[] interfaces = interfacesToVisit[i];
+                       for (int j = 0, length = interfaces.length; j < length; j++) {
+                               if ((currentType = interfaces[j]) == anInterface)
+                                       return true;
+
+                               ReferenceBinding[] itsInterfaces = currentType
+                                               .superInterfaces();
+                               if (itsInterfaces != NoSuperInterfaces) {
+                                       if (++lastPosition == interfacesToVisit.length)
+                                               System
+                                                               .arraycopy(
+                                                                               interfacesToVisit,
+                                                                               0,
+                                                                               interfacesToVisit = new ReferenceBinding[lastPosition * 2][],
+                                                                               0, lastPosition);
+                                       interfacesToVisit[lastPosition] = itsInterfaces;
+                               }
+                       }
+               }
+               return false;
        }
 
-       if (CharOperation.equals(JAVA_LANG_INTEGER, compoundName)) {
-               id = T_JavaLangInteger;
-               return;
+       // Internal method... assume its only sent to classes NOT interfaces
+
+       boolean implementsMethod(MethodBinding method) {
+               ReferenceBinding type = this;
+               while (type != null) {
+                       MethodBinding[] methods = type.getMethods(method.selector);
+                       for (int i = methods.length; --i >= 0;)
+                               if (methods[i].areParametersEqual(method))
+                                       return true;
+                       type = type.superclass();
+               }
+               return false;
        }
 
-       if (CharOperation.equals(JAVA_LANG_BYTE, compoundName)) {
-               id = T_JavaLangByte;
-               return;
-       }       
+       /*
+        * Answer true if the receiver is an abstract type
+        */
 
-       if (CharOperation.equals(JAVA_LANG_CHARACTER, compoundName)) {
-               id = T_JavaLangCharacter;
-               return;
+       public final boolean isAbstract() {
+               return (modifiers & AccAbstract) != 0;
        }
 
-       if (CharOperation.equals(JAVA_LANG_FLOAT, compoundName)) {
-               id = T_JavaLangFloat;
-               return;
+       public final boolean isAnonymousType() {
+               return (tagBits & IsAnonymousType) != 0;
        }
 
-       if (CharOperation.equals(JAVA_LANG_DOUBLE, compoundName)) {
-               id = T_JavaLangDouble;
-               return;
+       public final boolean isBinaryBinding() {
+               return (tagBits & IsBinaryBinding) != 0;
        }
 
-       if (CharOperation.equals(JAVA_LANG_BOOLEAN, compoundName)) {
-               id = T_JavaLangBoolean;
-               return;
+       public final boolean isClass() {
+               return (modifiers & AccInterface) == 0;
        }
 
-       if (CharOperation.equals(JAVA_LANG_SHORT, compoundName)) {
-               id = T_JavaLangShort;
-               return;
+       /*
+        * Answer true if the receiver type can be assigned to the argument type
+        * (right)
+        */
+
+       public boolean isCompatibleWith(TypeBinding right) {
+               if (right == this)
+                       return true;
+               if (right.id == T_Object)
+                       return true;
+               if (!(right instanceof ReferenceBinding))
+                       return false;
+
+               ReferenceBinding referenceBinding = (ReferenceBinding) right;
+               if (referenceBinding.isInterface())
+                       return implementsInterface(referenceBinding, true);
+               if (isInterface()) // Explicit conversion from an interface to a class
+                                                       // is not allowed
+                       return false;
+               return referenceBinding.isSuperclassOf(this);
        }
 
-       if (CharOperation.equals(JAVA_LANG_LONG, compoundName)) {
-               id = T_JavaLangLong;
-               return;
+       /*
+        * Answer true if the receiver has default visibility
+        */
+
+       public final boolean isDefault() {
+               return (modifiers & (AccPublic | AccProtected | AccPrivate)) == 0;
        }
 
-       if (CharOperation.equals(JAVA_LANG_VOID, compoundName)) {
-               id = T_JavaLangVoid;
-               return;
+       /*
+        * Answer true if the receiver is a deprecated type
+        */
+
+       public final boolean isDeprecated() {
+               return (modifiers & AccDeprecated) != 0;
        }
-       
-       if (CharOperation.equals(JAVA_LANG_ASSERTIONERROR, compoundName)) {
-               id = T_JavaLangAssertionError;
-               return;
+
+       /*
+        * Answer true if the receiver is final and cannot be subclassed
+        */
+
+       public final boolean isFinal() {
+               return (modifiers & AccFinal) != 0;
        }
-}
-/* Answer the receiver's constant pool name.
-*
-* NOTE: This method should only be used during/after code gen.
-*/
-
-public char[] constantPoolName() /* java/lang/Object */ {
-       if (constantPoolName != null)   return constantPoolName;
-       return constantPoolName = CharOperation.concatWith(compoundName, '/');
-}
-String debugName() {
-       return (compoundName != null) ? new String(readableName()) : "UNNAMED TYPE"; //$NON-NLS-1$
-}
-public final int depth() {
-       int depth = 0;
-       ReferenceBinding current = this;
-       while ((current = current.enclosingType()) != null)
-               depth++;
-       return depth;
-}
-/* Answer the receiver's enclosing type... null if the receiver is a top level type.
-*/
 
-public ReferenceBinding enclosingType() {
-       return null;
-}
-public final ReferenceBinding enclosingTypeAt(int relativeDepth) {
-       ReferenceBinding current = this;
-       while (relativeDepth-- > 0 && current != null)
-               current = current.enclosingType();
-       return current;
-}
-public int fieldCount() {
-       return fields().length;
-}
-public FieldBinding[] fields() {
-       return NoFields;
-}
-public final int getAccessFlags() {
-       return modifiers & AccJustFlag;
-}
-public MethodBinding getExactConstructor(TypeBinding[] argumentTypes) {
-       return null;
-}
-public MethodBinding getExactMethod(char[] selector, TypeBinding[] argumentTypes) {
-       return null;
-}
-public FieldBinding getField(char[] fieldName) {
-       return null;
-}
-/**
- * Answer the file name which defines the type.
- *
- * The path part (optional) must be separated from the actual
- * file proper name by a java.io.File.separator.
- *
- * The proper file name includes the suffix extension (e.g. ".java")
- *
- * e.g. "c:/com/ibm/compiler/java/api/Compiler.java" 
- */
+       public final boolean isInterface() {
+               return (modifiers & AccInterface) != 0;
+       }
 
-public char[] getFileName() {
-       return fileName;
-}
-public ReferenceBinding getMemberType(char[] typeName) {
-       ReferenceBinding[] memberTypes = memberTypes();
-       for (int i = memberTypes.length; --i >= 0;)
-               if (CharOperation.equals(memberTypes[i].sourceName, typeName))
-                       return memberTypes[i];
-       return null;
-}
-public MethodBinding[] getMethods(char[] selector) {
-       return NoMethods;
-}
-public PackageBinding getPackage() {
-       return fPackage;
-}
-/* Answer true if the receiver implements anInterface or is identical to anInterface.
-* If searchHierarchy is true, then also search the receiver's superclasses.
-*
-* NOTE: Assume that anInterface is an interface.
-*/
-
-public boolean implementsInterface(ReferenceBinding anInterface, boolean searchHierarchy) {
-       if (this == anInterface)
-               return true;
-
-       ReferenceBinding[][] interfacesToVisit = new ReferenceBinding[5][];
-       int lastPosition = -1;
-       ReferenceBinding currentType = this;
-       do {
-               ReferenceBinding[] itsInterfaces = currentType.superInterfaces();
-               if (itsInterfaces != NoSuperInterfaces) {
-                       if (++lastPosition == interfacesToVisit.length)
-                               System.arraycopy(interfacesToVisit, 0, interfacesToVisit = new ReferenceBinding[lastPosition * 2][], 0, lastPosition);
-                       interfacesToVisit[lastPosition] = itsInterfaces;
-               }
-       } while (searchHierarchy && (currentType = currentType.superclass()) != null);
-                       
-       for (int i = 0; i <= lastPosition; i++) {
-               ReferenceBinding[] interfaces = interfacesToVisit[i];
-               for (int j = 0, length = interfaces.length; j < length; j++) {
-                       if ((currentType = interfaces[j]) == anInterface)
-                               return true;
+       public final boolean isLocalType() {
+               return (tagBits & IsLocalType) != 0;
+       }
 
-                       ReferenceBinding[] itsInterfaces = currentType.superInterfaces();
-                       if (itsInterfaces != NoSuperInterfaces) {
-                               if (++lastPosition == interfacesToVisit.length)
-                                       System.arraycopy(interfacesToVisit, 0, interfacesToVisit = new ReferenceBinding[lastPosition * 2][], 0, lastPosition);
-                               interfacesToVisit[lastPosition] = itsInterfaces;
-                       }
-               }
+       public final boolean isMemberType() {
+               return (tagBits & IsMemberType) != 0;
        }
-       return false;
-}
-// Internal method... assume its only sent to classes NOT interfaces
-
-boolean implementsMethod(MethodBinding method) {
-       ReferenceBinding type = this;
-       while (type != null) {
-               MethodBinding[] methods = type.getMethods(method.selector);
-               for (int i = methods.length; --i >= 0;)
-                       if (methods[i].areParametersEqual(method))
-                               return true;
-               type = type.superclass();
+
+       public final boolean isNestedType() {
+               return (tagBits & IsNestedType) != 0;
        }
-       return false;
-}
-/* Answer true if the receiver is an abstract type
-*/
 
-public final boolean isAbstract() {
-       return (modifiers & AccAbstract) != 0;
-}
-public final boolean isAnonymousType() {
-       return (tagBits & IsAnonymousType) != 0;
-}
-public final boolean isBinaryBinding() {
-       return (tagBits & IsBinaryBinding) != 0;
-}
-public final boolean isClass() {
-       return (modifiers & AccInterface) == 0;
-}
-/* Answer true if the receiver type can be assigned to the argument type (right)
-*/
-       
-boolean isCompatibleWith(TypeBinding right) {
-       if (right == this)
-               return true;
-       if (right.id == T_Object)
-               return true;
-       if (!(right instanceof ReferenceBinding))
-               return false;
+       /*
+        * Answer true if the receiver has private visibility
+        */
 
-       ReferenceBinding referenceBinding = (ReferenceBinding) right;
-       if (referenceBinding.isInterface())
-               return implementsInterface(referenceBinding, true);
-       if (isInterface())  // Explicit conversion from an interface to a class is not allowed
-               return false;
-       return referenceBinding.isSuperclassOf(this);
-}
-/* Answer true if the receiver has default visibility
-*/
+       public final boolean isPrivate() {
+               return (modifiers & AccPrivate) != 0;
+       }
 
-public final boolean isDefault() {
-       return (modifiers & (AccPublic | AccProtected | AccPrivate)) == 0;
-}
-/* Answer true if the receiver is a deprecated type
-*/
+       /*
+        * Answer true if the receiver has private visibility and is used locally
+        */
 
-public final boolean isDeprecated() {
-       return (modifiers & AccDeprecated) != 0;
-}
-/* Answer true if the receiver is final and cannot be subclassed
-*/
+       public final boolean isPrivateUsed() {
+               return (modifiers & AccPrivateUsed) != 0;
+       }
 
-public final boolean isFinal() {
-       return (modifiers & AccFinal) != 0;
-}
-public final boolean isInterface() {
-       return (modifiers & AccInterface) != 0;
-}
-public final boolean isLocalType() {
-       return (tagBits & IsLocalType) != 0;
-}
-public final boolean isMemberType() {
-       return (tagBits & IsMemberType) != 0;
-}
-public final boolean isNestedType() {
-       return (tagBits & IsNestedType) != 0;
-}
-/* Answer true if the receiver has private visibility
-*/
+       /*
+        * Answer true if the receiver has protected visibility
+        */
 
-public final boolean isPrivate() {
-       return (modifiers & AccPrivate) != 0;
-}
-/* Answer true if the receiver has protected visibility
-*/
+       public final boolean isProtected() {
+               return (modifiers & AccProtected) != 0;
+       }
 
-public final boolean isProtected() {
-       return (modifiers & AccProtected) != 0;
-}
-/* Answer true if the receiver has public visibility
-*/
+       /*
+        * Answer true if the receiver has public visibility
+        */
 
-public final boolean isPublic() {
-       return (modifiers & AccPublic) != 0;
-}
-/* Answer true if the receiver is a static member type (or toplevel)
- */
+       public final boolean isPublic() {
+               return (modifiers & AccPublic) != 0;
+       }
 
-public final boolean isStatic() {
-       return (modifiers & (AccStatic | AccInterface)) != 0 ||
-                   (tagBits & IsNestedType) == 0;
-}
-/* Answer true if all float operations must adher to IEEE 754 float/double rules
-*/
+       /*
+        * Answer true if the receiver is a static member type (or toplevel)
+        */
 
-public final boolean isStrictfp() {
-       return (modifiers & AccStrictfp) != 0;
-}
-/* Answer true if the receiver is in the superclass hierarchy of aType
-*
-* NOTE: Object.isSuperclassOf(Object) -> false
-*/
+       public final boolean isStatic() {
+               return (modifiers & (AccStatic | AccInterface)) != 0
+                               || (tagBits & IsNestedType) == 0;
+       }
 
-public boolean isSuperclassOf(ReferenceBinding type) {
-       do {
-               if (this == (type = type.superclass())) return true;
-       } while (type != null);
+       /*
+        * Answer true if all float operations must adher to IEEE 754 float/double
+        * rules
+        */
+
+       // public final boolean isStrictfp() {
+       // return (modifiers & AccStrictfp) != 0;
+       // }
+       /*
+        * Answer true if the receiver is in the superclass hierarchy of aType
+        * 
+        * NOTE: Object.isSuperclassOf(Object) -> false
+        */
+
+       public boolean isSuperclassOf(ReferenceBinding type) {
+               do {
+                       if (this == (type = type.superclass()))
+                               return true;
+               } while (type != null);
 
-       return false;
-}
-/* Answer true if the receiver is deprecated (or any of its enclosing types)
-*/
+               return false;
+       }
 
-public final boolean isViewedAsDeprecated() {
-       return (modifiers & AccDeprecated) != 0 ||
-               (modifiers & AccDeprecatedImplicitly) != 0;
-}
-public ReferenceBinding[] memberTypes() {
-       return NoMemberTypes;
-}
-public MethodBinding[] methods() {
-       return NoMethods;
-}
-/**
-* Answer the source name for the type.
-* In the case of member types, as the qualified name from its top level type.
-* For example, for a member type N defined inside M & A: "A.M.N".
-*/
-
-public char[] qualifiedSourceName() {
-       if (isMemberType()) {
-               return CharOperation.concat(enclosingType().qualifiedSourceName(), sourceName(), '.');
-       } else {
-               return sourceName();
+       /*
+        * Answer true if the receiver is deprecated (or any of its enclosing types)
+        */
+
+       public final boolean isViewedAsDeprecated() {
+               return (modifiers & AccDeprecated) != 0
+                               || (modifiers & AccDeprecatedImplicitly) != 0;
        }
-}
-public char[] readableName() /*java.lang.Object*/ {
-       if (isMemberType())
-               return CharOperation.concat(enclosingType().readableName(), sourceName, '.');
-       else
-               return CharOperation.concatWith(compoundName, '.');
-}
-/* Answer the receiver's signature.
-*
-* NOTE: This method should only be used during/after code gen.
-*/
 
-public char[] signature() /* Ljava/lang/Object; */ {
-       if (signature != null)
-               return signature;
+       public ReferenceBinding[] memberTypes() {
+               return NoMemberTypes;
+       }
 
-       return signature = CharOperation.concat('L', constantPoolName(), ';');
-}
-public char[] sourceName() {
-       return sourceName;
-}
-public ReferenceBinding superclass() {
-       return null;
-}
-public ReferenceBinding[] superInterfaces() {
-       return NoSuperInterfaces;
-}
-public ReferenceBinding[] syntheticEnclosingInstanceTypes() {
-       if (isStatic()) return null;
+       public MethodBinding[] methods() {
+               return NoMethods;
+       }
 
-       ReferenceBinding enclosingType = enclosingType();
-       if (enclosingType == null)
+       /**
+        * Answer the source name for the type. In the case of member types, as the
+        * qualified name from its top level type. For example, for a member type N
+        * defined inside M & A: "A.M.N".
+        */
+
+       public char[] qualifiedSourceName() {
+               if (isMemberType()) {
+                       return CharOperation.concat(enclosingType().qualifiedSourceName(),
+                                       sourceName(), '.');
+               } else {
+                       return sourceName();
+               }
+       }
+
+       public char[] readableName() /* java.lang.Object */{
+               if (isMemberType())
+                       return CharOperation.concat(enclosingType().readableName(),
+                                       sourceName, '.');
+               else
+                       return CharOperation.concatWith(compoundName, '.');
+       }
+
+       public char[] shortReadableName() /* Object */{
+               if (isMemberType())
+                       return CharOperation.concat(enclosingType().shortReadableName(),
+                                       sourceName, '.');
+               else
+                       return sourceName;
+       }
+
+       /*
+        * Answer the receiver's signature.
+        * 
+        * NOTE: This method should only be used during/after code gen.
+        */
+
+       public char[] signature() /* Ljava/lang/Object; */{
+               if (signature != null)
+                       return signature;
+
+               return signature = CharOperation.concat('L', constantPoolName(), ';');
+       }
+
+       public char[] sourceName() {
+               return sourceName;
+       }
+
+       public ReferenceBinding superclass() {
                return null;
-       else
-               return new ReferenceBinding[] {enclosingType};
-}
-public SyntheticArgumentBinding[] syntheticOuterLocalVariables() {
-       return null;            // is null if no enclosing instances are required
-}
+       }
+
+       public ReferenceBinding[] superInterfaces() {
+               return NoSuperInterfaces;
+       }
+
+       public ReferenceBinding[] syntheticEnclosingInstanceTypes() {
+               if (isStatic())
+                       return null;
+
+               ReferenceBinding enclosingType = enclosingType();
+               if (enclosingType == null)
+                       return null;
+               else
+                       return new ReferenceBinding[] { enclosingType };
+       }
+
+       public SyntheticArgumentBinding[] syntheticOuterLocalVariables() {
+               return null; // is null if no enclosing instances are required
+       }
 }