[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.
This commit is contained in:
Zalim Bashorov
2018-08-17 20:31:06 +03:00
parent b9d6580b44
commit 0f6a77e700
4 changed files with 40 additions and 2 deletions
@@ -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}" }
}
}
}
@@ -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")
@@ -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")
@@ -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