diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ScopeUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ScopeUtils.kt index cc976e4599e..407cfb4c768 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ScopeUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ScopeUtils.kt @@ -28,6 +28,7 @@ fun ConeKotlinType.scope(useSiteSession: FirSession): FirScope? { val fir = this.lookupTag.toSymbol(useSiteSession)?.firUnsafe() ?: return null FirCompositeScope(fir.bounds.mapNotNullTo(mutableListOf()) { it.coneTypeUnsafe().scope(useSiteSession) }) } + is ConeFlexibleType -> lowerBound.scope(useSiteSession) else -> error("Failed type ${this}") } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CallResolver.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CallResolver.kt index 481593cd9cf..0caefacf217 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CallResolver.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CallResolver.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.resolve.calls import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration import org.jetbrains.kotlin.fir.expressions.FirExpression +import org.jetbrains.kotlin.fir.renderWithType import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider import org.jetbrains.kotlin.fir.resolve.defaultType import org.jetbrains.kotlin.fir.resolve.scope @@ -205,7 +206,8 @@ fun createSimpleConsumer( return if (explicitReceiver != null) { ExplicitReceiverTowerDataConsumer(session, name, token, object : ReceiverValueWithPossibleTypes { override val type: ConeKotlinType - get() = explicitReceiverType!!.coneTypeUnsafe() + get() = explicitReceiverType?.coneTypeUnsafe() + ?: throw AssertionError("No type calculated for ${explicitReceiver.renderWithType()}") }, callKind) } else { NoExplicitReceiverTowerDataConsumer(session, name, token, callKind) 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 1d1c3e77bbe..8bb345eb5dc 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 @@ -23,6 +23,8 @@ import org.jetbrains.kotlin.fir.visitors.compose import org.jetbrains.kotlin.ir.expressions.IrConstKind import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.impl.* +import org.jetbrains.kotlin.name.ClassId +import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.utils.addIfNotNull @@ -35,7 +37,10 @@ open class FirBodyResolveTransformer(val session: FirSession, val implicitTypeOn return (element.transformChildren(this, data) as E).compose() } + private var packageFqName = FqName.ROOT + override fun transformFile(file: FirFile, data: Any?): CompositeTransformResult { + packageFqName = file.packageFqName return withScopeCleanup(scopes) { scopes += FirTopLevelDeclaredMemberScope(file, session) super.transformFile(file, data) @@ -283,7 +288,7 @@ open class FirBodyResolveTransformer(val session: FirSession, val implicitTypeOn } override fun transformConstExpression(constExpression: FirConstExpression, data: Any?): CompositeTransformResult { - if (data == null) return constExpression.compose() + if (data == null) return super.transformConstExpression(constExpression, data) val expectedType = data as FirTypeRef if (expectedType is FirImplicitTypeRef) { @@ -315,7 +320,11 @@ open class FirBodyResolveTransformer(val session: FirSession, val implicitTypeOn @Deprecated("It is temp", level = DeprecationLevel.WARNING, replaceWith = ReplaceWith("TODO(\"что-то нормальное\")")) val bindingContext = mutableMapOf() - val FirExpression.resultType: FirTypeRef? get() = bindingContext[this] + var FirExpression.resultType: FirTypeRef? + get() = bindingContext[this] + set(type) { + if (type != null) bindingContext[this] = type + } override fun transformNamedFunction(namedFunction: FirNamedFunction, data: Any?): CompositeTransformResult { @@ -385,6 +394,14 @@ open class FirBodyResolveTransformer(val session: FirSession, val implicitTypeOn return transformVariable(property, data) } + override fun transformExpression(expression: FirExpression, data: Any?): CompositeTransformResult { + if (expression.resultType == null) { + val type = FirErrorTypeRefImpl(session, expression.psi, "Type calculating for ${expression.render()} is not supported") + expression.resultType = type + } + return super.transformExpression(expression, data) + } + fun FirElement.visitNoTransform(transformer: FirTransformer, data: D) { val result = this.transform(transformer, data) require(result.single === this) { "become ${result.single}: `${result.single.render()}`, was ${this}: `${this.render()}`" }