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