From 6efb22cd4584b0fa8c19a374007c357957105032 Mon Sep 17 00:00:00 2001 From: Simon Ogorodnik Date: Thu, 14 Mar 2019 17:52:44 +0300 Subject: [PATCH] FIR: Support typing of type operators --- .../transformers/FirBodyResolveTransformer.kt | 29 ++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirBodyResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirBodyResolveTransformer.kt index 4790e694193..8aee45e4eba 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirBodyResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirBodyResolveTransformer.kt @@ -88,6 +88,33 @@ open class FirBodyResolveTransformer(val session: FirSession, val implicitTypeOn } } + override fun transformTypeOperatorCall(typeOperatorCall: FirTypeOperatorCall, data: Any?): CompositeTransformResult { + val symbolProvider = session.service() + val resolved = super.transformTypeOperatorCall(typeOperatorCall, data).single + when ((resolved as FirTypeOperatorCall).operation) { + FirOperation.IS, FirOperation.NOT_IS -> { + bindingContext[resolved] = FirResolvedTypeRefImpl( + session, + null, + StandardClassIds.Boolean(symbolProvider).constructType(emptyArray(), isNullable = false), + false, + emptyList() + ) + } + FirOperation.AS -> { + bindingContext[resolved] = resolved.typeRef + } + FirOperation.SAFE_AS -> { + bindingContext[resolved] = + resolved.typeRef.withReplacedConeType( + session, + resolved.typeRef.coneTypeUnsafe().withNullability(ConeNullability.NULLABLE) + ) + } + else -> error("Unknown type operator") + } + return resolved.compose() + } protected inline fun withScopeCleanup(scopes: MutableList<*>, crossinline l: () -> T): T { val sizeBefore = scopes.size @@ -187,7 +214,7 @@ open class FirBodyResolveTransformer(val session: FirSession, val implicitTypeOn }) - val result = runTowerResolver(checkers) + val result = runTowerResolver(checkers) val resultExpression = when (result) { is VariableInvokeApplicabilityChecker -> {