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 7485f3252fe..fc1070b3e6c 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 @@ -155,4 +155,16 @@ public class JsLineNumberTestGenerated extends AbstractJsLineNumberTest { String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/lineNumbers/valParameter.kt"); doTest(fileName); } + + @TestMetadata("whenIn.kt") + public void testWhenIn() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/lineNumbers/whenIn.kt"); + doTest(fileName); + } + + @TestMetadata("whenIs.kt") + public void testWhenIs() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/lineNumbers/whenIs.kt"); + doTest(fileName); + } } diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/WhenTranslator.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/WhenTranslator.java index 5ad3467af9c..296eff1c1a2 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/WhenTranslator.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/WhenTranslator.java @@ -190,7 +190,7 @@ public final class WhenTranslator extends AbstractTranslator { assert expressionToMatchNonTranslated != null : "expressionToMatch != null => expressionToMatchNonTranslated != null: " + PsiUtilsKt.getTextWithLocation(conditionIsPattern); JsExpression result = Translation.patternTranslator(context).translateIsCheck(expressionToMatch, typeReference); - return result != null ? result : new JsBooleanLiteral(true); + return (result != null ? result : new JsBooleanLiteral(true)).source(conditionIsPattern); } @NotNull @@ -226,7 +226,7 @@ public final class WhenTranslator extends AbstractTranslator { TranslationContext callContext = context.innerContextWithAliasesForExpressions(subjectAliases); boolean negated = condition.getOperationReference().getReferencedNameElementType() == KtTokens.NOT_IN; return new InOperationTranslator(callContext, expressionToMatch, condition.getRangeExpression(), condition.getOperationReference(), - negated).translate(); + negated).translate().source(condition); } @Nullable diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/expandIsCalls.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/expandIsCalls.kt index 0a94a253420..2a5914fee58 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/expandIsCalls.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/expandIsCalls.kt @@ -64,7 +64,7 @@ private class TypeCheckRewritingVisitor : JsVisitorWithContextImpl() { val replacement = getReplacement(callee, calleeArguments, argument) if (replacement != null) { - ctx.replaceMe(accept(replacement)) + ctx.replaceMe(accept(replacement).source(x.source)) return false } } diff --git a/js/js.translator/testData/lineNumbers/whenIn.kt b/js/js.translator/testData/lineNumbers/whenIn.kt new file mode 100644 index 00000000000..af5058c2bf2 --- /dev/null +++ b/js/js.translator/testData/lineNumbers/whenIn.kt @@ -0,0 +1,16 @@ +fun box() { + when (foo()) { + in 2..5 -> + println("A") + !in 100..200 -> + println("B") + in bar() -> + println("C") + } +} + +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 diff --git a/js/js.translator/testData/lineNumbers/whenIs.kt b/js/js.translator/testData/lineNumbers/whenIs.kt new file mode 100644 index 00000000000..8fa4eaa5391 --- /dev/null +++ b/js/js.translator/testData/lineNumbers/whenIs.kt @@ -0,0 +1,16 @@ +fun box() { + when (A()) { + is A -> + println("A") + is B -> + println("B") + else -> + println("other") + } +} + +open class A + +open class B : A() + +// LINES: 2 2 3 4 5 6 8 * 14 \ No newline at end of file