From 373bd5ff170f43b437e0a8f804e77c6e2cf5a107 Mon Sep 17 00:00:00 2001 From: Anton Bannykh Date: Thu, 14 Sep 2017 19:49:39 +0300 Subject: [PATCH] JS: throw exception on access to an uninitialized local variable (KT-20248 fixed) --- .../uninitializedCapturedMemberAccess.kt | 2 +- .../local/uninitializedCapturedRead.kt | 2 +- .../local/uninitializedMemberAccess.kt | 2 +- .../lateinit/local/uninitializedRead.kt | 2 +- .../semantics/JsCodegenBoxTestGenerated.java | 32 +++---------------- .../reference/VariableAccessTranslator.java | 14 ++++++-- 6 files changed, 19 insertions(+), 35 deletions(-) diff --git a/compiler/testData/codegen/box/properties/lateinit/local/uninitializedCapturedMemberAccess.kt b/compiler/testData/codegen/box/properties/lateinit/local/uninitializedCapturedMemberAccess.kt index b96d67b9516..74fd67b08f8 100644 --- a/compiler/testData/codegen/box/properties/lateinit/local/uninitializedCapturedMemberAccess.kt +++ b/compiler/testData/codegen/box/properties/lateinit/local/uninitializedCapturedMemberAccess.kt @@ -1,6 +1,6 @@ // LANGUAGE_VERSION: 1.2 // WITH_RUNTIME -// IGNORE_BACKEND: JS, NATIVE +// IGNORE_BACKEND: NATIVE import kotlin.UninitializedPropertyAccessException diff --git a/compiler/testData/codegen/box/properties/lateinit/local/uninitializedCapturedRead.kt b/compiler/testData/codegen/box/properties/lateinit/local/uninitializedCapturedRead.kt index b748853e356..450606b7f4c 100644 --- a/compiler/testData/codegen/box/properties/lateinit/local/uninitializedCapturedRead.kt +++ b/compiler/testData/codegen/box/properties/lateinit/local/uninitializedCapturedRead.kt @@ -1,6 +1,6 @@ // LANGUAGE_VERSION: 1.2 // WITH_RUNTIME -// IGNORE_BACKEND: JS, NATIVE +// IGNORE_BACKEND: NATIVE import kotlin.UninitializedPropertyAccessException diff --git a/compiler/testData/codegen/box/properties/lateinit/local/uninitializedMemberAccess.kt b/compiler/testData/codegen/box/properties/lateinit/local/uninitializedMemberAccess.kt index 7b85035c438..6785487157e 100644 --- a/compiler/testData/codegen/box/properties/lateinit/local/uninitializedMemberAccess.kt +++ b/compiler/testData/codegen/box/properties/lateinit/local/uninitializedMemberAccess.kt @@ -1,6 +1,6 @@ // LANGUAGE_VERSION: 1.2 // WITH_RUNTIME -// IGNORE_BACKEND: JS, NATIVE +// IGNORE_BACKEND: NATIVE import kotlin.UninitializedPropertyAccessException diff --git a/compiler/testData/codegen/box/properties/lateinit/local/uninitializedRead.kt b/compiler/testData/codegen/box/properties/lateinit/local/uninitializedRead.kt index c631ba7ad5f..cdb17a1381d 100644 --- a/compiler/testData/codegen/box/properties/lateinit/local/uninitializedRead.kt +++ b/compiler/testData/codegen/box/properties/lateinit/local/uninitializedRead.kt @@ -1,6 +1,6 @@ // LANGUAGE_VERSION: 1.2 // WITH_RUNTIME -// IGNORE_BACKEND: JS, NATIVE +// IGNORE_BACKEND: NATIVE import kotlin.UninitializedPropertyAccessException diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index 9ae2a1b4d9d..41799b47748 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -15087,49 +15087,25 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { @TestMetadata("uninitializedCapturedMemberAccess.kt") public void testUninitializedCapturedMemberAccess() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/properties/lateinit/local/uninitializedCapturedMemberAccess.kt"); - try { - doTest(fileName); - } - catch (Throwable ignore) { - return; - } - throw new AssertionError("Looks like this test can be unmuted. Remove IGNORE_BACKEND directive for that."); + doTest(fileName); } @TestMetadata("uninitializedCapturedRead.kt") public void testUninitializedCapturedRead() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/properties/lateinit/local/uninitializedCapturedRead.kt"); - try { - doTest(fileName); - } - catch (Throwable ignore) { - return; - } - throw new AssertionError("Looks like this test can be unmuted. Remove IGNORE_BACKEND directive for that."); + doTest(fileName); } @TestMetadata("uninitializedMemberAccess.kt") public void testUninitializedMemberAccess() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/properties/lateinit/local/uninitializedMemberAccess.kt"); - try { - doTest(fileName); - } - catch (Throwable ignore) { - return; - } - throw new AssertionError("Looks like this test can be unmuted. Remove IGNORE_BACKEND directive for that."); + doTest(fileName); } @TestMetadata("uninitializedRead.kt") public void testUninitializedRead() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/properties/lateinit/local/uninitializedRead.kt"); - try { - doTest(fileName); - } - catch (Throwable ignore) { - return; - } - throw new AssertionError("Looks like this test can be unmuted. Remove IGNORE_BACKEND directive for that."); + doTest(fileName); } } diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/VariableAccessTranslator.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/VariableAccessTranslator.java index 74e6c5f6390..eaba7744093 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/VariableAccessTranslator.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/VariableAccessTranslator.java @@ -19,10 +19,10 @@ package org.jetbrains.kotlin.js.translate.reference; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.descriptors.*; -import org.jetbrains.kotlin.js.backend.ast.JsBinaryOperation; -import org.jetbrains.kotlin.js.backend.ast.JsExpression; -import org.jetbrains.kotlin.js.backend.ast.JsNameRef; +import org.jetbrains.kotlin.descriptors.impl.LocalVariableDescriptor; +import org.jetbrains.kotlin.js.backend.ast.*; import org.jetbrains.kotlin.js.translate.callTranslator.CallTranslator; +import org.jetbrains.kotlin.js.translate.context.Namer; import org.jetbrains.kotlin.js.translate.context.TranslationContext; import org.jetbrains.kotlin.js.translate.general.AbstractTranslator; import org.jetbrains.kotlin.psi.KtReferenceExpression; @@ -80,6 +80,14 @@ public class VariableAccessTranslator extends AbstractTranslator implements Acce } } } + else if (original instanceof LocalVariableDescriptor) { + LocalVariableDescriptor originalLocal = (LocalVariableDescriptor) original; + if (originalLocal.isLateInit()) { + JsInvocation throwInvocation = new JsInvocation(Namer.throwUninitializedPropertyAccessExceptionFunRef(), + new JsStringLiteral(originalLocal.getName().asString())); + return new JsConditional(new JsBinaryOperation(JsBinaryOperator.EQ, e, new JsNullLiteral()), throwInvocation, e); + } + } return e; }