[FIR] Add session parameter to all "element --> reference" utilities

`FirDeserializedEnumAccessExpression` requires session to build proper
  reference, so it's important to have it in all utilities, which may
  pass this element as input

^KT-64975
This commit is contained in:
Dmitriy Novozhilov
2024-01-17 16:56:31 +02:00
committed by Space Team
parent bd9cb2b7e0
commit 150ff1172e
34 changed files with 151 additions and 78 deletions
@@ -22,7 +22,7 @@ import org.jetbrains.kotlin.name.JsStandardClassIds
object FirJsDefinedExternallyCallChecker : FirBasicExpressionChecker(MppCheckerKind.Common) {
override fun check(expression: FirStatement, context: CheckerContext, reporter: DiagnosticReporter) {
val symbol = expression.toReference()?.toResolvedCallableSymbol() ?: return
val symbol = expression.toReference(context.session)?.toResolvedCallableSymbol() ?: return
if (symbol.callableId !in JsStandardClassIds.Callables.definedExternallyPropertyNames) {
return
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.KtFakeSourceElementKind
import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.diagnostics.reportOn
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.analysis.checkers.MppCheckerKind
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
import org.jetbrains.kotlin.fir.analysis.checkers.expression.FirQualifiedAccessExpressionChecker
@@ -42,7 +43,7 @@ object FirJsDynamicCallChecker : FirQualifiedAccessExpressionChecker(MppCheckerK
?: error("Resolved call callee without a callable symbol")
when {
expression is FirCall && expression.isArrayAccessWithMultipleIndices -> reporter.reportOn(
expression is FirCall && expression.isArrayAccessWithMultipleIndices(context.session) -> reporter.reportOn(
expression.source, FirJsErrors.WRONG_OPERATION_WITH_DYNAMIC, "indexed access with more than one index", context
)
expression is FirFunctionCall && expression.isInOperator -> reporter.reportOn(
@@ -62,22 +63,21 @@ object FirJsDynamicCallChecker : FirQualifiedAccessExpressionChecker(MppCheckerK
}
}
private val FirCall.isArrayAccessWithMultipleIndices: Boolean
get() {
val callee = toReference() as? FirNamedReference
?: return false
private fun FirCall.isArrayAccessWithMultipleIndices(session: FirSession): Boolean {
val callee = toReference(session) as? FirNamedReference
?: return false
if (callee.source?.kind != KtFakeSourceElementKind.ArrayAccessNameReference) {
return false
}
val arguments = (arguments.singleOrNull() as? FirVarargArgumentsExpression)?.arguments
?: return false
return callee.name == OperatorNameConventions.GET && arguments.size >= 2
|| callee.name == OperatorNameConventions.SET && arguments.size >= 3
if (callee.source?.kind != KtFakeSourceElementKind.ArrayAccessNameReference) {
return false
}
val arguments = (arguments.singleOrNull() as? FirVarargArgumentsExpression)?.arguments
?: return false
return callee.name == OperatorNameConventions.GET && arguments.size >= 2
|| callee.name == OperatorNameConventions.SET && arguments.size >= 3
}
private val FirFunctionCall.isInOperator
get() = calleeReference.resolved?.name == OperatorNameConventions.CONTAINS && origin == FirFunctionCallOrigin.Operator