From 252dc01dd5779b1f85840251320f6b6ca104ffef Mon Sep 17 00:00:00 2001 From: Alexander Korepanov Date: Fri, 23 Sep 2022 18:55:08 +0200 Subject: [PATCH] [JS IR] IC: Propagate dependencies from nested declaration to parent JsIrLinker can't load nested declarations, therefore it is required to load their parent. This patch adds a dependency in the incremental cache graph between nested declaration user and nested declaration parent. ^KT-53931 Fixed ^KT-54120 Fixed --- .../kotlin/ir/backend/js/ic/CacheUpdater.kt | 58 ++++++++++++++----- .../InvalidationTestGenerated.java | 15 +++++ .../companionInlineFunction/lib1/l1.0.kt | 5 ++ .../companionInlineFunction/lib1/l1.1.kt | 5 ++ .../companionInlineFunction/lib1/l1.2.kt | 7 +++ .../companionInlineFunction/lib1/l1.3.kt | 7 +++ .../companionInlineFunction/lib1/module.info | 19 ++++++ .../companionInlineFunction/lib2/l2.0.kt | 1 + .../companionInlineFunction/lib2/l2.2.kt | 1 + .../companionInlineFunction/lib2/l2.4.kt | 6 ++ .../companionInlineFunction/lib2/l2.5.kt | 6 ++ .../companionInlineFunction/lib2/module.info | 27 +++++++++ .../companionInlineFunction/main/m.kt | 8 +++ .../companionInlineFunction/main/module.info | 8 +++ .../companionInlineFunction/project.info | 8 +++ .../companionWithStdLibCall/lib1/l1.0.kt | 15 +++++ .../companionWithStdLibCall/lib1/l1.1.kt | 7 +++ .../companionWithStdLibCall/lib1/module.info | 13 +++++ .../companionWithStdLibCall/main/f.0.kt | 5 ++ .../companionWithStdLibCall/main/f.3.kt | 5 ++ .../companionWithStdLibCall/main/m.kt | 11 ++++ .../companionWithStdLibCall/main/module.info | 12 ++++ .../companionWithStdLibCall/project.info | 11 ++++ .../invalidation/nestedClass/lib1/l1.0.kt | 5 ++ .../invalidation/nestedClass/lib1/l1.1.kt | 5 ++ .../invalidation/nestedClass/lib1/l1.2.kt | 7 +++ .../invalidation/nestedClass/lib1/l1.3.kt | 7 +++ .../invalidation/nestedClass/lib1/l1.4.kt | 9 +++ .../invalidation/nestedClass/lib1/l1.5.kt | 9 +++ .../invalidation/nestedClass/lib1/l1.6.kt | 9 +++ .../invalidation/nestedClass/lib1/module.info | 28 +++++++++ .../invalidation/nestedClass/main/m.kt | 8 +++ .../invalidation/nestedClass/main/module.info | 18 ++++++ .../invalidation/nestedClass/project.info | 20 +++++++ 34 files changed, 372 insertions(+), 13 deletions(-) create mode 100644 js/js.translator/testData/incremental/invalidation/companionInlineFunction/lib1/l1.0.kt create mode 100644 js/js.translator/testData/incremental/invalidation/companionInlineFunction/lib1/l1.1.kt create mode 100644 js/js.translator/testData/incremental/invalidation/companionInlineFunction/lib1/l1.2.kt create mode 100644 js/js.translator/testData/incremental/invalidation/companionInlineFunction/lib1/l1.3.kt create mode 100644 js/js.translator/testData/incremental/invalidation/companionInlineFunction/lib1/module.info create mode 100644 js/js.translator/testData/incremental/invalidation/companionInlineFunction/lib2/l2.0.kt create mode 100644 js/js.translator/testData/incremental/invalidation/companionInlineFunction/lib2/l2.2.kt create mode 100644 js/js.translator/testData/incremental/invalidation/companionInlineFunction/lib2/l2.4.kt create mode 100644 js/js.translator/testData/incremental/invalidation/companionInlineFunction/lib2/l2.5.kt create mode 100644 js/js.translator/testData/incremental/invalidation/companionInlineFunction/lib2/module.info create mode 100644 js/js.translator/testData/incremental/invalidation/companionInlineFunction/main/m.kt create mode 100644 js/js.translator/testData/incremental/invalidation/companionInlineFunction/main/module.info create mode 100644 js/js.translator/testData/incremental/invalidation/companionInlineFunction/project.info create mode 100644 js/js.translator/testData/incremental/invalidation/companionWithStdLibCall/lib1/l1.0.kt create mode 100644 js/js.translator/testData/incremental/invalidation/companionWithStdLibCall/lib1/l1.1.kt create mode 100644 js/js.translator/testData/incremental/invalidation/companionWithStdLibCall/lib1/module.info create mode 100644 js/js.translator/testData/incremental/invalidation/companionWithStdLibCall/main/f.0.kt create mode 100644 js/js.translator/testData/incremental/invalidation/companionWithStdLibCall/main/f.3.kt create mode 100644 js/js.translator/testData/incremental/invalidation/companionWithStdLibCall/main/m.kt create mode 100644 js/js.translator/testData/incremental/invalidation/companionWithStdLibCall/main/module.info create mode 100644 js/js.translator/testData/incremental/invalidation/companionWithStdLibCall/project.info create mode 100644 js/js.translator/testData/incremental/invalidation/nestedClass/lib1/l1.0.kt create mode 100644 js/js.translator/testData/incremental/invalidation/nestedClass/lib1/l1.1.kt create mode 100644 js/js.translator/testData/incremental/invalidation/nestedClass/lib1/l1.2.kt create mode 100644 js/js.translator/testData/incremental/invalidation/nestedClass/lib1/l1.3.kt create mode 100644 js/js.translator/testData/incremental/invalidation/nestedClass/lib1/l1.4.kt create mode 100644 js/js.translator/testData/incremental/invalidation/nestedClass/lib1/l1.5.kt create mode 100644 js/js.translator/testData/incremental/invalidation/nestedClass/lib1/l1.6.kt create mode 100644 js/js.translator/testData/incremental/invalidation/nestedClass/lib1/module.info create mode 100644 js/js.translator/testData/incremental/invalidation/nestedClass/main/m.kt create mode 100644 js/js.translator/testData/incremental/invalidation/nestedClass/main/module.info create mode 100644 js/js.translator/testData/incremental/invalidation/nestedClass/project.info 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 38b18cfb02a..4b146387dd6 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 @@ -294,12 +294,41 @@ class CacheUpdater( } } + private data class SignatureSource(val lib: KotlinLibraryFile, val src: KotlinSourceFile, val symbol: IrSymbol) + + private fun addParentSignatures( + signatures: Collection, + idSignatureToFile: Map, + importerLibFile: KotlinLibraryFile, + importerSrcFile: KotlinSourceFile + ): Set { + val allSignatures = HashSet(signatures.size) + + fun addAllParents(sig: IdSignature) { + val signatureSrc = idSignatureToFile[sig] ?: return + if (signatureSrc.lib == importerLibFile && signatureSrc.src == importerSrcFile) { + return + } + if (allSignatures.add(sig)) { + (signatureSrc.symbol.owner as? IrDeclaration)?.let { declaration -> + (declaration.parent as? IrSymbolOwner)?.let { parent -> + parent.symbol.signature?.let(::addAllParents) + } + } + } + } + + signatures.forEach(::addAllParents) + + return allSignatures + } + private fun rebuildDirtySourceMetadata( jsIrLinker: JsIrLinker, loadedFragments: Map, dirtySrcFiles: KotlinSourceFileMap, ): KotlinSourceFileMap { - val idSignatureToFile = mutableMapOf>() + val idSignatureToFile = mutableMapOf() val updatedMetadata = KotlinSourceFileMutableMap() for ((lib, irModule) in loadedFragments) { @@ -321,7 +350,7 @@ class CacheUpdater( } if (symbolCanBeExported) { signatureHashCalculator.addHashForSignatureIfNotExist(signature, symbol) - idSignatureToFile[signature] = lib to libSrcFile + idSignatureToFile[signature] = SignatureSource(lib, libSrcFile, symbol) } } @@ -337,15 +366,18 @@ class CacheUpdater( for ((srcFile, internalHeader) in srcFiles) { val dirtySrcFile = libDirtySrcFiles[srcFile] ?: continue dirtySrcFile.inverseDependencies.forEachFile { dependentLibFile, dependentSrcFile, signatures -> - signatures.forEach { - val (dependencyLib, dependencyFile) = idSignatureToFile[it] ?: (libFile to srcFile) + signatures.forEach { signature -> + val signatureSrc = idSignatureToFile[signature] + val dependencyLib = signatureSrc?.lib ?: libFile + val dependencyFile = signatureSrc?.src ?: srcFile updatedMetadata[dependencyLib, dependencyFile]?.also { dependencyMetadata -> - dependencyMetadata.addInverseDependency(dependentLibFile, dependentSrcFile, it) + dependencyMetadata.addInverseDependency(dependentLibFile, dependentSrcFile, signature) } } } - for (importedSignature in internalHeader.maybeImportedSignatures) { + val allImportedSignatures = addParentSignatures(internalHeader.maybeImportedSignatures, idSignatureToFile, libFile, srcFile) + for (importedSignature in allImportedSignatures) { val (dependencyLib, dependencyFile) = idSignatureToFile[importedSignature] ?: continue signatureHashCalculator[importedSignature]?.also { signatureHash -> internalHeader.addDirectDependency(dependencyLib, dependencyFile, importedSignature, signatureHash) @@ -444,18 +476,18 @@ class CacheUpdater( } } - private fun collectFilesWithModifiedExportsOrInlineImports( + private fun collectFilesWithModifiedExportsAndImports( loadedDirtyFiles: KotlinSourceFileMap ): KotlinSourceFileMap { - val filesWithModifiedExports = KotlinSourceFileMutableMap() + val filesWithModifiedExportsAndImports = KotlinSourceFileMutableMap() loadedDirtyFiles.forEachFile { libFile, srcFile, srcFileMetadata -> - filesWithModifiedExports.addDependenciesWithUpdatedSignatures(libFile, srcFile, srcFileMetadata) - filesWithModifiedExports.addDependenciesWithRemovedInverseDependencies(libFile, srcFile, srcFileMetadata) - filesWithModifiedExports.addDependentsWithUpdatedImports(libFile, srcFile, srcFileMetadata) + filesWithModifiedExportsAndImports.addDependenciesWithUpdatedSignatures(libFile, srcFile, srcFileMetadata) + filesWithModifiedExportsAndImports.addDependenciesWithRemovedInverseDependencies(libFile, srcFile, srcFileMetadata) + filesWithModifiedExportsAndImports.addDependentsWithUpdatedImports(libFile, srcFile, srcFileMetadata) } - return filesWithModifiedExports + return filesWithModifiedExportsAndImports } private fun collectFilesToRebuildSignatures( @@ -548,7 +580,7 @@ class CacheUpdater( val dirtyHeaders = rebuildDirtySourceMetadata(loadedIr.linker, loadedIr.loadedFragments, lastDirtyFiles) - val filesWithModifiedExportsOrImports = collectFilesWithModifiedExportsOrInlineImports(dirtyHeaders) + val filesWithModifiedExportsOrImports = collectFilesWithModifiedExportsAndImports(dirtyHeaders) val filesToRebuild = collectFilesToRebuildSignatures(filesWithModifiedExportsOrImports) 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 28edf1d2159..f40d52903b0 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 @@ -60,6 +60,16 @@ public class InvalidationTestGenerated extends AbstractInvalidationTest { runTest("js/js.translator/testData/incremental/invalidation/classFunctionsAndFields/"); } + @TestMetadata("companionInlineFunction") + public void testCompanionInlineFunction() throws Exception { + runTest("js/js.translator/testData/incremental/invalidation/companionInlineFunction/"); + } + + @TestMetadata("companionWithStdLibCall") + public void testCompanionWithStdLibCall() throws Exception { + runTest("js/js.translator/testData/incremental/invalidation/companionWithStdLibCall/"); + } + @TestMetadata("constVals") public void testConstVals() throws Exception { runTest("js/js.translator/testData/incremental/invalidation/constVals/"); @@ -205,6 +215,11 @@ public class InvalidationTestGenerated extends AbstractInvalidationTest { runTest("js/js.translator/testData/incremental/invalidation/moveInlineFunctionBetweenModules/"); } + @TestMetadata("nestedClass") + public void testNestedClass() throws Exception { + runTest("js/js.translator/testData/incremental/invalidation/nestedClass/"); + } + @TestMetadata("nonInlineBecomeInline") public void testNonInlineBecomeInline() throws Exception { runTest("js/js.translator/testData/incremental/invalidation/nonInlineBecomeInline/"); diff --git a/js/js.translator/testData/incremental/invalidation/companionInlineFunction/lib1/l1.0.kt b/js/js.translator/testData/incremental/invalidation/companionInlineFunction/lib1/l1.0.kt new file mode 100644 index 00000000000..55f5ddd80dd --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/companionInlineFunction/lib1/l1.0.kt @@ -0,0 +1,5 @@ +class MyClass1 { + companion object { + inline fun companionMethod() = 0 + } +} diff --git a/js/js.translator/testData/incremental/invalidation/companionInlineFunction/lib1/l1.1.kt b/js/js.translator/testData/incremental/invalidation/companionInlineFunction/lib1/l1.1.kt new file mode 100644 index 00000000000..51adb8c98fa --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/companionInlineFunction/lib1/l1.1.kt @@ -0,0 +1,5 @@ +class MyClass1 { + companion object { + inline fun companionMethod() = 1 + } +} diff --git a/js/js.translator/testData/incremental/invalidation/companionInlineFunction/lib1/l1.2.kt b/js/js.translator/testData/incremental/invalidation/companionInlineFunction/lib1/l1.2.kt new file mode 100644 index 00000000000..ffa1f409e80 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/companionInlineFunction/lib1/l1.2.kt @@ -0,0 +1,7 @@ +class MyClass1 { + class InternalClass { + companion object { + inline fun companionMethod() = 2 + } + } +} diff --git a/js/js.translator/testData/incremental/invalidation/companionInlineFunction/lib1/l1.3.kt b/js/js.translator/testData/incremental/invalidation/companionInlineFunction/lib1/l1.3.kt new file mode 100644 index 00000000000..9c47c6e9c97 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/companionInlineFunction/lib1/l1.3.kt @@ -0,0 +1,7 @@ +class MyClass1 { + class InternalClass { + companion object { + inline fun companionMethod() = 3 + } + } +} diff --git a/js/js.translator/testData/incremental/invalidation/companionInlineFunction/lib1/module.info b/js/js.translator/testData/incremental/invalidation/companionInlineFunction/lib1/module.info new file mode 100644 index 00000000000..c6c9f4590b3 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/companionInlineFunction/lib1/module.info @@ -0,0 +1,19 @@ +STEP 0: + modifications: + U : l1.0.kt -> l1.kt + added file: l1.kt +STEP 1: + modifications: + U : l1.1.kt -> l1.kt + modified ir: l1.kt +STEP 2: + modifications: + U : l1.2.kt -> l1.kt + modified ir: l1.kt +STEP 3: + modifications: + U : l1.3.kt -> l1.kt + modified ir: l1.kt +STEP 4: +STEP 5: + updated exports: l1.kt diff --git a/js/js.translator/testData/incremental/invalidation/companionInlineFunction/lib2/l2.0.kt b/js/js.translator/testData/incremental/invalidation/companionInlineFunction/lib2/l2.0.kt new file mode 100644 index 00000000000..0268c908bf2 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/companionInlineFunction/lib2/l2.0.kt @@ -0,0 +1 @@ +inline fun foo() = MyClass1.companionMethod() diff --git a/js/js.translator/testData/incremental/invalidation/companionInlineFunction/lib2/l2.2.kt b/js/js.translator/testData/incremental/invalidation/companionInlineFunction/lib2/l2.2.kt new file mode 100644 index 00000000000..2284daa2039 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/companionInlineFunction/lib2/l2.2.kt @@ -0,0 +1 @@ +inline fun foo() = MyClass1.InternalClass.companionMethod() diff --git a/js/js.translator/testData/incremental/invalidation/companionInlineFunction/lib2/l2.4.kt b/js/js.translator/testData/incremental/invalidation/companionInlineFunction/lib2/l2.4.kt new file mode 100644 index 00000000000..3634a26edc8 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/companionInlineFunction/lib2/l2.4.kt @@ -0,0 +1,6 @@ +inline fun foo(): Int { + bar(null) + return MyClass1.InternalClass.companionMethod() + 1 +} + +fun bar(x: Any?): Any = (x as? MyClass1) ?: 1 diff --git a/js/js.translator/testData/incremental/invalidation/companionInlineFunction/lib2/l2.5.kt b/js/js.translator/testData/incremental/invalidation/companionInlineFunction/lib2/l2.5.kt new file mode 100644 index 00000000000..3a9685f6a12 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/companionInlineFunction/lib2/l2.5.kt @@ -0,0 +1,6 @@ +inline fun foo(): Int { + bar(null) + return MyClass1.InternalClass.companionMethod() + 1 +} + +fun bar(x: Any?): Any = x ?: MyClass1() diff --git a/js/js.translator/testData/incremental/invalidation/companionInlineFunction/lib2/module.info b/js/js.translator/testData/incremental/invalidation/companionInlineFunction/lib2/module.info new file mode 100644 index 00000000000..2399a840865 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/companionInlineFunction/lib2/module.info @@ -0,0 +1,27 @@ +STEP 0: + dependencies: lib1 + modifications: + U : l2.0.kt -> l2.kt + added file: l2.kt +STEP 1: + dependencies: lib1 + updated imports: l2.kt +STEP 2: + dependencies: lib1 + modifications: + U : l2.2.kt -> l2.kt + modified ir: l2.kt +STEP 3: + dependencies: lib1 + updated imports: l2.kt +STEP 4: + dependencies: lib1 + modifications: + U : l2.4.kt -> l2.kt + modified ir: l2.kt +STEP 5: + dependencies: lib1 + modifications: + U : l2.5.kt -> l2.kt + modified ir: l2.kt + diff --git a/js/js.translator/testData/incremental/invalidation/companionInlineFunction/main/m.kt b/js/js.translator/testData/incremental/invalidation/companionInlineFunction/main/m.kt new file mode 100644 index 00000000000..4eb6b08503d --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/companionInlineFunction/main/m.kt @@ -0,0 +1,8 @@ +fun box(stepId: Int): String { + when (stepId) { + 0, 1, 2, 3, 4 -> if (foo() != stepId) return "Fail" + 5 -> if (foo() != 4) return "Fail" + else -> return "Unkown" + } + return "OK" +} diff --git a/js/js.translator/testData/incremental/invalidation/companionInlineFunction/main/module.info b/js/js.translator/testData/incremental/invalidation/companionInlineFunction/main/module.info new file mode 100644 index 00000000000..1b25f9e6c2f --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/companionInlineFunction/main/module.info @@ -0,0 +1,8 @@ +STEP 0: + dependencies: lib1, lib2 + added file: m.kt +STEP 1..4: + dependencies: lib1, lib2 + updated imports: m.kt +STEP 5: + dependencies: lib1, lib2 diff --git a/js/js.translator/testData/incremental/invalidation/companionInlineFunction/project.info b/js/js.translator/testData/incremental/invalidation/companionInlineFunction/project.info new file mode 100644 index 00000000000..cec28fa150e --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/companionInlineFunction/project.info @@ -0,0 +1,8 @@ +MODULES: lib1, lib2, main + +STEP 0..4: + libs: lib1, lib2, main + dirty js: lib1, lib2, main +STEP 5: + libs: lib1, lib2, main + dirty js: lib1, lib2 diff --git a/js/js.translator/testData/incremental/invalidation/companionWithStdLibCall/lib1/l1.0.kt b/js/js.translator/testData/incremental/invalidation/companionWithStdLibCall/lib1/l1.0.kt new file mode 100644 index 00000000000..7cf781fcdad --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/companionWithStdLibCall/lib1/l1.0.kt @@ -0,0 +1,15 @@ +class MyClass1 { + companion object { + fun companionMethod(v: Int): Int { + return v.countTrailingZeroBits() + } + } +} + +class MyClass2 { + companion object { + fun companionMethod(v: Int): Int { + return v.countTrailingZeroBits() + } + } +} diff --git a/js/js.translator/testData/incremental/invalidation/companionWithStdLibCall/lib1/l1.1.kt b/js/js.translator/testData/incremental/invalidation/companionWithStdLibCall/lib1/l1.1.kt new file mode 100644 index 00000000000..8cba3a51764 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/companionWithStdLibCall/lib1/l1.1.kt @@ -0,0 +1,7 @@ +class MyClass1 { + companion object { + fun companionMethod(v: Int): Int { + return v.countTrailingZeroBits() + } + } +} diff --git a/js/js.translator/testData/incremental/invalidation/companionWithStdLibCall/lib1/module.info b/js/js.translator/testData/incremental/invalidation/companionWithStdLibCall/lib1/module.info new file mode 100644 index 00000000000..30d4e99e5a2 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/companionWithStdLibCall/lib1/module.info @@ -0,0 +1,13 @@ +STEP 0: + modifications: + U : l1.0.kt -> l1.kt + added file: l1.kt +STEP 1: + modifications: + U : l1.1.kt -> l1.kt + modified ir: l1.kt +STEP 2: + modifications: + U : l1.0.kt -> l1.kt + modified ir: l1.kt +STEP 3: diff --git a/js/js.translator/testData/incremental/invalidation/companionWithStdLibCall/main/f.0.kt b/js/js.translator/testData/incremental/invalidation/companionWithStdLibCall/main/f.0.kt new file mode 100644 index 00000000000..d900e84b03b --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/companionWithStdLibCall/main/f.0.kt @@ -0,0 +1,5 @@ +fun test(x: Int): Int { + val y = MyClass1.companionMethod(x) + return y.countTrailingZeroBits() +} + diff --git a/js/js.translator/testData/incremental/invalidation/companionWithStdLibCall/main/f.3.kt b/js/js.translator/testData/incremental/invalidation/companionWithStdLibCall/main/f.3.kt new file mode 100644 index 00000000000..87bce58e396 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/companionWithStdLibCall/main/f.3.kt @@ -0,0 +1,5 @@ +fun test(x: Int): Int { + val y = MyClass1.companionMethod(x) + return y +} + diff --git a/js/js.translator/testData/incremental/invalidation/companionWithStdLibCall/main/m.kt b/js/js.translator/testData/incremental/invalidation/companionWithStdLibCall/main/m.kt new file mode 100644 index 00000000000..8fb828cf4ee --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/companionWithStdLibCall/main/m.kt @@ -0,0 +1,11 @@ +fun box(stepId: Int): String { + val x = test(stepId) + when (stepId) { + 0 -> if (x != 5) return "Fail, x == $x" + 1 -> if (x != 32) return "Fail, x == $x" + 2 -> if (x != 0) return "Fail, x == $x" + 3 -> if (x != 0) return "Fail, x == $x" + else -> return "Unkown" + } + return "OK" +} diff --git a/js/js.translator/testData/incremental/invalidation/companionWithStdLibCall/main/module.info b/js/js.translator/testData/incremental/invalidation/companionWithStdLibCall/main/module.info new file mode 100644 index 00000000000..8c9c168ce4e --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/companionWithStdLibCall/main/module.info @@ -0,0 +1,12 @@ +STEP 0: + dependencies: lib1 + modifications: + U : f.0.kt -> f.kt + added file: m.kt, f.kt +STEP 1..2: + dependencies: lib1 +STEP 3: + dependencies: lib1 + modifications: + U : f.3.kt -> f.kt + modified ir: f.kt diff --git a/js/js.translator/testData/incremental/invalidation/companionWithStdLibCall/project.info b/js/js.translator/testData/incremental/invalidation/companionWithStdLibCall/project.info new file mode 100644 index 00000000000..9fa58b9ec0d --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/companionWithStdLibCall/project.info @@ -0,0 +1,11 @@ +MODULES: lib1, main + +STEP 0: + libs: lib1, main + dirty js: lib1, main +STEP 1..2: + libs: lib1, main + dirty js: lib1 +STEP 3: + libs: lib1, main + dirty js: main diff --git a/js/js.translator/testData/incremental/invalidation/nestedClass/lib1/l1.0.kt b/js/js.translator/testData/incremental/invalidation/nestedClass/lib1/l1.0.kt new file mode 100644 index 00000000000..a0533340394 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/nestedClass/lib1/l1.0.kt @@ -0,0 +1,5 @@ +class MyClass { + class NestedClass { + inline fun foo() = 0 + } +} diff --git a/js/js.translator/testData/incremental/invalidation/nestedClass/lib1/l1.1.kt b/js/js.translator/testData/incremental/invalidation/nestedClass/lib1/l1.1.kt new file mode 100644 index 00000000000..e1ab2065fa1 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/nestedClass/lib1/l1.1.kt @@ -0,0 +1,5 @@ +class MyClass { + class NestedClass { + inline fun foo() = 1 + } +} diff --git a/js/js.translator/testData/incremental/invalidation/nestedClass/lib1/l1.2.kt b/js/js.translator/testData/incremental/invalidation/nestedClass/lib1/l1.2.kt new file mode 100644 index 00000000000..c43eea6d310 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/nestedClass/lib1/l1.2.kt @@ -0,0 +1,7 @@ +class MyClass { + class NestedClass { + inline fun foo() = 1 + } + + fun unusedFunction() = -1 +} diff --git a/js/js.translator/testData/incremental/invalidation/nestedClass/lib1/l1.3.kt b/js/js.translator/testData/incremental/invalidation/nestedClass/lib1/l1.3.kt new file mode 100644 index 00000000000..78070b066cd --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/nestedClass/lib1/l1.3.kt @@ -0,0 +1,7 @@ +data class MyClass(val unusedField: String) { + class NestedClass { + inline fun foo() = 1 + } + + fun unusedFunction() = -1 +} diff --git a/js/js.translator/testData/incremental/invalidation/nestedClass/lib1/l1.4.kt b/js/js.translator/testData/incremental/invalidation/nestedClass/lib1/l1.4.kt new file mode 100644 index 00000000000..9d70616b594 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/nestedClass/lib1/l1.4.kt @@ -0,0 +1,9 @@ +data class MyClass(val unusedField: String) { + class NestedClass { + inline fun foo() = 1 + + val field = 5 + } + + fun unusedFunction() = -1 +} diff --git a/js/js.translator/testData/incremental/invalidation/nestedClass/lib1/l1.5.kt b/js/js.translator/testData/incremental/invalidation/nestedClass/lib1/l1.5.kt new file mode 100644 index 00000000000..029956d5b92 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/nestedClass/lib1/l1.5.kt @@ -0,0 +1,9 @@ +data class MyClass(val unusedField: String) { + class NestedClass { + inline fun foo() = field + + val field = 5 + } + + fun unusedFunction() = -1 +} diff --git a/js/js.translator/testData/incremental/invalidation/nestedClass/lib1/l1.6.kt b/js/js.translator/testData/incremental/invalidation/nestedClass/lib1/l1.6.kt new file mode 100644 index 00000000000..2c8211b4d75 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/nestedClass/lib1/l1.6.kt @@ -0,0 +1,9 @@ +data class MyClass(val unusedField: String) { + class NestedClass { + inline fun foo() = field + + val field = 6 + } + + fun unusedFunction() = -1 +} diff --git a/js/js.translator/testData/incremental/invalidation/nestedClass/lib1/module.info b/js/js.translator/testData/incremental/invalidation/nestedClass/lib1/module.info new file mode 100644 index 00000000000..68c1c49f240 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/nestedClass/lib1/module.info @@ -0,0 +1,28 @@ +STEP 0: + modifications: + U : l1.0.kt -> l1.kt + added file: l1.kt +STEP 1: + modifications: + U : l1.1.kt -> l1.kt + modified ir: l1.kt +STEP 2: + modifications: + U : l1.2.kt -> l1.kt + modified ir: l1.kt +STEP 3: + modifications: + U : l1.3.kt -> l1.kt + modified ir: l1.kt +STEP 4: + modifications: + U : l1.4.kt -> l1.kt + modified ir: l1.kt +STEP 5: + modifications: + U : l1.5.kt -> l1.kt + modified ir: l1.kt +STEP 6: + modifications: + U : l1.6.kt -> l1.kt + modified ir: l1.kt diff --git a/js/js.translator/testData/incremental/invalidation/nestedClass/main/m.kt b/js/js.translator/testData/incremental/invalidation/nestedClass/main/m.kt new file mode 100644 index 00000000000..a5c73da9cac --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/nestedClass/main/m.kt @@ -0,0 +1,8 @@ +fun box(stepId: Int): String { + when (stepId) { + 0, 1, 5, 6 -> if (MyClass.NestedClass().foo() != stepId) return "Fail" + 2, 3, 4 -> if (MyClass.NestedClass().foo() != 1) return "Fail" + else -> return "Unknown" + } + return "OK" +} diff --git a/js/js.translator/testData/incremental/invalidation/nestedClass/main/module.info b/js/js.translator/testData/incremental/invalidation/nestedClass/main/module.info new file mode 100644 index 00000000000..9c6db883a87 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/nestedClass/main/module.info @@ -0,0 +1,18 @@ +STEP 0: + dependencies: lib1 + added file: m.kt +STEP 1: + dependencies: lib1 + updated imports: m.kt +STEP 2: + dependencies: lib1 +STEP 3: + dependencies: lib1 + updated imports: m.kt +STEP 4: + dependencies: lib1 +STEP 5: + dependencies: lib1 + updated imports: m.kt +STEP 6: + dependencies: lib1 diff --git a/js/js.translator/testData/incremental/invalidation/nestedClass/project.info b/js/js.translator/testData/incremental/invalidation/nestedClass/project.info new file mode 100644 index 00000000000..88ec3a11501 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/nestedClass/project.info @@ -0,0 +1,20 @@ +MODULES: lib1, main + +STEP 0..1: + libs: lib1, main + dirty js: lib1, main +STEP 2: + libs: lib1, main + dirty js: lib1 +STEP 3: + libs: lib1, main + dirty js: lib1, main +STEP 4: + libs: lib1, main + dirty js: lib1 +STEP 5: + libs: lib1, main + dirty js: lib1, main +STEP 6: + libs: lib1, main + dirty js: lib1