diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/CacheUpdater.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/CacheUpdater.kt index f67ffa3da66..2e13aa9d149 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/CacheUpdater.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/CacheUpdater.kt @@ -255,7 +255,7 @@ class CacheUpdater( symbolCanBeExported = true } if (symbolCanBeExported) { - idSignatureToFile[signature] = IdSignatureSource(libFile, KotlinSourceFile(fileDeserializer.file), symbol) + idSignatureToFile[signature] = IdSignatureSource(libFile, fileDeserializer.file, symbol) } } @@ -276,12 +276,12 @@ class CacheUpdater( ) { val allImportedSignatures = addParentSignatures(maybeImportedSignatures, idSignatureToFile, libFile, srcFile) for (importedSignature in allImportedSignatures) { - val (dependencyLib, dependencyFile) = idSignatureToFile[importedSignature] ?: continue + val dependency = idSignatureToFile[importedSignature] ?: continue signatureHashCalculator[importedSignature]?.also { signatureHash -> - addDirectDependency(dependencyLib, dependencyFile, importedSignature, signatureHash) - } ?: notFoundIcError("signature $importedSignature hash", dependencyLib, dependencyFile) + addDirectDependency(dependency.lib, dependency.src, importedSignature, signatureHash) + } ?: notFoundIcError("signature $importedSignature hash", dependency.lib, dependency.src) - updatedMetadata[dependencyLib, dependencyFile]?.also { dependencyMetadata -> + updatedMetadata[dependency.lib, dependency.src]?.also { dependencyMetadata -> dependencyMetadata.addInverseDependency(libFile, srcFile, importedSignature) } } diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/HashCalculatorForIC.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/HashCalculatorForIC.kt index e06688470f7..94405309830 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/HashCalculatorForIC.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/HashCalculatorForIC.kt @@ -59,6 +59,10 @@ private class HashCalculatorForIC { ) } + fun updateAnnotationContainer(annotationContainer: IrAnnotationContainer) { + updateForEach(annotationContainer.annotations, ::update) + } + inline fun updateForEach(collection: Collection, f: (T) -> Unit) { update(collection.size) collection.forEach { f(it) } @@ -112,6 +116,10 @@ internal fun IrSimpleFunction.irSimpleFunctionHashForIC() = HashCalculatorForIC( it.update(this) }.finalize() +internal fun IrAnnotationContainer.irAnnotationContainerHashForIC() = HashCalculatorForIC().also { + it.updateAnnotationContainer(this) +}.finalize() + internal fun IrSymbol.irSymbolHashForIC() = HashCalculatorForIC().also { it.update(toString()) // symbol rendering prints very little information about type parameters @@ -128,11 +136,7 @@ internal fun IrSymbol.irSymbolHashForIC() = HashCalculatorForIC().also { it.update(functionParam.defaultValue?.let { 1 } ?: 0) } } - (owner as? IrAnnotationContainer)?.let { annotationContainer -> - it.updateForEach(annotationContainer.annotations) { annotation -> - it.update(annotation) - } - } + (owner as? IrAnnotationContainer)?.let(it::updateAnnotationContainer) }.finalize() internal fun String.stringHashForIC() = HashCalculatorForIC().also { it.update(this) }.finalize() diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/IdSignatureHashCalculator.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/IdSignatureHashCalculator.kt index 82dc5f140e9..f7ca006d9b1 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/IdSignatureHashCalculator.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/IdSignatureHashCalculator.kt @@ -25,27 +25,39 @@ internal class IdSignatureHashCalculator { private val inlineFunctionCallGraph = hashMapOf>() private val processingFunctions = hashSetOf() private val functionTransitiveHashes = hashMapOf() + private val fileAnnotationHashes = hashMapOf() private val allIdSignatureHashes = hashMapOf() + private val IrFile.annotationsHash: ICHash + get() = fileAnnotationHashes.getOrPut(this, ::irAnnotationContainerHashForIC) private inner class FlatHashCalculator : IrElementVisitorVoid { + private var fileAnnotationsHash = ICHash() + override fun visitElement(element: IrElement) { element.acceptChildrenVoid(this) } + override fun visitFile(declaration: IrFile, data: Nothing?) { + fileAnnotationsHash = declaration.annotationsHash + declaration.acceptChildrenVoid(this) + } + override fun visitSimpleFunction(declaration: IrSimpleFunction) { if (declaration.isInline) { if (declaration in flatHashes) { return } - flatHashes[declaration] = if (declaration.isFakeOverride) { + val inlineFunctionFlatHash = if (declaration.isFakeOverride) { declaration.resolveFakeOverride()?.irSimpleFunctionHashForIC() ?: icError("can not resolve fake override for ${declaration.render()}") } else { declaration.irSimpleFunctionHashForIC() } + + flatHashes[declaration] = fileAnnotationsHash.combineWith(inlineFunctionFlatHash) } // go deeper since local inline special declarations (like a reference adaptor) may appear declaration.acceptChildrenVoid(this) @@ -120,7 +132,8 @@ internal class IdSignatureHashCalculator { fun addAllSignatureSymbols(idSignatureToFile: Map) { for ((signature, signatureSrc) in idSignatureToFile) { if (signature !in allIdSignatureHashes) { - allIdSignatureHashes[signature] = signatureSrc.symbol.irSymbolHashForIC() + val fileAnnotationsHash = signatureSrc.srcIrFile.annotationsHash + allIdSignatureHashes[signature] = fileAnnotationsHash.combineWith(signatureSrc.symbol.irSymbolHashForIC()) } } } diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/IdSignatureSource.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/IdSignatureSource.kt index 39fcd2619d1..eae2c372591 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/IdSignatureSource.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/IdSignatureSource.kt @@ -11,7 +11,14 @@ import org.jetbrains.kotlin.ir.symbols.IrSymbol import org.jetbrains.kotlin.ir.util.IdSignature import org.jetbrains.kotlin.ir.util.resolveFakeOverride -internal data class IdSignatureSource(val lib: KotlinLibraryFile, val src: KotlinSourceFile, val symbol: IrSymbol) +internal class IdSignatureSource( + val lib: KotlinLibraryFile, + val srcIrFile: IrFile, + val symbol: IrSymbol +) { + val src: KotlinSourceFile + get() = KotlinSourceFile(srcIrFile) +} internal fun addParentSignatures( signatures: Collection, diff --git a/js/js.tests/test/org/jetbrains/kotlin/incremental/AbstractInvalidationTest.kt b/js/js.tests/test/org/jetbrains/kotlin/incremental/AbstractInvalidationTest.kt index 21031ad952b..6f8a037a1d4 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/incremental/AbstractInvalidationTest.kt +++ b/js/js.tests/test/org/jetbrains/kotlin/incremental/AbstractInvalidationTest.kt @@ -29,6 +29,8 @@ import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImpl import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImplForJsIC import org.jetbrains.kotlin.ir.symbols.IrSymbol import org.jetbrains.kotlin.js.config.JSConfigurationKeys +import org.jetbrains.kotlin.js.test.converters.ClassicJsBackendFacade +import org.jetbrains.kotlin.js.test.utils.MODULE_EMULATION_FILE import org.jetbrains.kotlin.js.testOld.V8IrJsTestChecker import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.KtFile @@ -49,9 +51,9 @@ abstract class AbstractInvalidationTest : KotlinTestWithEnvironment() { private const val BOX_FUNCTION_NAME = "box" private const val STDLIB_MODULE_NAME = "kotlin-kotlin-stdlib-js-ir" - private val KT_FILE_IGNORE_PATTERN = Regex("^.*\\..+\\.kt$") + private val TEST_FILE_IGNORE_PATTERN = Regex("^.*\\..+\\.\\w\\w$") - private val JS_MODULE_KIND = ModuleKind.PLAIN + private val JS_MODULE_KIND = ModuleKind.COMMON_JS } override fun createEnvironment(): KotlinCoreEnvironment { @@ -66,6 +68,9 @@ abstract class AbstractInvalidationTest : KotlinTestWithEnvironment() { return ModuleInfoParser(infoFile).parse(moduleName) } + private val File.filesInDir + get() = listFiles() ?: error("cannot retrieve the file list for $absolutePath directory") + protected fun doTest(testPath: String) { val testDirectory = File(testPath) val testName = testDirectory.name @@ -84,10 +89,11 @@ abstract class AbstractInvalidationTest : KotlinTestWithEnvironment() { val workingDir = testWorkingDir(projectInfo.name) val sourceDir = File(workingDir, "sources").also { it.invalidateDir() } val buildDir = File(workingDir, "build").also { it.invalidateDir() } + val jsDir = File(workingDir, "js").also { it.invalidateDir() } initializeWorkingDir(projectInfo, testDirectory, sourceDir, buildDir) - ProjectStepsExecutor(projectInfo, modulesInfos, testDirectory, sourceDir, buildDir).execute() + ProjectStepsExecutor(projectInfo, modulesInfos, testDirectory, sourceDir, buildDir, jsDir).execute() } private fun resolveModuleArtifact(moduleName: String, buildDir: File): File { @@ -121,7 +127,8 @@ abstract class AbstractInvalidationTest : KotlinTestWithEnvironment() { private val moduleInfos: Map, private val testDir: File, private val sourceDir: File, - private val buildDir: File + private val buildDir: File, + private val jsDir: File ) { private inner class TestStepInfo( val moduleName: String, @@ -214,26 +221,46 @@ abstract class AbstractInvalidationTest : KotlinTestWithEnvironment() { } } - fun writeJsFile(name: String, text: String): String { - val file = File(buildDir, "$name.js") + private fun File.writeAsJsModule(jsCode: String, moduleName: String) { + writeText(ClassicJsBackendFacade.wrapWithModuleEmulationMarkers(jsCode, JS_MODULE_KIND, moduleName)) + } + + private fun writeJsFile(name: String, text: String): String { + val moduleFileName = "./$name.js" + val file = File(jsDir, moduleFileName) if (file.exists()) { file.delete() } - file.writeText(text) + file.writeAsJsModule(text, moduleFileName) return file.canonicalPath } + private fun prepareExternalJsFiles(): MutableList { + jsDir.invalidateDir() + return testDir.filesInDir.mapNotNullTo(mutableListOf(MODULE_EMULATION_FILE)) { file -> + file.takeIf { it.name.isAllowedJsFile() }?.readText()?.let { jsCode -> + val externalModule = jsDir.resolve(file.name) + externalModule.writeAsJsModule(jsCode, file.nameWithoutExtension) + externalModule.canonicalPath + } + } + } + + private fun verifyJsCode(stepId: Int, mainModuleName: String, jsOutput: CompilationOutputs) { - val files = jsOutput.dependencies.map { writeJsFile(it.first, it.second.jsCode) } + writeJsFile(mainModuleName, jsOutput.jsCode) + val files = prepareExternalJsFiles() + jsOutput.dependencies.mapTo(files) { writeJsFile(it.first, it.second.jsCode) } + files += writeJsFile(mainModuleName, jsOutput.jsCode) + try { V8IrJsTestChecker.checkWithTestFunctionArgs( files = files, - testModuleName = mainModuleName, + testModuleName = "./$mainModuleName.js", testPackageName = null, testFunctionName = BOX_FUNCTION_NAME, testFunctionArgs = "$stepId", expectedResult = "OK", - withModuleSystem = false + withModuleSystem = true ) } catch (e: ComparisonFailure) { throw ComparisonFailure("Mismatched box out at step $stepId", e.expected, e.actual) @@ -298,7 +325,9 @@ abstract class AbstractInvalidationTest : KotlinTestWithEnvironment() { } } - private fun String.isAllowedKtFile() = endsWith(".kt") && !KT_FILE_IGNORE_PATTERN.matches(this) + private fun String.isAllowedKtFile() = endsWith(".kt") && !TEST_FILE_IGNORE_PATTERN.matches(this) + + private fun String.isAllowedJsFile() = endsWith(".js") && !TEST_FILE_IGNORE_PATTERN.matches(this) private fun File.filteredKtFiles(): Collection { assert(isDirectory && exists()) @@ -377,11 +406,10 @@ abstract class AbstractInvalidationTest : KotlinTestWithEnvironment() { File(buildDir, module).invalidateDir() val testModuleDir = File(testDir, module) - testModuleDir.listFiles { _, fileName -> fileName.isAllowedKtFile() }!!.forEach { file -> - assert(!file.isDirectory) - val fileName = file.name - val workingFile = File(moduleSourceDir, fileName) - file.copyTo(workingFile) + testModuleDir.filesInDir.forEach { file -> + if (file.name.isAllowedKtFile()) { + file.copyTo(moduleSourceDir.resolve(file.name)) + } } } } diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/utils/RunnerUtils.kt b/js/js.tests/test/org/jetbrains/kotlin/js/test/utils/RunnerUtils.kt index cfc8a9a3791..15d9d7e9685 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/utils/RunnerUtils.kt +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/utils/RunnerUtils.kt @@ -29,7 +29,7 @@ import org.jetbrains.kotlin.test.services.configuration.JsEnvironmentConfigurato import org.jetbrains.kotlin.util.collectionUtils.filterIsInstanceAnd import java.io.File -private const val MODULE_EMULATION_FILE = "${JsEnvironmentConfigurator.TEST_DATA_DIR_PATH}/moduleEmulation.js" +const val MODULE_EMULATION_FILE = "${JsEnvironmentConfigurator.TEST_DATA_DIR_PATH}/moduleEmulation.js" fun TestModule.getNameFor(filePath: String, testServices: TestServices): String { return JsEnvironmentConfigurator.getJsArtifactSimpleName(testServices, name) + "-js-" + filePath diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/incremental/InvalidationTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/incremental/InvalidationTestGenerated.java index 1611f4d6884..7ded48941e5 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/incremental/InvalidationTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/incremental/InvalidationTestGenerated.java @@ -250,6 +250,11 @@ public class InvalidationTestGenerated extends AbstractInvalidationTest { runTest("js/js.translator/testData/incremental/invalidation/moveAndModifyInlineFunction/"); } + @TestMetadata("moveExternalDeclarationsBetweenJsModules") + public void testMoveExternalDeclarationsBetweenJsModules() throws Exception { + runTest("js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/"); + } + @TestMetadata("moveFilesBetweenModules") public void testMoveFilesBetweenModules() throws Exception { runTest("js/js.translator/testData/incremental/invalidation/moveFilesBetweenModules/"); diff --git a/js/js.translator/testData/incremental/invalidation/jsModuleAnnotation/main/module.info b/js/js.translator/testData/incremental/invalidation/jsModuleAnnotation/main/module.info index 5d087aa0643..40f51a44840 100644 --- a/js/js.translator/testData/incremental/invalidation/jsModuleAnnotation/main/module.info +++ b/js/js.translator/testData/incremental/invalidation/jsModuleAnnotation/main/module.info @@ -3,3 +3,4 @@ STEP 0: added file: m.kt STEP 1: dependencies: lib1 + updated imports: m.kt diff --git a/js/js.translator/testData/incremental/invalidation/jsModuleAnnotation/project.info b/js/js.translator/testData/incremental/invalidation/jsModuleAnnotation/project.info index 425cf7cc77f..a506eed60e3 100644 --- a/js/js.translator/testData/incremental/invalidation/jsModuleAnnotation/project.info +++ b/js/js.translator/testData/incremental/invalidation/jsModuleAnnotation/project.info @@ -1,8 +1,5 @@ MODULES: lib1, main -STEP 0: +STEP 0..1: libs: lib1, main dirty js: lib1, main -STEP 1: - libs: lib1, main - dirty js: lib1 diff --git a/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/js-module-a-new.js b/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/js-module-a-new.js new file mode 100644 index 00000000000..4c1d7837e93 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/js-module-a-new.js @@ -0,0 +1,8 @@ +(function (_) { + 'use strict'; + function externalDemoFunction() { return 3; } + + _.externalDemoFunction = externalDemoFunction; + + return _ +}(module.exports)); diff --git a/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/js-module-a.js b/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/js-module-a.js new file mode 100644 index 00000000000..3b9bc6db208 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/js-module-a.js @@ -0,0 +1,8 @@ +(function (_) { + 'use strict'; + function externalDemoFunction() { return 0; } + + _.externalDemoFunction = externalDemoFunction; + + return _ +}(module.exports)); diff --git a/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/js-module-b-new.js b/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/js-module-b-new.js new file mode 100644 index 00000000000..c7dca748a00 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/js-module-b-new.js @@ -0,0 +1,8 @@ +(function (_) { + 'use strict'; + function externalDemoFunction() { return 2; } + + _.externalDemoFunction = externalDemoFunction; + + return _ +}(module.exports)); diff --git a/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/js-module-b.js b/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/js-module-b.js new file mode 100644 index 00000000000..eaeec4f76ad --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/js-module-b.js @@ -0,0 +1,8 @@ +(function (_) { + 'use strict'; + function externalDemoFunction() { return 1; } + + _.externalDemoFunction = externalDemoFunction; + + return _ +}(module.exports)); diff --git a/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/js-module-c-new.js b/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/js-module-c-new.js new file mode 100644 index 00000000000..84145f88d4c --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/js-module-c-new.js @@ -0,0 +1,8 @@ +(function (_) { + 'use strict'; + function externalDemoFunction() { return 5; } + + _.externalDemoFunction = externalDemoFunction; + + return _ +}(module.exports)); diff --git a/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/js-module-c.js b/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/js-module-c.js new file mode 100644 index 00000000000..ee3ae4c91fb --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/js-module-c.js @@ -0,0 +1,8 @@ +(function (_) { + 'use strict'; + function externalDemoFunction() { return 4; } + + _.externalDemoFunction = externalDemoFunction; + + return _ +}(module.exports)); diff --git a/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/lib1/JsModuleA.0.kt b/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/lib1/JsModuleA.0.kt new file mode 100644 index 00000000000..73c94819601 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/lib1/JsModuleA.0.kt @@ -0,0 +1,3 @@ +@file:JsModule("js-module-a") + +external fun externalDemoFunction(): Int diff --git a/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/lib1/JsModuleA.1.kt b/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/lib1/JsModuleA.1.kt new file mode 100644 index 00000000000..e79e03d690e --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/lib1/JsModuleA.1.kt @@ -0,0 +1 @@ +@file:JsModule("js-module-a") diff --git a/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/lib1/JsModuleA.4.kt b/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/lib1/JsModuleA.4.kt new file mode 100644 index 00000000000..3da971f302f --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/lib1/JsModuleA.4.kt @@ -0,0 +1,3 @@ +@file:JsModule("js-module-a-new") + +external fun externalDemoFunction(): Int diff --git a/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/lib1/JsModuleB.0.kt b/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/lib1/JsModuleB.0.kt new file mode 100644 index 00000000000..6e079973729 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/lib1/JsModuleB.0.kt @@ -0,0 +1 @@ +@file:JsModule("js-module-b") diff --git a/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/lib1/JsModuleB.1.kt b/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/lib1/JsModuleB.1.kt new file mode 100644 index 00000000000..8296e12bdf2 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/lib1/JsModuleB.1.kt @@ -0,0 +1,3 @@ +@file:JsModule("js-module-b") + +external fun externalDemoFunction(): Int diff --git a/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/lib1/JsModuleB.2.kt b/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/lib1/JsModuleB.2.kt new file mode 100644 index 00000000000..1dc98a774ed --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/lib1/JsModuleB.2.kt @@ -0,0 +1,3 @@ +@file:JsModule("js-module-b-new") + +external fun externalDemoFunction(): Int diff --git a/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/lib1/demo.0.kt b/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/lib1/demo.0.kt new file mode 100644 index 00000000000..dedf453dd68 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/lib1/demo.0.kt @@ -0,0 +1 @@ +fun demoFunction() = externalDemoFunction() diff --git a/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/lib1/demo.3.kt b/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/lib1/demo.3.kt new file mode 100644 index 00000000000..a2aa596597e --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/lib1/demo.3.kt @@ -0,0 +1 @@ +fun demoFunction() = -1 diff --git a/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/lib1/module.info b/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/lib1/module.info new file mode 100644 index 00000000000..d762c70ae3a --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/lib1/module.info @@ -0,0 +1,32 @@ +STEP 0: + modifications: + U : JsModuleA.0.kt -> JsModuleA.kt + U : JsModuleB.0.kt -> JsModuleB.kt + U : demo.0.kt -> demo.kt + added file: JsModuleA.kt, JsModuleB.kt, demo.kt +STEP 1: + modifications: + U : JsModuleA.1.kt -> JsModuleA.kt + U : JsModuleB.1.kt -> JsModuleB.kt + modified ir: JsModuleA.kt, JsModuleB.kt + updated imports: demo.kt +STEP 2: + modifications: + U : JsModuleB.2.kt -> JsModuleB.kt + modified ir: JsModuleB.kt + updated imports: demo.kt +STEP 3: + modifications: + U : demo.3.kt -> demo.kt + modified ir: demo.kt +STEP 4: + modifications: + U : JsModuleA.4.kt -> JsModuleA.kt + U : JsModuleB.0.kt -> JsModuleB.kt + modified ir: JsModuleA.kt, JsModuleB.kt +STEP 5: + modifications: + U : JsModuleA.1.kt -> JsModuleA.kt + modified ir: JsModuleA.kt + updated exports: JsModuleA.kt +STEP 6: diff --git a/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/lib2/JsModuleC.5.kt b/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/lib2/JsModuleC.5.kt new file mode 100644 index 00000000000..12d7ddcdaaa --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/lib2/JsModuleC.5.kt @@ -0,0 +1,3 @@ +@file:JsModule("js-module-c") + +external fun externalDemoFunction(): Int diff --git a/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/lib2/JsModuleC.6.kt b/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/lib2/JsModuleC.6.kt new file mode 100644 index 00000000000..5ddbe30958f --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/lib2/JsModuleC.6.kt @@ -0,0 +1,3 @@ +@file:JsModule("js-module-c-new") + +external fun externalDemoFunction(): Int diff --git a/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/lib2/module.info b/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/lib2/module.info new file mode 100644 index 00000000000..ad694fa2dc9 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/lib2/module.info @@ -0,0 +1,28 @@ +STEP 0: + dependencies: lib1 + modifications: + U : test.0.kt -> test.kt + added file: test.kt +STEP 1..2: + dependencies: lib1 +STEP 3: + dependencies: lib1 + modifications: + U : test.3.kt -> test.kt + modified ir: test.kt +STEP 4: + dependencies: lib1 + updated imports: test.kt +STEP 5: + dependencies: lib1 + modifications: + U : JsModuleC.5.kt -> JsModuleC.kt + added file: JsModuleC.kt + updated exports: JsModuleC.kt + updated imports: test.kt +STEP 6: + dependencies: lib1 + modifications: + U : JsModuleC.6.kt -> JsModuleC.kt + modified ir: JsModuleC.kt + updated imports: test.kt diff --git a/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/lib2/test.0.kt b/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/lib2/test.0.kt new file mode 100644 index 00000000000..bcb0e15bdf2 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/lib2/test.0.kt @@ -0,0 +1 @@ +fun testFunction() = demoFunction() diff --git a/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/lib2/test.3.kt b/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/lib2/test.3.kt new file mode 100644 index 00000000000..3d000b75630 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/lib2/test.3.kt @@ -0,0 +1 @@ +fun testFunction() = externalDemoFunction() + 1 diff --git a/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/main/m.kt b/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/main/m.kt new file mode 100644 index 00000000000..d989a9223c3 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/main/m.kt @@ -0,0 +1,7 @@ +fun box(stepId: Int): String { + val x = testFunction() + if (x != stepId) { + return "Fail: $x != $stepId" + } + return "OK" +} diff --git a/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/main/module.info b/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/main/module.info new file mode 100644 index 00000000000..666f53f4b98 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/main/module.info @@ -0,0 +1,5 @@ +STEP 0: + dependencies: lib1, lib2 + added file: m.kt +STEP 1..6: + dependencies: lib1, lib2 diff --git a/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/project.info b/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/project.info new file mode 100644 index 00000000000..92800dab180 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/moveExternalDeclarationsBetweenJsModules/project.info @@ -0,0 +1,14 @@ +MODULES: lib1, lib2, main + +STEP 0: + libs: lib1, lib2, main + dirty js: lib1, lib2, main +STEP 1..2: + libs: lib1, lib2, main + dirty js: lib1 +STEP 3..5: + libs: lib1, lib2, main + dirty js: lib1, lib2 +STEP 6: + libs: lib1, lib2, main + dirty js: lib2 diff --git a/js/js.translator/testData/incremental/invalidation/typeScriptExports/main/m.0.d.ts b/js/js.translator/testData/incremental/invalidation/typeScriptExports/main/m.0.d.ts index f21a537810e..45a34edce51 100644 --- a/js/js.translator/testData/incremental/invalidation/typeScriptExports/main/m.0.d.ts +++ b/js/js.translator/testData/incremental/invalidation/typeScriptExports/main/m.0.d.ts @@ -1,4 +1,2 @@ -declare namespace kotlin_main { - type Nullable = T | null | undefined - function box(stepId: number): string; -} +type Nullable = T | null | undefined +export declare function box(stepId: number): string; \ No newline at end of file diff --git a/js/js.translator/testData/incremental/invalidation/typeScriptExports/main/m.1.d.ts b/js/js.translator/testData/incremental/invalidation/typeScriptExports/main/m.1.d.ts index ae5543b84d1..1e983b862c3 100644 --- a/js/js.translator/testData/incremental/invalidation/typeScriptExports/main/m.1.d.ts +++ b/js/js.translator/testData/incremental/invalidation/typeScriptExports/main/m.1.d.ts @@ -1,5 +1,3 @@ -declare namespace kotlin_main { - type Nullable = T | null | undefined - function foo(): number; - function box(stepId: number): string; -} +type Nullable = T | null | undefined +export declare function foo(): number; +export declare function box(stepId: number): string; \ No newline at end of file diff --git a/js/js.translator/testData/incremental/invalidation/typeScriptExports/main/m.2.d.ts b/js/js.translator/testData/incremental/invalidation/typeScriptExports/main/m.2.d.ts index e6549bb92cd..2560e56401d 100644 --- a/js/js.translator/testData/incremental/invalidation/typeScriptExports/main/m.2.d.ts +++ b/js/js.translator/testData/incremental/invalidation/typeScriptExports/main/m.2.d.ts @@ -1,5 +1,3 @@ -declare namespace kotlin_main { - type Nullable = T | null | undefined - function bar(): number; - function box(stepId: number): string; -} +type Nullable = T | null | undefined +export declare function bar(): number; +export declare function box(stepId: number): string; \ No newline at end of file diff --git a/js/js.translator/testData/incremental/invalidation/typeScriptExports/main/m.3.d.ts b/js/js.translator/testData/incremental/invalidation/typeScriptExports/main/m.3.d.ts index 777e36daf24..f7a9fa47e65 100644 --- a/js/js.translator/testData/incremental/invalidation/typeScriptExports/main/m.3.d.ts +++ b/js/js.translator/testData/incremental/invalidation/typeScriptExports/main/m.3.d.ts @@ -1,10 +1,8 @@ -declare namespace kotlin_main { - type Nullable = T | null | undefined - function bar(): number; - class MyClass { - constructor(stepId: number); - get stepId(): number; - qux(): number; - } - function box(stepId: number): string; +type Nullable = T | null | undefined +export declare function bar(): number; +export declare class MyClass { + constructor(stepId: number); + get stepId(): number; + qux(): number; } +export declare function box(stepId: number): string; \ No newline at end of file diff --git a/js/js.translator/testData/incremental/invalidation/typeScriptExports/main/m.4.d.ts b/js/js.translator/testData/incremental/invalidation/typeScriptExports/main/m.4.d.ts index d68e54ecf96..b6f4c2c92c1 100644 --- a/js/js.translator/testData/incremental/invalidation/typeScriptExports/main/m.4.d.ts +++ b/js/js.translator/testData/incremental/invalidation/typeScriptExports/main/m.4.d.ts @@ -1,9 +1,7 @@ -declare namespace kotlin_main { - type Nullable = T | null | undefined - class MyClass { - constructor(stepId: number); - get stepId(): number; - qux(): number; - } - function box(stepId: number): string; +type Nullable = T | null | undefined +export declare class MyClass { + constructor(stepId: number); + get stepId(): number; + qux(): number; } +export declare function box(stepId: number): string; \ No newline at end of file diff --git a/js/js.translator/testData/incremental/invalidation/typeScriptExports/main/m.5.d.ts b/js/js.translator/testData/incremental/invalidation/typeScriptExports/main/m.5.d.ts index 5f9ff4fa1bf..b7a5de81263 100644 --- a/js/js.translator/testData/incremental/invalidation/typeScriptExports/main/m.5.d.ts +++ b/js/js.translator/testData/incremental/invalidation/typeScriptExports/main/m.5.d.ts @@ -1,9 +1,7 @@ -declare namespace kotlin_main { - type Nullable = T | null | undefined - class MyClass { - constructor(stepId: number); - get stepId(): number; - baz(): number; - } - function box(stepId: number): string; +type Nullable = T | null | undefined +export declare class MyClass { + constructor(stepId: number); + get stepId(): number; + baz(): number; } +export declare function box(stepId: number): string; \ No newline at end of file diff --git a/js/js.translator/testData/incremental/invalidation/typeScriptExports/main/m.6.d.ts b/js/js.translator/testData/incremental/invalidation/typeScriptExports/main/m.6.d.ts index 9cffc94b1eb..5b18bd9733c 100644 --- a/js/js.translator/testData/incremental/invalidation/typeScriptExports/main/m.6.d.ts +++ b/js/js.translator/testData/incremental/invalidation/typeScriptExports/main/m.6.d.ts @@ -1,9 +1,7 @@ -declare namespace kotlin_main { - type Nullable = T | null | undefined - class MyClass { - constructor(stepId: number); - get stepId(): number; - bar(): number; - } - function box(stepId: number): string; +type Nullable = T | null | undefined +export declare class MyClass { + constructor(stepId: number); + get stepId(): number; + bar(): number; } +export declare function box(stepId: number): string; \ No newline at end of file