FE1.0 Analysis API: Fix kind in implicit smart-casts info

This commit is contained in:
Simon Ogorodnik
2022-08-09 22:16:11 +02:00
committed by teamcity
parent 513af2dfbc
commit 6dd9115ee9
@@ -18,6 +18,7 @@ import org.jetbrains.kotlin.psi.KtExpression
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.calls.smartcasts.ExplicitSmartCasts
import org.jetbrains.kotlin.resolve.calls.smartcasts.MultipleSmartCasts
import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.types.checker.intersectWrappedTypes
internal class KtFe10SmartCastProvider(
@@ -51,12 +52,19 @@ internal class KtFe10SmartCastProvider(
return defaultType?.toKtType(analysisContext)
}
private fun smartCastedImplicitReceiver(type: KotlinType?, kind: KtImplicitReceiverSmartCastKind): KtImplicitReceiverSmartCast? {
if (type == null) return null
return KtImplicitReceiverSmartCast(type.toKtType(analysisContext), kind, token)
}
override fun getImplicitReceiverSmartCast(expression: KtExpression): Collection<KtImplicitReceiverSmartCast> {
val bindingContext = analysisContext.analyze(expression)
val smartCasts = bindingContext[BindingContext.IMPLICIT_RECEIVER_SMARTCAST, expression] ?: return emptyList()
return smartCasts.receiverTypes.map { (_, type) ->
val kind = KtImplicitReceiverSmartCastKind.DISPATCH // TODO provide precise kind
KtImplicitReceiverSmartCast(type.toKtType(analysisContext), kind, token)
}
val call = bindingContext[BindingContext.CALL, expression] ?: return emptyList()
val resolvedCall = bindingContext[BindingContext.RESOLVED_CALL, call] ?: return emptyList()
return listOfNotNull(
smartCastedImplicitReceiver(smartCasts.receiverTypes[resolvedCall.dispatchReceiver], KtImplicitReceiverSmartCastKind.DISPATCH),
smartCastedImplicitReceiver(smartCasts.receiverTypes[resolvedCall.extensionReceiver], KtImplicitReceiverSmartCastKind.EXTENSION)
)
}
}