JS backend: fix get mangling name for generic methods with multiply upper bounds

This commit is contained in:
Michael Nedzelsky
2014-10-02 13:08:34 +04:00
parent 9fabdf4587
commit b84e5969e2
3 changed files with 40 additions and 3 deletions
@@ -36,4 +36,8 @@ public final class NameClashesTest extends SingleFileTranslationTest {
public void testDifferenceInCapitalization() throws Exception {
checkFooBoxIsOk();
}
public void testMethodOverloadInClassWithTwoUpperBounds() throws Exception {
checkFooBoxIsOk();
}
}
@@ -137,13 +137,17 @@ public final class TranslationUtils {
}
@NotNull
public static String getJetTypeFqName(@NotNull JetType jetType, boolean printTypeArguments) {
public static String getJetTypeFqName(@NotNull JetType jetType, final boolean printTypeArguments) {
ClassifierDescriptor declaration = jetType.getConstructor().getDeclarationDescriptor();
assert declaration != null;
if (declaration instanceof TypeParameterDescriptor) {
TypeParameterDescriptor typeParameter = (TypeParameterDescriptor) declaration;
return getJetTypeFqName(typeParameter.getUpperBoundsAsType(), printTypeArguments);
return StringUtil.join(((TypeParameterDescriptor) declaration).getUpperBounds(), new Function<JetType, String>() {
@Override
public String fun(JetType type) {
return getJetTypeFqName(type, printTypeArguments);
}
}, "&");
}
List<TypeProjection> typeArguments = jetType.getArguments();
@@ -0,0 +1,29 @@
package foo
trait TraitA
trait TraitB
public open abstract class Node<T : TraitA>() where T : TraitB {
public abstract fun bar(arg: T): String
public abstract fun bar(arg: TraitA): String
public abstract fun bar(arg: TraitB): String
}
class ClassAB : TraitA, TraitB
public class MyNode : Node<ClassAB>() {
override fun bar(arg: ClassAB): String = "MyNode.bar(ClassAB)"
override fun bar(arg: TraitA): String = "MyNode.bar(TraitA)"
override fun bar(arg: TraitB): String = "MyNode.bar(TraitB)"
}
fun box(): String {
var node = MyNode()
assertEquals("MyNode.bar(ClassAB)", node.bar(ClassAB()))
assertEquals("MyNode.bar(TraitA)", node.bar(ClassAB(): TraitA))
assertEquals("MyNode.bar(TraitB)", node.bar(ClassAB(): TraitB))
return "OK"
}