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)
|
primaryConstructor = ConstructorInfo(constructorFunction, constructorContext, descriptor)
|
||||||
|
|
||||||
if (descriptor.kind == ClassKind.ENUM_CLASS) {
|
|
||||||
addEnumClassParameters(constructorFunction)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -149,15 +145,6 @@ class ClassTranslator private constructor(
|
|||||||
return function
|
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) {
|
private fun isObjectLike() = when (descriptor.kind) {
|
||||||
ClassKind.OBJECT,
|
ClassKind.OBJECT,
|
||||||
ClassKind.ENUM_ENTRY -> true
|
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
|
//NOTE: while we translate constructor parameters we also add property initializer statements
|
||||||
// for properties declared as constructor parameters
|
// for properties declared as constructor parameters
|
||||||
initFunction.getParameters().addAll(translatePrimaryConstructorParameters());
|
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());
|
delegationTranslator.addInitCode(initFunction.getBody().getStatements());
|
||||||
new InitializerVisitor().traverseContainer(classDeclaration, context().innerBlock(initFunction.getBody()));
|
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) {
|
private void addOuterClassReference(ClassDescriptor classDescriptor) {
|
||||||
JsName outerName = context.getOuterClassReference(classDescriptor);
|
JsName outerName = context.getOuterClassReference(classDescriptor);
|
||||||
if (outerName == null) return;
|
if (outerName == null) return;
|
||||||
|
|||||||
Reference in New Issue
Block a user