JS: initialize enum 'name' and 'ordinal' properties before translating other property initializers.
This commit is contained in:
@@ -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
|
||||
|
||||
+14
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user