From cacd9173505771e28d4eac491e7291d96d6a5273 Mon Sep 17 00:00:00 2001 From: Alexey Andreev Date: Mon, 24 Oct 2016 18:18:43 +0300 Subject: [PATCH] JS: fix translation of extension properties --- .../js/test/semantics/BoxJsTestGenerated.java | 12 ++++++++++++ .../translate/callTranslator/CallInfoExtensions.kt | 9 --------- .../translate/callTranslator/VariableCallCases.kt | 6 +++--- .../extensionProperty/externalExtensionProperty.kt | 14 ++++++++++++++ .../extensionProperty/privateExtensionProperty.kt | 8 ++++++++ 5 files changed, 37 insertions(+), 12 deletions(-) create mode 100644 js/js.translator/testData/box/extensionProperty/externalExtensionProperty.kt create mode 100644 js/js.translator/testData/box/extensionProperty/privateExtensionProperty.kt diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java index 85ebcdaf7b9..0c0502b2737 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java @@ -3269,12 +3269,24 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("js/js.translator/testData/box/extensionProperty"), Pattern.compile("^([^_](.+))\\.kt$"), TargetBackend.ANY, true); } + @TestMetadata("externalExtensionProperty.kt") + public void testExternalExtensionProperty() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/extensionProperty/externalExtensionProperty.kt"); + doTest(fileName); + } + @TestMetadata("inClass.kt") public void testInClass() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/extensionProperty/inClass.kt"); doTest(fileName); } + @TestMetadata("privateExtensionProperty.kt") + public void testPrivateExtensionProperty() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/extensionProperty/privateExtensionProperty.kt"); + doTest(fileName); + } + @TestMetadata("propertyWithGetterAndSetter.kt") public void testPropertyWithGetterAndSetter() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/extensionProperty/propertyWithGetterAndSetter.kt"); diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/callTranslator/CallInfoExtensions.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/callTranslator/CallInfoExtensions.kt index c53883de5b9..573caddb61f 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/callTranslator/CallInfoExtensions.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/callTranslator/CallInfoExtensions.kt @@ -95,12 +95,3 @@ val FunctionCallInfo.functionName: JsName get() = context.getNameForDescriptor(callableDescriptor) fun FunctionCallInfo.hasSpreadOperator(): Boolean = argumentsInfo.hasSpreadOperator - -fun TranslationContext.aliasOrValue(callableDescriptor: CallableDescriptor, value: (CallableDescriptor) -> JsExpression): JsExpression { - val alias = getAliasForDescriptor(callableDescriptor) - if (alias != null) { - return alias - } else { - return value(callableDescriptor) - } -} diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/callTranslator/VariableCallCases.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/callTranslator/VariableCallCases.kt index 3d331051424..9cb4581a680 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/callTranslator/VariableCallCases.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/callTranslator/VariableCallCases.kt @@ -54,7 +54,7 @@ object NativeVariableAccessCase : VariableAccessCase() { override fun VariableAccessInfo.noReceivers(): JsExpression { val descriptor = resolvedCall.resultingDescriptor return if (descriptor is PropertyDescriptor && TranslationUtils.shouldAccessViaFunctions(descriptor)) { - val methodRef = context.aliasOrValue(callableDescriptor) { context.getQualifiedReference(getAccessDescriptorIfNeeded()) } + val methodRef = ReferenceTranslator.translateAsValueReference(getAccessDescriptorIfNeeded(), context) JsInvocation(methodRef, *additionalArguments.toTypedArray()) } else { @@ -77,7 +77,7 @@ object DefaultVariableAccessCase : VariableAccessCase() { val descriptor = resolvedCall.resultingDescriptor if (descriptor is PropertyDescriptor && TranslationUtils.shouldAccessViaFunctions(descriptor)) { - val methodRef = context.aliasOrValue(callableDescriptor) { context.getQualifiedReference(getAccessDescriptorIfNeeded()) } + val methodRef = ReferenceTranslator.translateAsValueReference(getAccessDescriptorIfNeeded(), context) return JsInvocation(methodRef, *additionalArguments.toTypedArray()) } @@ -119,7 +119,7 @@ object DefaultVariableAccessCase : VariableAccessCase() { } override fun VariableAccessInfo.extensionReceiver(): JsExpression { - val functionRef = context.aliasOrValue(callableDescriptor) { context.getQualifiedReference(getAccessDescriptorIfNeeded()) } + val functionRef = ReferenceTranslator.translateAsValueReference(getAccessDescriptorIfNeeded(), context) return JsInvocation(functionRef, extensionReceiver!!, *additionalArguments.toTypedArray()) } diff --git a/js/js.translator/testData/box/extensionProperty/externalExtensionProperty.kt b/js/js.translator/testData/box/extensionProperty/externalExtensionProperty.kt new file mode 100644 index 00000000000..f010645cf20 --- /dev/null +++ b/js/js.translator/testData/box/extensionProperty/externalExtensionProperty.kt @@ -0,0 +1,14 @@ +// MODULE: lib +// FILE: lib.kt + +class A { + fun ok() = "OK" +} + +val A.foo: String + get() = ok() + +// MODULE: main(lib) +// FILE: main.kt + +fun box() = A().foo \ No newline at end of file diff --git a/js/js.translator/testData/box/extensionProperty/privateExtensionProperty.kt b/js/js.translator/testData/box/extensionProperty/privateExtensionProperty.kt new file mode 100644 index 00000000000..11d0ad3a4ee --- /dev/null +++ b/js/js.translator/testData/box/extensionProperty/privateExtensionProperty.kt @@ -0,0 +1,8 @@ +class A { + fun result() = "OK" +} + +private val A.foo: String + get() = result() + +fun box() = A().foo \ No newline at end of file