diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt index e7b35043b5f..0de19655523 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt @@ -7,9 +7,8 @@ package org.jetbrains.kotlin.fir.resolve import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.fir.* -import org.jetbrains.kotlin.fir.FirSession -import org.jetbrains.kotlin.fir.componentArrayAccessor import org.jetbrains.kotlin.fir.declarations.* +import org.jetbrains.kotlin.fir.expressions.FirResolvable import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccess import org.jetbrains.kotlin.fir.expressions.FirResolvedQualifier import org.jetbrains.kotlin.fir.references.FirErrorNamedReference @@ -256,10 +255,12 @@ fun BodyResolveComponents.typeForQualifier(resolvedQualifier: FirResolvedQualifi ) } - -fun BodyResolveComponents.typeFromCallee(access: T): FirResolvedTypeRef { +fun BodyResolveComponents.typeFromCallee(access: T): FirResolvedTypeRef { val makeNullable: Boolean by lazy { - access.safe && access.explicitReceiver!!.resultType.coneTypeUnsafe().isNullable + if (access is FirQualifiedAccess) + access.safe && access.explicitReceiver!!.resultType.coneTypeUnsafe().isNullable + else + false } return when (val newCallee = access.calleeReference) { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/Arguments.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/Arguments.kt index dcfd2da3a98..77ca8800155 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/Arguments.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/Arguments.kt @@ -9,7 +9,7 @@ import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction import org.jetbrains.kotlin.fir.declarations.FirValueParameter import org.jetbrains.kotlin.fir.expressions.* -import org.jetbrains.kotlin.fir.render +import org.jetbrains.kotlin.fir.resolve.inference.returnExpressions import org.jetbrains.kotlin.fir.resolve.transformers.firUnsafe import org.jetbrains.kotlin.fir.resolve.withNullability import org.jetbrains.kotlin.fir.types.* @@ -71,14 +71,14 @@ fun resolveArgumentExpression( fun resolveSubCallArgument( csBuilder: ConstraintSystemBuilder, - argument: FirFunctionCall, + argument: FirResolvable, expectedType: ConeKotlinType, sink: CheckerSink, isReceiver: Boolean, isSafeCall: Boolean, typeProvider: (FirExpression) -> FirTypeRef? ) { - val candidate = argument.candidate() ?: return resolvePlainExpressionArgument(csBuilder, argument, expectedType, sink, isReceiver, isSafeCall, typeProvider) + val candidate = argument.candidate() ?: return resolvePlainExpressionArgument(csBuilder, argument as FirExpression, expectedType, sink, isReceiver, isSafeCall, typeProvider) val type = sink.components.returnTypeCalculator.tryCalculateReturnType(candidate.symbol.firUnsafe()).coneTypeUnsafe() val argumentType = candidate.substitutor.substituteOrSelf(type) resolvePlainArgumentType(csBuilder, argumentType, expectedType, sink, isReceiver, isSafeCall) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CandidateFactory.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CandidateFactory.kt index 0c425dd0573..7ac4d4168e4 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CandidateFactory.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CandidateFactory.kt @@ -7,7 +7,6 @@ package org.jetbrains.kotlin.fir.resolve.calls import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol -import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol import org.jetbrains.kotlin.resolve.calls.components.PostponedArgumentsAnalyzer import org.jetbrains.kotlin.resolve.calls.inference.model.ConstraintStorage import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind @@ -48,7 +47,7 @@ fun PostponedArgumentsAnalyzer.Context.addSubsystemFromExpression(expression: Fi } } -internal fun FirQualifiedAccess.candidate(): Candidate? { +internal fun FirResolvable.candidate(): Candidate? { return when (val callee = this.calleeReference) { is FirNamedReferenceWithCandidate -> return callee.candidate else -> null diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirCallCompleter.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirCallCompleter.kt index f3412486905..bc11d4f2fcc 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirCallCompleter.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirCallCompleter.kt @@ -8,8 +8,9 @@ package org.jetbrains.kotlin.fir.resolve.inference import org.jetbrains.kotlin.fir.copy import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction import org.jetbrains.kotlin.fir.declarations.impl.FirValueParameterImpl +import org.jetbrains.kotlin.fir.expressions.FirBlock +import org.jetbrains.kotlin.fir.expressions.FirResolvable import org.jetbrains.kotlin.fir.expressions.FirExpression -import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccess import org.jetbrains.kotlin.fir.resolve.BodyResolveComponents import org.jetbrains.kotlin.fir.resolve.calls.* import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor @@ -35,7 +36,7 @@ class FirCallCompleter( private val transformer: FirBodyResolveTransformer, private val inferenceComponents: InferenceComponents ) : BodyResolveComponents by transformer { - fun completeCall(call: T, expectedTypeRef: FirTypeRef?): T { + fun completeCall(call: T, expectedTypeRef: FirTypeRef?): T { val typeRef = typeFromCallee(call) if (typeRef.type is ConeKotlinErrorType) { if (call is FirExpression) { @@ -48,6 +49,10 @@ class FirCallCompleter( val initialType = initialSubstitutor.substituteOrSelf(typeRef.type) + if (call is FirExpression) { + call.resultType = typeRef.resolvedTypeFromPrototype(initialType) + } + if (expectedTypeRef is FirResolvedTypeRef) { candidate.system.addSubtypeConstraint(initialType, expectedTypeRef.type, SimpleConstraintSystemConstraintPosition) } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirQualifiedAccess.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirQualifiedAccess.kt index d5163dcacae..561d488d924 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirQualifiedAccess.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirQualifiedAccess.kt @@ -5,13 +5,10 @@ package org.jetbrains.kotlin.fir.expressions -import org.jetbrains.kotlin.fir.FirReference import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.fir.visitors.FirVisitor -interface FirQualifiedAccess : FirStatement { - val calleeReference: FirReference - +interface FirQualifiedAccess : FirResolvable { val safe: Boolean get() = false val explicitReceiver: FirExpression? get() = null diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirResolvable.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirResolvable.kt new file mode 100644 index 00000000000..a60e5d842b1 --- /dev/null +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirResolvable.kt @@ -0,0 +1,12 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.fir.expressions + +import org.jetbrains.kotlin.fir.FirReference + +interface FirResolvable : FirStatement { + val calleeReference: FirReference +} \ No newline at end of file