From 26a0dbe910f8682da2de51f918e2592971d4015a Mon Sep 17 00:00:00 2001 From: Nicolay Mitropolsky Date: Tue, 23 Jan 2018 11:15:37 +0300 Subject: [PATCH] 181: KotlinElementActionsFactory: makes elements `public` by removing other visibility modifiers --- .../KotlinElementActionsFactory.kt.181 | 14 ++-- .../CommonIntentionActionsTest.kt.181 | 69 ++++++++++++++++++- 2 files changed, 78 insertions(+), 5 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/crossLanguage/KotlinElementActionsFactory.kt.181 b/idea/src/org/jetbrains/kotlin/idea/quickfix/crossLanguage/KotlinElementActionsFactory.kt.181 index b2d7d737527..1b22241b547 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/crossLanguage/KotlinElementActionsFactory.kt.181 +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/crossLanguage/KotlinElementActionsFactory.kt.181 @@ -59,6 +59,7 @@ import org.jetbrains.kotlin.load.java.structure.impl.JavaTypeParameterImpl import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.psi.psiUtil.visibilityModifierType import org.jetbrains.kotlin.resolve.annotations.JVM_FIELD_ANNOTATION_FQ_NAME import org.jetbrains.kotlin.resolve.annotations.JVM_STATIC_ANNOTATION_FQ_NAME import org.jetbrains.kotlin.types.KotlinType @@ -244,10 +245,15 @@ class KotlinElementActionsFactory : JvmElementActionsFactory() { val modifier = request.modifier val shouldPresent = request.shouldPresent - val (kToken, shouldPresentMapped) = if (JvmModifier.FINAL == modifier) - KtTokens.OPEN_KEYWORD to !shouldPresent - else - javaPsiModifiersMapping[modifier] to shouldPresent + //TODO: make similar to `createAddMethodActions` + val (kToken, shouldPresentMapped) = when { + modifier == JvmModifier.FINAL -> KtTokens.OPEN_KEYWORD to !shouldPresent + modifier == JvmModifier.PUBLIC && shouldPresent -> + kModifierOwner.visibilityModifierType() + ?.takeIf { it != KtTokens.DEFAULT_VISIBILITY_KEYWORD } + ?.let { it to false } ?: return emptyList() + else -> javaPsiModifiersMapping[modifier] to shouldPresent + } if (kToken == null) return emptyList() val action = if (shouldPresentMapped) diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/CommonIntentionActionsTest.kt.181 b/idea/tests/org/jetbrains/kotlin/idea/quickfix/CommonIntentionActionsTest.kt.181 index ba23b513368..3ed1638d936 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/CommonIntentionActionsTest.kt.181 +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/CommonIntentionActionsTest.kt.181 @@ -111,13 +111,80 @@ class CommonIntentionActionsTest : LightPlatformCodeInsightFixtureTestCase() { """.trim(), true) } + fun testMakePrivatePublic() { + myFixture.configureByText( + "foo.kt", """class Foo { + | private fun bar(){} + |}""".trim().trimMargin() + ) + + myFixture.launchAction( + createModifierActions( + myFixture.atCaret(), MemberRequest.Modifier(JvmModifier.PUBLIC, true) + ).findWithText("Remove 'private' modifier") + ) + myFixture.checkResult( + """class Foo { + | fun bar(){} + |}""".trim().trimMargin(), true + ) + } + + fun testMakeProtectedPublic() { + myFixture.configureByText( + "foo.kt", """open class Foo { + | protected fun bar(){} + |}""".trim().trimMargin() + ) + + myFixture.launchAction( + createModifierActions( + myFixture.atCaret(), MemberRequest.Modifier(JvmModifier.PUBLIC, true) + ).findWithText("Remove 'protected' modifier") + ) + myFixture.checkResult( + """open class Foo { + | fun bar(){} + |}""".trim().trimMargin(), true + ) + } + + fun testMakeInternalPublic() { + myFixture.configureByText( + "foo.kt", """class Foo { + | internal fun bar(){} + |}""".trim().trimMargin() + ) + + myFixture.launchAction( + createModifierActions( + myFixture.atCaret(), MemberRequest.Modifier(JvmModifier.PUBLIC, true) + ).findWithText("Remove 'internal' modifier") + ) + myFixture.checkResult( + """class Foo { + | fun bar(){} + |}""".trim().trimMargin(), true + ) + } + + fun testDontMakePublicPublic() { + myFixture.configureByText( + "foo.kt", """class Foo { + | fun bar(){} + |}""".trim().trimMargin() + ) + + assertEmpty(createModifierActions(myFixture.atCaret(), MemberRequest.Modifier(JvmModifier.PUBLIC, true))) + } + fun testDontMakeFunInObjectsOpen() { myFixture.configureByText("foo.kt", """ object Foo { fun bar(){} } """.trim()) - Assert.assertTrue(createModifierActions(myFixture.atCaret(), MemberRequest.Modifier(JvmModifier.FINAL, false)).isEmpty()) + assertEmpty(createModifierActions(myFixture.atCaret(), MemberRequest.Modifier(JvmModifier.FINAL, false))) } fun testAddVoidVoidMethod() {