From da345adccd96a66952c6b3547010cf64264e770f Mon Sep 17 00:00:00 2001 From: sheche Date: Fri, 3 Sep 2021 15:38:40 +0800 Subject: [PATCH 1/5] fix: Get correct Java project in multi-module case Signed-off-by: sheche --- .../internal/commands/ProjectCommand.java | 16 +++++++----- .../maven/multimodule3/module3/pom.xml | 25 +++++++++++++++++++ .../src/main/java/org/eclipse/App.java | 9 +++++++ .../src/test/java/org/eclipse/AppTest.java | 12 +++++++++ .../projects/maven/multimodule3/pom.xml | 1 + .../internal/commands/ProjectCommandTest.java | 13 ++++++++++ 6 files changed, 70 insertions(+), 6 deletions(-) create mode 100644 org.eclipse.jdt.ls.tests/projects/maven/multimodule3/module3/pom.xml create mode 100644 org.eclipse.jdt.ls.tests/projects/maven/multimodule3/module3/src/main/java/org/eclipse/App.java create mode 100644 org.eclipse.jdt.ls.tests/projects/maven/multimodule3/module3/src/test/java/org/eclipse/AppTest.java diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/commands/ProjectCommand.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/commands/ProjectCommand.java index 844e5238dd..6fd370bb2e 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/commands/ProjectCommand.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/commands/ProjectCommand.java @@ -18,11 +18,11 @@ import java.net.URISyntaxException; import java.util.ArrayList; import java.util.Arrays; -import java.util.Comparator; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Optional; import org.eclipse.core.resources.IContainer; @@ -270,13 +270,17 @@ public static IJavaProject getJavaProjectFromUri(String uri) throws CoreExceptio } // For multi-module scenario - Arrays.sort(containers, (Comparator) (IContainer a, IContainer b) -> { - return a.getFullPath().toPortableString().length() - b.getFullPath().toPortableString().length(); - }); + IProject[] projects = Arrays.stream(containers).map((container) -> { + return container.getProject(); + }).filter(Objects::nonNull) + .sorted((IProject a, IProject b) -> { + // inner comes first + return b.getFullPath().toPortableString().length() - a.getFullPath().toPortableString().length(); + }).toArray(IProject[]::new); IJavaElement targetElement = null; - for (IContainer container : containers) { - targetElement = JavaCore.create(container.getProject()); + for (IProject project : projects) { + targetElement = JavaCore.create(project); if (targetElement != null) { break; } diff --git a/org.eclipse.jdt.ls.tests/projects/maven/multimodule3/module3/pom.xml b/org.eclipse.jdt.ls.tests/projects/maven/multimodule3/module3/pom.xml new file mode 100644 index 0000000000..83fc2253fe --- /dev/null +++ b/org.eclipse.jdt.ls.tests/projects/maven/multimodule3/module3/pom.xml @@ -0,0 +1,25 @@ + + + 4.0.0 + + org.eclipse + multimodule3 + 1.0-SNAPSHOT + + org.eclipse + this_is_a_very_long_module_name + 1.0-SNAPSHOT + this_is_a_very_long_module_name + + UTF-8 + + + + junit + junit + 4.13 + test + + + diff --git a/org.eclipse.jdt.ls.tests/projects/maven/multimodule3/module3/src/main/java/org/eclipse/App.java b/org.eclipse.jdt.ls.tests/projects/maven/multimodule3/module3/src/main/java/org/eclipse/App.java new file mode 100644 index 0000000000..743a1f9d99 --- /dev/null +++ b/org.eclipse.jdt.ls.tests/projects/maven/multimodule3/module3/src/main/java/org/eclipse/App.java @@ -0,0 +1,9 @@ +package org.eclipse; + +public class App { + public static final String GREETING = "Hello World!"; + + public static void main(String[] args) { + System.out.println(GREETING); + } +} diff --git a/org.eclipse.jdt.ls.tests/projects/maven/multimodule3/module3/src/test/java/org/eclipse/AppTest.java b/org.eclipse.jdt.ls.tests/projects/maven/multimodule3/module3/src/test/java/org/eclipse/AppTest.java new file mode 100644 index 0000000000..8c2a2b1a6b --- /dev/null +++ b/org.eclipse.jdt.ls.tests/projects/maven/multimodule3/module3/src/test/java/org/eclipse/AppTest.java @@ -0,0 +1,12 @@ +package org.eclipse; + +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +public class AppTest { + @Test + public void testApp() { + assertTrue(true); + } +} diff --git a/org.eclipse.jdt.ls.tests/projects/maven/multimodule3/pom.xml b/org.eclipse.jdt.ls.tests/projects/maven/multimodule3/pom.xml index b58ef54174..5a0fcca6ee 100644 --- a/org.eclipse.jdt.ls.tests/projects/maven/multimodule3/pom.xml +++ b/org.eclipse.jdt.ls.tests/projects/maven/multimodule3/pom.xml @@ -11,6 +11,7 @@ module1 module2 + module3 diff --git a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/commands/ProjectCommandTest.java b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/commands/ProjectCommandTest.java index 25815cf9be..14d410da8b 100644 --- a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/commands/ProjectCommandTest.java +++ b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/commands/ProjectCommandTest.java @@ -130,6 +130,19 @@ public void testGetMavenProjectFromUri() throws Exception { assertNotNull("Can get project from project uri", javaProject); } + @Test + public void testGetMultiModuleMavenProjectFromUri() throws Exception { + importProjects("maven/multimodule3"); + IProject project = WorkspaceHelper.getProject("this_is_a_very_long_module_name"); + String javaSource = project.getFile("src/main/org/eclipse/App.java").getLocationURI().toString(); + IJavaProject javaProject = ProjectCommand.getJavaProjectFromUri(javaSource); + assertEquals("this_is_a_very_long_module_name", javaProject.getElementName()); + + String projectUri = project.getLocationURI().toString(); + javaProject = ProjectCommand.getJavaProjectFromUri(projectUri); + assertEquals("this_is_a_very_long_module_name", javaProject.getElementName()); + } + @Test public void testGetInvisibleProjectFromUri() throws Exception { IProject project = copyAndImportFolder("singlefile/simple", "src/App.java"); From b6861f34c28bb80887cfc0fe3a5f6d59fad9e145 Mon Sep 17 00:00:00 2001 From: sheche Date: Fri, 3 Sep 2021 18:09:24 +0800 Subject: [PATCH 2/5] Counting the segment count Signed-off-by: sheche --- .../internal/commands/ProjectCommand.java | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/commands/ProjectCommand.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/commands/ProjectCommand.java index 6fd370bb2e..775cbd7d8d 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/commands/ProjectCommand.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/commands/ProjectCommand.java @@ -18,6 +18,7 @@ import java.net.URISyntaxException; import java.util.ArrayList; import java.util.Arrays; +import java.util.Comparator; import java.util.HashMap; import java.util.LinkedList; import java.util.List; @@ -25,6 +26,7 @@ import java.util.Objects; import java.util.Optional; +import org.eclipse.core.internal.utils.FileUtil; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IWorkspace; @@ -270,18 +272,15 @@ public static IJavaProject getJavaProjectFromUri(String uri) throws CoreExceptio } // For multi-module scenario - IProject[] projects = Arrays.stream(containers).map((container) -> { - return container.getProject(); - }).filter(Objects::nonNull) - .sorted((IProject a, IProject b) -> { - // inner comes first - return b.getFullPath().toPortableString().length() - a.getFullPath().toPortableString().length(); - }).toArray(IProject[]::new); + IPath inputPath = FileUtil.toPath(new URI(uri)); + Arrays.sort(containers, (Comparator) (IContainer a, IContainer b) -> { + return inputPath.makeRelativeTo(a.getLocation()).segmentCount() - inputPath.makeRelativeTo(b.getLocation()).segmentCount(); + }); IJavaElement targetElement = null; - for (IProject project : projects) { - targetElement = JavaCore.create(project); - if (targetElement != null) { + for (IContainer container : containers) { + targetElement = JavaCore.create(container.getProject()); + if (targetElement != null && targetElement.exists()) { break; } } From 9f95d5b6cf7aead89ae9faa9dd6a40284b9991de Mon Sep 17 00:00:00 2001 From: sheche Date: Fri, 3 Sep 2021 18:28:13 +0800 Subject: [PATCH 3/5] Remove unused import Signed-off-by: sheche --- .../eclipse/jdt/ls/core/internal/commands/ProjectCommand.java | 1 - 1 file changed, 1 deletion(-) diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/commands/ProjectCommand.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/commands/ProjectCommand.java index 775cbd7d8d..6ebcccee3e 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/commands/ProjectCommand.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/commands/ProjectCommand.java @@ -23,7 +23,6 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.Optional; import org.eclipse.core.internal.utils.FileUtil; From 514e24df1fee46d7d24ebd6704eadb59ca330979 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Tue, 7 Sep 2021 11:26:09 +0800 Subject: [PATCH 4/5] Address comments Signed-off-by: Sheng Chen --- .../eclipse/jdt/ls/core/internal/commands/ProjectCommand.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/commands/ProjectCommand.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/commands/ProjectCommand.java index 6ebcccee3e..7de0253cca 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/commands/ProjectCommand.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/commands/ProjectCommand.java @@ -271,9 +271,8 @@ public static IJavaProject getJavaProjectFromUri(String uri) throws CoreExceptio } // For multi-module scenario - IPath inputPath = FileUtil.toPath(new URI(uri)); Arrays.sort(containers, (Comparator) (IContainer a, IContainer b) -> { - return inputPath.makeRelativeTo(a.getLocation()).segmentCount() - inputPath.makeRelativeTo(b.getLocation()).segmentCount(); + return a.getFullPath().segmentCount() - b.getFullPath().segmentCount(); }); IJavaElement targetElement = null; From bafb9ff543b4941c955557098d8cd440004821be Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Tue, 7 Sep 2021 11:29:43 +0800 Subject: [PATCH 5/5] Remove unused import Signed-off-by: Sheng Chen --- .../eclipse/jdt/ls/core/internal/commands/ProjectCommand.java | 1 - 1 file changed, 1 deletion(-) diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/commands/ProjectCommand.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/commands/ProjectCommand.java index 7de0253cca..47afbdc5ea 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/commands/ProjectCommand.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/commands/ProjectCommand.java @@ -25,7 +25,6 @@ import java.util.Map; import java.util.Optional; -import org.eclipse.core.internal.utils.FileUtil; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IWorkspace;