diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/KotlinResolutionStatelessCallbacksImpl.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/KotlinResolutionStatelessCallbacksImpl.kt index b381bee3749..997d4d4e019 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/KotlinResolutionStatelessCallbacksImpl.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/KotlinResolutionStatelessCallbacksImpl.kt @@ -25,6 +25,7 @@ import org.jetbrains.kotlin.resolve.calls.callResolverUtil.isConventionCall import org.jetbrains.kotlin.resolve.calls.callResolverUtil.isInfixCall import org.jetbrains.kotlin.resolve.calls.callResolverUtil.isSuperOrDelegatingConstructorCall import org.jetbrains.kotlin.resolve.calls.components.KotlinResolutionStatelessCallbacks +import org.jetbrains.kotlin.resolve.calls.model.CallableReferenceKotlinCallArgument import org.jetbrains.kotlin.resolve.calls.model.KotlinCall import org.jetbrains.kotlin.resolve.calls.model.SimpleKotlinCallArgument import org.jetbrains.kotlin.resolve.isHiddenInResolution @@ -50,4 +51,7 @@ class KotlinResolutionStatelessCallbacksImpl( override fun isSuperExpression(receiver: SimpleKotlinCallArgument?): Boolean = receiver?.psiExpression is KtSuperExpression + + override fun getScopeTowerForCallableReferenceArgument(argument: CallableReferenceKotlinCallArgument): ImplicitScopeTower = + (argument as CallableReferenceKotlinCallArgumentImpl).scopeTowerForResolution } \ No newline at end of file diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/NewCallArguments.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/NewCallArguments.kt index cc42e9b2cbb..4e2c3c6d26e 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/NewCallArguments.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/NewCallArguments.kt @@ -121,6 +121,7 @@ class FunctionExpressionImpl( } class CallableReferenceKotlinCallArgumentImpl( + val scopeTowerForResolution: ImplicitScopeTower, override val valueArgument: ValueArgument, override val dataFlowInfoBeforeThisArgument: DataFlowInfo, override val dataFlowInfoAfterThisArgument: DataFlowInfo, diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/PSICallResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/PSICallResolver.kt index 91941e47117..8514c3e824a 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/PSICallResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/PSICallResolver.kt @@ -553,7 +553,7 @@ class PSICallResolver( } } - return CallableReferenceKotlinCallArgumentImpl(valueArgument, startDataFlowInfo, newDataFlowInfo, + return CallableReferenceKotlinCallArgumentImpl(ASTScopeTower(context), valueArgument, startDataFlowInfo, newDataFlowInfo, ktExpression, argumentName, lhsNewResult, name) } diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/CallableReferenceResolver.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/CallableReferenceResolver.kt index 7ce5c9c64ef..9d8b0b32d15 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/CallableReferenceResolver.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/CallableReferenceResolver.kt @@ -62,7 +62,6 @@ class CallableReferenceResolver( ) { fun processCallableReferenceArgument( - scopeTower: ImplicitScopeTower, csBuilder: ConstraintSystemBuilder, postponedArgument: PostponedCallableReferenceArgument ): KotlinCallDiagnostic? { @@ -73,6 +72,8 @@ class CallableReferenceResolver( if (subLHSCall != null) { csBuilder.addInnerCall(subLHSCall.resolvedCall) } + + val scopeTower = callComponents.statelessCallbacks.getScopeTowerForCallableReferenceArgument(argument) val candidates = runRHSResolution(scopeTower, argument, expectedType) { checkCallableReference -> csBuilder.runTransaction { checkCallableReference(this); false } } diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/ExternalComponents.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/ExternalComponents.kt index cc12152efe9..4715be10424 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/ExternalComponents.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/ExternalComponents.kt @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.resolve.calls.components import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.resolve.calls.model.* +import org.jetbrains.kotlin.resolve.calls.tower.ImplicitScopeTower import org.jetbrains.kotlin.types.UnwrappedType // stateless component @@ -29,6 +30,7 @@ interface KotlinResolutionStatelessCallbacks { fun isSuperOrDelegatingConstructorCall(kotlinCall: KotlinCall): Boolean fun isHiddenInResolution(descriptor: DeclarationDescriptor, kotlinCall: KotlinCall): Boolean fun isSuperExpression(receiver: SimpleKotlinCallArgument?): Boolean + fun getScopeTowerForCallableReferenceArgument(argument: CallableReferenceKotlinCallArgument): ImplicitScopeTower } // This components hold state (trace). Work with this carefully. diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/KotlinCallCompleter.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/KotlinCallCompleter.kt index 1b03d089fcf..883bfbda49f 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/KotlinCallCompleter.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/KotlinCallCompleter.kt @@ -80,7 +80,7 @@ class KotlinCallCompleter( if (topLevelCall.prepareForCompletion(expectedType)) { val c = candidate.lastCall.constraintSystem.asCallCompleterContext() - resolveCallableReferenceArguments(c, candidate.lastCall) + resolveCallableReferenceArguments(c) topLevelCall.competeCall(c, resolutionCallbacks) return toCompletedBaseResolvedCall(c, candidate, resolutionCallbacks) @@ -89,11 +89,10 @@ class KotlinCallCompleter( return ResolvedKotlinCall.OnlyResolvedKotlinCall(candidate) } - // todo do not use topLevelCall - private fun resolveCallableReferenceArguments(c: Context, topLevelCall: SimpleKotlinResolutionCandidate) { + private fun resolveCallableReferenceArguments(c: Context) { for (callableReferenceArgument in c.postponedArguments) { if (callableReferenceArgument !is PostponedCallableReferenceArgument) continue - callableReferenceResolver.processCallableReferenceArgument(topLevelCall.scopeTower, c.getBuilder(), callableReferenceArgument) + callableReferenceResolver.processCallableReferenceArgument(c.getBuilder(), callableReferenceArgument) } }