From 884a41b39fb615efddecab12b70906338a0e7ac7 Mon Sep 17 00:00:00 2001 From: "Anastasia.Nekrasova" Date: Sun, 23 Jul 2023 19:10:23 +0300 Subject: [PATCH] [kotlin] K2 IDE: Support adding a @OptIn annotation and suggesting to propagate opt-in requirement in quickFixes ^KTIJ-26302 GitOrigin-RevId: 8d463b04322327abd25978d7b6c127ba8de02c44 --- .../K2MultiFileQuickFixTestGenerated.java | 46 ++++++--- .../tests/K2QuickFixTestGenerated.java | 30 ++++++ .../quickfix/KotlinK2QuickFixRegistrar.kt | 1 + .../idea/quickfix/fixes/OptInFixFactories.kt | 96 +++++++++++++++++++ .../kotlin/idea/quickfix/OptInGeneralUtils.kt | 5 +- .../quickfix/K1QuickFixTestGenerated.java | 30 ++++++ .../QuickFixMultiFileTestGenerated.java | 46 ++++++--- .../optIn/annotationInTopLevelProperty.kt | 3 - .../annotationInTopLevelProperty.kt.after | 3 - .../testData/quickfix/optIn/basicFunction.kt | 3 - .../quickfix/optIn/basicFunction.kt.after | 3 - .../optIn/basicFunctionContainingClass.kt | 3 - .../basicFunctionContainingClass.kt.after | 3 - .../optIn/basicFunctionNotApplicableFir.kt | 27 ++++++ .../testData/quickfix/optIn/basicUseOptIn.kt | 3 - .../quickfix/optIn/basicUseOptIn.kt.after | 3 - .../testData/quickfix/optIn/classUseOptIn.kt | 3 - .../quickfix/optIn/classUseOptIn.kt.after | 3 - .../quickfix/optIn/functionInLocalClass.kt | 3 - .../optIn/functionInLocalClass.kt.after | 3 - .../quickfix/optIn/hasOptInAnnotation.kt | 2 - .../optIn/hasOptInAnnotation.kt.after | 2 - .../quickfix/optIn/hasOptInAnnotation2.kt | 2 - .../optIn/hasOptInAnnotation2.kt.after | 2 - .../quickfix/optIn/hasOptInAnnotation3.kt | 2 - .../optIn/hasOptInAnnotation3.kt.after | 2 - .../optIn/hasOptInAnnotationForClass.kt | 2 - .../optIn/hasOptInAnnotationForClass.kt.after | 2 - .../optIn/hasOptInAnnotationForClass2.kt | 2 - .../hasOptInAnnotationForClass2.kt.after | 2 - .../testData/quickfix/optIn/localFunction.kt | 3 - .../quickfix/optIn/localFunction.kt.after | 3 - .../quickfix/optIn/multifile/apiFromJava.test | 37 +++++++ .../optIn/multifile/apiFromJava2.test | 38 ++++++++ .../optIn/multifile/apiFromJava3.test | 41 ++++++++ .../optIn/multifile/apiFromJava4.test | 41 ++++++++ .../reservedKeywordPackage.test | 0 .../reservedKeywordPackage2.test | 0 .../quickfix/optIn/nestedClassesFir.kt | 26 +++++ .../quickfix/optIn/nonTopLevelAnnotation.kt | 13 +++ .../optIn/nonTopLevelAnnotation.kt.after | 14 +++ .../quickfix/optIn/nonTopLevelAnnotation2.kt | 15 +++ .../optIn/nonTopLevelAnnotation2.kt.after | 16 ++++ .../testData/quickfix/optIn/overrideFir.kt | 24 +++++ .../testData/quickfix/optIn/propagateOptIn.kt | 3 - .../quickfix/optIn/propagateOptIn.kt.after | 3 - .../quickfix/optIn/propagateOptIn2.kt | 3 - .../quickfix/optIn/propagateOptIn2.kt.after | 3 - .../quickfix/optIn/propagateOptIn3.kt | 3 - .../quickfix/optIn/propagateOptIn3.kt.after | 3 - .../quickfix/optIn/propagateOptIn4.kt | 3 - .../quickfix/optIn/propagateOptIn4.kt.after | 3 - .../quickfix/optIn/propagateOptIn5.kt | 3 - .../quickfix/optIn/propagateOptIn5.kt.after | 3 - .../quickfix/optIn/propagateOptIn6.kt | 3 - .../quickfix/optIn/propagateOptIn6.kt.after | 3 - .../quickfix/optIn/propagateOptIn7.kt | 3 - .../quickfix/optIn/propagateOptIn7.kt.after | 3 - .../quickfix/optIn/propagateOptIn8Fir.kt | 20 ++++ .../optIn/propagateSubclassOptInRequired.kt | 3 - .../propagateSubclassOptInRequired.kt.after | 3 - .../optIn/propagateSubclassOptInRequired2.kt | 3 - .../propagateSubclassOptInRequired2.kt.after | 3 - .../optIn/propagateSubclassOptInRequired3.kt | 3 - .../propagateSubclassOptInRequired3.kt.after | 3 - .../optIn/propagateSubclassOptInRequired4.kt | 3 - .../propagateSubclassOptInRequired4.kt.after | 3 - .../optIn/propagateSubclassOptInRequired5.kt | 3 - .../propagateSubclassOptInRequired5.kt.after | 3 - .../quickfix/optIn/propertyInConstructor.kt | 14 --- .../optIn/propertyInConstructor.kt.after | 14 --- .../propertyInConstructorAddOptInToClass.kt | 14 --- ...pertyInConstructorAddOptInToClass.kt.after | 14 --- ...pertyInConstructorAddOptInToConstructor.kt | 15 +-- ...nConstructorAddOptInToConstructor.kt.after | 15 +-- .../testData/quickfix/optIn/typeAlias.kt | 8 +- .../quickfix/optIn/typeAlias.kt.after | 8 +- .../quickfix/optIn/typeInTopLevelProperty.kt | 3 - .../optIn/typeInTopLevelProperty.kt.after | 3 - 79 files changed, 545 insertions(+), 263 deletions(-) create mode 100644 plugins/kotlin/fir/src/org/jetbrains/kotlin/idea/quickfix/fixes/OptInFixFactories.kt create mode 100644 plugins/kotlin/idea/tests/testData/quickfix/optIn/basicFunctionNotApplicableFir.kt create mode 100644 plugins/kotlin/idea/tests/testData/quickfix/optIn/multifile/apiFromJava.test create mode 100644 plugins/kotlin/idea/tests/testData/quickfix/optIn/multifile/apiFromJava2.test create mode 100644 plugins/kotlin/idea/tests/testData/quickfix/optIn/multifile/apiFromJava3.test create mode 100644 plugins/kotlin/idea/tests/testData/quickfix/optIn/multifile/apiFromJava4.test rename plugins/kotlin/idea/tests/testData/quickfix/optIn/{ => multifile}/reservedKeywordPackage.test (100%) rename plugins/kotlin/idea/tests/testData/quickfix/optIn/{ => multifile}/reservedKeywordPackage2.test (100%) create mode 100644 plugins/kotlin/idea/tests/testData/quickfix/optIn/nestedClassesFir.kt create mode 100644 plugins/kotlin/idea/tests/testData/quickfix/optIn/nonTopLevelAnnotation.kt create mode 100644 plugins/kotlin/idea/tests/testData/quickfix/optIn/nonTopLevelAnnotation.kt.after create mode 100644 plugins/kotlin/idea/tests/testData/quickfix/optIn/nonTopLevelAnnotation2.kt create mode 100644 plugins/kotlin/idea/tests/testData/quickfix/optIn/nonTopLevelAnnotation2.kt.after create mode 100644 plugins/kotlin/idea/tests/testData/quickfix/optIn/overrideFir.kt create mode 100644 plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateOptIn8Fir.kt diff --git a/plugins/kotlin/code-insight/inspections-k2/tests/test/org/jetbrains/kotlin/idea/k2/quickfix/tests/K2MultiFileQuickFixTestGenerated.java b/plugins/kotlin/code-insight/inspections-k2/tests/test/org/jetbrains/kotlin/idea/k2/quickfix/tests/K2MultiFileQuickFixTestGenerated.java index 135eb3b9ffce..394ae5949e33 100644 --- a/plugins/kotlin/code-insight/inspections-k2/tests/test/org/jetbrains/kotlin/idea/k2/quickfix/tests/K2MultiFileQuickFixTestGenerated.java +++ b/plugins/kotlin/code-insight/inspections-k2/tests/test/org/jetbrains/kotlin/idea/k2/quickfix/tests/K2MultiFileQuickFixTestGenerated.java @@ -18,18 +18,42 @@ import org.junit.runner.RunWith; @TestDataPath("$CONTENT_ROOT") @RunWith(JUnit3RunnerWithInners.class) @TestMetadata("../../../idea/tests/testData/quickfix/optIn") -public class K2MultiFileQuickFixTestGenerated extends AbstractK2MultiFileQuickFixTest { - private void runTest(String testDataFilePath) throws Exception { - KotlinTestUtils.runTest(this::doTestWithExtraFile, this, testDataFilePath); - } +public abstract class K2MultiFileQuickFixTestGenerated extends AbstractK2MultiFileQuickFixTest { + @RunWith(JUnit3RunnerWithInners.class) + @TestMetadata("../../../idea/tests/testData/quickfix/optIn/multifile") + public static class Multifile extends AbstractK2MultiFileQuickFixTest { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTestWithExtraFile, this, testDataFilePath); + } - @TestMetadata("reservedKeywordPackage.test") - public void testReservedKeywordPackage() throws Exception { - runTest("../../../idea/tests/testData/quickfix/optIn/reservedKeywordPackage.test"); - } + @TestMetadata("apiFromJava.test") + public void testApiFromJava() throws Exception { + runTest("../../../idea/tests/testData/quickfix/optIn/multifile/apiFromJava.test"); + } - @TestMetadata("reservedKeywordPackage2.test") - public void testReservedKeywordPackage2() throws Exception { - runTest("../../../idea/tests/testData/quickfix/optIn/reservedKeywordPackage2.test"); + @TestMetadata("apiFromJava2.test") + public void testApiFromJava2() throws Exception { + runTest("../../../idea/tests/testData/quickfix/optIn/multifile/apiFromJava2.test"); + } + + @TestMetadata("apiFromJava3.test") + public void testApiFromJava3() throws Exception { + runTest("../../../idea/tests/testData/quickfix/optIn/multifile/apiFromJava3.test"); + } + + @TestMetadata("apiFromJava4.test") + public void testApiFromJava4() throws Exception { + runTest("../../../idea/tests/testData/quickfix/optIn/multifile/apiFromJava4.test"); + } + + @TestMetadata("reservedKeywordPackage.test") + public void testReservedKeywordPackage() throws Exception { + runTest("../../../idea/tests/testData/quickfix/optIn/multifile/reservedKeywordPackage.test"); + } + + @TestMetadata("reservedKeywordPackage2.test") + public void testReservedKeywordPackage2() throws Exception { + runTest("../../../idea/tests/testData/quickfix/optIn/multifile/reservedKeywordPackage2.test"); + } } } diff --git a/plugins/kotlin/code-insight/inspections-k2/tests/test/org/jetbrains/kotlin/idea/k2/quickfix/tests/K2QuickFixTestGenerated.java b/plugins/kotlin/code-insight/inspections-k2/tests/test/org/jetbrains/kotlin/idea/k2/quickfix/tests/K2QuickFixTestGenerated.java index 0a268d79cea9..d1c8f576df69 100644 --- a/plugins/kotlin/code-insight/inspections-k2/tests/test/org/jetbrains/kotlin/idea/k2/quickfix/tests/K2QuickFixTestGenerated.java +++ b/plugins/kotlin/code-insight/inspections-k2/tests/test/org/jetbrains/kotlin/idea/k2/quickfix/tests/K2QuickFixTestGenerated.java @@ -847,6 +847,11 @@ public abstract class K2QuickFixTestGenerated extends AbstractK2QuickFixTest { runTest("../../../idea/tests/testData/quickfix/optIn/basicFunctionNotApplicable.kt"); } + @TestMetadata("basicFunctionNotApplicableFir.kt") + public void testBasicFunctionNotApplicableFir() throws Exception { + runTest("../../../idea/tests/testData/quickfix/optIn/basicFunctionNotApplicableFir.kt"); + } + @TestMetadata("basicModule.kt") public void testBasicModule() throws Exception { runTest("../../../idea/tests/testData/quickfix/optIn/basicModule.kt"); @@ -957,11 +962,26 @@ public abstract class K2QuickFixTestGenerated extends AbstractK2QuickFixTest { runTest("../../../idea/tests/testData/quickfix/optIn/nestedClasses.kt"); } + @TestMetadata("nestedClassesFir.kt") + public void testNestedClassesFir() throws Exception { + runTest("../../../idea/tests/testData/quickfix/optIn/nestedClassesFir.kt"); + } + @TestMetadata("newFileAnnotationWithPackage.kt") public void testNewFileAnnotationWithPackage() throws Exception { runTest("../../../idea/tests/testData/quickfix/optIn/newFileAnnotationWithPackage.kt"); } + @TestMetadata("nonTopLevelAnnotation.kt") + public void testNonTopLevelAnnotation() throws Exception { + runTest("../../../idea/tests/testData/quickfix/optIn/nonTopLevelAnnotation.kt"); + } + + @TestMetadata("nonTopLevelAnnotation2.kt") + public void testNonTopLevelAnnotation2() throws Exception { + runTest("../../../idea/tests/testData/quickfix/optIn/nonTopLevelAnnotation2.kt"); + } + @TestMetadata("optInUnused.kt") public void testOptInUnused() throws Exception { runTest("../../../idea/tests/testData/quickfix/optIn/optInUnused.kt"); @@ -972,6 +992,11 @@ public abstract class K2QuickFixTestGenerated extends AbstractK2QuickFixTest { runTest("../../../idea/tests/testData/quickfix/optIn/override.kt"); } + @TestMetadata("overrideFir.kt") + public void testOverrideFir() throws Exception { + runTest("../../../idea/tests/testData/quickfix/optIn/overrideFir.kt"); + } + @TestMetadata("propagateOptIn.kt") public void testPropagateOptIn() throws Exception { runTest("../../../idea/tests/testData/quickfix/optIn/propagateOptIn.kt"); @@ -1012,6 +1037,11 @@ public abstract class K2QuickFixTestGenerated extends AbstractK2QuickFixTest { runTest("../../../idea/tests/testData/quickfix/optIn/propagateOptIn8.kt"); } + @TestMetadata("propagateOptIn8Fir.kt") + public void testPropagateOptIn8Fir() throws Exception { + runTest("../../../idea/tests/testData/quickfix/optIn/propagateOptIn8Fir.kt"); + } + @TestMetadata("propagateSubclassOptInRequired.kt") public void testPropagateSubclassOptInRequired() throws Exception { runTest("../../../idea/tests/testData/quickfix/optIn/propagateSubclassOptInRequired.kt"); diff --git a/plugins/kotlin/fir/src/org/jetbrains/kotlin/idea/quickfix/KotlinK2QuickFixRegistrar.kt b/plugins/kotlin/fir/src/org/jetbrains/kotlin/idea/quickfix/KotlinK2QuickFixRegistrar.kt index 68eccb546dbc..69a9a4779a05 100644 --- a/plugins/kotlin/fir/src/org/jetbrains/kotlin/idea/quickfix/KotlinK2QuickFixRegistrar.kt +++ b/plugins/kotlin/fir/src/org/jetbrains/kotlin/idea/quickfix/KotlinK2QuickFixRegistrar.kt @@ -267,6 +267,7 @@ class KotlinK2QuickFixRegistrar : KotlinQuickFixRegistrar() { registerApplicator(OptInAnnotationWrongTargetFixFactory.optInAnnotationWrongTargetFixFactory) registerApplicators(OptInFileLevelFixFactories.optInFileLevelFixFactories) + registerApplicators(OptInFixFactories.optInFixFactories) } diff --git a/plugins/kotlin/fir/src/org/jetbrains/kotlin/idea/quickfix/fixes/OptInFixFactories.kt b/plugins/kotlin/fir/src/org/jetbrains/kotlin/idea/quickfix/fixes/OptInFixFactories.kt new file mode 100644 index 000000000000..499a34811afc --- /dev/null +++ b/plugins/kotlin/fir/src/org/jetbrains/kotlin/idea/quickfix/fixes/OptInFixFactories.kt @@ -0,0 +1,96 @@ +// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package org.jetbrains.kotlin.idea.quickfix.fixes + +import com.intellij.psi.JavaPsiFacade +import com.intellij.psi.PsiElement +import com.intellij.psi.util.findParentOfType +import com.intellij.util.containers.addIfNotNull +import org.jetbrains.kotlin.analysis.api.KtAnalysisSession +import org.jetbrains.kotlin.analysis.api.analyze +import org.jetbrains.kotlin.analysis.api.annotations.* +import org.jetbrains.kotlin.analysis.api.fir.diagnostics.KtFirDiagnostic +import org.jetbrains.kotlin.analysis.api.fir.utils.getActualAnnotationTargets +import org.jetbrains.kotlin.idea.base.psi.KotlinPsiHeuristics +import org.jetbrains.kotlin.idea.codeinsight.api.applicators.fixes.diagnosticFixFactories +import org.jetbrains.kotlin.idea.quickfix.AddAnnotationFix +import org.jetbrains.kotlin.idea.quickfix.OptInGeneralUtilsBase +import org.jetbrains.kotlin.idea.refactoring.isOpen +import org.jetbrains.kotlin.idea.testIntegration.framework.KotlinPsiBasedTestFramework.Companion.asKtClassOrObject +import org.jetbrains.kotlin.lexer.KtTokens +import org.jetbrains.kotlin.name.ClassId +import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.resolve.checkers.OptInNames + +object OptInFixFactories { + val optInFixFactories = diagnosticFixFactories( + KtFirDiagnostic.OptInUsage::class, + KtFirDiagnostic.OptInUsageError::class, + KtFirDiagnostic.OptInOverride::class, + KtFirDiagnostic.OptInOverrideError::class + ) { diagnostic -> createQuickFix(diagnostic) } + + context(KtAnalysisSession) + private fun createQuickFix(diagnostic: KtFirDiagnostic): List { + val element = diagnostic.psi.findParentOfType(strict = false) ?: return emptyList() + val annotationFqName = OptInFixUtils.optInMarkerFqName(diagnostic) ?: return emptyList() + + val optInClassId = ClassId.topLevel(OptInFixUtils.optInFqName() ?: return emptyList()) + val isOverrideError = isOverrideError(diagnostic) + val psiClass = JavaPsiFacade.getInstance(element.project).findClass(annotationFqName.asString(), element.resolveScope) ?: return emptyList() + val annotationClass = psiClass.asKtClassOrObject()?.getClassOrObjectSymbol() ?: psiClass.getNamedClassSymbol() + val annotationClassId = annotationClass?.classIdIfNonLocal ?: return emptyList() + val applicableTargets = annotationClass.annotationApplicableTargets + val result = mutableListOf() + + val candidates = OptInGeneralUtils.collectCandidates(element) + + fun collectPropagateOptInAnnotationFix(targetElement: KtElement, kind: AddAnnotationFix.Kind): AddAnnotationFix? { + if (targetElement !is KtDeclaration) return null + if (applicableTargets == null) return null + + val actualTargetList = (targetElement as? KtDeclaration)?.getSymbol()?.getActualAnnotationTargets() ?: return null + return OptInGeneralUtils.collectPropagateOptInAnnotationFix( + targetElement, + kind, + applicableTargets, + actualTargetList, + annotationFqName, + annotationClassId, + isOverrideError + ) + } + + candidates.forEach { (targetElement, kind) -> + result.addIfNotNull(collectPropagateOptInAnnotationFix(targetElement, kind)) + result.add(OptInGeneralUtils.collectUseOptInAnnotationFix(targetElement, kind, optInClassId, annotationClassId.asSingleFqName(), isOverrideError)) + } + return result + } + + private fun isOverrideError(diagnostic: KtFirDiagnostic): Boolean = + diagnostic is KtFirDiagnostic.OptInOverride || diagnostic is KtFirDiagnostic.OptInOverrideError +} + +private object OptInGeneralUtils : OptInGeneralUtilsBase() { + + override fun KtDeclaration.isSubclassOptPropagateApplicable(annotationFqName: FqName): Boolean { + if (this !is KtClass) return false + // SubclassOptInRequired is inapplicable on sealed classes and interfaces, final classes, + // open local classes, object, enum classes and fun interfaces + check(!this.isLocal) { "Local declarations are filtered in OptInFixesFactory.doCreateActions" } + if (this.isSealed() || this.hasModifier(KtTokens.FUN_KEYWORD) || !this.isOpen()) return false + if (KotlinPsiHeuristics.hasAnnotation(this, OptInNames.SUBCLASS_OPT_IN_REQUIRED_FQ_NAME)) return false + + analyze(this) { + return superTypeListEntries.any { + val typeReference = it.typeReference + val resolvedClass = typeReference?.getKtType()?.expandedClassSymbol ?: return false + val classAnnotation = resolvedClass.annotationsByClassId(OptInNames.SUBCLASS_OPT_IN_REQUIRED_CLASS_ID).firstOrNull() + val annotationMarkerClass = classAnnotation?.arguments?.find { arg -> arg.name == OptInNames.OPT_IN_ANNOTATION_CLASS } + val apiClassId = (annotationMarkerClass?.expression as? KtKClassAnnotationValue.KtNonLocalKClassAnnotationValue)?.classId + apiClassId?.asSingleFqName() == annotationFqName + } + } + } +} \ No newline at end of file diff --git a/plugins/kotlin/frontend-independent/src/org/jetbrains/kotlin/idea/quickfix/OptInGeneralUtils.kt b/plugins/kotlin/frontend-independent/src/org/jetbrains/kotlin/idea/quickfix/OptInGeneralUtils.kt index ca8ec481ee90..462171bf7812 100644 --- a/plugins/kotlin/frontend-independent/src/org/jetbrains/kotlin/idea/quickfix/OptInGeneralUtils.kt +++ b/plugins/kotlin/frontend-independent/src/org/jetbrains/kotlin/idea/quickfix/OptInGeneralUtils.kt @@ -4,7 +4,6 @@ package org.jetbrains.kotlin.idea.quickfix import com.intellij.psi.PsiElement import org.jetbrains.kotlin.descriptors.annotations.KotlinTarget -import org.jetbrains.kotlin.idea.codeinsight.api.classic.quickfixes.KotlinQuickFixAction import org.jetbrains.kotlin.idea.util.findAnnotation import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName @@ -27,7 +26,7 @@ abstract class OptInGeneralUtilsBase { annotationFqName: FqName, annotationClassId: ClassId, isOverrideError: Boolean - ): KotlinQuickFixAction? { + ): AddAnnotationFix? { if (KtPsiUtil.isLocal(targetElement)) return null if (actualTargetList.none { it in applicableTargets }) return null @@ -52,7 +51,7 @@ abstract class OptInGeneralUtilsBase { optInClassId: ClassId, annotationFqName: FqName, isOverrideError: Boolean - ): KotlinQuickFixAction { + ): AddAnnotationFix { val existingAnnotationEntry = (targetElement as? KtAnnotated)?.findAnnotation(optInClassId)?.createSmartPointer() return if (isOverrideError) { diff --git a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/quickfix/K1QuickFixTestGenerated.java b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/quickfix/K1QuickFixTestGenerated.java index eb663f38b596..ea0decd10163 100644 --- a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/quickfix/K1QuickFixTestGenerated.java +++ b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/quickfix/K1QuickFixTestGenerated.java @@ -11322,6 +11322,11 @@ public abstract class K1QuickFixTestGenerated extends AbstractK1QuickFixTest { runTest("testData/quickfix/optIn/basicFunctionNotApplicable.kt"); } + @TestMetadata("basicFunctionNotApplicableFir.kt") + public void testBasicFunctionNotApplicableFir() throws Exception { + runTest("testData/quickfix/optIn/basicFunctionNotApplicableFir.kt"); + } + @TestMetadata("basicModule.kt") public void testBasicModule() throws Exception { runTest("testData/quickfix/optIn/basicModule.kt"); @@ -11432,11 +11437,26 @@ public abstract class K1QuickFixTestGenerated extends AbstractK1QuickFixTest { runTest("testData/quickfix/optIn/nestedClasses.kt"); } + @TestMetadata("nestedClassesFir.kt") + public void testNestedClassesFir() throws Exception { + runTest("testData/quickfix/optIn/nestedClassesFir.kt"); + } + @TestMetadata("newFileAnnotationWithPackage.kt") public void testNewFileAnnotationWithPackage() throws Exception { runTest("testData/quickfix/optIn/newFileAnnotationWithPackage.kt"); } + @TestMetadata("nonTopLevelAnnotation.kt") + public void testNonTopLevelAnnotation() throws Exception { + runTest("testData/quickfix/optIn/nonTopLevelAnnotation.kt"); + } + + @TestMetadata("nonTopLevelAnnotation2.kt") + public void testNonTopLevelAnnotation2() throws Exception { + runTest("testData/quickfix/optIn/nonTopLevelAnnotation2.kt"); + } + @TestMetadata("optInUnused.kt") public void testOptInUnused() throws Exception { runTest("testData/quickfix/optIn/optInUnused.kt"); @@ -11447,6 +11467,11 @@ public abstract class K1QuickFixTestGenerated extends AbstractK1QuickFixTest { runTest("testData/quickfix/optIn/override.kt"); } + @TestMetadata("overrideFir.kt") + public void testOverrideFir() throws Exception { + runTest("testData/quickfix/optIn/overrideFir.kt"); + } + @TestMetadata("propagateOptIn.kt") public void testPropagateOptIn() throws Exception { runTest("testData/quickfix/optIn/propagateOptIn.kt"); @@ -11487,6 +11512,11 @@ public abstract class K1QuickFixTestGenerated extends AbstractK1QuickFixTest { runTest("testData/quickfix/optIn/propagateOptIn8.kt"); } + @TestMetadata("propagateOptIn8Fir.kt") + public void testPropagateOptIn8Fir() throws Exception { + runTest("testData/quickfix/optIn/propagateOptIn8Fir.kt"); + } + @TestMetadata("propagateSubclassOptInRequired.kt") public void testPropagateSubclassOptInRequired() throws Exception { runTest("testData/quickfix/optIn/propagateSubclassOptInRequired.kt"); diff --git a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiFileTestGenerated.java b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiFileTestGenerated.java index 76c6cdf037f1..30aff794671c 100644 --- a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiFileTestGenerated.java +++ b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiFileTestGenerated.java @@ -2026,19 +2026,43 @@ public abstract class QuickFixMultiFileTestGenerated extends AbstractQuickFixMul @RunWith(JUnit3RunnerWithInners.class) @TestMetadata("testData/quickfix/optIn") - public static class OptIn extends AbstractQuickFixMultiFileTest { - private void runTest(String testDataFilePath) throws Exception { - KotlinTestUtils.runTest(this::doTestWithExtraFile, this, testDataFilePath); - } + public abstract static class OptIn extends AbstractQuickFixMultiFileTest { + @RunWith(JUnit3RunnerWithInners.class) + @TestMetadata("testData/quickfix/optIn/multifile") + public static class Multifile extends AbstractQuickFixMultiFileTest { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTestWithExtraFile, this, testDataFilePath); + } - @TestMetadata("reservedKeywordPackage.test") - public void testReservedKeywordPackage() throws Exception { - runTest("testData/quickfix/optIn/reservedKeywordPackage.test"); - } + @TestMetadata("apiFromJava.test") + public void testApiFromJava() throws Exception { + runTest("testData/quickfix/optIn/multifile/apiFromJava.test"); + } - @TestMetadata("reservedKeywordPackage2.test") - public void testReservedKeywordPackage2() throws Exception { - runTest("testData/quickfix/optIn/reservedKeywordPackage2.test"); + @TestMetadata("apiFromJava2.test") + public void testApiFromJava2() throws Exception { + runTest("testData/quickfix/optIn/multifile/apiFromJava2.test"); + } + + @TestMetadata("apiFromJava3.test") + public void testApiFromJava3() throws Exception { + runTest("testData/quickfix/optIn/multifile/apiFromJava3.test"); + } + + @TestMetadata("apiFromJava4.test") + public void testApiFromJava4() throws Exception { + runTest("testData/quickfix/optIn/multifile/apiFromJava4.test"); + } + + @TestMetadata("reservedKeywordPackage.test") + public void testReservedKeywordPackage() throws Exception { + runTest("testData/quickfix/optIn/multifile/reservedKeywordPackage.test"); + } + + @TestMetadata("reservedKeywordPackage2.test") + public void testReservedKeywordPackage2() throws Exception { + runTest("testData/quickfix/optIn/multifile/reservedKeywordPackage2.test"); + } } } diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/annotationInTopLevelProperty.kt b/plugins/kotlin/idea/tests/testData/quickfix/optIn/annotationInTopLevelProperty.kt index 1cf5f066a6f0..4e93d95663f0 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/optIn/annotationInTopLevelProperty.kt +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/annotationInTopLevelProperty.kt @@ -1,7 +1,4 @@ // "Propagate 'TopMarker' opt-in requirement to 'topUserVal'" "true" -// IGNORE_FIR -// COMPILER_ARGUMENTS: -opt-in=kotlin.RequiresOptIn -// WITH_STDLIB @RequiresOptIn annotation class TopMarker diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/annotationInTopLevelProperty.kt.after b/plugins/kotlin/idea/tests/testData/quickfix/optIn/annotationInTopLevelProperty.kt.after index 4d3afe3fc9f7..61c3b430d528 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/optIn/annotationInTopLevelProperty.kt.after +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/annotationInTopLevelProperty.kt.after @@ -1,7 +1,4 @@ // "Propagate 'TopMarker' opt-in requirement to 'topUserVal'" "true" -// IGNORE_FIR -// COMPILER_ARGUMENTS: -opt-in=kotlin.RequiresOptIn -// WITH_STDLIB @RequiresOptIn annotation class TopMarker diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/basicFunction.kt b/plugins/kotlin/idea/tests/testData/quickfix/optIn/basicFunction.kt index 0bc5347f5f32..96889c288502 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/optIn/basicFunction.kt +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/basicFunction.kt @@ -1,7 +1,4 @@ // "Propagate 'MyExperimentalAPI' opt-in requirement to 'bar'" "true" -// IGNORE_FIR -// COMPILER_ARGUMENTS: -opt-in=kotlin.RequiresOptIn -// WITH_STDLIB @RequiresOptIn annotation class MyExperimentalAPI diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/basicFunction.kt.after b/plugins/kotlin/idea/tests/testData/quickfix/optIn/basicFunction.kt.after index 316a0dbe6fd5..5879d26d0ea7 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/optIn/basicFunction.kt.after +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/basicFunction.kt.after @@ -1,7 +1,4 @@ // "Propagate 'MyExperimentalAPI' opt-in requirement to 'bar'" "true" -// IGNORE_FIR -// COMPILER_ARGUMENTS: -opt-in=kotlin.RequiresOptIn -// WITH_STDLIB @RequiresOptIn annotation class MyExperimentalAPI diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/basicFunctionContainingClass.kt b/plugins/kotlin/idea/tests/testData/quickfix/optIn/basicFunctionContainingClass.kt index 13dc138a0cf9..eb8cf846b20c 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/optIn/basicFunctionContainingClass.kt +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/basicFunctionContainingClass.kt @@ -1,7 +1,4 @@ // "Propagate 'MyExperimentalAPI' opt-in requirement to containing class 'Bar'" "true" -// IGNORE_FIR -// COMPILER_ARGUMENTS: -opt-in=kotlin.RequiresOptIn -// WITH_STDLIB @RequiresOptIn annotation class MyExperimentalAPI diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/basicFunctionContainingClass.kt.after b/plugins/kotlin/idea/tests/testData/quickfix/optIn/basicFunctionContainingClass.kt.after index edacb9206340..473562e08b5c 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/optIn/basicFunctionContainingClass.kt.after +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/basicFunctionContainingClass.kt.after @@ -1,7 +1,4 @@ // "Propagate 'MyExperimentalAPI' opt-in requirement to containing class 'Bar'" "true" -// IGNORE_FIR -// COMPILER_ARGUMENTS: -opt-in=kotlin.RequiresOptIn -// WITH_STDLIB @RequiresOptIn annotation class MyExperimentalAPI diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/basicFunctionNotApplicableFir.kt b/plugins/kotlin/idea/tests/testData/quickfix/optIn/basicFunctionNotApplicableFir.kt new file mode 100644 index 000000000000..cccc98cc5ccf --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/basicFunctionNotApplicableFir.kt @@ -0,0 +1,27 @@ +// "Propagate 'MyExperimentalAPI' opt-in requirement to 'bar'" "false" +// IGNORE_FE10 +// COMPILER_ARGUMENTS: -opt-in=kotlin.RequiresOptIn +// WITH_STDLIB +// ACTION: Opt in for 'MyExperimentalAPI' in containing file 'basicFunctionNotApplicableFir.kt' +// ACTION: Opt in for 'MyExperimentalAPI' on 'bar' +// ACTION: Opt in for 'MyExperimentalAPI' on containing class 'Bar' +// ACTION: Propagate 'MyExperimentalAPI' opt-in requirement to containing class 'Bar' +// ERROR: This declaration needs opt-in. Its usage must be marked with '@MyExperimentalAPI' or '@OptIn(MyExperimentalAPI::class)' +// ERROR: This declaration needs opt-in. Its usage must be marked with '@MyExperimentalAPI' or '@OptIn(MyExperimentalAPI::class)' +// ERROR: This annotation is not applicable to target 'member function' + +@RequiresOptIn +@Target(AnnotationTarget.CLASS) +annotation class MyExperimentalAPI + +@MyExperimentalAPI +class Some { + @MyExperimentalAPI + fun foo() {} +} + +class Bar { + fun bar() { + Some().foo() + } +} diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/basicUseOptIn.kt b/plugins/kotlin/idea/tests/testData/quickfix/optIn/basicUseOptIn.kt index 7044b8f9b08d..922cf7a235c7 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/optIn/basicUseOptIn.kt +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/basicUseOptIn.kt @@ -1,8 +1,5 @@ // "Opt in for 'MyExperimentalAPI' on 'bar'" "true" -// IGNORE_FIR // PRIORITY: HIGH -// COMPILER_ARGUMENTS: -opt-in=kotlin.RequiresOptIn -// WITH_STDLIB package a.b diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/basicUseOptIn.kt.after b/plugins/kotlin/idea/tests/testData/quickfix/optIn/basicUseOptIn.kt.after index 9267652a5484..7a67b810b18e 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/optIn/basicUseOptIn.kt.after +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/basicUseOptIn.kt.after @@ -1,8 +1,5 @@ // "Opt in for 'MyExperimentalAPI' on 'bar'" "true" -// IGNORE_FIR // PRIORITY: HIGH -// COMPILER_ARGUMENTS: -opt-in=kotlin.RequiresOptIn -// WITH_STDLIB package a.b diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/classUseOptIn.kt b/plugins/kotlin/idea/tests/testData/quickfix/optIn/classUseOptIn.kt index bc8da3a08e22..103e15a5564b 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/optIn/classUseOptIn.kt +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/classUseOptIn.kt @@ -1,8 +1,5 @@ // "Opt in for 'MyExperimentalAPI' on containing class 'Bar'" "true" -// IGNORE_FIR // PRIORITY: HIGH -// COMPILER_ARGUMENTS: -opt-in=kotlin.RequiresOptIn -// WITH_STDLIB package a.b diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/classUseOptIn.kt.after b/plugins/kotlin/idea/tests/testData/quickfix/optIn/classUseOptIn.kt.after index 1bfb90a31d11..61ae40202c56 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/optIn/classUseOptIn.kt.after +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/classUseOptIn.kt.after @@ -1,8 +1,5 @@ // "Opt in for 'MyExperimentalAPI' on containing class 'Bar'" "true" -// IGNORE_FIR // PRIORITY: HIGH -// COMPILER_ARGUMENTS: -opt-in=kotlin.RequiresOptIn -// WITH_STDLIB package a.b diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/functionInLocalClass.kt b/plugins/kotlin/idea/tests/testData/quickfix/optIn/functionInLocalClass.kt index 342246fa1b07..58f165942bf6 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/optIn/functionInLocalClass.kt +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/functionInLocalClass.kt @@ -1,7 +1,4 @@ // "Propagate 'MyExperimentalAPI' opt-in requirement to 'outer'" "true" -// IGNORE_FIR -// COMPILER_ARGUMENTS: -opt-in=kotlin.RequiresOptIn -// WITH_STDLIB @RequiresOptIn @Target(AnnotationTarget.FUNCTION) diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/functionInLocalClass.kt.after b/plugins/kotlin/idea/tests/testData/quickfix/optIn/functionInLocalClass.kt.after index a3601b944df0..41e357545cf1 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/optIn/functionInLocalClass.kt.after +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/functionInLocalClass.kt.after @@ -1,7 +1,4 @@ // "Propagate 'MyExperimentalAPI' opt-in requirement to 'outer'" "true" -// IGNORE_FIR -// COMPILER_ARGUMENTS: -opt-in=kotlin.RequiresOptIn -// WITH_STDLIB @RequiresOptIn @Target(AnnotationTarget.FUNCTION) diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/hasOptInAnnotation.kt b/plugins/kotlin/idea/tests/testData/quickfix/optIn/hasOptInAnnotation.kt index bd9ba4420cde..da5e7a14c412 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/optIn/hasOptInAnnotation.kt +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/hasOptInAnnotation.kt @@ -1,6 +1,4 @@ // "Opt in for 'B' on 'root'" "true" -// IGNORE_FIR -// WITH_STDLIB @RequiresOptIn annotation class A diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/hasOptInAnnotation.kt.after b/plugins/kotlin/idea/tests/testData/quickfix/optIn/hasOptInAnnotation.kt.after index e2d12570a5ff..827a557519d2 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/optIn/hasOptInAnnotation.kt.after +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/hasOptInAnnotation.kt.after @@ -1,6 +1,4 @@ // "Opt in for 'B' on 'root'" "true" -// IGNORE_FIR -// WITH_STDLIB @RequiresOptIn annotation class A diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/hasOptInAnnotation2.kt b/plugins/kotlin/idea/tests/testData/quickfix/optIn/hasOptInAnnotation2.kt index d9ce69dded43..2c5ddc1b5067 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/optIn/hasOptInAnnotation2.kt +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/hasOptInAnnotation2.kt @@ -1,6 +1,4 @@ // "Opt in for 'A' on 'root'" "true" -// IGNORE_FIR -// WITH_STDLIB @RequiresOptIn annotation class A diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/hasOptInAnnotation2.kt.after b/plugins/kotlin/idea/tests/testData/quickfix/optIn/hasOptInAnnotation2.kt.after index abd7cf640c85..bbefbc418ba1 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/optIn/hasOptInAnnotation2.kt.after +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/hasOptInAnnotation2.kt.after @@ -1,6 +1,4 @@ // "Opt in for 'A' on 'root'" "true" -// IGNORE_FIR -// WITH_STDLIB @RequiresOptIn annotation class A diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/hasOptInAnnotation3.kt b/plugins/kotlin/idea/tests/testData/quickfix/optIn/hasOptInAnnotation3.kt index 2adad78c3fda..2e4cbe9fd97b 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/optIn/hasOptInAnnotation3.kt +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/hasOptInAnnotation3.kt @@ -1,6 +1,4 @@ // "Opt in for 'A' on 'root'" "true" -// IGNORE_FIR -// WITH_STDLIB @RequiresOptIn annotation class A diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/hasOptInAnnotation3.kt.after b/plugins/kotlin/idea/tests/testData/quickfix/optIn/hasOptInAnnotation3.kt.after index 7bf918add92e..570e50364f76 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/optIn/hasOptInAnnotation3.kt.after +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/hasOptInAnnotation3.kt.after @@ -1,6 +1,4 @@ // "Opt in for 'A' on 'root'" "true" -// IGNORE_FIR -// WITH_STDLIB @RequiresOptIn annotation class A diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/hasOptInAnnotationForClass.kt b/plugins/kotlin/idea/tests/testData/quickfix/optIn/hasOptInAnnotationForClass.kt index f2630108d98e..5c5a3229bbc0 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/optIn/hasOptInAnnotationForClass.kt +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/hasOptInAnnotationForClass.kt @@ -1,6 +1,4 @@ // "Opt in for 'B' on containing class 'C'" "true" -// IGNORE_FIR -// WITH_STDLIB @RequiresOptIn annotation class A diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/hasOptInAnnotationForClass.kt.after b/plugins/kotlin/idea/tests/testData/quickfix/optIn/hasOptInAnnotationForClass.kt.after index 118d45f6bc49..780826874d6c 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/optIn/hasOptInAnnotationForClass.kt.after +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/hasOptInAnnotationForClass.kt.after @@ -1,6 +1,4 @@ // "Opt in for 'B' on containing class 'C'" "true" -// IGNORE_FIR -// WITH_STDLIB @RequiresOptIn annotation class A diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/hasOptInAnnotationForClass2.kt b/plugins/kotlin/idea/tests/testData/quickfix/optIn/hasOptInAnnotationForClass2.kt index b300d9b1691a..304177c05f0d 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/optIn/hasOptInAnnotationForClass2.kt +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/hasOptInAnnotationForClass2.kt @@ -1,6 +1,4 @@ // "Opt in for 'B' on containing class 'C'" "true" -// IGNORE_FIR -// WITH_STDLIB @RequiresOptIn annotation class A diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/hasOptInAnnotationForClass2.kt.after b/plugins/kotlin/idea/tests/testData/quickfix/optIn/hasOptInAnnotationForClass2.kt.after index 9117dc8a9a87..6afdf48739dd 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/optIn/hasOptInAnnotationForClass2.kt.after +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/hasOptInAnnotationForClass2.kt.after @@ -1,6 +1,4 @@ // "Opt in for 'B' on containing class 'C'" "true" -// IGNORE_FIR -// WITH_STDLIB @RequiresOptIn annotation class A diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/localFunction.kt b/plugins/kotlin/idea/tests/testData/quickfix/optIn/localFunction.kt index f863ce4724eb..2eadd3e1d24f 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/optIn/localFunction.kt +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/localFunction.kt @@ -1,7 +1,4 @@ // "Propagate 'MyExperimentalAPI' opt-in requirement to 'outer'" "true" -// IGNORE_FIR -// COMPILER_ARGUMENTS: -opt-in=kotlin.RequiresOptIn -// WITH_STDLIB @RequiresOptIn annotation class MyExperimentalAPI diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/localFunction.kt.after b/plugins/kotlin/idea/tests/testData/quickfix/optIn/localFunction.kt.after index 0e006e70a783..62bc77d98b4b 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/optIn/localFunction.kt.after +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/localFunction.kt.after @@ -1,7 +1,4 @@ // "Propagate 'MyExperimentalAPI' opt-in requirement to 'outer'" "true" -// IGNORE_FIR -// COMPILER_ARGUMENTS: -opt-in=kotlin.RequiresOptIn -// WITH_STDLIB @RequiresOptIn annotation class MyExperimentalAPI diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/multifile/apiFromJava.test b/plugins/kotlin/idea/tests/testData/quickfix/optIn/multifile/apiFromJava.test new file mode 100644 index 000000000000..7b0bf038bdb1 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/multifile/apiFromJava.test @@ -0,0 +1,37 @@ +// FILE: first.before.kt +// "Opt in for 'Api' on 'test'" "true" +// ERROR: This declaration needs opt-in. Its usage must be marked with '@foo.Api' or '@OptIn(foo.Api::class)' +import foo.Bar + +fun test(){ + Bar() +} + +// FILE: foo/Api.java +// WITH_STDLIB +package foo; + +import kotlin.RequiresOptIn; +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@RequiresOptIn +@Target(ElementType.TYPE) +public @interface Api{} + +// FILE: foo/Bar.java +package foo; + +@Api +public class Bar {} + +// FILE: first.after.kt +// "Opt in for 'Api' on 'test'" "true" +// ERROR: This declaration needs opt-in. Its usage must be marked with '@foo.Api' or '@OptIn(foo.Api::class)' +import foo.Api +import foo.Bar + +@OptIn(Api::class) +fun test(){ + Bar() +} diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/multifile/apiFromJava2.test b/plugins/kotlin/idea/tests/testData/quickfix/optIn/multifile/apiFromJava2.test new file mode 100644 index 000000000000..56f768e4b5bf --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/multifile/apiFromJava2.test @@ -0,0 +1,38 @@ +// FILE: first.before.kt +// "Opt in for 'Api' in containing file 'first.before.kt'" "true" +// ERROR: This declaration needs opt-in. Its usage must be marked with '@foo.Api' or '@OptIn(foo.Api::class)' +import foo.Bar + +fun test(){ + Bar() +} + +// FILE: foo/Api.java +// WITH_STDLIB +package foo; + +import kotlin.RequiresOptIn; +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@RequiresOptIn +@Target(ElementType.TYPE) +public @interface Api{} + +// FILE: foo/Bar.java +package foo; + +@Api +public class Bar {} + +// FILE: first.after.kt +// "Opt in for 'Api' in containing file 'first.before.kt'" "true" +// ERROR: This declaration needs opt-in. Its usage must be marked with '@foo.Api' or '@OptIn(foo.Api::class)' +@file:OptIn(Api::class) + +import foo.Api +import foo.Bar + +fun test(){ + Bar() +} diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/multifile/apiFromJava3.test b/plugins/kotlin/idea/tests/testData/quickfix/optIn/multifile/apiFromJava3.test new file mode 100644 index 000000000000..0312265e2592 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/multifile/apiFromJava3.test @@ -0,0 +1,41 @@ +// FILE: first.before.kt +// "Opt in for 'Api' on containing class 'Main'" "true" +// ERROR: This declaration needs opt-in. Its usage must be marked with '@foo.Api' or '@OptIn(foo.Api::class)' +import foo.Bar + +class Main { + fun test() { + Bar() + } +} + +// FILE: foo/Api.java +// WITH_STDLIB +package foo; + +import kotlin.RequiresOptIn; +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@RequiresOptIn +@Target(ElementType.TYPE) +public @interface Api{} + +// FILE: foo/Bar.java +package foo; + +@Api +public class Bar {} + +// FILE: first.after.kt +// "Opt in for 'Api' on containing class 'Main'" "true" +// ERROR: This declaration needs opt-in. Its usage must be marked with '@foo.Api' or '@OptIn(foo.Api::class)' +import foo.Api +import foo.Bar + +@OptIn(Api::class) +class Main { + fun test() { + Bar() + } +} \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/multifile/apiFromJava4.test b/plugins/kotlin/idea/tests/testData/quickfix/optIn/multifile/apiFromJava4.test new file mode 100644 index 000000000000..ef7e5936478a --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/multifile/apiFromJava4.test @@ -0,0 +1,41 @@ +// FILE: first.before.kt +// "Propagate 'Api' opt-in requirement to containing class 'Main'" "true" +// ERROR: This declaration needs opt-in. Its usage must be marked with '@foo.Api' or '@OptIn(foo.Api::class)' +import foo.Bar + +class Main { + fun test() { + Bar() + } +} + +// FILE: foo/Api.java +// WITH_STDLIB +package foo; + +import kotlin.RequiresOptIn; +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@RequiresOptIn +@Target(ElementType.TYPE) +public @interface Api{} + +// FILE: foo/Bar.java +package foo; + +@Api +public class Bar {} + +// FILE: first.after.kt +// "Propagate 'Api' opt-in requirement to containing class 'Main'" "true" +// ERROR: This declaration needs opt-in. Its usage must be marked with '@foo.Api' or '@OptIn(foo.Api::class)' +import foo.Api +import foo.Bar + +@Api +class Main { + fun test() { + Bar() + } +} \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/reservedKeywordPackage.test b/plugins/kotlin/idea/tests/testData/quickfix/optIn/multifile/reservedKeywordPackage.test similarity index 100% rename from plugins/kotlin/idea/tests/testData/quickfix/optIn/reservedKeywordPackage.test rename to plugins/kotlin/idea/tests/testData/quickfix/optIn/multifile/reservedKeywordPackage.test diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/reservedKeywordPackage2.test b/plugins/kotlin/idea/tests/testData/quickfix/optIn/multifile/reservedKeywordPackage2.test similarity index 100% rename from plugins/kotlin/idea/tests/testData/quickfix/optIn/reservedKeywordPackage2.test rename to plugins/kotlin/idea/tests/testData/quickfix/optIn/multifile/reservedKeywordPackage2.test diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/nestedClassesFir.kt b/plugins/kotlin/idea/tests/testData/quickfix/optIn/nestedClassesFir.kt new file mode 100644 index 000000000000..994db569efb8 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/nestedClassesFir.kt @@ -0,0 +1,26 @@ +// "Propagate 'MyExperimentalAPI' opt-in requirement to containing class 'Outer'" "false" +// IGNORE_FE10 +// COMPILER_ARGUMENTS: -opt-in=kotlin.RequiresOptIn +// WITH_STDLIB +// ACTION: Opt in for 'MyExperimentalAPI' in containing file 'nestedClassesFir.kt' +// ACTION: Opt in for 'MyExperimentalAPI' on 'bar' +// ACTION: Opt in for 'MyExperimentalAPI' on containing class 'Inner' +// ACTION: Propagate 'MyExperimentalAPI' opt-in requirement to 'bar' +// ACTION: Propagate 'MyExperimentalAPI' opt-in requirement to containing class 'Inner' +// ERROR: This declaration needs opt-in. Its usage must be marked with '@MyExperimentalAPI' or '@OptIn(MyExperimentalAPI::class)' + +@RequiresOptIn +annotation class MyExperimentalAPI + +@MyExperimentalAPI +fun foo() {} + +class Outer { + class Bar { + class Inner { + fun bar() { + foo() + } + } + } +} diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/nonTopLevelAnnotation.kt b/plugins/kotlin/idea/tests/testData/quickfix/optIn/nonTopLevelAnnotation.kt new file mode 100644 index 000000000000..4ecd775dbe13 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/nonTopLevelAnnotation.kt @@ -0,0 +1,13 @@ +// "Opt in for 'NestedMarker' on 'main'" "true" + +class TopClass { + @RequiresOptIn + annotation class NestedMarker +} + +@TopClass.NestedMarker +class Main + +fun main(){ + Main() +} \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/nonTopLevelAnnotation.kt.after b/plugins/kotlin/idea/tests/testData/quickfix/optIn/nonTopLevelAnnotation.kt.after new file mode 100644 index 000000000000..1625b1a8a900 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/nonTopLevelAnnotation.kt.after @@ -0,0 +1,14 @@ +// "Opt in for 'NestedMarker' on 'main'" "true" + +class TopClass { + @RequiresOptIn + annotation class NestedMarker +} + +@TopClass.NestedMarker +class Main + +@OptIn(TopClass.NestedMarker::class) +fun main(){ + Main() +} \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/nonTopLevelAnnotation2.kt b/plugins/kotlin/idea/tests/testData/quickfix/optIn/nonTopLevelAnnotation2.kt new file mode 100644 index 000000000000..9ac5a6ce4229 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/nonTopLevelAnnotation2.kt @@ -0,0 +1,15 @@ +// "Opt in for 'NestedMarker' on 'main'" "true" + +package foo + +class TopClass { + @RequiresOptIn + annotation class NestedMarker +} + +@TopClass.NestedMarker +class Main + +fun main(){ + Main() +} \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/nonTopLevelAnnotation2.kt.after b/plugins/kotlin/idea/tests/testData/quickfix/optIn/nonTopLevelAnnotation2.kt.after new file mode 100644 index 000000000000..c1da55fd0247 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/nonTopLevelAnnotation2.kt.after @@ -0,0 +1,16 @@ +// "Opt in for 'NestedMarker' on 'main'" "true" + +package foo + +class TopClass { + @RequiresOptIn + annotation class NestedMarker +} + +@TopClass.NestedMarker +class Main + +@OptIn(TopClass.NestedMarker::class) +fun main(){ + Main() +} \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/overrideFir.kt b/plugins/kotlin/idea/tests/testData/quickfix/optIn/overrideFir.kt new file mode 100644 index 000000000000..f4c1f601ccfb --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/overrideFir.kt @@ -0,0 +1,24 @@ +// "Propagate 'MyExperimentalAPI' opt-in requirement to containing class 'Derived'" "false" +// IGNORE_FE10 +// COMPILER_ARGUMENTS: -opt-in=kotlin.RequiresOptIn +// WITH_STDLIB +// ACTION: Enable a trailing comma by default in the formatter +// ACTION: Go To Super Method +// ACTION: Opt in for 'MyExperimentalAPI' in containing file 'overrideFir.kt' +// ACTION: Opt in for 'MyExperimentalAPI' on 'foo' +// ACTION: Opt in for 'MyExperimentalAPI' on containing class 'Derived' +// ACTION: Propagate 'MyExperimentalAPI' opt-in requirement to 'foo' +// ERROR: Base declaration of supertype 'Base' needs opt-in. The declaration override must be annotated with '@MyExperimentalAPI' or '@OptIn(MyExperimentalAPI::class)' + +@RequiresOptIn +@Target(AnnotationTarget.FUNCTION) +annotation class MyExperimentalAPI + +open class Base { + @MyExperimentalAPI + open fun foo() {} +} + +class Derived : Base() { + override fun foo() {} +} diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateOptIn.kt b/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateOptIn.kt index 6ca8e353be3f..794c8c00ad72 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateOptIn.kt +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateOptIn.kt @@ -1,7 +1,4 @@ // "Propagate 'B' opt-in requirement to 'SomeImplementation'" "true" -// IGNORE_FIR -// COMPILER_ARGUMENTS: -opt-in=kotlin.RequiresOptIn -// WITH_STDLIB @RequiresOptIn annotation class A diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateOptIn.kt.after b/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateOptIn.kt.after index 7881a2fe8963..3f6d6e15f52c 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateOptIn.kt.after +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateOptIn.kt.after @@ -1,7 +1,4 @@ // "Propagate 'B' opt-in requirement to 'SomeImplementation'" "true" -// IGNORE_FIR -// COMPILER_ARGUMENTS: -opt-in=kotlin.RequiresOptIn -// WITH_STDLIB @RequiresOptIn annotation class A diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateOptIn2.kt b/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateOptIn2.kt index 72eac9c0213d..2bd74fa681aa 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateOptIn2.kt +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateOptIn2.kt @@ -1,7 +1,4 @@ // "Propagate 'UnstableApi' opt-in requirement to containing class 'Derived'" "true" -// IGNORE_FIR -// COMPILER_ARGUMENTS: -opt-in=kotlin.RequiresOptIn -// WITH_STDLIB @RequiresOptIn annotation class UnstableApi diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateOptIn2.kt.after b/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateOptIn2.kt.after index 4658fcc54a02..a671075ad8aa 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateOptIn2.kt.after +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateOptIn2.kt.after @@ -1,7 +1,4 @@ // "Propagate 'UnstableApi' opt-in requirement to containing class 'Derived'" "true" -// IGNORE_FIR -// COMPILER_ARGUMENTS: -opt-in=kotlin.RequiresOptIn -// WITH_STDLIB @RequiresOptIn annotation class UnstableApi diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateOptIn3.kt b/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateOptIn3.kt index 593e866a9931..6e6ec8ca4cdc 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateOptIn3.kt +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateOptIn3.kt @@ -1,7 +1,4 @@ // "Propagate 'UnstableApi' opt-in requirement to 'SomeImplementation'" "true" -// IGNORE_FIR -// COMPILER_ARGUMENTS: -opt-in=kotlin.RequiresOptIn -// WITH_STDLIB @RequiresOptIn annotation class UnstableApi diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateOptIn3.kt.after b/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateOptIn3.kt.after index 9347345fc23d..2dff2d3e5d67 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateOptIn3.kt.after +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateOptIn3.kt.after @@ -1,7 +1,4 @@ // "Propagate 'UnstableApi' opt-in requirement to 'SomeImplementation'" "true" -// IGNORE_FIR -// COMPILER_ARGUMENTS: -opt-in=kotlin.RequiresOptIn -// WITH_STDLIB @RequiresOptIn annotation class UnstableApi diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateOptIn4.kt b/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateOptIn4.kt index 7b9277402980..37475f8823aa 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateOptIn4.kt +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateOptIn4.kt @@ -1,7 +1,4 @@ // "Propagate 'UnstableApi' opt-in requirement to 'SomeImplementation'" "true" -// IGNORE_FIR -// COMPILER_ARGUMENTS: -opt-in=kotlin.RequiresOptIn -// WITH_STDLIB @RequiresOptIn annotation class UnstableApi diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateOptIn4.kt.after b/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateOptIn4.kt.after index c037f268ee67..51de6de0b431 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateOptIn4.kt.after +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateOptIn4.kt.after @@ -1,7 +1,4 @@ // "Propagate 'UnstableApi' opt-in requirement to 'SomeImplementation'" "true" -// IGNORE_FIR -// COMPILER_ARGUMENTS: -opt-in=kotlin.RequiresOptIn -// WITH_STDLIB @RequiresOptIn annotation class UnstableApi diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateOptIn5.kt b/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateOptIn5.kt index 7d040514db76..21c384e757db 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateOptIn5.kt +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateOptIn5.kt @@ -1,7 +1,4 @@ // "Propagate 'UnstableApi' opt-in requirement to 'SomeImplementation'" "true" -// IGNORE_FIR -// COMPILER_ARGUMENTS: -opt-in=kotlin.RequiresOptIn -// WITH_STDLIB @RequiresOptIn annotation class UnstableApi diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateOptIn5.kt.after b/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateOptIn5.kt.after index 920da3ef3470..99a6acf8b760 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateOptIn5.kt.after +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateOptIn5.kt.after @@ -1,7 +1,4 @@ // "Propagate 'UnstableApi' opt-in requirement to 'SomeImplementation'" "true" -// IGNORE_FIR -// COMPILER_ARGUMENTS: -opt-in=kotlin.RequiresOptIn -// WITH_STDLIB @RequiresOptIn annotation class UnstableApi diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateOptIn6.kt b/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateOptIn6.kt index 20867b082758..c0e936113d90 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateOptIn6.kt +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateOptIn6.kt @@ -1,7 +1,4 @@ // "Propagate 'UnstableApi' opt-in requirement to 'SomeImplementation'" "true" -// IGNORE_FIR -// COMPILER_ARGUMENTS: -opt-in=kotlin.RequiresOptIn -// WITH_STDLIB @RequiresOptIn annotation class UnstableApi diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateOptIn6.kt.after b/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateOptIn6.kt.after index 72627076924b..e29a24273696 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateOptIn6.kt.after +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateOptIn6.kt.after @@ -1,7 +1,4 @@ // "Propagate 'UnstableApi' opt-in requirement to 'SomeImplementation'" "true" -// IGNORE_FIR -// COMPILER_ARGUMENTS: -opt-in=kotlin.RequiresOptIn -// WITH_STDLIB @RequiresOptIn annotation class UnstableApi diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateOptIn7.kt b/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateOptIn7.kt index 56c5b8ac2316..68ad3bf8fd4c 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateOptIn7.kt +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateOptIn7.kt @@ -1,7 +1,4 @@ // "Propagate 'UnstableApi' opt-in requirement to 'SomeImplementation'" "true" -// IGNORE_FIR -// COMPILER_ARGUMENTS: -opt-in=kotlin.RequiresOptIn -// WITH_STDLIB @RequiresOptIn annotation class UnstableApi diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateOptIn7.kt.after b/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateOptIn7.kt.after index 1f2bef140845..c916be68c615 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateOptIn7.kt.after +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateOptIn7.kt.after @@ -1,7 +1,4 @@ // "Propagate 'UnstableApi' opt-in requirement to 'SomeImplementation'" "true" -// IGNORE_FIR -// COMPILER_ARGUMENTS: -opt-in=kotlin.RequiresOptIn -// WITH_STDLIB @RequiresOptIn annotation class UnstableApi diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateOptIn8Fir.kt b/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateOptIn8Fir.kt new file mode 100644 index 000000000000..a704026912b8 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateOptIn8Fir.kt @@ -0,0 +1,20 @@ +// "Propagate 'SubclassOptInRequired(UnstableApi::class)' opt-in requirement to 'SomeImplementation'" "false" +// IGNORE_FE10 +// ERROR: This declaration needs opt-in. Its usage must be marked with '@UnstableApi' or '@OptIn(UnstableApi::class)' +// ACTION: Opt in for 'UnstableApi' in containing file 'propagateOptIn8Fir.kt' +// ACTION: Opt in for 'UnstableApi' on 'foo' +// ACTION: Propagate 'UnstableApi' opt-in requirement to 'foo' +// COMPILER_ARGUMENTS: -opt-in=kotlin.RequiresOptIn +// WITH_STDLIB + +@RequiresOptIn +annotation class UnstableApi + +interface MockApi + +@SubclassOptInRequired(UnstableApi::class) +interface CoreLibraryApi + +fun foo() { + open class LocalClass : CoreLibraryApi +} diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateSubclassOptInRequired.kt b/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateSubclassOptInRequired.kt index 1d7fe8882539..42082c98c58a 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateSubclassOptInRequired.kt +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateSubclassOptInRequired.kt @@ -1,7 +1,4 @@ // "Propagate 'SubclassOptInRequired(UnstableApi::class)' opt-in requirement to 'SomeImplementation'" "true" -// IGNORE_FIR -// COMPILER_ARGUMENTS: -opt-in=kotlin.RequiresOptIn -// WITH_STDLIB @RequiresOptIn annotation class UnstableApi diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateSubclassOptInRequired.kt.after b/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateSubclassOptInRequired.kt.after index c46a40307f09..3a3dcab85286 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateSubclassOptInRequired.kt.after +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateSubclassOptInRequired.kt.after @@ -1,7 +1,4 @@ // "Propagate 'SubclassOptInRequired(UnstableApi::class)' opt-in requirement to 'SomeImplementation'" "true" -// IGNORE_FIR -// COMPILER_ARGUMENTS: -opt-in=kotlin.RequiresOptIn -// WITH_STDLIB @RequiresOptIn annotation class UnstableApi diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateSubclassOptInRequired2.kt b/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateSubclassOptInRequired2.kt index 4a1c79d50b38..f5b44c590d21 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateSubclassOptInRequired2.kt +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateSubclassOptInRequired2.kt @@ -1,8 +1,5 @@ // "Propagate 'SubclassOptInRequired(A::class)' opt-in requirement to 'SomeImplementation'" "true" -// IGNORE_FIR -// COMPILER_ARGUMENTS: -opt-in=kotlin.RequiresOptIn // ERROR: This declaration needs opt-in. Its usage must be marked with '@B' or '@OptIn(B::class)' -// WITH_STDLIB @RequiresOptIn annotation class A diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateSubclassOptInRequired2.kt.after b/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateSubclassOptInRequired2.kt.after index 4a23f8457667..b610dce18d91 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateSubclassOptInRequired2.kt.after +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateSubclassOptInRequired2.kt.after @@ -1,8 +1,5 @@ // "Propagate 'SubclassOptInRequired(A::class)' opt-in requirement to 'SomeImplementation'" "true" -// IGNORE_FIR -// COMPILER_ARGUMENTS: -opt-in=kotlin.RequiresOptIn // ERROR: This declaration needs opt-in. Its usage must be marked with '@B' or '@OptIn(B::class)' -// WITH_STDLIB @RequiresOptIn annotation class A diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateSubclassOptInRequired3.kt b/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateSubclassOptInRequired3.kt index dc1b47984dc2..50f063bf8e62 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateSubclassOptInRequired3.kt +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateSubclassOptInRequired3.kt @@ -1,7 +1,4 @@ // "Propagate 'SubclassOptInRequired(UnstableApi::class)' opt-in requirement to 'SomeImplementation'" "true" -// IGNORE_FIR -// COMPILER_ARGUMENTS: -opt-in=kotlin.RequiresOptIn -// WITH_STDLIB @RequiresOptIn annotation class UnstableApi diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateSubclassOptInRequired3.kt.after b/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateSubclassOptInRequired3.kt.after index acc3215318b7..7def97ccb42e 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateSubclassOptInRequired3.kt.after +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateSubclassOptInRequired3.kt.after @@ -1,7 +1,4 @@ // "Propagate 'SubclassOptInRequired(UnstableApi::class)' opt-in requirement to 'SomeImplementation'" "true" -// IGNORE_FIR -// COMPILER_ARGUMENTS: -opt-in=kotlin.RequiresOptIn -// WITH_STDLIB @RequiresOptIn annotation class UnstableApi diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateSubclassOptInRequired4.kt b/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateSubclassOptInRequired4.kt index d561e5dee9aa..2bafad443c32 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateSubclassOptInRequired4.kt +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateSubclassOptInRequired4.kt @@ -1,7 +1,4 @@ // "Propagate 'SubclassOptInRequired(UnstableApi::class)' opt-in requirement to 'SomeImplementation'" "true" -// IGNORE_FIR -// COMPILER_ARGUMENTS: -opt-in=kotlin.RequiresOptIn -// WITH_STDLIB @RequiresOptIn annotation class UnstableApi diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateSubclassOptInRequired4.kt.after b/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateSubclassOptInRequired4.kt.after index e836e5513496..d851367edb72 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateSubclassOptInRequired4.kt.after +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateSubclassOptInRequired4.kt.after @@ -1,7 +1,4 @@ // "Propagate 'SubclassOptInRequired(UnstableApi::class)' opt-in requirement to 'SomeImplementation'" "true" -// IGNORE_FIR -// COMPILER_ARGUMENTS: -opt-in=kotlin.RequiresOptIn -// WITH_STDLIB @RequiresOptIn annotation class UnstableApi diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateSubclassOptInRequired5.kt b/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateSubclassOptInRequired5.kt index 6f7aa454ff3f..a7efa19acffb 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateSubclassOptInRequired5.kt +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateSubclassOptInRequired5.kt @@ -1,7 +1,4 @@ // "Propagate 'SubclassOptInRequired(UnstableApi::class)' opt-in requirement to 'SomeImplementation'" "true" -// IGNORE_FIR -// COMPILER_ARGUMENTS: -opt-in=kotlin.RequiresOptIn -// WITH_STDLIB @RequiresOptIn annotation class UnstableApi diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateSubclassOptInRequired5.kt.after b/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateSubclassOptInRequired5.kt.after index 4f47df8b3eab..eb4e5571f990 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateSubclassOptInRequired5.kt.after +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/propagateSubclassOptInRequired5.kt.after @@ -1,7 +1,4 @@ // "Propagate 'SubclassOptInRequired(UnstableApi::class)' opt-in requirement to 'SomeImplementation'" "true" -// IGNORE_FIR -// COMPILER_ARGUMENTS: -opt-in=kotlin.RequiresOptIn -// WITH_STDLIB @RequiresOptIn annotation class UnstableApi diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/propertyInConstructor.kt b/plugins/kotlin/idea/tests/testData/quickfix/optIn/propertyInConstructor.kt index 1b4838c914b5..b0fa9376c077 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/optIn/propertyInConstructor.kt +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/propertyInConstructor.kt @@ -1,18 +1,4 @@ // "Propagate 'PropertyTypeMarker' opt-in requirement to constructor" "true" -// IGNORE_FIR -// COMPILER_ARGUMENTS: -opt-in=kotlin.RequiresOptIn -// WITH_STDLIB -// ACTION: Add '-opt-in=PropertyTypeMarker' to module light_idea_test_case compiler arguments -// ACTION: Convert to secondary constructor -// ACTION: Create test -// ACTION: Enable a trailing comma by default in the formatter -// ACTION: Introduce import alias -// ACTION: Move to class body -// ACTION: Opt in for 'PropertyTypeMarker' in containing file 'propertyInConstructor.kt' -// ACTION: Opt in for 'PropertyTypeMarker' on constructor -// ACTION: Opt in for 'PropertyTypeMarker' on containing class 'PropertyTypeContainer' -// ACTION: Propagate 'PropertyTypeMarker' opt-in requirement to constructor -// ACTION: Propagate 'PropertyTypeMarker' opt-in requirement to containing class 'PropertyTypeContainer' @RequiresOptIn annotation class PropertyTypeMarker diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/propertyInConstructor.kt.after b/plugins/kotlin/idea/tests/testData/quickfix/optIn/propertyInConstructor.kt.after index c82b01a2e978..916a528a94b0 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/optIn/propertyInConstructor.kt.after +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/propertyInConstructor.kt.after @@ -1,18 +1,4 @@ // "Propagate 'PropertyTypeMarker' opt-in requirement to constructor" "true" -// IGNORE_FIR -// COMPILER_ARGUMENTS: -opt-in=kotlin.RequiresOptIn -// WITH_STDLIB -// ACTION: Add '-opt-in=PropertyTypeMarker' to module light_idea_test_case compiler arguments -// ACTION: Convert to secondary constructor -// ACTION: Create test -// ACTION: Enable a trailing comma by default in the formatter -// ACTION: Introduce import alias -// ACTION: Move to class body -// ACTION: Opt in for 'PropertyTypeMarker' in containing file 'propertyInConstructor.kt' -// ACTION: Opt in for 'PropertyTypeMarker' on constructor -// ACTION: Opt in for 'PropertyTypeMarker' on containing class 'PropertyTypeContainer' -// ACTION: Propagate 'PropertyTypeMarker' opt-in requirement to constructor -// ACTION: Propagate 'PropertyTypeMarker' opt-in requirement to containing class 'PropertyTypeContainer' @RequiresOptIn annotation class PropertyTypeMarker diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/propertyInConstructorAddOptInToClass.kt b/plugins/kotlin/idea/tests/testData/quickfix/optIn/propertyInConstructorAddOptInToClass.kt index c3f8d2fff727..e3c776d8b2cc 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/optIn/propertyInConstructorAddOptInToClass.kt +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/propertyInConstructorAddOptInToClass.kt @@ -1,18 +1,4 @@ // "Opt in for 'PropertyTypeMarker' on containing class 'PropertyTypeContainer'" "true" -// IGNORE_FIR -// COMPILER_ARGUMENTS: -opt-in=kotlin.RequiresOptIn -// WITH_STDLIB -// ACTION: Add '-opt-in=PropertyTypeMarker' to module light_idea_test_case compiler arguments -// ACTION: Convert to secondary constructor -// ACTION: Create test -// ACTION: Enable a trailing comma by default in the formatter -// ACTION: Introduce import alias -// ACTION: Move to class body -// ACTION: Opt in for 'PropertyTypeMarker' in containing file 'propertyInConstructorAddOptInToClass.kt' -// ACTION: Opt in for 'PropertyTypeMarker' on constructor -// ACTION: Opt in for 'PropertyTypeMarker' on containing class 'PropertyTypeContainer' -// ACTION: Propagate 'PropertyTypeMarker' opt-in requirement to constructor -// ACTION: Propagate 'PropertyTypeMarker' opt-in requirement to containing class 'PropertyTypeContainer' @RequiresOptIn annotation class PropertyTypeMarker diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/propertyInConstructorAddOptInToClass.kt.after b/plugins/kotlin/idea/tests/testData/quickfix/optIn/propertyInConstructorAddOptInToClass.kt.after index 6e650580b167..dc9d7ad1e397 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/optIn/propertyInConstructorAddOptInToClass.kt.after +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/propertyInConstructorAddOptInToClass.kt.after @@ -1,18 +1,4 @@ // "Opt in for 'PropertyTypeMarker' on containing class 'PropertyTypeContainer'" "true" -// IGNORE_FIR -// COMPILER_ARGUMENTS: -opt-in=kotlin.RequiresOptIn -// WITH_STDLIB -// ACTION: Add '-opt-in=PropertyTypeMarker' to module light_idea_test_case compiler arguments -// ACTION: Convert to secondary constructor -// ACTION: Create test -// ACTION: Enable a trailing comma by default in the formatter -// ACTION: Introduce import alias -// ACTION: Move to class body -// ACTION: Opt in for 'PropertyTypeMarker' in containing file 'propertyInConstructorAddOptInToClass.kt' -// ACTION: Opt in for 'PropertyTypeMarker' on constructor -// ACTION: Opt in for 'PropertyTypeMarker' on containing class 'PropertyTypeContainer' -// ACTION: Propagate 'PropertyTypeMarker' opt-in requirement to constructor -// ACTION: Propagate 'PropertyTypeMarker' opt-in requirement to containing class 'PropertyTypeContainer' @RequiresOptIn annotation class PropertyTypeMarker diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/propertyInConstructorAddOptInToConstructor.kt b/plugins/kotlin/idea/tests/testData/quickfix/optIn/propertyInConstructorAddOptInToConstructor.kt index 89d1e70f9eca..0f6ec8bd5420 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/optIn/propertyInConstructorAddOptInToConstructor.kt +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/propertyInConstructorAddOptInToConstructor.kt @@ -1,18 +1,5 @@ // "Opt in for 'PropertyTypeMarker' on constructor" "true" -// IGNORE_FIR -// COMPILER_ARGUMENTS: -opt-in=kotlin.RequiresOptIn -// WITH_STDLIB -// ACTION: Add '-opt-in=PropertyTypeMarker' to module light_idea_test_case compiler arguments -// ACTION: Convert to secondary constructor -// ACTION: Create test -// ACTION: Enable a trailing comma by default in the formatter -// ACTION: Introduce import alias -// ACTION: Move to class body -// ACTION: Opt in for 'PropertyTypeMarker' in containing file 'propertyInConstructorAddOptInToConstructor.kt' -// ACTION: Opt in for 'PropertyTypeMarker' on constructor -// ACTION: Opt in for 'PropertyTypeMarker' on containing class 'PropertyTypeContainer' -// ACTION: Propagate 'PropertyTypeMarker' opt-in requirement to constructor -// ACTION: Propagate 'PropertyTypeMarker' opt-in requirement to containing class 'PropertyTypeContainer' + @RequiresOptIn annotation class PropertyTypeMarker diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/propertyInConstructorAddOptInToConstructor.kt.after b/plugins/kotlin/idea/tests/testData/quickfix/optIn/propertyInConstructorAddOptInToConstructor.kt.after index e42d7ef3fff2..48ff4f76a48c 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/optIn/propertyInConstructorAddOptInToConstructor.kt.after +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/propertyInConstructorAddOptInToConstructor.kt.after @@ -1,18 +1,5 @@ // "Opt in for 'PropertyTypeMarker' on constructor" "true" -// IGNORE_FIR -// COMPILER_ARGUMENTS: -opt-in=kotlin.RequiresOptIn -// WITH_STDLIB -// ACTION: Add '-opt-in=PropertyTypeMarker' to module light_idea_test_case compiler arguments -// ACTION: Convert to secondary constructor -// ACTION: Create test -// ACTION: Enable a trailing comma by default in the formatter -// ACTION: Introduce import alias -// ACTION: Move to class body -// ACTION: Opt in for 'PropertyTypeMarker' in containing file 'propertyInConstructorAddOptInToConstructor.kt' -// ACTION: Opt in for 'PropertyTypeMarker' on constructor -// ACTION: Opt in for 'PropertyTypeMarker' on containing class 'PropertyTypeContainer' -// ACTION: Propagate 'PropertyTypeMarker' opt-in requirement to constructor -// ACTION: Propagate 'PropertyTypeMarker' opt-in requirement to containing class 'PropertyTypeContainer' + @RequiresOptIn annotation class PropertyTypeMarker diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/typeAlias.kt b/plugins/kotlin/idea/tests/testData/quickfix/optIn/typeAlias.kt index 022e8461cdf5..08f2d3522384 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/optIn/typeAlias.kt +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/typeAlias.kt @@ -1,11 +1,5 @@ // "Opt in for 'AliasMarker' on 'AliasMarkerUsage'" "true" -// IGNORE_FIR -// COMPILER_ARGUMENTS: -opt-in=kotlin.RequiresOptIn -// WITH_STDLIB -// ACTION: Add '-opt-in=AliasMarker' to module light_idea_test_case compiler arguments -// ACTION: Introduce import alias -// ACTION: Opt in for 'AliasMarker' in containing file 'typeAlias.kt' -// ACTION: Opt in for 'AliasMarker' on 'AliasMarkerUsage' + @RequiresOptIn annotation class AliasMarker diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/typeAlias.kt.after b/plugins/kotlin/idea/tests/testData/quickfix/optIn/typeAlias.kt.after index 97b201dba7b2..342bc06ddf44 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/optIn/typeAlias.kt.after +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/typeAlias.kt.after @@ -1,11 +1,5 @@ // "Opt in for 'AliasMarker' on 'AliasMarkerUsage'" "true" -// IGNORE_FIR -// COMPILER_ARGUMENTS: -opt-in=kotlin.RequiresOptIn -// WITH_STDLIB -// ACTION: Add '-opt-in=AliasMarker' to module light_idea_test_case compiler arguments -// ACTION: Introduce import alias -// ACTION: Opt in for 'AliasMarker' in containing file 'typeAlias.kt' -// ACTION: Opt in for 'AliasMarker' on 'AliasMarkerUsage' + @RequiresOptIn annotation class AliasMarker diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/typeInTopLevelProperty.kt b/plugins/kotlin/idea/tests/testData/quickfix/optIn/typeInTopLevelProperty.kt index 6f49e715893d..aad0de2ed8c1 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/optIn/typeInTopLevelProperty.kt +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/typeInTopLevelProperty.kt @@ -1,7 +1,4 @@ // "Propagate 'TopMarker' opt-in requirement to 'topUserVal'" "true" -// IGNORE_FIR -// COMPILER_ARGUMENTS: -opt-in=kotlin.RequiresOptIn -// WITH_STDLIB @RequiresOptIn annotation class TopMarker diff --git a/plugins/kotlin/idea/tests/testData/quickfix/optIn/typeInTopLevelProperty.kt.after b/plugins/kotlin/idea/tests/testData/quickfix/optIn/typeInTopLevelProperty.kt.after index 4d3afe3fc9f7..61c3b430d528 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/optIn/typeInTopLevelProperty.kt.after +++ b/plugins/kotlin/idea/tests/testData/quickfix/optIn/typeInTopLevelProperty.kt.after @@ -1,7 +1,4 @@ // "Propagate 'TopMarker' opt-in requirement to 'topUserVal'" "true" -// IGNORE_FIR -// COMPILER_ARGUMENTS: -opt-in=kotlin.RequiresOptIn -// WITH_STDLIB @RequiresOptIn annotation class TopMarker