diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/JavaLanguageServerPlugin.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/JavaLanguageServerPlugin.java index 95973f0e73..07ab67811a 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/JavaLanguageServerPlugin.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/JavaLanguageServerPlugin.java @@ -74,7 +74,7 @@ public class JavaLanguageServerPlugin extends Plugin { - private static final String JDT_UI_PLUGIN = "org.eclipse.jdt.ui"; + public static final String JDT_UI_PLUGIN = "org.eclipse.jdt.ui"; public static final String MANUAL = "Manual"; public static final String DIRECT = "Direct"; public static final String NATIVE = "Native"; diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/cleanup/AddDeprecatedAnnotationCleanUp.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/cleanup/AddDeprecatedAnnotationCleanUp.java index 29ecbe0f16..4c0d848fdf 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/cleanup/AddDeprecatedAnnotationCleanUp.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/cleanup/AddDeprecatedAnnotationCleanUp.java @@ -13,11 +13,13 @@ package org.eclipse.jdt.ls.core.internal.cleanup; import java.util.Arrays; +import java.util.Collection; import java.util.List; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.manipulation.CleanUpContextCore; import org.eclipse.jdt.core.manipulation.ICleanUpFixCore; +import org.eclipse.jdt.internal.corext.fix.CleanUpConstants; import org.eclipse.jdt.internal.corext.fix.Java50FixCore; /** @@ -29,8 +31,8 @@ public class AddDeprecatedAnnotationCleanUp implements ISimpleCleanUp { private static final List COMPILER_OPTS = Arrays.asList(JavaCore.COMPILER_PB_MISSING_DEPRECATED_ANNOTATION); @Override - public String getIdentifier() { - return "addDeprecated"; + public Collection getIdentifiers() { + return List.of("addDeprecated", CleanUpConstants.ADD_MISSING_ANNOTATIONS_DEPRECATED); } @Override diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/cleanup/AddOverrideAnnotationCleanUp.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/cleanup/AddOverrideAnnotationCleanUp.java index 401e29b28c..7845140393 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/cleanup/AddOverrideAnnotationCleanUp.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/cleanup/AddOverrideAnnotationCleanUp.java @@ -13,11 +13,13 @@ package org.eclipse.jdt.ls.core.internal.cleanup; import java.util.Arrays; +import java.util.Collection; import java.util.List; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.manipulation.CleanUpContextCore; import org.eclipse.jdt.core.manipulation.ICleanUpFixCore; +import org.eclipse.jdt.internal.corext.fix.CleanUpConstants; import org.eclipse.jdt.internal.corext.fix.Java50FixCore; /** @@ -29,8 +31,8 @@ public class AddOverrideAnnotationCleanUp implements ISimpleCleanUp { private static final List COMPILER_OPTS = Arrays.asList(JavaCore.COMPILER_PB_MISSING_OVERRIDE_ANNOTATION); @Override - public String getIdentifier() { - return "addOverride"; + public Collection getIdentifiers() { + return List.of("addOverride", CleanUpConstants.ADD_MISSING_ANNOTATIONS_OVERRIDE); } @Override diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/cleanup/CleanUpRegistry.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/cleanup/CleanUpRegistry.java index df1b121bc0..1f3216fb31 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/cleanup/CleanUpRegistry.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/cleanup/CleanUpRegistry.java @@ -13,13 +13,15 @@ package org.eclipse.jdt.ls.core.internal.cleanup; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.HashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; -import java.util.Objects; import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.Status; import org.eclipse.jdt.core.IBuffer; import org.eclipse.jdt.core.ICompilationUnit; import org.eclipse.jdt.core.IJavaProject; @@ -27,6 +29,7 @@ import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.core.manipulation.CleanUpContextCore; import org.eclipse.jdt.ls.core.internal.JDTUtils; +import org.eclipse.jdt.ls.core.internal.JavaLanguageServerPlugin; import org.eclipse.lsp4j.TextDocumentIdentifier; import org.eclipse.lsp4j.TextEdit; @@ -55,7 +58,10 @@ public CleanUpRegistry() { // Store in a Map so that they can be accessed by ID quickly cleanUps = new HashMap<>(); - cleanUpsList.forEach(cleanUp -> cleanUps.put(cleanUp.getIdentifier(), cleanUp)); + cleanUpsList.forEach(cleanUp -> + cleanUp.getIdentifiers().forEach(id -> + cleanUps.put(id, cleanUp) + )); } /** @@ -72,13 +78,21 @@ public CleanUpRegistry() { * according to the clean ups that are enabled */ public List getEditsForAllActiveCleanUps(TextDocumentIdentifier textDocumentId, List cleanUpEnabled, IProgressMonitor monitor) { - - IJavaProject javaProject = JDTUtils.resolveCompilationUnit(textDocumentId.getUri()).getJavaProject(); - - List cleanUpsToRun = cleanUpEnabled.stream() // - .distinct() // - .map(cleanUpId -> cleanUps.get(cleanUpId)).filter(Objects::nonNull) // - .toList(); + ICompilationUnit unit = JDTUtils.resolveCompilationUnit(textDocumentId.getUri()); + if (unit == null) { + return List.of(); + } + IJavaProject javaProject = unit.getJavaProject(); + + Collection cleanUpsToRun = new LinkedHashSet<>(cleanUpEnabled.size()); + for (String cleanUpId : cleanUpEnabled) { + ISimpleCleanUp cleanUp = cleanUps.get(cleanUpId); + if (cleanUp != null) { + cleanUpsToRun.add(cleanUp); + } else { + JavaLanguageServerPlugin.log(Status.warning("Not found cleanup id: " + cleanUpId)); + } + } if (cleanUpsToRun.isEmpty()) { return Collections.emptyList(); } diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/cleanup/CleanUpUtils.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/cleanup/CleanUpUtils.java index ac6f6e7ef0..107d5b3f75 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/cleanup/CleanUpUtils.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/cleanup/CleanUpUtils.java @@ -76,7 +76,7 @@ public static TextEdit getTextEditFromCleanUp(ISimpleCleanUp cleanUp, CleanUpCon TextEdit jdtEdit = cleanUpChange.getEdit(); return jdtEdit; } catch (CoreException e) { - JavaLanguageServerPlugin.logError(String.format("Failed to create text edit for clean up %s", cleanUp.getIdentifier())); + JavaLanguageServerPlugin.logError(String.format("Failed to create text edit for clean up %s", cleanUp.getIdentifiers().iterator().next())); } return null; } diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/cleanup/ISimpleCleanUp.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/cleanup/ISimpleCleanUp.java index 073bc5c6ec..583f6f262d 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/cleanup/ISimpleCleanUp.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/cleanup/ISimpleCleanUp.java @@ -12,6 +12,7 @@ *******************************************************************************/ package org.eclipse.jdt.ls.core.internal.cleanup; +import java.util.Collection; import java.util.List; import org.eclipse.core.runtime.CoreException; @@ -25,11 +26,11 @@ public interface ISimpleCleanUp { /** - * Returns the unique identifier for this clean up. + * Returns the possible identifiers for this clean up. * - * @return the unique identifier for this clean up + * @return the identifiers for this clean up */ - String getIdentifier(); + Collection getIdentifiers(); /** * Returns the cleanup fix for the given source file. diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/cleanup/InstanceofPatternMatch.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/cleanup/InstanceofPatternMatch.java index fb0f9010aa..7c0168d731 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/cleanup/InstanceofPatternMatch.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/cleanup/InstanceofPatternMatch.java @@ -19,6 +19,7 @@ import org.eclipse.jdt.core.dom.CompilationUnit; import org.eclipse.jdt.core.manipulation.CleanUpContextCore; import org.eclipse.jdt.core.manipulation.ICleanUpFixCore; +import org.eclipse.jdt.internal.corext.fix.CleanUpConstants; import org.eclipse.jdt.internal.corext.fix.PatternMatchingForInstanceofFixCore; /** @@ -27,8 +28,8 @@ public class InstanceofPatternMatch implements ISimpleCleanUp { @Override - public String getIdentifier() { - return "instanceofPatternMatch"; + public List getIdentifiers() { + return List.of("instanceofPatternMatch", CleanUpConstants.USE_PATTERN_MATCHING_FOR_INSTANCEOF); } @Override diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/cleanup/InvertEqualsCleanUp.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/cleanup/InvertEqualsCleanUp.java index 64d0db64c7..492cb9d460 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/cleanup/InvertEqualsCleanUp.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/cleanup/InvertEqualsCleanUp.java @@ -19,6 +19,7 @@ import org.eclipse.jdt.core.dom.CompilationUnit; import org.eclipse.jdt.core.manipulation.CleanUpContextCore; import org.eclipse.jdt.core.manipulation.ICleanUpFixCore; +import org.eclipse.jdt.internal.corext.fix.CleanUpConstants; import org.eclipse.jdt.internal.corext.fix.InvertEqualsFixCore; /** @@ -28,8 +29,8 @@ public class InvertEqualsCleanUp implements ISimpleCleanUp { @Override - public String getIdentifier() { - return "invertEquals"; + public List getIdentifiers() { + return List.of("invertEquals", CleanUpConstants.INVERT_EQUALS); } @Override diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/cleanup/LambdaExpressionAndMethodRefCleanUp.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/cleanup/LambdaExpressionAndMethodRefCleanUp.java index 63231c7f64..dc188ad67c 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/cleanup/LambdaExpressionAndMethodRefCleanUp.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/cleanup/LambdaExpressionAndMethodRefCleanUp.java @@ -12,6 +12,7 @@ *******************************************************************************/ package org.eclipse.jdt.ls.core.internal.cleanup; +import java.util.Collection; import java.util.Collections; import java.util.List; @@ -19,6 +20,7 @@ import org.eclipse.jdt.core.dom.CompilationUnit; import org.eclipse.jdt.core.manipulation.CleanUpContextCore; import org.eclipse.jdt.core.manipulation.ICleanUpFixCore; +import org.eclipse.jdt.internal.corext.fix.CleanUpConstants; import org.eclipse.jdt.internal.corext.fix.LambdaExpressionAndMethodRefFixCore; /** @@ -27,8 +29,8 @@ public class LambdaExpressionAndMethodRefCleanUp implements ISimpleCleanUp { @Override - public String getIdentifier() { - return "lambdaExpression"; + public Collection getIdentifiers() { + return List.of("lambdaExpression", CleanUpConstants.SIMPLIFY_LAMBDA_EXPRESSION_AND_METHOD_REF); } @Override diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/cleanup/LambdaExpressionCleanup.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/cleanup/LambdaExpressionCleanup.java index 6af014b395..6ede52dc1a 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/cleanup/LambdaExpressionCleanup.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/cleanup/LambdaExpressionCleanup.java @@ -12,6 +12,7 @@ *******************************************************************************/ package org.eclipse.jdt.ls.core.internal.cleanup; +import java.util.Collection; import java.util.Collections; import java.util.List; @@ -19,6 +20,7 @@ import org.eclipse.jdt.core.dom.CompilationUnit; import org.eclipse.jdt.core.manipulation.CleanUpContextCore; import org.eclipse.jdt.core.manipulation.ICleanUpFixCore; +import org.eclipse.jdt.internal.corext.fix.CleanUpConstants; import org.eclipse.jdt.internal.corext.fix.LambdaExpressionsFixCore; /** @@ -27,8 +29,8 @@ public class LambdaExpressionCleanup implements ISimpleCleanUp { @Override - public String getIdentifier() { - return "lambdaExpressionFromAnonymousClass"; + public Collection getIdentifiers() { + return List.of("lambdaExpressionFromAnonymousClass", CleanUpConstants.USE_LAMBDA); } @Override diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/cleanup/MemberAccessUsesThisCleanUp.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/cleanup/MemberAccessUsesThisCleanUp.java index 0a760bcbd1..82e56452dd 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/cleanup/MemberAccessUsesThisCleanUp.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/cleanup/MemberAccessUsesThisCleanUp.java @@ -12,6 +12,7 @@ *******************************************************************************/ package org.eclipse.jdt.ls.core.internal.cleanup; +import java.util.Collection; import java.util.Collections; import java.util.List; @@ -28,8 +29,8 @@ public class MemberAccessUsesThisCleanUp implements ISimpleCleanUp { @Override - public String getIdentifier() { - return "qualifyMembers"; + public Collection getIdentifiers() { + return List.of("qualifyMembers"); } @Override diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/cleanup/StaticAccessUsesClassNameCleanUp.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/cleanup/StaticAccessUsesClassNameCleanUp.java index d6e2296fb0..8bb81a37a4 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/cleanup/StaticAccessUsesClassNameCleanUp.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/cleanup/StaticAccessUsesClassNameCleanUp.java @@ -12,6 +12,7 @@ *******************************************************************************/ package org.eclipse.jdt.ls.core.internal.cleanup; +import java.util.Collection; import java.util.Collections; import java.util.List; @@ -28,8 +29,8 @@ public class StaticAccessUsesClassNameCleanUp implements ISimpleCleanUp { @Override - public String getIdentifier() { - return "qualifyStaticMembers"; + public Collection getIdentifiers() { + return List.of("qualifyStaticMembers"); } @Override diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/cleanup/StringConcatToTextBlockCleanUp.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/cleanup/StringConcatToTextBlockCleanUp.java index d68cb414b7..860265af55 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/cleanup/StringConcatToTextBlockCleanUp.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/cleanup/StringConcatToTextBlockCleanUp.java @@ -12,6 +12,7 @@ *******************************************************************************/ package org.eclipse.jdt.ls.core.internal.cleanup; +import java.util.Collection; import java.util.Collections; import java.util.List; @@ -19,6 +20,7 @@ import org.eclipse.jdt.core.dom.CompilationUnit; import org.eclipse.jdt.core.manipulation.CleanUpContextCore; import org.eclipse.jdt.core.manipulation.ICleanUpFixCore; +import org.eclipse.jdt.internal.corext.fix.CleanUpConstants; import org.eclipse.jdt.internal.corext.fix.StringConcatToTextBlockFixCore; /** @@ -27,8 +29,8 @@ public class StringConcatToTextBlockCleanUp implements ISimpleCleanUp { @Override - public String getIdentifier() { - return "stringConcatToTextBlock"; + public Collection getIdentifiers() { + return List.of("stringConcatToTextBlock", CleanUpConstants.STRINGCONCAT_TO_TEXTBLOCK); } @Override diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/cleanup/SwitchExpressionCleanup.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/cleanup/SwitchExpressionCleanup.java index 8a09e29e52..7163e60594 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/cleanup/SwitchExpressionCleanup.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/cleanup/SwitchExpressionCleanup.java @@ -12,6 +12,7 @@ *******************************************************************************/ package org.eclipse.jdt.ls.core.internal.cleanup; +import java.util.Collection; import java.util.Collections; import java.util.List; @@ -19,6 +20,7 @@ import org.eclipse.jdt.core.dom.CompilationUnit; import org.eclipse.jdt.core.manipulation.CleanUpContextCore; import org.eclipse.jdt.core.manipulation.ICleanUpFixCore; +import org.eclipse.jdt.internal.corext.fix.CleanUpConstants; import org.eclipse.jdt.internal.corext.fix.SwitchExpressionsFixCore; /** @@ -27,8 +29,8 @@ public class SwitchExpressionCleanup implements ISimpleCleanUp { @Override - public String getIdentifier() { - return "switchExpression"; + public Collection getIdentifiers() { + return List.of("switchExpression", CleanUpConstants.CONTROL_STATEMENTS_CONVERT_TO_SWITCH_EXPRESSIONS); } @Override diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/cleanup/TryWithResourceCleanUp.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/cleanup/TryWithResourceCleanUp.java index 8a0ea5564c..9f88745a48 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/cleanup/TryWithResourceCleanUp.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/cleanup/TryWithResourceCleanUp.java @@ -12,6 +12,7 @@ *******************************************************************************/ package org.eclipse.jdt.ls.core.internal.cleanup; +import java.util.Collection; import java.util.Collections; import java.util.List; @@ -19,6 +20,7 @@ import org.eclipse.jdt.core.dom.CompilationUnit; import org.eclipse.jdt.core.manipulation.CleanUpContextCore; import org.eclipse.jdt.core.manipulation.ICleanUpFixCore; +import org.eclipse.jdt.internal.corext.fix.CleanUpConstants; import org.eclipse.jdt.internal.corext.fix.TryWithResourceFixCore; /** @@ -28,8 +30,8 @@ public class TryWithResourceCleanUp implements ISimpleCleanUp { @Override - public String getIdentifier() { - return "tryWithResource"; + public Collection getIdentifiers() { + return List.of("tryWithResource", CleanUpConstants.TRY_WITH_RESOURCE); } @Override diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/cleanup/VariableDeclarationFixCleanup.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/cleanup/VariableDeclarationFixCleanup.java index 9d47a9951b..cc06dd7b5d 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/cleanup/VariableDeclarationFixCleanup.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/cleanup/VariableDeclarationFixCleanup.java @@ -12,6 +12,7 @@ *******************************************************************************/ package org.eclipse.jdt.ls.core.internal.cleanup; +import java.util.Collection; import java.util.Collections; import java.util.List; @@ -19,6 +20,7 @@ import org.eclipse.jdt.core.dom.CompilationUnit; import org.eclipse.jdt.core.manipulation.CleanUpContextCore; import org.eclipse.jdt.core.manipulation.ICleanUpFixCore; +import org.eclipse.jdt.internal.corext.fix.CleanUpConstants; import org.eclipse.jdt.internal.corext.fix.VariableDeclarationFixCore; /** @@ -27,8 +29,8 @@ public class VariableDeclarationFixCleanup implements ISimpleCleanUp { @Override - public String getIdentifier() { - return "addFinalModifier"; + public Collection getIdentifiers() { + return List.of("addFinalModifier", CleanUpConstants.VARIABLE_DECLARATIONS_USE_FINAL); } @Override diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/SaveActionHandler.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/SaveActionHandler.java index 00e760dd76..c25dd1ccc2 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/SaveActionHandler.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/SaveActionHandler.java @@ -13,11 +13,22 @@ package org.eclipse.jdt.ls.core.internal.handlers; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; import java.util.Collections; +import java.util.LinkedHashSet; import java.util.List; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.ProjectScope; import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.preferences.IEclipsePreferences; +import org.eclipse.jdt.core.ICompilationUnit; +import org.eclipse.jdt.core.IJavaProject; +import org.eclipse.jdt.core.JavaModelException; +import org.eclipse.jdt.internal.corext.fix.CleanUpConstants; import org.eclipse.jdt.ls.core.internal.JDTUtils; +import org.eclipse.jdt.ls.core.internal.JavaLanguageServerPlugin; import org.eclipse.jdt.ls.core.internal.ResourceUtils; import org.eclipse.jdt.ls.core.internal.cleanup.CleanUpRegistry; import org.eclipse.jdt.ls.core.internal.commands.OrganizeImportsCommand; @@ -26,6 +37,7 @@ import org.eclipse.lsp4j.TextEdit; import org.eclipse.lsp4j.WillSaveTextDocumentParams; import org.eclipse.lsp4j.WorkspaceEdit; +import org.osgi.service.prefs.BackingStoreException; public class SaveActionHandler { @@ -48,17 +60,55 @@ public List willSaveWaitUntil(WillSaveTextDocumentParams params, IProg String documentUri = params.getTextDocument().getUri(); - if (preferenceManager.getPreferences().isJavaSaveActionsOrganizeImportsEnabled()) { + Preferences preferences = preferenceManager.getPreferences(); + IEclipsePreferences jdtUiPreferences = getJdtUiProjectPreferences(documentUri); + if (preferences.isJavaSaveActionsOrganizeImportsEnabled() || + (jdtUiPreferences != null && jdtUiPreferences.getBoolean("sp_" + CleanUpConstants.ORGANIZE_IMPORTS, false))) { edit.addAll(handleSaveActionOrganizeImports(documentUri, monitor)); } - Preferences preferences = preferenceManager.getPreferences(); - List cleanUpEdits = cleanUpRegistry.getEditsForAllActiveCleanUps(params.getTextDocument(), preferences.getCleanUpActionsOnSave(), monitor); + LinkedHashSet cleanUpIds = new LinkedHashSet<>(); + cleanUpIds.addAll(preferences.getCleanUpActionsOnSave()); + cleanUpIds.addAll(getCleanupsFromJDTUIPreferences(jdtUiPreferences)); + List cleanUpEdits = cleanUpRegistry.getEditsForAllActiveCleanUps(params.getTextDocument(), new ArrayList<>(cleanUpIds), monitor); edit.addAll(cleanUpEdits); - return edit; } + private Collection getCleanupsFromJDTUIPreferences(IEclipsePreferences jdtUIPrefs) { + if (jdtUIPrefs == null) { + return List.of(); + } + try { + if (jdtUIPrefs.getBoolean("editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup", false)) { // cleanup on save enabled ( AbstractSaveParticipantPreferenceConfiguration.isEnabled() ) + return Arrays.stream(jdtUIPrefs.keys()) // + .filter(key -> key.startsWith("sp_")) // save participant ( CleanUpPreferenceUtil.SAVE_PARTICIPANT_KEY_PREFIX ) + .filter(key -> jdtUIPrefs.getBoolean(key, false)) // enabled ones + .map(key -> key.substring(3)) // remove "sp_" prefix + .toList(); + } + } catch (BackingStoreException e) { + JavaLanguageServerPlugin.logException(e); + } + return List.of(); + } + + private IEclipsePreferences getJdtUiProjectPreferences(String documentUri) { + ICompilationUnit compilationUnit = JDTUtils.resolveCompilationUnit(documentUri); + if (compilationUnit != null) { + IJavaProject javaProject = compilationUnit.getJavaProject(); + try { + if (javaProject.getCorrespondingResource() instanceof IProject project) { + ProjectScope scope = new ProjectScope(project); + return scope.getNode(JavaLanguageServerPlugin.JDT_UI_PLUGIN); + } + } catch (JavaModelException e) { + JavaLanguageServerPlugin.log(e); + } + } + return null; + } + private List handleSaveActionOrganizeImports(String documentUri, IProgressMonitor monitor) { String uri = ResourceUtils.fixURI(JDTUtils.toURI(documentUri)); if (monitor.isCanceled()) {