From 2fb7b013203fcceb768522f019ac4f45b68bc7dc Mon Sep 17 00:00:00 2001 From: Anton Bannykh Date: Mon, 31 Oct 2016 20:42:34 +0300 Subject: [PATCH] Fix capturing variables declared via destructuring (#KT-14535 fixed). --- .../multiDecl/VarCapturedInFunctionLiteral.kt | 2 -- .../multiDecl/VarCapturedInLocalFunction.kt | 2 -- .../multiDecl/VarCapturedInObjectLiteral.kt | 2 -- .../MultiDeclarationTestsGenerated.java | 36 +++++++++---------- .../DestructuringDeclarationTranslator.java | 8 +++++ 5 files changed, 26 insertions(+), 24 deletions(-) diff --git a/compiler/testData/codegen/box/multiDecl/VarCapturedInFunctionLiteral.kt b/compiler/testData/codegen/box/multiDecl/VarCapturedInFunctionLiteral.kt index 2dd98691b63..e0eb2cb5edd 100644 --- a/compiler/testData/codegen/box/multiDecl/VarCapturedInFunctionLiteral.kt +++ b/compiler/testData/codegen/box/multiDecl/VarCapturedInFunctionLiteral.kt @@ -1,5 +1,3 @@ -// TODO: enable JS backend when issue KT-14535 is fixed -// IGNORE_BACKEND: JS class A { operator fun component1() = 1 operator fun component2() = 2 diff --git a/compiler/testData/codegen/box/multiDecl/VarCapturedInLocalFunction.kt b/compiler/testData/codegen/box/multiDecl/VarCapturedInLocalFunction.kt index d5008d7606d..5c2a87c9d65 100644 --- a/compiler/testData/codegen/box/multiDecl/VarCapturedInLocalFunction.kt +++ b/compiler/testData/codegen/box/multiDecl/VarCapturedInLocalFunction.kt @@ -1,5 +1,3 @@ -// TODO: enable JS backend when issue KT-14535 is fixed -// IGNORE_BACKEND: JS class A { } diff --git a/compiler/testData/codegen/box/multiDecl/VarCapturedInObjectLiteral.kt b/compiler/testData/codegen/box/multiDecl/VarCapturedInObjectLiteral.kt index b5cddcdd279..48534b362c6 100644 --- a/compiler/testData/codegen/box/multiDecl/VarCapturedInObjectLiteral.kt +++ b/compiler/testData/codegen/box/multiDecl/VarCapturedInObjectLiteral.kt @@ -1,5 +1,3 @@ -// TODO: enable JS backend when issue KT-14535 is fixed -// IGNORE_BACKEND: JS class A { operator fun component1() = 1 operator fun component2() = 2 diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/MultiDeclarationTestsGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/MultiDeclarationTestsGenerated.java index c1fd88f8fdf..d20cd69665f 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/MultiDeclarationTestsGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/MultiDeclarationTestsGenerated.java @@ -31,24 +31,6 @@ import java.util.regex.Pattern; @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) public class MultiDeclarationTestsGenerated extends AbstractMultiDeclarationTests { - @TestMetadata("VarCapturedInFunctionLiteral.kt") - public void ignoredVarCapturedInFunctionLiteral() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/multiDecl/VarCapturedInFunctionLiteral.kt"); - doTest(fileName); - } - - @TestMetadata("VarCapturedInLocalFunction.kt") - public void ignoredVarCapturedInLocalFunction() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/multiDecl/VarCapturedInLocalFunction.kt"); - doTest(fileName); - } - - @TestMetadata("VarCapturedInObjectLiteral.kt") - public void ignoredVarCapturedInObjectLiteral() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/multiDecl/VarCapturedInObjectLiteral.kt"); - doTest(fileName); - } - public void testAllFilesPresentInMultiDecl() throws Exception { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/multiDecl"), Pattern.compile("^(.+)\\.kt$"), true); } @@ -119,6 +101,24 @@ public class MultiDeclarationTestsGenerated extends AbstractMultiDeclarationTest doTest(fileName); } + @TestMetadata("VarCapturedInFunctionLiteral.kt") + public void testVarCapturedInFunctionLiteral() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/multiDecl/VarCapturedInFunctionLiteral.kt"); + doTest(fileName); + } + + @TestMetadata("VarCapturedInLocalFunction.kt") + public void testVarCapturedInLocalFunction() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/multiDecl/VarCapturedInLocalFunction.kt"); + doTest(fileName); + } + + @TestMetadata("VarCapturedInObjectLiteral.kt") + public void testVarCapturedInObjectLiteral() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/multiDecl/VarCapturedInObjectLiteral.kt"); + doTest(fileName); + } + @TestMetadata("compiler/testData/codegen/box/multiDecl/forIterator") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/DestructuringDeclarationTranslator.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/DestructuringDeclarationTranslator.java index 8640dd192a1..96a44f98255 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/DestructuringDeclarationTranslator.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/DestructuringDeclarationTranslator.java @@ -28,6 +28,7 @@ import org.jetbrains.kotlin.js.translate.callTranslator.CallTranslator; import org.jetbrains.kotlin.js.translate.context.TranslationContext; import org.jetbrains.kotlin.js.translate.general.AbstractTranslator; import org.jetbrains.kotlin.js.translate.reference.CallExpressionTranslator; +import org.jetbrains.kotlin.js.translate.utils.JsAstUtils; import org.jetbrains.kotlin.psi.KtDestructuringDeclaration; import org.jetbrains.kotlin.psi.KtDestructuringDeclarationEntry; import org.jetbrains.kotlin.resolve.BindingContext; @@ -37,7 +38,9 @@ import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall; import java.util.ArrayList; import java.util.List; +import static org.jetbrains.kotlin.js.translate.context.Namer.getCapturedVarAccessor; import static org.jetbrains.kotlin.js.translate.utils.InlineUtils.setInlineCallMetadata; +import static org.jetbrains.kotlin.resolve.BindingContextUtils.isVarCapturedInClosure; public class DestructuringDeclarationTranslator extends AbstractTranslator { @@ -92,6 +95,11 @@ public class DestructuringDeclarationTranslator extends AbstractTranslator { } JsName name = context().getNameForDescriptor(descriptor); + if (isVarCapturedInClosure(context().bindingContext(), descriptor)) { + JsNameRef alias = getCapturedVarAccessor(name.makeRef()); + entryInitializer = JsAstUtils.wrapValue(alias, entryInitializer); + } + jsVars.add(new JsVars.JsVar(name, entryInitializer)); } return new JsVars(jsVars, true);