From 174b3db723209a014918c355e604c4aec1f34a34 Mon Sep 17 00:00:00 2001 From: Georgy Bronnikov Date: Wed, 15 Jan 2020 16:44:30 +0300 Subject: [PATCH] IR: capture more type parameters for local functions. Types of value parameters and captured variables, even unused, need to be considered. --- .../backend/common/lower/ClosureAnnotator.kt | 15 +++++++++------ .../method/TypeParamInInner2.java | 7 +++++++ .../method/TypeParamInInner2.kt | 6 ++++++ .../method/TypeParamInInner2.txt | 8 ++++++++ .../CompileJavaAgainstKotlinTestGenerated.java | 10 ++++++++++ .../IrCompileJavaAgainstKotlinTestGenerated.java | 5 +++++ 6 files changed, 45 insertions(+), 6 deletions(-) create mode 100644 compiler/testData/compileJavaAgainstKotlin/method/TypeParamInInner2.java create mode 100644 compiler/testData/compileJavaAgainstKotlin/method/TypeParamInInner2.kt create mode 100644 compiler/testData/compileJavaAgainstKotlin/method/TypeParamInInner2.txt diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/ClosureAnnotator.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/ClosureAnnotator.kt index 4dd4d399813..b8ac0af753f 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/ClosureAnnotator.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/ClosureAnnotator.kt @@ -88,13 +88,16 @@ class ClosureAnnotator(irFile: IrFile) { } fun declareVariable(valueDeclaration: IrValueDeclaration?) { - if (valueDeclaration != null) + if (valueDeclaration != null) { declaredValues.add(valueDeclaration) + seeType(valueDeclaration.type) + } } fun seeVariable(value: IrValueSymbol) { - if (isExternal(value.owner)) + if (isExternal(value.owner)) { capturedValues.add(value) + } } fun isExternal(valueDeclaration: IrValueDeclaration): Boolean { @@ -144,6 +147,8 @@ class ClosureAnnotator(irFile: IrFile) { val closureBuilder = ClosureBuilder(declaration) closureBuilders[declaration] = closureBuilder + collectPotentiallyCapturedTypeParameters(closureBuilder) + closureBuilder.declareVariable(declaration.thisReceiver) if (declaration.isInner) { closureBuilder.declareVariable((declaration.parent as IrClass).thisReceiver) @@ -155,8 +160,6 @@ class ClosureAnnotator(irFile: IrFile) { constructor.valueParameters.forEach { v -> closureBuilder.declareVariable(v) } } - collectPotentiallyCapturedTypeParameters(closureBuilder) - closuresStack.push(closureBuilder) declaration.acceptChildrenVoid(this) closuresStack.pop() @@ -166,6 +169,8 @@ class ClosureAnnotator(irFile: IrFile) { val closureBuilder = ClosureBuilder(declaration) closureBuilders[declaration] = closureBuilder + collectPotentiallyCapturedTypeParameters(closureBuilder) + declaration.valueParameters.forEach { closureBuilder.declareVariable(it) } closureBuilder.declareVariable(declaration.dispatchReceiverParameter) closureBuilder.declareVariable(declaration.extensionReceiverParameter) @@ -182,8 +187,6 @@ class ClosureAnnotator(irFile: IrFile) { } } - collectPotentiallyCapturedTypeParameters(closureBuilder) - closuresStack.push(closureBuilder) declaration.acceptChildrenVoid(this) closuresStack.pop() diff --git a/compiler/testData/compileJavaAgainstKotlin/method/TypeParamInInner2.java b/compiler/testData/compileJavaAgainstKotlin/method/TypeParamInInner2.java new file mode 100644 index 00000000000..a2f567d16ad --- /dev/null +++ b/compiler/testData/compileJavaAgainstKotlin/method/TypeParamInInner2.java @@ -0,0 +1,7 @@ +package test; + +class TypeParamInInner2 { + void check() { + TypeParamInInner2Kt.f("OK"); + } +} diff --git a/compiler/testData/compileJavaAgainstKotlin/method/TypeParamInInner2.kt b/compiler/testData/compileJavaAgainstKotlin/method/TypeParamInInner2.kt new file mode 100644 index 00000000000..4d830265379 --- /dev/null +++ b/compiler/testData/compileJavaAgainstKotlin/method/TypeParamInInner2.kt @@ -0,0 +1,6 @@ +package test + +fun f(x: V): Int { + fun g(y: V) = 2 + return g(x) +} diff --git a/compiler/testData/compileJavaAgainstKotlin/method/TypeParamInInner2.txt b/compiler/testData/compileJavaAgainstKotlin/method/TypeParamInInner2.txt new file mode 100644 index 00000000000..ba9b6df71b9 --- /dev/null +++ b/compiler/testData/compileJavaAgainstKotlin/method/TypeParamInInner2.txt @@ -0,0 +1,8 @@ +package test + +public fun f(/*0*/ V): kotlin.Int + +public/*package*/ open class TypeParamInInner2 { + public/*package*/ constructor TypeParamInInner2() + public/*package*/ open fun check(): kotlin.Unit +} diff --git a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/CompileJavaAgainstKotlinTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/CompileJavaAgainstKotlinTestGenerated.java index b91159407c3..d6ff99a6e5c 100644 --- a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/CompileJavaAgainstKotlinTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/CompileJavaAgainstKotlinTestGenerated.java @@ -318,6 +318,11 @@ public class CompileJavaAgainstKotlinTestGenerated extends AbstractCompileJavaAg runTest("compiler/testData/compileJavaAgainstKotlin/method/TypeParamInInner.kt"); } + @TestMetadata("TypeParamInInner2.kt") + public void testTypeParamInInner2() throws Exception { + runTest("compiler/testData/compileJavaAgainstKotlin/method/TypeParamInInner2.kt"); + } + @TestMetadata("Vararg.kt") public void testVararg() throws Exception { runTest("compiler/testData/compileJavaAgainstKotlin/method/Vararg.kt"); @@ -966,6 +971,11 @@ public class CompileJavaAgainstKotlinTestGenerated extends AbstractCompileJavaAg runTest("compiler/testData/compileJavaAgainstKotlin/method/TypeParamInInner.kt"); } + @TestMetadata("TypeParamInInner2.kt") + public void testTypeParamInInner2() throws Exception { + runTest("compiler/testData/compileJavaAgainstKotlin/method/TypeParamInInner2.kt"); + } + @TestMetadata("Vararg.kt") public void testVararg() throws Exception { runTest("compiler/testData/compileJavaAgainstKotlin/method/Vararg.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/ir/IrCompileJavaAgainstKotlinTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/ir/IrCompileJavaAgainstKotlinTestGenerated.java index 9eab1f68477..a430f9aa211 100644 --- a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/ir/IrCompileJavaAgainstKotlinTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/ir/IrCompileJavaAgainstKotlinTestGenerated.java @@ -316,6 +316,11 @@ public class IrCompileJavaAgainstKotlinTestGenerated extends AbstractIrCompileJa runTest("compiler/testData/compileJavaAgainstKotlin/method/TypeParamInInner.kt"); } + @TestMetadata("TypeParamInInner2.kt") + public void testTypeParamInInner2() throws Exception { + runTest("compiler/testData/compileJavaAgainstKotlin/method/TypeParamInInner2.kt"); + } + @TestMetadata("Vararg.kt") public void testVararg() throws Exception { runTest("compiler/testData/compileJavaAgainstKotlin/method/Vararg.kt");