From cf8dced10c8da6617ae78e25179b9742ef858430 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Wed, 22 May 2024 13:43:46 +0800 Subject: [PATCH 1/2] Support update Java project options. - All the options from JavaCore are supported via the delegate command 'java.project.updateSettings'. Signed-off-by: Sheng Chen --- .../core/internal/commands/ProjectCommand.java | 11 +++++++++++ .../internal/commands/ProjectCommandTest.java | 18 ++++++++++++++++++ 2 files changed, 29 insertions(+) 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 8cd2fc7cc0..4f8ccb9897 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 @@ -28,6 +28,7 @@ import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.Set; import java.util.Map.Entry; import java.util.Objects; import java.util.stream.Stream; @@ -721,6 +722,8 @@ public JdkUpdateResult(boolean success, String message) { public static void updateProjectSettings(String projectUri, Map options) throws CoreException, URISyntaxException { IJavaProject javaProject = getJavaProjectFromUri(projectUri); IProject project = javaProject.getProject(); + Map newOptions = new HashMap<>(); + final Set validOptionKeys = JavaCore.getDefaultOptions().keySet(); for (Map.Entry entry : options.entrySet()) { switch (entry.getKey()) { case M2E_SELECTED_PROFILES: @@ -744,8 +747,16 @@ public static void updateProjectSettings(String projectUri, Map } break; default: + if (validOptionKeys.contains(entry.getKey())) { + newOptions.put(entry.getKey(), entry.getValue().toString()); + } break; } } + if (!newOptions.isEmpty()) { + Map javaProjectOptions = javaProject.getOptions(false); + javaProjectOptions.putAll(newOptions); + javaProject.setOptions(javaProjectOptions); + } } } 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 1e02b261b3..db3915f5d9 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 @@ -467,6 +467,24 @@ public void testUpdateMavenProfiles() throws Exception { assertEquals("my profile", options.get(KEY)); } + @Test + public void testUpdateProjectOptions() throws Exception { + importProjects("maven/salut"); + IProject project = WorkspaceHelper.getProject("salut"); + String uriString = project.getLocationURI().toString(); + List settingKeys = Arrays.asList(JavaCore.COMPILER_CODEGEN_METHOD_PARAMETERS_ATTR); + Map options = ProjectCommand.getProjectSettings(uriString, settingKeys); + + assertEquals(JavaCore.DO_NOT_GENERATE, options.get(JavaCore.COMPILER_CODEGEN_METHOD_PARAMETERS_ATTR)); + + Map updateOptions = new HashMap<>(); + updateOptions.put(JavaCore.COMPILER_CODEGEN_METHOD_PARAMETERS_ATTR, JavaCore.GENERATE); + ProjectCommand.updateProjectSettings(uriString, updateOptions); + + options = ProjectCommand.getProjectSettings(uriString, settingKeys); + assertEquals(JavaCore.GENERATE, options.get(JavaCore.COMPILER_CODEGEN_METHOD_PARAMETERS_ATTR)); + } + private SymbolInformation buildClassSymbol(IProject project, String fqClassName) throws Exception { String uriString = buildClassfileUri(project, fqClassName); SymbolInformation si = new SymbolInformation(); From fcfad46158dfe29c3da33009fe8cdb459ca6b0e9 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Fri, 24 May 2024 10:49:27 +0800 Subject: [PATCH 2/2] Only update the options when necessary Signed-off-by: Sheng Chen --- .../ls/core/internal/commands/ProjectCommand.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 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 4f8ccb9897..e5e626518c 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 @@ -723,7 +723,7 @@ public static void updateProjectSettings(String projectUri, Map IJavaProject javaProject = getJavaProjectFromUri(projectUri); IProject project = javaProject.getProject(); Map newOptions = new HashMap<>(); - final Set validOptionKeys = JavaCore.getDefaultOptions().keySet(); + final Map currentOptions = javaProject.getOptions(true); for (Map.Entry entry : options.entrySet()) { switch (entry.getKey()) { case M2E_SELECTED_PROFILES: @@ -747,16 +747,18 @@ public static void updateProjectSettings(String projectUri, Map } break; default: - if (validOptionKeys.contains(entry.getKey())) { + String settingValue = currentOptions.get(entry.getKey()); + // only update the options whose keys are valid and value are different from the current ones + if (settingValue != null && !settingValue.equals(entry.getValue().toString().trim())) { newOptions.put(entry.getKey(), entry.getValue().toString()); } break; } } if (!newOptions.isEmpty()) { - Map javaProjectOptions = javaProject.getOptions(false); - javaProjectOptions.putAll(newOptions); - javaProject.setOptions(javaProjectOptions); + Map projectSpecificOptions = javaProject.getOptions(false); + projectSpecificOptions.putAll(newOptions); + javaProject.setOptions(projectSpecificOptions); } } }