From b036cda0151959ef59003569388e95b3f02b8a5a Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Wed, 10 Dec 2025 16:00:47 +0100 Subject: [PATCH] IDEA-382795 [java]: fix "implement methods" quick-fix in enum constant initializer GitOrigin-RevId: 1708354a1be7a00777c0fdae76a6fbd9fff926c0 --- .../impl/quickfix/ImplementMethodsFix.java | 22 ++++------ ...afterEnumConstantWithClassInitializer.java | 44 +++++++++++++++++++ ...eforeEnumConstantWithClassInitializer.java | 39 ++++++++++++++++ 3 files changed, 92 insertions(+), 13 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/implementMethods/afterEnumConstantWithClassInitializer.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/implementMethods/beforeEnumConstantWithClassInitializer.java diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ImplementMethodsFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ImplementMethodsFix.java index ce34b4d15a3d..9251f9f24f5b 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ImplementMethodsFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ImplementMethodsFix.java @@ -1,4 +1,4 @@ -// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.codeInsight.daemon.impl.quickfix; import com.intellij.codeInsight.FileModificationService; @@ -51,32 +51,28 @@ public class ImplementMethodsFix extends LocalQuickFixAndIntentionActionOnPsiEle @Override public void invoke(@NotNull Project project, @NotNull PsiFile psiFile, - final @Nullable Editor editor, + @Nullable Editor editor, @NotNull PsiElement startElement, @NotNull PsiElement endElement) { - final PsiElement myPsiElement = startElement; - - if (editor == null || !FileModificationService.getInstance().prepareFileForWrite(myPsiElement.getContainingFile())) return; - if (myPsiElement instanceof PsiEnumConstant) { - final boolean hasClassInitializer = ((PsiEnumConstant)myPsiElement).getInitializingClass() != null; - chooseMethodsToImplement(editor, startElement, - ((PsiEnumConstant)myPsiElement).getContainingClass(), - hasClassInitializer, chooser -> { + if (editor == null || !FileModificationService.getInstance().prepareFileForWrite(startElement.getContainingFile())) return; + if (startElement instanceof PsiEnumConstant constant) { + final PsiEnumConstantInitializer aClass = constant.getInitializingClass(); + final boolean hasInitializer = aClass != null; + chooseMethodsToImplement(editor, startElement, hasInitializer ? aClass : constant.getContainingClass(), hasInitializer , chooser -> { if (chooser == null) return; final List selectedElements = chooser.getSelectedElements(); if (selectedElements == null || selectedElements.isEmpty()) return; WriteCommandAction.writeCommandAction(project, psiFile).run(() -> { - final PsiClass psiClass = ((PsiEnumConstant)myPsiElement).getOrCreateInitializingClass(); + final PsiClass psiClass = constant.getOrCreateInitializingClass(); OverrideImplementUtil.overrideOrImplementMethodsInRightPlace(editor, psiClass, selectedElements, chooser.getOptions()); }); }); } else { - OverrideImplementUtil.chooseAndImplementMethods(project, editor, (PsiClass)myPsiElement); + OverrideImplementUtil.chooseAndImplementMethods(project, editor, (PsiClass)startElement); } - } @Override diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/implementMethods/afterEnumConstantWithClassInitializer.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/implementMethods/afterEnumConstantWithClassInitializer.java new file mode 100644 index 000000000000..259c9d709da3 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/implementMethods/afterEnumConstantWithClassInitializer.java @@ -0,0 +1,44 @@ +// "Implement methods" "true-preview" +class Container { + + private int brushColor = 0x1; + + private enum Content { + Value1 { + @Override + public int method1(Container e) { + return 0; + } + }, + Value2 { + @Override + public int method1(Container e) { + return 0xff000000; + } + }, + Value3 { + @Override + public int method1(Container e) { + return 0; + } + + @Override + public void method2( + Container iconEditor, + Object g + ) { + + } + }; + + public abstract int method1(Container e); + + public void method2( + Container iconEditor, + Object g + ) { + + } + } + +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/implementMethods/beforeEnumConstantWithClassInitializer.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/implementMethods/beforeEnumConstantWithClassInitializer.java new file mode 100644 index 000000000000..e11e2fb64f92 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/implementMethods/beforeEnumConstantWithClassInitializer.java @@ -0,0 +1,39 @@ +// "Implement methods" "true-preview" +class Container { + + private int brushColor = 0x1; + + private enum Content { + Value1 { + @Override + public int method1(Container e) { + return 0; + } + }, + Value2 { + @Override + public int method1(Container e) { + return 0xff000000; + } + }, + Value3 { + @Override + public void method2( + Container iconEditor, + Object g + ) { + + } + }; + + public abstract int method1(Container e); + + public void method2( + Container iconEditor, + Object g + ) { + + } + } + +} \ No newline at end of file