From 43abdaa894038924cf8bbbda7392607a9ec2c7a1 Mon Sep 17 00:00:00 2001 From: Alexey Andreev Date: Tue, 30 Aug 2016 19:01:34 +0300 Subject: [PATCH] KT-13658: don't capture FakeCallableDescriptorForObject in closure --- .../kotlin/js/test/semantics/ClosureTest.java | 4 +++ .../js/translate/context/UsageTracker.kt | 3 ++ .../closure/cases/objectWithInvokeOperator.kt | 36 +++++++++++++++++++ 3 files changed, 43 insertions(+) create mode 100644 js/js.translator/testData/closure/cases/objectWithInvokeOperator.kt diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/ClosureTest.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/ClosureTest.java index d424c24ddc4..32e2c8d298c 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/ClosureTest.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/ClosureTest.java @@ -191,4 +191,8 @@ public final class ClosureTest extends SingleFileTranslationTest { public void testLambdaInLocalFun() throws Exception { checkFooBoxIsOk(); } + + public void testObjectWithInvokeOperator() throws Exception { + checkFooBoxIsOk(); + } } diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/UsageTracker.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/UsageTracker.kt index 66ba78fbb94..6b8714091b0 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/UsageTracker.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/UsageTracker.kt @@ -22,6 +22,7 @@ import org.jetbrains.kotlin.js.translate.utils.ManglingUtils.getSuggestedName import com.google.dart.compiler.backend.js.ast.JsScope import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.DescriptorUtils.* +import org.jetbrains.kotlin.resolve.calls.util.FakeCallableDescriptorForObject private val CAPTURED_RECEIVER_NAME_PREFIX : String = "this$" @@ -43,6 +44,8 @@ class UsageTracker( fun used(descriptor: DeclarationDescriptor) { if (isCaptured(descriptor)) return + if (descriptor is FakeCallableDescriptorForObject) return + // local named function if (descriptor is FunctionDescriptor && descriptor.visibility == Visibilities.LOCAL) { assert(!descriptor.getName().isSpecial) { "Function with special name can not be captured, descriptor: $descriptor" } diff --git a/js/js.translator/testData/closure/cases/objectWithInvokeOperator.kt b/js/js.translator/testData/closure/cases/objectWithInvokeOperator.kt new file mode 100644 index 00000000000..18a57de897f --- /dev/null +++ b/js/js.translator/testData/closure/cases/objectWithInvokeOperator.kt @@ -0,0 +1,36 @@ +package foo + +object O { + val result = "O" +} + +operator fun O.invoke() = result + + +class A(val x: Int) { + companion object { + val result = "A" + } +} + +operator fun A.Companion.invoke() = result + + +enum class B { + E { + val result = "B" + + override operator fun invoke() = result + }; + + abstract operator fun invoke(): String +} + +fun f() = { O() + A() + B.E() } + +fun box(): String { + val result = f()() + if (result != "OAB") return "expected 'OAB', got '$result'" + + return "OK" +} \ No newline at end of file