diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/AddModifierFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/AddModifierFix.kt index d47a0790af9..aca34772e43 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/AddModifierFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/AddModifierFix.kt @@ -115,6 +115,16 @@ open class AddModifierFix( if (parentClassOrObject is KtEnumEntry) return null } } + if (modifier == INNER_KEYWORD) { + if (modifierListOwner is KtObjectDeclaration) return null + if (modifierListOwner is KtClass) { + if (modifierListOwner.isInterface() || + modifierListOwner.isSealed() || + modifierListOwner.isEnum() || + modifierListOwner.isData() || + modifierListOwner.isAnnotation()) return null + } + } return AddModifierFix(modifierListOwner, modifier) } diff --git a/idea/testData/quickfix/modifiers/nestedAbstractClass.kt b/idea/testData/quickfix/modifiers/nestedAbstractClass.kt new file mode 100644 index 00000000000..12e31ae06ab --- /dev/null +++ b/idea/testData/quickfix/modifiers/nestedAbstractClass.kt @@ -0,0 +1,6 @@ +// "Add 'inner' modifier" "true" +class A() { + inner class B() { + abstract class C + } +} diff --git a/idea/testData/quickfix/modifiers/nestedAbstractClass.kt.after b/idea/testData/quickfix/modifiers/nestedAbstractClass.kt.after new file mode 100644 index 00000000000..0525a8c1f2f --- /dev/null +++ b/idea/testData/quickfix/modifiers/nestedAbstractClass.kt.after @@ -0,0 +1,6 @@ +// "Add 'inner' modifier" "true" +class A() { + inner class B() { + abstract inner class C + } +} diff --git a/idea/testData/quickfix/modifiers/nestedAnnotationClass.kt b/idea/testData/quickfix/modifiers/nestedAnnotationClass.kt new file mode 100644 index 00000000000..32d1c1e4ca9 --- /dev/null +++ b/idea/testData/quickfix/modifiers/nestedAnnotationClass.kt @@ -0,0 +1,7 @@ +// "Add 'inner' modifier" "false" +// ERROR: Annotation class is not allowed here +class A() { + inner class B() { + annotation class C + } +} diff --git a/idea/testData/quickfix/modifiers/nestedDataClass.kt b/idea/testData/quickfix/modifiers/nestedDataClass.kt new file mode 100644 index 00000000000..eb8b2b4fe0b --- /dev/null +++ b/idea/testData/quickfix/modifiers/nestedDataClass.kt @@ -0,0 +1,9 @@ +// "Add 'inner' modifier" "false" +// ACTION: Create test +// ERROR: Class is not allowed here +// ERROR: Data class must have at least one primary constructor parameter +class A() { + inner class B() { + data class C + } +} diff --git a/idea/testData/quickfix/modifiers/nestedEnumClass.kt b/idea/testData/quickfix/modifiers/nestedEnumClass.kt new file mode 100644 index 00000000000..a4994f62fbe --- /dev/null +++ b/idea/testData/quickfix/modifiers/nestedEnumClass.kt @@ -0,0 +1,9 @@ +// "Add 'inner' modifier" "false" +// ACTION: Convert to sealed class +// ACTION: Create test +// ERROR: Enum class is not allowed here +class A() { + inner class B() { + enum class C + } +} diff --git a/idea/testData/quickfix/modifiers/nestedInterface.kt b/idea/testData/quickfix/modifiers/nestedInterface.kt new file mode 100644 index 00000000000..869025b6950 --- /dev/null +++ b/idea/testData/quickfix/modifiers/nestedInterface.kt @@ -0,0 +1,8 @@ +// "Add 'inner' modifier" "false" +// ACTION: Implement interface +// ERROR: Interface is not allowed here +class A() { + inner class B() { + interface C + } +} diff --git a/idea/testData/quickfix/modifiers/nestedObject.kt b/idea/testData/quickfix/modifiers/nestedObject.kt new file mode 100644 index 00000000000..5472f4809ba --- /dev/null +++ b/idea/testData/quickfix/modifiers/nestedObject.kt @@ -0,0 +1,8 @@ +// "Add 'inner' modifier" "false" +// ACTION: Create test +// ERROR: Object is not allowed here +class A() { + inner class B() { + object C + } +} diff --git a/idea/testData/quickfix/modifiers/nestedSealedClass.kt b/idea/testData/quickfix/modifiers/nestedSealedClass.kt new file mode 100644 index 00000000000..e3fe905d0b8 --- /dev/null +++ b/idea/testData/quickfix/modifiers/nestedSealedClass.kt @@ -0,0 +1,10 @@ +// "Add 'inner' modifier" "false" +// ACTION: Convert to enum class +// ACTION: Create test +// ACTION: Implement sealed class +// ERROR: Class is not allowed here +class A() { + inner class B() { + sealed class C + } +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index 0f98ba25b4b..982ec73baca 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -7640,12 +7640,54 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { doTest(fileName); } + @TestMetadata("nestedAbstractClass.kt") + public void testNestedAbstractClass() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/modifiers/nestedAbstractClass.kt"); + doTest(fileName); + } + + @TestMetadata("nestedAnnotationClass.kt") + public void testNestedAnnotationClass() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/modifiers/nestedAnnotationClass.kt"); + doTest(fileName); + } + @TestMetadata("nestedClassNotAllowed.kt") public void testNestedClassNotAllowed() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/modifiers/nestedClassNotAllowed.kt"); doTest(fileName); } + @TestMetadata("nestedDataClass.kt") + public void testNestedDataClass() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/modifiers/nestedDataClass.kt"); + doTest(fileName); + } + + @TestMetadata("nestedEnumClass.kt") + public void testNestedEnumClass() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/modifiers/nestedEnumClass.kt"); + doTest(fileName); + } + + @TestMetadata("nestedInterface.kt") + public void testNestedInterface() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/modifiers/nestedInterface.kt"); + doTest(fileName); + } + + @TestMetadata("nestedObject.kt") + public void testNestedObject() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/modifiers/nestedObject.kt"); + doTest(fileName); + } + + @TestMetadata("nestedSealedClass.kt") + public void testNestedSealedClass() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/modifiers/nestedSealedClass.kt"); + doTest(fileName); + } + @TestMetadata("noAbstractForAnonymousObject.kt") public void testNoAbstractForAnonymousObject() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/modifiers/noAbstractForAnonymousObject.kt");