From b84e5969e2f16fd7dc73673d40d29a26f276d4de Mon Sep 17 00:00:00 2001 From: Michael Nedzelsky Date: Thu, 2 Oct 2014 13:08:34 +0400 Subject: [PATCH] JS backend: fix get mangling name for generic methods with multiply upper bounds --- .../k2js/test/semantics/NameClashesTest.java | 4 +++ .../translate/utils/TranslationUtils.java | 10 +++++-- ...methodOverloadInClassWithTwoUpperBounds.kt | 29 +++++++++++++++++++ 3 files changed, 40 insertions(+), 3 deletions(-) create mode 100644 js/js.translator/testData/nameClashes/cases/methodOverloadInClassWithTwoUpperBounds.kt diff --git a/js/js.tests/test/org/jetbrains/k2js/test/semantics/NameClashesTest.java b/js/js.tests/test/org/jetbrains/k2js/test/semantics/NameClashesTest.java index 36ad406d7d7..da00cf2926a 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/semantics/NameClashesTest.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/semantics/NameClashesTest.java @@ -36,4 +36,8 @@ public final class NameClashesTest extends SingleFileTranslationTest { public void testDifferenceInCapitalization() throws Exception { checkFooBoxIsOk(); } + + public void testMethodOverloadInClassWithTwoUpperBounds() throws Exception { + checkFooBoxIsOk(); + } } \ No newline at end of file diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/utils/TranslationUtils.java b/js/js.translator/src/org/jetbrains/k2js/translate/utils/TranslationUtils.java index bba83234ccd..222e6b4b516 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/utils/TranslationUtils.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/utils/TranslationUtils.java @@ -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() { + @Override + public String fun(JetType type) { + return getJetTypeFqName(type, printTypeArguments); + } + }, "&"); } List typeArguments = jetType.getArguments(); diff --git a/js/js.translator/testData/nameClashes/cases/methodOverloadInClassWithTwoUpperBounds.kt b/js/js.translator/testData/nameClashes/cases/methodOverloadInClassWithTwoUpperBounds.kt new file mode 100644 index 00000000000..ec24dff2667 --- /dev/null +++ b/js/js.translator/testData/nameClashes/cases/methodOverloadInClassWithTwoUpperBounds.kt @@ -0,0 +1,29 @@ +package foo + +trait TraitA +trait TraitB + +public open abstract class Node() 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() { + 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" +} \ No newline at end of file