JS: initialize enum 'name' and 'ordinal' properties before translating other property initializers.

This commit is contained in:
Anton Bannykh
2016-12-06 14:19:48 +03:00
parent addd24955b
commit e0c75f1fb8
2 changed files with 14 additions and 13 deletions
@@ -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
@@ -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;