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:
@@ -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>() {}
|
||||
}
|
||||
|
||||
+7
@@ -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)
|
||||
|
||||
+13
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user