Refactory: smarty.ui plugin.
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpdt / internal / compiler / lookup / PackageBinding.java
index dd70b2a..a40cafa 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.internal.compiler.util.CharOperation;
+import net.sourceforge.phpdt.core.compiler.CharOperation;
 import net.sourceforge.phpdt.internal.compiler.util.HashtableOfPackage;
 import net.sourceforge.phpdt.internal.compiler.util.HashtableOfType;
 
 public class PackageBinding extends Binding implements TypeConstants {
        public char[][] compoundName;
+
        PackageBinding parent;
+
        LookupEnvironment environment;
+
        HashtableOfType knownTypes;
+
        HashtableOfPackage knownPackages;
-protected PackageBinding() {
-}
-public PackageBinding(char[][] compoundName, PackageBinding parent, LookupEnvironment environment) {
-       this.compoundName = compoundName;
-       this.parent = parent;
-       this.environment = environment;
-       this.knownTypes = null; // initialized if used... class counts can be very large 300-600
-       this.knownPackages = new HashtableOfPackage(3); // sub-package counts are typically 0-3
-}
-public PackageBinding(char[] topLevelPackageName, LookupEnvironment environment) {
-       this(new char[][] {topLevelPackageName}, null, environment);
-}
-/* Create the default package.
-*/
 
-public PackageBinding(LookupEnvironment environment) {
-       this(NoCharChar, null, environment);
-}
-private void addNotFoundPackage(char[] simpleName) {
-       knownPackages.put(simpleName, LookupEnvironment.theNotFoundPackage);
-}
-private void addNotFoundType(char[] simpleName) {
-       if (knownTypes == null)
-               knownTypes = new HashtableOfType(25);
-       knownTypes.put(simpleName, LookupEnvironment.theNotFoundType);
-}
-void addPackage(PackageBinding element) {
-       knownPackages.put(element.compoundName[element.compoundName.length - 1], element);
-}
-void addType(ReferenceBinding element) {
-       if (knownTypes == null)
-               knownTypes = new HashtableOfType(25);
-       knownTypes.put(element.compoundName[element.compoundName.length - 1], element);
-}
-/* API
-* Answer the receiver's binding type from Binding.BindingID.
-*/
+       protected PackageBinding() {
+       }
 
-public final int bindingType() {
-       return PACKAGE;
-}
-private PackageBinding findPackage(char[] name) {
-       if (!environment.isPackage(this.compoundName, name))
-               return null;
+       public PackageBinding(char[][] compoundName, PackageBinding parent,
+                       LookupEnvironment environment) {
+               this.compoundName = compoundName;
+               this.parent = parent;
+               this.environment = environment;
+               this.knownTypes = null; // initialized if used... class counts can be
+                                                               // very large 300-600
+               this.knownPackages = new HashtableOfPackage(3); // sub-package counts
+                                                                                                               // are typically 0-3
+       }
 
-       char[][] compoundName = CharOperation.arrayConcat(this.compoundName, name);
-       PackageBinding newPackageBinding = new PackageBinding(compoundName, this, environment);
-       addPackage(newPackageBinding);
-       return newPackageBinding;
-}
-/* Answer the subpackage named name; ask the oracle for the package if its not in the cache.
-* Answer null if it could not be resolved.
-*
-* NOTE: This should only be used when we know there is NOT a type with the same name.
-*/
-
-PackageBinding getPackage(char[] name) {
-       PackageBinding binding = getPackage0(name);
-       if (binding != null) {
-               if (binding == LookupEnvironment.theNotFoundPackage)
-                       return null;
-               else
-                       return binding;
+       public PackageBinding(char[] topLevelPackageName,
+                       LookupEnvironment environment) {
+               this(new char[][] { topLevelPackageName }, null, environment);
        }
-       if ((binding = findPackage(name)) != null)
-               return binding;
 
-       // not found so remember a problem package binding in the cache for future lookups
-       addNotFoundPackage(name);
-       return null;
-}
-/* Answer the subpackage named name if it exists in the cache.
-* Answer theNotFoundPackage if it could not be resolved the first time
-* it was looked up, otherwise answer null.
-*
-* NOTE: Senders must convert theNotFoundPackage into a real problem
-* package if its to returned.
-*/
-
-PackageBinding getPackage0(char[] name) {
-       return knownPackages.get(name);
-}
-/* Answer the type named name; ask the oracle for the type if its not in the cache.
-* Answer a NotVisible problem type if the type is not visible from the invocationPackage.
-* Answer null if it could not be resolved.
-*
-* NOTE: This should only be used by source types/scopes which know there is NOT a
-* package with the same name.
-*/
-
-ReferenceBinding getType(char[] name) {
-       ReferenceBinding binding = getType0(name);
-       if (binding == null) {
-               if ((binding = environment.askForType(this, name)) == null) {
-                       // not found so remember a problem type binding in the cache for future lookups
-                       addNotFoundType(name);
+       /*
+        * Create the default package.
+        */
+
+       public PackageBinding(LookupEnvironment environment) {
+               this(CharOperation.NO_CHAR_CHAR, null, environment);
+       }
+
+       private void addNotFoundPackage(char[] simpleName) {
+               knownPackages.put(simpleName, LookupEnvironment.TheNotFoundPackage);
+       }
+
+       private void addNotFoundType(char[] simpleName) {
+               if (knownTypes == null)
+                       knownTypes = new HashtableOfType(25);
+               knownTypes.put(simpleName, LookupEnvironment.TheNotFoundType);
+       }
+
+       void addPackage(PackageBinding element) {
+               knownPackages.put(
+                               element.compoundName[element.compoundName.length - 1], element);
+       }
+
+       void addType(ReferenceBinding element) {
+               if (knownTypes == null)
+                       knownTypes = new HashtableOfType(25);
+               knownTypes.put(element.compoundName[element.compoundName.length - 1],
+                               element);
+       }
+
+       /*
+        * API Answer the receiver's binding type from Binding.BindingID.
+        */
+
+       public final int bindingType() {
+               return PACKAGE;
+       }
+
+       private PackageBinding findPackage(char[] name) {
+               if (!environment.isPackage(this.compoundName, name))
                        return null;
-               }
+
+               char[][] compoundName = CharOperation.arrayConcat(this.compoundName,
+                               name);
+               PackageBinding newPackageBinding = new PackageBinding(compoundName,
+                               this, environment);
+               addPackage(newPackageBinding);
+               return newPackageBinding;
        }
 
-       if (binding == LookupEnvironment.theNotFoundType)
-               return null;
-       if (binding instanceof UnresolvedReferenceBinding)
-               binding = ((UnresolvedReferenceBinding) binding).resolve(environment);
-       if (binding.isNestedType())
-               return new ProblemReferenceBinding(name, InternalNameProvided);
-       return binding;
-}
-/* Answer the type named name if it exists in the cache.
-* Answer theNotFoundType if it could not be resolved the first time
-* it was looked up, otherwise answer null.
-*
-* NOTE: Senders must convert theNotFoundType into a real problem
-* reference type if its to returned.
-*/
-
-ReferenceBinding getType0(char[] name) {
-       if (knownTypes == null)
+       /*
+        * Answer the subpackage named name; ask the oracle for the package if its
+        * not in the cache. Answer null if it could not be resolved.
+        * 
+        * NOTE: This should only be used when we know there is NOT a type with the
+        * same name.
+        */
+
+       PackageBinding getPackage(char[] name) {
+               PackageBinding binding = getPackage0(name);
+               if (binding != null) {
+                       if (binding == LookupEnvironment.TheNotFoundPackage)
+                               return null;
+                       else
+                               return binding;
+               }
+               if ((binding = findPackage(name)) != null)
+                       return binding;
+
+               // not found so remember a problem package binding in the cache for
+               // future lookups
+               addNotFoundPackage(name);
                return null;
-       return knownTypes.get(name);
-}
-/* Answer the package or type named name; ask the oracle if it is not in the cache.
-* Answer null if it could not be resolved.
-*
-* When collisions exist between a type name & a package name, answer the package.
-* Treat the type as if it does not exist... a problem was already reported when the type was defined.
-*
-* NOTE: no visibility checks are performed.
-* THIS SHOULD ONLY BE USED BY SOURCE TYPES/SCOPES.
-*/
-
-public Binding getTypeOrPackage(char[] name) {
-       PackageBinding packageBinding = getPackage0(name);
-       if (packageBinding != null && packageBinding != LookupEnvironment.theNotFoundPackage)
-               return packageBinding;
-
-       ReferenceBinding typeBinding = getType0(name);
-       if (typeBinding != null && typeBinding != LookupEnvironment.theNotFoundType) {
-               if (typeBinding instanceof UnresolvedReferenceBinding)
-                       typeBinding = ((UnresolvedReferenceBinding) typeBinding).resolve(environment);
-               if (typeBinding.isNestedType())
+       }
+
+       /*
+        * Answer the subpackage named name if it exists in the cache. Answer
+        * theNotFoundPackage if it could not be resolved the first time it was
+        * looked up, otherwise answer null.
+        * 
+        * NOTE: Senders must convert theNotFoundPackage into a real problem package
+        * if its to returned.
+        */
+
+       PackageBinding getPackage0(char[] name) {
+               return knownPackages.get(name);
+       }
+
+       /*
+        * Answer the type named name; ask the oracle for the type if its not in the
+        * cache. Answer a NotVisible problem type if the type is not visible from
+        * the invocationPackage. Answer null if it could not be resolved.
+        * 
+        * NOTE: This should only be used by source types/scopes which know there is
+        * NOT a package with the same name.
+        */
+
+       ReferenceBinding getType(char[] name) {
+               ReferenceBinding binding = getType0(name);
+               if (binding == null) {
+                       if ((binding = environment.askForType(this, name)) == null) {
+                               // not found so remember a problem type binding in the cache for
+                               // future lookups
+                               addNotFoundType(name);
+                               return null;
+                       }
+               }
+
+               if (binding == LookupEnvironment.TheNotFoundType)
+                       return null;
+               if (binding instanceof UnresolvedReferenceBinding)
+                       binding = ((UnresolvedReferenceBinding) binding)
+                                       .resolve(environment);
+               if (binding.isNestedType())
                        return new ProblemReferenceBinding(name, InternalNameProvided);
-               return typeBinding;
+               return binding;
        }
 
-       if (typeBinding == null && packageBinding == null) {
-               // find the package
-               if ((packageBinding = findPackage(name)) != null)
+       /*
+        * Answer the type named name if it exists in the cache. Answer
+        * theNotFoundType if it could not be resolved the first time it was looked
+        * up, otherwise answer null.
+        * 
+        * NOTE: Senders must convert theNotFoundType into a real problem reference
+        * type if its to returned.
+        */
+
+       ReferenceBinding getType0(char[] name) {
+               if (knownTypes == null)
+                       return null;
+               return knownTypes.get(name);
+       }
+
+       /*
+        * Answer the package or type named name; ask the oracle if it is not in the
+        * cache. Answer null if it could not be resolved.
+        * 
+        * When collisions exist between a type name & a package name, answer the
+        * package. Treat the type as if it does not exist... a problem was already
+        * reported when the type was defined.
+        * 
+        * NOTE: no visibility checks are performed. THIS SHOULD ONLY BE USED BY
+        * SOURCE TYPES/SCOPES.
+        */
+
+       public Binding getTypeOrPackage(char[] name) {
+               PackageBinding packageBinding = getPackage0(name);
+               if (packageBinding != null
+                               && packageBinding != LookupEnvironment.TheNotFoundPackage)
                        return packageBinding;
 
-               // if no package was found, find the type named name relative to the receiver
-               if ((typeBinding = environment.askForType(this, name)) != null) {
+               ReferenceBinding typeBinding = getType0(name);
+               if (typeBinding != null
+                               && typeBinding != LookupEnvironment.TheNotFoundType) {
+                       if (typeBinding instanceof UnresolvedReferenceBinding)
+                               typeBinding = ((UnresolvedReferenceBinding) typeBinding)
+                                               .resolve(environment);
                        if (typeBinding.isNestedType())
                                return new ProblemReferenceBinding(name, InternalNameProvided);
                        return typeBinding;
                }
 
-               // Since name could not be found, add problem bindings
-               // to the collections so it will be reported as an error next time.
-               addNotFoundPackage(name);
-               addNotFoundType(name);
-       } else {
-               if (packageBinding == LookupEnvironment.theNotFoundPackage)
-                       packageBinding = null;
-               if (typeBinding == LookupEnvironment.theNotFoundType)
-                       typeBinding = null;
-       }
-
-       if (packageBinding != null)
-               return packageBinding;
-       else
-               return typeBinding;
-}
-public char[] readableName() /*java.lang*/ {
-       return CharOperation.concatWith(compoundName, '.');
-}
-public String toString() {
-       if (compoundName == NoCharChar)
-               return "The Default Package"; //$NON-NLS-1$
-       else
-               return "package " + ((compoundName != null) ? CharOperation.toString(compoundName) : "UNNAMED"); //$NON-NLS-1$ //$NON-NLS-2$
-}
+               // always look for the name as a sub-package if its not a known type
+               if (packageBinding == null
+                               && (packageBinding = findPackage(name)) != null)
+                       return packageBinding;
+               if (typeBinding == null) {
+                       // if no package was found, find the type named name relative to the
+                       // receiver
+                       if ((typeBinding = environment.askForType(this, name)) != null) {
+                               if (typeBinding.isNestedType())
+                                       return new ProblemReferenceBinding(name,
+                                                       InternalNameProvided);
+                               return typeBinding;
+                       }
+
+                       // Since name could not be found, add problem bindings
+                       // to the collections so it will be reported as an error next time.
+                       addNotFoundPackage(name);
+                       addNotFoundType(name);
+               } else {
+                       if (packageBinding == LookupEnvironment.TheNotFoundPackage)
+                               packageBinding = null;
+                       if (typeBinding == LookupEnvironment.TheNotFoundType)
+                               typeBinding = null;
+               }
+
+               if (packageBinding != null)
+                       return packageBinding;
+               else
+                       return typeBinding;
+       }
+
+       public char[] readableName() /* java.lang */{
+               return CharOperation.concatWith(compoundName, '.');
+       }
+
+       public String toString() {
+               if (compoundName == CharOperation.NO_CHAR_CHAR)
+                       return "The Default Package"; //$NON-NLS-1$
+               else
+                       return "package " + ((compoundName != null) ? CharOperation.toString(compoundName) : "UNNAMED"); //$NON-NLS-1$ //$NON-NLS-2$
+       }
 }