[JS FIR] Enable FirJsLineNumberTests for FIR

^KT-64426 Fixed
This commit is contained in:
Alexander Korepanov
2023-12-20 16:19:58 +01:00
committed by Space Team
parent ac30911497
commit 6df0e0c847
58 changed files with 460 additions and 146 deletions
+1 -1
View File
@@ -46,7 +46,7 @@ There are multiple kinds of tests. Here are some of them:
Such tests must contain a `fn box(): String` function. If this function returns `"OK"`,
the test is considered passed, and if it returns anything else, the test is considered failed.
- Line number tests, located in `js/js.translator/testData/lineNumbers`. These are to ensure that the debug info in the generated JavaScript matches some expectation.
The expectation is written in a comment staring with `// LINES(JS):` or `// LINES(JS_IR):`.
The expectation is written in a comment staring with `// LINES(JS_IR):` or `// LINES(ClassicFrontend JS):` or `// LINES(FIR JS_IR):`.
These comments contain a list of line numbers in the test file that the compiler output is generated from.
The actual line numbers can be viewed in the generated JS file whose name ends with `-lines.js`.
- TypeScript export tests, located in `js/js.translator/testData/typescript-export`.
@@ -165,10 +165,9 @@ fun main(args: Array<String>) {
// model("typescript-export/", pattern = "^([^_](.+))\\.kt$")
// }
// see todo on defining class
// testClass<AbstractJsFirLineNumberTest> {
// model("lineNumbers/")
// }
testClass<AbstractFirJsLineNumberTest> {
model("lineNumbers/")
}
}
testGroup("js/js.tests/tests-gen", "compiler/testData", testRunnerMethodName = "runTest0") {
@@ -7,6 +7,7 @@ import org.jetbrains.kotlin.js.test.converters.JsIrBackendFacade
import org.jetbrains.kotlin.js.test.converters.incremental.RecompileModuleJsIrBackendFacade
import org.jetbrains.kotlin.js.test.handlers.JsDebugRunner
import org.jetbrains.kotlin.js.test.handlers.JsIrRecompiledArtifactsIdentityHandler
import org.jetbrains.kotlin.js.test.handlers.createFirJsLineNumberHandler
import org.jetbrains.kotlin.parsing.parseBoolean
import org.jetbrains.kotlin.test.Constructor
import org.jetbrains.kotlin.test.FirParser
@@ -134,16 +135,25 @@ open class AbstractFirJsCodegenInlineTest : AbstractFirJsTest(
// }
//}
// TODO: implement separate expectations for FIR/JS to reuse testdata, disabled for now
//open class AbstractJsFirLineNumberTest : AbstractFirJsTest(
// pathToTestDir = "${JsEnvironmentConfigurator.TEST_DATA_DIR_PATH}/lineNumbers/",
// testGroupOutputDirPrefix = "firLineNumbers/"
//) {
// override fun configure(builder: TestConfigurationBuilder) {
// super.configure(builder)
// configureJsIrLineNumberTest(builder)
// }
//}
open class AbstractFirJsLineNumberTest : AbstractFirJsTest(
pathToTestDir = "${JsEnvironmentConfigurator.TEST_DATA_DIR_PATH}/lineNumbers/",
testGroupOutputDirPrefix = "firLineNumbers/"
) {
override fun configure(builder: TestConfigurationBuilder) {
super.configure(builder)
with(builder) {
defaultDirectives {
+JsEnvironmentConfigurationDirectives.KJS_WITH_FULL_RUNTIME
+JsEnvironmentConfigurationDirectives.NO_COMMON_FILES
-JsEnvironmentConfigurationDirectives.GENERATE_NODE_JS_RUNNER
JsEnvironmentConfigurationDirectives.DONT_RUN_GENERATED_CODE.with(listOf("JS", "JS_IR", "JS_IR_ES6"))
}
configureJsArtifactsHandlersStep {
useHandlers(::createFirJsLineNumberHandler)
}
}
}
}
open class AbstractFirJsSteppingTest : AbstractFirJsTest(
pathToTestDir = "compiler/testData/debug/stepping/",
@@ -9,39 +9,36 @@ import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.CompilationOutputs
import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.TranslationMode
import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.safeModuleName
import org.jetbrains.kotlin.js.backend.ast.JsProgram
import org.jetbrains.kotlin.js.facade.TranslationResult
import org.jetbrains.kotlin.js.test.utils.LineCollector
import org.jetbrains.kotlin.js.test.utils.LineOutputToStringVisitor
import org.jetbrains.kotlin.js.util.TextOutputImpl
import org.jetbrains.kotlin.test.backend.handlers.JsBinaryArtifactHandler
import org.jetbrains.kotlin.test.model.BinaryArtifacts
import org.jetbrains.kotlin.test.model.FrontendKind
import org.jetbrains.kotlin.test.model.FrontendKinds
import org.jetbrains.kotlin.test.model.TestModule
import org.jetbrains.kotlin.test.services.TestServices
import org.jetbrains.kotlin.test.services.assertions
import org.jetbrains.kotlin.test.services.configuration.JsEnvironmentConfigurator
import org.jetbrains.kotlin.test.services.moduleStructure
import org.jetbrains.kotlin.utils.addToStdlib.cast
import java.io.File
/**
* Verifies the `// LINE` comments in lineNumber tests.
*
* The test file is expected to contain the `// LINE(backend)` directive, followed by the line numbers that the corresponding JS statements
* are generated from.
* The test file is expected to contain the `// LINE($linePattern)` directive,
* followed by the line numbers that the corresponding JS statements are generated from.
*
* This handler traverses the JS AST and collects the actual line numbers using [LineCollector], and generates a JavaScript file
* with those line numbers printed as comments for ease of debugging these tests.
*/
class JsLineNumberHandler(testServices: TestServices) : JsBinaryArtifactHandler(testServices) {
private class JsLineNumberHandler(private val frontend: FrontendKind<*>, testServices: TestServices) : JsBinaryArtifactHandler(testServices) {
private val translationModeForIr = TranslationMode.PER_MODULE_DEV
override fun processAfterAllModules(someAssertionWasFailed: Boolean) {}
override fun processModule(module: TestModule, info: BinaryArtifacts.Js) {
when (val artifact = info.unwrap()) {
is BinaryArtifacts.Js.OldJsArtifact ->
verifyModule(module, TranslationMode.FULL_DEV, artifact.translationResult.cast<TranslationResult.Success>().program, "JS")
is BinaryArtifacts.Js.JsIrArtifact -> {
val testModules = testServices.moduleStructure.modules
val moduleId2TestModule = testModules.associateBy { it.name.safeModuleName }
@@ -58,7 +55,7 @@ class JsLineNumberHandler(testServices: TestServices) : JsBinaryArtifactHandler(
}
}
verifyModule(module, translationModeForIr, compilationOutputs.jsProgram!!, "JS_IR")
verifyModule(module, translationModeForIr, compilationOutputs.jsProgram!!)
verifiedModuleCount += 1
}
@@ -77,8 +74,7 @@ class JsLineNumberHandler(testServices: TestServices) : JsBinaryArtifactHandler(
private fun verifyModule(
module: TestModule,
translationMode: TranslationMode,
jsProgram: JsProgram,
backendPattern: String
jsProgram: JsProgram
) {
val baseOutputPath = JsEnvironmentConfigurator.getJsModuleArtifactPath(testServices, module.name, translationMode)
@@ -96,12 +92,12 @@ class JsLineNumberHandler(testServices: TestServices) : JsBinaryArtifactHandler(
writeText(generatedCode)
}
val linesPattern = Regex("^ *// *LINES\\($backendPattern\\): *(.*)$", RegexOption.MULTILINE)
val linesPattern = Regex("^ *// *LINES\\((?:$frontend )? *JS_IR\\): *(.*)$", RegexOption.MULTILINE)
val linesMatcher = module.files
.firstNotNullOfOrNull { linesPattern.find(it.originalContent) }
?: testServices.assertions.fail {
"'// LINES($backendPattern): ' comment was not found in source file. Generated code is:\n$generatedCode"
"'// LINES(${linesPattern.pattern}): ' comment was not found in source file. Generated code is:\n$generatedCode"
}
fun List<Int?>.render() = joinToString(" ") { it?.toString() ?: "*" }
@@ -117,3 +113,11 @@ class JsLineNumberHandler(testServices: TestServices) : JsBinaryArtifactHandler(
testServices.assertions.assertEquals(expectedLines, actualLines) { generatedCode }
}
}
fun createIrJsLineNumberHandler(testServices: TestServices): JsBinaryArtifactHandler {
return JsLineNumberHandler(FrontendKinds.ClassicFrontend, testServices)
}
fun createFirJsLineNumberHandler(testServices: TestServices): JsBinaryArtifactHandler {
return JsLineNumberHandler(FrontendKinds.FIR, testServices)
}
@@ -138,7 +138,17 @@ open class AbstractJsIrLineNumberTest : AbstractJsIrTest(
) {
override fun configure(builder: TestConfigurationBuilder) {
super.configure(builder)
configureJsIrLineNumberTest(builder)
with(builder) {
defaultDirectives {
+JsEnvironmentConfigurationDirectives.KJS_WITH_FULL_RUNTIME
+JsEnvironmentConfigurationDirectives.NO_COMMON_FILES
-JsEnvironmentConfigurationDirectives.GENERATE_NODE_JS_RUNNER
JsEnvironmentConfigurationDirectives.DONT_RUN_GENERATED_CODE.with(listOf("JS", "JS_IR", "JS_IR_ES6"))
}
configureJsArtifactsHandlersStep {
useHandlers(::createIrJsLineNumberHandler)
}
}
}
}
@@ -193,20 +203,6 @@ open class AbstractWebDemoExamplesTest : AbstractJsIrTest(
}
}
private fun configureJsIrLineNumberTest(builder: TestConfigurationBuilder) {
with(builder) {
defaultDirectives {
+JsEnvironmentConfigurationDirectives.KJS_WITH_FULL_RUNTIME
+JsEnvironmentConfigurationDirectives.NO_COMMON_FILES
-JsEnvironmentConfigurationDirectives.GENERATE_NODE_JS_RUNNER
JsEnvironmentConfigurationDirectives.DONT_RUN_GENERATED_CODE.with(listOf("JS", "JS_IR", "JS_IR_ES6"))
}
configureJsArtifactsHandlersStep {
useHandlers(::JsLineNumberHandler)
}
}
}
open class AbstractIrJsSteppingTest : AbstractJsIrTest(
pathToTestDir = "compiler/testData/debug/stepping/",
testGroupOutputDirPrefix = "debug/irStepping/"
@@ -0,0 +1,343 @@
/*
* Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.js.test.fir;
import com.intellij.testFramework.TestDataPath;
import org.jetbrains.kotlin.test.util.KtTestUtil;
import org.jetbrains.kotlin.test.TargetBackend;
import org.jetbrains.kotlin.test.TestMetadata;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import java.io.File;
import java.util.regex.Pattern;
/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.GenerateJsTestsKt}. DO NOT MODIFY MANUALLY */
@SuppressWarnings("all")
@TestMetadata("js/js.translator/testData/lineNumbers")
@TestDataPath("$PROJECT_ROOT")
public class FirJsLineNumberTestGenerated extends AbstractFirJsLineNumberTest {
@Test
public void testAllFilesPresentInLineNumbers() throws Exception {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/lineNumbers"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JS_IR, true);
}
@Test
@TestMetadata("andAndWithSideEffect.kt")
public void testAndAndWithSideEffect() throws Exception {
runTest("js/js.translator/testData/lineNumbers/andAndWithSideEffect.kt");
}
@Test
@TestMetadata("backingField.kt")
public void testBackingField() throws Exception {
runTest("js/js.translator/testData/lineNumbers/backingField.kt");
}
@Test
@TestMetadata("catch.kt")
public void testCatch() throws Exception {
runTest("js/js.translator/testData/lineNumbers/catch.kt");
}
@Test
@TestMetadata("chainedCall.kt")
public void testChainedCall() throws Exception {
runTest("js/js.translator/testData/lineNumbers/chainedCall.kt");
}
@Test
@TestMetadata("classCapturingLocals.kt")
public void testClassCapturingLocals() throws Exception {
runTest("js/js.translator/testData/lineNumbers/classCapturingLocals.kt");
}
@Test
@TestMetadata("closure.kt")
public void testClosure() throws Exception {
runTest("js/js.translator/testData/lineNumbers/closure.kt");
}
@Test
@TestMetadata("complexExpressionAsDefaultArgument.kt")
public void testComplexExpressionAsDefaultArgument() throws Exception {
runTest("js/js.translator/testData/lineNumbers/complexExpressionAsDefaultArgument.kt");
}
@Test
@TestMetadata("conditionalDecomposed.kt")
public void testConditionalDecomposed() throws Exception {
runTest("js/js.translator/testData/lineNumbers/conditionalDecomposed.kt");
}
@Test
@TestMetadata("coroutine.kt")
public void testCoroutine() throws Exception {
runTest("js/js.translator/testData/lineNumbers/coroutine.kt");
}
@Test
@TestMetadata("coroutineNullAssertion.kt")
public void testCoroutineNullAssertion() throws Exception {
runTest("js/js.translator/testData/lineNumbers/coroutineNullAssertion.kt");
}
@Test
@TestMetadata("dataClass.kt")
public void testDataClass() throws Exception {
runTest("js/js.translator/testData/lineNumbers/dataClass.kt");
}
@Test
@TestMetadata("delegateMemberVal.kt")
public void testDelegateMemberVal() throws Exception {
runTest("js/js.translator/testData/lineNumbers/delegateMemberVal.kt");
}
@Test
@TestMetadata("delegatedProperty.kt")
public void testDelegatedProperty() throws Exception {
runTest("js/js.translator/testData/lineNumbers/delegatedProperty.kt");
}
@Test
@TestMetadata("delegation.kt")
public void testDelegation() throws Exception {
runTest("js/js.translator/testData/lineNumbers/delegation.kt");
}
@Test
@TestMetadata("destructuring.kt")
public void testDestructuring() throws Exception {
runTest("js/js.translator/testData/lineNumbers/destructuring.kt");
}
@Test
@TestMetadata("destructuringInline.kt")
public void testDestructuringInline() throws Exception {
runTest("js/js.translator/testData/lineNumbers/destructuringInline.kt");
}
@Test
@TestMetadata("doWhileWithComplexCondition.kt")
public void testDoWhileWithComplexCondition() throws Exception {
runTest("js/js.translator/testData/lineNumbers/doWhileWithComplexCondition.kt");
}
@Test
@TestMetadata("elvis.kt")
public void testElvis() throws Exception {
runTest("js/js.translator/testData/lineNumbers/elvis.kt");
}
@Test
@TestMetadata("enumCompanionObject.kt")
public void testEnumCompanionObject() throws Exception {
runTest("js/js.translator/testData/lineNumbers/enumCompanionObject.kt");
}
@Test
@TestMetadata("enumObject.kt")
public void testEnumObject() throws Exception {
runTest("js/js.translator/testData/lineNumbers/enumObject.kt");
}
@Test
@TestMetadata("expressionAsFunctionBody.kt")
public void testExpressionAsFunctionBody() throws Exception {
runTest("js/js.translator/testData/lineNumbers/expressionAsFunctionBody.kt");
}
@Test
@TestMetadata("for.kt")
public void testFor() throws Exception {
runTest("js/js.translator/testData/lineNumbers/for.kt");
}
@Test
@TestMetadata("increment.kt")
public void testIncrement() throws Exception {
runTest("js/js.translator/testData/lineNumbers/increment.kt");
}
@Test
@TestMetadata("inlineArguments.kt")
public void testInlineArguments() throws Exception {
runTest("js/js.translator/testData/lineNumbers/inlineArguments.kt");
}
@Test
@TestMetadata("inlineLocalVarsRef.kt")
public void testInlineLocalVarsRef() throws Exception {
runTest("js/js.translator/testData/lineNumbers/inlineLocalVarsRef.kt");
}
@Test
@TestMetadata("inlineReturn.kt")
public void testInlineReturn() throws Exception {
runTest("js/js.translator/testData/lineNumbers/inlineReturn.kt");
}
@Test
@TestMetadata("inlining.kt")
public void testInlining() throws Exception {
runTest("js/js.translator/testData/lineNumbers/inlining.kt");
}
@Test
@TestMetadata("inliningWithLambda.kt")
public void testInliningWithLambda() throws Exception {
runTest("js/js.translator/testData/lineNumbers/inliningWithLambda.kt");
}
@Test
@TestMetadata("innerClass.kt")
public void testInnerClass() throws Exception {
runTest("js/js.translator/testData/lineNumbers/innerClass.kt");
}
@Test
@TestMetadata("isOperator.kt")
public void testIsOperator() throws Exception {
runTest("js/js.translator/testData/lineNumbers/isOperator.kt");
}
@Test
@TestMetadata("jsCode.kt")
public void testJsCode() throws Exception {
runTest("js/js.translator/testData/lineNumbers/jsCode.kt");
}
@Test
@TestMetadata("lambdaWithClosure.kt")
public void testLambdaWithClosure() throws Exception {
runTest("js/js.translator/testData/lineNumbers/lambdaWithClosure.kt");
}
@Test
@TestMetadata("lastExpressionInInlineLambda.kt")
public void testLastExpressionInInlineLambda() throws Exception {
runTest("js/js.translator/testData/lineNumbers/lastExpressionInInlineLambda.kt");
}
@Test
@TestMetadata("literals.kt")
public void testLiterals() throws Exception {
runTest("js/js.translator/testData/lineNumbers/literals.kt");
}
@Test
@TestMetadata("longLiteral.kt")
public void testLongLiteral() throws Exception {
runTest("js/js.translator/testData/lineNumbers/longLiteral.kt");
}
@Test
@TestMetadata("memberFunWithDefaultParam.kt")
public void testMemberFunWithDefaultParam() throws Exception {
runTest("js/js.translator/testData/lineNumbers/memberFunWithDefaultParam.kt");
}
@Test
@TestMetadata("multipleReferences.kt")
public void testMultipleReferences() throws Exception {
runTest("js/js.translator/testData/lineNumbers/multipleReferences.kt");
}
@Test
@TestMetadata("objectInstanceFunction.kt")
public void testObjectInstanceFunction() throws Exception {
runTest("js/js.translator/testData/lineNumbers/objectInstanceFunction.kt");
}
@Test
@TestMetadata("optionalArgs.kt")
public void testOptionalArgs() throws Exception {
runTest("js/js.translator/testData/lineNumbers/optionalArgs.kt");
}
@Test
@TestMetadata("propertyWithoutInitializer.kt")
public void testPropertyWithoutInitializer() throws Exception {
runTest("js/js.translator/testData/lineNumbers/propertyWithoutInitializer.kt");
}
@Test
@TestMetadata("simple.kt")
public void testSimple() throws Exception {
runTest("js/js.translator/testData/lineNumbers/simple.kt");
}
@Test
@TestMetadata("stringLiteral.kt")
public void testStringLiteral() throws Exception {
runTest("js/js.translator/testData/lineNumbers/stringLiteral.kt");
}
@Test
@TestMetadata("syntheticCodeInConstructors.kt")
public void testSyntheticCodeInConstructors() throws Exception {
runTest("js/js.translator/testData/lineNumbers/syntheticCodeInConstructors.kt");
}
@Test
@TestMetadata("syntheticCodeInEnums.kt")
public void testSyntheticCodeInEnums() throws Exception {
runTest("js/js.translator/testData/lineNumbers/syntheticCodeInEnums.kt");
}
@Test
@TestMetadata("valParameter.kt")
public void testValParameter() throws Exception {
runTest("js/js.translator/testData/lineNumbers/valParameter.kt");
}
@Test
@TestMetadata("whenEntryWithMultipleConditions.kt")
public void testWhenEntryWithMultipleConditions() throws Exception {
runTest("js/js.translator/testData/lineNumbers/whenEntryWithMultipleConditions.kt");
}
@Test
@TestMetadata("whenEntryWithMultipleConditionsNonOptimized.kt")
public void testWhenEntryWithMultipleConditionsNonOptimized() throws Exception {
runTest("js/js.translator/testData/lineNumbers/whenEntryWithMultipleConditionsNonOptimized.kt");
}
@Test
@TestMetadata("whenIn.kt")
public void testWhenIn() throws Exception {
runTest("js/js.translator/testData/lineNumbers/whenIn.kt");
}
@Test
@TestMetadata("whenIs.kt")
public void testWhenIs() throws Exception {
runTest("js/js.translator/testData/lineNumbers/whenIs.kt");
}
@Test
@TestMetadata("whileWithComplexCondition.kt")
public void testWhileWithComplexCondition() throws Exception {
runTest("js/js.translator/testData/lineNumbers/whileWithComplexCondition.kt");
}
@Nested
@TestMetadata("js/js.translator/testData/lineNumbers/inlineMultiModule")
@TestDataPath("$PROJECT_ROOT")
public class InlineMultiModule {
@Test
public void testAllFilesPresentInInlineMultiModule() throws Exception {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/lineNumbers/inlineMultiModule"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JS_IR, true);
}
@Test
@TestMetadata("simple.kt")
public void testSimple() throws Exception {
runTest("js/js.translator/testData/lineNumbers/inlineMultiModule/simple.kt");
}
}
}
@@ -205,6 +205,12 @@ public class JsIrLineNumberTestGenerated extends AbstractJsIrLineNumberTest {
runTest("js/js.translator/testData/lineNumbers/isOperator.kt");
}
@Test
@TestMetadata("jsCode.kt")
public void testJsCode() throws Exception {
runTest("js/js.translator/testData/lineNumbers/jsCode.kt");
}
@Test
@TestMetadata("lambdaWithClosure.kt")
public void testLambdaWithClosure() throws Exception {
@@ -6,5 +6,4 @@ fun box(x: Int, y: Int) {
fun foo(x: Int) = x
// LINES(JS): 1 5 3 3 4 3 3 3 3 * 3 3 4 4 4 4 * 4 4 4 4 2 3 7 7 7
// LINES(JS_IR): 1 1 * 3 3 3 * 3 3 * 4 4 4 * 4 4 2 7 7 7 7
// LINES(JS_IR): 1 1 * 3 3 3 * 3 3 * 4 4 4 * 4 4 2 7 7 7 7
+1 -2
View File
@@ -12,5 +12,4 @@ open class A {
}
}
// LINES(JS): 1 2 2 4 4 2 2 2 2 5 5 5 6 7 12 8 9 10 11
// LINES(JS_IR): 1 1 2 2 4 4 2 2 2 2 2 2 7 8 9 10 10 11 5 6 6 5 6
// LINES(JS_IR): 1 1 2 2 4 4 2 2 2 2 2 2 7 8 9 10 10 11 5 6 6 5 6
+1 -2
View File
@@ -19,5 +19,4 @@ fun bar() {
}
}
// LINES(JS): 1 11 3 3 5 5 6 6 8 8 9 9 2 2 * 13 20 15 15 18 18
// LINES(JS_IR): 1 1 3 3 * 5 5 6 6 * 8 8 9 9 * 13 13 15 15 17 17 18 18
// LINES(JS_IR): 1 1 3 3 * 5 5 6 6 * 8 8 9 9 * 13 13 15 15 17 17 18 18
+1 -2
View File
@@ -14,5 +14,4 @@ class C {
val baz: dynamic get() = null
}
// LINES(JS): 1 9 2 4 3 2 6 8 7 6 11 12 12 12 14 14 14
// LINES(JS_IR): 1 1 2 4 3 2 6 8 7 6 11 11 12 12 12 14 14 14
// LINES(JS_IR): 1 1 2 4 3 2 6 8 7 6 11 11 12 12 12 14 14 14
@@ -14,5 +14,4 @@ fun A.foo() {
fun baz() = 23
// LINES(JS): 1 * 5 5 5 6 9 7 7 8 8 * 3 13 4 4 11 11 12 12 15 15 15
// LINES(JS_IR): 1 1 3 3 4 11 11 12 12 15 15 15 15 5 3 4 5 * 6 7 7 8 8
// LINES(JS_IR): 1 1 3 3 4 11 11 12 12 15 15 15 15 5 3 4 5 * 6 7 7 8 8
+1 -2
View File
@@ -5,5 +5,4 @@ fun box(x: Int, y: Int): Int {
return foo(y)
}
// LINES(JS): 2 2 2 4 4 1 6 2 2 5 5
// LINES(JS_IR): 1 1 5 5 2 1 3 4 4 4
// LINES(JS_IR): 1 1 5 5 2 1 3 4 4 4
@@ -11,5 +11,4 @@ fun baz() = 1
fun bar() = 2
// LINES(JS): 1 3 3 2 2 4 3 4 4 4 5 5 2 8 8 10 10 10 12 12 12
// LINES(JS_IR): 1 2 8 * 4 3 4 5 * 8 8 10 10 10 10 12 12 12 12
// LINES(JS_IR): 1 2 8 * 4 3 4 5 * 8 8 10 10 10 10 12 12 12 12
@@ -14,5 +14,5 @@ private inline fun foo(): Int {
return 23
}
// LINES(JS): 1 10 3 3 3 4 3 6 13 13 3 14 2 12 15 13 13 14 14
// LINES(JS_IR): 1 1 * 3 4 6 * 13 13 14 2 12 12 13 13 14 14
// LINES(ClassicFrontend JS_IR): 1 1 * 3 4 6 * 13 13 14 2 12 12 13 13 14 14
// LINES(FIR JS_IR): 1 1 * 4 4 6 * 13 13 14 2 12 12 13 13 14 14
-1
View File
@@ -14,5 +14,4 @@ suspend fun bar(): Unit {
println(a + b)
}
// LINES(JS): 39 4 4 4 7 5 5 45 45 5 93 45 5 5 6 4 4 4 9 15 9 9 9 * 9 15 10 10 11 11 11 11 11 * 11 12 12 13 13 13 13 13 13 13 14 14 * 9 15 9 9 9 9
// LINES(JS_IR): 4 4 * 93 3 45 45 7 7 6 9 9 * 9 * 9 * 10 10 * 11 * 11 12 12 * 13 * 13 14 14 15 15
@@ -8,5 +8,4 @@ suspend fun foo() {
suspend fun delay() {
}
// LINES(JS): 1 6 1 1 * 1 6 2 2 2 2 2 * 3 3 4 4 4 4 4 5 5 * 1 6 1 1 1 1 8 9
// LINES(JS_IR): 1 1 * 8 8 9 9 1 * 1 * 2 * 3 3 3 * 5 5 6 6
+2 -2
View File
@@ -3,5 +3,5 @@ data class A(
val y: String
)
// LINES(JS): 1 2 3 * 1 2 2 1 3 3 1 1 1 2 3 1 1 1 2 3 1 1 1 2 3 1 1 1 1 1 2 3
// LINES(JS_IR): 1 2 3 1 2 2 3 3 2 2 2 3 3 3 1 1 1 1 1 1 1 2 3 1 1 1 1 2 3 1 1 * 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
// LINES(ClassicFrontend JS_IR): 1 2 3 1 2 2 3 3 2 2 2 3 3 3 1 1 1 1 1 1 1 2 3 1 1 1 1 2 3 1 1 * 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
// LINES(FIR JS_IR): 1 2 3 1 2 2 3 3 2 2 2 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 * 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+2 -2
View File
@@ -13,5 +13,5 @@ class Delegate(val f: () -> Int) {
}
}
// LINES(JS): 1 2 3 * 2 2 3 3 3 3 * 6 8 7 7 10 10 11 13 12 12
// LINES(JS_IR): 3 3 3 3 1 1 3 3 3 2 3 3 3 2 1 2 6 6 7 7 10 10 10 10 10 10 10 11 12 12 2 2 18 * 2
// LINES(FIR JS_IR): 3 3 3 3 1 1 3 3 3 3 3 3 6 6 7 7 10 10 10 10 10 10 10 11 12 12 3 3 18 * 3
// LINES(ClassicFrontend JS_IR): 3 3 3 3 1 1 3 3 3 2 3 3 3 2 1 2 6 6 7 7 10 10 10 10 10 10 10 11 12 12 2 2 18 * 2
+2 -2
View File
@@ -15,5 +15,5 @@ class B {
}
}
// LINES(JS): 3 4 5 * 4 4 4 * 8 9 11 10 10 13 15 14 14
// LINES(JS_IR): 3 3 5 5 4 5 5 5 4 1 4 5 4 5 5 5 4 1 4 8 8 9 10 10 13 14 14 4 4 20 * 4 20 * 4 4 20 * 4 20
// LINES(ClassicFrontend JS_IR): 3 3 5 5 4 5 5 5 4 1 4 5 4 5 5 5 4 1 4 8 8 9 10 10 13 14 14 4 4 20 * 4 20 * 4 4 20 * 4 20
// LINES(FIR JS_IR): 3 3 5 5 4 5 5 5 5 5 5 8 8 9 10 10 13 14 14 5 5 20 * 5 20 * 5 5 20 * 5 20
-1
View File
@@ -18,5 +18,4 @@ val o = object : I {
}
}
// LINES(JS): 1 2 3 2 2 2 2 2 2 2 * 11 12 12 12 15 15 15 16 18 17 17
// LINES(JS_IR): 11 11 * 11 11 * 1 1 3 3 1 1 1 1 1 1 1 1 1 * 11 11 12 12 12 16 17 17 15 15 15 * 1 * 11
+2 -2
View File
@@ -27,5 +27,5 @@ fun bar(f: (Pair<String, String>) -> Unit) {
}
// LINES(JS): 15 22 16 16 17 18 20 20 21 21 22 22 3 23 9 9 9 9 4 9 9 9 5 5 6 7 11 11 12 12 15 15 25 27 26 26 * 1 * 1
// LINES(JS_IR): 1 1 1 1 1 1 1 1 * 3 3 9 9 4 9 6 9 7 9 11 11 12 12 15 15 25 25 26 26 15 16 15 17 16 18 16 20 20 21 21 22 22 * 1
// LINES(ClassicFrontend JS_IR): 1 1 1 1 1 1 1 1 * 3 3 9 9 4 9 6 9 7 9 11 11 12 12 15 15 25 25 26 26 15 16 15 17 16 18 16 20 20 21 21 22 22 * 1
// LINES(FIR JS_IR): 1 1 1 1 1 1 1 1 * 3 3 9 9 4 5 9 6 7 11 11 12 12 15 15 25 25 26 26 15 16 15 17 18 20 20 21 21 22 22 * 1
@@ -32,5 +32,5 @@ inline operator fun P.component1() = a
inline operator fun P.component2() = b
// LINES(JS): 15 22 17 17 31 18 18 33 20 20 21 21 22 22 3 23 9 9 9 9 4 9 9 9 6 6 31 7 7 33 11 11 12 12 15 15 25 27 26 26 29 29 29 * 31 31 31 33 33 33 * 1 * 1
// LINES(JS_IR): 1 1 1 1 1 1 1 1 * 3 3 9 9 4 9 * 6 31 9 * 7 33 9 11 11 12 12 15 15 25 25 26 26 29 29 29 29 29 29 29 29 29 29 29 29 31 31 31 31 33 33 33 33 15 16 15 * 17 31 16 * 18 33 16 20 20 21 21 22 22 * 1
// LINES(ClassicFrontend JS_IR): 1 1 1 1 1 1 1 1 * 3 3 9 9 4 9 * 6 31 9 * 7 33 9 11 11 12 12 15 15 25 25 26 26 29 29 29 29 29 29 29 29 29 29 29 29 31 31 31 31 33 33 33 33 15 16 15 * 17 31 16 * 18 33 16 20 20 21 21 22 22 * 1
// LINES(FIR JS_IR): 1 1 1 1 1 1 1 1 * 3 3 9 9 4 5 9 * 6 31 6 * 7 33 7 11 11 12 12 15 15 25 25 26 26 29 29 29 29 29 29 29 29 29 29 29 29 31 31 31 31 33 33 33 33 15 16 15 * 17 31 17 * 18 33 18 20 20 21 21 22 22 * 1
@@ -13,5 +13,4 @@ fun box() {
)
}
// LINES(JS): 1 14 8 8 7 3 2 2 3 3 3 8 8 11 11 * 3 7 12 3 3 4 4
// LINES(JS_IR): 1 1 2 3 3 4 4 * 8 8 8 8 11 11 * 7 12
// LINES(JS_IR): 1 1 2 3 3 4 4 * 8 8 8 8 11 11 * 7 12
-1
View File
@@ -9,5 +9,4 @@ fun box(x: String?) {
fun foo() = "bar"
// LINES(JS): 3 8 7 7 4 4 4 5 5 7 7 7 7 * 5 4 5 10 10 10 * 1 * 1
// LINES(JS_IR): 1 1 1 1 1 1 1 1 * 3 3 4 * 5 5 * 7 7 7 * 5 4 4 10 10 10 10 * 1
@@ -6,5 +6,4 @@ enum class Foo {
}
}
// LINES(JS): 1 1 1 1 1 1 1 1 1 2 2 4 * 2 2 2 2 4 4 5 5 * 4 4 4 4 4 4 4 * 1 1 1 * 1 1 1 1 1 1
// LINES(JS_IR): 4 4 * 5 5 5 5 5 * 1 * 1 1 * 1 * 1 1
// LINES(JS_IR): 4 4 * 5 5 5 5 5 * 1 * 1 1 * 1 * 1 1
+1 -2
View File
@@ -10,5 +10,4 @@ enum class E {
}
}
// LINES(JS): 1 1 1 1 1 1 1 1 1 2 2 4 8 * 2 2 2 2 4 4 4 5 5 5 * 4 4 4 4 8 8 8 9 9 9 * 8 8 8 8 * 1 1 1 * 1 1 1 1 1 1 1 1 1 1
// LINES(JS_IR): 4 4 * 5 5 5 * 8 8 * 9 9 9 * 1 * 1 1 * 1 * 1 1
// LINES(JS_IR): 4 4 * 5 5 5 * 8 8 * 9 9 9 * 1 * 1 1 * 1 * 1 1
@@ -4,5 +4,4 @@ fun box() =
fun foo() =
23
// LINES(JS): 1 2 2 4 5 5
// LINES(JS_IR): 1 2 2 2 4 5 5 5
+1 -2
View File
@@ -17,6 +17,5 @@ fun box() {
}
}
// LINES(JS): 1 18 2 2 10 2 2 2 2 2 2 3 3 6 6 6 6 7 7 10 10 10 10 10 10 11 11 14 14 15 15 15 15 16 16
// LINES(JS_IR): 1 1 * 2 2 2 2 2 2 2 2 3 3 6 6 6 6 6 6 6 7 7 10 10 10 10 11 11 14 15 15 15 15 15 15 15 15 16 16
// LINES(JS_IR): 1 1 * 2 2 2 2 2 2 2 2 3 3 6 6 6 6 6 6 6 7 7 10 10 10 10 11 11 14 15 15 15 15 15 15 15 15 16 16
+1 -2
View File
@@ -8,5 +8,4 @@ fun foo(x: Int) {
println(y)
}
// LINES(JS): 1 9 2 2 3 3 4 4 5 5 6 6 7 7 8 8
// LINES(JS_IR): 1 1 2 3 3 4 4 5 5 6 6 7 7 8 8
// LINES(JS_IR): 1 1 2 3 3 4 4 5 5 6 6 7 7 8 8
@@ -11,5 +11,4 @@ inline fun foo(x: Int) {
fun bar() = 23
// LINES(JS): 3 5 4 4 8 8 9 9 7 10 8 8 9 9 12 12 12 * 1 * 1
// LINES(JS_IR): 1 1 1 1 1 1 1 1 * 3 3 * 4 8 8 9 9 7 7 8 8 9 9 12 12 12 12 * 1
@@ -9,5 +9,4 @@ fun bar() {
foo(42)
}
// LINES(JS): 1 1 1 1 1 6 2 2 3 3 4 4 8 10 2 2 9 2 3 3 4 4
// LINES(JS_IR): 1 1 2 3 3 3 4 4 8 8 * 2 9 2 3 3 3 4 4
// LINES(JS_IR): 1 1 2 3 3 3 4 4 8 8 * 2 9 2 3 3 3 4 4
@@ -8,8 +8,7 @@ inline fun foo(x: String) {
println("foo2($x);")
}
// LINES(JS): 6 6 6 6 6 9 7 7 8 8
// LINES(JS_IR): 6 6 7 7 8 8
// LINES(JS_IR): 6 6 7 7 8 8
// MODULE: main(lib)
// FILE: main.kt
@@ -22,5 +21,4 @@ fun box() {
foo("42")
}
// LINES(JS): 6 20 23 7 7 21 7 8 8 21 8 7 7 22 7 8 8 22 8
// LINES(JS_IR): 20 20 * 7 7 8 7 8 8 * 7 7 8 7 8 8
// LINES(JS_IR): 19 19 * 7 7 8 7 8 8 * 7 7 8 7 8 8
+1 -2
View File
@@ -21,5 +21,4 @@ fun bar(x: Int) {
println("%")
}
// LINES(JS): 1 1 1 1 1 1 1 1 1 17 2 2 3 3 4 7 7 9 9 10 10 11 14 14 16 16 19 22 20 20 20 20 17 2 2 3 3 4 3 7 7 9 9 10 10 11 10 14 14 16 16 20 21 21
// LINES(JS_IR): 1 1 2 2 2 3 3 4 7 7 9 9 9 10 10 11 14 14 16 16 19 19 * 20 * 20 2 2 2 3 3 4 * 7 7 9 9 9 10 10 11 * 14 14 16 16 20 20 21 21
// LINES(JS_IR): 1 1 2 2 2 3 3 4 7 7 9 9 9 10 10 11 14 14 16 16 19 19 * 20 * 20 2 2 2 3 3 4 * 7 7 9 9 9 10 10 11 * 14 14 16 16 20 20 21 21
+1 -2
View File
@@ -11,5 +11,4 @@ inline fun bar() {
println("bar2")
}
// LINES(JS): 1 7 2 2 10 10 11 11 4 4 10 10 11 11 6 6 9 9 9 9 9 12 10 10 11 11
// LINES(JS_IR): 1 1 2 2 * 10 10 11 11 4 4 * 10 10 11 11 6 6 9 9 10 10 11 11
// LINES(JS_IR): 1 1 2 2 * 10 10 11 11 4 4 * 10 10 11 11 6 6 9 9 10 10 11 11
@@ -16,5 +16,4 @@ inline fun foo(f: () -> Unit) {
println("after")
}
// LINES(JS): 1 11 2 2 14 14 4 4 16 16 6 6 14 14 8 8 16 16 10 10 13 13 13 13 13 17 14 14 15 15 16 16
// LINES(JS_IR): 1 1 2 2 * 14 14 * 4 4 16 16 6 6 * 14 14 * 8 8 16 16 10 10 13 13 14 14 15 15 16 16
// LINES(JS_IR): 1 1 2 2 * 14 14 * 4 4 16 16 6 6 * 14 14 * 8 8 16 16 10 10 13 13 14 14 15 15 16 16
+1 -2
View File
@@ -6,5 +6,4 @@ class A(val x: Int) {
}
}
// LINES(JS): 1 1 2 2 3 5 4 4
// LINES(JS_IR): 2 2 2 2 3 4 4 1 1 1 1 1 1 1
// LINES(JS_IR): 2 2 2 2 3 4 4 1 1 1 1 1 1 1
+1 -2
View File
@@ -11,5 +11,4 @@ inline fun foo(): Boolean {
return true
}
// LINES(JS): 3 7 4 4 4 10 10 4 11 4 5 5 9 12 10 10 11 11 * 1 * 1
// LINES(JS_IR): 1 1 1 1 1 1 1 1 * 3 3 * 4 4 * 10 10 11 4 4 4 5 5 9 9 10 10 11 11 * 1
// LINES(JS_IR): 1 1 1 1 1 1 1 1 * 3 3 * 4 4 * 10 10 11 4 4 4 5 5 9 9 10 10 11 11 * 1
+1 -4
View File
@@ -5,7 +5,4 @@ fun foo() {
println("after: $x")
}
// DONT_TARGET_EXACT_BACKEND: JS_IR
// ^There is a better stepping test
// LINES(JS): 1 6 2 2 3 3 4 4 5 5
// LINES(JS_IR): 1 1 2 3 3 4 4 5 5
+1 -2
View File
@@ -4,5 +4,4 @@ fun foo(x: Int): () -> Unit = {
fun bar() = 23
// LINES(JS): 1 1 1 3 2 2 3 3 1 1 1 5 5 5
// LINES(JS_IR): 1 1 3 3 1 5 5 5 5 1 1 1 2 2 3 3
// LINES(JS_IR): 1 1 3 3 1 5 5 5 5 1 1 1 2 2 3 3
@@ -24,5 +24,4 @@ fun baz() = "baz"
fun boo() = "boo"
// LINES(JS): 1 17 9 4 6 6 7 7 3 3 3 * 13 12 13 13 14 19 21 20 20 23 23 23 25 25 25
// LINES(JS_IR): 1 1 * 4 * 6 7 * 13 12 13 19 19 20 20 23 23 23 23 25 25 25 25
// LINES(JS_IR): 1 1 * 4 * 6 7 * 13 12 13 19 19 20 20 23 23 23 23 25 25 25 25
+1 -2
View File
@@ -26,5 +26,4 @@ fun bar(vararg x: Any?) {
println(x)
}
// LINES(JS): 1 2 22 3 4 5 6 7 8 9 10 13 14 15 16 17 18 19 20 * 25 27 26 26
// LINES(JS_IR): 1 1 2 3 4 5 6 7 8 9 10 13 14 15 16 17 18 19 20 25 25 26 26
// LINES(JS_IR): 1 1 2 3 4 5 6 7 8 9 10 13 14 15 16 17 18 19 20 25 25 26 26
+1 -2
View File
@@ -5,5 +5,4 @@ fun foo() {
0L)
}
// LINES(JS): 3 * 5 1 6 2 4
// LINES(JS_IR): 1 1 2 3 4 5
// LINES(JS_IR): 1 1 2 3 4 5
@@ -10,5 +10,4 @@ class B : A() {
}
}
// LINES(JS): 1 2 2 2 2 2 2 2 2 2 4 4 4 * 7 7 8 10 9 9
// LINES(JS_IR): 1 1 2 2 2 2 2 * 4 4 4 7 7 7 8 9 9
// LINES(JS_IR): 1 1 2 2 2 2 2 * 4 4 4 7 7 7 8 9 9
@@ -12,5 +12,4 @@ object O {
val y = 23
}
// LINES(JS): 1 9 2 2 3 3 4 4 6 6 7 7 8 8 11 11 12 12 * 11 11 11 11 11 11
// LINES(JS_IR): 1 1 2 2 3 3 4 4 6 6 7 7 8 8 11 11 * 12 12 12 12 12
// LINES(JS_IR): 1 1 2 2 3 3 4 4 6 6 7 7 8 8 11 11 * 12 12 12 12 12
@@ -4,5 +4,4 @@ fun foo() {
println("foo")
}
// LINES(JS): 1 1 * 1 1 1 1 1 1 3 5 4 4
// LINES(JS_IR): 1 1 * 3 3 4 4
// LINES(JS_IR): 1 1 * 3 3 4 4
+1 -2
View File
@@ -7,5 +7,4 @@ fun box(
println(y)
}
// LINES(JS): 1 8 2 2 2 2 3 3 3 4 6 6 7 7
// LINES(JS_IR): 1 2 3 5 2 4 6 6 7 7
// LINES(JS_IR): 1 2 3 5 2 4 6 6 7 7
@@ -1,13 +1,14 @@
open class A {
abstract class A {
val x: Int
open val y: Int
abstract val y: Int
init {
x = 23
y = 42
}
}
// LINES(JS): 1 2 4 7 7 8 8 4 4 4
// LINES(JS_IR): 1 1 7 7 8 8 2 2 2 4 4 4
class B(override val y: Int): A()
// LINES(JS_IR): 1 1 7 7 2 2 2 12 12 12 12 12 12 12 12
+1 -2
View File
@@ -3,5 +3,4 @@ fun box() {
println("bar")
}
// LINES(JS): 1 4 2 2 3 3
// LINES(JS_IR): 1 1 2 2 3 3
// LINES(JS_IR): 1 1 2 2 3 3
+1 -2
View File
@@ -4,5 +4,4 @@ fun box(x: Int): String {
"suffix"
}
// LINES(JS): 1 5 2 2 3 4
// LINES(JS_IR): 1 1 2 2 3 4
// LINES(JS_IR): 1 1 2 2 3 4
@@ -25,5 +25,4 @@ class C : A {
)
}
// LINES(JS): 1 1 3 * 1 1 1 1 1 1 7 * 9 10 11 * 15 15 16 17 14 19 15 15 22 22 23 24 22 22
// LINES(JS_IR): 1 1 * 3 * 7 7 9 9 10 11 15 15 16 17 15 19 * 15 15 * 22 23 24 23 * 22 * 14
// LINES(JS_IR): 1 1 * 3 * 7 7 9 9 10 11 15 15 16 17 15 19 * 15 15 * 22 23 24 23 * 22 * 14
@@ -8,5 +8,4 @@ enum class E {
}
}
// LINES(JS): 1 1 1 1 1 1 1 1 1 2 2 3 3 4 * 2 2 2 2 * 3 3 3 3 4 4 4 6 6 * 4 4 4 4 * 1 1 1 * 1 1 1 1 1 1 1 1 1 1
// LINES(JS_IR): 4 4 * 6 6 * 1 * 1 1 * 1 * 1 1
// LINES(JS_IR): 4 4 * 6 6 * 1 * 1 1 * 1 * 1 1
+1 -2
View File
@@ -7,5 +7,4 @@ fun foo() {
A(23, "foo")
}
// LINES(JS): 1 2 3 * 6 8 7 7
// LINES(JS_IR): 1 2 3 1 2 2 3 3 2 2 2 3 3 3 6 6 7 7
// LINES(JS_IR): 1 2 3 1 2 2 3 3 2 2 2 3 3 3 6 6 7 7
@@ -18,5 +18,5 @@ fun box(x: Int) {
)
}
// LINES(JS): 1 19 4 4 3 3 4 6 9 9 6 11 13 13 11 16 16 3 2
// LINES(JS_IR): 1 1 2 8 7 6 4 6 7 4 7 8 4 8 9 12 11 4 11 12 4 12 13 16
// LINES(ClassicFrontend JS_IR): 1 1 2 8 7 6 4 6 7 4 7 8 4 8 9 12 11 4 11 12 4 12 13 16
// LINES(FIR JS_IR): 1 1 2 6 4 6 7 4 7 8 4 8 9 11 4 11 12 4 12 13 16
@@ -28,5 +28,5 @@ fun four() = 4
fun five() = 5
// LINES(JS): 1 19 4 4 3 6 4 6 4 7 4 8 9 9 11 4 11 4 12 13 13 16 16 2 21 21 21 23 23 23 25 25 25 27 27 27 29 29 29
// LINES(JS_IR): 1 1 2 8 7 6 4 6 7 4 7 8 4 8 9 12 11 4 11 12 4 12 13 16 21 21 21 21 23 23 23 23 25 25 25 25 27 27 27 27 29 29 29 29
// LINES(ClassicFrontend JS_IR): 1 1 2 8 7 6 4 6 7 4 7 8 4 8 9 12 11 4 11 12 4 12 13 16 21 21 21 21 23 23 23 23 25 25 25 25 27 27 27 27 29 29 29 29
// LINES(FIR JS_IR): 1 1 2 6 4 6 7 4 7 8 4 8 9 11 4 11 12 4 12 13 16 21 21 21 21 23 23 23 23 25 25 25 25 27 27 27 27 29 29 29 29
+1 -2
View File
@@ -13,5 +13,4 @@ fun foo(): Int = 23
fun bar(): IntRange = 1000..2000
// LINES(JS): 1 10 2 2 2 2 3 3 4 4 5 5 6 6 7 7 8 8 12 12 12 14 14 14
// LINES(JS_IR): 1 1 2 3 3 4 4 5 5 6 6 7 7 7 7 8 8 12 12 12 12 14 14 14 14
// LINES(JS_IR): 1 1 2 3 3 4 4 5 5 6 6 7 7 7 7 8 8 12 12 12 12 14 14 14 14
+1 -2
View File
@@ -13,5 +13,4 @@ open class A
open class B : A()
// LINES(JS): 1 10 2 2 2 2 3 3 4 4 5 5 6 6 8 8 12 * 14 14
// LINES(JS_IR): 1 1 2 3 3 4 4 5 5 6 6 8 8 12 12 14 14 14
// LINES(JS_IR): 1 1 2 3 3 4 4 5 5 6 6 8 8 12 12 14 14 14
@@ -12,5 +12,4 @@ fun box() {
}
}
// LINES(JS): 1 13 5 5 4 2 2 3 5 5 8 8 * 3 4 9 3 11 11
// LINES(JS_IR): 1 1 2 * 3 * 5 5 5 5 8 8 * 4 9 * 11 11
// LINES(JS_IR): 1 1 2 * 3 * 5 5 5 5 8 8 * 4 9 * 11 11