diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java index e41dc05339d..c2e5714e033 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java @@ -3611,6 +3611,12 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest { doTest(fileName); } + @TestMetadata("lateinit.kt") + public void testLateinit() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/initialize/lateinit.kt"); + doTest(fileName); + } + @TestMetadata("propertyInitializationOrder.kt") public void testPropertyInitializationOrder() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/initialize/propertyInitializationOrder.kt"); diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/initializer/InitializerVisitor.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/initializer/InitializerVisitor.java index 9bdd829212f..695b69b1fab 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/initializer/InitializerVisitor.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/initializer/InitializerVisitor.java @@ -19,8 +19,10 @@ package org.jetbrains.kotlin.js.translate.initializer; import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.builtins.KotlinBuiltIns; import org.jetbrains.kotlin.descriptors.PropertyDescriptor; -import org.jetbrains.kotlin.js.backend.ast.*; -import org.jetbrains.kotlin.js.translate.context.Namer; +import org.jetbrains.kotlin.js.backend.ast.JsExpression; +import org.jetbrains.kotlin.js.backend.ast.JsLiteral; +import org.jetbrains.kotlin.js.backend.ast.JsNameRef; +import org.jetbrains.kotlin.js.backend.ast.JsStatement; import org.jetbrains.kotlin.js.translate.context.TranslationContext; import org.jetbrains.kotlin.js.translate.declaration.PropertyTranslatorKt; import org.jetbrains.kotlin.js.translate.general.TranslatorVisitor; @@ -59,13 +61,14 @@ public final class InitializerVisitor extends TranslatorVisitor { statement = generateInitializerForDelegate(descriptor, value); } else if (Boolean.TRUE.equals(context.bindingContext().get(BindingContext.BACKING_FIELD_REQUIRED, descriptor))) { - JsExpression defaultValue = generateDefaultValue(descriptor, context); + JsNameRef backingFieldReference = TranslationUtils.backingFieldReference(context, descriptor); + JsExpression defaultValue = generateDefaultValue(descriptor, context, backingFieldReference); statement = TranslationUtils.assignmentToBackingField(context, descriptor, defaultValue).makeStmt(); } else if (JsDescriptorUtils.isSimpleFinalProperty(descriptor)) { - JsExpression defaultValue = generateDefaultValue(descriptor, context); - JsName propertyName = context.getNameForDescriptor(descriptor); - statement = JsAstUtils.assignment(new JsNameRef(propertyName, JsLiteral.THIS), defaultValue).makeStmt(); + JsNameRef propRef = new JsNameRef(context.getNameForDescriptor(descriptor), JsLiteral.THIS); + JsExpression defaultValue = generateDefaultValue(descriptor, context, propRef); + statement = JsAstUtils.assignment(propRef, defaultValue).makeStmt(); } if (statement != null && !JsAstUtils.isEmptyStatement(statement)) { @@ -76,8 +79,11 @@ public final class InitializerVisitor extends TranslatorVisitor { } @NotNull - private static JsExpression generateDefaultValue(@NotNull PropertyDescriptor property, @NotNull TranslationContext context) { - if (property.isLateInit()) return Namer.getUndefinedExpression(); + private static JsExpression generateDefaultValue( + @NotNull PropertyDescriptor property, + @NotNull TranslationContext context, + @NotNull JsExpression lateInitDefault) { + if (property.isLateInit()) return lateInitDefault.deepCopy(); KotlinType type = property.getType(); if (KotlinBuiltIns.isInt(type) || KotlinBuiltIns.isFloat(type) || KotlinBuiltIns.isDouble(type) || diff --git a/js/js.translator/testData/box/initialize/lateinit.kt b/js/js.translator/testData/box/initialize/lateinit.kt new file mode 100644 index 00000000000..14c301a0414 --- /dev/null +++ b/js/js.translator/testData/box/initialize/lateinit.kt @@ -0,0 +1,17 @@ +class Greeting { + val noon = xrun { + verb = "Hello" + "World" + } + + lateinit var verb: String + + fun greet() = "$verb $noon" +} + +fun xrun(body: () -> T) = body() + +fun box(): String { + if (Greeting().greet() != "Hello World") return "fail" + return "OK" +} \ No newline at end of file