### Eclipse Workspace Patch 1.0 #P org.eclipse.jdt.core.tests.model Index: src/org/eclipse/jdt/core/tests/model/TypeHierarchyNotificationTests.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/TypeHierarchyNotificationTests.java,v retrieving revision 1.28 diff -u -r1.28 TypeHierarchyNotificationTests.java --- src/org/eclipse/jdt/core/tests/model/TypeHierarchyNotificationTests.java 14 Mar 2007 08:18:40 -0000 1.28 +++ src/org/eclipse/jdt/core/tests/model/TypeHierarchyNotificationTests.java 27 Sep 2007 15:51:12 -0000 @@ -639,6 +639,43 @@ h.removeTypeHierarchyChangedListener(this); } } +/* + * Ensures that editing a working copy's buffer and committing (without a reconcile) triggers a type hierarchy notification + * (regression test for bug 204805 ICompilationUnit.commitWorkingCopy doesn't send typeHierarchyChanged) + */ +public void testEditBuffer() throws CoreException { + ITypeHierarchy h = null; + ICompilationUnit workingCopy = null; + try { + createJavaProject("P"); + createFolder("/P/p"); + createFile( + "/P/p/X.java", + "package p;\n" + + "public class X {\n" + + "}" + ); + workingCopy = getCompilationUnit("/P/p/X.java"); + workingCopy.becomeWorkingCopy(null/*no progress*/); + h = workingCopy.getType("X").newTypeHierarchy(null); + h.addTypeHierarchyChangedListener(this); + + workingCopy.getBuffer().setContents( + "package p;\n" + + "public class X extends Throwable {\n" + + "}" + ); + workingCopy.commitWorkingCopy(false/*don't force*/, null/*no progress*/); + + assertOneChange(h); + } finally { + if (h != null) + h.removeTypeHierarchyChangedListener(this); + if (workingCopy != null) + workingCopy.discardWorkingCopy(); + deleteProject("P"); + } +} /** * When editing the extends clause of a source type in a hierarchy, we should be notified of change. */ Index: src/org/eclipse/jdt/core/tests/model/JavaSearchBugsTests.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaSearchBugsTests.java,v retrieving revision 1.121 diff -u -r1.121 JavaSearchBugsTests.java --- src/org/eclipse/jdt/core/tests/model/JavaSearchBugsTests.java 28 Aug 2007 10:03:35 -0000 1.121 +++ src/org/eclipse/jdt/core/tests/model/JavaSearchBugsTests.java 27 Sep 2007 15:51:12 -0000 @@ -8300,7 +8300,7 @@ public void testBug167190() throws CoreException, JavaModelException { IJavaSearchScope scope = new AbstractSearchScope() { IJavaSearchScope jsScope = getJavaSearchScope(); - public void processDelta(IJavaElementDelta delta) { + public void processDelta(IJavaElementDelta delta, int eventType) { // we should have no delta on this test case } public boolean encloses(String resourcePath) { #P org.eclipse.jdt.core Index: search/org/eclipse/jdt/internal/core/search/AbstractSearchScope.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/AbstractSearchScope.java,v retrieving revision 1.13 diff -u -r1.13 AbstractSearchScope.java --- search/org/eclipse/jdt/internal/core/search/AbstractSearchScope.java 10 May 2006 18:03:48 -0000 1.13 +++ search/org/eclipse/jdt/internal/core/search/AbstractSearchScope.java 27 Sep 2007 15:51:19 -0000 @@ -35,7 +35,7 @@ * Process the given delta and refresh its internal state if needed. * Returns whether the internal state was refreshed. */ -public abstract void processDelta(IJavaElementDelta delta); +public abstract void processDelta(IJavaElementDelta delta, int eventType); /** * @see IJavaSearchScope#setIncludesBinaries(boolean) Index: search/org/eclipse/jdt/internal/core/search/JavaSearchScope.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/JavaSearchScope.java,v retrieving revision 1.60 diff -u -r1.60 JavaSearchScope.java --- search/org/eclipse/jdt/internal/core/search/JavaSearchScope.java 9 Aug 2007 10:20:32 -0000 1.60 +++ search/org/eclipse/jdt/internal/core/search/JavaSearchScope.java 27 Sep 2007 15:51:20 -0000 @@ -523,13 +523,13 @@ /* * @see AbstractSearchScope#processDelta(IJavaElementDelta) */ -public void processDelta(IJavaElementDelta delta) { +public void processDelta(IJavaElementDelta delta, int eventType) { switch (delta.getKind()) { case IJavaElementDelta.CHANGED: IJavaElementDelta[] children = delta.getAffectedChildren(); for (int i = 0, length = children.length; i < length; i++) { IJavaElementDelta child = children[i]; - this.processDelta(child); + this.processDelta(child, eventType); } break; case IJavaElementDelta.REMOVED: Index: search/org/eclipse/jdt/internal/core/search/JavaWorkspaceScope.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/JavaWorkspaceScope.java,v retrieving revision 1.29 diff -u -r1.29 JavaWorkspaceScope.java --- search/org/eclipse/jdt/internal/core/search/JavaWorkspaceScope.java 10 May 2006 18:03:48 -0000 1.29 +++ search/org/eclipse/jdt/internal/core/search/JavaWorkspaceScope.java 27 Sep 2007 15:51:20 -0000 @@ -88,7 +88,7 @@ } this.needsInitialize = false; } -public void processDelta(IJavaElementDelta delta) { +public void processDelta(IJavaElementDelta delta, int eventType) { if (this.needsInitialize) return; IJavaElement element = delta.getElement(); switch (element.getElementType()) { @@ -96,7 +96,7 @@ IJavaElementDelta[] children = delta.getAffectedChildren(); for (int i = 0, length = children.length; i < length; i++) { IJavaElementDelta child = children[i]; - this.processDelta(child); + this.processDelta(child, eventType); } break; case IJavaElement.JAVA_PROJECT: @@ -115,7 +115,7 @@ children = delta.getAffectedChildren(); for (int i = 0, length = children.length; i < length; i++) { IJavaElementDelta child = children[i]; - this.processDelta(child); + this.processDelta(child, eventType); } } break; Index: search/org/eclipse/jdt/internal/core/search/HierarchyScope.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/HierarchyScope.java,v retrieving revision 1.42 diff -u -r1.42 HierarchyScope.java --- search/org/eclipse/jdt/internal/core/search/HierarchyScope.java 27 Apr 2007 15:51:38 -0000 1.42 +++ search/org/eclipse/jdt/internal/core/search/HierarchyScope.java 27 Sep 2007 15:51:19 -0000 @@ -334,9 +334,9 @@ /* * @see AbstractSearchScope#processDelta(IJavaElementDelta) */ - public void processDelta(IJavaElementDelta delta) { + public void processDelta(IJavaElementDelta delta, int eventType) { if (this.needsRefresh) return; - this.needsRefresh = this.hierarchy == null ? false : ((TypeHierarchy)this.hierarchy).isAffected(delta); + this.needsRefresh = this.hierarchy == null ? false : ((TypeHierarchy)this.hierarchy).isAffected(delta, eventType); } protected void refresh() throws JavaModelException { if (this.hierarchy != null) { Index: model/org/eclipse/jdt/internal/core/hierarchy/TypeHierarchy.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/hierarchy/TypeHierarchy.java,v retrieving revision 1.100 diff -u -r1.100 TypeHierarchy.java --- model/org/eclipse/jdt/internal/core/hierarchy/TypeHierarchy.java 13 Apr 2007 16:02:15 -0000 1.100 +++ model/org/eclipse/jdt/internal/core/hierarchy/TypeHierarchy.java 27 Sep 2007 15:51:19 -0000 @@ -325,7 +325,7 @@ // type hierarchy change has already been fired if (this.needsRefresh) return; - if (isAffected(event.getDelta())) { + if (isAffected(event.getDelta(), event.getType())) { this.needsRefresh = true; fireChange(); } @@ -792,21 +792,22 @@ } /** * Returns true if the given delta could change this type hierarchy + * @param eventType TODO */ -public synchronized boolean isAffected(IJavaElementDelta delta) { +public synchronized boolean isAffected(IJavaElementDelta delta, int eventType) { IJavaElement element= delta.getElement(); switch (element.getElementType()) { case IJavaElement.JAVA_MODEL: - return isAffectedByJavaModel(delta, element); + return isAffectedByJavaModel(delta, element, eventType); case IJavaElement.JAVA_PROJECT: - return isAffectedByJavaProject(delta, element); + return isAffectedByJavaProject(delta, element, eventType); case IJavaElement.PACKAGE_FRAGMENT_ROOT: - return isAffectedByPackageFragmentRoot(delta, element); + return isAffectedByPackageFragmentRoot(delta, element, eventType); case IJavaElement.PACKAGE_FRAGMENT: - return isAffectedByPackageFragment(delta, (PackageFragment) element); + return isAffectedByPackageFragment(delta, (PackageFragment) element, eventType); case IJavaElement.CLASS_FILE: case IJavaElement.COMPILATION_UNIT: - return isAffectedByOpenable(delta, element); + return isAffectedByOpenable(delta, element, eventType); } return false; } @@ -814,12 +815,13 @@ * Returns true if any of the children of a project, package * fragment root, or package fragment have changed in a way that * effects this type hierarchy. + * @param eventType TODO */ -private boolean isAffectedByChildren(IJavaElementDelta delta) { +private boolean isAffectedByChildren(IJavaElementDelta delta, int eventType) { if ((delta.getFlags() & IJavaElementDelta.F_CHILDREN) > 0) { IJavaElementDelta[] children= delta.getAffectedChildren(); for (int i= 0; i < children.length; i++) { - if (isAffected(children[i])) { + if (isAffected(children[i], eventType)) { return true; } } @@ -828,21 +830,23 @@ } /** * Returns true if the given java model delta could affect this type hierarchy + * @param eventType TODO */ -private boolean isAffectedByJavaModel(IJavaElementDelta delta, IJavaElement element) { +private boolean isAffectedByJavaModel(IJavaElementDelta delta, IJavaElement element, int eventType) { switch (delta.getKind()) { case IJavaElementDelta.ADDED : case IJavaElementDelta.REMOVED : return element.equals(this.javaProject().getJavaModel()); case IJavaElementDelta.CHANGED : - return isAffectedByChildren(delta); + return isAffectedByChildren(delta, eventType); } return false; } /** * Returns true if the given java project delta could affect this type hierarchy + * @param eventType TODO */ -private boolean isAffectedByJavaProject(IJavaElementDelta delta, IJavaElement element) { +private boolean isAffectedByJavaProject(IJavaElementDelta delta, IJavaElement element, int eventType) { int kind = delta.getKind(); int flags = delta.getFlags(); if ((flags & IJavaElementDelta.F_OPENED) != 0) { @@ -889,14 +893,15 @@ } return false; case IJavaElementDelta.CHANGED : - return isAffectedByChildren(delta); + return isAffectedByChildren(delta, eventType); } return false; } /** * Returns true if the given package fragment delta could affect this type hierarchy + * @param eventType TODO */ -private boolean isAffectedByPackageFragment(IJavaElementDelta delta, PackageFragment element) { +private boolean isAffectedByPackageFragment(IJavaElementDelta delta, PackageFragment element, int eventType) { switch (delta.getKind()) { case IJavaElementDelta.ADDED : // if the package fragment is in the projects being considered, this could @@ -907,14 +912,15 @@ return packageRegionContainsSamePackageFragment(element); case IJavaElementDelta.CHANGED : // look at the files in the package fragment - return isAffectedByChildren(delta); + return isAffectedByChildren(delta, eventType); } return false; } /** * Returns true if the given package fragment root delta could affect this type hierarchy + * @param eventType TODO */ -private boolean isAffectedByPackageFragmentRoot(IJavaElementDelta delta, IJavaElement element) { +private boolean isAffectedByPackageFragmentRoot(IJavaElementDelta delta, IJavaElement element, int eventType) { switch (delta.getKind()) { case IJavaElementDelta.ADDED : return this.projectRegion.contains(element); @@ -954,13 +960,14 @@ return false; } } - return isAffectedByChildren(delta); + return isAffectedByChildren(delta, eventType); } /** * Returns true if the given type delta (a compilation unit delta or a class file delta) * could affect this type hierarchy. + * @param eventType TODO */ -protected boolean isAffectedByOpenable(IJavaElementDelta delta, IJavaElement element) { +protected boolean isAffectedByOpenable(IJavaElementDelta delta, IJavaElement element, int eventType) { if (element instanceof CompilationUnit) { CompilationUnit cu = (CompilationUnit)element; ChangeCollector collector = this.changeCollector; @@ -973,7 +980,7 @@ if (DEBUG) e.printStackTrace(); } - if (cu.isWorkingCopy()) { + if (cu.isWorkingCopy() && eventType == ElementChangedEvent.POST_RECONCILE) { // changes to working copies are batched this.changeCollector = collector; return false; Index: model/org/eclipse/jdt/internal/core/hierarchy/RegionBasedTypeHierarchy.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/hierarchy/RegionBasedTypeHierarchy.java,v retrieving revision 1.27 diff -u -r1.27 RegionBasedTypeHierarchy.java --- model/org/eclipse/jdt/internal/core/hierarchy/RegionBasedTypeHierarchy.java 6 Mar 2007 02:38:51 -0000 1.27 +++ model/org/eclipse/jdt/internal/core/hierarchy/RegionBasedTypeHierarchy.java 27 Sep 2007 15:51:19 -0000 @@ -96,17 +96,17 @@ HierarchyBuilder builder = new RegionBasedHierarchyBuilder(this); builder.build(this.computeSubtypes); } -protected boolean isAffectedByOpenable(IJavaElementDelta delta, IJavaElement element) { +protected boolean isAffectedByOpenable(IJavaElementDelta delta, IJavaElement element, int eventType) { // change to working copy if (element instanceof CompilationUnit && ((CompilationUnit)element).isWorkingCopy()) { - return super.isAffectedByOpenable(delta, element); + return super.isAffectedByOpenable(delta, element, eventType); } // if no focus, hierarchy is affected if the element is part of the region if (this.focusType == null) { return this.region.contains(element); } else { - return super.isAffectedByOpenable(delta, element); + return super.isAffectedByOpenable(delta, element, eventType); } } /** Index: model/org/eclipse/jdt/internal/core/DeltaProcessor.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/DeltaProcessor.java,v retrieving revision 1.304 diff -u -r1.304 DeltaProcessor.java --- model/org/eclipse/jdt/internal/core/DeltaProcessor.java 3 Sep 2007 14:14:04 -0000 1.304 +++ model/org/eclipse/jdt/internal/core/DeltaProcessor.java 27 Sep 2007 15:51:19 -0000 @@ -1305,11 +1305,11 @@ Iterator scopes = this.manager.searchScopes.keySet().iterator(); while (scopes.hasNext()) { AbstractSearchScope scope = (AbstractSearchScope)scopes.next(); - scope.processDelta(deltaToNotify); + scope.processDelta(deltaToNotify, eventType); } JavaWorkspaceScope workspaceScope = this.manager.workspaceScope; if (workspaceScope != null) - workspaceScope.processDelta(deltaToNotify); + workspaceScope.processDelta(deltaToNotify, eventType); } // Notification