From 1e74325c52314068710aba7a451f95384feff4aa Mon Sep 17 00:00:00 2001 From: Alexey Andreev Date: Thu, 22 Jun 2017 18:39:59 +0300 Subject: [PATCH] Generated source map for JS function's closing curly bracket --- .../backend/JsToStringGenerationVisitor.java | 20 +++++++++++-------- .../coroutine/CoroutineFunctionTransformer.kt | 3 +++ .../com/google/gwt/dev/js/rhino/Parser.java | 4 +++- .../sourcemaps/SourceMapLocationRemapper.kt | 6 ++++++ .../kotlin/js/test/utils/LineCollector.kt | 10 ++-------- .../translate/context/DeclarationExporter.kt | 2 ++ .../js/translate/context/StaticContext.java | 3 +++ .../declaration/AbstractDeclarationVisitor.kt | 3 +++ .../translate/declaration/ClassTranslator.kt | 2 ++ .../declaration/DeclarationBodyVisitor.kt | 2 ++ .../declaration/DelegationTranslator.kt | 2 ++ .../declaration/JsDataClassGenerator.java | 1 + .../declaration/PropertyTranslator.kt | 9 +++++++-- .../expression/LiteralFunctionTranslator.kt | 4 ++++ .../reference/CallableReferenceTranslator.kt | 8 ++++++-- .../kotlin/js/translate/utils/utils.kt | 13 ++++++++++++ .../lineNumbers/andAndWithSideEffect.kt | 2 +- .../testData/lineNumbers/backingField.kt | 2 +- .../testData/lineNumbers/catch.kt | 2 +- .../testData/lineNumbers/chainedCall.kt | 2 +- .../lineNumbers/classCapturingLocals.kt | 2 +- .../testData/lineNumbers/closure.kt | 2 +- .../complexExpressionAsDefaultArgument.kt | 2 +- .../lineNumbers/conditionalDecomposed.kt | 2 +- .../testData/lineNumbers/coroutine.kt | 2 +- .../testData/lineNumbers/dataClass.kt | 2 +- .../testData/lineNumbers/delegateMemberVal.kt | 2 +- .../testData/lineNumbers/delegatedProperty.kt | 2 +- .../testData/lineNumbers/delegation.kt | 2 +- .../doWhileWithComplexCondition.kt | 2 +- .../lineNumbers/enumCompanionObject.kt | 2 +- .../testData/lineNumbers/enumObject.kt | 2 +- .../lineNumbers/expressionAsFunctionBody.kt | 2 +- js/js.translator/testData/lineNumbers/for.kt | 2 +- .../testData/lineNumbers/increment.kt | 2 +- .../lineNumbers/inlineLocalVarsRef.kt | 2 +- .../lineNumbers/inlineMultiModule/simple.kt | 4 ++-- .../testData/lineNumbers/inlineReturn.kt | 2 +- .../testData/lineNumbers/inlining.kt | 2 +- .../lineNumbers/inliningWithLambda.kt | 2 +- .../testData/lineNumbers/innerClass.kt | 2 +- .../testData/lineNumbers/lambdaWithClosure.kt | 2 +- .../testData/lineNumbers/literals.kt | 2 +- .../testData/lineNumbers/longLiteral.kt | 2 +- .../lineNumbers/memberFunWithDefaultParam.kt | 2 +- .../lineNumbers/multipleReferences.kt | 2 +- .../lineNumbers/objectInstanceFunction.kt | 2 +- .../testData/lineNumbers/optionalArgs.kt | 2 +- .../lineNumbers/propertyWithoutInitializer.kt | 2 +- .../testData/lineNumbers/simple.kt | 2 +- .../testData/lineNumbers/stringLiteral.kt | 2 +- .../syntheticCodeInConstructors.kt | 2 +- .../lineNumbers/syntheticCodeInEnums.kt | 2 +- .../testData/lineNumbers/valParameter.kt | 2 +- .../testData/lineNumbers/whenIn.kt | 2 +- .../testData/lineNumbers/whenIs.kt | 2 +- .../lineNumbers/whileWithComplexCondition.kt | 2 +- 57 files changed, 113 insertions(+), 63 deletions(-) diff --git a/js/js.ast/src/org/jetbrains/kotlin/js/backend/JsToStringGenerationVisitor.java b/js/js.ast/src/org/jetbrains/kotlin/js/backend/JsToStringGenerationVisitor.java index ac04c45c90d..ea257a966b9 100644 --- a/js/js.ast/src/org/jetbrains/kotlin/js/backend/JsToStringGenerationVisitor.java +++ b/js/js.ast/src/org/jetbrains/kotlin/js/backend/JsToStringGenerationVisitor.java @@ -275,7 +275,7 @@ public class JsToStringGenerationVisitor extends JsVisitor { @Override public void visitBlock(@NotNull JsBlock x) { - printJsBlock(x, true); + printJsBlock(x, true, null); } @Override @@ -496,7 +496,7 @@ public class JsToStringGenerationVisitor extends JsVisitor { @Override public void visitExpressionStatement(@NotNull JsExpressionStatement x) { Object source = x.getSource(); - if (source == null) { + if (source == null && !(x.getExpression() instanceof JsFunction)) { source = x.getExpression().getSource(); } pushSourceInfo(source); @@ -605,8 +605,6 @@ public class JsToStringGenerationVisitor extends JsVisitor { @Override public void visitFunction(@NotNull JsFunction x) { - pushSourceInfo(x.getSource()); - p.print(CHARS_FUNCTION); space(); if (x.getName() != null) { @@ -626,12 +624,10 @@ public class JsToStringGenerationVisitor extends JsVisitor { lineBreakAfterBlock = false; sourceLocationConsumer.pushSourceInfo(null); - accept(x.getBody()); + printJsBlock(x.getBody(), true, x.getSource()); sourceLocationConsumer.popSourceInfo(); needSemi = true; - - popSourceInfo(); } @Override @@ -1111,7 +1107,7 @@ public class JsToStringGenerationVisitor extends JsVisitor { } } - private void printJsBlock(JsBlock x, boolean finalNewline) { + private void printJsBlock(JsBlock x, boolean finalNewline, Object closingBracketLocation) { if (!lineBreakAfterBlock) { finalNewline = false; lineBreakAfterBlock = true; @@ -1184,7 +1180,15 @@ public class JsToStringGenerationVisitor extends JsVisitor { if (needBraces) { // _blockClose() modified p.indentOut(); + + if (closingBracketLocation != null) { + pushSourceInfo(closingBracketLocation); + } p.print('}'); + if (closingBracketLocation != null) { + popSourceInfo(); + } + if (finalNewline) { newlineOpt(); } diff --git a/js/js.inliner/src/org/jetbrains/kotlin/js/coroutine/CoroutineFunctionTransformer.kt b/js/js.inliner/src/org/jetbrains/kotlin/js/coroutine/CoroutineFunctionTransformer.kt index 9ebca0083bd..0ce69007a02 100644 --- a/js/js.inliner/src/org/jetbrains/kotlin/js/coroutine/CoroutineFunctionTransformer.kt +++ b/js/js.inliner/src/org/jetbrains/kotlin/js/coroutine/CoroutineFunctionTransformer.kt @@ -24,6 +24,7 @@ import org.jetbrains.kotlin.js.inline.util.collectLocalVariables import org.jetbrains.kotlin.js.inline.util.getInnerFunction import org.jetbrains.kotlin.js.translate.context.Namer import org.jetbrains.kotlin.js.translate.utils.JsAstUtils +import org.jetbrains.kotlin.js.translate.utils.finalElement class CoroutineFunctionTransformer(private val function: JsFunction, name: String?) { private val innerFunction = function.getInnerFunction() @@ -61,6 +62,7 @@ class CoroutineFunctionTransformer(private val function: JsFunction, name: Strin val psiElement = context.metadata.psiElement val constructor = JsFunction(function.scope.parent, JsBlock(), "Continuation") + constructor.source = psiElement?.finalElement constructor.name = className if (context.metadata.hasReceiver) { constructor.parameters += JsParameter(context.receiverFieldName) @@ -130,6 +132,7 @@ class CoroutineFunctionTransformer(private val function: JsFunction, name: Strin statements: MutableList ) { val resumeFunction = JsFunction(function.scope.parent, JsBlock(), "resume function") + resumeFunction.source = context.metadata.psiElement?.finalElement val coroutineBody = generateCoroutineBody(context, coroutineBlocks) functionWithBody.body.statements.clear() diff --git a/js/js.parser/src/com/google/gwt/dev/js/rhino/Parser.java b/js/js.parser/src/com/google/gwt/dev/js/rhino/Parser.java index 5c3af8ddd85..d338239415a 100644 --- a/js/js.parser/src/com/google/gwt/dev/js/rhino/Parser.java +++ b/js/js.parser/src/com/google/gwt/dev/js/rhino/Parser.java @@ -208,6 +208,7 @@ public class Parser extends Observable { int savedFunctionNumber = functionNumber; Node args; Node body; + CodePosition closingBracketPosition; try { functionNumber = 0; args = nf.createLeaf(TokenStream.LP, ts.tokenPosition); @@ -226,6 +227,7 @@ public class Parser extends Observable { mustMatchToken(ts, TokenStream.LC, "msg.no.brace.body"); body = parseFunctionBody(ts); + closingBracketPosition = ts.tokenPosition; mustMatchToken(ts, TokenStream.RC, "msg.no.brace.after.body"); // skip the last EOL so nested functions work... } @@ -234,7 +236,7 @@ public class Parser extends Observable { functionNumber = savedFunctionNumber; } - Node pn = nf.createFunction(nameNode, args, body, basePosition); + Node pn = nf.createFunction(nameNode, args, body, closingBracketPosition); if (memberExprNode != null) { pn = nf.createBinary(TokenStream.ASSIGN, TokenStream.NOP, memberExprNode, pn, basePosition); } diff --git a/js/js.parser/src/org/jetbrains/kotlin/js/parser/sourcemaps/SourceMapLocationRemapper.kt b/js/js.parser/src/org/jetbrains/kotlin/js/parser/sourcemaps/SourceMapLocationRemapper.kt index 7d7fa1f426b..047b4cee5bc 100644 --- a/js/js.parser/src/org/jetbrains/kotlin/js/parser/sourcemaps/SourceMapLocationRemapper.kt +++ b/js/js.parser/src/org/jetbrains/kotlin/js/parser/sourcemaps/SourceMapLocationRemapper.kt @@ -100,6 +100,12 @@ class SourceMapLocationRemapper(private val sourceMap: SourceMap) { override fun visitInvocation(invocation: JsInvocation) = handleNode(invocation, invocation.qualifier, *invocation.arguments.toTypedArray()) + override fun visitFunction(x: JsFunction) { + x.parameters.forEach { accept(it) } + x.body.statements.forEach { accept(it) } + nodeList += x + } + override fun visitElement(node: JsNode) { nodeList += node node.acceptChildren(this) diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/utils/LineCollector.kt b/js/js.tests/test/org/jetbrains/kotlin/js/test/utils/LineCollector.kt index 590f662d033..8f44469a45e 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/utils/LineCollector.kt +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/utils/LineCollector.kt @@ -57,14 +57,8 @@ class LineCollector : RecursiveJsVisitor() { } override fun visitExpressionStatement(x: JsExpressionStatement) { - val expression = x.expression - if (expression is JsFunction) { - expression.accept(this) - } - else { - withStatement(x) { - super.visitExpressionStatement(x) - } + withStatement(x) { + super.visitExpressionStatement(x) } } diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/DeclarationExporter.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/DeclarationExporter.kt index 5ccec026ff7..8e53e8ab9d6 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/DeclarationExporter.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/DeclarationExporter.kt @@ -28,6 +28,7 @@ import org.jetbrains.kotlin.js.translate.utils.AnnotationsUtils.isNativeObject import org.jetbrains.kotlin.js.translate.utils.JsAstUtils.assignment import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.resolve.DescriptorUtils +import org.jetbrains.kotlin.resolve.source.getPsi internal class DeclarationExporter(val context: StaticContext) { private val objectLikeKinds = setOf(ClassKind.OBJECT, ClassKind.ENUM_ENTRY) @@ -113,6 +114,7 @@ internal class DeclarationExporter(val context: StaticContext) { val setterBody: JsExpression = if (simpleProperty) { val statements = mutableListOf() val function = JsFunction(context.fragment.scope, JsBlock(statements), "$declaration setter") + function.source = declaration.source.getPsi() val valueName = JsScope.declareTemporaryName("value") function.parameters += JsParameter(valueName) statements += assignment(context.getInnerNameForDescriptor(declaration).makeRef(), valueName.makeRef()).makeStmt() diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/StaticContext.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/StaticContext.java index 75105bc57f5..1e15a0a6414 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/StaticContext.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/StaticContext.java @@ -48,6 +48,8 @@ import org.jetbrains.kotlin.resolve.BindingTrace; import org.jetbrains.kotlin.resolve.DescriptorUtils; import org.jetbrains.kotlin.resolve.calls.tasks.DynamicCallsKt; import org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilsKt; +import org.jetbrains.kotlin.resolve.source.KotlinSourceElement; +import org.jetbrains.kotlin.resolve.source.KotlinSourceElementKt; import org.jetbrains.kotlin.serialization.js.ModuleKind; import org.jetbrains.kotlin.types.KotlinType; import org.jetbrains.kotlin.types.typeUtil.TypeUtilsKt; @@ -667,6 +669,7 @@ public final class StaticContext { JsFunction correspondingFunction = JsAstUtils.createFunctionWithEmptyBody(fragment.getScope()); assert (!scopeToFunction.containsKey(correspondingFunction.getScope())) : "Scope to function value overridden for " + descriptor; scopeToFunction.put(correspondingFunction.getScope(), correspondingFunction); + correspondingFunction.setSource(KotlinSourceElementKt.getPsi(((CallableDescriptor) descriptor).getSource())); return correspondingFunction.getScope(); }; Rule scopeForPackage = descriptor -> { 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 22e4340cb92..d24f7491166 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 @@ -56,6 +56,7 @@ abstract class AbstractDeclarationVisitor : TranslatorVisitor() { } else { val function = context.getFunctionObject(getter) + function.source = expression defaultTranslator.generateDefaultGetterFunction(getter, function) function } @@ -67,6 +68,7 @@ abstract class AbstractDeclarationVisitor : TranslatorVisitor() { } else { val function = context.getFunctionObject(setter) + function.source = expression defaultTranslator.generateDefaultSetterFunction(setter, function) function } @@ -98,6 +100,7 @@ abstract class AbstractDeclarationVisitor : TranslatorVisitor() { context: TranslationContext ): JsExpression { val function = context.getFunctionObject(descriptor) + function.source = expression.finalElement val innerContext = context.newDeclaration(descriptor).translateAndAliasParameters(descriptor, function.parameters) if (descriptor.isSuspend) { 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 f07587a0cd0..a7352b1b09f 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 @@ -158,6 +158,7 @@ class ClassTranslator private constructor( private fun createEnumInitFunction(): JsFunction { val function = context().createRootScopedFunction(descriptor) function.name = JsScope.declareTemporaryName(StaticContext.getSuggestedName(descriptor) + "_initFields") + function.source = classDeclaration val emptyFunction = context().createRootScopedFunction(descriptor) function.body.statements += JsAstUtils.assignment(JsAstUtils.pureFqn(function.name, null), emptyFunction) .source(classDeclaration).makeStmt() @@ -455,6 +456,7 @@ class ClassTranslator private constructor( val instanceFun = context().createRootScopedFunction("Instance function: " + descriptor) instanceFun.name = context().getNameForObjectInstance(descriptor) + instanceFun.source = classDeclaration if (enumInitializerName != null) { instanceFun.body.statements += JsInvocation(pureFqn(enumInitializerName, null)).source(classDeclaration).makeStmt() 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 1d233446dbd..ffb939f06a9 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 @@ -75,6 +75,7 @@ class DeclarationBodyVisitor( enumInitializer.body.statements += JsAstUtils.assignment(pureFqn(enumInstanceName, null), jsEnumEntryCreation).makeStmt() val enumInstanceFunction = context.createRootScopedFunction(descriptor) + enumInstanceFunction.source = enumEntry enumInstanceFunction.name = context.getNameForObjectInstance(descriptor) context.addDeclarationStatement(enumInstanceFunction.makeStmt()) @@ -114,6 +115,7 @@ class DeclarationBodyVisitor( if (descriptor.hasOwnParametersWithDefaultValue()) { val caller = JsFunction(context.getScopeForDescriptor(containingClass), JsBlock(), "") + caller.source = psi.finalElement val callerContext = context .newDeclaration(descriptor) .translateAndAliasParameters(descriptor, caller.parameters) diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/DelegationTranslator.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/DelegationTranslator.kt index 14b27859ec5..ac0ce2d19bd 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/DelegationTranslator.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/DelegationTranslator.kt @@ -131,6 +131,7 @@ class DelegationTranslator( returnExpression.source(specifier) val jsFunction = simpleReturnFunction(context().getScopeForDescriptor(getterDescriptor.containingDeclaration), returnExpression) + jsFunction.source = specifier if (DescriptorUtils.isExtension(descriptor)) { val receiverName = jsFunction.scope.declareName(Namer.getReceiverParameterName()) jsFunction.parameters.add(JsParameter(receiverName)) @@ -141,6 +142,7 @@ class DelegationTranslator( fun generateDelegateSetterFunction(setterDescriptor: PropertySetterDescriptor): JsFunction { val jsFunction = JsFunction(context().program().rootScope, "setter for " + setterDescriptor.name.asString()) + jsFunction.source = specifier assert(setterDescriptor.valueParameters.size == 1) { "Setter must have 1 parameter" } val defaultParameter = JsParameter(JsScope.declareTemporary()) 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 27c2b8e0530..66d519379a7 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 @@ -208,6 +208,7 @@ class JsDataClassGenerator extends DataClassMethodGenerator { private JsFunction generateJsMethod(@NotNull FunctionDescriptor functionDescriptor) { JsFunction functionObject = context.createRootScopedFunction(functionDescriptor); + functionObject.setSource(getDeclaration()); ClassDescriptor containingClass = (ClassDescriptor) functionDescriptor.getContainingDeclaration(); context.addDeclarationStatement(UtilsKt.addFunctionToPrototype(context, containingClass, functionDescriptor, functionObject)); return functionObject; 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 f01aa4761cc..546d2c5de7b 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 @@ -33,6 +33,7 @@ import org.jetbrains.kotlin.js.translate.utils.BindingUtils import org.jetbrains.kotlin.js.translate.utils.JsAstUtils.pureFqn import org.jetbrains.kotlin.js.translate.utils.JsDescriptorUtils import org.jetbrains.kotlin.js.translate.utils.TranslationUtils.* +import org.jetbrains.kotlin.js.translate.utils.finalElement import org.jetbrains.kotlin.js.translate.utils.jsAstUtils.addParameter import org.jetbrains.kotlin.js.translate.utils.jsAstUtils.addStatement import org.jetbrains.kotlin.psi.KtProperty @@ -245,12 +246,16 @@ private class PropertyTranslator( private fun translateCustomAccessor(expression: KtPropertyAccessor): JsPropertyInitializer { val descriptor = BindingUtils.getFunctionDescriptor(bindingContext(), expression) val function = JsFunction(context().getScopeForDescriptor(descriptor), JsBlock(), descriptor.toString()) + function.source = expression.finalElement context().translateAndAliasParameters(descriptor, function.parameters).translateFunction(expression, function) return translateFunctionAsEcma5PropertyDescriptor(function, descriptor, context()) } - private fun createFunction(descriptor: VariableAccessorDescriptor) = - JsFunction(context().getScopeForDescriptor(descriptor), JsBlock(), accessorDescription(descriptor)) + private fun createFunction(descriptor: VariableAccessorDescriptor): JsFunction { + val function = JsFunction(context().getScopeForDescriptor(descriptor), JsBlock(), accessorDescription(descriptor)) + function.source = descriptor.source.getPsi()?.finalElement + return function + } private fun accessorDescription(accessorDescriptor: VariableAccessorDescriptor): String { val accessorType = 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 e1120f0b867..7542594bb46 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 @@ -34,6 +34,7 @@ import org.jetbrains.kotlin.js.translate.utils.FunctionBodyTranslator.translateF import org.jetbrains.kotlin.js.translate.utils.JsAstUtils import org.jetbrains.kotlin.js.translate.utils.TranslationUtils.simpleReturnFunction import org.jetbrains.kotlin.js.translate.utils.fillCoroutineMetadata +import org.jetbrains.kotlin.js.translate.utils.finalElement import org.jetbrains.kotlin.psi.KtDeclarationWithBody import org.jetbrains.kotlin.psi.KtParameter import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils @@ -41,6 +42,7 @@ import org.jetbrains.kotlin.resolve.inline.InlineUtil class LiteralFunctionTranslator(context: TranslationContext) : AbstractTranslator(context) { fun translate(declaration: KtDeclarationWithBody): JsExpression { + val finalElement = declaration.finalElement val invokingContext = context() val descriptor = getFunctionDescriptor(invokingContext.bindingContext(), declaration) @@ -59,6 +61,7 @@ class LiteralFunctionTranslator(context: TranslationContext) : AbstractTranslato lambda.body.statements += setDefaultValueForArguments(descriptor, functionContext) lambda.body.statements += translateFunctionBody(descriptor, declaration, functionContext) lambda.functionDescriptor = descriptor + lambda.source = finalElement val tracker = functionContext.usageTracker()!! @@ -71,6 +74,7 @@ class LiteralFunctionTranslator(context: TranslationContext) : AbstractTranslato } lambdaCreator.name.staticRef = lambdaCreator lambdaCreator.fillCoroutineMetadata(invokingContext, descriptor) + lambdaCreator.source = declaration return lambdaCreator.withCapturedParameters(descriptor, functionContext, invokingContext) } diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/CallableReferenceTranslator.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/CallableReferenceTranslator.kt index 913bc7fd385..711733f41e4 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/CallableReferenceTranslator.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/CallableReferenceTranslator.kt @@ -27,6 +27,7 @@ import org.jetbrains.kotlin.js.translate.context.Namer import org.jetbrains.kotlin.js.translate.context.TranslationContext import org.jetbrains.kotlin.js.translate.general.Translation import org.jetbrains.kotlin.js.translate.utils.BindingUtils +import org.jetbrains.kotlin.js.translate.utils.finalElement import org.jetbrains.kotlin.psi.KtCallableReferenceExpression import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.resolve.BindingContext @@ -96,6 +97,7 @@ object CallableReferenceTranslator { } val function = JsFunction(context.scope(), JsBlock(), "") + function.source = expression val receiverParam = if (descriptor.dispatchReceiverParameter != null || descriptor.extensionReceiverParameter != null) { val paramName = JsScope.declareTemporaryName(Namer.getReceiverParameterName()) function.parameters += JsParameter(paramName) @@ -127,12 +129,12 @@ object CallableReferenceTranslator { ): JsExpression { val call = expression.callableReference.getPropertyResolvedCallWithAssert(context.bindingContext()) - val getter = translateForPropertyAccessor(call, descriptor, context, receiver, false) { context, call, _, receiverParam -> + val getter = translateForPropertyAccessor(call, expression, descriptor, context, receiver, false) { context, call, _, receiverParam -> CallTranslator.translateGet(context, call, receiverParam) } val setter = if (isSetterVisible(descriptor, context)) { - translateForPropertyAccessor(call, descriptor, context, receiver, true, CallTranslator::translateSet) + translateForPropertyAccessor(call, expression, descriptor, context, receiver, true, CallTranslator::translateSet) } else { null @@ -153,6 +155,7 @@ object CallableReferenceTranslator { private fun translateForPropertyAccessor( call: ResolvedCall, + expression: KtExpression, descriptor: PropertyDescriptor, context: TranslationContext, receiver: JsExpression?, @@ -160,6 +163,7 @@ object CallableReferenceTranslator { translator: (TranslationContext, ResolvedCall, JsExpression, JsExpression?) -> JsExpression ): JsExpression { val accessorFunction = JsFunction(context.scope(), JsBlock(), "") + accessorFunction.source = expression.finalElement val accessorContext = context.innerBlock(accessorFunction.body) val receiverParam = if (descriptor.dispatchReceiverParameter != null || descriptor.extensionReceiverParameter != null) { val name = JsScope.declareTemporaryName(Namer.getReceiverParameterName()) diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/utils.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/utils.kt index 9c9c20d4456..ee039b5cf57 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/utils.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/utils.kt @@ -35,6 +35,10 @@ import org.jetbrains.kotlin.js.translate.context.TranslationContext import org.jetbrains.kotlin.js.translate.intrinsic.functions.basic.FunctionIntrinsicWithReceiverComputed import org.jetbrains.kotlin.js.translate.reference.ReferenceTranslator import org.jetbrains.kotlin.js.translate.utils.TranslationUtils.simpleReturnFunction +import org.jetbrains.kotlin.psi.KtBlockExpression +import org.jetbrains.kotlin.psi.KtDeclarationWithBody +import org.jetbrains.kotlin.psi.KtFunctionLiteral +import org.jetbrains.kotlin.psi.KtLambdaExpression import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.descriptorUtil.hasOrInheritsParametersWithDefaultValue @@ -88,6 +92,7 @@ fun generateDelegateCall( invocation.source = source val functionObject = simpleReturnFunction(context.scope(), invocation) + functionObject.source = source?.finalElement functionObject.parameters.addAll(parameters) val fromFunctionName = fromDescriptor.getNameForFunctionWithPossibleDefaultParam() @@ -201,3 +206,11 @@ fun definePackageAlias(name: String, varName: JsName, tag: String, parentRef: Js return JsAstUtils.newVar(varName, rhs).apply { exportedPackage = tag } } + +val PsiElement.finalElement: PsiElement + get() = when (this) { + is KtFunctionLiteral -> rBrace ?: this + is KtDeclarationWithBody -> (bodyExpression as? KtBlockExpression)?.rBrace ?: bodyExpression ?: this + is KtLambdaExpression -> bodyExpression?.rBrace ?: this + else -> this + } \ No newline at end of file diff --git a/js/js.translator/testData/lineNumbers/andAndWithSideEffect.kt b/js/js.translator/testData/lineNumbers/andAndWithSideEffect.kt index 4f95cd79bac..f122f8b8d1c 100644 --- a/js/js.translator/testData/lineNumbers/andAndWithSideEffect.kt +++ b/js/js.translator/testData/lineNumbers/andAndWithSideEffect.kt @@ -6,4 +6,4 @@ fun box(x: Int, y: Int) { fun foo(x: Int) = x -// LINES: 3 3 * 3 3 4 4 * 4 4 2 3 7 \ No newline at end of file +// LINES: 5 * 3 3 * 3 3 4 4 * 4 4 2 3 7 7 \ No newline at end of file diff --git a/js/js.translator/testData/lineNumbers/backingField.kt b/js/js.translator/testData/lineNumbers/backingField.kt index 7b2dedd5cd6..44507ff90df 100644 --- a/js/js.translator/testData/lineNumbers/backingField.kt +++ b/js/js.translator/testData/lineNumbers/backingField.kt @@ -12,4 +12,4 @@ open class A { } } -// LINES: 2 4 2 2 * 5 6 8 9 10 11 \ No newline at end of file +// LINES: 1 2 4 2 2 2 5 5 6 12 8 9 10 11 \ No newline at end of file diff --git a/js/js.translator/testData/lineNumbers/catch.kt b/js/js.translator/testData/lineNumbers/catch.kt index a948cdedb68..0f548256f87 100644 --- a/js/js.translator/testData/lineNumbers/catch.kt +++ b/js/js.translator/testData/lineNumbers/catch.kt @@ -19,4 +19,4 @@ fun bar() { } } -// LINES: 3 5 5 6 8 8 9 * 15 18 \ No newline at end of file +// LINES: 11 3 5 5 6 8 8 9 * 20 15 18 \ No newline at end of file diff --git a/js/js.translator/testData/lineNumbers/chainedCall.kt b/js/js.translator/testData/lineNumbers/chainedCall.kt index 4ecb49f01e9..cfe1c6b5cb4 100644 --- a/js/js.translator/testData/lineNumbers/chainedCall.kt +++ b/js/js.translator/testData/lineNumbers/chainedCall.kt @@ -14,4 +14,4 @@ class C { val baz: dynamic get() = null } -// LINES: 2 4 3 2 6 8 7 6 12 * 14 \ No newline at end of file +// LINES: 9 2 4 3 2 6 8 7 6 11 12 12 14 14 \ No newline at end of file diff --git a/js/js.translator/testData/lineNumbers/classCapturingLocals.kt b/js/js.translator/testData/lineNumbers/classCapturingLocals.kt index b03d2086d4b..c38ed839764 100644 --- a/js/js.translator/testData/lineNumbers/classCapturingLocals.kt +++ b/js/js.translator/testData/lineNumbers/classCapturingLocals.kt @@ -14,4 +14,4 @@ fun A.foo() { fun baz() = 23 -// LINES: 5 5 7 8 * 4 11 12 15 \ No newline at end of file +// LINES: 1 * 5 5 5 9 7 8 * 13 4 11 12 15 15 \ No newline at end of file diff --git a/js/js.translator/testData/lineNumbers/closure.kt b/js/js.translator/testData/lineNumbers/closure.kt index ddfa7d64ddf..7e254971457 100644 --- a/js/js.translator/testData/lineNumbers/closure.kt +++ b/js/js.translator/testData/lineNumbers/closure.kt @@ -5,4 +5,4 @@ fun box(x: Int, y: Int): Int { return foo(y) } -// LINES: 2 4 2 5 \ No newline at end of file +// LINES: 2 2 4 6 2 5 \ No newline at end of file diff --git a/js/js.translator/testData/lineNumbers/complexExpressionAsDefaultArgument.kt b/js/js.translator/testData/lineNumbers/complexExpressionAsDefaultArgument.kt index 34854bb8c26..50ae52f2835 100644 --- a/js/js.translator/testData/lineNumbers/complexExpressionAsDefaultArgument.kt +++ b/js/js.translator/testData/lineNumbers/complexExpressionAsDefaultArgument.kt @@ -11,4 +11,4 @@ fun baz() = 1 fun bar() = 2 -// LINES: 2 3 4 4 5 2 8 10 12 \ No newline at end of file +// LINES: 8 * 2 3 4 4 5 2 8 10 10 12 12 \ No newline at end of file diff --git a/js/js.translator/testData/lineNumbers/conditionalDecomposed.kt b/js/js.translator/testData/lineNumbers/conditionalDecomposed.kt index 7990dcddc64..0664f4bd221 100644 --- a/js/js.translator/testData/lineNumbers/conditionalDecomposed.kt +++ b/js/js.translator/testData/lineNumbers/conditionalDecomposed.kt @@ -14,4 +14,4 @@ private inline fun foo(): Int { return 23 } -// LINES: 3 3 4 3 6 13 3 14 2 13 14 \ No newline at end of file +// LINES: 10 3 3 4 3 6 13 3 14 2 15 13 14 \ No newline at end of file diff --git a/js/js.translator/testData/lineNumbers/coroutine.kt b/js/js.translator/testData/lineNumbers/coroutine.kt index c111b2d84a1..3283632081c 100644 --- a/js/js.translator/testData/lineNumbers/coroutine.kt +++ b/js/js.translator/testData/lineNumbers/coroutine.kt @@ -14,4 +14,4 @@ suspend fun bar(): Unit { println(a + b) } -// LINES: 4 5 5 6 4 9 9 9 9 9 9 9 9 * 10 11 11 11 11 11 * 11 12 13 13 13 13 13 13 14 \ No newline at end of file +// LINES: 4 4 5 5 6 4 4 15 9 9 9 9 15 9 9 9 9 * 15 10 11 11 11 11 11 * 11 12 13 13 13 13 13 13 14 \ No newline at end of file diff --git a/js/js.translator/testData/lineNumbers/dataClass.kt b/js/js.translator/testData/lineNumbers/dataClass.kt index e5adf407368..8f0881ea151 100644 --- a/js/js.translator/testData/lineNumbers/dataClass.kt +++ b/js/js.translator/testData/lineNumbers/dataClass.kt @@ -3,4 +3,4 @@ data class A( val y: String ) -// LINES: 2 3 * 2 * 3 * 1 2 3 * 1 2 3 * 1 2 3 1 * 1 2 3 \ No newline at end of file +// LINES: 1 2 3 * 1 2 1 3 1 1 2 3 1 1 2 3 1 1 2 3 1 1 1 2 3 \ No newline at end of file diff --git a/js/js.translator/testData/lineNumbers/delegateMemberVal.kt b/js/js.translator/testData/lineNumbers/delegateMemberVal.kt index 10cda707a92..458f02b6d57 100644 --- a/js/js.translator/testData/lineNumbers/delegateMemberVal.kt +++ b/js/js.translator/testData/lineNumbers/delegateMemberVal.kt @@ -13,4 +13,4 @@ class Delegate(val f: () -> Int) { } } -// LINES: 2 3 2 * 3 * 7 10 12 +// LINES: 1 2 3 2 2 3 3 * 8 7 10 10 13 12 diff --git a/js/js.translator/testData/lineNumbers/delegatedProperty.kt b/js/js.translator/testData/lineNumbers/delegatedProperty.kt index f940361ea13..4cabb46450d 100644 --- a/js/js.translator/testData/lineNumbers/delegatedProperty.kt +++ b/js/js.translator/testData/lineNumbers/delegatedProperty.kt @@ -15,4 +15,4 @@ class B { } } -// LINES: 4 5 4 4 2 * 10 * 14 \ No newline at end of file +// LINES: 3 4 5 4 4 4 2 * 8 11 10 15 14 \ No newline at end of file diff --git a/js/js.translator/testData/lineNumbers/delegation.kt b/js/js.translator/testData/lineNumbers/delegation.kt index f197b7d8037..c2d31c76532 100644 --- a/js/js.translator/testData/lineNumbers/delegation.kt +++ b/js/js.translator/testData/lineNumbers/delegation.kt @@ -18,4 +18,4 @@ val o = object : I { } } -// LINES: 2 3 2 2 * 2 * 12 * 15 17 \ No newline at end of file +// LINES: 1 2 3 2 2 2 2 2 * 11 12 12 15 15 18 17 \ No newline at end of file diff --git a/js/js.translator/testData/lineNumbers/doWhileWithComplexCondition.kt b/js/js.translator/testData/lineNumbers/doWhileWithComplexCondition.kt index ec097fc3f4a..e4edb534684 100644 --- a/js/js.translator/testData/lineNumbers/doWhileWithComplexCondition.kt +++ b/js/js.translator/testData/lineNumbers/doWhileWithComplexCondition.kt @@ -13,4 +13,4 @@ fun box() { ) } -// LINES: 8 3 2 3 3 8 11 * 3 7 12 3 3 4 \ No newline at end of file +// LINES: 14 8 3 2 3 3 8 11 * 3 7 12 3 3 4 \ No newline at end of file diff --git a/js/js.translator/testData/lineNumbers/enumCompanionObject.kt b/js/js.translator/testData/lineNumbers/enumCompanionObject.kt index 72e5646da2b..7c21808f522 100644 --- a/js/js.translator/testData/lineNumbers/enumCompanionObject.kt +++ b/js/js.translator/testData/lineNumbers/enumCompanionObject.kt @@ -6,4 +6,4 @@ enum class Foo { } } -// LINES: 1 1 1 1 2 4 * 2 2 4 5 * 4 4 4 4 * 1 * 1 1 1 \ No newline at end of file +// LINES: 1 1 1 1 1 1 2 4 * 2 2 2 4 4 5 * 4 4 4 4 4 * 1 1 * 1 1 1 1 \ No newline at end of file diff --git a/js/js.translator/testData/lineNumbers/enumObject.kt b/js/js.translator/testData/lineNumbers/enumObject.kt index e6ab2eae337..ba4fb03a189 100644 --- a/js/js.translator/testData/lineNumbers/enumObject.kt +++ b/js/js.translator/testData/lineNumbers/enumObject.kt @@ -10,4 +10,4 @@ enum class E { } } -// LINES: 1 1 1 1 2 4 8 * 2 2 4 4 5 * 4 4 8 8 9 * 8 8 * 1 * 1 1 1 1 1 \ No newline at end of file +// LINES: 1 1 1 1 1 1 2 4 8 * 2 2 2 4 4 4 5 5 * 4 4 4 8 8 8 9 9 * 8 8 8 * 1 1 * 1 1 1 1 1 1 \ No newline at end of file diff --git a/js/js.translator/testData/lineNumbers/expressionAsFunctionBody.kt b/js/js.translator/testData/lineNumbers/expressionAsFunctionBody.kt index c0553b12149..12eab22401a 100644 --- a/js/js.translator/testData/lineNumbers/expressionAsFunctionBody.kt +++ b/js/js.translator/testData/lineNumbers/expressionAsFunctionBody.kt @@ -4,4 +4,4 @@ fun box() = fun foo() = 23 -// LINES: 2 5 \ No newline at end of file +// LINES: 2 2 5 5 \ No newline at end of file diff --git a/js/js.translator/testData/lineNumbers/for.kt b/js/js.translator/testData/lineNumbers/for.kt index 1a2f1607aed..7e9b97ea177 100644 --- a/js/js.translator/testData/lineNumbers/for.kt +++ b/js/js.translator/testData/lineNumbers/for.kt @@ -17,4 +17,4 @@ fun box() { } } -// LINES: 2 10 15 2 2 2 2 3 6 6 6 7 10 10 10 10 11 14 15 15 15 15 15 15 15 16 \ No newline at end of file +// LINES: 18 2 10 15 2 2 2 2 3 6 6 6 7 10 10 10 10 11 14 15 15 15 15 15 15 15 16 \ No newline at end of file diff --git a/js/js.translator/testData/lineNumbers/increment.kt b/js/js.translator/testData/lineNumbers/increment.kt index e57a770fee7..8b72903d333 100644 --- a/js/js.translator/testData/lineNumbers/increment.kt +++ b/js/js.translator/testData/lineNumbers/increment.kt @@ -8,4 +8,4 @@ fun foo(x: Int) { println(y) } -// LINES: 2 3 4 5 6 7 8 \ No newline at end of file +// LINES: 9 2 3 4 5 6 7 8 \ No newline at end of file diff --git a/js/js.translator/testData/lineNumbers/inlineLocalVarsRef.kt b/js/js.translator/testData/lineNumbers/inlineLocalVarsRef.kt index 83fc31bb7be..fffc47b0460 100644 --- a/js/js.translator/testData/lineNumbers/inlineLocalVarsRef.kt +++ b/js/js.translator/testData/lineNumbers/inlineLocalVarsRef.kt @@ -9,4 +9,4 @@ fun bar() { foo(42) } -// LINES: 2 3 3 4 * 2 9 2 3 3 4 \ No newline at end of file +// LINES: 6 2 3 3 4 10 2 9 2 3 3 4 \ No newline at end of file diff --git a/js/js.translator/testData/lineNumbers/inlineMultiModule/simple.kt b/js/js.translator/testData/lineNumbers/inlineMultiModule/simple.kt index 540828e9abb..8b85e07674c 100644 --- a/js/js.translator/testData/lineNumbers/inlineMultiModule/simple.kt +++ b/js/js.translator/testData/lineNumbers/inlineMultiModule/simple.kt @@ -8,7 +8,7 @@ inline fun foo(x: String) { println("foo2($x);") } -// LINES: 7 8 +// LINES: 9 7 8 // MODULE: main(lib) // FILE: main.kt @@ -21,4 +21,4 @@ fun box() { foo("42") } -// LINES: 7 20 7 8 20 8 7 21 7 8 21 8 \ No newline at end of file +// LINES: 22 7 20 7 8 20 8 7 21 7 8 21 8 \ No newline at end of file diff --git a/js/js.translator/testData/lineNumbers/inlineReturn.kt b/js/js.translator/testData/lineNumbers/inlineReturn.kt index e4d783b54e7..8783a4afbff 100644 --- a/js/js.translator/testData/lineNumbers/inlineReturn.kt +++ b/js/js.translator/testData/lineNumbers/inlineReturn.kt @@ -21,4 +21,4 @@ fun bar(x: Int) { println("%") } -// LINES: 2 2 3 4 7 9 9 10 11 14 16 * 20 * 2 2 3 4 3 7 9 9 10 11 10 14 16 * 20 21 \ No newline at end of file +// LINES: 17 2 2 3 4 7 9 9 10 11 14 16 22 20 * 2 2 3 4 3 7 9 9 10 11 10 14 16 * 20 21 \ No newline at end of file diff --git a/js/js.translator/testData/lineNumbers/inlining.kt b/js/js.translator/testData/lineNumbers/inlining.kt index 897026381dd..d9084aebc46 100644 --- a/js/js.translator/testData/lineNumbers/inlining.kt +++ b/js/js.translator/testData/lineNumbers/inlining.kt @@ -11,4 +11,4 @@ inline fun bar() { println("bar2") } -// LINES: 2 10 11 4 10 11 6 10 11 +// LINES: 7 2 10 11 4 10 11 6 12 10 11 diff --git a/js/js.translator/testData/lineNumbers/inliningWithLambda.kt b/js/js.translator/testData/lineNumbers/inliningWithLambda.kt index de0e0b8f3fd..1bac32c5c7e 100644 --- a/js/js.translator/testData/lineNumbers/inliningWithLambda.kt +++ b/js/js.translator/testData/lineNumbers/inliningWithLambda.kt @@ -16,4 +16,4 @@ inline fun foo(f: () -> Unit) { println("after") } -// LINES: 2 14 4 16 6 14 8 16 10 14 15 16 \ No newline at end of file +// LINES: 11 2 14 4 16 6 14 8 16 10 17 14 15 16 \ No newline at end of file diff --git a/js/js.translator/testData/lineNumbers/innerClass.kt b/js/js.translator/testData/lineNumbers/innerClass.kt index c8969ca1cf2..04cc7dea729 100644 --- a/js/js.translator/testData/lineNumbers/innerClass.kt +++ b/js/js.translator/testData/lineNumbers/innerClass.kt @@ -6,4 +6,4 @@ class A(val x: Int) { } } -// LINES: 1 2 4 \ No newline at end of file +// LINES: 1 1 2 2 5 4 \ No newline at end of file diff --git a/js/js.translator/testData/lineNumbers/lambdaWithClosure.kt b/js/js.translator/testData/lineNumbers/lambdaWithClosure.kt index 1f050ff89eb..baba4598e13 100644 --- a/js/js.translator/testData/lineNumbers/lambdaWithClosure.kt +++ b/js/js.translator/testData/lineNumbers/lambdaWithClosure.kt @@ -4,4 +4,4 @@ fun foo(x: Int): () -> Unit = { fun bar() = 23 -// LINES: 1 2 1 5 \ No newline at end of file +// LINES: 1 1 2 1 1 5 5 \ No newline at end of file diff --git a/js/js.translator/testData/lineNumbers/literals.kt b/js/js.translator/testData/lineNumbers/literals.kt index d76c49b8747..b1205c6637d 100644 --- a/js/js.translator/testData/lineNumbers/literals.kt +++ b/js/js.translator/testData/lineNumbers/literals.kt @@ -26,4 +26,4 @@ fun bar(vararg x: Any?) { println(x) } -// LINES: 3 4 5 6 7 8 9 10 13 14 15 16 17 18 19 20 * 26 \ No newline at end of file +// LINES: 1 22 3 4 5 6 7 8 9 10 13 14 15 16 17 18 19 20 * 27 26 \ No newline at end of file diff --git a/js/js.translator/testData/lineNumbers/longLiteral.kt b/js/js.translator/testData/lineNumbers/longLiteral.kt index 3b57e4075c7..4162a0e8c5a 100644 --- a/js/js.translator/testData/lineNumbers/longLiteral.kt +++ b/js/js.translator/testData/lineNumbers/longLiteral.kt @@ -5,4 +5,4 @@ fun foo() { 0L) } -// LINES: 2 3 4 5 \ No newline at end of file +// LINES: 6 2 3 4 5 \ No newline at end of file diff --git a/js/js.translator/testData/lineNumbers/memberFunWithDefaultParam.kt b/js/js.translator/testData/lineNumbers/memberFunWithDefaultParam.kt index 2a4acac456c..64489de9c2e 100644 --- a/js/js.translator/testData/lineNumbers/memberFunWithDefaultParam.kt +++ b/js/js.translator/testData/lineNumbers/memberFunWithDefaultParam.kt @@ -10,4 +10,4 @@ class B : A() { } } -// LINES: 2 * 2 2 2 * 4 * 7 9 +// LINES: 1 2 2 2 2 2 2 4 4 * 7 7 10 9 diff --git a/js/js.translator/testData/lineNumbers/multipleReferences.kt b/js/js.translator/testData/lineNumbers/multipleReferences.kt index 9e66b5d53dc..d69d3f9d03a 100644 --- a/js/js.translator/testData/lineNumbers/multipleReferences.kt +++ b/js/js.translator/testData/lineNumbers/multipleReferences.kt @@ -12,4 +12,4 @@ object O { val y = 23 } -// LINES: 2 3 4 6 7 8 11 12 * 11 11 11 +// LINES: 9 2 3 4 6 7 8 11 11 12 * 11 11 11 11 diff --git a/js/js.translator/testData/lineNumbers/objectInstanceFunction.kt b/js/js.translator/testData/lineNumbers/objectInstanceFunction.kt index fe7cd02faf1..31f2f851f16 100644 --- a/js/js.translator/testData/lineNumbers/objectInstanceFunction.kt +++ b/js/js.translator/testData/lineNumbers/objectInstanceFunction.kt @@ -4,4 +4,4 @@ fun foo() { println("foo") } -// LINES: 1 * 1 1 1 4 \ No newline at end of file +// LINES: 1 1 * 1 1 1 1 5 4 \ No newline at end of file diff --git a/js/js.translator/testData/lineNumbers/optionalArgs.kt b/js/js.translator/testData/lineNumbers/optionalArgs.kt index 098dc07b3dc..37aa1ac6b1c 100644 --- a/js/js.translator/testData/lineNumbers/optionalArgs.kt +++ b/js/js.translator/testData/lineNumbers/optionalArgs.kt @@ -7,4 +7,4 @@ fun box( println(y) } -// LINES: 2 2 3 3 4 6 7 \ No newline at end of file +// LINES: 8 2 2 3 3 4 6 7 \ No newline at end of file diff --git a/js/js.translator/testData/lineNumbers/propertyWithoutInitializer.kt b/js/js.translator/testData/lineNumbers/propertyWithoutInitializer.kt index 0c6b69f7165..a1a1614415f 100644 --- a/js/js.translator/testData/lineNumbers/propertyWithoutInitializer.kt +++ b/js/js.translator/testData/lineNumbers/propertyWithoutInitializer.kt @@ -9,4 +9,4 @@ open class A { } } -// LINES: 2 4 7 8 4 \ No newline at end of file +// LINES: 1 2 4 7 8 4 4 \ No newline at end of file diff --git a/js/js.translator/testData/lineNumbers/simple.kt b/js/js.translator/testData/lineNumbers/simple.kt index b87b95f6825..871f3c65cd6 100644 --- a/js/js.translator/testData/lineNumbers/simple.kt +++ b/js/js.translator/testData/lineNumbers/simple.kt @@ -3,4 +3,4 @@ fun box() { println("bar") } -// LINES: 2 3 \ No newline at end of file +// LINES: 4 2 3 \ No newline at end of file diff --git a/js/js.translator/testData/lineNumbers/stringLiteral.kt b/js/js.translator/testData/lineNumbers/stringLiteral.kt index d69041aaf17..e0745b51585 100644 --- a/js/js.translator/testData/lineNumbers/stringLiteral.kt +++ b/js/js.translator/testData/lineNumbers/stringLiteral.kt @@ -4,4 +4,4 @@ fun box(x: Int): String { "suffix" } -// LINES: 2 3 4 \ No newline at end of file +// LINES: 5 2 3 4 \ No newline at end of file diff --git a/js/js.translator/testData/lineNumbers/syntheticCodeInConstructors.kt b/js/js.translator/testData/lineNumbers/syntheticCodeInConstructors.kt index c61b8556ef1..96b7b828a1e 100644 --- a/js/js.translator/testData/lineNumbers/syntheticCodeInConstructors.kt +++ b/js/js.translator/testData/lineNumbers/syntheticCodeInConstructors.kt @@ -25,4 +25,4 @@ class C : A { ) } -// LINES: 1 3 * 1 1 1 * 10 11 * 15 16 17 14 19 15 22 23 24 22 \ No newline at end of file +// LINES: 1 1 3 * 1 1 1 1 7 * 9 10 11 * 15 15 16 17 14 19 15 22 22 23 24 22 \ No newline at end of file diff --git a/js/js.translator/testData/lineNumbers/syntheticCodeInEnums.kt b/js/js.translator/testData/lineNumbers/syntheticCodeInEnums.kt index 0d167f198cc..dd281ef0cef 100644 --- a/js/js.translator/testData/lineNumbers/syntheticCodeInEnums.kt +++ b/js/js.translator/testData/lineNumbers/syntheticCodeInEnums.kt @@ -8,4 +8,4 @@ enum class E { } } -// LINES: 1 1 1 1 2 3 4 * 2 2 * 3 3 4 4 6 * 4 4 * 1 * 1 1 1 1 1 \ No newline at end of file +// LINES: 1 1 1 1 1 1 2 3 4 * 2 2 2 * 3 3 3 4 4 4 6 * 4 4 4 * 1 1 * 1 1 1 1 1 1 \ No newline at end of file diff --git a/js/js.translator/testData/lineNumbers/valParameter.kt b/js/js.translator/testData/lineNumbers/valParameter.kt index 842d101be60..5e5ca0d9959 100644 --- a/js/js.translator/testData/lineNumbers/valParameter.kt +++ b/js/js.translator/testData/lineNumbers/valParameter.kt @@ -7,4 +7,4 @@ fun foo() { A(23, "foo") } -// LINES: 2 3 * 7 \ No newline at end of file +// LINES: 1 2 3 * 8 7 \ No newline at end of file diff --git a/js/js.translator/testData/lineNumbers/whenIn.kt b/js/js.translator/testData/lineNumbers/whenIn.kt index af5058c2bf2..b5c1997c1c8 100644 --- a/js/js.translator/testData/lineNumbers/whenIn.kt +++ b/js/js.translator/testData/lineNumbers/whenIn.kt @@ -13,4 +13,4 @@ fun foo(): Int = 23 fun bar(): IntRange = 1000..2000 -// LINES: 2 2 3 4 5 6 7 8 12 14 \ No newline at end of file +// LINES: 10 2 2 3 4 5 6 7 8 12 12 14 14 \ No newline at end of file diff --git a/js/js.translator/testData/lineNumbers/whenIs.kt b/js/js.translator/testData/lineNumbers/whenIs.kt index 8fa4eaa5391..608cd47de05 100644 --- a/js/js.translator/testData/lineNumbers/whenIs.kt +++ b/js/js.translator/testData/lineNumbers/whenIs.kt @@ -13,4 +13,4 @@ open class A open class B : A() -// LINES: 2 2 3 4 5 6 8 * 14 \ No newline at end of file +// LINES: 10 2 2 3 4 5 6 8 12 * 14 14 \ No newline at end of file diff --git a/js/js.translator/testData/lineNumbers/whileWithComplexCondition.kt b/js/js.translator/testData/lineNumbers/whileWithComplexCondition.kt index 5babb223b2c..0eecc232b25 100644 --- a/js/js.translator/testData/lineNumbers/whileWithComplexCondition.kt +++ b/js/js.translator/testData/lineNumbers/whileWithComplexCondition.kt @@ -12,4 +12,4 @@ fun box() { } } -// LINES: 5 2 3 5 8 * 3 4 9 3 11 \ No newline at end of file +// LINES: 13 5 2 3 5 8 * 3 4 9 3 11 \ No newline at end of file