From ba9c908875d334b43e88a1a989cc8c55817c2981 Mon Sep 17 00:00:00 2001 From: Alexey Andreev Date: Tue, 23 Aug 2016 16:39:26 +0300 Subject: [PATCH] KT-2752: export JsName on class via JS reflection --- .../initializer/ClassInitializerTranslator.java | 16 +++++++++++----- .../testData/box/reflection/light/_common.kt | 2 ++ .../testData/box/reflection/light/jsClassName.kt | 2 ++ 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/initializer/ClassInitializerTranslator.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/initializer/ClassInitializerTranslator.java index 7e03197ef11..203297f3663 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/initializer/ClassInitializerTranslator.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/initializer/ClassInitializerTranslator.java @@ -26,6 +26,7 @@ import org.jetbrains.kotlin.js.translate.context.UsageTracker; import org.jetbrains.kotlin.js.translate.declaration.DelegationTranslator; import org.jetbrains.kotlin.js.translate.general.AbstractTranslator; import org.jetbrains.kotlin.js.translate.reference.CallArgumentTranslator; +import org.jetbrains.kotlin.js.translate.utils.AnnotationsUtils; import org.jetbrains.kotlin.js.translate.utils.JsAstUtils; import org.jetbrains.kotlin.js.translate.utils.jsAstUtils.AstUtilsKt; import org.jetbrains.kotlin.lexer.KtTokens; @@ -76,19 +77,24 @@ public final class ClassInitializerTranslator extends AbstractTranslator { ClassDescriptor classDescriptor = getClassDescriptor(context.bindingContext(), declaration); ConstructorDescriptor primaryConstructor = classDescriptor.getUnsubstitutedPrimaryConstructor(); - Name name = classDescriptor.getName(); + String functionName = AnnotationsUtils.getJsName(classDescriptor); + if (functionName == null) { + Name name = classDescriptor.getName(); + if (!name.isSpecial()) { + functionName = name.asString(); + } + } JsFunction ctorFunction; if (primaryConstructor != null) { ctorFunction = context.getFunctionObject(primaryConstructor); } else { - ctorFunction = new JsFunction(context.scope(), new JsBlock(), "fake constructor for " + name.asString()); + ctorFunction = new JsFunction(context.scope(), new JsBlock(), "fake constructor for " + functionName); } - // TODO use name from JsName when class annotated by that - if (!name.isSpecial()) { - ctorFunction.setName(ctorFunction.getScope().declareName(name.asString())); + if (functionName != null) { + ctorFunction.setName(ctorFunction.getScope().declareName(functionName)); } return ctorFunction; diff --git a/js/js.translator/testData/box/reflection/light/_common.kt b/js/js.translator/testData/box/reflection/light/_common.kt index 623d0cbdf73..129cfe42758 100644 --- a/js/js.translator/testData/box/reflection/light/_common.kt +++ b/js/js.translator/testData/box/reflection/light/_common.kt @@ -18,3 +18,5 @@ enum class E { Z {} } +@JsName("Q") +class R diff --git a/js/js.translator/testData/box/reflection/light/jsClassName.kt b/js/js.translator/testData/box/reflection/light/jsClassName.kt index 7d94415f866..c075df98aec 100644 --- a/js/js.translator/testData/box/reflection/light/jsClassName.kt +++ b/js/js.translator/testData/box/reflection/light/jsClassName.kt @@ -8,6 +8,7 @@ fun testWithInstance() { assertEquals("Y", E.Y.jsClass.name) // TODO uncomment after KT-13338 is fixed // assertEquals("E", E.Z.jsClass.name) + assertEquals("Q", R().jsClass.name) } fun testWithClassReference() { @@ -16,6 +17,7 @@ fun testWithClassReference() { assertEquals("O", jsClass().name) assertEquals("I", jsClass().name) assertEquals("E", jsClass().name) + assertEquals("Q", jsClass().name) } fun box(): String {