From 7d3e3c0299a7e04bc719411c6e9d5fb77ee715d1 Mon Sep 17 00:00:00 2001 From: Alexey Andreev Date: Fri, 10 Feb 2017 15:21:17 +0300 Subject: [PATCH] JS: de-duplicate temporary names in some cases to allow name resolution to make its work better --- .../translate/declaration/AbstractDeclarationVisitor.kt | 2 +- .../kotlin/js/translate/declaration/ClassTranslator.kt | 2 +- .../js/translate/declaration/DeclarationBodyVisitor.kt | 2 +- .../js/translate/declaration/JsDataClassGenerator.java | 2 +- .../kotlin/js/translate/declaration/PropertyTranslator.kt | 2 +- .../kotlin/js/translate/expression/FunctionTranslator.kt | 8 ++++++-- .../js/translate/expression/LiteralFunctionTranslator.kt | 2 +- .../kotlin/js/translate/utils/FunctionBodyTranslator.java | 3 ++- 8 files changed, 14 insertions(+), 9 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 fb3a691cfd1..4aff5c097c4 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) + val innerContext = context.newDeclaration(descriptor).translateAndAliasParameters(descriptor, function.parameters, false) 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 0a085426752..6936436d78e 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 @@ -214,7 +214,7 @@ class ClassTranslator private constructor( context.addDeclarationStatement(constructorInitializer.makeStmt()) context = context.contextWithScope(constructorInitializer) - context.translateAndAliasParameters(constructorDescriptor, constructorInitializer.parameters) + context.translateAndAliasParameters(constructorDescriptor, constructorInitializer.parameters, false) .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 8682f49eaed..2648d434b7b 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) + .translateAndAliasParameters(descriptor, caller.parameters, true) .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/JsDataClassGenerator.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/JsDataClassGenerator.java index c5357bc4a83..4c131ab9bc2 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/JsDataClassGenerator.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/JsDataClassGenerator.java @@ -72,7 +72,7 @@ class JsDataClassGenerator extends DataClassMethodGenerator { context.bindingContext(), BindingContext.VALUE_PARAMETER_AS_PROPERTY, parameterDescriptor); JsName fieldName = context.getNameForDescriptor(propertyDescriptor); - JsName paramName = context.getNameForDescriptor(parameterDescriptor); + JsName paramName = JsScope.declareTemporaryName(context.getNameForDescriptor(parameterDescriptor).getIdent()); functionObj.getParameters().add(new JsParameter(paramName)); 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 6b71860b1b4..c0bdb1093b8 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).translateFunction(expression, function) + context().translateAndAliasParameters(descriptor, function.parameters, false).translateFunction(expression, function) return translateFunctionAsEcma5PropertyDescriptor(function, descriptor, context()) } 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 d80b23c9291..0c96e3edd98 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 @@ -39,7 +39,8 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.isEffectivelyPublicApi fun TranslationContext.translateAndAliasParameters( descriptor: FunctionDescriptor, - targetList: MutableList + targetList: MutableList, + aliasValueParams: Boolean ): TranslationContext { val aliases = mutableMapOf() @@ -62,7 +63,10 @@ fun TranslationContext.translateAndAliasParameters( } for (valueParameter in descriptor.valueParameters) { - targetList += JsParameter(getNameForDescriptor(valueParameter)).apply { hasDefaultValue = valueParameter.hasDefaultValue() } + val name = getNameForDescriptor(valueParameter) + val tmpName = if (aliasValueParams) JsScope.declareTemporaryName(name.ident) else name + aliases[valueParameter] = JsAstUtils.pureFqn(tmpName, null) + targetList += JsParameter(tmpName).apply { hasDefaultValue = valueParameter.hasDefaultValue() } } val continuationDescriptor = continuationParameterDescriptor 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 573b9987249..438faeff30c 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 @@ -47,7 +47,7 @@ class LiteralFunctionTranslator(context: TranslationContext) : AbstractTranslato val functionContext = invokingContext .newFunctionBodyWithUsageTracker(lambda, descriptor) - .translateAndAliasParameters(descriptor, lambda.parameters) + .translateAndAliasParameters(descriptor, lambda.parameters, false) descriptor.valueParameters.forEach { if (it is ValueParameterDescriptorImpl.WithDestructuringDeclaration) { diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/FunctionBodyTranslator.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/FunctionBodyTranslator.java index 523efb2a17d..92da07466bc 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/FunctionBodyTranslator.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/FunctionBodyTranslator.java @@ -29,6 +29,7 @@ import org.jetbrains.kotlin.js.translate.context.TranslationContext; import org.jetbrains.kotlin.js.translate.expression.LocalFunctionCollector; import org.jetbrains.kotlin.js.translate.general.AbstractTranslator; import org.jetbrains.kotlin.js.translate.general.Translation; +import org.jetbrains.kotlin.js.translate.reference.ReferenceTranslator; import org.jetbrains.kotlin.psi.KtDeclarationWithBody; import org.jetbrains.kotlin.psi.KtExpression; import org.jetbrains.kotlin.types.KotlinType; @@ -78,7 +79,7 @@ public final class FunctionBodyTranslator extends AbstractTranslator { for (ValueParameterDescriptor valueParameter : valueParameters) { if (!valueParameter.declaresDefaultValue()) continue; - JsNameRef jsNameRef = functionBodyContext.getNameForDescriptor(valueParameter).makeRef(); + JsExpression jsNameRef = ReferenceTranslator.translateAsValueReference(valueParameter, functionBodyContext); KtExpression defaultArgument = getDefaultArgument(valueParameter); JsBlock defaultArgBlock = new JsBlock(); JsExpression defaultValue = Translation.translateAsExpression(defaultArgument, functionBodyContext, defaultArgBlock);