diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExperimentalUsageChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExperimentalUsageChecker.kt index 320d7c416f6..89ead0f60ca 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExperimentalUsageChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExperimentalUsageChecker.kt @@ -21,7 +21,6 @@ import com.intellij.psi.PsiElement import org.jetbrains.kotlin.config.AnalysisFlag import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.descriptors.* -import org.jetbrains.kotlin.descriptors.annotations.Annotated import org.jetbrains.kotlin.diagnostics.Errors import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.name.FqName @@ -64,9 +63,9 @@ class ExperimentalUsageChecker(project: Project) : CallChecker { companion object { val EXPERIMENTAL_FQ_NAME = FqName("kotlin.Experimental") internal val USE_EXPERIMENTAL_FQ_NAME = FqName("kotlin.UseExperimental") - private val WAS_EXPERIMENTAL_FQ_NAME = FqName("kotlin.WasExperimental") + internal val WAS_EXPERIMENTAL_FQ_NAME = FqName("kotlin.WasExperimental") internal val USE_EXPERIMENTAL_ANNOTATION_CLASS = Name.identifier("markerClass") - private val WAS_EXPERIMENTAL_ANNOTATION_CLASS = Name.identifier("markerClass") + internal val WAS_EXPERIMENTAL_ANNOTATION_CLASS = Name.identifier("markerClass") private val LEVEL = Name.identifier("level") private val WARNING_LEVEL = Name.identifier("WARNING") @@ -178,20 +177,6 @@ class ExperimentalUsageChecker(project: Project) : CallChecker { } } - internal fun Annotated.loadWasExperimentalMarkerClasses(): List { - val wasExperimental = annotations.findAnnotation(WAS_EXPERIMENTAL_FQ_NAME) - if (wasExperimental != null) { - val annotationClasses = wasExperimental.allValueArguments[WAS_EXPERIMENTAL_ANNOTATION_CLASS] - if (annotationClasses is ArrayValue) { - return annotationClasses.value.mapNotNull { annotationClass -> - (annotationClass as? KClassValue)?.value?.constructor?.declarationDescriptor as? ClassDescriptor - } - } - } - - return emptyList() - } - fun checkCompilerArguments( module: ModuleDescriptor, languageVersionSettings: LanguageVersionSettings, diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/sinceKotlinUtil.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/sinceKotlinUtil.kt index 10077bb2787..de9c5960539 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/sinceKotlinUtil.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/sinceKotlinUtil.kt @@ -8,9 +8,12 @@ package org.jetbrains.kotlin.resolve import org.jetbrains.kotlin.config.ApiVersion import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.descriptors.* +import org.jetbrains.kotlin.descriptors.annotations.Annotated import org.jetbrains.kotlin.descriptors.impl.TypeAliasConstructorDescriptor import org.jetbrains.kotlin.resolve.calls.util.FakeCallableDescriptorForTypeAliasObject import org.jetbrains.kotlin.resolve.checkers.ExperimentalUsageChecker +import org.jetbrains.kotlin.resolve.constants.ArrayValue +import org.jetbrains.kotlin.resolve.constants.KClassValue sealed class SinceKotlinAccessibility { object Accessible : SinceKotlinAccessibility() @@ -74,10 +77,7 @@ private fun DeclarationDescriptor.getOwnSinceKotlinVersion(): SinceKotlinValue? if (apiVersion != null) { // TODO: combine wasExperimentalMarkerClasses in case of several associated declarations with the same maximal API version if (result == null || apiVersion > result!!.apiVersion) { - result = SinceKotlinValue( - apiVersion, - with(ExperimentalUsageChecker) { loadWasExperimentalMarkerClasses() } - ) + result = SinceKotlinValue(apiVersion, loadWasExperimentalMarkerClasses()) } } } @@ -101,3 +101,17 @@ private fun DeclarationDescriptor.getOwnSinceKotlinVersion(): SinceKotlinValue? return result } + +private fun Annotated.loadWasExperimentalMarkerClasses(): List { + val wasExperimental = annotations.findAnnotation(ExperimentalUsageChecker.WAS_EXPERIMENTAL_FQ_NAME) + if (wasExperimental != null) { + val annotationClasses = wasExperimental.allValueArguments[ExperimentalUsageChecker.WAS_EXPERIMENTAL_ANNOTATION_CLASS] + if (annotationClasses is ArrayValue) { + return annotationClasses.value.mapNotNull { annotationClass -> + (annotationClass as? KClassValue)?.value?.constructor?.declarationDescriptor as? ClassDescriptor + } + } + } + + return emptyList() +}