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.
|
* 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.Visibilities
|
||||||
import org.jetbrains.kotlin.descriptors.Visibility
|
import org.jetbrains.kotlin.descriptors.Visibility
|
||||||
import org.jetbrains.kotlin.diagnostics.Diagnostic
|
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.canBeInternal
|
||||||
import org.jetbrains.kotlin.idea.core.canBePrivate
|
import org.jetbrains.kotlin.idea.core.canBePrivate
|
||||||
import org.jetbrains.kotlin.idea.core.canBeProtected
|
import org.jetbrains.kotlin.idea.core.canBeProtected
|
||||||
import org.jetbrains.kotlin.idea.core.setVisibility
|
import org.jetbrains.kotlin.idea.core.setVisibility
|
||||||
import org.jetbrains.kotlin.idea.inspections.RemoveRedundantSetterFix
|
import org.jetbrains.kotlin.idea.inspections.RemoveRedundantSetterFix
|
||||||
import org.jetbrains.kotlin.idea.inspections.isRedundantSetter
|
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.idea.util.runOnExpectAndAllActuals
|
||||||
import org.jetbrains.kotlin.lexer.KtModifierKeywordToken
|
import org.jetbrains.kotlin.lexer.KtModifierKeywordToken
|
||||||
import org.jetbrains.kotlin.lexer.KtTokens
|
import org.jetbrains.kotlin.lexer.KtTokens
|
||||||
@@ -121,8 +122,8 @@ open class ChangeVisibilityFix(
|
|||||||
object SetExplicitVisibilityFactory : KotlinIntentionActionsFactory() {
|
object SetExplicitVisibilityFactory : KotlinIntentionActionsFactory() {
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
override fun doCreateActions(diagnostic: Diagnostic): List<IntentionAction> {
|
override fun doCreateActions(diagnostic: Diagnostic): List<IntentionAction> {
|
||||||
val factory = diagnostic.factory as DiagnosticFactory1<*, DeclarationDescriptor>
|
val factory = diagnostic.factory as DiagnosticFactory0<KtDeclaration>
|
||||||
val descriptor = factory.cast(diagnostic).a as? DeclarationDescriptorWithVisibility ?: return emptyList()
|
val descriptor = factory.cast(diagnostic).psiElement.descriptor as? DeclarationDescriptorWithVisibility ?: return emptyList()
|
||||||
val element = diagnostic.psiElement as? KtModifierListOwner ?: return emptyList()
|
val element = diagnostic.psiElement as? KtModifierListOwner ?: return emptyList()
|
||||||
return listOf(
|
return listOf(
|
||||||
ChangeToPublicExplicitlyFix(
|
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")
|
@TestMetadata("idea/testData/quickfix/superTypeIsExtensionType")
|
||||||
@TestDataPath("$PROJECT_ROOT")
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
@RunWith(JUnit3RunnerWithInners.class)
|
@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")
|
@TestMetadata("idea/testData/quickfix/superTypeIsExtensionType")
|
||||||
@TestDataPath("$PROJECT_ROOT")
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
@RunWith(JUnit3RunnerWithInners.class)
|
@RunWith(JUnit3RunnerWithInners.class)
|
||||||
|
|||||||
Reference in New Issue
Block a user