From 505dc61611a367653d7e6f06b0c6f5088df7b5d9 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Thu, 28 Jan 2016 19:03:11 +0300 Subject: [PATCH] Treat extension receiver as noinline parameter #KT-9574 Fixed --- .../kotlin/resolve/calls/checkers/InlineChecker.java | 8 -------- .../resolve/inline/InlineAnalyzerExtension.java | 6 ------ .../boxInline/noInline/extensionReceiver.1.kt | 11 +++++++++++ .../boxInline/noInline/extensionReceiver.2.kt | 4 ++++ .../testData/diagnostics/tests/inline/assignment.kt | 4 ++-- .../tests/inline/binaryExpressions/andOr.kt | 4 ++-- .../tests/inline/binaryExpressions/assignment.kt | 8 ++++---- .../tests/inline/binaryExpressions/mathOperations.kt | 4 ++-- .../testData/diagnostics/tests/inline/capture.kt | 8 ++++---- .../diagnostics/tests/inline/extensionOnFunction.kt | 8 ++++---- .../tests/inline/nullabilityOperations.kt | 6 +++--- .../diagnostics/tests/inline/nullableFunction.kt | 4 ++-- .../diagnostics/tests/inline/parenthesized.kt | 4 ++-- .../testData/diagnostics/tests/inline/propagation.kt | 2 +- .../testData/diagnostics/tests/inline/returns.kt | 6 +++--- compiler/testData/diagnostics/tests/inline/sam.kt | 4 ++-- .../tests/inline/unaryExpressions/mathOperation.kt | 12 ++++++------ compiler/testData/diagnostics/tests/inline/vararg.kt | 4 ++-- .../BlackBoxInlineCodegenTestGenerated.java | 6 ++++++ ...ompileKotlinAgainstInlineKotlinTestGenerated.java | 6 ++++++ 20 files changed, 66 insertions(+), 53 deletions(-) create mode 100644 compiler/testData/codegen/boxInline/noInline/extensionReceiver.1.kt create mode 100644 compiler/testData/codegen/boxInline/noInline/extensionReceiver.2.kt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/InlineChecker.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/InlineChecker.java index 3400167e469..f916d99886f 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/InlineChecker.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/InlineChecker.java @@ -63,14 +63,6 @@ class InlineChecker implements CallChecker { inlinableParameters.add(param); } } - - //add extension receiver as inlinable - ReceiverParameterDescriptor receiverParameter = descriptor.getExtensionReceiverParameter(); - if (receiverParameter != null) { - if (isInlinableParameter(receiverParameter)) { - inlinableParameters.add(receiverParameter); - } - } } @Override diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/inline/InlineAnalyzerExtension.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/inline/InlineAnalyzerExtension.java index f4069d53185..ac05543bb98 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/inline/InlineAnalyzerExtension.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/inline/InlineAnalyzerExtension.java @@ -117,12 +117,6 @@ public class InlineAnalyzerExtension implements FunctionAnalyzerExtension.Analyz for (ValueParameterDescriptor parameter : parameters) { hasInlinable |= checkInlinableParameter(parameter, function.getValueParameters().get(index++), functionDescriptor, trace); } - ReceiverParameterDescriptor receiverParameter = functionDescriptor.getExtensionReceiverParameter(); - if (receiverParameter != null) { - KtTypeReference receiver = function.getReceiverTypeReference(); - assert receiver != null : "Descriptor has a receiver but psi doesn't " + function.getText(); - hasInlinable |= checkInlinableParameter(receiverParameter, receiver, functionDescriptor, trace); - } hasInlinable |= InlineUtil.containsReifiedTypeParameters(functionDescriptor); diff --git a/compiler/testData/codegen/boxInline/noInline/extensionReceiver.1.kt b/compiler/testData/codegen/boxInline/noInline/extensionReceiver.1.kt new file mode 100644 index 00000000000..09828393d5e --- /dev/null +++ b/compiler/testData/codegen/boxInline/noInline/extensionReceiver.1.kt @@ -0,0 +1,11 @@ +//NO_CHECK_LAMBDA_INLINING + +fun box(): String { + val res = { "OK" }.test()() + if (res != "OKOKOK") return "fail 1: $res" + + val res2 = { "OK" }.extensionNoInline().subSequence(0, 2) + if (res2 != "OK") return "fail 2: $res2" + + return "OK" +} diff --git a/compiler/testData/codegen/boxInline/noInline/extensionReceiver.2.kt b/compiler/testData/codegen/boxInline/noInline/extensionReceiver.2.kt new file mode 100644 index 00000000000..a1f5bac2d0c --- /dev/null +++ b/compiler/testData/codegen/boxInline/noInline/extensionReceiver.2.kt @@ -0,0 +1,4 @@ +inline fun (() -> String).test(): (() -> String) = { invoke() + this.invoke() + this() } + +// call this.hashCode() guarantees that extension receiver is noinline by default +inline fun (() -> String).extensionNoInline(): String = this() + (this.hashCode().toString()) diff --git a/compiler/testData/diagnostics/tests/inline/assignment.kt b/compiler/testData/diagnostics/tests/inline/assignment.kt index d69850fec56..8605ac02f1a 100644 --- a/compiler/testData/diagnostics/tests/inline/assignment.kt +++ b/compiler/testData/diagnostics/tests/inline/assignment.kt @@ -9,6 +9,6 @@ inline fun inlineFunWithInvoke(s: (p: Int) -> Unit, ext: Int.(p: Int) -> Unit) { inline fun Function1.inlineExt() { - var d = this - d = this + var d = this + d = this } \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/inline/binaryExpressions/andOr.kt b/compiler/testData/diagnostics/tests/inline/binaryExpressions/andOr.kt index a8c42855f6f..465795e0fb0 100644 --- a/compiler/testData/diagnostics/tests/inline/binaryExpressions/andOr.kt +++ b/compiler/testData/diagnostics/tests/inline/binaryExpressions/andOr.kt @@ -12,6 +12,6 @@ inline fun inlineFunWithInvokeNonInline(noinline s: (p: Int) -> Unit, ext: Int.( inline fun Function1.inlineExt() { invoke(11) - this && this - this || this + this && this + this || this } \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/inline/binaryExpressions/assignment.kt b/compiler/testData/diagnostics/tests/inline/binaryExpressions/assignment.kt index da2dcab7eab..47c85879256 100644 --- a/compiler/testData/diagnostics/tests/inline/binaryExpressions/assignment.kt +++ b/compiler/testData/diagnostics/tests/inline/binaryExpressions/assignment.kt @@ -8,8 +8,8 @@ inline operator fun Function1. } inline operator fun Function1.plusAssign(p: Function1) { - this -= p - p -= this + this -= p + p -= this } operator fun @ExtensionFunctionType Function2.minusAssign(ext : @ExtensionFunctionType Function2) {} @@ -20,8 +20,8 @@ inline operator fun @ExtensionFun } inline operator fun @ExtensionFunctionType Function2.plusAssign(ext : @ExtensionFunctionType Function2) { - this -= ext - ext -= this + this -= ext + ext -= this } inline fun inlineFunWithInvoke(s: (p: T) -> U, ext: T.(p: U) -> V) { diff --git a/compiler/testData/diagnostics/tests/inline/binaryExpressions/mathOperations.kt b/compiler/testData/diagnostics/tests/inline/binaryExpressions/mathOperations.kt index 9a1fd2023c8..53897603e81 100644 --- a/compiler/testData/diagnostics/tests/inline/binaryExpressions/mathOperations.kt +++ b/compiler/testData/diagnostics/tests/inline/binaryExpressions/mathOperations.kt @@ -8,11 +8,11 @@ operator fun @ExtensionFunctionType Function2.minus(p: T.(p: } inline operator fun Function1.plus(p: Function1) { - this - p + this - p } inline operator fun @ExtensionFunctionType Function2.plus(p: T.(p: U) -> V) { - this - p + this - p } inline fun inlineFunWithInvoke(s: (p: T) -> U, ext: T.(p: U) -> V) { diff --git a/compiler/testData/diagnostics/tests/inline/capture.kt b/compiler/testData/diagnostics/tests/inline/capture.kt index 5fd271b88ca..fe659ffca08 100644 --- a/compiler/testData/diagnostics/tests/inline/capture.kt +++ b/compiler/testData/diagnostics/tests/inline/capture.kt @@ -4,10 +4,10 @@ infix fun Function1.noInlineExt(p: Int) {} inline infix fun Function1.inlineExt2(p: Int) { { - noInlineExt(11) - this.noInlineExt(11) - this noInlineExt 11 - this + noInlineExt(11) + this.noInlineExt(11) + this noInlineExt 11 + this }() } diff --git a/compiler/testData/diagnostics/tests/inline/extensionOnFunction.kt b/compiler/testData/diagnostics/tests/inline/extensionOnFunction.kt index 3a6d3f50366..296fee919e9 100644 --- a/compiler/testData/diagnostics/tests/inline/extensionOnFunction.kt +++ b/compiler/testData/diagnostics/tests/inline/extensionOnFunction.kt @@ -3,10 +3,10 @@ infix fun Function1.noInlineExt(p: Int) {} inline infix fun Function1.inlineExt2(p: Int) { - noInlineExt(11) - this.noInlineExt(11) - this noInlineExt 11 - this + noInlineExt(11) + this.noInlineExt(11) + this noInlineExt 11 + this } inline fun Function1.inlineExt() { diff --git a/compiler/testData/diagnostics/tests/inline/nullabilityOperations.kt b/compiler/testData/diagnostics/tests/inline/nullabilityOperations.kt index c7c93240598..8ecd4838605 100644 --- a/compiler/testData/diagnostics/tests/inline/nullabilityOperations.kt +++ b/compiler/testData/diagnostics/tests/inline/nullabilityOperations.kt @@ -4,10 +4,10 @@ inline fun String.submit(action: Function1) { } inline fun Function1.submit() { - this?.invoke(11) - this!!.invoke(11) + this?.invoke(11) + this!!.invoke(11) - submit(this!!) + submit(this!!) } inline fun submit(action: Function1) { diff --git a/compiler/testData/diagnostics/tests/inline/nullableFunction.kt b/compiler/testData/diagnostics/tests/inline/nullableFunction.kt index d4ff0463c3f..11638241e99 100644 --- a/compiler/testData/diagnostics/tests/inline/nullableFunction.kt +++ b/compiler/testData/diagnostics/tests/inline/nullableFunction.kt @@ -1,6 +1,6 @@ // !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -CONFLICTING_JVM_DECLARATIONS -public inline fun Function1?.submit(action: ()->T) { +public inline fun Function1?.submit(action: ()->T) { this?.invoke(11) } @@ -12,7 +12,7 @@ public inline fun submitNoInline(noinline action: Function1?, s: ( action?.invoke(10) } -public inline fun Function1?.submit() { +public inline fun Function1?.submit() { } diff --git a/compiler/testData/diagnostics/tests/inline/parenthesized.kt b/compiler/testData/diagnostics/tests/inline/parenthesized.kt index 8eb98c0b647..a7423f6b5fc 100644 --- a/compiler/testData/diagnostics/tests/inline/parenthesized.kt +++ b/compiler/testData/diagnostics/tests/inline/parenthesized.kt @@ -7,11 +7,11 @@ inline fun inlineFunWithInvoke(s: (p: Int) -> Unit) { (s) } -inline fun Function1.inlineExt() { +inline fun Function1.inlineExt() { (this).invoke(11) (this) invoke 11 (this)(11) - (this) + (this) } inline fun inlineFunWithInvoke2(s: (p: Int) -> Unit) { diff --git a/compiler/testData/diagnostics/tests/inline/propagation.kt b/compiler/testData/diagnostics/tests/inline/propagation.kt index 274f9256cf8..e5aec969fbe 100644 --- a/compiler/testData/diagnostics/tests/inline/propagation.kt +++ b/compiler/testData/diagnostics/tests/inline/propagation.kt @@ -24,7 +24,7 @@ inline fun inlineFunWithInvokeClosureNoinline(noinline s: (p: Int) -> Unit, noin //ext function inline fun Function1.inlineExt(ext: Int.(p: Int) -> Unit) { subInline(this, ext) - subNoInline(this, ext) + subNoInline(this, ext) } inline fun Function1.inlineExtWithClosure(ext: Int.(p: Int) -> Unit) { diff --git a/compiler/testData/diagnostics/tests/inline/returns.kt b/compiler/testData/diagnostics/tests/inline/returns.kt index d61831d0d03..0a71afd26b7 100644 --- a/compiler/testData/diagnostics/tests/inline/returns.kt +++ b/compiler/testData/diagnostics/tests/inline/returns.kt @@ -13,8 +13,8 @@ inline fun inlineFunWithExt2(ext: Int.(p: Int) -> Unit) : Int.(p: Int) -> Unit = -inline fun Function1.inlineExt(): Function1 { - return this +inline fun Function1.inlineExt(): Function1 { + return this } -inline fun Function1.inlineExt2(): Function1 = this \ No newline at end of file +inline fun Function1.inlineExt2(): Function1 = this \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/inline/sam.kt b/compiler/testData/diagnostics/tests/inline/sam.kt index f20181901d1..2a0b0d86cab 100644 --- a/compiler/testData/diagnostics/tests/inline/sam.kt +++ b/compiler/testData/diagnostics/tests/inline/sam.kt @@ -44,14 +44,14 @@ inline fun inlineFunWithInvokeNonInline(noinline s: (p: Int) -> Unit, ext: Int.( } } -inline fun Function1.inlineExt() { +inline fun Function1.inlineExt() { Test().test(){ invoke(11) this.invoke(11) this invoke 11 this(11) - this + this 11 } diff --git a/compiler/testData/diagnostics/tests/inline/unaryExpressions/mathOperation.kt b/compiler/testData/diagnostics/tests/inline/unaryExpressions/mathOperation.kt index 66d725de038..b41252e2e0a 100644 --- a/compiler/testData/diagnostics/tests/inline/unaryExpressions/mathOperation.kt +++ b/compiler/testData/diagnostics/tests/inline/unaryExpressions/mathOperation.kt @@ -1,13 +1,13 @@ // !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE -ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE -UNUSED_VALUE -VAL_REASSIGNMENT -UNUSED_CHANGED_VALUE -VARIABLE_EXPECTED -inline operator fun Function1.unaryPlus() = this +inline operator fun Function1.unaryPlus() = this operator fun Function1.unaryMinus() = this -inline operator fun Function1.inc() = this +inline operator fun Function1.inc() = this operator fun Function1.dec() = this inline operator fun @ExtensionFunctionType Function2.unaryPlus(){} operator fun @ExtensionFunctionType Function2.unaryMinus(){} -inline operator fun @ExtensionFunctionType Function2.inc() = this +inline operator fun @ExtensionFunctionType Function2.inc() = this operator fun @ExtensionFunctionType Function2.dec() = this inline fun inlineFunWithInvoke(s: (p: T) -> V, ext: T.(p: T) -> V) { @@ -27,9 +27,9 @@ inline fun inlineFunWithInvoke(s: (p: T) -> V, ext: T.(p: T) -> V) { inline fun Function1.inlineFunWithInvoke() { +this - -this + -this this++ ++this - this-- - --this + this-- + --this } diff --git a/compiler/testData/diagnostics/tests/inline/vararg.kt b/compiler/testData/diagnostics/tests/inline/vararg.kt index 9a9116b67fd..14c1e7d51a0 100644 --- a/compiler/testData/diagnostics/tests/inline/vararg.kt +++ b/compiler/testData/diagnostics/tests/inline/vararg.kt @@ -6,8 +6,8 @@ inline fun inlineFun(s: (p: Int) -> Unit, noinline b: (p: Int) -> Unit) { } inline fun Function1.inlineExt(s: (p: Int) -> Unit, noinline b: (p: Int) -> Unit) { - subInline(this, s, b) - subNoInline(this, s, b) + subInline(this, s, b) + subNoInline(this, s, b) } diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxInlineCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxInlineCodegenTestGenerated.java index 98e54763255..242e2061f2a 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxInlineCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxInlineCodegenTestGenerated.java @@ -823,6 +823,12 @@ public class BlackBoxInlineCodegenTestGenerated extends AbstractBlackBoxInlineCo KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/boxInline/noInline"), Pattern.compile("^(.+)\\.1.kt$"), true); } + @TestMetadata("extensionReceiver.1.kt") + public void testExtensionReceiver() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/noInline/extensionReceiver.1.kt"); + doTestMultiFileWithInlineCheck(fileName); + } + @TestMetadata("lambdaAsGeneric.1.kt") public void testLambdaAsGeneric() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/noInline/lambdaAsGeneric.1.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/CompileKotlinAgainstInlineKotlinTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/CompileKotlinAgainstInlineKotlinTestGenerated.java index ab6eecfdd2e..504ebdeb56e 100644 --- a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/CompileKotlinAgainstInlineKotlinTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/CompileKotlinAgainstInlineKotlinTestGenerated.java @@ -823,6 +823,12 @@ public class CompileKotlinAgainstInlineKotlinTestGenerated extends AbstractCompi KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/boxInline/noInline"), Pattern.compile("^(.+)\\.1.kt$"), true); } + @TestMetadata("extensionReceiver.1.kt") + public void testExtensionReceiver() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/noInline/extensionReceiver.1.kt"); + doBoxTestWithInlineCheck(fileName); + } + @TestMetadata("lambdaAsGeneric.1.kt") public void testLambdaAsGeneric() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/noInline/lambdaAsGeneric.1.kt");