From 9f5bbf94d3a088be8377e67514003c20e40e0db1 Mon Sep 17 00:00:00 2001 From: Michael Nedzelsky Date: Wed, 2 Sep 2015 15:35:43 +0300 Subject: [PATCH] introduce quickfix for change visiblity from private to internal for private top-level declarations --- .../ChangePrivateTopLevelToInternalFix.kt | 44 +++++++++++++++++++ .../kotlin/idea/quickfix/QuickFixRegistrar.kt | 2 + ...ivateTopLevelFunInFile.after.Dependency.kt | 3 ++ .../privateTopLevelFunInFile.after.kt | 7 +++ ...vateTopLevelFunInFile.before.Dependency.kt | 3 ++ .../privateTopLevelFunInFile.before.Main.kt | 7 +++ ...ivateTopLevelValInFile.after.Dependency.kt | 3 ++ .../privateTopLevelValInFile.after.kt | 7 +++ ...vateTopLevelValInFile.before.Dependency.kt | 3 ++ .../privateTopLevelValInFile.before.Main.kt | 7 +++ ...ivateTopLevelVarInFile.after.Dependency.kt | 3 ++ .../privateTopLevelVarInFile.after.kt | 7 +++ ...vateTopLevelVarInFile.before.Dependency.kt | 3 ++ .../privateTopLevelVarInFile.before.Main.kt | 7 +++ ...velVarWithSetterInFile.after.Dependency.kt | 4 ++ ...rivateTopLevelVarWithSetterInFile.after.kt | 7 +++ ...elVarWithSetterInFile.before.Dependency.kt | 4 ++ ...TopLevelVarWithSetterInFile.before.Main.kt | 7 +++ .../QuickFixMultiFileTestGenerated.java | 33 ++++++++++++++ 19 files changed, 161 insertions(+) create mode 100644 idea/src/org/jetbrains/kotlin/idea/quickfix/ChangePrivateTopLevelToInternalFix.kt create mode 100644 idea/testData/quickfix/privateInFiles/privateTopLevelFunInFile.after.Dependency.kt create mode 100644 idea/testData/quickfix/privateInFiles/privateTopLevelFunInFile.after.kt create mode 100644 idea/testData/quickfix/privateInFiles/privateTopLevelFunInFile.before.Dependency.kt create mode 100644 idea/testData/quickfix/privateInFiles/privateTopLevelFunInFile.before.Main.kt create mode 100644 idea/testData/quickfix/privateInFiles/privateTopLevelValInFile.after.Dependency.kt create mode 100644 idea/testData/quickfix/privateInFiles/privateTopLevelValInFile.after.kt create mode 100644 idea/testData/quickfix/privateInFiles/privateTopLevelValInFile.before.Dependency.kt create mode 100644 idea/testData/quickfix/privateInFiles/privateTopLevelValInFile.before.Main.kt create mode 100644 idea/testData/quickfix/privateInFiles/privateTopLevelVarInFile.after.Dependency.kt create mode 100644 idea/testData/quickfix/privateInFiles/privateTopLevelVarInFile.after.kt create mode 100644 idea/testData/quickfix/privateInFiles/privateTopLevelVarInFile.before.Dependency.kt create mode 100644 idea/testData/quickfix/privateInFiles/privateTopLevelVarInFile.before.Main.kt create mode 100644 idea/testData/quickfix/privateInFiles/privateTopLevelVarWithSetterInFile.after.Dependency.kt create mode 100644 idea/testData/quickfix/privateInFiles/privateTopLevelVarWithSetterInFile.after.kt create mode 100644 idea/testData/quickfix/privateInFiles/privateTopLevelVarWithSetterInFile.before.Dependency.kt create mode 100644 idea/testData/quickfix/privateInFiles/privateTopLevelVarWithSetterInFile.before.Main.kt diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangePrivateTopLevelToInternalFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangePrivateTopLevelToInternalFix.kt new file mode 100644 index 00000000000..7f0ca3b9441 --- /dev/null +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangePrivateTopLevelToInternalFix.kt @@ -0,0 +1,44 @@ +/* + * Copyright 2010-2015 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.idea.quickfix + +import com.intellij.codeInsight.intention.IntentionAction +import com.intellij.openapi.editor.Editor +import com.intellij.openapi.project.Project +import org.jetbrains.kotlin.diagnostics.Diagnostic +import org.jetbrains.kotlin.diagnostics.Errors +import org.jetbrains.kotlin.lexer.JetTokens +import org.jetbrains.kotlin.psi.JetFile +import org.jetbrains.kotlin.psi.JetModifierListOwner +import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils + +public class ChangePrivateTopLevelToInternalFix(element: JetModifierListOwner, private val elementName: String) : JetIntentionAction(element) { + override fun getText() = "Make $elementName internal" + override fun getFamilyName() = "Make top-level declaration internal" + + override fun invoke(project: Project, editor: Editor?, file: JetFile) { + element.addModifier(JetTokens.INTERNAL_KEYWORD) + } + + companion object : JetSingleIntentionActionFactory() { + override fun createAction(diagnostic: Diagnostic): IntentionAction? { + val descriptor = Errors.ACCESS_TO_PRIVATE_TOP_LEVEL_FROM_ANOTHER_FILE.cast(diagnostic).a + val declaration = DescriptorToSourceUtils.getSourceFromDescriptor(descriptor) as? JetModifierListOwner ?: return null + return ChangePrivateTopLevelToInternalFix(declaration, descriptor.name.asString()) + } + } +} \ No newline at end of file diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt index 0e8285f3eee..233cabcd490 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt @@ -64,6 +64,8 @@ public class QuickFixRegistrar : QuickFixContributor { ABSTRACT_MEMBER_NOT_IMPLEMENTED.registerFactory(addAbstractModifierFactory) MANY_IMPL_MEMBER_NOT_IMPLEMENTED.registerFactory(addAbstractModifierFactory) + ACCESS_TO_PRIVATE_TOP_LEVEL_FROM_ANOTHER_FILE.registerFactory(ChangePrivateTopLevelToInternalFix) + val removeFinalModifierFactory = RemoveModifierFix.createRemoveModifierFromListOwnerFactory(FINAL_KEYWORD) val addAbstractToClassFactory = AddModifierFix.createFactory(ABSTRACT_KEYWORD, javaClass()) ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS.registerFactory(removeAbstractModifierFactory, addAbstractToClassFactory) diff --git a/idea/testData/quickfix/privateInFiles/privateTopLevelFunInFile.after.Dependency.kt b/idea/testData/quickfix/privateInFiles/privateTopLevelFunInFile.after.Dependency.kt new file mode 100644 index 00000000000..a4118c4969d --- /dev/null +++ b/idea/testData/quickfix/privateInFiles/privateTopLevelFunInFile.after.Dependency.kt @@ -0,0 +1,3 @@ +package test + +internal fun f(): Int = 10 \ No newline at end of file diff --git a/idea/testData/quickfix/privateInFiles/privateTopLevelFunInFile.after.kt b/idea/testData/quickfix/privateInFiles/privateTopLevelFunInFile.after.kt new file mode 100644 index 00000000000..00f3170cee2 --- /dev/null +++ b/idea/testData/quickfix/privateInFiles/privateTopLevelFunInFile.after.kt @@ -0,0 +1,7 @@ +// "Make f internal" "true" + +package test + +fun foo() { + val x = f() +} diff --git a/idea/testData/quickfix/privateInFiles/privateTopLevelFunInFile.before.Dependency.kt b/idea/testData/quickfix/privateInFiles/privateTopLevelFunInFile.before.Dependency.kt new file mode 100644 index 00000000000..b9502243dba --- /dev/null +++ b/idea/testData/quickfix/privateInFiles/privateTopLevelFunInFile.before.Dependency.kt @@ -0,0 +1,3 @@ +package test + +private fun f(): Int = 10 \ No newline at end of file diff --git a/idea/testData/quickfix/privateInFiles/privateTopLevelFunInFile.before.Main.kt b/idea/testData/quickfix/privateInFiles/privateTopLevelFunInFile.before.Main.kt new file mode 100644 index 00000000000..ad2a3cc2b52 --- /dev/null +++ b/idea/testData/quickfix/privateInFiles/privateTopLevelFunInFile.before.Main.kt @@ -0,0 +1,7 @@ +// "Make f internal" "true" + +package test + +fun foo() { + val x = f() +} diff --git a/idea/testData/quickfix/privateInFiles/privateTopLevelValInFile.after.Dependency.kt b/idea/testData/quickfix/privateInFiles/privateTopLevelValInFile.after.Dependency.kt new file mode 100644 index 00000000000..a9214e1eb28 --- /dev/null +++ b/idea/testData/quickfix/privateInFiles/privateTopLevelValInFile.after.Dependency.kt @@ -0,0 +1,3 @@ +package test + +internal val prop: Int = 10 \ No newline at end of file diff --git a/idea/testData/quickfix/privateInFiles/privateTopLevelValInFile.after.kt b/idea/testData/quickfix/privateInFiles/privateTopLevelValInFile.after.kt new file mode 100644 index 00000000000..01f1fe00539 --- /dev/null +++ b/idea/testData/quickfix/privateInFiles/privateTopLevelValInFile.after.kt @@ -0,0 +1,7 @@ +// "Make prop internal" "true" + +package test + +fun foo() { + val x = prop +} diff --git a/idea/testData/quickfix/privateInFiles/privateTopLevelValInFile.before.Dependency.kt b/idea/testData/quickfix/privateInFiles/privateTopLevelValInFile.before.Dependency.kt new file mode 100644 index 00000000000..6377d751bbc --- /dev/null +++ b/idea/testData/quickfix/privateInFiles/privateTopLevelValInFile.before.Dependency.kt @@ -0,0 +1,3 @@ +package test + +private val prop: Int = 10 \ No newline at end of file diff --git a/idea/testData/quickfix/privateInFiles/privateTopLevelValInFile.before.Main.kt b/idea/testData/quickfix/privateInFiles/privateTopLevelValInFile.before.Main.kt new file mode 100644 index 00000000000..27ba416938e --- /dev/null +++ b/idea/testData/quickfix/privateInFiles/privateTopLevelValInFile.before.Main.kt @@ -0,0 +1,7 @@ +// "Make prop internal" "true" + +package test + +fun foo() { + val x = prop +} diff --git a/idea/testData/quickfix/privateInFiles/privateTopLevelVarInFile.after.Dependency.kt b/idea/testData/quickfix/privateInFiles/privateTopLevelVarInFile.after.Dependency.kt new file mode 100644 index 00000000000..70b57c99385 --- /dev/null +++ b/idea/testData/quickfix/privateInFiles/privateTopLevelVarInFile.after.Dependency.kt @@ -0,0 +1,3 @@ +package test + +internal var prop: Int = 10 \ No newline at end of file diff --git a/idea/testData/quickfix/privateInFiles/privateTopLevelVarInFile.after.kt b/idea/testData/quickfix/privateInFiles/privateTopLevelVarInFile.after.kt new file mode 100644 index 00000000000..69d00686523 --- /dev/null +++ b/idea/testData/quickfix/privateInFiles/privateTopLevelVarInFile.after.kt @@ -0,0 +1,7 @@ +// "Make prop internal" "true" + +package test + +fun foo() { + prop = 20 +} diff --git a/idea/testData/quickfix/privateInFiles/privateTopLevelVarInFile.before.Dependency.kt b/idea/testData/quickfix/privateInFiles/privateTopLevelVarInFile.before.Dependency.kt new file mode 100644 index 00000000000..bbedafe79c4 --- /dev/null +++ b/idea/testData/quickfix/privateInFiles/privateTopLevelVarInFile.before.Dependency.kt @@ -0,0 +1,3 @@ +package test + +private var prop: Int = 10 \ No newline at end of file diff --git a/idea/testData/quickfix/privateInFiles/privateTopLevelVarInFile.before.Main.kt b/idea/testData/quickfix/privateInFiles/privateTopLevelVarInFile.before.Main.kt new file mode 100644 index 00000000000..03f4cdbf444 --- /dev/null +++ b/idea/testData/quickfix/privateInFiles/privateTopLevelVarInFile.before.Main.kt @@ -0,0 +1,7 @@ +// "Make prop internal" "true" + +package test + +fun foo() { + prop = 20 +} diff --git a/idea/testData/quickfix/privateInFiles/privateTopLevelVarWithSetterInFile.after.Dependency.kt b/idea/testData/quickfix/privateInFiles/privateTopLevelVarWithSetterInFile.after.Dependency.kt new file mode 100644 index 00000000000..d8021736c44 --- /dev/null +++ b/idea/testData/quickfix/privateInFiles/privateTopLevelVarWithSetterInFile.after.Dependency.kt @@ -0,0 +1,4 @@ +package test + +var prop: Int = 10 + internal set(value: Int) {} \ No newline at end of file diff --git a/idea/testData/quickfix/privateInFiles/privateTopLevelVarWithSetterInFile.after.kt b/idea/testData/quickfix/privateInFiles/privateTopLevelVarWithSetterInFile.after.kt new file mode 100644 index 00000000000..60ae141a07b --- /dev/null +++ b/idea/testData/quickfix/privateInFiles/privateTopLevelVarWithSetterInFile.after.kt @@ -0,0 +1,7 @@ +// "Make internal" "true" + +package test + +fun foo() { + prop = 20 +} diff --git a/idea/testData/quickfix/privateInFiles/privateTopLevelVarWithSetterInFile.before.Dependency.kt b/idea/testData/quickfix/privateInFiles/privateTopLevelVarWithSetterInFile.before.Dependency.kt new file mode 100644 index 00000000000..be4b88f056f --- /dev/null +++ b/idea/testData/quickfix/privateInFiles/privateTopLevelVarWithSetterInFile.before.Dependency.kt @@ -0,0 +1,4 @@ +package test + +var prop: Int = 10 + private set(value: Int) {} \ No newline at end of file diff --git a/idea/testData/quickfix/privateInFiles/privateTopLevelVarWithSetterInFile.before.Main.kt b/idea/testData/quickfix/privateInFiles/privateTopLevelVarWithSetterInFile.before.Main.kt new file mode 100644 index 00000000000..f00fe567c8a --- /dev/null +++ b/idea/testData/quickfix/privateInFiles/privateTopLevelVarWithSetterInFile.before.Main.kt @@ -0,0 +1,7 @@ +// "Make internal" "true" + +package test + +fun foo() { + prop = 20 +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiFileTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiFileTestGenerated.java index 71e13cfd705..beee27fd442 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiFileTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiFileTestGenerated.java @@ -1239,6 +1239,39 @@ public class QuickFixMultiFileTestGenerated extends AbstractQuickFixMultiFileTes } + @TestMetadata("idea/testData/quickfix/privateInFiles") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class PrivateInFiles extends AbstractQuickFixMultiFileTest { + public void testAllFilesPresentInPrivateInFiles() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/quickfix/privateInFiles"), Pattern.compile("^(\\w+)\\.before\\.Main\\.kt$"), true); + } + + @TestMetadata("privateTopLevelFunInFile.before.Main.kt") + public void testPrivateTopLevelFunInFile() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/privateInFiles/privateTopLevelFunInFile.before.Main.kt"); + doTestWithExtraFile(fileName); + } + + @TestMetadata("privateTopLevelValInFile.before.Main.kt") + public void testPrivateTopLevelValInFile() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/privateInFiles/privateTopLevelValInFile.before.Main.kt"); + doTestWithExtraFile(fileName); + } + + @TestMetadata("privateTopLevelVarInFile.before.Main.kt") + public void testPrivateTopLevelVarInFile() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/privateInFiles/privateTopLevelVarInFile.before.Main.kt"); + doTestWithExtraFile(fileName); + } + + @TestMetadata("privateTopLevelVarWithSetterInFile.before.Main.kt") + public void testPrivateTopLevelVarWithSetterInFile() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/privateInFiles/privateTopLevelVarWithSetterInFile.before.Main.kt"); + doTestWithExtraFile(fileName); + } + } + @TestMetadata("idea/testData/quickfix/suppress") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class)