OptIn: handle usages via type aliases properly
This commit is contained in:
committed by
teamcityserver
parent
b4ee116de7
commit
eb9c658c1c
+14
-6
@@ -46,6 +46,7 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.annotationClass
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.module
|
||||
import org.jetbrains.kotlin.storage.LockBasedStorageManager
|
||||
import org.jetbrains.kotlin.types.AbbreviatedType
|
||||
import org.jetbrains.kotlin.types.KotlinType
|
||||
import org.jetbrains.kotlin.types.isError
|
||||
import org.jetbrains.kotlin.utils.SmartSet
|
||||
@@ -237,12 +238,19 @@ class ExperimentalUsageChecker(project: Project) : CallChecker {
|
||||
languageVersionSettings: LanguageVersionSettings,
|
||||
visitedClassifiers: MutableSet<DeclarationDescriptor>
|
||||
): Set<Experimentality> =
|
||||
if (this?.isError != false) emptySet()
|
||||
else constructor.declarationDescriptor?.loadExperimentalities(
|
||||
moduleAnnotationsResolver, languageVersionSettings, visitedClassifiers
|
||||
).orEmpty() + arguments.flatMap {
|
||||
if (it.isStarProjection) emptySet()
|
||||
else it.type.loadExperimentalities(moduleAnnotationsResolver, languageVersionSettings, visitedClassifiers)
|
||||
when {
|
||||
this?.isError != false -> emptySet()
|
||||
this is AbbreviatedType -> abbreviation.constructor.declarationDescriptor?.loadExperimentalities(
|
||||
moduleAnnotationsResolver, languageVersionSettings, visitedClassifiers
|
||||
).orEmpty() + expandedType.loadExperimentalities(
|
||||
moduleAnnotationsResolver, languageVersionSettings, visitedClassifiers
|
||||
)
|
||||
else -> constructor.declarationDescriptor?.loadExperimentalities(
|
||||
moduleAnnotationsResolver, languageVersionSettings, visitedClassifiers
|
||||
).orEmpty() + arguments.flatMap {
|
||||
if (it.isStarProjection) emptySet()
|
||||
else it.type.loadExperimentalities(moduleAnnotationsResolver, languageVersionSettings, visitedClassifiers)
|
||||
}
|
||||
}
|
||||
|
||||
internal fun ClassDescriptor.loadExperimentalityForMarkerAnnotation(): Experimentality? {
|
||||
|
||||
+10
@@ -2,6 +2,7 @@
|
||||
|
||||
@RequiresOptIn
|
||||
@Retention(AnnotationRetention.BINARY)
|
||||
@Target(AnnotationTarget.CLASS, AnnotationTarget.PROPERTY, AnnotationTarget.TYPEALIAS)
|
||||
annotation class Marker
|
||||
|
||||
@Marker
|
||||
@@ -59,8 +60,17 @@ class A : I
|
||||
@OptIn(Marker::class)
|
||||
class B : I
|
||||
|
||||
@OptIn(Marker::class)
|
||||
typealias MyList = ArrayList<I>
|
||||
|
||||
@Marker
|
||||
typealias YourList = ArrayList<String>
|
||||
|
||||
fun main() {
|
||||
val x = listOf(A(), B())
|
||||
val y = MyList()
|
||||
val z = YourList()
|
||||
YourList().add("")
|
||||
}
|
||||
|
||||
@Marker
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
@RequiresOptIn
|
||||
@Retention(AnnotationRetention.BINARY)
|
||||
@Target(AnnotationTarget.CLASS, AnnotationTarget.PROPERTY, AnnotationTarget.TYPEALIAS)
|
||||
annotation class Marker
|
||||
|
||||
@Marker
|
||||
@@ -59,8 +60,17 @@ class A : I
|
||||
@OptIn(Marker::class)
|
||||
class B : I
|
||||
|
||||
@OptIn(Marker::class)
|
||||
typealias MyList = ArrayList<I>
|
||||
|
||||
@Marker
|
||||
typealias YourList = ArrayList<String>
|
||||
|
||||
fun main() {
|
||||
val x = <!EXPERIMENTAL_API_USAGE_ERROR!>listOf<!>(A(), B())
|
||||
val y = <!EXPERIMENTAL_API_USAGE_ERROR!>MyList<!>()
|
||||
val z = <!EXPERIMENTAL_API_USAGE_ERROR!>YourList<!>()
|
||||
<!EXPERIMENTAL_API_USAGE_ERROR!>YourList<!>().add("")
|
||||
}
|
||||
|
||||
@Marker
|
||||
|
||||
+3
-1
@@ -64,7 +64,7 @@ public final data class DataClass {
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
@kotlin.RequiresOptIn @kotlin.annotation.Retention(value = AnnotationRetention.BINARY) public final annotation class Marker : kotlin.Annotation {
|
||||
@kotlin.RequiresOptIn @kotlin.annotation.Retention(value = AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS, AnnotationTarget.PROPERTY, AnnotationTarget.TYPEALIAS}) public final annotation class Marker : kotlin.Annotation {
|
||||
public constructor Marker()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
@@ -112,4 +112,6 @@ public abstract class User {
|
||||
public final fun Some?.onSome(): kotlin.Unit
|
||||
}
|
||||
public typealias My = Some
|
||||
@kotlin.OptIn(markerClass = {Marker::class}) public typealias MyList = kotlin.collections.ArrayList<I>
|
||||
@Marker public typealias YourList = kotlin.collections.ArrayList<kotlin.String>
|
||||
|
||||
|
||||
@@ -75,5 +75,5 @@ fun use() {
|
||||
<!EXPERIMENTAL_API_USAGE!>function<!>()
|
||||
<!EXPERIMENTAL_API_USAGE!>property<!>
|
||||
val s: <!EXPERIMENTAL_API_USAGE!>Typealias<!> = ""
|
||||
s.hashCode()
|
||||
<!EXPERIMENTAL_API_USAGE!>s<!>.hashCode()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user