### Eclipse Workspace Patch 1.0 #P org.eclipse.jdt.core Index: model/org/eclipse/jdt/internal/core/JavaModelOperation.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JavaModelOperation.java,v retrieving revision 1.66 diff -u -r1.66 JavaModelOperation.java --- model/org/eclipse/jdt/internal/core/JavaModelOperation.java 3 Apr 2007 09:33:48 -0000 1.66 +++ model/org/eclipse/jdt/internal/core/JavaModelOperation.java 26 Apr 2007 11:24:06 -0000 @@ -745,10 +745,11 @@ switch (element.getElementType()) { case IJavaElement.PACKAGE_FRAGMENT_ROOT: case IJavaElement.PACKAGE_FRAGMENT: - ((JavaProject) element.getJavaProject()).resetCaches(); + deltaProcessor.projectCachesToReset.add(element.getJavaProject()); break; } } + deltaProcessor.resetProjectCaches(); // fire only iff: // - the operation is a top level operation 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.298 diff -u -r1.298 DeltaProcessor.java --- model/org/eclipse/jdt/internal/core/DeltaProcessor.java 3 Apr 2007 09:33:49 -0000 1.298 +++ model/org/eclipse/jdt/internal/core/DeltaProcessor.java 26 Apr 2007 11:24:06 -0000 @@ -232,7 +232,7 @@ private final ModelUpdater modelUpdater = new ModelUpdater(); /* A set of IJavaProject whose caches need to be reset */ - private HashSet projectCachesToReset = new HashSet(); + public HashSet projectCachesToReset = new HashSet(); /* * A list of IJavaElement used as a scope for external archives refresh during POST_CHANGE. @@ -1778,7 +1778,7 @@ * Traverse the set of projects which have changed namespace, and reset their * caches and their dependents */ - private void resetProjectCaches() { + public void resetProjectCaches() { if (this.projectCachesToReset.size() == 0) return; #P org.eclipse.jdt.core.tests.model Index: src/org/eclipse/jdt/core/tests/model/NameLookupTests2.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/NameLookupTests2.java,v retrieving revision 1.22 diff -u -r1.22 NameLookupTests2.java --- src/org/eclipse/jdt/core/tests/model/NameLookupTests2.java 29 Mar 2006 04:03:07 -0000 1.22 +++ src/org/eclipse/jdt/core/tests/model/NameLookupTests2.java 26 Apr 2007 11:24:07 -0000 @@ -12,7 +12,9 @@ import java.io.IOException; +import org.eclipse.core.resources.IWorkspaceRunnable; import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.Path; import org.eclipse.jdt.core.*; import org.eclipse.jdt.internal.core.JavaProject; @@ -44,7 +46,7 @@ return buildModelTestSuite(NameLookupTests2.class); } -private NameLookup getNameLookup(JavaProject project) throws JavaModelException { +NameLookup getNameLookup(JavaProject project) throws JavaModelException { return project.newNameLookup((WorkingCopyOwner)null); } public void testAddPackageFragmentRootAndPackageFrament() throws CoreException { @@ -194,6 +196,34 @@ } } /* + * Creates a package fragment and finds it in a dependent project in a batch operation + * (regression test for bug 144776 JavaProject.resetCaches() needs to reset dependent projects + */ +public void testNameLookupFindPackageFragmentAfterCreation() throws CoreException { + try { + final IJavaProject p1 = createJavaProject("P1"); + final JavaProject p2 = (JavaProject) createJavaProject("P2", new String[] {""}, new String[0], new String[] {"/P1"}, ""); + + // populate namelookup for p2 + getNameLookup(p2); + + IWorkspaceRunnable runnable = new IWorkspaceRunnable(){ + public void run(IProgressMonitor monitor) throws CoreException { + p1.getPackageFragmentRoot(p1.getProject()).createPackageFragment("pkg", false/*don't force*/, monitor); + IPackageFragment[] pkgs = getNameLookup(p2).findPackageFragments("pkg", false/*exact match*/); + assertElementsEqual( + "Unexpected package fragments", + "pkg [in [in P1]]", + pkgs); + } + }; + JavaCore.run(runnable, null/*no progress*/); + } finally { + deleteProject("P1"); + deleteProject("P2"); + } +} +/* * Ensure that finding a package fragment with a working copy opened returns one element only * (regression test for bug 89624 Open on selection proposes twice the same entry) */