[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
This commit is contained in:
Marco Pennekamp
2023-10-31 18:00:40 +01:00
committed by Space Team
parent 570d9dbb19
commit fd1c885c5b
@@ -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)