From e7eb35b169e2b428831d6f8cbe2c92cb4c583081 Mon Sep 17 00:00:00 2001 From: Zalim Bashorov Date: Wed, 3 Aug 2016 22:15:38 +0300 Subject: [PATCH] JS backend: always (explicitly) generate constructor function for classes. Use name of class as name of constructor function when it isn't special. #KT-4115 In Progress --- .../translate/declaration/ClassTranslator.kt | 3 --- .../ClassInitializerTranslator.java | 26 ++++++++++++++----- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/ClassTranslator.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/ClassTranslator.kt index 269d752cdda..95d4f8f9314 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/ClassTranslator.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/ClassTranslator.kt @@ -139,9 +139,6 @@ class ClassTranslator private constructor( invocationArguments += JsObjectLiteral(staticProperties, true) } - if (primaryConstructor != null && primaryConstructor!!.function.body.isEmpty) { - invocationArguments[invocationArguments.indexOf(primaryConstructor!!.function)] = JsLiteral.NULL - } this.definitionPlace = definitionPlace } 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 159adac5f04..494e635c672 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 @@ -1,5 +1,5 @@ /* - * Copyright 2010-2015 JetBrains s.r.o. + * Copyright 2010-2016 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -30,6 +30,7 @@ import org.jetbrains.kotlin.js.translate.reference.CallArgumentTranslator; import org.jetbrains.kotlin.js.translate.utils.JsAstUtils; import org.jetbrains.kotlin.js.translate.utils.jsAstUtils.AstUtilsKt; import org.jetbrains.kotlin.lexer.KtTokens; +import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.psi.KtClassOrObject; import org.jetbrains.kotlin.psi.KtEnumEntry; import org.jetbrains.kotlin.psi.KtParameter; @@ -77,12 +78,22 @@ public final class ClassInitializerTranslator extends AbstractTranslator { ClassDescriptor classDescriptor = getClassDescriptor(context.bindingContext(), declaration); ConstructorDescriptor primaryConstructor = classDescriptor.getUnsubstitutedPrimaryConstructor(); + Name name = classDescriptor.getName(); + + JsFunction ctorFunction; if (primaryConstructor != null) { - return context.getFunctionObject(primaryConstructor); + ctorFunction = context.getFunctionObject(primaryConstructor); } else { - return new JsFunction(context.scope(), new JsBlock(), "fake constructor for " + classDescriptor.getName().asString()); + ctorFunction = new JsFunction(context.scope(), new JsBlock(), "fake constructor for " + name.asString()); } + + // TODO use name from JsName when class annotated by that + if (!name.isSpecial()) { + ctorFunction.setName(ctorFunction.getScope().declareName(name.asString())); + } + + return ctorFunction; } @NotNull @@ -198,9 +209,12 @@ public final class ClassInitializerTranslator extends AbstractTranslator { } private void addCallToSuperMethod(@NotNull List arguments, JsFunction initializer) { - JsName ref = context().scope().declareName(Namer.CALLEE_NAME); - initializer.setName(ref); - JsInvocation call = new JsInvocation(Namer.getFunctionCallRef(Namer.superMethodNameRef(ref))); + if (initializer.getName() == null) { + JsName ref = context().scope().declareName(Namer.CALLEE_NAME); + initializer.setName(ref); + } + + JsInvocation call = new JsInvocation(Namer.getFunctionCallRef(Namer.superMethodNameRef(initializer.getName()))); call.getArguments().add(JsLiteral.THIS); call.getArguments().addAll(arguments); initializerStatements.add(0, call.makeStmt());