diff options
Diffstat (limited to 'org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/DeltaProcessor.java')
-rw-r--r-- | org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/DeltaProcessor.java | 66 |
1 files changed, 55 insertions, 11 deletions
diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/DeltaProcessor.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/DeltaProcessor.java index 18f5b752a..0e2c59896 100644 --- a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/DeltaProcessor.java +++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/DeltaProcessor.java @@ -502,8 +502,24 @@ public class DeltaProcessor { break; case IResource.FOLDER: - if (delta.getKind() == IResourceDelta.CHANGED) { // look for .jar file change to update classpath - children = delta.getAffectedChildren(); + switch (delta.getKind()) { + case IResourceDelta.ADDED: + case IResourceDelta.REMOVED: + // Close the containing package fragment root to reset its cached children. + // See http://bugs.eclipse.org/500714 + IPackageFragmentRoot root = findContainingPackageFragmentRoot(resource); + if (root != null && root.isOpen()) { + try { + root.close(); + } catch (JavaModelException e) { + Util.log(e); + } + } + break; + + case IResourceDelta.CHANGED: // look for .jar file change to update classpath + children = delta.getAffectedChildren(); + break; } break; case IResource.FILE : @@ -548,6 +564,27 @@ public class DeltaProcessor { } } + private IPackageFragmentRoot findContainingPackageFragmentRoot(IResource resource) { + IProject project = resource.getProject(); + if (JavaProject.hasJavaNature(project)) { + IJavaProject javaProject = JavaCore.create(project); + try { + IPath path = resource.getProjectRelativePath(); + IPackageFragmentRoot[] roots = javaProject.getPackageFragmentRoots(); + for (IPackageFragmentRoot root : roots) { + IResource rootResource = root.getUnderlyingResource(); + if (rootResource != null && !resource.equals(rootResource) && + rootResource.getProjectRelativePath().isPrefixOf(path)) { + return root; + } + } + } catch (JavaModelException e) { + Util.log(e); + } + } + return null; + } + private void checkExternalFolderChange(IProject project, JavaProject javaProject) { ClasspathChange change = this.state.getClasspathChange(project); this.state.addExternalFolderChange(javaProject, change == null ? null : change.oldResolvedClasspath); @@ -1020,6 +1057,9 @@ public class DeltaProcessor { if (VERBOSE){ System.out.println("- External JAR CHANGED, affecting root: "+root.getElementName()); //$NON-NLS-1$ } + // TODO(sxenos): this is causing each change event for an external jar file to be fired twice. + // We need to preserve the clearing of cached information in the jar but defer the actual firing of + // the event until after the indexer has processed the jar. contentChanged(root); deltaContainsModifiedJar = true; hasDelta = true; @@ -1908,7 +1948,7 @@ public class DeltaProcessor { * caches and their dependents */ public void resetProjectCaches() { - if (this.projectCachesToReset.size() == 0) + if (this.projectCachesToReset.isEmpty()) return; JavaModelManager.getJavaModelManager().resetJarTypeCache(); @@ -2064,14 +2104,7 @@ public class DeltaProcessor { this.sourceElementParserCache = null; // don't hold onto parser longer than necessary startDeltas(); } - IElementChangedListener[] listeners; - int listenerCount; - synchronized (this.state) { - listeners = this.state.elementChangedListeners; - listenerCount = this.state.elementChangedListenerCount; - } - notifyTypeHierarchies(listeners, listenerCount); - fire(null, ElementChangedEvent.POST_CHANGE); + notifyAndFire(null); } finally { // workaround for bug 15168 circular errors not reported this.state.resetOldJavaProjectNames(); @@ -2180,6 +2213,17 @@ public class DeltaProcessor { } } + public void notifyAndFire(IJavaElementDelta delta) { + IElementChangedListener[] listeners; + int listenerCount; + synchronized (this.state) { + listeners = this.state.elementChangedListeners; + listenerCount = this.state.elementChangedListenerCount; + } + notifyTypeHierarchies(listeners, listenerCount); + fire(delta, ElementChangedEvent.POST_CHANGE); + } + /* * Returns the root info for the given path. Look in the old roots table if kind is REMOVED. */ |