### Eclipse Workspace Patch 1.0 #P org.eclipse.jdt.core.tests.model Index: src/org/eclipse/jdt/core/tests/model/AttachSourceTests.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/AttachSourceTests.java,v retrieving revision 1.53 diff -u -r1.53 AttachSourceTests.java --- src/org/eclipse/jdt/core/tests/model/AttachSourceTests.java 18 Apr 2008 15:41:55 -0000 1.53 +++ src/org/eclipse/jdt/core/tests/model/AttachSourceTests.java 21 Apr 2008 08:47:38 -0000 @@ -410,6 +410,45 @@ } } /* + * Ensures that root paths are correctly detected when attaching an external source folder to an external library folder. + * (regression test for https://bugs.eclipse.org/bugs/show_bug.cgi?id=227813 ) + */ +public void testExternalFolder4() throws Exception { + try { + String externalFolder = getExternalFolder(); + String[] pathsAndContents = + new String[] { + "p/X.java", + "package p;\n" + + "public class X {\n" + + "}" + }; + org.eclipse.jdt.core.tests.util.Util.createSourceDir(pathsAndContents, externalFolder + "/src227813/root1/subroot"); + pathsAndContents = + new String[] { + "q/X.java", + "package q;\n" + + "public class X {\n" + + "}" + }; + org.eclipse.jdt.core.tests.util.Util.createSourceDir(pathsAndContents, externalFolder + "/src227813/root2/subroot"); + + String externalLib = externalFolder + "/lib"; + IJavaProject javaProject = createJavaProject("P", new String[0], new String[] {externalLib}, ""); + IPackageFragmentRoot root = javaProject.getPackageFragmentRoot(externalLib); + attachSource(root, externalFolder + "/src227813", ""); + IType type = root.getPackageFragment("p").getClassFile("X.class").getType(); + assertSourceEquals( + "Unexpected source", + "public class X {\n" + + "}", + type.getSource()); + } finally { + deleteExternalResource("src227813"); + deleteProject("P"); + } +} +/* * Ensures that one can attach an external ZIP archive containing sources to a library folder. */ public void testZIPArchive1() throws CoreException { #P org.eclipse.jdt.core Index: model/org/eclipse/jdt/internal/core/SourceMapper.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/SourceMapper.java,v retrieving revision 1.133 diff -u -r1.133 SourceMapper.java --- model/org/eclipse/jdt/internal/core/SourceMapper.java 18 Apr 2008 15:41:46 -0000 1.133 +++ model/org/eclipse/jdt/internal/core/SourceMapper.java 21 Apr 2008 08:47:39 -0000 @@ -414,7 +414,8 @@ Object target = JavaModel.getTarget(this.sourcePath, true); if (target instanceof IContainer) { - computeRootPath((IContainer)target, firstLevelPackageNames, containsADefaultPackage, tempRoots); + IContainer folder = (IContainer)target; + computeRootPath(folder, firstLevelPackageNames, containsADefaultPackage, tempRoots, folder.getFullPath().segmentCount()/*if external folder, this is the linked folder path*/); } else { JavaModelManager manager = JavaModelManager.getJavaModelManager(); ZipFile zip = null; @@ -485,7 +486,7 @@ } } - private void computeRootPath(IContainer container, HashSet firstLevelPackageNames, boolean hasDefaultPackage, Set set) { + private void computeRootPath(IContainer container, HashSet firstLevelPackageNames, boolean hasDefaultPackage, Set set, int sourcePathSegmentCount) { try { IResource[] resources = container.members(); boolean hasSubDirectories = false; @@ -495,11 +496,11 @@ hasSubDirectories = true; if (firstLevelPackageNames.contains(resource.getName())) { IPath fullPath = container.getFullPath(); - IPath rootPathEntry = fullPath.removeFirstSegments(this.sourcePath.segmentCount()).setDevice(null); + IPath rootPathEntry = fullPath.removeFirstSegments(sourcePathSegmentCount).setDevice(null); set.add(rootPathEntry); break loop; } else { - computeRootPath((IFolder) resource, firstLevelPackageNames, hasDefaultPackage, set); + computeRootPath((IFolder) resource, firstLevelPackageNames, hasDefaultPackage, set, sourcePathSegmentCount); } } if (i == max - 1 && !hasSubDirectories && hasDefaultPackage) { @@ -513,13 +514,14 @@ } if (hasJavaSourceFile) { IPath fullPath = container.getFullPath(); - IPath rootPathEntry = fullPath.removeFirstSegments(this.sourcePath.segmentCount()).setDevice(null); + IPath rootPathEntry = fullPath.removeFirstSegments(sourcePathSegmentCount).setDevice(null); set.add(rootPathEntry); } } } } catch (CoreException e) { // ignore + e.printStackTrace(); } }