Fix generation of JS source maps for default parameters

(Of open member functions)
This commit is contained in:
Alexey Andreev
2017-05-10 19:37:24 +03:00
parent e1009622af
commit 8dae399945
5 changed files with 31 additions and 10 deletions
@@ -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");
@@ -76,8 +76,8 @@ abstract class AbstractDeclarationVisitor : TranslatorVisitor<Unit>() {
}
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<Unit>() {
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<Unit>() {
protected abstract fun addFunction(
descriptor: FunctionDescriptor,
expression: JsExpression?
expression: JsExpression?,
psi: KtElement
)
protected abstract fun addProperty(
@@ -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<JsExpression>())
val callbackInvocation = JsInvocation(callbackName.makeRef())
val chosenInvocation = JsConditional(callbackName.makeRef(), callbackInvocation, defaultInvocation)
val defaultInvocation = JsInvocation(callee, listOf<JsExpression>()).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))
@@ -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)
@@ -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