diff --git a/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/KotlinK2QuickFixRegistrar.kt b/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/KotlinK2QuickFixRegistrar.kt index d36322f01e00..26bfc1f4b78e 100644 --- a/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/KotlinK2QuickFixRegistrar.kt +++ b/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/KotlinK2QuickFixRegistrar.kt @@ -144,6 +144,7 @@ class KotlinK2QuickFixRegistrar : KotlinQuickFixRegistrar() { registerFactory(AnonymousFunctionWithNameFixFactories.removeNameFromFunctionExpressionFixFactory) registerFactory(ExtensionPropertyWithBackingFieldFixFactories.convertToGetterFixFactory) registerFactory(OverrideDeprecationFixFactories.copyDeprecatedAnnotationFixFactory) + registerFactory(TypeVarianceConflictErrorFixFactories.addUnsafeVarianceAnnotationFixFactory) } private val addAbstract = KtQuickFixesListBuilder.registerPsiQuickFix { diff --git a/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/TypeVarianceConflictErrorFixFactories.kt b/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/TypeVarianceConflictErrorFixFactories.kt new file mode 100644 index 000000000000..20dfda2b4007 --- /dev/null +++ b/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/TypeVarianceConflictErrorFixFactories.kt @@ -0,0 +1,21 @@ +// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package org.jetbrains.kotlin.idea.k2.codeinsight.fixes + +import org.jetbrains.kotlin.analysis.api.fir.diagnostics.KaFirDiagnostic +import org.jetbrains.kotlin.builtins.StandardNames +import org.jetbrains.kotlin.idea.codeinsight.api.applicators.fixes.KotlinQuickFixFactory +import org.jetbrains.kotlin.idea.quickfix.AddAnnotationFix +import org.jetbrains.kotlin.idea.quickfix.AddAnnotationFix.Kind +import org.jetbrains.kotlin.name.ClassId +import org.jetbrains.kotlin.psi.KtTypeReference + +internal object TypeVarianceConflictErrorFixFactories { + + val addUnsafeVarianceAnnotationFixFactory = KotlinQuickFixFactory.IntentionBased { diagnostic: KaFirDiagnostic.TypeVarianceConflictError -> + val typeReference = diagnostic.psi as? KtTypeReference ?: return@IntentionBased emptyList() + + listOf( + AddAnnotationFix(typeReference, ClassId.topLevel(StandardNames.FqNames.unsafeVariance), Kind.Self) + ) + } +} diff --git a/plugins/kotlin/code-insight/fixes-k2/tests/test/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/HighLevelQuickFixTestGenerated.java b/plugins/kotlin/code-insight/fixes-k2/tests/test/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/HighLevelQuickFixTestGenerated.java index 7bc23748c33f..a9d5b2eaa960 100644 --- a/plugins/kotlin/code-insight/fixes-k2/tests/test/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/HighLevelQuickFixTestGenerated.java +++ b/plugins/kotlin/code-insight/fixes-k2/tests/test/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/HighLevelQuickFixTestGenerated.java @@ -6706,7 +6706,29 @@ public abstract class HighLevelQuickFixTestGenerated extends AbstractHighLevelQu } } + @RunWith(JUnit3RunnerWithInners.class) + @TestMetadata("../../../idea/tests/testData/quickfix/addUnsafeVarianceAnnotation") + public static class AddUnsafeVarianceAnnotation extends AbstractHighLevelQuickFixTest { + @java.lang.Override + @org.jetbrains.annotations.NotNull + public final KotlinPluginMode getPluginMode() { + return KotlinPluginMode.K2; + } + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTest, this, testDataFilePath); + } + + @TestMetadata("parameterType.kt") + public void testParameterType() throws Exception { + runTest("../../../idea/tests/testData/quickfix/addUnsafeVarianceAnnotation/parameterType.kt"); + } + + @TestMetadata("returnType.kt") + public void testReturnType() throws Exception { + runTest("../../../idea/tests/testData/quickfix/addUnsafeVarianceAnnotation/returnType.kt"); + } + } diff --git a/plugins/kotlin/idea/tests/testData/quickfix/addUnsafeVarianceAnnotation/parameterType.kt b/plugins/kotlin/idea/tests/testData/quickfix/addUnsafeVarianceAnnotation/parameterType.kt index 93f5db587724..4f79b8fa873a 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/addUnsafeVarianceAnnotation/parameterType.kt +++ b/plugins/kotlin/idea/tests/testData/quickfix/addUnsafeVarianceAnnotation/parameterType.kt @@ -2,4 +2,5 @@ interface Foo { fun bar(e: E) } -// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.AddAnnotationFix \ No newline at end of file +// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.AddAnnotationFix +// FUS_K2_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.AddAnnotationFix \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/quickfix/addUnsafeVarianceAnnotation/parameterType.kt.after b/plugins/kotlin/idea/tests/testData/quickfix/addUnsafeVarianceAnnotation/parameterType.kt.after index bc56851dce19..3bfc4ddcd02e 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/addUnsafeVarianceAnnotation/parameterType.kt.after +++ b/plugins/kotlin/idea/tests/testData/quickfix/addUnsafeVarianceAnnotation/parameterType.kt.after @@ -2,4 +2,5 @@ interface Foo { fun bar(e: @UnsafeVariance E) } -// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.AddAnnotationFix \ No newline at end of file +// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.AddAnnotationFix +// FUS_K2_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.AddAnnotationFix \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/quickfix/addUnsafeVarianceAnnotation/returnType.kt b/plugins/kotlin/idea/tests/testData/quickfix/addUnsafeVarianceAnnotation/returnType.kt index c22c2614b377..fccb85ecf5e7 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/addUnsafeVarianceAnnotation/returnType.kt +++ b/plugins/kotlin/idea/tests/testData/quickfix/addUnsafeVarianceAnnotation/returnType.kt @@ -2,4 +2,5 @@ interface Foo { fun bar(): E } -// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.AddAnnotationFix \ No newline at end of file +// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.AddAnnotationFix +// FUS_K2_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.AddAnnotationFix \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/quickfix/addUnsafeVarianceAnnotation/returnType.kt.after b/plugins/kotlin/idea/tests/testData/quickfix/addUnsafeVarianceAnnotation/returnType.kt.after index 946401179f6e..7d80641830ad 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/addUnsafeVarianceAnnotation/returnType.kt.after +++ b/plugins/kotlin/idea/tests/testData/quickfix/addUnsafeVarianceAnnotation/returnType.kt.after @@ -2,4 +2,5 @@ interface Foo { fun bar(): @UnsafeVariance E } -// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.AddAnnotationFix \ No newline at end of file +// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.AddAnnotationFix +// FUS_K2_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.AddAnnotationFix \ No newline at end of file diff --git a/plugins/kotlin/util/test-generator-fir/test/org/jetbrains/kotlin/fir/testGenerator/codeinsight/GenerateK2QuickFixTests.kt b/plugins/kotlin/util/test-generator-fir/test/org/jetbrains/kotlin/fir/testGenerator/codeinsight/GenerateK2QuickFixTests.kt index 70f258f50188..2cd9ab4557ca 100644 --- a/plugins/kotlin/util/test-generator-fir/test/org/jetbrains/kotlin/fir/testGenerator/codeinsight/GenerateK2QuickFixTests.kt +++ b/plugins/kotlin/util/test-generator-fir/test/org/jetbrains/kotlin/fir/testGenerator/codeinsight/GenerateK2QuickFixTests.kt @@ -90,7 +90,7 @@ internal fun MutableTWorkspace.generateK2FixTests() { model("$idea/quickfix/addStarProjections", pattern = pattern) model("$idea/quickfix/addSuspend", pattern = pattern, isIgnored = true) model("$idea/quickfix/addTypeAnnotationToValueParameter", pattern = pattern) - model("$idea/quickfix/addUnsafeVarianceAnnotation", pattern = pattern, isIgnored = true) + model("$idea/quickfix/addUnsafeVarianceAnnotation", pattern = pattern) model("$idea/quickfix/addVarianceModifier", pattern = pattern, isIgnored = true) model("$idea/quickfix/assignToProperty", pattern = pattern, isIgnored = true) model("$idea/quickfix/callFromPublicInline", pattern = pattern)