A massive organize imports and formatting of the sources using default Eclipse code...
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpdt / internal / core / builder / NameEnvironment.java
index ffdbaf0..c8f6dd3 100644 (file)
@@ -35,299 +35,365 @@ import org.eclipse.core.runtime.Path;
 
 public class NameEnvironment implements INameEnvironment {
 
-  boolean isIncrementalBuild;
-  ClasspathMultiDirectory[] sourceLocations;
-  //ClasspathLocation[] binaryLocations;
-
-  String[] initialTypeNames; // assumed that each name is of the form "a/b/ClassName"
-  SourceFile[] additionalUnits;
-
-  NameEnvironment(IWorkspaceRoot root, JavaProject javaProject, SimpleLookupTable binaryLocationsPerProject) throws CoreException {
-    this.isIncrementalBuild = false;
-//    this.sourceLocations = new ClasspathMultiDirectory[0];
-    computeClasspathLocations(root, javaProject, binaryLocationsPerProject);
-    setNames(null, null);
-  }
-
-  public NameEnvironment(IJavaProject javaProject) {
-    this.isIncrementalBuild = false;
-       try {
-               computeClasspathLocations(javaProject.getProject().getWorkspace().getRoot(), (JavaProject) javaProject, null);
-       } catch(CoreException e) {
-//    this.sourceLocations = new ClasspathMultiDirectory[0];
-    //         this.binaryLocations = new ClasspathLocation[0];
-       }
-    setNames(null, null);
-  }
-
-  /* Some examples of resolved class path entries.
-  * Remember to search class path in the order that it was defined.
-  *
-  * 1a. typical project with no source folders:
-  *   /Test[CPE_SOURCE][K_SOURCE] -> D:/eclipse.test/Test
-  * 1b. project with source folders:
-  *   /Test/src1[CPE_SOURCE][K_SOURCE] -> D:/eclipse.test/Test/src1
-  *   /Test/src2[CPE_SOURCE][K_SOURCE] -> D:/eclipse.test/Test/src2
-  *  NOTE: These can be in any order & separated by prereq projects or libraries
-  * 1c. project external to workspace (only detectable using getLocation()):
-  *   /Test/src[CPE_SOURCE][K_SOURCE] -> d:/eclipse.zzz/src
-  *  Need to search source folder & output folder
-  *
-  * 2. zip files:
-  *   D:/j9/lib/jclMax/classes.zip[CPE_LIBRARY][K_BINARY][sourcePath:d:/j9/lib/jclMax/source/source.zip]
-  *      -> D:/j9/lib/jclMax/classes.zip
-  *  ALWAYS want to take the library path as is
-  *
-  * 3a. prereq project (regardless of whether it has a source or output folder):
-  *   /Test[CPE_PROJECT][K_SOURCE] -> D:/eclipse.test/Test
-  *  ALWAYS want to append the output folder & ONLY search for .class files
-  */
-  private void computeClasspathLocations(
-       IWorkspaceRoot root,
-       JavaProject javaProject,
-       SimpleLookupTable binaryLocationsPerProject) throws CoreException {
-  
-    /* Update cycle marker */
-       IMarker cycleMarker = javaProject.getCycleMarker();
-       if (cycleMarker != null) {
-               int severity = JavaCore.ERROR.equals(javaProject.getOption(JavaCore.CORE_CIRCULAR_CLASSPATH, true))
-                       ? IMarker.SEVERITY_ERROR
-                       : IMarker.SEVERITY_WARNING;
-               if (severity != ((Integer) cycleMarker.getAttribute(IMarker.SEVERITY)).intValue())
-                       cycleMarker.setAttribute(IMarker.SEVERITY, severity);
+       boolean isIncrementalBuild;
+
+       ClasspathMultiDirectory[] sourceLocations;
+
+       // ClasspathLocation[] binaryLocations;
+
+       String[] initialTypeNames; // assumed that each name is of the form
+                                                               // "a/b/ClassName"
+
+       SourceFile[] additionalUnits;
+
+       NameEnvironment(IWorkspaceRoot root, JavaProject javaProject,
+                       SimpleLookupTable binaryLocationsPerProject) throws CoreException {
+               this.isIncrementalBuild = false;
+               // this.sourceLocations = new ClasspathMultiDirectory[0];
+               computeClasspathLocations(root, javaProject, binaryLocationsPerProject);
+               setNames(null, null);
+       }
+
+       public NameEnvironment(IJavaProject javaProject) {
+               this.isIncrementalBuild = false;
+               try {
+                       computeClasspathLocations(javaProject.getProject().getWorkspace()
+                                       .getRoot(), (JavaProject) javaProject, null);
+               } catch (CoreException e) {
+                       // this.sourceLocations = new ClasspathMultiDirectory[0];
+                       // this.binaryLocations = new ClasspathLocation[0];
+               }
+               setNames(null, null);
+       }
+
+       /*
+        * Some examples of resolved class path entries. Remember to search class
+        * path in the order that it was defined.
+        * 
+        * 1a. typical project with no source folders: /Test[CPE_SOURCE][K_SOURCE] ->
+        * D:/eclipse.test/Test 1b. project with source folders:
+        * /Test/src1[CPE_SOURCE][K_SOURCE] -> D:/eclipse.test/Test/src1
+        * /Test/src2[CPE_SOURCE][K_SOURCE] -> D:/eclipse.test/Test/src2 NOTE: These
+        * can be in any order & separated by prereq projects or libraries 1c.
+        * project external to workspace (only detectable using getLocation()):
+        * /Test/src[CPE_SOURCE][K_SOURCE] -> d:/eclipse.zzz/src Need to search
+        * source folder & output folder
+        * 
+        * 2. zip files:
+        * D:/j9/lib/jclMax/classes.zip[CPE_LIBRARY][K_BINARY][sourcePath:d:/j9/lib/jclMax/source/source.zip] ->
+        * D:/j9/lib/jclMax/classes.zip ALWAYS want to take the library path as is
+        * 
+        * 3a. prereq project (regardless of whether it has a source or output
+        * folder): /Test[CPE_PROJECT][K_SOURCE] -> D:/eclipse.test/Test ALWAYS want
+        * to append the output folder & ONLY search for .class files
+        */
+       private void computeClasspathLocations(IWorkspaceRoot root,
+                       JavaProject javaProject, SimpleLookupTable binaryLocationsPerProject)
+                       throws CoreException {
+
+               /* Update cycle marker */
+               IMarker cycleMarker = javaProject.getCycleMarker();
+               if (cycleMarker != null) {
+                       int severity = JavaCore.ERROR.equals(javaProject.getOption(
+                                       JavaCore.CORE_CIRCULAR_CLASSPATH, true)) ? IMarker.SEVERITY_ERROR
+                                       : IMarker.SEVERITY_WARNING;
+                       if (severity != ((Integer) cycleMarker
+                                       .getAttribute(IMarker.SEVERITY)).intValue())
+                               cycleMarker.setAttribute(IMarker.SEVERITY, severity);
+               }
+
+               /* Update incomplete classpath marker */
+               // IClasspathEntry[] classpathEntries =
+               // javaProject.getExpandedClasspath(true, true);
+               IClasspathEntry[] classpathEntries = javaProject
+                               .getExpandedClasspath(true/* ignore unresolved variable */,
+                                               false/* don't create markers */, null/* preferred cp */,
+                                               null/* preferred output */);
+
+               ArrayList sLocations = new ArrayList(classpathEntries.length);
+               ArrayList bLocations = new ArrayList(classpathEntries.length);
+               nextEntry: for (int i = 0, l = classpathEntries.length; i < l; i++) {
+                       ClasspathEntry entry = (ClasspathEntry) classpathEntries[i];
+                       IPath path = entry.getPath();
+                       Object target = JavaModel.getTarget(root, path, true);
+                       if (target == null)
+                               continue nextEntry;
+
+                       switch (entry.getEntryKind()) {
+                       case IClasspathEntry.CPE_SOURCE:
+                               if (!(target instanceof IContainer))
+                                       continue nextEntry;
+                               // IPath outputPath = entry.getOutputLocation() != null
+                               // ? entry.getOutputLocation()
+                               // : javaProject.getOutputLocation();
+                               IContainer outputFolder = null;
+                               // if (outputPath.segmentCount() == 1) {
+                               // outputFolder = javaProject.getProject();
+                               // } else {
+                               // outputFolder = root.getFolder(outputPath);
+                               // if (!outputFolder.exists())
+                               // createFolder(outputFolder);
+                               // }
+                               sLocations.add(ClasspathLocation.forSourceFolder(
+                                               (IContainer) target, outputFolder, entry
+                                                               .fullExclusionPatternChars()));
+                               continue nextEntry;
+
+                       case IClasspathEntry.CPE_PROJECT:
+                               if (!(target instanceof IProject))
+                                       continue nextEntry;
+                               IProject prereqProject = (IProject) target;
+                               if (!JavaProject.hasJavaNature(prereqProject))
+                                       continue nextEntry; // if project doesn't have java nature
+                                                                               // or is not accessible
+
+                               JavaProject prereqJavaProject = (JavaProject) JavaCore
+                                               .create(prereqProject);
+                               IClasspathEntry[] prereqClasspathEntries = prereqJavaProject
+                                               .getRawClasspath();
+                               ArrayList seen = new ArrayList();
+                               nextPrereqEntry: for (int j = 0, m = prereqClasspathEntries.length; j < m; j++) {
+                                       IClasspathEntry prereqEntry = (IClasspathEntry) prereqClasspathEntries[j];
+                                       if (prereqEntry.getEntryKind() == IClasspathEntry.CPE_SOURCE) {
+                                               Object prereqTarget = JavaModel.getTarget(root,
+                                                               prereqEntry.getPath(), true);
+                                               if (!(prereqTarget instanceof IContainer))
+                                                       continue nextPrereqEntry;
+                                               IPath prereqOutputPath = prereqEntry
+                                                               .getOutputLocation() != null ? prereqEntry
+                                                               .getOutputLocation() : prereqJavaProject
+                                                               .getOutputLocation();
+                                               IContainer binaryFolder = prereqOutputPath
+                                                               .segmentCount() == 1 ? (IContainer) prereqProject
+                                                               : (IContainer) root.getFolder(prereqOutputPath);
+                                               if (binaryFolder.exists()
+                                                               && !seen.contains(binaryFolder)) {
+                                                       seen.add(binaryFolder);
+                                                       ClasspathLocation bLocation = ClasspathLocation
+                                                                       .forBinaryFolder(binaryFolder, true);
+                                                       bLocations.add(bLocation);
+                                                       if (binaryLocationsPerProject != null) { // normal
+                                                                                                                                               // builder
+                                                                                                                                               // mode
+                                                               ClasspathLocation[] existingLocations = (ClasspathLocation[]) binaryLocationsPerProject
+                                                                               .get(prereqProject);
+                                                               if (existingLocations == null) {
+                                                                       existingLocations = new ClasspathLocation[] { bLocation };
+                                                               } else {
+                                                                       int size = existingLocations.length;
+                                                                       System
+                                                                                       .arraycopy(
+                                                                                                       existingLocations,
+                                                                                                       0,
+                                                                                                       existingLocations = new ClasspathLocation[size + 1],
+                                                                                                       0, size);
+                                                                       existingLocations[size] = bLocation;
+                                                               }
+                                                               binaryLocationsPerProject.put(prereqProject,
+                                                                               existingLocations);
+                                                       }
+                                               }
+                                       }
+                               }
+                               continue nextEntry;
+
+                               // case IClasspathEntry.CPE_LIBRARY :
+                               // if (target instanceof IResource) {
+                               // IResource resource = (IResource) target;
+                               // ClasspathLocation bLocation = null;
+                               // if (resource instanceof IFile) {
+                               // if (!(ProjectPrefUtil.isArchiveFileName(path.lastSegment())))
+                               // continue nextEntry;
+                               // bLocation = ClasspathLocation.forLibrary((IFile) resource);
+                               // } else if (resource instanceof IContainer) {
+                               // bLocation = ClasspathLocation.forBinaryFolder((IContainer)
+                               // target, false); // is library folder not output folder
+                               // }
+                               // bLocations.add(bLocation);
+                               // if (binaryLocationsPerProject != null) { // normal builder
+                               // mode
+                               // IProject p = resource.getProject(); // can be the project
+                               // being built
+                               // ClasspathLocation[] existingLocations = (ClasspathLocation[])
+                               // binaryLocationsPerProject.get(p);
+                               // if (existingLocations == null) {
+                               // existingLocations = new ClasspathLocation[] {bLocation};
+                               // } else {
+                               // int size = existingLocations.length;
+                               // System.arraycopy(existingLocations, 0, existingLocations =
+                               // new ClasspathLocation[size + 1], 0, size);
+                               // existingLocations[size] = bLocation;
+                               // }
+                               // binaryLocationsPerProject.put(p, existingLocations);
+                               // }
+                               // } else if (target instanceof File) {
+                               // if (!(ProjectPrefUtil.isArchiveFileName(path.lastSegment())))
+                               // continue nextEntry;
+                               // bLocations.add(ClasspathLocation.forLibrary(path.toString()));
+                               // }
+                               // continue nextEntry;
+                       }
+               }
+
+               // now split the classpath locations... place the output folders ahead
+               // of the other .class file folders & jars
+               ArrayList outputFolders = new ArrayList(1);
+               this.sourceLocations = new ClasspathMultiDirectory[sLocations.size()];
+               if (!sLocations.isEmpty()) {
+                       sLocations.toArray(this.sourceLocations);
+
+                       // collect the output folders, skipping duplicates
+                       next: for (int i = 0, l = sourceLocations.length; i < l; i++) {
+                               ClasspathMultiDirectory md = sourceLocations[i];
+                               // IPath outputPath = md.binaryFolder.getFullPath();
+                               // for (int j = 0; j < i; j++) { // compare against previously
+                               // walked source folders
+                               // if
+                               // (outputPath.equals(sourceLocations[j].binaryFolder.getFullPath()))
+                               // {
+                               // md.hasIndependentOutputFolder =
+                               // sourceLocations[j].hasIndependentOutputFolder;
+                               // continue next;
+                               // }
+                               // }
+                               outputFolders.add(md);
+
+                               // also tag each source folder whose output folder is an
+                               // independent folder & is not also a source folder
+                               // for (int j = 0, m = sourceLocations.length; j < m; j++)
+                               // if
+                               // (outputPath.equals(sourceLocations[j].sourceFolder.getFullPath()))
+                               // continue next;
+                               md.hasIndependentOutputFolder = true;
+                       }
+               }
+
+               // combine the output folders with the binary folders & jars... place
+               // the output folders before other .class file folders & jars
+               // this.binaryLocations = new ClasspathLocation[outputFolders.size() +
+               // bLocations.size()];
+               // int index = 0;
+               // for (int i = 0, l = outputFolders.size(); i < l; i++)
+               // this.binaryLocations[index++] = (ClasspathLocation)
+               // outputFolders.get(i);
+               // for (int i = 0, l = bLocations.size(); i < l; i++)
+               // this.binaryLocations[index++] = (ClasspathLocation)
+               // bLocations.get(i);
+       }
+
+       public void cleanup() {
+               this.initialTypeNames = null;
+               this.additionalUnits = null;
+               for (int i = 0, l = sourceLocations.length; i < l; i++)
+                       sourceLocations[i].cleanup();
+               // for (int i = 0, l = binaryLocations.length; i < l; i++)
+               // binaryLocations[i].cleanup();
+       }
+
+       private void createFolder(IContainer folder) throws CoreException {
+               if (!folder.exists()) {
+                       createFolder(folder.getParent());
+                       ((IFolder) folder).create(true, true, null);
+               }
+       }
+
+       private NameEnvironmentAnswer findClass(String qualifiedTypeName,
+                       char[] typeName) {
+               if (initialTypeNames != null) {
+                       for (int i = 0, l = initialTypeNames.length; i < l; i++) {
+                               if (qualifiedTypeName.equals(initialTypeNames[i])) {
+                                       if (isIncrementalBuild)
+                                               // catch the case that a type inside a source file has
+                                               // been renamed but other class files are looking for it
+                                               throw new AbortCompilation(true,
+                                                               new AbortIncrementalBuildException(
+                                                                               qualifiedTypeName));
+                                       return null; // looking for a file which we know was
+                                                                       // provided at the beginning of the
+                                                                       // compilation
+                               }
+                       }
+               }
+
+               if (additionalUnits != null && sourceLocations.length > 0) {
+                       // if an additional source file is waiting to be compiled, answer it
+                       // BUT not if this is a secondary type search
+                       // if we answer X.java & it no longer defines Y then the binary type
+                       // looking for Y will think the class path is wrong
+                       // let the recompile loop fix up dependents when the secondary type
+                       // Y has been deleted from X.java
+                       IPath qSourceFilePath = new Path(qualifiedTypeName + ".java"); //$NON-NLS-1$
+                       int qSegmentCount = qSourceFilePath.segmentCount();
+                       next: for (int i = 0, l = additionalUnits.length; i < l; i++) {
+                               SourceFile additionalUnit = additionalUnits[i];
+                               IPath fullPath = additionalUnit.resource.getFullPath();
+                               int prefixCount = additionalUnit.sourceLocation.sourceFolder
+                                               .getFullPath().segmentCount();
+                               if (qSegmentCount == fullPath.segmentCount() - prefixCount) {
+                                       for (int j = 0; j < qSegmentCount; j++)
+                                               if (!qSourceFilePath.segment(j).equals(
+                                                               fullPath.segment(j + prefixCount)))
+                                                       continue next;
+                                       return new NameEnvironmentAnswer(additionalUnit);
+                               }
+                       }
+               }
+
+               // String qBinaryFileName = qualifiedTypeName + ".class"; //$NON-NLS-1$
+               // String binaryFileName = qBinaryFileName;
+               // String qPackageName = ""; //$NON-NLS-1$
+               // if (qualifiedTypeName.length() > typeName.length) {
+               // int typeNameStart = qBinaryFileName.length() - typeName.length - 6;
+               // // size of ".class"
+               // qPackageName = qBinaryFileName.substring(0, typeNameStart - 1);
+               // binaryFileName = qBinaryFileName.substring(typeNameStart);
+               // }
+               //
+               // // NOTE: the output folders are added at the beginning of the
+               // binaryLocations
+               // for (int i = 0, l = binaryLocations.length; i < l; i++) {
+               // NameEnvironmentAnswer answer =
+               // binaryLocations[i].findClass(binaryFileName, qPackageName,
+               // qBinaryFileName);
+               // if (answer != null) return answer;
+               // }
+               return null;
+       }
+
+       public NameEnvironmentAnswer findType(char[][] compoundName) {
+               if (compoundName != null)
+                       return findClass(new String(CharOperation.concatWith(compoundName,
+                                       '/')), compoundName[compoundName.length - 1]);
+               return null;
+       }
+
+       public NameEnvironmentAnswer findType(char[] typeName, char[][] packageName) {
+               if (typeName != null)
+                       return findClass(new String(CharOperation.concatWith(packageName,
+                                       typeName, '/')), typeName);
+               return null;
+       }
+
+       public boolean isPackage(char[][] compoundName, char[] packageName) {
+               return isPackage(new String(CharOperation.concatWith(compoundName,
+                               packageName, '/')));
+       }
+
+       public boolean isPackage(String qualifiedPackageName) {
+               // NOTE: the output folders are added at the beginning of the
+               // binaryLocations
+               // for (int i = 0, l = binaryLocations.length; i < l; i++)
+               // if (binaryLocations[i].isPackage(qualifiedPackageName))
+               // return true;
+               return false;
+       }
+
+       void setNames(String[] initialTypeNames, SourceFile[] additionalUnits) {
+               this.initialTypeNames = initialTypeNames;
+               this.additionalUnits = additionalUnits;
+               for (int i = 0, l = sourceLocations.length; i < l; i++)
+                       sourceLocations[i].reset();
+               // for (int i = 0, l = binaryLocations.length; i < l; i++)
+               // binaryLocations[i].reset();
        }
-       
-       /* Update incomplete classpath marker */
-//     IClasspathEntry[] classpathEntries = javaProject.getExpandedClasspath(true, true);
-       IClasspathEntry[] classpathEntries = javaProject.getExpandedClasspath(true/*ignore unresolved variable*/, false/*don't create markers*/, null/*preferred cp*/, null/*preferred output*/);
-       
-       ArrayList sLocations = new ArrayList(classpathEntries.length);
-       ArrayList bLocations = new ArrayList(classpathEntries.length);
-       nextEntry : for (int i = 0, l = classpathEntries.length; i < l; i++) {
-               ClasspathEntry entry = (ClasspathEntry) classpathEntries[i];
-               IPath path = entry.getPath();
-               Object target = JavaModel.getTarget(root, path, true);
-               if (target == null) continue nextEntry;
-  
-               switch(entry.getEntryKind()) {
-                       case IClasspathEntry.CPE_SOURCE :
-                               if (!(target instanceof IContainer)) continue nextEntry;
-//                             IPath outputPath = entry.getOutputLocation() != null 
-//                                     ? entry.getOutputLocation() 
-//                                     : javaProject.getOutputLocation();
-                               IContainer outputFolder = null;
-//                             if (outputPath.segmentCount() == 1) {
-//                                     outputFolder = javaProject.getProject();
-//                             } else {
-//                                     outputFolder = root.getFolder(outputPath);
-//                                     if (!outputFolder.exists())
-//                                             createFolder(outputFolder);
-//                             }
-                               sLocations.add(
-                                       ClasspathLocation.forSourceFolder((IContainer) target, outputFolder, entry.fullExclusionPatternChars()));
-                               continue nextEntry;
-  
-                       case IClasspathEntry.CPE_PROJECT :
-                               if (!(target instanceof IProject)) continue nextEntry;
-                               IProject prereqProject = (IProject) target;
-                               if (!JavaProject.hasJavaNature(prereqProject)) continue nextEntry; // if project doesn't have java nature or is not accessible
-  
-                               JavaProject prereqJavaProject = (JavaProject) JavaCore.create(prereqProject);
-                               IClasspathEntry[] prereqClasspathEntries = prereqJavaProject.getRawClasspath();
-                               ArrayList seen = new ArrayList();
-                               nextPrereqEntry: for (int j = 0, m = prereqClasspathEntries.length; j < m; j++) {
-                                       IClasspathEntry prereqEntry = (IClasspathEntry) prereqClasspathEntries[j];
-                                       if (prereqEntry.getEntryKind() == IClasspathEntry.CPE_SOURCE) {
-                                               Object prereqTarget = JavaModel.getTarget(root, prereqEntry.getPath(), true);
-                                               if (!(prereqTarget instanceof IContainer)) continue nextPrereqEntry;
-                                               IPath prereqOutputPath = prereqEntry.getOutputLocation() != null 
-                                                       ? prereqEntry.getOutputLocation() 
-                                                       : prereqJavaProject.getOutputLocation();
-                                               IContainer binaryFolder = prereqOutputPath.segmentCount() == 1
-                                                       ? (IContainer) prereqProject
-                                                       : (IContainer) root.getFolder(prereqOutputPath);
-                                               if (binaryFolder.exists() && !seen.contains(binaryFolder)) {
-                                                       seen.add(binaryFolder);
-                                                       ClasspathLocation bLocation = ClasspathLocation.forBinaryFolder(binaryFolder, true);
-                                                       bLocations.add(bLocation);
-                                                       if (binaryLocationsPerProject != null) { // normal builder mode
-                                                               ClasspathLocation[] existingLocations = (ClasspathLocation[]) binaryLocationsPerProject.get(prereqProject);
-                                                               if (existingLocations == null) {
-                                                                       existingLocations = new ClasspathLocation[] {bLocation};
-                                                               } else {
-                                                                       int size = existingLocations.length;
-                                                                       System.arraycopy(existingLocations, 0, existingLocations = new ClasspathLocation[size + 1], 0, size);
-                                                                       existingLocations[size] = bLocation;
-                                                               }
-                                                               binaryLocationsPerProject.put(prereqProject, existingLocations);
-                                                       }
-                                               }
-                                       }
-                               }
-                               continue nextEntry;
-  
-//                     case IClasspathEntry.CPE_LIBRARY :
-//                             if (target instanceof IResource) {
-//                                     IResource resource = (IResource) target;
-//                                     ClasspathLocation bLocation = null;
-//                                     if (resource instanceof IFile) {
-//                                             if (!(ProjectPrefUtil.isArchiveFileName(path.lastSegment())))
-//                                                     continue nextEntry;
-//                                             bLocation = ClasspathLocation.forLibrary((IFile) resource);
-//                                     } else if (resource instanceof IContainer) {
-//                                             bLocation = ClasspathLocation.forBinaryFolder((IContainer) target, false); // is library folder not output folder
-//                                     }
-//                                     bLocations.add(bLocation);
-//                                     if (binaryLocationsPerProject != null) { // normal builder mode
-//                                             IProject p = resource.getProject(); // can be the project being built
-//                                             ClasspathLocation[] existingLocations = (ClasspathLocation[]) binaryLocationsPerProject.get(p);
-//                                             if (existingLocations == null) {
-//                                                     existingLocations = new ClasspathLocation[] {bLocation};
-//                                             } else {
-//                                                     int size = existingLocations.length;
-//                                                     System.arraycopy(existingLocations, 0, existingLocations = new ClasspathLocation[size + 1], 0, size);
-//                                                     existingLocations[size] = bLocation;
-//                                             }
-//                                             binaryLocationsPerProject.put(p, existingLocations);
-//                                     }
-//                             } else if (target instanceof File) {
-//                                     if (!(ProjectPrefUtil.isArchiveFileName(path.lastSegment())))
-//                                             continue nextEntry;
-//                                     bLocations.add(ClasspathLocation.forLibrary(path.toString()));
-//                             }
-//                             continue nextEntry;
-               }
-       }
-  
-       // now split the classpath locations... place the output folders ahead of the other .class file folders & jars
-       ArrayList outputFolders = new ArrayList(1);
-       this.sourceLocations = new ClasspathMultiDirectory[sLocations.size()];
-       if (!sLocations.isEmpty()) {
-               sLocations.toArray(this.sourceLocations);
-  
-               // collect the output folders, skipping duplicates
-               next : for (int i = 0, l = sourceLocations.length; i < l; i++) {
-                       ClasspathMultiDirectory md = sourceLocations[i];
-//                     IPath outputPath = md.binaryFolder.getFullPath();
-//                     for (int j = 0; j < i; j++) { // compare against previously walked source folders
-//                             if (outputPath.equals(sourceLocations[j].binaryFolder.getFullPath())) {
-//                                     md.hasIndependentOutputFolder = sourceLocations[j].hasIndependentOutputFolder;
-//                                     continue next;
-//                             }
-//                     }
-                       outputFolders.add(md);
-  
-                       // also tag each source folder whose output folder is an independent folder & is not also a source folder
-//                     for (int j = 0, m = sourceLocations.length; j < m; j++)
-//                             if (outputPath.equals(sourceLocations[j].sourceFolder.getFullPath()))
-//                                     continue next;
-                       md.hasIndependentOutputFolder = true;
-               }
-       }
-
-//   combine the output folders with the binary folders & jars... place the output folders before other .class file folders & jars
-//     this.binaryLocations = new ClasspathLocation[outputFolders.size() + bLocations.size()];
-//     int index = 0;
-//     for (int i = 0, l = outputFolders.size(); i < l; i++)
-//             this.binaryLocations[index++] = (ClasspathLocation) outputFolders.get(i);
-//     for (int i = 0, l = bLocations.size(); i < l; i++)
-//             this.binaryLocations[index++] = (ClasspathLocation) bLocations.get(i);
-  }
-
-  public void cleanup() {
-    this.initialTypeNames = null;
-    this.additionalUnits = null;
-    for (int i = 0, l = sourceLocations.length; i < l; i++)
-      sourceLocations[i].cleanup();
-    // for (int i = 0, l = binaryLocations.length; i < l; i++)
-    //         binaryLocations[i].cleanup();
-  }
-
-  private void createFolder(IContainer folder) throws CoreException {
-    if (!folder.exists()) {
-      createFolder(folder.getParent());
-      ((IFolder) folder).create(true, true, null);
-    }
-  }
-
-  private NameEnvironmentAnswer findClass(String qualifiedTypeName, char[] typeName) {
-    if (initialTypeNames != null) {
-      for (int i = 0, l = initialTypeNames.length; i < l; i++) {
-        if (qualifiedTypeName.equals(initialTypeNames[i])) {
-          if (isIncrementalBuild)
-            // catch the case that a type inside a source file has been renamed but other class files are looking for it
-            throw new AbortCompilation(true, new AbortIncrementalBuildException(qualifiedTypeName));
-          return null; // looking for a file which we know was provided at the beginning of the compilation
-        }
-      }
-    }
-
-    if (additionalUnits != null && sourceLocations.length > 0) {
-      // if an additional source file is waiting to be compiled, answer it BUT not if this is a secondary type search
-      // if we answer X.java & it no longer defines Y then the binary type looking for Y will think the class path is wrong
-      // let the recompile loop fix up dependents when the secondary type Y has been deleted from X.java
-      IPath qSourceFilePath = new Path(qualifiedTypeName + ".java"); //$NON-NLS-1$
-      int qSegmentCount = qSourceFilePath.segmentCount();
-      next : for (int i = 0, l = additionalUnits.length; i < l; i++) {
-        SourceFile additionalUnit = additionalUnits[i];
-        IPath fullPath = additionalUnit.resource.getFullPath();
-        int prefixCount = additionalUnit.sourceLocation.sourceFolder.getFullPath().segmentCount();
-        if (qSegmentCount == fullPath.segmentCount() - prefixCount) {
-          for (int j = 0; j < qSegmentCount; j++)
-            if (!qSourceFilePath.segment(j).equals(fullPath.segment(j + prefixCount)))
-              continue next;
-          return new NameEnvironmentAnswer(additionalUnit);
-        }
-      }
-    }
-
-    // String qBinaryFileName = qualifiedTypeName + ".class"; //$NON-NLS-1$
-    // String binaryFileName = qBinaryFileName;
-    // String qPackageName =  ""; //$NON-NLS-1$
-    // if (qualifiedTypeName.length() > typeName.length) {
-    //         int typeNameStart = qBinaryFileName.length() - typeName.length - 6; // size of ".class"
-    //         qPackageName =  qBinaryFileName.substring(0, typeNameStart - 1);
-    //         binaryFileName = qBinaryFileName.substring(typeNameStart);
-    // }
-    //
-    // // NOTE: the output folders are added at the beginning of the binaryLocations
-    // for (int i = 0, l = binaryLocations.length; i < l; i++) {
-    //         NameEnvironmentAnswer answer = binaryLocations[i].findClass(binaryFileName, qPackageName, qBinaryFileName);
-    //         if (answer != null) return answer;
-    // }
-    return null;
-  }
-
-  public NameEnvironmentAnswer findType(char[][] compoundName) {
-    if (compoundName != null)
-      return findClass(new String(CharOperation.concatWith(compoundName, '/')), compoundName[compoundName.length - 1]);
-    return null;
-  }
-
-  public NameEnvironmentAnswer findType(char[] typeName, char[][] packageName) {
-    if (typeName != null)
-      return findClass(new String(CharOperation.concatWith(packageName, typeName, '/')), typeName);
-    return null;
-  }
-
-  public boolean isPackage(char[][] compoundName, char[] packageName) {
-    return isPackage(new String(CharOperation.concatWith(compoundName, packageName, '/')));
-  }
-
-  public boolean isPackage(String qualifiedPackageName) {
-    // NOTE: the output folders are added at the beginning of the binaryLocations
-    // for (int i = 0, l = binaryLocations.length; i < l; i++)
-    //         if (binaryLocations[i].isPackage(qualifiedPackageName))
-    //                 return true;
-    return false;
-  }
-
-  void setNames(String[] initialTypeNames, SourceFile[] additionalUnits) {
-    this.initialTypeNames = initialTypeNames;
-    this.additionalUnits = additionalUnits;
-    for (int i = 0, l = sourceLocations.length; i < l; i++)
-      sourceLocations[i].reset();
-    // for (int i = 0, l = binaryLocations.length; i < l; i++)
-    //         binaryLocations[i].reset();
-  }
 }