From 06c05193a6726983c71a0d7696873e46999c1cbf Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Thu, 2 Apr 2015 01:34:17 +0300 Subject: [PATCH] Extracted method. --- .../calls/checkers/CapturingInClosureChecker.kt | 9 ++------- .../jetbrains/kotlin/resolve/calls/util/callUtil.kt | 11 +++++++++++ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/CapturingInClosureChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/CapturingInClosureChecker.kt index 37a245cf1e7..bf633e98bcd 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/CapturingInClosureChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/CapturingInClosureChecker.kt @@ -24,6 +24,7 @@ import org.jetbrains.kotlin.resolve.BindingContext.CAPTURED_IN_CLOSURE import org.jetbrains.kotlin.resolve.BindingTrace import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils import org.jetbrains.kotlin.resolve.calls.callUtil.getParentResolvedCall +import org.jetbrains.kotlin.resolve.calls.callUtil.isInlined import org.jetbrains.kotlin.resolve.calls.context.BasicCallResolutionContext import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall import org.jetbrains.kotlin.resolve.calls.model.VariableAsFunctionResolvedCall @@ -68,13 +69,7 @@ class CapturingInClosureChecker : CallChecker { val scopeDeclaration = DescriptorToSourceUtils.descriptorToDeclaration(scopeContainer) if (scopeDeclaration !is JetFunctionLiteral) return false - val parent = scopeDeclaration.getParent() - assert(parent is JetFunctionLiteralExpression) { "parent of JetFunctionLiteral is " + parent } - val resolvedCall = (parent as JetFunctionLiteralExpression).getParentResolvedCall(context, true) - if (resolvedCall == null) return false - - val callable = resolvedCall.getResultingDescriptor() - if (callable is SimpleFunctionDescriptor && callable.getInlineStrategy().isInline()) { + if (scopeDeclaration.isInlined(context)) { val scopeContainerParent = scopeContainer.getContainingDeclaration() assert(scopeContainerParent != null) { "parent is null for " + scopeContainer } return !isCapturedVariable(variableParent, scopeContainerParent) || isCapturedInInline(context, scopeContainerParent, variableParent) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/util/callUtil.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/util/callUtil.kt index b9b7cfc7c95..6961c83dab5 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/util/callUtil.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/util/callUtil.kt @@ -31,6 +31,7 @@ import org.jetbrains.kotlin.resolve.BindingContext.RESOLVED_CALL import org.jetbrains.kotlin.utils.sure import org.jetbrains.kotlin.psi.psiUtil.getTextWithLocation import org.jetbrains.kotlin.descriptors.FunctionDescriptor +import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor import org.jetbrains.kotlin.resolve.calls.context.ResolutionContext // resolved call @@ -178,3 +179,13 @@ public fun JetExpression.getFunctionResolvedCallWithAssert(context: BindingConte [suppress("UNCHECKED_CAST")] return resolvedCall as ResolvedCall } + +public fun JetFunctionLiteral.isInlined(bindingContext: BindingContext): Boolean { + val parent = this.getParent() + assert(parent is JetFunctionLiteralExpression) { "parent of JetFunctionLiteral is " + parent } + val resolvedCall = (parent as JetFunctionLiteralExpression).getParentResolvedCall(bindingContext, true) + if (resolvedCall == null) return false + + val callable = resolvedCall.getResultingDescriptor() + return callable is SimpleFunctionDescriptor && callable.getInlineStrategy().isInline() +} \ No newline at end of file