[NI] Use data flow info from arguments in parenthesis to resolve lambda

Fixes 'javaObjectType' and 'javaPrimitiveType'
This commit is contained in:
Mikhail Zarechenskiy
2017-06-07 13:52:31 +03:00
parent 5eb56dca60
commit badbf777df
3 changed files with 9 additions and 8 deletions
@@ -67,7 +67,7 @@ class KotlinResolutionCallbacksImpl(
}
override fun analyzeAndGetLambdaResultArguments(
topLevelCall: KotlinCall,
outerCall: KotlinCall,
lambdaArgument: LambdaKotlinCallArgument,
isSuspend: Boolean,
receiverType: UnwrappedType?,
@@ -100,9 +100,11 @@ class KotlinResolutionCallbacksImpl(
val approximatesExpectedType = typeApproximator.approximateToSubType(expectedType, TypeApproximatorConfiguration.LocalDeclaration) ?: expectedType
val actualContext = outerCallContext.replaceBindingTrace(trace).
replaceContextDependency(lambdaInfo.contextDependency).replaceExpectedType(approximatesExpectedType)
val actualContext = outerCallContext
.replaceBindingTrace(trace)
.replaceContextDependency(lambdaInfo.contextDependency)
.replaceExpectedType(approximatesExpectedType)
.replaceDataFlowInfo(outerCall.psiKotlinCall.resultDataFlowInfo)
val functionTypeInfo = expressionTypingServices.getTypeInfo(expression, actualContext)
trace.record(BindingContext.NEW_INFERENCE_LAMBDA_INFO, ktFunction, LambdaInfo.STUB_EMPTY)
@@ -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");
* 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.resolve.calls.model.*
import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.types.UnwrappedType
interface IsDescriptorFromSourcePredicate: (CallableDescriptor) -> Boolean
@@ -26,7 +25,7 @@ interface IsDescriptorFromSourcePredicate: (CallableDescriptor) -> Boolean
// This components hold state (trace). Work with this carefully.
interface KotlinResolutionCallbacks {
fun analyzeAndGetLambdaResultArguments(
topLevelCall: KotlinCall,
outerCall: KotlinCall,
lambdaArgument: LambdaKotlinCallArgument,
isSuspend: Boolean,
receiverType: UnwrappedType?,
@@ -260,7 +260,7 @@ class KotlinCallCompleter(
val parameters = lambda.parameters.map(::substitute)
val expectedType = lambda.returnType.takeIf { c.canBeProper(it) }?.let(::substitute)
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) {
// todo strange code -- why top-level kotlinCall? may be it isn't right outer call