diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddExceptionToThrowsFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddExceptionToThrowsFix.java index 1867a7000ec3..4487a1d90040 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddExceptionToThrowsFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddExceptionToThrowsFix.java @@ -135,8 +135,8 @@ public final class AddExceptionToThrowsFix extends PsiBasedModCommandAction method instanceof PsiCompiledElement); + static boolean isAnyOfTheMethodsUnmodifiable(@NotNull PsiMethod targetMethod) { + return ContainerUtil.or(getSuperMethods(targetMethod), method -> method instanceof PsiCompiledElement || method instanceof SyntheticElement); } private static @Nullable PsiMethod collectExceptions(Set unhandled, PsiElement element) { diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddRuntimeExceptionToThrowsAction.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddRuntimeExceptionToThrowsAction.java index 904b1270f84e..a5d4e8e483f6 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddRuntimeExceptionToThrowsAction.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddRuntimeExceptionToThrowsAction.java @@ -37,7 +37,7 @@ public final class AddRuntimeExceptionToThrowsAction implements ModCommandAction if (method == null) return nop(); ModCommand command = AddExceptionToThrowsFix.addExceptionsToThrowsList(context.project(), method, Collections.singleton(aClass), myProcessHierarchy); - if (command == null && !AddExceptionToThrowsFix.isAnyOfTheMethodsInCompiledClass(method)) { + if (command == null && !AddExceptionToThrowsFix.isAnyOfTheMethodsUnmodifiable(method)) { return chooseAction(QuickFixBundle.message("add.runtime.exception.to.throws.header"), new AddRuntimeExceptionToThrowsAction(ThreeState.YES), new AddRuntimeExceptionToThrowsAction(ThreeState.NO)); diff --git a/plugins/lombok/src/test/java/com/intellij/java/lomboktest/LombokAddRuntimeExceptionToThrowsActionTest.kt b/plugins/lombok/src/test/java/com/intellij/java/lomboktest/LombokAddRuntimeExceptionToThrowsActionTest.kt new file mode 100644 index 000000000000..50318f0e211a --- /dev/null +++ b/plugins/lombok/src/test/java/com/intellij/java/lomboktest/LombokAddRuntimeExceptionToThrowsActionTest.kt @@ -0,0 +1,25 @@ +package com.intellij.java.lomboktest + +import com.intellij.codeInsight.daemon.QuickFixBundle +import com.intellij.openapi.command.executeCommand +import com.intellij.refactoring.suggested.LightJavaCodeInsightFixtureTestCaseWithUtils +import com.intellij.testFramework.LightProjectDescriptor +import de.plushnikov.intellij.plugin.LombokTestUtil.LOMBOK_DESCRIPTOR + +class LombokAddRuntimeExceptionToThrowsActionTest: LightJavaCodeInsightFixtureTestCaseWithUtils() { + override fun getProjectDescriptor(): LightProjectDescriptor = LOMBOK_DESCRIPTOR + + override fun getBasePath(): String = "community/plugins/lombok/testData/intention/addExceptionToThrows" + + + fun testOverridingSyntheticElement() = doTest() + + private fun doTest() { + val name = getTestName(false) + myFixture.configureByFile("before$name.java") + val intention = myFixture.availableIntentions.singleOrNull { it.familyName == QuickFixBundle.message("add.runtime.exception.to.throws.family") } + assertNotNull(intention) + executeCommand { intention?.invoke(project, editor, file) } + myFixture.checkResultByFile("after$name.java") + } +} diff --git a/plugins/lombok/testData/intention/addExceptionToThrows/afterOverridingSyntheticElement.java b/plugins/lombok/testData/intention/addExceptionToThrows/afterOverridingSyntheticElement.java new file mode 100644 index 000000000000..e7bd8280c1b8 --- /dev/null +++ b/plugins/lombok/testData/intention/addExceptionToThrows/afterOverridingSyntheticElement.java @@ -0,0 +1,20 @@ +import lombok.Getter; + +public class A { + @Getter + private String s; + + private static class B extends A { + @Override + public String getS() { + throw new RuntimeException(); + } + } + + private static class C extends B { + @Override + public String getS() throws RuntimeException { + throw new RuntimeException(); + } + } +} \ No newline at end of file diff --git a/plugins/lombok/testData/intention/addExceptionToThrows/beforeOverridingSyntheticElement.java b/plugins/lombok/testData/intention/addExceptionToThrows/beforeOverridingSyntheticElement.java new file mode 100644 index 000000000000..da0a1f85b22b --- /dev/null +++ b/plugins/lombok/testData/intention/addExceptionToThrows/beforeOverridingSyntheticElement.java @@ -0,0 +1,20 @@ +import lombok.Getter; + +public class A { + @Getter + private String s; + + private static class B extends A { + @Override + public String getS() { + throw new RuntimeException(); + } + } + + private static class C extends B { + @Override + public String getS() { + throw new RuntimeException(); + } + } +} \ No newline at end of file