From 8dae399945854100ab78a3c1da6c8b5771f96855 Mon Sep 17 00:00:00 2001 From: Alexey Andreev Date: Wed, 10 May 2017 19:37:24 +0300 Subject: [PATCH] Fix generation of JS source maps for default parameters (Of open member functions) --- .../kotlin/js/test/JsLineNumberTestGenerated.java | 6 ++++++ .../declaration/AbstractDeclarationVisitor.kt | 9 +++++---- .../translate/declaration/DeclarationBodyVisitor.kt | 10 +++++----- .../translate/declaration/FileDeclarationVisitor.kt | 3 ++- .../lineNumbers/memberFunWithDefaultParam.kt | 13 +++++++++++++ 5 files changed, 31 insertions(+), 10 deletions(-) create mode 100644 js/js.translator/testData/lineNumbers/memberFunWithDefaultParam.kt diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/JsLineNumberTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/JsLineNumberTestGenerated.java index 911583098a0..52d52c73b12 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/JsLineNumberTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/JsLineNumberTestGenerated.java @@ -102,6 +102,12 @@ public class JsLineNumberTestGenerated extends AbstractJsLineNumberTest { doTest(fileName); } + @TestMetadata("memberFunWithDefaultParam.kt") + public void testMemberFunWithDefaultParam() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/lineNumbers/memberFunWithDefaultParam.kt"); + doTest(fileName); + } + @TestMetadata("multipleReferences.kt") public void testMultipleReferences() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/lineNumbers/multipleReferences.kt"); 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 eb25239ea80..22e4340cb92 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 @@ -76,8 +76,8 @@ abstract class AbstractDeclarationVisitor : TranslatorVisitor() { } if (TranslationUtils.shouldAccessViaFunctions(descriptor) || descriptor.isExtensionProperty) { - addFunction(descriptor.getter!!, getterExpr) - descriptor.setter?.let { addFunction(it, setterExpr!!) } + addFunction(descriptor.getter!!, getterExpr, expression.getter ?: expression) + descriptor.setter?.let { addFunction(it, setterExpr!!, expression.setter ?: expression) } } else { addProperty(descriptor, getterExpr, setterExpr) @@ -87,7 +87,7 @@ abstract class AbstractDeclarationVisitor : TranslatorVisitor() { override fun visitNamedFunction(expression: KtNamedFunction, context: TranslationContext) { val descriptor = BindingUtils.getFunctionDescriptor(context.bindingContext(), expression) val jsFunction = if (descriptor.modality != Modality.ABSTRACT) translateFunction(descriptor, expression, context) else null - addFunction(descriptor, jsFunction) + addFunction(descriptor, jsFunction, expression) } override fun visitTypeAlias(typeAlias: KtTypeAlias, data: TranslationContext?) {} @@ -115,7 +115,8 @@ abstract class AbstractDeclarationVisitor : TranslatorVisitor() { protected abstract fun addFunction( descriptor: FunctionDescriptor, - expression: JsExpression? + expression: JsExpression?, + psi: KtElement ) protected abstract fun addProperty( 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 ad3290a02dc..1d233446dbd 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 @@ -97,7 +97,7 @@ class DeclarationBodyVisitor( initializerStatements.add(statement) } - override fun addFunction(descriptor: FunctionDescriptor, expression: JsExpression?) { + override fun addFunction(descriptor: FunctionDescriptor, expression: JsExpression?, psi: KtElement) { if (!descriptor.hasOrInheritsParametersWithDefaultValue() || !descriptor.isOverridableOrOverrides) { if (expression != null) { context.addDeclarationStatement(context.addFunctionToPrototype(containingClass, descriptor, expression)) @@ -120,11 +120,11 @@ class DeclarationBodyVisitor( .innerBlock(caller.body) val callbackName = JsScope.declareTemporaryName("callback" + Namer.DEFAULT_PARAMETER_IMPLEMENTOR_SUFFIX) - val callee = JsNameRef(bodyName, JsThisRef()) + val callee = JsNameRef(bodyName, JsThisRef()).source(psi) - val defaultInvocation = JsInvocation(callee, listOf()) - val callbackInvocation = JsInvocation(callbackName.makeRef()) - val chosenInvocation = JsConditional(callbackName.makeRef(), callbackInvocation, defaultInvocation) + val defaultInvocation = JsInvocation(callee, listOf()).apply { source = psi } + val callbackInvocation = JsInvocation(callbackName.makeRef()).apply { source = psi } + val chosenInvocation = JsConditional(callbackName.makeRef(), callbackInvocation, defaultInvocation).source(psi) defaultInvocation.arguments += caller.parameters.map { it.name.makeRef() } callbackInvocation.arguments += defaultInvocation.arguments.map { it.deepCopy() } caller.parameters.add(JsParameter(callbackName)) diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/FileDeclarationVisitor.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/FileDeclarationVisitor.kt index 136bb9e9d28..7fcce1c11ea 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/FileDeclarationVisitor.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/FileDeclarationVisitor.kt @@ -24,6 +24,7 @@ import org.jetbrains.kotlin.js.translate.context.TranslationContext import org.jetbrains.kotlin.js.translate.utils.BindingUtils import org.jetbrains.kotlin.js.translate.utils.JsAstUtils import org.jetbrains.kotlin.js.translate.utils.JsDescriptorUtils +import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtProperty import org.jetbrains.kotlin.resolve.BindingContext @@ -44,7 +45,7 @@ class FileDeclarationVisitor(private val context: TranslationContext) : Abstract super.visitProperty(expression, context) } - override fun addFunction(descriptor: FunctionDescriptor, expression: JsExpression?) { + override fun addFunction(descriptor: FunctionDescriptor, expression: JsExpression?, psi: KtElement) { if (expression == null) return addFunctionButNotExport(descriptor, expression) context.export(descriptor) diff --git a/js/js.translator/testData/lineNumbers/memberFunWithDefaultParam.kt b/js/js.translator/testData/lineNumbers/memberFunWithDefaultParam.kt new file mode 100644 index 00000000000..2a4acac456c --- /dev/null +++ b/js/js.translator/testData/lineNumbers/memberFunWithDefaultParam.kt @@ -0,0 +1,13 @@ +open class A { + open fun foo(x: Int = 23): Int = x + + fun bar() = 42 +} + +class B : A() { + override fun foo(x: Int): Int { + return x * 2 + } +} + +// LINES: 2 * 2 2 2 * 4 * 7 9