From 5b4e9e2966dc0370009de2a3c04bbf4b9f9f4632 Mon Sep 17 00:00:00 2001 From: Alexander Korepanov Date: Wed, 15 Jun 2022 19:53:13 +0200 Subject: [PATCH] [JS IR] Fix IC invalidation process when symbols are modified The patch fixes the cases of IC invalidation when symbols are modified: adding and removing inline, data, in, out, suspend qualifiers. For that purpose an extra hash is used. It is written in a direct dependency graph into an IC cache metadata file. For inline functions a transitive hash is used. For non-inline functions, classes, and others a symbol hash is used. The invalidation routine marks the file as dirty (with 'updated imports' state) if hash is modified. ^KT-51083 Fixed ^KT-51088 Fixed ^KT-51090 Fixed ^KT-51099 Fixed --- .../kotlin/ir/backend/js/ic/CacheUpdater.kt | 75 ++++++----- .../ir/backend/js/ic/HashCalculatorForIC.kt | 15 +++ ...ulator.kt => IdSignatureHashCalculator.kt} | 35 +++-- .../ir/backend/js/ic/IncrementalCache.kt | 123 ++++++++++-------- .../backend/js/ic/KotlinSourceFileMetadata.kt | 13 +- .../main/module.info | 8 +- .../main/module.info | 2 +- .../lib1/module.info | 4 +- .../main/module.info | 2 +- .../class/lib1/l1.0_data_class.kt | 2 + .../class/lib1/l1.0_simple_class.kt | 3 - .../class/lib1/l1.1_data_class.kt | 3 - .../class/lib1/l1.1_simple_class.kt | 2 + .../class/lib1/l1.2_inline_class.kt | 1 - .../invalidation/class/lib1/module.info | 15 ++- .../incremental/invalidation/class/main/m.kt | 14 +- .../invalidation/class/main/module.info | 3 +- .../invalidation/class/main/testEquals.kt | 3 + .../invalidation/class/main/testHashCode.kt | 3 + .../invalidation/class/main/testToString.kt | 3 + .../invalidation/class/project.info | 2 +- .../classFunctionsAndFields/main/module.info | 9 +- .../classFunctionsAndFields/project.info | 8 +- .../lib1/module.info | 4 +- .../main/module.info | 4 +- .../fakeOverrideInheritance/lib1/module.info | 8 +- .../fakeOverrideInheritance/main/module.info | 2 +- .../main/module.info | 2 +- .../lib2/module.info | 2 +- .../main/module.info | 2 +- .../main/module.info | 2 +- .../libProxy/module.info | 8 +- .../genericInlineFunctions/main/module.info | 12 +- .../main/module.info | 5 +- .../gettersAndSettersInlining/project.info | 2 +- .../inlineBecomeNonInline/main/module.info | 2 +- .../inlineFunctionAsParam/main/module.info | 8 +- .../main/module.info | 4 +- .../invalidation/jsCode/main/module.info | 2 +- .../invalidation/jsExport/main/module.info | 2 +- .../moveFilesBetweenModules/lib3/module.info | 2 +- .../moveFilesBetweenModules/main/module.info | 2 +- .../lib2/module.info | 2 +- .../lib3/module.info | 2 +- .../main/module.info | 2 +- .../nonInlineBecomeInline/lib1/l1.1.kt | 1 - .../nonInlineBecomeInline/lib1/l1.2.kt | 1 - .../nonInlineBecomeInline/lib1/l1.4.kt | 1 + .../nonInlineBecomeInline/lib1/module.info | 8 ++ .../nonInlineBecomeInline/main/m.kt | 3 +- .../nonInlineBecomeInline/main/module.info | 5 +- .../nonInlineBecomeInline/project.info | 4 +- .../suspendFunctions/lib1/l1.1.kt | 1 - .../suspendFunctions/main/module.info | 6 +- .../transitiveInlineFunction/lib2/module.info | 2 +- .../transitiveInlineFunction/main/module.info | 2 +- .../lib2/module.info | 6 +- .../main/module.info | 4 +- .../invalidation/variance/lib1/l1.1.kt | 1 - .../invalidation/variance/lib1/l1.2.kt | 1 - .../invalidation/variance/main/module.info | 1 + .../invalidation/variance/project.info | 5 +- 62 files changed, 279 insertions(+), 202 deletions(-) rename compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/{InlineFunctionTransitiveHashCalculator.kt => IdSignatureHashCalculator.kt} (80%) create mode 100644 js/js.translator/testData/incremental/invalidation/class/lib1/l1.0_data_class.kt delete mode 100644 js/js.translator/testData/incremental/invalidation/class/lib1/l1.0_simple_class.kt delete mode 100644 js/js.translator/testData/incremental/invalidation/class/lib1/l1.1_data_class.kt create mode 100644 js/js.translator/testData/incremental/invalidation/class/lib1/l1.1_simple_class.kt create mode 100644 js/js.translator/testData/incremental/invalidation/class/main/testEquals.kt create mode 100644 js/js.translator/testData/incremental/invalidation/class/main/testHashCode.kt create mode 100644 js/js.translator/testData/incremental/invalidation/class/main/testToString.kt create mode 100644 js/js.translator/testData/incremental/invalidation/nonInlineBecomeInline/lib1/l1.4.kt 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 18ab7182ceb..3b849c9496b 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 @@ -37,7 +37,7 @@ enum class DirtyFileState(val str: String) { ADDED_FILE("added file"), MODIFIED_IR("modified ir"), UPDATED_EXPORTS("updated exports"), - UPDATED_INLINE_IMPORTS("updated inline imports"), + UPDATED_IMPORTS("updated imports"), REMOVED_INVERSE_DEPENDS("removed inverse depends"), REMOVED_DIRECT_DEPENDS("removed direct depends"), REMOVED_FILE("removed file") @@ -52,9 +52,7 @@ class CacheUpdater( private val mainArguments: List?, private val executor: CacheExecutor ) { - private val hashCalculator = InlineFunctionTransitiveHashCalculator() - private val transitiveHashes - get() = hashCalculator.transitiveHashes + private val signatureHashCalculator = IdSignatureHashCalculator() private val libraries = loadLibraries(allModules) private val dependencyGraph = buildDependenciesGraph(libraries) @@ -117,26 +115,29 @@ class CacheUpdater( val oldDirectDependencies: KotlinSourceFileMap<*>, override val inverseDependencies: KotlinSourceFileMutableMap> = KotlinSourceFileMutableMap(), - override val directDependencies: KotlinSourceFileMutableMap> = KotlinSourceFileMutableMap(), - - override val importedInlineFunctions: MutableMap = mutableMapOf() + override val directDependencies: KotlinSourceFileMutableMap> = KotlinSourceFileMutableMap(), ) : KotlinSourceFileMetadata() { fun addInverseDependency(lib: KotlinLibraryFile, src: KotlinSourceFile, signature: IdSignature) = - inverseDependencies.addSignature(lib, src, signature) + when (val signatures = inverseDependencies[lib, src]) { + null -> inverseDependencies[lib, src] = mutableSetOf(signature) + else -> signatures += signature + } - fun addDirectDependency(lib: KotlinLibraryFile, src: KotlinSourceFile, signature: IdSignature) = - directDependencies.addSignature(lib, src, signature) + fun addDirectDependency(lib: KotlinLibraryFile, src: KotlinSourceFile, signature: IdSignature, hash: ICHash) = + when (val signatures = directDependencies[lib, src]) { + null -> directDependencies[lib, src] = mutableMapOf(signature to hash) + else -> signatures[signature] = hash + } } private class UpdatedDependenciesMetadata(oldMetadata: KotlinSourceFileMetadata) : KotlinSourceFileMetadata() { private val oldInverseDependencies = oldMetadata.inverseDependencies private val newExportedSignatures: Set by lazy { inverseDependencies.flatSignatures() } - var importedInlineFunctionsModified = false + var importedSignaturesModified = false override val inverseDependencies = oldMetadata.inverseDependencies.toMutable() override val directDependencies = oldMetadata.directDependencies.toMutable() - override val importedInlineFunctions = oldMetadata.importedInlineFunctions override fun getExportedSignatures(): Set = newExportedSignatures @@ -223,8 +224,8 @@ class CacheUpdater( if (dependentFile !in dirtyLibFiles) { val dependentSrcFileMetadata = dependentCache.fetchSourceFileFullMetadata(dependentFile) dependentSrcFileMetadata.directDependencies[libFile, srcFile]?.let { - loadingFileExports.inverseDependencies[dependentLib, dependentFile] = it - loadingFileExports.allExportedSignatures += it + loadingFileExports.inverseDependencies[dependentLib, dependentFile] = it.keys + loadingFileExports.allExportedSignatures += it.keys } } } @@ -267,6 +268,7 @@ class CacheUpdater( val maybeImportedSignatures = reachableSignatures.keys.toMutableSet() for ((signature, symbol) in allImplementedSymbols) { if (signature in reachableSignatures) { + signatureHashCalculator.addHashForSignatureIfNotExist(signature, symbol) idSignatureToFile[signature] = lib to libSrcFile maybeImportedSignatures.remove(signature) @@ -295,8 +297,9 @@ class CacheUpdater( for (importedSignature in internalHeader.maybeImportedSignatures) { val (dependencyLib, dependencyFile) = idSignatureToFile[importedSignature] ?: continue - internalHeader.addDirectDependency(dependencyLib, dependencyFile, importedSignature) - transitiveHashes[importedSignature]?.let { internalHeader.importedInlineFunctions[importedSignature] = it } + signatureHashCalculator[importedSignature]?.also { signatureHash -> + internalHeader.addDirectDependency(dependencyLib, dependencyFile, importedSignature, signatureHash) + } ?: notFoundIcError("signature $importedSignature hash", dependencyLib, dependencyFile) updatedMetadata[dependencyLib, dependencyFile]?.also { dependencyMetadata -> dependencyMetadata.addInverseDependency(libFile, srcFile, importedSignature) @@ -339,7 +342,7 @@ class CacheUpdater( continue } val newMetadata = addNewMetadata(dependencyLibFile, dependencySrcFile, dependencySrcMetadata) - newMetadata.inverseDependencies[libFile, srcFile] = newSignatures + newMetadata.inverseDependencies[libFile, srcFile] = newSignatures.keys } } } @@ -367,21 +370,25 @@ class CacheUpdater( private fun KotlinSourceFileMutableMap.addDependentsWithUpdatedImports( libFile: KotlinLibraryFile, srcFile: KotlinSourceFile, srcFileMetadata: DirtyFileMetadata ) { - // go through dependent files and check if their inline imports were modified + // go through dependent files and check if their imports were modified for ((dependentLibFile, dependentSrcFiles) in srcFileMetadata.inverseDependencies) { val dependentCache = incrementalCaches[dependentLibFile] ?: continue for ((dependentSrcFile, newSignatures) in dependentSrcFiles) { val dependentSrcMetadata = dependentCache.fetchSourceFileFullMetadata(dependentSrcFile) - val dependentSignatures = dependentSrcMetadata.directDependencies[libFile, srcFile] ?: emptySet() - val importedInlineModified = dependentSrcMetadata.importedInlineFunctions.any { - transitiveHashes[it.key]?.let { newHash -> newHash != it.value } ?: (it.key in dependentSignatures) - } - if (importedInlineModified) { - val newMetadata = addNewMetadata(dependentLibFile, dependentSrcFile, dependentSrcMetadata) - newMetadata.importedInlineFunctionsModified = true - } else if (dependentSignatures != newSignatures) { - val newMetadata = addNewMetadata(dependentLibFile, dependentSrcFile, dependentSrcMetadata) - newMetadata.directDependencies[libFile, srcFile] = newSignatures + val dependentSignatures = dependentSrcMetadata.directDependencies[libFile, srcFile] ?: emptyMap() + when { + dependentSrcMetadata is DirtyFileMetadata -> continue + this[dependentLibFile, dependentSrcFile]?.importedSignaturesModified == true -> continue + dependentSignatures.any { signatureHashCalculator[it.key] != it.value } -> { + val newMetadata = addNewMetadata(dependentLibFile, dependentSrcFile, dependentSrcMetadata) + newMetadata.importedSignaturesModified = true + } + dependentSignatures.keys != newSignatures -> { + val newMetadata = addNewMetadata(dependentLibFile, dependentSrcFile, dependentSrcMetadata) + newMetadata.directDependencies[libFile, srcFile] = newSignatures.associateWith { + signatureHashCalculator[it] ?: notFoundIcError("signature $it hash", libFile, srcFile) + } + } } } } @@ -412,15 +419,15 @@ class CacheUpdater( val cache = getLibIncrementalCache(libFile) for ((srcFile, srcFileMetadata) in srcFiles) { - val isSignatureUpdated = srcFileMetadata.isExportedSignaturesUpdated() - if (isSignatureUpdated || srcFileMetadata.importedInlineFunctionsModified) { + val isExportedSignatureUpdated = srcFileMetadata.isExportedSignaturesUpdated() + if (isExportedSignatureUpdated || srcFileMetadata.importedSignaturesModified) { // if exported signatures or imported inline functions were modified - rebuild filesToRebuild[srcFile] = srcFileMetadata - if (isSignatureUpdated) { + if (isExportedSignatureUpdated) { fileStats.addDirtFileStat(srcFile, DirtyFileState.UPDATED_EXPORTS) } - if (srcFileMetadata.importedInlineFunctionsModified) { - fileStats.addDirtFileStat(srcFile, DirtyFileState.UPDATED_INLINE_IMPORTS) + if (srcFileMetadata.importedSignaturesModified) { + fileStats.addDirtFileStat(srcFile, DirtyFileState.UPDATED_IMPORTS) } } else { // if signatures and inline functions are the same - just update cache metadata @@ -486,7 +493,7 @@ class CacheUpdater( var lastDirtyFiles: KotlinSourceFileMap = dirtyFileExports while (true) { - hashCalculator.updateTransitiveHashes(loadedIr.loadedFragments.values) + signatureHashCalculator.updateInlineFunctionTransitiveHashes(loadedIr.loadedFragments.values) val dirtyHeaders = rebuildDirtySourceMetadata(loadedIr.linker, loadedIr.loadedFragments, lastDirtyFiles) 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 d6d839c0d7a..701f3649780 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 @@ -8,6 +8,10 @@ package org.jetbrains.kotlin.ir.backend.js.ic import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.CrossModuleReferences import org.jetbrains.kotlin.ir.IrElement +import org.jetbrains.kotlin.ir.declarations.IrClass +import org.jetbrains.kotlin.ir.declarations.IrSymbolOwner +import org.jetbrains.kotlin.ir.declarations.IrTypeParametersContainer +import org.jetbrains.kotlin.ir.symbols.IrSymbol import org.jetbrains.kotlin.ir.util.DumpIrTreeVisitor import org.jetbrains.kotlin.js.config.JSConfigurationKeys import org.jetbrains.kotlin.library.KotlinLibrary @@ -85,6 +89,17 @@ internal fun IrElement.irElementHashForIC() = HashCalculatorForIC().also { ) }.finalize() +internal fun IrSymbol.irSymbolHashForIC() = HashCalculatorForIC().also { + it.update(toString()) + // symbol rendering prints very little information about type parameters + // TODO may be it make sense to update rendering? + (owner as? IrTypeParametersContainer)?.let { typeParameters -> + typeParameters.typeParameters.forEach { typeParameter -> + it.update(typeParameter.symbol.toString()) + } + } +}.finalize() + internal fun String.stringHashForIC() = HashCalculatorForIC().also { it.update(this) }.finalize() internal fun KotlinLibrary.fingerprint(fileIndex: Int) = HashCalculatorForIC().apply { diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/InlineFunctionTransitiveHashCalculator.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/IdSignatureHashCalculator.kt similarity index 80% rename from compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/InlineFunctionTransitiveHashCalculator.kt rename to compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/IdSignatureHashCalculator.kt index 6c240903304..74e2a58aef4 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/InlineFunctionTransitiveHashCalculator.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/IdSignatureHashCalculator.kt @@ -6,32 +6,33 @@ package org.jetbrains.kotlin.ir.backend.js.ic import org.jetbrains.kotlin.ir.IrElement -import org.jetbrains.kotlin.ir.declarations.IrFunction -import org.jetbrains.kotlin.ir.declarations.IrModuleFragment -import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction +import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.IrCall import org.jetbrains.kotlin.ir.expressions.IrFunctionReference +import org.jetbrains.kotlin.ir.symbols.IrSymbol import org.jetbrains.kotlin.ir.util.IdSignature import org.jetbrains.kotlin.ir.util.isFakeOverride import org.jetbrains.kotlin.ir.util.render import org.jetbrains.kotlin.ir.util.resolveFakeOverride import org.jetbrains.kotlin.ir.visitors.IrElementVisitor import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid +import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid import org.jetbrains.kotlin.ir.visitors.acceptVoid -class InlineFunctionTransitiveHashCalculator { +class IdSignatureHashCalculator { private val flatHashes = mutableMapOf() private val inlineFunctionCallGraph: MutableMap> = mutableMapOf() private val processingFunctions = mutableSetOf() private val functionTransitiveHashes = mutableMapOf() - private val idSignatureTransitiveHashes = mutableMapOf() - val transitiveHashes: Map - get() = idSignatureTransitiveHashes + private val allIdSignatureHashes = mutableMapOf() + private inner class FlatHashCalculator : IrElementVisitorVoid { - override fun visitElement(element: IrElement) = element.acceptChildren(this, null) + override fun visitElement(element: IrElement) { + element.acceptChildrenVoid(this) + } override fun visitSimpleFunction(declaration: IrSimpleFunction) { if (declaration.isInline) { @@ -47,11 +48,11 @@ class InlineFunctionTransitiveHashCalculator { } } // go deeper since local inline special declarations (like a reference adaptor) may appear - declaration.acceptChildren(this, null) + declaration.acceptChildrenVoid(this) } } - private inner class CallGraphBuilder : IrElementVisitor> { + private inner class InlineFunctionCallGraphBuilder : IrElementVisitor> { var inlineFunctionCallDepth: Int = 0 override fun visitElement(element: IrElement, data: MutableSet) = element.acceptChildren(this, data) @@ -103,7 +104,7 @@ class InlineFunctionTransitiveHashCalculator { functionInlineHash = functionInlineHash.combineWith(getInlineFunctionTransitiveHash(callee)) } processingFunctions.remove(f) - f.symbol.signature?.let { idSignatureTransitiveHashes[it] = functionInlineHash } + f.symbol.signature?.let { allIdSignatureHashes[it] = functionInlineHash } functionInlineHash } @@ -117,9 +118,17 @@ class InlineFunctionTransitiveHashCalculator { } } - fun updateTransitiveHashes(fragments: Collection) { + fun updateInlineFunctionTransitiveHashes(fragments: Collection) { fragments.forEach { it.acceptVoid(FlatHashCalculator()) } - fragments.forEach { it.acceptChildren(CallGraphBuilder(), mutableSetOf()) } + fragments.forEach { it.acceptChildren(InlineFunctionCallGraphBuilder(), mutableSetOf()) } updateTransitiveHashesByCallGraph() } + + fun addHashForSignatureIfNotExist(signature: IdSignature, symbol: IrSymbol) { + if (signature !in allIdSignatureHashes) { + allIdSignatureHashes[signature] = symbol.irSymbolHashForIC() + } + } + + operator fun get(signature: IdSignature) = allIdSignatureHashes[signature] } diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/IncrementalCache.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/IncrementalCache.kt index fef479e47b1..1142156b762 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/IncrementalCache.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/IncrementalCache.kt @@ -61,16 +61,12 @@ class IncrementalCache(private val library: KotlinLibrary, cachePath: String) { private class KotlinSourceFileMetadataFromDisk( override val inverseDependencies: KotlinSourceFileMap>, - override val directDependencies: KotlinSourceFileMap>, - - override val importedInlineFunctions: Map + override val directDependencies: KotlinSourceFileMap>, ) : KotlinSourceFileMetadata() private object KotlinSourceFileMetadataNotExist : KotlinSourceFileMetadata() { override val inverseDependencies = KotlinSourceFileMap>(emptyMap()) - override val directDependencies = KotlinSourceFileMap>(emptyMap()) - - override val importedInlineFunctions = emptyMap() + override val directDependencies = KotlinSourceFileMap>(emptyMap()) } private val kotlinLibrarySourceFileMetadata = mutableMapOf() @@ -165,46 +161,53 @@ class IncrementalCache(private val library: KotlinLibrary, cachePath: String) { private fun fetchSourceFileMetadata(srcFile: KotlinSourceFile, loadSignatures: Boolean) = kotlinLibrarySourceFileMetadata.getOrPut(srcFile) { val signatureToIndexMapping = signatureToIndexMappingFromMetadata.getOrPut(srcFile) { mutableMapOf() } - fun CodedInputStream.deserializeIdSignatureAndSave(deserializer: IdSignatureDeserializer) = readIdSignature { index -> + val deserializer: IdSignatureDeserializer by lazy { + kotlinLibraryHeader.signatureDeserializers[srcFile] ?: notFoundIcError("signature deserializer", libraryFile, srcFile) + } + + fun CodedInputStream.deserializeIdSignatureAndSave() = readIdSignature { index -> val signature = deserializer.deserializeIdSignature(index) signatureToIndexMapping[signature] = index signature } - val deserializer: IdSignatureDeserializer by lazy { - kotlinLibraryHeader.signatureDeserializers[srcFile] ?: notFoundIcError("signature deserializer", libraryFile, srcFile) + fun CodedInputStream.readDependencies(signaturesReader: () -> T) = buildMapUntil(readInt32()) { + val libraryFile = KotlinLibraryFile.fromProtoStream(this@readDependencies) + val depends = buildMapUntil(readInt32()) { + val dependencySrcFile = KotlinSourceFile.fromProtoStream(this@readDependencies) + put(dependencySrcFile, signaturesReader()) + } + put(libraryFile, depends) + } + + fun CodedInputStream.readDirectDependencies() = readDependencies { + if (loadSignatures) { + buildMapUntil(readInt32()) { + val signature = deserializeIdSignatureAndSave() + put(signature, ICHash.fromProtoStream(this@readDirectDependencies)) + } + } else { + repeat(readInt32()) { + skipIdSignature() + ICHash.fromProtoStream(this@readDirectDependencies) + } + emptyMap() + } + } + + fun CodedInputStream.readInverseDependencies() = readDependencies { + if (loadSignatures) { + buildSetUntil(readInt32()) { add(deserializeIdSignatureAndSave()) } + } else { + repeat(readInt32()) { skipIdSignature() } + emptySet() + } } srcFile.getCacheFile(METADATA_SUFFIX).useCodedInputIfExists { - fun readDependencies() = buildMapUntil(readInt32()) { - val libraryFile = KotlinLibraryFile.fromProtoStream(this@useCodedInputIfExists) - val depends = buildMapUntil(readInt32()) { - val dependencySrcFile = KotlinSourceFile.fromProtoStream(this@useCodedInputIfExists) - val dependencySignatures = if (loadSignatures) { - buildSetUntil(readInt32()) { add(deserializeIdSignatureAndSave(deserializer)) } - } else { - repeat(readInt32()) { skipIdSignature() } - emptySet() - } - put(dependencySrcFile, dependencySignatures) - } - put(libraryFile, depends) - } - - val directDependencies = KotlinSourceFileMap(readDependencies()) - val reverseDependencies = KotlinSourceFileMap(readDependencies()) - - val importedInlineFunctions = if (loadSignatures) { - buildMapUntil(readInt32()) { - val signature = deserializeIdSignatureAndSave(deserializer) - val transitiveHash = ICHash.fromProtoStream(this@useCodedInputIfExists) - put(signature, transitiveHash) - } - } else { - emptyMap() - } - - KotlinSourceFileMetadataFromDisk(reverseDependencies, directDependencies, importedInlineFunctions) + val directDependencies = KotlinSourceFileMap(readDirectDependencies()) + val reverseDependencies = KotlinSourceFileMap(readInverseDependencies()) + KotlinSourceFileMetadataFromDisk(reverseDependencies, directDependencies) } ?: KotlinSourceFileMetadataNotExist } @@ -223,30 +226,36 @@ class IncrementalCache(private val library: KotlinLibrary, cachePath: String) { fun CodedOutputStream.serializeIdSignature(signature: IdSignature) = writeIdSignature(signature) { signatureToIndexMapping[it] ?: signatureToIndexMappingSaved[it] } - headerCacheFile.useCodedOutput { - fun writeDepends(depends: KotlinSourceFileMap>) { - writeInt32NoTag(depends.size) - for ((dependencyLibFile, dependencySrcFiles) in depends) { - dependencyLibFile.toProtoStream(this) - writeInt32NoTag(dependencySrcFiles.size) - for ((dependencySrcFile, signatures) in dependencySrcFiles) { - dependencySrcFile.toProtoStream(this) - writeInt32NoTag(signatures.size) - for (signature in signatures) { - serializeIdSignature(signature) - } - } + fun CodedOutputStream.writeDependencies(depends: KotlinSourceFileMap, signaturesWriter: (T) -> Unit) { + writeInt32NoTag(depends.size) + for ((dependencyLibFile, dependencySrcFiles) in depends) { + dependencyLibFile.toProtoStream(this) + writeInt32NoTag(dependencySrcFiles.size) + for ((dependencySrcFile, signatures) in dependencySrcFiles) { + dependencySrcFile.toProtoStream(this) + signaturesWriter(signatures) } } + } - writeDepends(sourceFileMetadata.directDependencies) - writeDepends(sourceFileMetadata.inverseDependencies) - - writeInt32NoTag(sourceFileMetadata.importedInlineFunctions.size) - for ((signature, transitiveHash) in sourceFileMetadata.importedInlineFunctions) { + fun CodedOutputStream.writeDirectDependencies(depends: KotlinSourceFileMap>) = writeDependencies(depends) { + writeInt32NoTag(it.size) + for ((signature, hash) in it) { serializeIdSignature(signature) - transitiveHash.toProtoStream(this) + hash.toProtoStream(this) } } + + fun CodedOutputStream.writeInverseDependencies(depends: KotlinSourceFileMap>) = writeDependencies(depends) { + writeInt32NoTag(it.size) + for (signature in it) { + serializeIdSignature(signature) + } + } + + headerCacheFile.useCodedOutput { + writeDirectDependencies(sourceFileMetadata.directDependencies) + writeInverseDependencies(sourceFileMetadata.inverseDependencies) + } } } diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/KotlinSourceFileMetadata.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/KotlinSourceFileMetadata.kt index 6332e78b2c7..4156ad1f784 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/KotlinSourceFileMetadata.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/KotlinSourceFileMetadata.kt @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.ir.util.IdSignature import org.jetbrains.kotlin.library.KotlinLibrary import org.jetbrains.kotlin.protobuf.CodedInputStream import org.jetbrains.kotlin.protobuf.CodedOutputStream +import java.io.File @JvmInline value class KotlinLibraryFile(val path: String) { @@ -20,6 +21,9 @@ value class KotlinLibraryFile(val path: String) { companion object { fun fromProtoStream(input: CodedInputStream) = KotlinLibraryFile(input.readString()) } + + // for debugging purposes only + override fun toString(): String = File(path).name } @JvmInline @@ -31,6 +35,9 @@ value class KotlinSourceFile(val path: String) { companion object { fun fromProtoStream(input: CodedInputStream) = KotlinSourceFile(input.readString()) } + + // for debugging purposes only + override fun toString(): String = File(path).name } open class KotlinSourceFileMap(files: Map>) : @@ -94,9 +101,7 @@ abstract class KotlinSourceFileExports { } abstract class KotlinSourceFileMetadata : KotlinSourceFileExports() { - abstract val directDependencies: KotlinSourceFileMap> - - abstract val importedInlineFunctions: Map + abstract val directDependencies: KotlinSourceFileMap> } -fun KotlinSourceFileMetadata.isEmpty() = inverseDependencies.isEmpty() && directDependencies.isEmpty() && importedInlineFunctions.isEmpty() +fun KotlinSourceFileMetadata.isEmpty() = inverseDependencies.isEmpty() && directDependencies.isEmpty() diff --git a/js/js.translator/testData/incremental/invalidation/addUpdateRemoveDependentFile/main/module.info b/js/js.translator/testData/incremental/invalidation/addUpdateRemoveDependentFile/main/module.info index 2f0924d3a9e..68f31b16b1b 100644 --- a/js/js.translator/testData/incremental/invalidation/addUpdateRemoveDependentFile/main/module.info +++ b/js/js.translator/testData/incremental/invalidation/addUpdateRemoveDependentFile/main/module.info @@ -3,17 +3,17 @@ STEP 0: added file: m.kt STEP 1: dependencies: lib1, lib2 - updated inline imports: m.kt + updated imports: m.kt STEP 2: dependencies: lib1, lib2 STEP 3..4: dependencies: lib1, lib2 - updated inline imports: m.kt + updated imports: m.kt STEP 5: dependencies: lib1, lib2 STEP 6: dependencies: lib1, lib2 - updated inline imports: m.kt + updated imports: m.kt STEP 7: dependencies: lib1, lib2 - updated inline imports: m.kt + updated imports: m.kt diff --git a/js/js.translator/testData/incremental/invalidation/addUpdateRemoveDependentModule/main/module.info b/js/js.translator/testData/incremental/invalidation/addUpdateRemoveDependentModule/main/module.info index 858e97280c8..96b32437e2f 100644 --- a/js/js.translator/testData/incremental/invalidation/addUpdateRemoveDependentModule/main/module.info +++ b/js/js.translator/testData/incremental/invalidation/addUpdateRemoveDependentModule/main/module.info @@ -10,7 +10,7 @@ STEP 1: modified ir: m.kt STEP 2: dependencies: lib1, lib2 - updated inline imports: m.kt + updated imports: m.kt STEP 3: dependencies: lib1 modifications: diff --git a/js/js.translator/testData/incremental/invalidation/circleInlineImportsUpdate/lib1/module.info b/js/js.translator/testData/incremental/invalidation/circleInlineImportsUpdate/lib1/module.info index 4eb41d5495e..d78440b68eb 100644 --- a/js/js.translator/testData/incremental/invalidation/circleInlineImportsUpdate/lib1/module.info +++ b/js/js.translator/testData/incremental/invalidation/circleInlineImportsUpdate/lib1/module.info @@ -6,9 +6,9 @@ STEP 1: modifications: U : f1.1.kt -> f1.kt modified ir: f1.kt - updated inline imports: f.kt, f2.kt, f3.kt + updated imports: f.kt, f2.kt, f3.kt STEP 2: modifications: U : f1.0.kt -> f1.kt modified ir: f1.kt - updated inline imports: f.kt, f2.kt, f3.kt + updated imports: f.kt, f2.kt, f3.kt diff --git a/js/js.translator/testData/incremental/invalidation/circleInlineImportsUpdate/main/module.info b/js/js.translator/testData/incremental/invalidation/circleInlineImportsUpdate/main/module.info index 2796e2311c8..86cd47f6b2c 100644 --- a/js/js.translator/testData/incremental/invalidation/circleInlineImportsUpdate/main/module.info +++ b/js/js.translator/testData/incremental/invalidation/circleInlineImportsUpdate/main/module.info @@ -3,4 +3,4 @@ STEP 0: added file: m.kt STEP 1..2: dependencies: lib1 - updated inline imports: m.kt + updated imports: m.kt diff --git a/js/js.translator/testData/incremental/invalidation/class/lib1/l1.0_data_class.kt b/js/js.translator/testData/incremental/invalidation/class/lib1/l1.0_data_class.kt new file mode 100644 index 00000000000..9be505b0aec --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/class/lib1/l1.0_data_class.kt @@ -0,0 +1,2 @@ +data class Demo(val x: Int) { +} diff --git a/js/js.translator/testData/incremental/invalidation/class/lib1/l1.0_simple_class.kt b/js/js.translator/testData/incremental/invalidation/class/lib1/l1.0_simple_class.kt deleted file mode 100644 index 2e116f7b12c..00000000000 --- a/js/js.translator/testData/incremental/invalidation/class/lib1/l1.0_simple_class.kt +++ /dev/null @@ -1,3 +0,0 @@ -// TODO: After KT-51088, m.kt from main module must be dirty -class Demo(val x: Int) { -} diff --git a/js/js.translator/testData/incremental/invalidation/class/lib1/l1.1_data_class.kt b/js/js.translator/testData/incremental/invalidation/class/lib1/l1.1_data_class.kt deleted file mode 100644 index 3f68e339ac7..00000000000 --- a/js/js.translator/testData/incremental/invalidation/class/lib1/l1.1_data_class.kt +++ /dev/null @@ -1,3 +0,0 @@ -// TODO: After KT-51088, m.kt from main module must be dirty -data class Demo(val x: Int) { -} diff --git a/js/js.translator/testData/incremental/invalidation/class/lib1/l1.1_simple_class.kt b/js/js.translator/testData/incremental/invalidation/class/lib1/l1.1_simple_class.kt new file mode 100644 index 00000000000..80091b4b4fc --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/class/lib1/l1.1_simple_class.kt @@ -0,0 +1,2 @@ +class Demo(val x: Int) { +} diff --git a/js/js.translator/testData/incremental/invalidation/class/lib1/l1.2_inline_class.kt b/js/js.translator/testData/incremental/invalidation/class/lib1/l1.2_inline_class.kt index b0cdbcfad8f..50f0b101879 100644 --- a/js/js.translator/testData/incremental/invalidation/class/lib1/l1.2_inline_class.kt +++ b/js/js.translator/testData/incremental/invalidation/class/lib1/l1.2_inline_class.kt @@ -1,3 +1,2 @@ -// TODO: After KT-51088, m.kt from main module must be dirty inline class Demo(val x: Int) { } diff --git a/js/js.translator/testData/incremental/invalidation/class/lib1/module.info b/js/js.translator/testData/incremental/invalidation/class/lib1/module.info index edb9ce6d80a..4b419b9c275 100644 --- a/js/js.translator/testData/incremental/invalidation/class/lib1/module.info +++ b/js/js.translator/testData/incremental/invalidation/class/lib1/module.info @@ -1,16 +1,19 @@ STEP 0: modifications: - U : l1.0_simple_class.kt -> l1.kt + U : l1.0_data_class.kt -> l1.kt added file: l1.kt STEP 1: modifications: - U : l1.1_data_class.kt -> l1.kt + U : l1.1_simple_class.kt -> l1.kt modified ir: l1.kt + updated exports: l1.kt STEP 2: - modifications: - U : l1.0_simple_class.kt -> l1.kt - modified ir: l1.kt -STEP 3: modifications: U : l1.2_inline_class.kt -> l1.kt modified ir: l1.kt + updated exports: l1.kt +STEP 3: + modifications: + U : l1.1_simple_class.kt -> l1.kt + modified ir: l1.kt + updated exports: l1.kt diff --git a/js/js.translator/testData/incremental/invalidation/class/main/m.kt b/js/js.translator/testData/incremental/invalidation/class/main/m.kt index d77b0982007..6604fb36756 100644 --- a/js/js.translator/testData/incremental/invalidation/class/main/m.kt +++ b/js/js.translator/testData/incremental/invalidation/class/main/m.kt @@ -1,8 +1,18 @@ fun box(stepId: Int): String { + val d = Demo(15) when (stepId) { - 0, 2 -> if (Demo(15) == Demo(15)) return "Fail" - 1, 3 -> if (Demo(15) != Demo(15)) return "Fail" + 0, 2 -> { + if (!testEquals(d, Demo(15))) return "Fail equals" + if (testHashCode(d) != Demo(15).hashCode()) return "Fail hashCode" + if (testToString(d) != "Demo(x=15)") return "Fail toString" + } + 1, 3-> { + if (testEquals(d, Demo(15))) return "Fail equals" + if (testHashCode(d) == Demo(15).hashCode()) return "Fail hashCode" + if (testToString(d) != "[object Object]") return "Fail toString" + } else -> return "Unknown" } + return "OK" } diff --git a/js/js.translator/testData/incremental/invalidation/class/main/module.info b/js/js.translator/testData/incremental/invalidation/class/main/module.info index 7d5eef3e8a1..9550f5463aa 100644 --- a/js/js.translator/testData/incremental/invalidation/class/main/module.info +++ b/js/js.translator/testData/incremental/invalidation/class/main/module.info @@ -1,5 +1,6 @@ STEP 0: dependencies: lib1 - added file: m.kt + added file: m.kt, testEquals.kt, testHashCode.kt, testToString.kt STEP 1..3: dependencies: lib1 + updated imports: m.kt, testEquals.kt, testHashCode.kt, testToString.kt diff --git a/js/js.translator/testData/incremental/invalidation/class/main/testEquals.kt b/js/js.translator/testData/incremental/invalidation/class/main/testEquals.kt new file mode 100644 index 00000000000..3d499bae39c --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/class/main/testEquals.kt @@ -0,0 +1,3 @@ +fun testEquals(lhs: Demo, rhs: Demo): Boolean { + return lhs == rhs +} diff --git a/js/js.translator/testData/incremental/invalidation/class/main/testHashCode.kt b/js/js.translator/testData/incremental/invalidation/class/main/testHashCode.kt new file mode 100644 index 00000000000..d56070a5e1d --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/class/main/testHashCode.kt @@ -0,0 +1,3 @@ +fun testHashCode(d: Demo): Int { + return d.hashCode() +} diff --git a/js/js.translator/testData/incremental/invalidation/class/main/testToString.kt b/js/js.translator/testData/incremental/invalidation/class/main/testToString.kt new file mode 100644 index 00000000000..cbf8eb2058b --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/class/main/testToString.kt @@ -0,0 +1,3 @@ +fun testToString(d: Demo): String { + return d.toString() +} diff --git a/js/js.translator/testData/incremental/invalidation/class/project.info b/js/js.translator/testData/incremental/invalidation/class/project.info index 0b4e2109318..e604fbca6b9 100644 --- a/js/js.translator/testData/incremental/invalidation/class/project.info +++ b/js/js.translator/testData/incremental/invalidation/class/project.info @@ -5,4 +5,4 @@ STEP 0: dirty js: lib1, main STEP 1..3: libs: lib1, main - dirty js: lib1 + dirty js: lib1, main diff --git a/js/js.translator/testData/incremental/invalidation/classFunctionsAndFields/main/module.info b/js/js.translator/testData/incremental/invalidation/classFunctionsAndFields/main/module.info index cc0a1a54084..77b55c9fa21 100644 --- a/js/js.translator/testData/incremental/invalidation/classFunctionsAndFields/main/module.info +++ b/js/js.translator/testData/incremental/invalidation/classFunctionsAndFields/main/module.info @@ -5,11 +5,16 @@ STEP 1: dependencies: lib1 STEP 2: dependencies: lib1 - updated inline imports: m.kt + updated imports: m.kt STEP 3: dependencies: lib1 modified ir: m.kt -STEP 4..9: +STEP 4..7: + dependencies: lib1 +STEP 8: + dependencies: lib1 + updated imports: m.kt +STEP 9: dependencies: lib1 STEP 10..11: dependencies: lib1 diff --git a/js/js.translator/testData/incremental/invalidation/classFunctionsAndFields/project.info b/js/js.translator/testData/incremental/invalidation/classFunctionsAndFields/project.info index f89e79b0d80..888fbb20690 100644 --- a/js/js.translator/testData/incremental/invalidation/classFunctionsAndFields/project.info +++ b/js/js.translator/testData/incremental/invalidation/classFunctionsAndFields/project.info @@ -9,13 +9,13 @@ STEP 1: STEP 2..3: libs: lib1, main dirty js: lib1, main -STEP 4..6: +STEP 4..7: libs: lib1, main dirty js: lib1 -STEP 7: +STEP 8: libs: lib1, main - dirty js: lib1 -STEP 8..9: + dirty js: lib1, main +STEP 9: libs: lib1, main dirty js: lib1 STEP 10..11: diff --git a/js/js.translator/testData/incremental/invalidation/exportsThroughInlineFunction/lib1/module.info b/js/js.translator/testData/incremental/invalidation/exportsThroughInlineFunction/lib1/module.info index 17860c84248..6e89a823ae8 100644 --- a/js/js.translator/testData/incremental/invalidation/exportsThroughInlineFunction/lib1/module.info +++ b/js/js.translator/testData/incremental/invalidation/exportsThroughInlineFunction/lib1/module.info @@ -17,7 +17,7 @@ STEP 3: modifications: U : l1.3.kt -> l1.kt modified ir: l1.kt - updated inline imports: l2.kt + updated imports: l2.kt STEP 4: modifications: U : l2.1.kt -> l2.kt @@ -35,5 +35,5 @@ STEP 7: modifications: U : l2.0.kt -> l2.kt modified ir: l2.kt - updated inline imports: l1.kt + updated imports: l1.kt updated exports: l1.kt diff --git a/js/js.translator/testData/incremental/invalidation/exportsThroughInlineFunction/main/module.info b/js/js.translator/testData/incremental/invalidation/exportsThroughInlineFunction/main/module.info index 988a74f3734..7b3f348c19e 100644 --- a/js/js.translator/testData/incremental/invalidation/exportsThroughInlineFunction/main/module.info +++ b/js/js.translator/testData/incremental/invalidation/exportsThroughInlineFunction/main/module.info @@ -3,9 +3,9 @@ STEP 0: added file: m.kt STEP 1..4: dependencies: lib1 - updated inline imports: m.kt + updated imports: m.kt STEP 5: dependencies: lib1 STEP 6..7: dependencies: lib1 - updated inline imports: m.kt + updated imports: m.kt diff --git a/js/js.translator/testData/incremental/invalidation/fakeOverrideInheritance/lib1/module.info b/js/js.translator/testData/incremental/invalidation/fakeOverrideInheritance/lib1/module.info index 1e1fb2caf45..1d5ca2f6403 100644 --- a/js/js.translator/testData/incremental/invalidation/fakeOverrideInheritance/lib1/module.info +++ b/js/js.translator/testData/incremental/invalidation/fakeOverrideInheritance/lib1/module.info @@ -8,12 +8,12 @@ STEP 1: modifications: U : A.1.kt -> A.kt modified ir: A.kt - updated inline imports: B.kt, C.kt + updated imports: B.kt, C.kt STEP 2: modifications: U : B.2.kt -> B.kt modified ir: B.kt - updated inline imports: C.kt + updated imports: C.kt STEP 3: modifications: U : A.0.kt -> A.kt @@ -22,9 +22,9 @@ STEP 4: modifications: U : B.0.kt -> B.kt modified ir: B.kt - updated inline imports: C.kt + updated imports: C.kt STEP 5: modifications: U : A.1.kt -> A.kt modified ir: A.kt - updated inline imports: B.kt, C.kt + updated imports: B.kt, C.kt diff --git a/js/js.translator/testData/incremental/invalidation/fakeOverrideInheritance/main/module.info b/js/js.translator/testData/incremental/invalidation/fakeOverrideInheritance/main/module.info index 19768e93727..e6f916171c5 100644 --- a/js/js.translator/testData/incremental/invalidation/fakeOverrideInheritance/main/module.info +++ b/js/js.translator/testData/incremental/invalidation/fakeOverrideInheritance/main/module.info @@ -3,4 +3,4 @@ STEP 0: added file: m.kt, classABC.kt STEP 1..5: dependencies: lib1 - updated inline imports: m.kt, classABC.kt + updated imports: m.kt, classABC.kt diff --git a/js/js.translator/testData/incremental/invalidation/fakeOverrideInlineExtension/main/module.info b/js/js.translator/testData/incremental/invalidation/fakeOverrideInlineExtension/main/module.info index 1d40cc4469e..226012191ac 100644 --- a/js/js.translator/testData/incremental/invalidation/fakeOverrideInlineExtension/main/module.info +++ b/js/js.translator/testData/incremental/invalidation/fakeOverrideInlineExtension/main/module.info @@ -3,4 +3,4 @@ STEP 0: added file: m.kt, classA.kt STEP 1..4: dependencies: lib1 - updated inline imports: m.kt, classA.kt + updated imports: m.kt, classA.kt diff --git a/js/js.translator/testData/incremental/invalidation/fakeOverrideInlineFunction/lib2/module.info b/js/js.translator/testData/incremental/invalidation/fakeOverrideInlineFunction/lib2/module.info index bf6598795b8..b3714811939 100644 --- a/js/js.translator/testData/incremental/invalidation/fakeOverrideInlineFunction/lib2/module.info +++ b/js/js.translator/testData/incremental/invalidation/fakeOverrideInlineFunction/lib2/module.info @@ -3,6 +3,6 @@ STEP 0: added file: l2.kt STEP 1: dependencies: lib1 - updated inline imports: l2.kt + updated imports: l2.kt STEP 2: dependencies: lib1 diff --git a/js/js.translator/testData/incremental/invalidation/fakeOverrideInlineFunction/main/module.info b/js/js.translator/testData/incremental/invalidation/fakeOverrideInlineFunction/main/module.info index d0b85963a6b..084fe1491c1 100644 --- a/js/js.translator/testData/incremental/invalidation/fakeOverrideInlineFunction/main/module.info +++ b/js/js.translator/testData/incremental/invalidation/fakeOverrideInlineFunction/main/module.info @@ -3,4 +3,4 @@ STEP 0: added file: m.kt STEP 1..2: dependencies: lib1, lib2 - updated inline imports: m.kt + updated imports: m.kt diff --git a/js/js.translator/testData/incremental/invalidation/fakeOverrideInlineProperty/main/module.info b/js/js.translator/testData/incremental/invalidation/fakeOverrideInlineProperty/main/module.info index 7fdd4b26739..cbee1ab0d42 100644 --- a/js/js.translator/testData/incremental/invalidation/fakeOverrideInlineProperty/main/module.info +++ b/js/js.translator/testData/incremental/invalidation/fakeOverrideInlineProperty/main/module.info @@ -3,4 +3,4 @@ STEP 0: added file: m.kt, classA.kt STEP 1..2: dependencies: lib1 - updated inline imports: m.kt, classA.kt + updated imports: m.kt, classA.kt diff --git a/js/js.translator/testData/incremental/invalidation/genericInlineFunctions/libProxy/module.info b/js/js.translator/testData/incremental/invalidation/genericInlineFunctions/libProxy/module.info index 01c973ba59c..286ba0733cd 100644 --- a/js/js.translator/testData/incremental/invalidation/genericInlineFunctions/libProxy/module.info +++ b/js/js.translator/testData/incremental/invalidation/genericInlineFunctions/libProxy/module.info @@ -10,13 +10,13 @@ STEP 8: added file: proxy.kt STEP 9: dependencies: lib1 - updated inline imports: proxy.kt + updated imports: proxy.kt STEP 10..14: dependencies: lib1 modified ir: proxy.kt STEP 15: dependencies: lib1 - updated inline imports: proxy.kt + updated imports: proxy.kt STEP 16: dependencies: lib1 modifications: @@ -24,10 +24,10 @@ STEP 16: modified ir: proxy.kt STEP 17: dependencies: lib1 - updated inline imports: proxy.kt + updated imports: proxy.kt STEP 18..22: dependencies: lib1 modified ir: proxy.kt STEP 23: dependencies: lib1 - updated inline imports: proxy.kt + updated imports: proxy.kt diff --git a/js/js.translator/testData/incremental/invalidation/genericInlineFunctions/main/module.info b/js/js.translator/testData/incremental/invalidation/genericInlineFunctions/main/module.info index 7f5adab02cf..6fc0dbfd7a1 100644 --- a/js/js.translator/testData/incremental/invalidation/genericInlineFunctions/main/module.info +++ b/js/js.translator/testData/incremental/invalidation/genericInlineFunctions/main/module.info @@ -3,13 +3,13 @@ STEP 0: added file: m.kt STEP 1: dependencies: lib1 - updated inline imports: m.kt + updated imports: m.kt STEP 2..6: dependencies: lib1 modified ir: m.kt STEP 7: dependencies: lib1 - updated inline imports: m.kt + updated imports: m.kt STEP 8: dependencies: lib1, libProxy modifications: @@ -17,22 +17,22 @@ STEP 8: modified ir: m.kt STEP 9..13: dependencies: lib1, libProxy - updated inline imports: m.kt + updated imports: m.kt STEP 14: dependencies: lib1, libProxy modified ir: m.kt STEP 15: dependencies: lib1, libProxy - updated inline imports: m.kt + updated imports: m.kt STEP 16: dependencies: lib1, libProxy modified ir: m.kt STEP 17..21: dependencies: lib1, libProxy - updated inline imports: m.kt + updated imports: m.kt STEP 22: dependencies: lib1, libProxy modified ir: m.kt STEP 23: dependencies: lib1, libProxy - updated inline imports: m.kt + updated imports: m.kt diff --git a/js/js.translator/testData/incremental/invalidation/gettersAndSettersInlining/main/module.info b/js/js.translator/testData/incremental/invalidation/gettersAndSettersInlining/main/module.info index d871ce55474..30595c7cf95 100644 --- a/js/js.translator/testData/incremental/invalidation/gettersAndSettersInlining/main/module.info +++ b/js/js.translator/testData/incremental/invalidation/gettersAndSettersInlining/main/module.info @@ -1,5 +1,8 @@ STEP 0: dependencies: lib1, lib2 added file: m.kt -STEP 1..4: +STEP 1..3: + dependencies: lib1, lib2 + updated imports: m.kt +STEP 4: dependencies: lib1, lib2 diff --git a/js/js.translator/testData/incremental/invalidation/gettersAndSettersInlining/project.info b/js/js.translator/testData/incremental/invalidation/gettersAndSettersInlining/project.info index 9e273f83145..e0c715ec3dc 100644 --- a/js/js.translator/testData/incremental/invalidation/gettersAndSettersInlining/project.info +++ b/js/js.translator/testData/incremental/invalidation/gettersAndSettersInlining/project.info @@ -5,7 +5,7 @@ STEP 0: dirty js: lib1, lib2, main STEP 1..3: libs: lib1, lib2, main - dirty js: lib1 + dirty js: lib1, main STEP 4: libs: lib1, lib2, main dirty js: lib2 diff --git a/js/js.translator/testData/incremental/invalidation/inlineBecomeNonInline/main/module.info b/js/js.translator/testData/incremental/invalidation/inlineBecomeNonInline/main/module.info index 5e24890d7f7..f08b168b37c 100644 --- a/js/js.translator/testData/incremental/invalidation/inlineBecomeNonInline/main/module.info +++ b/js/js.translator/testData/incremental/invalidation/inlineBecomeNonInline/main/module.info @@ -3,6 +3,6 @@ STEP 0: added file: m.kt STEP 1: dependencies: lib1 - updated inline imports: m.kt + updated imports: m.kt STEP 2: dependencies: lib1 diff --git a/js/js.translator/testData/incremental/invalidation/inlineFunctionAsParam/main/module.info b/js/js.translator/testData/incremental/invalidation/inlineFunctionAsParam/main/module.info index 2f886d64980..4a805625b84 100644 --- a/js/js.translator/testData/incremental/invalidation/inlineFunctionAsParam/main/module.info +++ b/js/js.translator/testData/incremental/invalidation/inlineFunctionAsParam/main/module.info @@ -3,22 +3,22 @@ STEP 0: added file: m.kt STEP 1..2: dependencies: lib1 - updated inline imports: m.kt + updated imports: m.kt STEP 3..4: dependencies: lib1 modified ir: m.kt STEP 5: dependencies: lib1 - updated inline imports: m.kt + updated imports: m.kt STEP 6: dependencies: lib1 modified ir: m.kt STEP 7: dependencies: lib1 - updated inline imports: m.kt + updated imports: m.kt STEP 8: dependencies: lib1 modified ir: m.kt STEP 9: dependencies: lib1 - updated inline imports: m.kt + updated imports: m.kt diff --git a/js/js.translator/testData/incremental/invalidation/inlineFunctionDefaultParams/main/module.info b/js/js.translator/testData/incremental/invalidation/inlineFunctionDefaultParams/main/module.info index 308b6d5e10b..b2d2c0ddf9d 100644 --- a/js/js.translator/testData/incremental/invalidation/inlineFunctionDefaultParams/main/module.info +++ b/js/js.translator/testData/incremental/invalidation/inlineFunctionDefaultParams/main/module.info @@ -3,10 +3,10 @@ STEP 0: added file: m.kt STEP 1: dependencies: lib1 - updated inline imports: m.kt + updated imports: m.kt STEP 2: dependencies: lib1 modified ir: m.kt STEP 3: dependencies: lib1 - updated inline imports: m.kt + updated imports: m.kt diff --git a/js/js.translator/testData/incremental/invalidation/jsCode/main/module.info b/js/js.translator/testData/incremental/invalidation/jsCode/main/module.info index c8905bb5d62..116ed565168 100644 --- a/js/js.translator/testData/incremental/invalidation/jsCode/main/module.info +++ b/js/js.translator/testData/incremental/invalidation/jsCode/main/module.info @@ -3,4 +3,4 @@ STEP 0: added file: m.kt STEP 1..3: dependencies: lib1 - updated inline imports: m.kt + updated imports: m.kt diff --git a/js/js.translator/testData/incremental/invalidation/jsExport/main/module.info b/js/js.translator/testData/incremental/invalidation/jsExport/main/module.info index 8e24e7e9cbf..d91e9052012 100644 --- a/js/js.translator/testData/incremental/invalidation/jsExport/main/module.info +++ b/js/js.translator/testData/incremental/invalidation/jsExport/main/module.info @@ -3,6 +3,6 @@ STEP 0: added file: m.kt STEP 1..3: dependencies: lib1 - updated inline imports: m.kt + updated imports: m.kt STEP 4..6: dependencies: lib1 diff --git a/js/js.translator/testData/incremental/invalidation/moveFilesBetweenModules/lib3/module.info b/js/js.translator/testData/incremental/invalidation/moveFilesBetweenModules/lib3/module.info index d2aed7dbaf9..93ef92c1918 100644 --- a/js/js.translator/testData/incremental/invalidation/moveFilesBetweenModules/lib3/module.info +++ b/js/js.translator/testData/incremental/invalidation/moveFilesBetweenModules/lib3/module.info @@ -3,4 +3,4 @@ STEP 0: added file: l3.kt STEP 1..2: dependencies: lib1, lib2 - updated inline imports: l3.kt + updated imports: l3.kt diff --git a/js/js.translator/testData/incremental/invalidation/moveFilesBetweenModules/main/module.info b/js/js.translator/testData/incremental/invalidation/moveFilesBetweenModules/main/module.info index ce57004340c..4d0b6dae7aa 100644 --- a/js/js.translator/testData/incremental/invalidation/moveFilesBetweenModules/main/module.info +++ b/js/js.translator/testData/incremental/invalidation/moveFilesBetweenModules/main/module.info @@ -3,4 +3,4 @@ STEP 0: added file: m.kt STEP 1..2: dependencies: lib1, lib2, lib3 - updated inline imports: m.kt + updated imports: m.kt diff --git a/js/js.translator/testData/incremental/invalidation/moveInlineFunctionBetweenModules/lib2/module.info b/js/js.translator/testData/incremental/invalidation/moveInlineFunctionBetweenModules/lib2/module.info index 666b7c50620..cbb6033f361 100644 --- a/js/js.translator/testData/incremental/invalidation/moveInlineFunctionBetweenModules/lib2/module.info +++ b/js/js.translator/testData/incremental/invalidation/moveInlineFunctionBetweenModules/lib2/module.info @@ -7,4 +7,4 @@ STEP 1: U : l22.1.kt -> l22.kt added file: l22.kt updated exports: l22.kt - updated inline imports: l2.kt + updated imports: l2.kt diff --git a/js/js.translator/testData/incremental/invalidation/moveInlineFunctionBetweenModules/lib3/module.info b/js/js.translator/testData/incremental/invalidation/moveInlineFunctionBetweenModules/lib3/module.info index 231b4fdf915..08a32908cbf 100644 --- a/js/js.translator/testData/incremental/invalidation/moveInlineFunctionBetweenModules/lib3/module.info +++ b/js/js.translator/testData/incremental/invalidation/moveInlineFunctionBetweenModules/lib3/module.info @@ -3,4 +3,4 @@ STEP 0: added file: l3.kt STEP 1: dependencies: lib1, lib2 - updated inline imports: l3.kt + updated imports: l3.kt diff --git a/js/js.translator/testData/incremental/invalidation/moveInlineFunctionBetweenModules/main/module.info b/js/js.translator/testData/incremental/invalidation/moveInlineFunctionBetweenModules/main/module.info index 8e0c882cfd8..18fc898fcfc 100644 --- a/js/js.translator/testData/incremental/invalidation/moveInlineFunctionBetweenModules/main/module.info +++ b/js/js.translator/testData/incremental/invalidation/moveInlineFunctionBetweenModules/main/module.info @@ -3,4 +3,4 @@ STEP 0: added file: m.kt STEP 1: dependencies: lib1, lib2, lib3 - updated inline imports: m.kt + updated imports: m.kt diff --git a/js/js.translator/testData/incremental/invalidation/nonInlineBecomeInline/lib1/l1.1.kt b/js/js.translator/testData/incremental/invalidation/nonInlineBecomeInline/lib1/l1.1.kt index b06d5e6d6e2..aadb92dc917 100644 --- a/js/js.translator/testData/incremental/invalidation/nonInlineBecomeInline/lib1/l1.1.kt +++ b/js/js.translator/testData/incremental/invalidation/nonInlineBecomeInline/lib1/l1.1.kt @@ -1,2 +1 @@ -// TODO: After KT-51083, m.kt from main module must be dirty inline fun foo() = 33 diff --git a/js/js.translator/testData/incremental/invalidation/nonInlineBecomeInline/lib1/l1.2.kt b/js/js.translator/testData/incremental/invalidation/nonInlineBecomeInline/lib1/l1.2.kt index 21d9e42d8b3..c4b4f9364b2 100644 --- a/js/js.translator/testData/incremental/invalidation/nonInlineBecomeInline/lib1/l1.2.kt +++ b/js/js.translator/testData/incremental/invalidation/nonInlineBecomeInline/lib1/l1.2.kt @@ -1,2 +1 @@ -// TODO: After KT-51083, m.kt from main module must be dirty inline fun foo() = 77 diff --git a/js/js.translator/testData/incremental/invalidation/nonInlineBecomeInline/lib1/l1.4.kt b/js/js.translator/testData/incremental/invalidation/nonInlineBecomeInline/lib1/l1.4.kt new file mode 100644 index 00000000000..c06469417ce --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/nonInlineBecomeInline/lib1/l1.4.kt @@ -0,0 +1 @@ +fun foo() = 100 diff --git a/js/js.translator/testData/incremental/invalidation/nonInlineBecomeInline/lib1/module.info b/js/js.translator/testData/incremental/invalidation/nonInlineBecomeInline/lib1/module.info index 4ae641e95be..20d0d2b0158 100644 --- a/js/js.translator/testData/incremental/invalidation/nonInlineBecomeInline/lib1/module.info +++ b/js/js.translator/testData/incremental/invalidation/nonInlineBecomeInline/lib1/module.info @@ -10,3 +10,11 @@ STEP 2: modifications: U : l1.2.kt -> l1.kt modified ir: l1.kt +STEP 3: + modifications: + U : l1.0.kt -> l1.kt + modified ir: l1.kt +STEP 4: + modifications: + U : l1.4.kt -> l1.kt + modified ir: l1.kt diff --git a/js/js.translator/testData/incremental/invalidation/nonInlineBecomeInline/main/m.kt b/js/js.translator/testData/incremental/invalidation/nonInlineBecomeInline/main/m.kt index bb295676f9d..765562b0945 100644 --- a/js/js.translator/testData/incremental/invalidation/nonInlineBecomeInline/main/m.kt +++ b/js/js.translator/testData/incremental/invalidation/nonInlineBecomeInline/main/m.kt @@ -1,8 +1,9 @@ fun box(stepId: Int): String { when (stepId) { - 0 -> if (foo() != 42) return "Fail" + 0, 3 -> if (foo() != 42) return "Fail" 1 -> if (foo() != 33) return "Fail" 2 -> if (foo() != 77) return "Fail" + 4 -> if (foo() != 100) return "Fail" else -> return "Unknown" } return "OK" diff --git a/js/js.translator/testData/incremental/invalidation/nonInlineBecomeInline/main/module.info b/js/js.translator/testData/incremental/invalidation/nonInlineBecomeInline/main/module.info index 549c56cad93..9a3e8502c3b 100644 --- a/js/js.translator/testData/incremental/invalidation/nonInlineBecomeInline/main/module.info +++ b/js/js.translator/testData/incremental/invalidation/nonInlineBecomeInline/main/module.info @@ -1,5 +1,8 @@ STEP 0: dependencies: lib1 added file: m.kt -STEP 1..2: +STEP 1..3: + dependencies: lib1 + updated imports: m.kt +STEP 4: dependencies: lib1 diff --git a/js/js.translator/testData/incremental/invalidation/nonInlineBecomeInline/project.info b/js/js.translator/testData/incremental/invalidation/nonInlineBecomeInline/project.info index 9af68d0168a..4621764cc7f 100644 --- a/js/js.translator/testData/incremental/invalidation/nonInlineBecomeInline/project.info +++ b/js/js.translator/testData/incremental/invalidation/nonInlineBecomeInline/project.info @@ -1,8 +1,8 @@ MODULES: lib1, main -STEP 0: +STEP 0..3: libs: lib1, main dirty js: lib1, main -STEP 1..2: +STEP 4: libs: lib1, main dirty js: lib1 diff --git a/js/js.translator/testData/incremental/invalidation/suspendFunctions/lib1/l1.1.kt b/js/js.translator/testData/incremental/invalidation/suspendFunctions/lib1/l1.1.kt index 1a52527e72b..a5c3821fa97 100644 --- a/js/js.translator/testData/incremental/invalidation/suspendFunctions/lib1/l1.1.kt +++ b/js/js.translator/testData/incremental/invalidation/suspendFunctions/lib1/l1.1.kt @@ -1,3 +1,2 @@ -// TODO: After KT-51090, m.kt from main module must be dirty suspend fun fooX() = 11 inline fun fooY() = 22 diff --git a/js/js.translator/testData/incremental/invalidation/suspendFunctions/main/module.info b/js/js.translator/testData/incremental/invalidation/suspendFunctions/main/module.info index 39e307c89d9..86cd47f6b2c 100644 --- a/js/js.translator/testData/incremental/invalidation/suspendFunctions/main/module.info +++ b/js/js.translator/testData/incremental/invalidation/suspendFunctions/main/module.info @@ -1,8 +1,6 @@ STEP 0: dependencies: lib1 added file: m.kt -STEP 1: +STEP 1..2: dependencies: lib1 -STEP 2: - dependencies: lib1 - updated inline imports: m.kt + updated imports: m.kt diff --git a/js/js.translator/testData/incremental/invalidation/transitiveInlineFunction/lib2/module.info b/js/js.translator/testData/incremental/invalidation/transitiveInlineFunction/lib2/module.info index 0a26fbd41ea..e3581e75e4a 100644 --- a/js/js.translator/testData/incremental/invalidation/transitiveInlineFunction/lib2/module.info +++ b/js/js.translator/testData/incremental/invalidation/transitiveInlineFunction/lib2/module.info @@ -3,4 +3,4 @@ STEP 0: added file: l2.kt STEP 1: dependencies: lib1 - updated inline imports: l2.kt + updated imports: l2.kt diff --git a/js/js.translator/testData/incremental/invalidation/transitiveInlineFunction/main/module.info b/js/js.translator/testData/incremental/invalidation/transitiveInlineFunction/main/module.info index 594cd0dce5b..a7fcdfeed8d 100644 --- a/js/js.translator/testData/incremental/invalidation/transitiveInlineFunction/main/module.info +++ b/js/js.translator/testData/incremental/invalidation/transitiveInlineFunction/main/module.info @@ -3,4 +3,4 @@ STEP 0: added file: m.kt STEP 1: dependencies: lib1, lib2 - updated inline imports: m.kt + updated imports: m.kt diff --git a/js/js.translator/testData/incremental/invalidation/updateExportsAndInlineImports/lib2/module.info b/js/js.translator/testData/incremental/invalidation/updateExportsAndInlineImports/lib2/module.info index 9bb17b4afe4..1f5ff1a3872 100644 --- a/js/js.translator/testData/incremental/invalidation/updateExportsAndInlineImports/lib2/module.info +++ b/js/js.translator/testData/incremental/invalidation/updateExportsAndInlineImports/lib2/module.info @@ -12,7 +12,7 @@ STEP 1: modified ir: l2a.kt STEP 2: dependencies: lib1 - updated inline imports: l2b.kt, l2a.kt + updated imports: l2b.kt, l2a.kt STEP 3: dependencies: lib1 modifications: @@ -28,7 +28,7 @@ STEP 5: modified ir: l2b.kt STEP 6: dependencies: lib1 - updated inline imports: l2b.kt + updated imports: l2b.kt STEP 7: dependencies: lib1 modifications: @@ -38,4 +38,4 @@ STEP 7: modified ir: l2b.kt STEP 8: dependencies: lib1 - updated inline imports: l2a.kt, l2b.kt + updated imports: l2a.kt, l2b.kt diff --git a/js/js.translator/testData/incremental/invalidation/updateExportsAndInlineImports/main/module.info b/js/js.translator/testData/incremental/invalidation/updateExportsAndInlineImports/main/module.info index 25494673642..56fce4983a0 100644 --- a/js/js.translator/testData/incremental/invalidation/updateExportsAndInlineImports/main/module.info +++ b/js/js.translator/testData/incremental/invalidation/updateExportsAndInlineImports/main/module.info @@ -3,7 +3,7 @@ STEP 0: added file: m.kt STEP 1..3: dependencies: lib1, lib2 - updated inline imports: m.kt + updated imports: m.kt STEP 4: dependencies: lib1, lib2 STEP 5: @@ -11,4 +11,4 @@ STEP 5: removed direct depends: m.kt STEP 6..8: dependencies: lib1, lib2 - updated inline imports: m.kt + updated imports: m.kt diff --git a/js/js.translator/testData/incremental/invalidation/variance/lib1/l1.1.kt b/js/js.translator/testData/incremental/invalidation/variance/lib1/l1.1.kt index 4cc43d1b05b..29ff30a98c7 100644 --- a/js/js.translator/testData/incremental/invalidation/variance/lib1/l1.1.kt +++ b/js/js.translator/testData/incremental/invalidation/variance/lib1/l1.1.kt @@ -1,4 +1,3 @@ -// TODO: After KT-51099, m.kt from main module must be dirty interface Producer { fun produce(): T } diff --git a/js/js.translator/testData/incremental/invalidation/variance/lib1/l1.2.kt b/js/js.translator/testData/incremental/invalidation/variance/lib1/l1.2.kt index 01a2b66b40b..951ad206301 100644 --- a/js/js.translator/testData/incremental/invalidation/variance/lib1/l1.2.kt +++ b/js/js.translator/testData/incremental/invalidation/variance/lib1/l1.2.kt @@ -1,4 +1,3 @@ -// TODO: After KT-51099, m.kt from main module must be dirty interface Producer { fun produce(): T } diff --git a/js/js.translator/testData/incremental/invalidation/variance/main/module.info b/js/js.translator/testData/incremental/invalidation/variance/main/module.info index 549c56cad93..86cd47f6b2c 100644 --- a/js/js.translator/testData/incremental/invalidation/variance/main/module.info +++ b/js/js.translator/testData/incremental/invalidation/variance/main/module.info @@ -3,3 +3,4 @@ STEP 0: added file: m.kt STEP 1..2: dependencies: lib1 + updated imports: m.kt diff --git a/js/js.translator/testData/incremental/invalidation/variance/project.info b/js/js.translator/testData/incremental/invalidation/variance/project.info index 9af68d0168a..912abf292a5 100644 --- a/js/js.translator/testData/incremental/invalidation/variance/project.info +++ b/js/js.translator/testData/incremental/invalidation/variance/project.info @@ -1,8 +1,5 @@ MODULES: lib1, main -STEP 0: +STEP 0..2: libs: lib1, main dirty js: lib1, main -STEP 1..2: - libs: lib1, main - dirty js: lib1