From 18961cc5a9fc703c65f7c092b7d66a1ad6308523 Mon Sep 17 00:00:00 2001 From: Stanislav Erokhin Date: Wed, 7 Jun 2017 18:25:52 +0300 Subject: [PATCH] [NI] Analyze lambda in independent context if it isn't call argument --- .../types/expressions/FunctionsTypingVisitor.kt | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/FunctionsTypingVisitor.kt b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/FunctionsTypingVisitor.kt index dfbba26582a..12b21e66ea2 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/FunctionsTypingVisitor.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/FunctionsTypingVisitor.kt @@ -37,6 +37,7 @@ import org.jetbrains.kotlin.resolve.BindingContextUtils import org.jetbrains.kotlin.resolve.BindingTrace import org.jetbrains.kotlin.resolve.FunctionDescriptorUtil import org.jetbrains.kotlin.resolve.calls.USE_NEW_INFERENCE +import org.jetbrains.kotlin.resolve.calls.context.ContextDependency import org.jetbrains.kotlin.resolve.checkers.UnderscoreChecker import org.jetbrains.kotlin.resolve.lazy.ForceResolveUtil import org.jetbrains.kotlin.resolve.scopes.LexicalWritableScope @@ -233,16 +234,23 @@ internal class FunctionsTypingVisitor(facade: ExpressionTypingInternals) : Expre val expectedType = expectedReturnType ?: NO_EXPECTED_TYPE val functionInnerScope = FunctionDescriptorUtil.getFunctionInnerScope(context.scope, functionDescriptor, context.trace, components.overloadChecker) - val newContext = context.replaceScope(functionInnerScope).replaceExpectedType(expectedType) + var newContext = context.replaceScope(functionInnerScope).replaceExpectedType(expectedType) // This is needed for ControlStructureTypingVisitor#visitReturnExpression() to properly type-check returned expressions context.trace.record(EXPECTED_RETURN_TYPE, functionLiteral, expectedType) + val newInferenceLambdaInfo = context.trace[BindingContext.NEW_INFERENCE_LAMBDA_INFO, expression.functionLiteral] + + // i.e. this lambda isn't call arguments + if (newInferenceLambdaInfo == null && USE_NEW_INFERENCE) { + newContext = newContext.replaceContextDependency(ContextDependency.INDEPENDENT) + } + // Type-check the body val blockReturnedType = components.expressionTypingServices.getBlockReturnedType(functionLiteral.bodyExpression!!, COERCION_TO_UNIT, newContext) val typeOfBodyExpression = blockReturnedType.type - context.trace[BindingContext.NEW_INFERENCE_LAMBDA_INFO, expression.functionLiteral]?.let { + newInferenceLambdaInfo?.let { it.dataFlowInfoAfter = blockReturnedType.dataFlowInfo return null }