From e0c75f1fb854a2361de4d316f133b114ec7cd7d0 Mon Sep 17 00:00:00 2001 From: Anton Bannykh Date: Tue, 6 Dec 2016 14:19:48 +0300 Subject: [PATCH] JS: initialize enum 'name' and 'ordinal' properties before translating other property initializers. --- .../js/translate/declaration/ClassTranslator.kt | 13 ------------- .../initializer/ClassInitializerTranslator.java | 14 ++++++++++++++ 2 files changed, 14 insertions(+), 13 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 9173af1f363..e6c21b60e8c 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 @@ -133,10 +133,6 @@ class ClassTranslator private constructor( } primaryConstructor = ConstructorInfo(constructorFunction, constructorContext, descriptor) - - if (descriptor.kind == ClassKind.ENUM_CLASS) { - addEnumClassParameters(constructorFunction) - } } } @@ -149,15 +145,6 @@ class ClassTranslator private constructor( return function } - private fun addEnumClassParameters(constructorFunction: JsFunction) { - val nameParamName = constructorFunction.scope.declareTemporaryName("name") - val ordinalParamName = constructorFunction.scope.declareTemporaryName("ordinal") - constructorFunction.parameters.addAll(0, listOf(JsParameter(nameParamName), JsParameter(ordinalParamName))) - - constructorFunction.body.statements += JsAstUtils.assignmentToThisField(Namer.ENUM_NAME_FIELD, nameParamName.makeRef()) - constructorFunction.body.statements += JsAstUtils.assignmentToThisField(Namer.ENUM_ORDINAL_FIELD, ordinalParamName.makeRef()) - } - private fun isObjectLike() = when (descriptor.kind) { ClassKind.OBJECT, ClassKind.ENUM_ENTRY -> true 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 d2da90056cf..27a855949d5 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 @@ -98,12 +98,26 @@ public final class ClassInitializerTranslator extends AbstractTranslator { //NOTE: while we translate constructor parameters we also add property initializer statements // for properties declared as constructor parameters initFunction.getParameters().addAll(translatePrimaryConstructorParameters()); + + // Initialize enum 'name' and 'ordinal' before translating property initializers. + if (classDescriptor.getKind() == ClassKind.ENUM_CLASS) { + addEnumClassParameters(initFunction); + } } delegationTranslator.addInitCode(initFunction.getBody().getStatements()); new InitializerVisitor().traverseContainer(classDeclaration, context().innerBlock(initFunction.getBody())); } + private static void addEnumClassParameters(JsFunction constructorFunction) { + JsName nameParamName = constructorFunction.getScope().declareFreshName("name"); + JsName ordinalParamName = constructorFunction.getScope().declareFreshName("ordinal"); + constructorFunction.getParameters().addAll(0, Arrays.asList(new JsParameter(nameParamName), new JsParameter(ordinalParamName))); + + constructorFunction.getBody().getStatements().add(JsAstUtils.assignmentToThisField(Namer.ENUM_NAME_FIELD, nameParamName.makeRef())); + constructorFunction.getBody().getStatements().add(JsAstUtils.assignmentToThisField(Namer.ENUM_ORDINAL_FIELD, ordinalParamName.makeRef())); + } + private void addOuterClassReference(ClassDescriptor classDescriptor) { JsName outerName = context.getOuterClassReference(classDescriptor); if (outerName == null) return;