From 0f6a77e7007a68550e5f6491f72c6e73a7241c03 Mon Sep 17 00:00:00 2001 From: Zalim Bashorov Date: Fri, 17 Aug 2018 20:31:06 +0300 Subject: [PATCH] [JS IR BE] take into account receiver's type when generate name for callables (including properties) Also, add special markers for receiver type and generic types to avoid accidental clashes. --- .../backend/js/utils/SimpleNameGenerator.kt | 19 +++++++++++++++++-- .../js/test/semantics/BoxJsTestGenerated.java | 5 +++++ .../test/semantics/IrBoxJsTestGenerated.java | 5 +++++ .../withSameNameAndDiffReceiverType.kt | 13 +++++++++++++ 4 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 js/js.translator/testData/box/extensionProperty/withSameNameAndDiffReceiverType.kt diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/SimpleNameGenerator.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/SimpleNameGenerator.kt index 66707b229dd..25ae5c3ab3e 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/SimpleNameGenerator.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/SimpleNameGenerator.kt @@ -16,6 +16,7 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe import org.jetbrains.kotlin.resolve.descriptorUtil.isEffectivelyExternal import org.jetbrains.kotlin.resolve.scopes.receivers.ExtensionReceiver import org.jetbrains.kotlin.resolve.scopes.receivers.ImplicitClassReceiver +import org.jetbrains.kotlin.utils.addToStdlib.ifNotEmpty class SimpleNameGenerator : NameGenerator { @@ -71,7 +72,13 @@ class SimpleNameGenerator : NameGenerator { is PropertyGetterDescriptor -> nameBuilder.append(Namer.GETTER_PREFIX) is PropertySetterDescriptor -> nameBuilder.append(Namer.SETTER_PREFIX) } + nameBuilder.append(descriptor.correspondingProperty.name.asString()) + + descriptor.extensionReceiverParameter?.let { + nameBuilder.append("_r$${it.type}") + } + if (descriptor.visibility == Visibilities.PRIVATE) { nameBuilder.append('$') nameBuilder.append(getNameForDescriptor(descriptor.containingDeclaration, context)) @@ -95,8 +102,16 @@ class SimpleNameGenerator : NameGenerator { } is CallableDescriptor -> { nameBuilder.append(descriptor.name.asString()) - descriptor.typeParameters.forEach { nameBuilder.append("_${it.name.asString()}") } - descriptor.valueParameters.forEach { nameBuilder.append("_${it.type}") } + descriptor.typeParameters.ifNotEmpty { + nameBuilder.append("_\$t") + joinTo(nameBuilder, "") { "_${it.name}" } + } + descriptor.extensionReceiverParameter?.let { + nameBuilder.append("_r$${it.type}") + } + descriptor.valueParameters.ifNotEmpty { + joinTo(nameBuilder, "") { "_${it.type}" } + } } } 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 062b18eaccc..83c536bf419 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 @@ -3434,6 +3434,11 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest { public void testSimplePropertyWithGetter() throws Exception { runTest("js/js.translator/testData/box/extensionProperty/simplePropertyWithGetter.kt"); } + + @TestMetadata("withSameNameAndDiffReceiverType.kt") + public void testWithSameNameAndDiffReceiverType() throws Exception { + runTest("js/js.translator/testData/box/extensionProperty/withSameNameAndDiffReceiverType.kt"); + } } @TestMetadata("js/js.translator/testData/box/incremental") diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrBoxJsTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrBoxJsTestGenerated.java index ddfd9c57e71..6b708e6b888 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrBoxJsTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrBoxJsTestGenerated.java @@ -3434,6 +3434,11 @@ public class IrBoxJsTestGenerated extends AbstractIrBoxJsTest { public void testSimplePropertyWithGetter() throws Exception { runTest("js/js.translator/testData/box/extensionProperty/simplePropertyWithGetter.kt"); } + + @TestMetadata("withSameNameAndDiffReceiverType.kt") + public void testWithSameNameAndDiffReceiverType() throws Exception { + runTest("js/js.translator/testData/box/extensionProperty/withSameNameAndDiffReceiverType.kt"); + } } @TestMetadata("js/js.translator/testData/box/incremental") diff --git a/js/js.translator/testData/box/extensionProperty/withSameNameAndDiffReceiverType.kt b/js/js.translator/testData/box/extensionProperty/withSameNameAndDiffReceiverType.kt new file mode 100644 index 00000000000..322761866f3 --- /dev/null +++ b/js/js.translator/testData/box/extensionProperty/withSameNameAndDiffReceiverType.kt @@ -0,0 +1,13 @@ +// EXPECTED_REACHABLE_NODES: 1196 +object Foo { + val value = "O" +} +class Bar(val anotherValue: String) + +val Foo.prop: String + get() = value + +val Bar.prop: String + get() = anotherValue + +fun box() = Foo.prop + Bar("K").prop \ No newline at end of file