From 015da2f8ca1738739e92460bcf6f5a97414e244a Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Tue, 7 Apr 2015 19:56:44 +0300 Subject: [PATCH] More proper code to check if lambda is inlined. Parameter of inline function can be annotated with "noInline". --- .../jetbrains/kotlin/resolve/calls/util/callUtil.kt | 6 ++---- .../checker/infos/CapturedInInlinedClosure.kt | 13 ++++++++++++- .../lineMarker/recursiveCall/inInlinedLambda.kt | 11 ++++++++++- idea/testData/exitPoints/inlineWithNoInlineParam.kt | 12 ++++++++++++ .../HighlightExitPointsTestGenerated.java | 6 ++++++ 5 files changed, 42 insertions(+), 6 deletions(-) create mode 100644 idea/testData/exitPoints/inlineWithNoInlineParam.kt 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 6961c83dab5..04f8d58fa37 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 @@ -32,6 +32,7 @@ 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.InlineDescriptorUtils import org.jetbrains.kotlin.resolve.calls.context.ResolutionContext // resolved call @@ -183,9 +184,6 @@ public fun JetExpression.getFunctionResolvedCallWithAssert(context: BindingConte 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() + return InlineDescriptorUtils.isInlineLambda(parent as JetFunctionLiteralExpression, bindingContext, false) } \ No newline at end of file diff --git a/idea/testData/checker/infos/CapturedInInlinedClosure.kt b/idea/testData/checker/infos/CapturedInInlinedClosure.kt index accd50524fd..a8a075f5258 100644 --- a/idea/testData/checker/infos/CapturedInInlinedClosure.kt +++ b/idea/testData/checker/infos/CapturedInInlinedClosure.kt @@ -88,4 +88,15 @@ fun objectExpression() { val u3 = "" object : Throwable(run { u3 }) { } -} \ No newline at end of file +} + +inline fun withNoInlineParam(noinline task1: () -> Unit, task2: () -> Unit) { + task1() + task2() +} + +fun usage(param1: Int, param2: Int) { + withNoInlineParam({ println(param1) }, { println(param2) }) +} + +fun println(a: Any) {} \ No newline at end of file diff --git a/idea/testData/codeInsight/lineMarker/recursiveCall/inInlinedLambda.kt b/idea/testData/codeInsight/lineMarker/recursiveCall/inInlinedLambda.kt index 58d28bac284..71276acd43b 100644 --- a/idea/testData/codeInsight/lineMarker/recursiveCall/inInlinedLambda.kt +++ b/idea/testData/codeInsight/lineMarker/recursiveCall/inInlinedLambda.kt @@ -2,4 +2,13 @@ fun f(a: Int) { run { f(a - 1) } -} \ No newline at end of file +} + +fun ff(a: Int) { + run1 { + ff(a - 1) + } +} + +inline fun run1(noinline f: () -> T): T { } + diff --git a/idea/testData/exitPoints/inlineWithNoInlineParam.kt b/idea/testData/exitPoints/inlineWithNoInlineParam.kt new file mode 100644 index 00000000000..9f48b5ea9c7 --- /dev/null +++ b/idea/testData/exitPoints/inlineWithNoInlineParam.kt @@ -0,0 +1,12 @@ +fun f(a: Int): Int { + if (a < 5) { + run1(fun (): Int { + return 1 + }) + } + return 2 +} + +inline public fun run1(noinline f: () -> T): T { } + +//HIGHLIGHTED: return 1 diff --git a/idea/tests/org/jetbrains/kotlin/idea/highlighter/HighlightExitPointsTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/highlighter/HighlightExitPointsTestGenerated.java index e25cdf18cb3..e1c03fd92ea 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/highlighter/HighlightExitPointsTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/highlighter/HighlightExitPointsTestGenerated.java @@ -60,6 +60,12 @@ public class HighlightExitPointsTestGenerated extends AbstractHighlightExitPoint doTest(fileName); } + @TestMetadata("inlineWithNoInlineParam.kt") + public void testInlineWithNoInlineParam() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/exitPoints/inlineWithNoInlineParam.kt"); + doTest(fileName); + } + @TestMetadata("localFunction1.kt") public void testLocalFunction1() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/exitPoints/localFunction1.kt");