From d067068774e167e64784f7645c083f6267da0633 Mon Sep 17 00:00:00 2001 From: Alexey Andreev Date: Thu, 18 Feb 2016 15:28:58 +0300 Subject: [PATCH] [KT-4124] Support invocation of constructor of inner class from extension method --- .../js/test/semantics/NestedTypesTest.java | 4 +++ .../js/translate/callTranslator/CallInfo.kt | 4 +++ .../cases/innerReferenceFromChild.kt | 25 +++++++++++++++++++ 3 files changed, 33 insertions(+) create mode 100644 js/js.translator/testData/nestedTypes/cases/innerReferenceFromChild.kt diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/NestedTypesTest.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/NestedTypesTest.java index 3dbdb063065..cebc9c38468 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/NestedTypesTest.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/NestedTypesTest.java @@ -58,6 +58,10 @@ public class NestedTypesTest extends SingleFileTranslationTest { checkFooBoxIsOk(); } + public void testInnerReferenceFromChild() throws Exception { + checkFooBoxIsOk(); + } + @NotNull @Override protected List additionalJsFiles(@NotNull EcmaVersion ecmaVersion) { diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/callTranslator/CallInfo.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/callTranslator/CallInfo.kt index f9b443c0b7c..56c3ffe9717 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/callTranslator/CallInfo.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/callTranslator/CallInfo.kt @@ -35,6 +35,7 @@ import org.jetbrains.kotlin.js.translate.general.Translation import org.jetbrains.kotlin.js.translate.utils.JsDescriptorUtils import org.jetbrains.kotlin.psi.KtSuperExpression import org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver +import org.jetbrains.kotlin.resolve.scopes.receivers.ExtensionReceiver import org.jetbrains.kotlin.resolve.scopes.receivers.ThisClassReceiver interface CallInfo { @@ -79,6 +80,9 @@ val CallInfo.superCallReceiver : JsExpression? is ThisClassReceiver -> { JsLiteral.THIS } + is ExtensionReceiver -> { + JsLiteral.THIS + } else -> { null } diff --git a/js/js.translator/testData/nestedTypes/cases/innerReferenceFromChild.kt b/js/js.translator/testData/nestedTypes/cases/innerReferenceFromChild.kt new file mode 100644 index 00000000000..934422ddd6c --- /dev/null +++ b/js/js.translator/testData/nestedTypes/cases/innerReferenceFromChild.kt @@ -0,0 +1,25 @@ +package foo + +var i = 0 + +abstract class Base { + val base = "b" + i++ + inner class Inner { + fun o() = "O" + base + fun k() = "K" + base + } +} + +class Child : Base() + +fun box(): String { + var result = "" + result += Child().Inner().o() + + fun Child.f() { + result += Inner().k() + } + Child().f() + + return if (result == "Ob0Kb1") "OK" else result +} \ No newline at end of file