JS backend: use FqNameUnsafe when generate delegateName to avoid problems with special names.

#EA-64029 Fixed
This commit is contained in:
Zalim Bashorov
2015-03-13 18:43:44 +03:00
parent dfa8fbcb0d
commit 7d3094a0f1
4 changed files with 46 additions and 11 deletions
@@ -95,4 +95,8 @@ public class DelegationTest extends SingleFileTranslationTest {
public void testDelegationExtensionPropertyDelegated() throws Exception {
checkFooBoxIsOk();
}
public void testOnObject() throws Exception {
checkFooBoxIsOk();
}
}
@@ -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))
}
}
@@ -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);
}
@@ -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"
}