Extracted method.

This commit is contained in:
Evgeny Gerashchenko
2015-04-02 01:34:17 +03:00
parent 85e9f2207e
commit 06c05193a6
2 changed files with 13 additions and 7 deletions
@@ -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)
@@ -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<out FunctionDescriptor>
}
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()
}