diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/InvisibleProjectImporter.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/InvisibleProjectImporter.java index 49680e4cda..be5d0ed76f 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/InvisibleProjectImporter.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/InvisibleProjectImporter.java @@ -172,11 +172,11 @@ public static IClasspathEntry[] resolveClassPathEntries(IJavaProject javaProject } } - // Sort the source paths to make the parent folders come first + // Sort the source paths to make the child folders come first Collections.sort(sourcePaths, new Comparator() { @Override public int compare(IPath path1, IPath path2) { - return path1.toString().compareTo(path2.toString()); + return path1.toString().compareTo(path2.toString()) * -1; } }); @@ -191,12 +191,6 @@ public int compare(IPath path1, IPath path2) { break; } - if (sourceEntry.getPath().isPrefixOf(currentPath)) { - JavaLanguageServerPlugin.logError("Skip source path: " + currentPath.toString() + ", since its parent path is already a source path"); - canAddToSourceEntries = false; - break; - } - if (currentPath.isPrefixOf(sourceEntry.getPath())) { exclusionPatterns.add(sourceEntry.getPath().makeRelativeTo(currentPath).addTrailingSeparator()); } @@ -279,17 +273,11 @@ public static List getSourcePaths(List sourcePaths, IFolder works public static List getExcludingPath(IJavaProject javaProject, IPath rootPath, IFolder workspaceLinkFolder) throws CoreException { if (rootPath == null) { - PreferenceManager preferenceManager = JavaLanguageServerPlugin.getPreferencesManager(); - if (preferenceManager == null || preferenceManager.getPreferences() == null) { - throw new CoreException(new Status(IStatus.ERROR, IConstants.PLUGIN_ID, "Failed to get the preferences.")); - } - Collection rootPaths = preferenceManager.getPreferences().getRootPaths(); - Optional belongedRootPath = rootPaths.stream().filter(root -> root.isPrefixOf(workspaceLinkFolder.getLocation())).findFirst(); - if (belongedRootPath.isEmpty()) { - throw new CoreException(new Status(IStatus.ERROR, IConstants.PLUGIN_ID, "Failed to find the belonging root of the linked folder: " + workspaceLinkFolder.toString())); - } + rootPath = ProjectUtils.findBelongedWorkspaceRoot(workspaceLinkFolder.getLocation()); + } - rootPath = belongedRootPath.get(); + if (rootPath == null) { + throw new CoreException(new Status(IStatus.ERROR, IConstants.PLUGIN_ID, "Failed to find the belonging root of the linked folder: " + workspaceLinkFolder.toString())); } final IPath root = rootPath; diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/InvisibleProjectPreferenceChangeListener.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/InvisibleProjectPreferenceChangeListener.java index 7cc9d0fa5b..5870fc6380 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/InvisibleProjectPreferenceChangeListener.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/InvisibleProjectPreferenceChangeListener.java @@ -47,6 +47,9 @@ public void preferencesChange(Preferences oldPreferences, Preferences newPrefere try { IFolder workspaceLinkFolder = javaProject.getProject().getFolder(ProjectUtils.WORKSPACE_LINK); + if (!workspaceLinkFolder.exists()) { + continue; + } List sourcePaths = InvisibleProjectImporter.getSourcePaths(newPreferences.getInvisibleProjectSourcePaths(), workspaceLinkFolder); List excludingPaths = InvisibleProjectImporter.getExcludingPath(javaProject, null, workspaceLinkFolder); IPath outputPath = InvisibleProjectImporter.getOutputPath(javaProject, newPreferences.getInvisibleProjectOutputPath(), true /*isUpdate*/); diff --git a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/managers/InvisibleProjectImporterTest.java b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/managers/InvisibleProjectImporterTest.java index ab5dbdd316..747259944f 100644 --- a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/managers/InvisibleProjectImporterTest.java +++ b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/managers/InvisibleProjectImporterTest.java @@ -325,8 +325,9 @@ public void testSpecifyingNestedSourcePaths() throws Exception { sourcePaths.add(entry.getPath().makeRelativeTo(linkFolder.getFullPath()).toString()); } } - assertEquals(1, sourcePaths.size()); + assertEquals(2, sourcePaths.size()); assertTrue(sourcePaths.contains("foo")); + assertTrue(sourcePaths.contains("foo/bar")); } @Test