From 65ea9697ab6ae3975564617fc531393c795195a5 Mon Sep 17 00:00:00 2001 From: Kirill Rakhman Date: Fri, 4 Aug 2023 14:56:52 +0200 Subject: [PATCH] [FIR] Let DeprecationsProvider.getDeprecationsInfo accept LanguageVersionSettings --- .../FirOptInLanguageVersionSettingsChecker.kt | 3 ++- .../declaration/FirOverrideChecker.kt | 4 +-- .../fir/declarations/deprecationUtils.kt | 15 +++++------ .../fir/declarations/DeprecationsProvider.kt | 27 ++++++++++--------- .../fir/symbols/impl/FirCallableSymbol.kt | 6 ++--- .../fir/symbols/impl/FirClassLikeSymbol.kt | 6 ++--- 6 files changed, 31 insertions(+), 30 deletions(-) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/config/FirOptInLanguageVersionSettingsChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/config/FirOptInLanguageVersionSettingsChecker.kt index 9add703470f..0f119eacd67 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/config/FirOptInLanguageVersionSettingsChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/config/FirOptInLanguageVersionSettingsChecker.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.analysis.checkers.config import org.jetbrains.kotlin.config.AnalysisFlags import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.fir.declarations.getAnnotationByClassId +import org.jetbrains.kotlin.fir.declarations.getOwnDeprecation import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider import org.jetbrains.kotlin.fir.resolve.transformers.PackageResolutionResult import org.jetbrains.kotlin.fir.resolve.transformers.resolveToPackageOrClass @@ -40,7 +41,7 @@ object FirOptInLanguageVersionSettingsChecker : FirLanguageVersionSettingsChecke rawReport(false, "Class $fqNameAsString is not an opt-in requirement marker") return } - val deprecationInfo = symbol.getOwnDeprecation(context.languageVersionSettings.apiVersion)?.all ?: return + val deprecationInfo = symbol.getOwnDeprecation(context.languageVersionSettings)?.all ?: return rawReport( deprecationInfo.deprecationLevel != DeprecationLevelValue.WARNING, "Opt-in requirement marker $fqNameAsString is deprecated" + deprecationInfo.message?.let { ". $it" }.orEmpty() diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirOverrideChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirOverrideChecker.kt index 0a35a6fe9a6..ceba8de1829 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirOverrideChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirOverrideChecker.kt @@ -172,10 +172,10 @@ object FirOverrideChecker : FirClassChecker() { overriddenSymbols: List>, context: CheckerContext ) { - val ownDeprecation = this.getDeprecation(context.session.languageVersionSettings.apiVersion) + val ownDeprecation = this.getDeprecation(context.session.languageVersionSettings) if (ownDeprecation == null || ownDeprecation.isNotEmpty()) return for (overriddenSymbol in overriddenSymbols) { - val deprecationInfoFromOverridden = overriddenSymbol.getDeprecation(context.session.languageVersionSettings.apiVersion) + val deprecationInfoFromOverridden = overriddenSymbol.getDeprecation(context.session.languageVersionSettings) ?: continue val deprecationFromOverriddenSymbol = deprecationInfoFromOverridden.all ?: deprecationInfoFromOverridden.bySpecificSite?.values?.firstOrNull() diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/declarations/deprecationUtils.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/declarations/deprecationUtils.kt index 12d9d94c227..4706e4135a0 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/declarations/deprecationUtils.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/declarations/deprecationUtils.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.fir.declarations import org.jetbrains.kotlin.config.ApiVersion +import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget import org.jetbrains.kotlin.fir.FirAnnotationContainer import org.jetbrains.kotlin.fir.FirElement @@ -91,7 +92,7 @@ private fun FirBasedSymbol<*>.getUseSitesForCallSite(callSite: FirElement?): Arr * corresponding declaration. */ fun FirBasedSymbol<*>.getOwnDeprecation(session: FirSession, callSite: FirElement?): DeprecationInfo? { - return getOwnDeprecationForCallSite(session.languageVersionSettings.apiVersion, *getUseSitesForCallSite(callSite)) + return getOwnDeprecationForCallSite(session.languageVersionSettings, *getUseSitesForCallSite(callSite)) } /** @@ -180,12 +181,12 @@ fun List.getDeprecationsProviderFromAnnotations( * corresponding declaration. */ private fun FirBasedSymbol<*>.getOwnDeprecationForCallSite( - apiVersion: ApiVersion, + languageVersionSettings: LanguageVersionSettings, vararg sites: AnnotationUseSiteTarget ): DeprecationInfo? { val deprecations = when (this) { - is FirCallableSymbol<*> -> getDeprecation(apiVersion) - is FirClassLikeSymbol<*> -> getOwnDeprecation(apiVersion) + is FirCallableSymbol<*> -> getDeprecation(languageVersionSettings) + is FirClassLikeSymbol<*> -> getOwnDeprecation(languageVersionSettings) else -> null } return (deprecations ?: EmptyDeprecationsPerUseSite).forUseSite(*sites) @@ -201,12 +202,10 @@ fun FirBasedSymbol<*>.getDeprecationForCallSite( session: FirSession, vararg sites: AnnotationUseSiteTarget, ): DeprecationInfo? { - val apiVersion = session.languageVersionSettings.apiVersion - return when (this) { - !is FirTypeAliasSymbol -> getOwnDeprecationForCallSite(apiVersion, *sites) + !is FirTypeAliasSymbol -> getOwnDeprecationForCallSite(session.languageVersionSettings, *sites) else -> { - var worstDeprecationInfo = getOwnDeprecationForCallSite(apiVersion, *sites) + var worstDeprecationInfo = getOwnDeprecationForCallSite(session.languageVersionSettings, *sites) val visited = mutableMapOf() resolvedExpandedTypeRef.type.forEachType { diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/DeprecationsProvider.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/DeprecationsProvider.kt index 240a173c5d2..b5982b5e9cf 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/DeprecationsProvider.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/DeprecationsProvider.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.fir.declarations import org.jetbrains.kotlin.config.ApiVersion +import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget import org.jetbrains.kotlin.fir.caches.FirCache import org.jetbrains.kotlin.fir.caches.FirCachesFactory @@ -16,7 +17,7 @@ import org.jetbrains.kotlin.resolve.deprecation.SimpleDeprecationInfo import org.jetbrains.kotlin.utils.addToStdlib.runUnless abstract class DeprecationsProvider { - abstract fun getDeprecationsInfo(version: ApiVersion): DeprecationsPerUseSite? + abstract fun getDeprecationsInfo(languageVersionSettings: LanguageVersionSettings): DeprecationsPerUseSite? } class DeprecationsProviderImpl( @@ -24,7 +25,7 @@ class DeprecationsProviderImpl( private val all: List?, private val bySpecificSite: Map>? ) : DeprecationsProvider() { - private val cache: FirCache = firCachesFactory.createCache { version -> + private val cache: FirCache = firCachesFactory.createCache { version -> @Suppress("UNCHECKED_CAST") DeprecationsPerUseSite( all?.computeDeprecationInfoOrNull(version), @@ -33,29 +34,29 @@ class DeprecationsProviderImpl( ) } - override fun getDeprecationsInfo(version: ApiVersion): DeprecationsPerUseSite { - return cache.getValue(version, null) + override fun getDeprecationsInfo(languageVersionSettings: LanguageVersionSettings): DeprecationsPerUseSite { + return cache.getValue(languageVersionSettings, null) } - private fun List.computeDeprecationInfoOrNull(version: ApiVersion): DeprecationInfo? { + private fun List.computeDeprecationInfoOrNull(version: LanguageVersionSettings): DeprecationInfo? { return firstNotNullOfOrNull { it.computeDeprecationInfo(version) } } } object EmptyDeprecationsProvider : DeprecationsProvider() { - override fun getDeprecationsInfo(version: ApiVersion): DeprecationsPerUseSite { + override fun getDeprecationsInfo(languageVersionSettings: LanguageVersionSettings): DeprecationsPerUseSite { return EmptyDeprecationsPerUseSite } } object UnresolvedDeprecationProvider : DeprecationsProvider() { - override fun getDeprecationsInfo(version: ApiVersion): DeprecationsPerUseSite? { + override fun getDeprecationsInfo(languageVersionSettings: LanguageVersionSettings): DeprecationsPerUseSite? { return null } } sealed interface DeprecationAnnotationInfo { - fun computeDeprecationInfo(apiVersion: ApiVersion): DeprecationInfo? + fun computeDeprecationInfo(languageVersionSettings: LanguageVersionSettings): DeprecationInfo? } data class FutureApiDeprecationInfo( @@ -67,8 +68,8 @@ data class FutureApiDeprecationInfo( } class SinceKotlinInfo(val sinceVersion: ApiVersion) : DeprecationAnnotationInfo { - override fun computeDeprecationInfo(apiVersion: ApiVersion): DeprecationInfo? { - return runUnless(sinceVersion <= apiVersion) { + override fun computeDeprecationInfo(languageVersionSettings: LanguageVersionSettings): DeprecationInfo? { + return runUnless(sinceVersion <= languageVersionSettings.apiVersion) { FutureApiDeprecationInfo( deprecationLevel = DeprecationLevelValue.HIDDEN, propagatesToOverrides = true, @@ -83,7 +84,7 @@ class DeprecatedInfo( val propagatesToOverride: Boolean, val message: String? ) : DeprecationAnnotationInfo { - override fun computeDeprecationInfo(apiVersion: ApiVersion): DeprecationInfo { + override fun computeDeprecationInfo(languageVersionSettings: LanguageVersionSettings): DeprecationInfo { return SimpleDeprecationInfo( level, propagatesToOverride, @@ -99,8 +100,8 @@ class DeprecatedSinceKotlinInfo( val message: String?, val propagatesToOverride: Boolean ) : DeprecationAnnotationInfo { - override fun computeDeprecationInfo(apiVersion: ApiVersion): DeprecationInfo? { - fun ApiVersion.takeLevelIfDeprecated(level: DeprecationLevelValue) = level.takeIf { this <= apiVersion } + override fun computeDeprecationInfo(languageVersionSettings: LanguageVersionSettings): DeprecationInfo? { + fun ApiVersion.takeLevelIfDeprecated(level: DeprecationLevelValue) = level.takeIf { this <= languageVersionSettings.apiVersion } val appliedLevel = hiddenVersion?.takeLevelIfDeprecated(DeprecationLevelValue.HIDDEN) ?: errorVersion?.takeLevelIfDeprecated(DeprecationLevelValue.ERROR) diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirCallableSymbol.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirCallableSymbol.kt index 49ec4dd13be..3ddbe4787c7 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirCallableSymbol.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirCallableSymbol.kt @@ -5,7 +5,7 @@ package org.jetbrains.kotlin.fir.symbols.impl -import org.jetbrains.kotlin.config.ApiVersion +import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase @@ -76,9 +76,9 @@ abstract class FirCallableSymbol : FirBasedSymbol val name: Name get() = callableId.callableName - fun getDeprecation(apiVersion: ApiVersion): DeprecationsPerUseSite? { + fun getDeprecation(languageVersionSettings: LanguageVersionSettings): DeprecationsPerUseSite? { lazyResolveToPhase(FirResolvePhase.COMPILER_REQUIRED_ANNOTATIONS) - return fir.deprecationsProvider.getDeprecationsInfo(apiVersion) + return fir.deprecationsProvider.getDeprecationsInfo(languageVersionSettings) } private fun ensureType(typeRef: FirTypeRef?) { diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirClassLikeSymbol.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirClassLikeSymbol.kt index 881bf0927bb..7f9ccb14273 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirClassLikeSymbol.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirClassLikeSymbol.kt @@ -5,7 +5,7 @@ package org.jetbrains.kotlin.fir.symbols.impl -import org.jetbrains.kotlin.config.ApiVersion +import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag @@ -29,10 +29,10 @@ sealed class FirClassLikeSymbol( val name get() = classId.shortClassName - fun getOwnDeprecation(apiVersion: ApiVersion): DeprecationsPerUseSite? { + fun getOwnDeprecation(languageVersionSettings: LanguageVersionSettings): DeprecationsPerUseSite? { if (annotations.isEmpty()) return null lazyResolveToPhase(FirResolvePhase.COMPILER_REQUIRED_ANNOTATIONS) - return fir.deprecationsProvider.getDeprecationsInfo(apiVersion) + return fir.deprecationsProvider.getDeprecationsInfo(languageVersionSettings) } val rawStatus: FirDeclarationStatus