From 7d3094a0f13b0fc5d169ef2849860ede59fb7de1 Mon Sep 17 00:00:00 2001 From: Zalim Bashorov Date: Fri, 13 Mar 2015 18:43:44 +0300 Subject: [PATCH] JS backend: use FqNameUnsafe when generate delegateName to avoid problems with special names. #EA-64029 Fixed --- .../js/test/semantics/DelegationTest.java | 4 ++++ .../declaration/DelegationTranslator.kt | 22 ++++++++++-------- .../js/translate/utils/ManglingUtils.java | 8 +++++-- .../testData/delegation/cases/onObject.kt | 23 +++++++++++++++++++ 4 files changed, 46 insertions(+), 11 deletions(-) create mode 100644 js/js.translator/testData/delegation/cases/onObject.kt diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/DelegationTest.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/DelegationTest.java index 73de79c1147..7c00cea0972 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/DelegationTest.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/DelegationTest.java @@ -95,4 +95,8 @@ public class DelegationTest extends SingleFileTranslationTest { public void testDelegationExtensionPropertyDelegated() throws Exception { checkFooBoxIsOk(); } + + public void testOnObject() throws Exception { + checkFooBoxIsOk(); + } } diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/DelegationTranslator.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/DelegationTranslator.kt index d844b80f7ce..a3d83e2fe5d 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/DelegationTranslator.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/DelegationTranslator.kt @@ -18,22 +18,25 @@ package org.jetbrains.kotlin.js.translate.declaration import com.google.dart.compiler.backend.js.ast.* +import org.jetbrains.kotlin.backend.common.CodegenUtil +import org.jetbrains.kotlin.backend.common.CodegenUtilKt import org.jetbrains.kotlin.descriptors.* -import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.js.translate.context.Namer import org.jetbrains.kotlin.js.translate.context.TranslationContext +import org.jetbrains.kotlin.js.translate.declaration.propertyTranslator.addGetterAndSetter import org.jetbrains.kotlin.js.translate.general.AbstractTranslator import org.jetbrains.kotlin.js.translate.general.Translation import org.jetbrains.kotlin.js.translate.utils.BindingUtils import org.jetbrains.kotlin.js.translate.utils.JsAstUtils -import org.jetbrains.kotlin.js.translate.utils.TranslationUtils.* -import org.jetbrains.kotlin.resolve.DescriptorUtils -import org.jetbrains.kotlin.backend.common.CodegenUtil -import java.util.HashMap -import org.jetbrains.kotlin.js.translate.declaration.propertyTranslator.addGetterAndSetter import org.jetbrains.kotlin.js.translate.utils.ManglingUtils.getMangledMemberNameForExplicitDelegation +import org.jetbrains.kotlin.js.translate.utils.TranslationUtils.simpleReturnFunction +import org.jetbrains.kotlin.js.translate.utils.TranslationUtils.translateFunctionAsEcma5PropertyDescriptor import org.jetbrains.kotlin.js.translate.utils.generateDelegateCall -import org.jetbrains.kotlin.backend.common.CodegenUtilKt +import org.jetbrains.kotlin.psi.JetClassOrObject +import org.jetbrains.kotlin.psi.JetDelegationSpecifier +import org.jetbrains.kotlin.psi.JetDelegatorByExpressionSpecifier +import org.jetbrains.kotlin.resolve.DescriptorUtils +import java.util.HashMap public class DelegationTranslator( private val classDeclaration: JetClassOrObject, @@ -60,8 +63,9 @@ public class DelegationTranslator( fields.put(specifier, Field(propertyDescriptor!!.getName().asString(), false)) } else { - val typeFqName = DescriptorUtils.getFqNameSafe(descriptor) - val delegateName = getMangledMemberNameForExplicitDelegation(Namer.getDelegatePrefix(), classDeclaration.getFqName(), typeFqName) + val classFqName = DescriptorUtils.getFqName(classDescriptor) + val typeFqName = DescriptorUtils.getFqName(descriptor) + val delegateName = getMangledMemberNameForExplicitDelegation(Namer.getDelegatePrefix(), classFqName, typeFqName) fields.put(specifier, Field(delegateName, true)) } } diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/ManglingUtils.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/ManglingUtils.java index 3a6f91a5d2c..4099be784ec 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/ManglingUtils.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/ManglingUtils.java @@ -22,7 +22,7 @@ import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.backend.common.CodegenUtil; import org.jetbrains.kotlin.descriptors.*; -import org.jetbrains.kotlin.name.FqName; +import org.jetbrains.kotlin.name.FqNameUnsafe; import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.resolve.DescriptorUtils; import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter; @@ -113,7 +113,11 @@ public class ManglingUtils { } @NotNull - public static String getMangledMemberNameForExplicitDelegation(@NotNull String suggestedName, FqName classFqName, FqName typeFqName) { + public static String getMangledMemberNameForExplicitDelegation( + @NotNull String suggestedName, + @NotNull FqNameUnsafe classFqName, + @NotNull FqNameUnsafe typeFqName + ) { String forCalculateId = classFqName.asString() + ":" + typeFqName.asString(); return getStableMangledName(suggestedName, forCalculateId); } diff --git a/js/js.translator/testData/delegation/cases/onObject.kt b/js/js.translator/testData/delegation/cases/onObject.kt new file mode 100644 index 00000000000..5ff8e5759c4 --- /dev/null +++ b/js/js.translator/testData/delegation/cases/onObject.kt @@ -0,0 +1,23 @@ +package foo + +trait T { + fun foo(): String +} + +class TImpl(val v: String) : T { + override fun foo() = v +} + +class A { + class object : T by TImpl("A.Default") +} + +object B : T by TImpl("B") + + +fun box(): String { + assertEquals("A.Default", A.foo()) + assertEquals("B", B.foo()) + + return "OK" +} \ No newline at end of file