From 873ef84318e9b7039c613ae48d1a4b34dc3e69f1 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Thu, 26 Mar 2026 15:52:19 +0100 Subject: [PATCH] IDEA-387535 [java]: don't remove modifiers from members when removing final modifier from class GitOrigin-RevId: 38b04d3e19bfcc6aa6f9a94dd3ca0138176a5138 --- .../daemon/impl/quickfix/ModifierFix.java | 54 +++++++++---------- .../modifier/afterMakeFinalClassNotFinal.java | 9 ++++ .../beforeMakeFinalClassNotFinal.java | 9 ++++ 3 files changed, 45 insertions(+), 27 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/modifier/afterMakeFinalClassNotFinal.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/modifier/beforeMakeFinalClassNotFinal.java diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ModifierFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ModifierFix.java index 92a0a837383d..d99d9b0a9327 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ModifierFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ModifierFix.java @@ -206,37 +206,37 @@ public class ModifierFix extends PsiBasedModCommandAction modifierList = owner.getModifierList(); } if (modifierList == null) return; - if (myShouldHave && owner instanceof PsiMethod method) { - if (PsiModifier.ABSTRACT.equals(myModifier)) { - final PsiClass aClass = method.getContainingClass(); - if (aClass != null && !aClass.hasModifierProperty(PsiModifier.ABSTRACT)) { - PsiModifierList classModifierList = aClass.getModifierList(); - if (classModifierList != null) { - changeModifierList(classModifierList); + if (myShouldHave) { + if (owner instanceof PsiMethod method) { + if (PsiModifier.ABSTRACT.equals(myModifier)) { + final PsiClass aClass = method.getContainingClass(); + if (aClass != null && !aClass.hasModifierProperty(PsiModifier.ABSTRACT)) { + PsiModifierList classModifierList = aClass.getModifierList(); + if (classModifierList != null) { + changeModifierList(classModifierList); + } + } + } + else if (PsiModifier.PUBLIC.equals(myModifier) && method.getBody() != null && !method.hasModifierProperty(PsiModifier.STATIC)) { + PsiClass containingClass = method.getContainingClass(); + if (containingClass != null && containingClass.isInterface()) { + modifierList.setModifierProperty(PsiModifier.DEFAULT, true); + } + } + else if (PsiModifier.STATIC.equals(myModifier)) { + if (method.hasModifierProperty(PsiModifier.DEFAULT)) { + modifierList.setModifierProperty(PsiModifier.DEFAULT, false); + } + else if (method.hasModifierProperty(PsiModifier.ABSTRACT)) { + PsiUtil.setModifierProperty(method, PsiModifier.ABSTRACT, false); + if (method.getBody() == null) CreateFromUsageUtils.setupMethodBody(method); } } } - else if (PsiModifier.PUBLIC.equals(myModifier) && - method.getBody() != null && - !method.hasModifierProperty(PsiModifier.STATIC)) { - PsiClass containingClass = method.getContainingClass(); - if (containingClass != null && containingClass.isInterface()) { - modifierList.setModifierProperty(PsiModifier.DEFAULT, true); - } + else if (PsiModifier.FINAL.equals(myModifier) && owner instanceof PsiClass aClass) { + adjustVisibilityOfProtectedMembers(aClass); + removeFinalModifierFromMethods(aClass); } - else if (PsiModifier.STATIC.equals(myModifier)) { - if (method.hasModifierProperty(PsiModifier.DEFAULT)) { - modifierList.setModifierProperty(PsiModifier.DEFAULT, false); - } - else if (method.hasModifierProperty(PsiModifier.ABSTRACT)) { - PsiUtil.setModifierProperty(method, PsiModifier.ABSTRACT, false); - if (method.getBody() == null) CreateFromUsageUtils.setupMethodBody(method); - } - } - } - else if (PsiModifier.FINAL.equals(myModifier) && owner instanceof PsiClass aClass) { - adjustVisibilityOfProtectedMembers(aClass); - removeFinalModifierFromMethods(aClass); } changeModifierList(modifierList); } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/modifier/afterMakeFinalClassNotFinal.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/modifier/afterMakeFinalClassNotFinal.java new file mode 100644 index 000000000000..4eb85cea4885 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/modifier/afterMakeFinalClassNotFinal.java @@ -0,0 +1,9 @@ +// "Make 'Magnanimous' not final" "true-preview" +class Magnanimous { + + protected Magnanimous() { + } + + final void f() {} +} +class Steadfast extends Magnanimous {} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/modifier/beforeMakeFinalClassNotFinal.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/modifier/beforeMakeFinalClassNotFinal.java new file mode 100644 index 000000000000..bcf6d0795248 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/modifier/beforeMakeFinalClassNotFinal.java @@ -0,0 +1,9 @@ +// "Make 'Magnanimous' not final" "true-preview" +final class Magnanimous { + + protected Magnanimous() { + } + + final void f() {} +} +class Steadfast extends Magnanimous {} \ No newline at end of file