[NI] Use data flow info from arguments in parenthesis to resolve lambda
Fixes 'javaObjectType' and 'javaPrimitiveType'
This commit is contained in:
+6
-4
@@ -67,7 +67,7 @@ class KotlinResolutionCallbacksImpl(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun analyzeAndGetLambdaResultArguments(
|
override fun analyzeAndGetLambdaResultArguments(
|
||||||
topLevelCall: KotlinCall,
|
outerCall: KotlinCall,
|
||||||
lambdaArgument: LambdaKotlinCallArgument,
|
lambdaArgument: LambdaKotlinCallArgument,
|
||||||
isSuspend: Boolean,
|
isSuspend: Boolean,
|
||||||
receiverType: UnwrappedType?,
|
receiverType: UnwrappedType?,
|
||||||
@@ -100,9 +100,11 @@ class KotlinResolutionCallbacksImpl(
|
|||||||
|
|
||||||
val approximatesExpectedType = typeApproximator.approximateToSubType(expectedType, TypeApproximatorConfiguration.LocalDeclaration) ?: expectedType
|
val approximatesExpectedType = typeApproximator.approximateToSubType(expectedType, TypeApproximatorConfiguration.LocalDeclaration) ?: expectedType
|
||||||
|
|
||||||
val actualContext = outerCallContext.replaceBindingTrace(trace).
|
val actualContext = outerCallContext
|
||||||
replaceContextDependency(lambdaInfo.contextDependency).replaceExpectedType(approximatesExpectedType)
|
.replaceBindingTrace(trace)
|
||||||
|
.replaceContextDependency(lambdaInfo.contextDependency)
|
||||||
|
.replaceExpectedType(approximatesExpectedType)
|
||||||
|
.replaceDataFlowInfo(outerCall.psiKotlinCall.resultDataFlowInfo)
|
||||||
|
|
||||||
val functionTypeInfo = expressionTypingServices.getTypeInfo(expression, actualContext)
|
val functionTypeInfo = expressionTypingServices.getTypeInfo(expression, actualContext)
|
||||||
trace.record(BindingContext.NEW_INFERENCE_LAMBDA_INFO, ktFunction, LambdaInfo.STUB_EMPTY)
|
trace.record(BindingContext.NEW_INFERENCE_LAMBDA_INFO, ktFunction, LambdaInfo.STUB_EMPTY)
|
||||||
|
|||||||
+2
-3
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2010-2016 JetBrains s.r.o.
|
* Copyright 2010-2017 JetBrains s.r.o.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -18,7 +18,6 @@ package org.jetbrains.kotlin.resolve.calls.components
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.descriptors.CallableDescriptor
|
import org.jetbrains.kotlin.descriptors.CallableDescriptor
|
||||||
import org.jetbrains.kotlin.resolve.calls.model.*
|
import org.jetbrains.kotlin.resolve.calls.model.*
|
||||||
import org.jetbrains.kotlin.types.KotlinType
|
|
||||||
import org.jetbrains.kotlin.types.UnwrappedType
|
import org.jetbrains.kotlin.types.UnwrappedType
|
||||||
|
|
||||||
interface IsDescriptorFromSourcePredicate: (CallableDescriptor) -> Boolean
|
interface IsDescriptorFromSourcePredicate: (CallableDescriptor) -> Boolean
|
||||||
@@ -26,7 +25,7 @@ interface IsDescriptorFromSourcePredicate: (CallableDescriptor) -> Boolean
|
|||||||
// This components hold state (trace). Work with this carefully.
|
// This components hold state (trace). Work with this carefully.
|
||||||
interface KotlinResolutionCallbacks {
|
interface KotlinResolutionCallbacks {
|
||||||
fun analyzeAndGetLambdaResultArguments(
|
fun analyzeAndGetLambdaResultArguments(
|
||||||
topLevelCall: KotlinCall,
|
outerCall: KotlinCall,
|
||||||
lambdaArgument: LambdaKotlinCallArgument,
|
lambdaArgument: LambdaKotlinCallArgument,
|
||||||
isSuspend: Boolean,
|
isSuspend: Boolean,
|
||||||
receiverType: UnwrappedType?,
|
receiverType: UnwrappedType?,
|
||||||
|
|||||||
+1
-1
@@ -260,7 +260,7 @@ class KotlinCallCompleter(
|
|||||||
val parameters = lambda.parameters.map(::substitute)
|
val parameters = lambda.parameters.map(::substitute)
|
||||||
val expectedType = lambda.returnType.takeIf { c.canBeProper(it) }?.let(::substitute)
|
val expectedType = lambda.returnType.takeIf { c.canBeProper(it) }?.let(::substitute)
|
||||||
lambda.analyzed = true
|
lambda.analyzed = true
|
||||||
lambda.resultArguments = resolutionCallbacks.analyzeAndGetLambdaResultArguments(topLevelCall, lambda.argument, lambda.isSuspend, receiver, parameters, expectedType)
|
lambda.resultArguments = resolutionCallbacks.analyzeAndGetLambdaResultArguments(lambda.outerCall, lambda.argument, lambda.isSuspend, receiver, parameters, expectedType)
|
||||||
|
|
||||||
for (innerCall in lambda.resultArguments) {
|
for (innerCall in lambda.resultArguments) {
|
||||||
// todo strange code -- why top-level kotlinCall? may be it isn't right outer call
|
// todo strange code -- why top-level kotlinCall? may be it isn't right outer call
|
||||||
|
|||||||
Reference in New Issue
Block a user