From 01fea13467f99c1772aede8d3a0ab9faf7548412 Mon Sep 17 00:00:00 2001 From: Roman Artemev Date: Thu, 19 Apr 2018 15:38:21 +0300 Subject: [PATCH] Fix name clashing between local variables --- .../ir/backend/js/transformers/irToJs/jsAstUtils.kt | 8 ++++---- .../kotlin/ir/backend/js/utils/SimpleNameGenerator.kt | 4 +++- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/jsAstUtils.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/jsAstUtils.kt index 05551e9d7db..2ba9c61bce6 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/jsAstUtils.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/jsAstUtils.kt @@ -37,18 +37,18 @@ fun prototypeOf(classNameRef: JsExpression) = JsNameRef(Namer.PROTOTYPE_NAME, cl fun translateFunction(declaration: IrFunction, name: JsName?, context: JsGenerationContext): JsFunction { val functionScope = JsFunctionScope(context.currentScope, "scope for ${name ?: "annon"}") val functionContext = context.newDeclaration(functionScope, declaration) + val functionParams = declaration.valueParameters.map { functionContext.getNameForSymbol(it.symbol) } val body = declaration.body?.accept(IrElementToJsStatementTransformer(), functionContext) as? JsBlock ?: JsBlock() val function = JsFunction(functionScope, body, "member function ${name ?: "annon"}") function.name = name - fun JsFunction.addParameter(parameterName: String) { - val parameter = function.scope.declareName(parameterName) + fun JsFunction.addParameter(parameter: JsName) { parameters.add(JsParameter(parameter)) } - declaration.extensionReceiverParameter?.let { function.addParameter(context.getNameForSymbol(it.symbol).ident) } - declaration.valueParameters.forEach { function.addParameter(context.getNameForSymbol(it.symbol).ident) } + declaration.extensionReceiverParameter?.let { function.addParameter(functionContext.getNameForSymbol(it.symbol)) } + functionParams.forEach { function.addParameter(it) } return function } diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/SimpleNameGenerator.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/SimpleNameGenerator.kt index 0f2000a528b..0592b7534bb 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/SimpleNameGenerator.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/SimpleNameGenerator.kt @@ -23,6 +23,7 @@ class SimpleNameGenerator : NameGenerator { private fun getNameForDescriptor(descriptor: DeclarationDescriptor, context: JsGenerationContext): JsName = nameCache.getOrPut(descriptor) { + var nameDeclarator: (String) -> JsName = context.currentScope::declareName val nameBuilder = StringBuilder() when (descriptor) { is ReceiverParameterDescriptor -> { @@ -71,6 +72,7 @@ class SimpleNameGenerator : NameGenerator { } is LocalVariableDescriptor -> { nameBuilder.append(descriptor.name.identifier) + nameDeclarator = context.currentScope::declareFreshName } is CallableDescriptor -> { nameBuilder.append(descriptor.name.asString()) @@ -79,7 +81,7 @@ class SimpleNameGenerator : NameGenerator { } } - context.currentScope.declareName(sanitizeName(nameBuilder.toString())) + nameDeclarator(sanitizeName(nameBuilder.toString())) } private fun sanitizeName(name: String): String {