From fd1c885c5bc2a7bb1c9801ebe182bf1568a37749 Mon Sep 17 00:00:00 2001 From: Marco Pennekamp Date: Tue, 31 Oct 2023 18:00:40 +0100 Subject: [PATCH] [FIR] Allow "missing from dependencies" severity names in opt-in usage checker - KT-62397 occurs in the IDE because enum entry symbols from libraries are deserialized from stubs, which currently produce `FirFromMissingDependenciesNamedReference`. - During opt-in usage checks, the compiler only considered resolved references when getting the severity name, but we can just take the name from the `FirFromMissingDependenciesNamedReference`. ^KT-62397 fixed --- .../checkers/expression/FirOptInUsageBaseChecker.kt | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirOptInUsageBaseChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirOptInUsageBaseChecker.kt index dcb9a10b477..035118144fb 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirOptInUsageBaseChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirOptInUsageBaseChecker.kt @@ -21,7 +21,8 @@ import org.jetbrains.kotlin.fir.declarations.utils.isData import org.jetbrains.kotlin.fir.declarations.utils.nameOrSpecialName import org.jetbrains.kotlin.fir.expressions.FirConstExpression import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression -import org.jetbrains.kotlin.fir.references.resolved +import org.jetbrains.kotlin.fir.references.FirErrorNamedReference +import org.jetbrains.kotlin.fir.references.FirNamedReference import org.jetbrains.kotlin.fir.resolve.fullyExpandedType import org.jetbrains.kotlin.fir.resolve.toFirRegularClassSymbol import org.jetbrains.kotlin.fir.resolve.toSymbol @@ -273,7 +274,13 @@ object FirOptInUsageBaseChecker { ?: return null val levelArgument = experimental.findArgumentByName(LEVEL) as? FirQualifiedAccessExpression - val levelName = levelArgument?.calleeReference?.resolved?.name?.asString() + + val levelName = when (val calleeReference = levelArgument?.calleeReference) { + is FirErrorNamedReference -> null + is FirNamedReference -> calleeReference.name.asString() + else -> null + } + val severity = Experimentality.Severity.values().firstOrNull { it.name == levelName } ?: Experimentality.DEFAULT_SEVERITY val message = (experimental.findArgumentByName(MESSAGE) as? FirConstExpression<*>)?.value as? String return Experimentality(symbol.classId, severity, message, annotatedOwnerClassName)