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..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 @@ -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 Map currentOptions = javaProject.getOptions(true); for (Map.Entry entry : options.entrySet()) { switch (entry.getKey()) { case M2E_SELECTED_PROFILES: @@ -744,8 +747,18 @@ public static void updateProjectSettings(String projectUri, Map } break; default: + 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 projectSpecificOptions = javaProject.getOptions(false); + projectSpecificOptions.putAll(newOptions); + javaProject.setOptions(projectSpecificOptions); + } } } 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();