Fix unavailable 'Specify visibility explicitly' quickfix

in explicit API mode due to incorrect cast.
Add tests for applying this quickfix.
#KT-36020 fixed.
This commit is contained in:
Leonid Startsev
2020-01-22 14:13:36 +03:00
parent f44fa67a51
commit 4285c6045a
13 changed files with 116 additions and 4 deletions
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@@ -14,13 +14,14 @@ import org.jetbrains.kotlin.descriptors.DeclarationDescriptorWithVisibility
import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.diagnostics.Diagnostic
import org.jetbrains.kotlin.diagnostics.DiagnosticFactory1
import org.jetbrains.kotlin.diagnostics.DiagnosticFactory0
import org.jetbrains.kotlin.idea.core.canBeInternal
import org.jetbrains.kotlin.idea.core.canBePrivate
import org.jetbrains.kotlin.idea.core.canBeProtected
import org.jetbrains.kotlin.idea.core.setVisibility
import org.jetbrains.kotlin.idea.inspections.RemoveRedundantSetterFix
import org.jetbrains.kotlin.idea.inspections.isRedundantSetter
import org.jetbrains.kotlin.idea.search.usagesSearch.descriptor
import org.jetbrains.kotlin.idea.util.runOnExpectAndAllActuals
import org.jetbrains.kotlin.lexer.KtModifierKeywordToken
import org.jetbrains.kotlin.lexer.KtTokens
@@ -121,8 +122,8 @@ open class ChangeVisibilityFix(
object SetExplicitVisibilityFactory : KotlinIntentionActionsFactory() {
@Suppress("UNCHECKED_CAST")
override fun doCreateActions(diagnostic: Diagnostic): List<IntentionAction> {
val factory = diagnostic.factory as DiagnosticFactory1<*, DeclarationDescriptor>
val descriptor = factory.cast(diagnostic).a as? DeclarationDescriptorWithVisibility ?: return emptyList()
val factory = diagnostic.factory as DiagnosticFactory0<KtDeclaration>
val descriptor = factory.cast(diagnostic).psiElement.descriptor as? DeclarationDescriptorWithVisibility ?: return emptyList()
val element = diagnostic.psiElement as? KtModifierListOwner ?: return emptyList()
return listOf(
ChangeToPublicExplicitlyFix(
@@ -0,0 +1,5 @@
// "Make 'Foo1' public explicitly" "true"
// COMPILER_ARGUMENTS: -Xexplicit-api=strict
class <caret>Foo1() {}
@@ -0,0 +1,5 @@
// "Make 'Foo1' public explicitly" "true"
// COMPILER_ARGUMENTS: -Xexplicit-api=strict
public class Foo1() {}
@@ -0,0 +1,7 @@
// "Make 'Companion' public explicitly" "true"
// COMPILER_ARGUMENTS: -Xexplicit-api=strict
public class Foo1() {
companion <caret>object {}
}
@@ -0,0 +1,7 @@
// "Make 'Companion' public explicitly" "true"
// COMPILER_ARGUMENTS: -Xexplicit-api=strict
public class Foo1() {
public companion object {}
}
@@ -0,0 +1,7 @@
// "Make '<init>' public explicitly" "true"
// COMPILER_ARGUMENTS: -Xexplicit-api=strict
public class Foo5 {
constructor<caret>() {}
}
@@ -0,0 +1,7 @@
// "Make '<init>' public explicitly" "true"
// COMPILER_ARGUMENTS: -Xexplicit-api=strict
public class Foo5 {
public constructor() {}
}
@@ -0,0 +1,6 @@
// "Make 'method' public explicitly" "true"
// COMPILER_ARGUMENTS: -Xexplicit-api=strict
public class Foo2() {
fun <caret>method() {}
}
@@ -0,0 +1,6 @@
// "Make 'method' public explicitly" "true"
// COMPILER_ARGUMENTS: -Xexplicit-api=strict
public class Foo2() {
public fun method() {}
}
@@ -0,0 +1,5 @@
// "Make 'bar' public explicitly" "true"
// COMPILER_ARGUMENTS: -Xexplicit-api=strict
public class Foo(val <caret>bar: Int, private var bar2: String, internal var bar3: Long, public var bar4: Int)
@@ -0,0 +1,5 @@
// "Make 'bar' public explicitly" "true"
// COMPILER_ARGUMENTS: -Xexplicit-api=strict
public class Foo(public val bar: Int, private var bar2: String, internal var bar3: Long, public var bar4: Int)
@@ -4148,6 +4148,19 @@ public class QuickFixMultiFileTestGenerated extends AbstractQuickFixMultiFileTes
}
}
@TestMetadata("idea/testData/quickfix/specifyVisibilityInExplicitApiMode")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)
public static class SpecifyVisibilityInExplicitApiMode extends AbstractQuickFixMultiFileTest {
private void runTest(String testDataFilePath) throws Exception {
KotlinTestUtils.runTest(this::doTestWithExtraFile, this, testDataFilePath);
}
public void testAllFilesPresentInSpecifyVisibilityInExplicitApiMode() throws Exception {
KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("idea/testData/quickfix/specifyVisibilityInExplicitApiMode"), Pattern.compile("^(\\w+)\\.((before\\.Main\\.\\w+)|(test))$"), null, true);
}
}
@TestMetadata("idea/testData/quickfix/superTypeIsExtensionType")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)
@@ -11683,6 +11683,44 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest {
}
}
@TestMetadata("idea/testData/quickfix/specifyVisibilityInExplicitApiMode")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)
public static class SpecifyVisibilityInExplicitApiMode extends AbstractQuickFixTest {
private void runTest(String testDataFilePath) throws Exception {
KotlinTestUtils.runTest(this::doTest, this, testDataFilePath);
}
public void testAllFilesPresentInSpecifyVisibilityInExplicitApiMode() throws Exception {
KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("idea/testData/quickfix/specifyVisibilityInExplicitApiMode"), Pattern.compile("^([\\w\\-_]+)\\.kt$"), null, true);
}
@TestMetadata("class.kt")
public void testClass() throws Exception {
runTest("idea/testData/quickfix/specifyVisibilityInExplicitApiMode/class.kt");
}
@TestMetadata("companion.kt")
public void testCompanion() throws Exception {
runTest("idea/testData/quickfix/specifyVisibilityInExplicitApiMode/companion.kt");
}
@TestMetadata("constructor.kt")
public void testConstructor() throws Exception {
runTest("idea/testData/quickfix/specifyVisibilityInExplicitApiMode/constructor.kt");
}
@TestMetadata("method.kt")
public void testMethod() throws Exception {
runTest("idea/testData/quickfix/specifyVisibilityInExplicitApiMode/method.kt");
}
@TestMetadata("property.kt")
public void testProperty() throws Exception {
runTest("idea/testData/quickfix/specifyVisibilityInExplicitApiMode/property.kt");
}
}
@TestMetadata("idea/testData/quickfix/superTypeIsExtensionType")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)