diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/UnnecessaryOptInAnnotationInspection.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/UnnecessaryOptInAnnotationInspection.kt index 87f787f1588d..0fa7072d2bdc 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/UnnecessaryOptInAnnotationInspection.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/UnnecessaryOptInAnnotationInspection.kt @@ -236,7 +236,12 @@ private class MarkerCollector(private val resolutionFacade: ResolutionFacade) { * @param moduleApiVersion the API version of the current module to check `@WasExperimental` annotations */ private fun KotlinType.collectMarkers(moduleApiVersion: ApiVersion) { - arguments.forEach { it.type.collectMarkers(moduleApiVersion) } + arguments.forEach { + if (!it.isStarProjection) { + it.type.collectMarkers(moduleApiVersion) + } + } + val descriptor = this.constructor.declarationDescriptor ?: return descriptor.collectMarkers(moduleApiVersion) } diff --git a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java index fbffc5368646..89243014176e 100644 --- a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java +++ b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java @@ -15414,6 +15414,11 @@ public abstract class LocalInspectionTestGenerated extends AbstractLocalInspecti runTest("testData/inspectionsLocal/unnecessaryOptInAnnotation/noArguments.kt"); } + @TestMetadata("recursive.kt") + public void testRecursive() throws Exception { + runTest("testData/inspectionsLocal/unnecessaryOptInAnnotation/recursive.kt"); + } + @TestMetadata("redundantClassTwoMarkers.kt") public void testRedundantClassTwoMarkers() throws Exception { runTest("testData/inspectionsLocal/unnecessaryOptInAnnotation/redundantClassTwoMarkers.kt"); diff --git a/plugins/kotlin/idea/tests/testData/inspectionsLocal/unnecessaryOptInAnnotation/recursive.kt b/plugins/kotlin/idea/tests/testData/inspectionsLocal/unnecessaryOptInAnnotation/recursive.kt new file mode 100644 index 000000000000..286452abf5c0 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/inspectionsLocal/unnecessaryOptInAnnotation/recursive.kt @@ -0,0 +1,14 @@ +// WITH_STDLIB +// COMPILER_ARGUMENTS: -Xopt-in=kotlin.RequiresOptIn + +@RequiresOptIn +annotation class Marker + +lateinit var variable: RecType<*> + +@OptIn(Marker::class) +fun t() { + variable +} + +interface RecType> diff --git a/plugins/kotlin/idea/tests/testData/inspectionsLocal/unnecessaryOptInAnnotation/recursive.kt.after b/plugins/kotlin/idea/tests/testData/inspectionsLocal/unnecessaryOptInAnnotation/recursive.kt.after new file mode 100644 index 000000000000..6259668fc3d7 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/inspectionsLocal/unnecessaryOptInAnnotation/recursive.kt.after @@ -0,0 +1,13 @@ +// WITH_STDLIB +// COMPILER_ARGUMENTS: -Xopt-in=kotlin.RequiresOptIn + +@RequiresOptIn +annotation class Marker + +lateinit var variable: RecType<*> + +fun t() { + variable +} + +interface RecType>