From 80e41c5298ec667634d30ae65c8f621e707ec833 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Fri, 8 Apr 2016 16:49:17 +0300 Subject: [PATCH] KT-11806: increase visibility quick fix: private / internal -> public #KT-11806 Fixed --- .../kotlin/idea/core/psiModificationUtils.kt | 14 ++++++++------ .../idea/quickfix/IncreaseVisibilityFix.kt | 16 ++++++++++------ ...verriddenProtectedMemberToPublicSingleFile.kt | 9 +++++++++ ...denProtectedMemberToPublicSingleFile.kt.after | 9 +++++++++ .../protectedMemberToPublicSingleFile.kt | 6 ++++++ .../protectedMemberToPublicSingleFile.kt.after | 6 ++++++ .../idea/quickfix/QuickFixTestGenerated.java | 12 ++++++++++++ 7 files changed, 60 insertions(+), 12 deletions(-) create mode 100644 idea/testData/quickfix/increaseVisibility/overriddenProtectedMemberToPublicSingleFile.kt create mode 100644 idea/testData/quickfix/increaseVisibility/overriddenProtectedMemberToPublicSingleFile.kt.after create mode 100644 idea/testData/quickfix/increaseVisibility/protectedMemberToPublicSingleFile.kt create mode 100644 idea/testData/quickfix/increaseVisibility/protectedMemberToPublicSingleFile.kt.after diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/psiModificationUtils.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/psiModificationUtils.kt index a7219e3a1d2..7c8985e62eb 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/psiModificationUtils.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/psiModificationUtils.kt @@ -162,16 +162,18 @@ fun PsiElement.deleteSingle() { fun KtClass.getOrCreateCompanionObject() : KtObjectDeclaration { getCompanionObjects().firstOrNull()?.let { return it } - return addDeclaration(KtPsiFactory(this).createCompanionObject()) as KtObjectDeclaration + return addDeclaration(KtPsiFactory(this).createCompanionObject()) } //TODO: code style option whether to insert redundant 'public' keyword or not -fun KtDeclaration.setVisibility(visibilityModifier: KtModifierKeywordToken) { - val defaultVisibilityKeyword = implicitVisibility() +fun KtModifierListOwner.setVisibility(visibilityModifier: KtModifierKeywordToken) { + if (this is KtDeclaration) { + val defaultVisibilityKeyword = implicitVisibility() - if (visibilityModifier == defaultVisibilityKeyword) { - this.visibilityModifierType()?.let { removeModifier(it) } - return + if (visibilityModifier == defaultVisibilityKeyword) { + this.visibilityModifierType()?.let { removeModifier(it) } + return + } } addModifier(visibilityModifier) diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/IncreaseVisibilityFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/IncreaseVisibilityFix.kt index 27b0437ca68..023fbec8072 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/IncreaseVisibilityFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/IncreaseVisibilityFix.kt @@ -35,6 +35,7 @@ import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.descriptorUtil.module import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode +import org.jetbrains.kotlin.idea.core.setVisibility class IncreaseVisibilityFix( element: KtModifierListOwner, @@ -46,7 +47,7 @@ class IncreaseVisibilityFix( override fun getFamilyName() = "Make $visibilityModifier" override fun invoke(project: Project, editor: Editor?, file: KtFile) { - element.addModifier(visibilityModifier) + element.setVisibility(visibilityModifier) } companion object : KotlinSingleIntentionActionFactory() { @@ -54,17 +55,20 @@ class IncreaseVisibilityFix( val element = diagnostic.psiElement as? KtElement ?: return null val context = element.analyze(BodyResolveMode.PARTIAL) val usageModule = context.get(BindingContext.FILE_TO_PACKAGE_FRAGMENT, element.getContainingKtFile())?.module - ?: return null @Suppress("UNCHECKED_CAST") val factory = diagnostic.factory as DiagnosticFactory3<*, DeclarationDescriptor, *, DeclarationDescriptor> val descriptor = factory.cast(diagnostic).c as? DeclarationDescriptorWithVisibility ?: return null + val declaration = DescriptorToSourceUtils.getSourceFromDescriptor(descriptor) as? KtModifierListOwner ?: return null val module = DescriptorUtils.getContainingModule(descriptor) - if (module != usageModule) return null - val declaration = DescriptorToSourceUtils.getSourceFromDescriptor(descriptor) as? KtModifierListOwner ?: return null - if (descriptor.visibility != Visibilities.PRIVATE) return null - return IncreaseVisibilityFix(declaration, descriptor.name.asString(), KtTokens.INTERNAL_KEYWORD) + val modifier = if (module != usageModule || descriptor.visibility != Visibilities.PRIVATE) { + KtTokens.PUBLIC_KEYWORD + } + else { + KtTokens.INTERNAL_KEYWORD + } + return IncreaseVisibilityFix(declaration, descriptor.name.asString(), modifier) } } } diff --git a/idea/testData/quickfix/increaseVisibility/overriddenProtectedMemberToPublicSingleFile.kt b/idea/testData/quickfix/increaseVisibility/overriddenProtectedMemberToPublicSingleFile.kt new file mode 100644 index 00000000000..519dcce530f --- /dev/null +++ b/idea/testData/quickfix/increaseVisibility/overriddenProtectedMemberToPublicSingleFile.kt @@ -0,0 +1,9 @@ +// "Make x public" "true" + +open class Base(protected open val x: Int) + +class First(override val x: Int) : Base(x) + +class Second(f: First) { + val y = f.x +} diff --git a/idea/testData/quickfix/increaseVisibility/overriddenProtectedMemberToPublicSingleFile.kt.after b/idea/testData/quickfix/increaseVisibility/overriddenProtectedMemberToPublicSingleFile.kt.after new file mode 100644 index 00000000000..fdebd303f1f --- /dev/null +++ b/idea/testData/quickfix/increaseVisibility/overriddenProtectedMemberToPublicSingleFile.kt.after @@ -0,0 +1,9 @@ +// "Make x public" "true" + +open class Base(protected open val x: Int) + +class First(public override val x: Int) : Base(x) + +class Second(f: First) { + val y = f.x +} diff --git a/idea/testData/quickfix/increaseVisibility/protectedMemberToPublicSingleFile.kt b/idea/testData/quickfix/increaseVisibility/protectedMemberToPublicSingleFile.kt new file mode 100644 index 00000000000..62e4954cf07 --- /dev/null +++ b/idea/testData/quickfix/increaseVisibility/protectedMemberToPublicSingleFile.kt @@ -0,0 +1,6 @@ +// "Make x public" "true" +class First(protected val x: Int) + +class Second(f: First) { + val y = f.x +} diff --git a/idea/testData/quickfix/increaseVisibility/protectedMemberToPublicSingleFile.kt.after b/idea/testData/quickfix/increaseVisibility/protectedMemberToPublicSingleFile.kt.after new file mode 100644 index 00000000000..e514082b3d9 --- /dev/null +++ b/idea/testData/quickfix/increaseVisibility/protectedMemberToPublicSingleFile.kt.after @@ -0,0 +1,6 @@ +// "Make x public" "true" +class First(val x: Int) + +class Second(f: First) { + val y = f.x +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index 02a15559810..b6fe817c1ec 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -4719,11 +4719,23 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/quickfix/increaseVisibility"), Pattern.compile("^([\\w\\-_]+)\\.kt$"), true); } + @TestMetadata("overriddenProtectedMemberToPublicSingleFile.kt") + public void testOverriddenProtectedMemberToPublicSingleFile() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/increaseVisibility/overriddenProtectedMemberToPublicSingleFile.kt"); + doTest(fileName); + } + @TestMetadata("privateMemberToInternalSingleFile.kt") public void testPrivateMemberToInternalSingleFile() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/increaseVisibility/privateMemberToInternalSingleFile.kt"); doTest(fileName); } + + @TestMetadata("protectedMemberToPublicSingleFile.kt") + public void testProtectedMemberToPublicSingleFile() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/increaseVisibility/protectedMemberToPublicSingleFile.kt"); + doTest(fileName); + } } @TestMetadata("idea/testData/quickfix/initializeWithConstructorParameter")