wip ~~
diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/invalidation.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/invalidation.kt index 4e10d39..2f04a68 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/invalidation.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/invalidation.kt
@@ -55,6 +55,8 @@ val dirtyFiles = mutableSetOf<String>() +// println("Invalidation Phase #0") + for ((index, file) in libraryFiles.withIndex()) { // 1. get cached fingerprints @@ -63,6 +65,8 @@ // 2. calculate new fingerprints val fileNewFingerprint = library.fingerprint(index) +// println(" Finger-prints: old = $fileOldFingerprint, new = $fileNewFingerprint for file $file") + if (fileOldFingerprint != fileNewFingerprint) { fileFingerPrints[file] = fileNewFingerprint cachedInlineHashesForFile.remove(file) @@ -72,6 +76,10 @@ } } + val p1 = dirtyFiles.size +// println("Phase #1 discovered ${dirtyFiles.size} dirty files") +// println("Dirty files #1: ${dirtyFiles.joinToString(",", "[", "]")}") + // 4. extend dirty set with inline functions val graphCache = mutableMapOf<FilePath, Collection<Pair<IdSignature, TransHash>>>() @@ -104,8 +112,12 @@ } } while (oldSize != dirtyFiles.size) +// println("Phase #2 discovered ${dirtyFiles.size - p1} more dirty files") +// println("Dirty files #2: ${dirtyFiles.joinToString(",", "[", "]")}") + // 5. invalidate file caches for (dirty in dirtyFiles) { +// println(" invalidate cache for file ${dirty}") cacheConsumer.invalidateForFile(dirty) } @@ -384,6 +396,9 @@ currentLibraryCacheProvider.inlineHashes(filePath) { s -> sigReader.deserializeIdSignature(s) } } +// println("Invalidate cache for library ${library.libraryName}") +// println("Files: ${libraryFiles.joinToString(",", "[", "]")}") + val dirtySet = invalidateCacheForModule( library, libraryFiles,
diff --git a/js/js.tests/build.gradle.kts b/js/js.tests/build.gradle.kts index 15efaff..7b01042 100644 --- a/js/js.tests/build.gradle.kts +++ b/js/js.tests/build.gradle.kts
@@ -349,7 +349,7 @@ setUpBoxTests() } -projectTest("invalidationTest") { +projectTest("invalidationTest", jUnitMode = JUnitMode.JUnit5) { workingDir = rootDir include("org/jetbrains/kotlin/incremental/*")
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 8e53c6a..caccf66 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/incremental/AbstractInvalidationTest.kt +++ b/js/js.tests/test/org/jetbrains/kotlin/incremental/AbstractInvalidationTest.kt
@@ -117,6 +117,14 @@ return copy } + private fun refreshFileSystem() { + + val fileSystem = VirtualFileManager.getInstance().getFileSystem(StandardFileSystems.FILE_PROTOCOL) + fileSystem.refresh(false /* sync */) +// System.out.flush() + + } + private fun executeProjectSteps( projectInfo: ProjectInfo, moduleInfos: Map<String, ModuleInfo>, @@ -132,8 +140,10 @@ val moduleInfo = moduleInfos[module] ?: error("No module info found for $module") val moduleStep = moduleInfo.steps[projStep.id] for (modification in moduleStep.modifications) { +// println("Execute step for module $module at step ${projStep.id}") modification.execute(moduleTestDir, moduleSourceDir) } + refreshFileSystem() val dependencies = moduleStep.dependencies.map { resolveModuleArtifact(it, buildDir) } @@ -182,9 +192,11 @@ val actualDirtyFiles = invalidatedDirtyFiles?.map { File(it).canonicalPath } ?: sourceDir.filteredKtFiles().map { it.canonicalPath } val expectedDirtyFilesCanonical = expectedDirtyFiles.map { it.canonicalPath } - JUnit5Assertions.assertSameElements(expectedDirtyFilesCanonical, actualDirtyFiles) { "For module $moduleKlibFile" } + JUnit5Assertions.assertSameElements(expectedDirtyFilesCanonical, actualDirtyFiles) { "For module $moduleKlibFile at step $stepId" } } +// println("////-- === Process step $stepId for module ${moduleKlibFile.name} === --\\\\\\\\") + val dependenciesPaths = mutableListOf<String>() dependencies.mapTo(dependenciesPaths) { it.canonicalPath } dependenciesPaths.add(moduleKlibFile.canonicalPath) @@ -203,15 +215,28 @@ val filePaths = expectedDirtyFiles.joinToString(",", "[", "]") "Up to date is not expected for module $moduleKlibFile at step $stepId. Expected dirtyFiles are $filePaths" } + +// println("\\\\\\\\-- === Processed step $stepId for module ${moduleKlibFile.name} === --////") + } private fun KotlinCoreEnvironment.createPsiFile(fileName: String): KtFile { val psiManager = PsiManager.getInstance(project) val fileSystem = VirtualFileManager.getInstance().getFileSystem(StandardFileSystems.FILE_PROTOCOL) +// val file = fileSystem.findFileByPath(fileName) ?: error("File not found: $fileName") +// fileSystem.refresh(false) +// System.out.flush() val file = fileSystem.findFileByPath(fileName) ?: error("File not found: $fileName") - - return psiManager.findFile(file) as KtFile +// file.refresh(false, true) +// psiManager.dropResolveCaches() + return (psiManager.findFile(file) as KtFile).also { + if (file.name.endsWith("l1.kt")) { + println(it.text) + val diskText = file.canonicalPath?.let { File(it).readText() } ?: "<NA>" + println(diskText) + } + } } private fun buildArtifact( @@ -227,6 +252,12 @@ val sourceFiles = sourceDir.filteredKtFiles().map { environment.createPsiFile(it.canonicalPath) } +// println("Compile files") +// for (sf in sourceFiles) { +// println(" ${sf.name}") +// println("${sf.text}") +// } + val sourceModule = prepareAnalyzedSourceModule( projectJs, sourceFiles,
diff --git a/js/js.tests/test/org/jetbrains/kotlin/incremental/TestModel.kt b/js/js.tests/test/org/jetbrains/kotlin/incremental/TestModel.kt index efbe0f1..e0e95aa 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/incremental/TestModel.kt +++ b/js/js.tests/test/org/jetbrains/kotlin/incremental/TestModel.kt
@@ -102,7 +102,7 @@ when (op) { "libs" -> { val args = splitted[1] - args.split(",").forEach { order.add(it.trim()) } + args.split(",").filter { it.isNotBlank() }.forEach { order.add(it.trim()) } } else -> println(diagnosticMessage("Unknown op $op", line)) } @@ -135,7 +135,7 @@ when { op == MODULES_LIST -> { val arguments = splitted[1] - arguments.split(",").forEach { libraries.add(it.trim()) } + arguments.split(",").filter { it.isNotBlank() }.forEach { libraries.add(it.trim()) } } op.matches(STEP_PATTERN.toRegex()) -> { val m = STEP_PATTERN.matcher(op) @@ -196,8 +196,8 @@ val op = line.substring(0, opIndex) when (op) { - "dependencies" -> line.substring(opIndex + 1).split(",").forEach { dependencies.add(it.trim()) } - "dirty" -> line.substring(opIndex + 1).split(",").forEach { dirtyFiles.add(it.trim()) } + "dependencies" -> line.substring(opIndex + 1).split(",").filter { it.isNotBlank() }.forEach { dependencies.add(it.trim()) } + "dirty" -> line.substring(opIndex + 1).split(",").filter { it.isNotBlank() }.forEach { dirtyFiles.add(it.trim()) } "modifications" -> modifications.addAll(parseModifications()) else -> println(diagnosticMessage("Unknown op $op", line)) }
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 d4b206b..4103af7 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
@@ -30,13 +30,13 @@ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/incremental/invalidation"), Pattern.compile("^([^_](.+))$"), null, TargetBackend.JS_IR, true); } - @TestMetadata("complex") - public void testComplex() throws Exception { - runTest("js/js.translator/testData/incremental/invalidation/complex/"); - } - @TestMetadata("simple") public void testSimple() throws Exception { runTest("js/js.translator/testData/incremental/invalidation/simple/"); } + + @TestMetadata("transitiveInlineFunction") + public void testTransitiveInlineFunction() throws Exception { + runTest("js/js.translator/testData/incremental/invalidation/transitiveInlineFunction/"); + } }
diff --git a/js/js.translator/testData/incremental/invalidation/simple/lib1/l1.kt b/js/js.translator/testData/incremental/invalidation/simple/lib1/l1.kt index 12a0600..859b384 100644 --- a/js/js.translator/testData/incremental/invalidation/simple/lib1/l1.kt +++ b/js/js.translator/testData/incremental/invalidation/simple/lib1/l1.kt
@@ -1,2 +1 @@ - fun foo() = 42 \ No newline at end of file
diff --git a/js/js.translator/testData/incremental/invalidation/simple/lib1/l1.kt.1 b/js/js.translator/testData/incremental/invalidation/simple/lib1/l1.kt.1 index 2a26d28..8e3c133 100644 --- a/js/js.translator/testData/incremental/invalidation/simple/lib1/l1.kt.1 +++ b/js/js.translator/testData/incremental/invalidation/simple/lib1/l1.kt.1
@@ -1,2 +1 @@ - fun foo() = 33 \ No newline at end of file
diff --git a/js/js.translator/testData/incremental/invalidation/transitiveInlineFunction/lib1/l1.kt b/js/js.translator/testData/incremental/invalidation/transitiveInlineFunction/lib1/l1.kt new file mode 100644 index 0000000..d03afda --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/transitiveInlineFunction/lib1/l1.kt
@@ -0,0 +1,2 @@ + +inline fun foo() = 42 \ No newline at end of file
diff --git a/js/js.translator/testData/incremental/invalidation/transitiveInlineFunction/lib1/l1.kt.1 b/js/js.translator/testData/incremental/invalidation/transitiveInlineFunction/lib1/l1.kt.1 new file mode 100644 index 0000000..b9ec1aa --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/transitiveInlineFunction/lib1/l1.kt.1
@@ -0,0 +1,2 @@ + +inline fun foo() = 33 \ No newline at end of file
diff --git a/js/js.translator/testData/incremental/invalidation/transitiveInlineFunction/lib1/module.info b/js/js.translator/testData/incremental/invalidation/transitiveInlineFunction/lib1/module.info new file mode 100644 index 0000000..5963605 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/transitiveInlineFunction/lib1/module.info
@@ -0,0 +1,8 @@ +STEP 0: + dependencies: stdlib + dirty: l1.kt +STEP 1: + dependencies: stdlib + modifications: + U : l1.kt.1 -> l1.kt + dirty: l1.kt
diff --git a/js/js.translator/testData/incremental/invalidation/transitiveInlineFunction/lib2/l2.kt b/js/js.translator/testData/incremental/invalidation/transitiveInlineFunction/lib2/l2.kt new file mode 100644 index 0000000..39b7239 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/transitiveInlineFunction/lib2/l2.kt
@@ -0,0 +1,2 @@ + +inline fun qux() = foo() \ No newline at end of file
diff --git a/js/js.translator/testData/incremental/invalidation/transitiveInlineFunction/lib2/module.info b/js/js.translator/testData/incremental/invalidation/transitiveInlineFunction/lib2/module.info new file mode 100644 index 0000000..acda14b --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/transitiveInlineFunction/lib2/module.info
@@ -0,0 +1,7 @@ +STEP 0: + dependencies: stdlib, lib1 + dirty: l2.kt + +STEP 1: + dependencies: stdlib, lib1 + dirty: l2.kt \ No newline at end of file
diff --git a/js/js.translator/testData/incremental/invalidation/transitiveInlineFunction/main/m.kt b/js/js.translator/testData/incremental/invalidation/transitiveInlineFunction/main/m.kt new file mode 100644 index 0000000..3ed427f --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/transitiveInlineFunction/main/m.kt
@@ -0,0 +1,2 @@ + +fun box() = qux() \ No newline at end of file
diff --git a/js/js.translator/testData/incremental/invalidation/transitiveInlineFunction/main/module.info b/js/js.translator/testData/incremental/invalidation/transitiveInlineFunction/main/module.info new file mode 100644 index 0000000..df595ac --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/transitiveInlineFunction/main/module.info
@@ -0,0 +1,7 @@ +STEP 0: + dependencies: stdlib, lib1, lib2 + dirty: m.kt + +STEP 1: + dependencies: stdlib, lib1, lib2 + dirty: m.kt \ No newline at end of file
diff --git a/js/js.translator/testData/incremental/invalidation/transitiveInlineFunction/project.info b/js/js.translator/testData/incremental/invalidation/transitiveInlineFunction/project.info new file mode 100644 index 0000000..710e856 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/transitiveInlineFunction/project.info
@@ -0,0 +1,7 @@ +MODULES: lib1, lib2, main + +STEP 0: + libs: lib1, lib2, main + +STEP 1: + libs: lib1, lib2, main \ No newline at end of file