From 88cf37951bcc652d465ff61d06c91cad840b1953 Mon Sep 17 00:00:00 2001 From: Alexey Andreev Date: Fri, 31 Mar 2017 15:35:51 +0300 Subject: [PATCH] JS: always create aliases for function parameters This is required to make translateAndAliasParameters behaviour a little more clear. Also, fix destructuring declaration translator to use parameter aliases from TranslationContext, when possible. --- .../declaration/AbstractDeclarationVisitor.kt | 2 +- .../translate/declaration/ClassTranslator.kt | 2 +- .../declaration/DeclarationBodyVisitor.kt | 2 +- .../declaration/PropertyTranslator.kt | 2 +- .../DestructuringDeclarationTranslator.java | 29 ++++++------------- .../expression/ExpressionVisitor.java | 4 ++- .../expression/FunctionTranslator.kt | 6 ++-- .../expression/LiteralFunctionTranslator.kt | 7 +++-- .../js/translate/expression/LoopTranslator.kt | 7 ++++- 9 files changed, 29 insertions(+), 32 deletions(-) diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/AbstractDeclarationVisitor.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/AbstractDeclarationVisitor.kt index b9c29a0fcc1..c48c5cb5d1f 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/AbstractDeclarationVisitor.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/AbstractDeclarationVisitor.kt @@ -98,7 +98,7 @@ abstract class AbstractDeclarationVisitor : TranslatorVisitor() { context: TranslationContext ): JsExpression { val function = context.getFunctionObject(descriptor) - val innerContext = context.newDeclaration(descriptor).translateAndAliasParameters(descriptor, function.parameters, false) + val innerContext = context.newDeclaration(descriptor).translateAndAliasParameters(descriptor, function.parameters) if (descriptor.isSuspend) { if (descriptor.requiresStateMachineTransformation(context)) { diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/ClassTranslator.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/ClassTranslator.kt index 62a13d6dcc1..66060d045dd 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/ClassTranslator.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/ClassTranslator.kt @@ -219,7 +219,7 @@ class ClassTranslator private constructor( context.addDeclarationStatement(constructorInitializer.makeStmt()) context = context.contextWithScope(constructorInitializer) - context.translateAndAliasParameters(constructorDescriptor, constructorInitializer.parameters, false) + context.translateAndAliasParameters(constructorDescriptor, constructorInitializer.parameters) .translateFunction(constructor, constructorInitializer) // Translate super/this call diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/DeclarationBodyVisitor.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/DeclarationBodyVisitor.kt index c5c25368e9a..368c5212848 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/DeclarationBodyVisitor.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/DeclarationBodyVisitor.kt @@ -115,7 +115,7 @@ class DeclarationBodyVisitor( val caller = JsFunction(context.getScopeForDescriptor(containingClass), JsBlock(), "") val callerContext = context .newDeclaration(descriptor) - .translateAndAliasParameters(descriptor, caller.parameters, true) + .translateAndAliasParameters(descriptor, caller.parameters) .innerBlock(caller.body) val callbackName = JsScope.declareTemporaryName("callback" + Namer.DEFAULT_PARAMETER_IMPLEMENTOR_SUFFIX) diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/PropertyTranslator.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/PropertyTranslator.kt index c0bdb1093b8..6b71860b1b4 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/PropertyTranslator.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/PropertyTranslator.kt @@ -240,7 +240,7 @@ private class PropertyTranslator( private fun translateCustomAccessor(expression: KtPropertyAccessor): JsPropertyInitializer { val descriptor = BindingUtils.getFunctionDescriptor(bindingContext(), expression) val function = JsFunction(context().getScopeForDescriptor(descriptor), JsBlock(), descriptor.toString()) - context().translateAndAliasParameters(descriptor, function.parameters, false).translateFunction(expression, function) + context().translateAndAliasParameters(descriptor, function.parameters).translateFunction(expression, function) return translateFunctionAsEcma5PropertyDescriptor(function, descriptor, context()) } 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 f9a759dc16a..0daec75b82a 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 @@ -16,15 +16,14 @@ package org.jetbrains.kotlin.js.translate.expression; +import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.builtins.KotlinBuiltIns; +import org.jetbrains.kotlin.descriptors.FunctionDescriptor; +import org.jetbrains.kotlin.descriptors.VariableDescriptor; import org.jetbrains.kotlin.js.backend.ast.JsExpression; import org.jetbrains.kotlin.js.backend.ast.JsName; import org.jetbrains.kotlin.js.backend.ast.JsNameRef; import org.jetbrains.kotlin.js.backend.ast.JsVars; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.jetbrains.kotlin.descriptors.FunctionDescriptor; -import org.jetbrains.kotlin.descriptors.VariableDescriptor; import org.jetbrains.kotlin.js.translate.callTranslator.CallTranslator; import org.jetbrains.kotlin.js.translate.context.TranslationContext; import org.jetbrains.kotlin.js.translate.general.AbstractTranslator; @@ -50,39 +49,29 @@ public class DestructuringDeclarationTranslator extends AbstractTranslator { @NotNull public static JsVars translate( @NotNull KtDestructuringDeclaration multiDeclaration, - @NotNull JsName multiObjectName, - @Nullable JsExpression initializer, + @NotNull JsExpression multiObjectExpr, @NotNull TranslationContext context ) { - return new DestructuringDeclarationTranslator(multiDeclaration, multiObjectName, initializer, context).translate(); + return new DestructuringDeclarationTranslator(multiDeclaration, multiObjectExpr, context).translate(); } @NotNull private final KtDestructuringDeclaration multiDeclaration; @NotNull - private final JsName multiObjectName; - @Nullable - private final JsExpression initializer; + private final JsExpression multiObjectExpr; private DestructuringDeclarationTranslator( @NotNull KtDestructuringDeclaration multiDeclaration, - @NotNull JsName multiObjectName, - @Nullable JsExpression initializer, + @NotNull JsExpression multiObjectExpr, @NotNull TranslationContext context ) { super(context); this.multiDeclaration = multiDeclaration; - this.multiObjectName = multiObjectName; - this.initializer = initializer; + this.multiObjectExpr = multiObjectExpr; } private JsVars translate() { - if (initializer != null) { - context().getCurrentBlock().getStatements().add(JsAstUtils.newVar(multiObjectName, initializer)); - } - List jsVars = new ArrayList<>(); - JsNameRef multiObjNameRef = multiObjectName.makeRef(); for (KtDestructuringDeclarationEntry entry : multiDeclaration.getEntries()) { VariableDescriptor descriptor = BindingContextUtils.getNotNull(context().bindingContext(), BindingContext.VARIABLE, entry); // Do not call `componentX` for destructuring entry called _ @@ -90,7 +79,7 @@ public class DestructuringDeclarationTranslator extends AbstractTranslator { ResolvedCall entryInitCall = context().bindingContext().get(BindingContext.COMPONENT_RESOLVED_CALL, entry); assert entryInitCall != null : "Entry init call must be not null"; - JsExpression entryInitializer = CallTranslator.translate(context(), entryInitCall, multiObjNameRef); + JsExpression entryInitializer = CallTranslator.translate(context(), entryInitCall, multiObjectExpr); FunctionDescriptor candidateDescriptor = entryInitCall.getCandidateDescriptor(); if (CallExpressionTranslator.shouldBeInlined(candidateDescriptor, context())) { setInlineCallMetadata(entryInitializer, entry, entryInitCall, context()); diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/ExpressionVisitor.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/ExpressionVisitor.java index 68f71597a6b..ae710bdcd54 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/ExpressionVisitor.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/ExpressionVisitor.java @@ -113,7 +113,9 @@ public final class ExpressionVisitor extends TranslatorVisitor { KtExpression jetInitializer = multiDeclaration.getInitializer(); assert jetInitializer != null : "Initializer for multi declaration must be not null"; JsExpression initializer = Translation.translateAsExpression(jetInitializer, context); - return DestructuringDeclarationTranslator.translate(multiDeclaration, JsScope.declareTemporary(), initializer, context); + JsName parameterName = JsScope.declareTemporary(); + context.addStatementToCurrentBlock(JsAstUtils.newVar(parameterName, initializer)); + return DestructuringDeclarationTranslator.translate(multiDeclaration, JsAstUtils.pureFqn(parameterName, null), context); } @Override diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/FunctionTranslator.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/FunctionTranslator.kt index 0c96e3edd98..e28604de13c 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/FunctionTranslator.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/FunctionTranslator.kt @@ -23,6 +23,7 @@ import org.jetbrains.kotlin.js.backend.ast.JsExpression import org.jetbrains.kotlin.js.backend.ast.JsFunction import org.jetbrains.kotlin.js.backend.ast.JsParameter import org.jetbrains.kotlin.js.backend.ast.JsScope +import org.jetbrains.kotlin.js.backend.ast.metadata.descriptor import org.jetbrains.kotlin.js.backend.ast.metadata.functionDescriptor import org.jetbrains.kotlin.js.backend.ast.metadata.hasDefaultValue import org.jetbrains.kotlin.js.translate.context.Namer @@ -39,8 +40,7 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.isEffectivelyPublicApi fun TranslationContext.translateAndAliasParameters( descriptor: FunctionDescriptor, - targetList: MutableList, - aliasValueParams: Boolean + targetList: MutableList ): TranslationContext { val aliases = mutableMapOf() @@ -64,7 +64,7 @@ fun TranslationContext.translateAndAliasParameters( for (valueParameter in descriptor.valueParameters) { val name = getNameForDescriptor(valueParameter) - val tmpName = if (aliasValueParams) JsScope.declareTemporaryName(name.ident) else name + val tmpName = JsScope.declareTemporaryName(name.ident).also { it.descriptor = valueParameter } aliases[valueParameter] = JsAstUtils.pureFqn(tmpName, null) targetList += JsParameter(tmpName).apply { hasDefaultValue = valueParameter.hasDefaultValue() } } diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/LiteralFunctionTranslator.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/LiteralFunctionTranslator.kt index 438faeff30c..24f8ee9ae66 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/LiteralFunctionTranslator.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/LiteralFunctionTranslator.kt @@ -27,6 +27,7 @@ import org.jetbrains.kotlin.js.translate.context.TranslationContext import org.jetbrains.kotlin.js.translate.context.getNameForCapturedDescriptor import org.jetbrains.kotlin.js.translate.context.hasCapturedExceptContaining import org.jetbrains.kotlin.js.translate.general.AbstractTranslator +import org.jetbrains.kotlin.js.translate.reference.ReferenceTranslator import org.jetbrains.kotlin.js.translate.utils.BindingUtils.getFunctionDescriptor import org.jetbrains.kotlin.js.translate.utils.FunctionBodyTranslator.setDefaultValueForArguments import org.jetbrains.kotlin.js.translate.utils.FunctionBodyTranslator.translateFunctionBody @@ -47,7 +48,7 @@ class LiteralFunctionTranslator(context: TranslationContext) : AbstractTranslato val functionContext = invokingContext .newFunctionBodyWithUsageTracker(lambda, descriptor) - .translateAndAliasParameters(descriptor, lambda.parameters, false) + .translateAndAliasParameters(descriptor, lambda.parameters) descriptor.valueParameters.forEach { if (it is ValueParameterDescriptorImpl.WithDestructuringDeclaration) { @@ -100,8 +101,8 @@ class LiteralFunctionTranslator(context: TranslationContext) : AbstractTranslato (DescriptorToSourceUtils.descriptorToDeclaration(this) as? KtParameter)?.destructuringDeclaration ?: error("Destructuring declaration for descriptor $this not found") - val jsParameter = JsParameter(context.getNameForDescriptor(this)) - return DestructuringDeclarationTranslator.translate(destructuringDeclaration, jsParameter.name, null, context) + val parameterRef = ReferenceTranslator.translateAsValueReference(this, context) + return DestructuringDeclarationTranslator.translate(destructuringDeclaration, parameterRef, context) } } diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/LoopTranslator.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/LoopTranslator.kt index b043bff22e3..88e96554bec 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/LoopTranslator.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/LoopTranslator.kt @@ -26,6 +26,7 @@ import org.jetbrains.kotlin.js.translate.context.TranslationContext import org.jetbrains.kotlin.js.translate.general.Translation import org.jetbrains.kotlin.js.translate.intrinsic.functions.factories.ArrayFIF import org.jetbrains.kotlin.js.translate.utils.BindingUtils.* +import org.jetbrains.kotlin.js.translate.utils.JsAstUtils import org.jetbrains.kotlin.js.translate.utils.JsAstUtils.* import org.jetbrains.kotlin.js.translate.utils.PsiUtils.getLoopRange import org.jetbrains.kotlin.js.translate.utils.TranslationUtils @@ -116,8 +117,12 @@ fun translateForExpression(expression: KtForExpression, context: TranslationCont newVar(parameterName, itemValue) } else { + val innerBlockContext = context.innerBlock(block) + if (itemValue != null) { + innerBlockContext.addStatementToCurrentBlock(JsAstUtils.newVar(parameterName, itemValue)) + } DestructuringDeclarationTranslator.translate( - destructuringParameter, parameterName, itemValue, context.innerBlock(block)) + destructuringParameter, JsAstUtils.pureFqn(parameterName, null), innerBlockContext) } block.statements += currentVarInit block.statements += if (realBody is JsBlock) realBody.statements else listOfNotNull(realBody)