From 76cfe8cabc600ea98c7ba3a923915a24440bba43 Mon Sep 17 00:00:00 2001 From: Alexey Andreev Date: Thu, 31 Mar 2016 11:31:52 +0300 Subject: [PATCH] KT-11100 Fix generation of name of FakeCallableDescriptorForObject that is presumably used to express invoke operator on (companion) objects --- .../js/test/semantics/ClassObjectTest.java | 4 ++++ .../js/translate/context/StaticContext.java | 15 +++++++++++++ .../cases/invokeOperatorInCompanionObject.kt | 22 +++++++++++++++++++ 3 files changed, 41 insertions(+) create mode 100644 js/js.translator/testData/classObject/cases/invokeOperatorInCompanionObject.kt diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/ClassObjectTest.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/ClassObjectTest.java index d8215aa6a25..7a939879abf 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/ClassObjectTest.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/ClassObjectTest.java @@ -59,4 +59,8 @@ public final class ClassObjectTest extends SingleFileTranslationTest { public void testObjectInCompanionObject() throws Exception { checkFooBoxIsOk(); } + + public void testInvokeOperatorInCompanionObject() throws Exception { + checkFooBoxIsOk(); + } } diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/StaticContext.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/StaticContext.java index 8414bf52f95..37f215c7666 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/StaticContext.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/StaticContext.java @@ -37,6 +37,7 @@ import org.jetbrains.kotlin.name.FqName; import org.jetbrains.kotlin.resolve.BindingContext; import org.jetbrains.kotlin.resolve.BindingTrace; import org.jetbrains.kotlin.resolve.DescriptorUtils; +import org.jetbrains.kotlin.resolve.calls.util.FakeCallableDescriptorForObject; import java.util.List; import java.util.Map; @@ -383,6 +384,19 @@ public final class StaticContext { } }; + Rule fakeCallableDescriptor = new Rule() { + @Nullable + @Override + public JsName apply(@NotNull DeclarationDescriptor descriptor) { + if (!(descriptor instanceof FakeCallableDescriptorForObject)) { + return null; + } + + FakeCallableDescriptorForObject fakeCallableDescriptor = (FakeCallableDescriptorForObject) descriptor; + return getNameForDescriptor(fakeCallableDescriptor.getReferencedDescriptor()); + } + }; + addRule(namesForDynamic); addRule(localClasses); addRule(namesForStandardClasses); @@ -390,6 +404,7 @@ public final class StaticContext { addRule(propertyOrPropertyAccessor); addRule(predefinedObjectsHasUnobfuscatableNames); addRule(overridingDescriptorsReferToOriginalName); + addRule(fakeCallableDescriptor); addRule(memberDeclarationsInsideParentsScope); } } diff --git a/js/js.translator/testData/classObject/cases/invokeOperatorInCompanionObject.kt b/js/js.translator/testData/classObject/cases/invokeOperatorInCompanionObject.kt new file mode 100644 index 00000000000..3dd3e7a8f49 --- /dev/null +++ b/js/js.translator/testData/classObject/cases/invokeOperatorInCompanionObject.kt @@ -0,0 +1,22 @@ +// See KT-11100 +package foo + +class Div { + var className: String? = null + + companion object { + operator fun invoke(init: Div.() -> Unit): Div { + val div = Div() + div.init() + return div + } + } +} + +fun box(): String { + val x = Div { + className = "ui container" + } + assertEquals("ui container", x.className) + return "OK" +} \ No newline at end of file