[K/JS] Reexport exported declarations in a proxy module file with per-file compilation

This commit is contained in:
Artem Kobzar
2023-08-01 09:42:33 +00:00
committed by Space Team
parent 5ccc302e01
commit 12715c062d
107 changed files with 341 additions and 169 deletions
@@ -6,10 +6,10 @@
package org.jetbrains.kotlin.ir.backend.js.ic
import org.jetbrains.kotlin.backend.common.serialization.cityHash64
import org.jetbrains.kotlin.backend.common.serialization.cityHash64String
import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.*
import org.jetbrains.kotlin.protobuf.CodedInputStream
import org.jetbrains.kotlin.protobuf.CodedOutputStream
import org.jetbrains.kotlin.utils.addToStdlib.butIf
import org.jetbrains.kotlin.utils.addToStdlib.runIf
import java.io.File
@@ -22,38 +22,50 @@ class JsPerFileCache(private val moduleArtifacts: List<ModuleArtifact>) : JsMult
private const val CACHED_FILE_D_TS = "file.d.ts"
}
class CachedFileInfo(
val moduleArtifact: ModuleArtifact,
val fileArtifact: SrcFileArtifact,
val isExportFileCachedInfo: Boolean = false,
) : CacheInfo {
var dtsHash: Long? = null
sealed class CachedFileInfo(val moduleArtifact: ModuleArtifact, moduleHeader: JsIrModuleHeader?) : CacheInfo {
var crossFileReferencesHash: ICHash = ICHash()
var exportFileCachedInfo: CachedFileInfo? = null
override lateinit var jsIrHeader: JsIrModuleHeader
final override lateinit var jsIrHeader: JsIrModuleHeader
constructor(
jsIrModuleHeader: JsIrModuleHeader,
moduleArtifact: ModuleArtifact,
fileArtifact: SrcFileArtifact,
isExportFileCachedInfo: Boolean = false,
tsDeclarationsHash: Long? = null,
) : this(moduleArtifact, fileArtifact, isExportFileCachedInfo) {
jsIrHeader = jsIrModuleHeader
dtsHash = tsDeclarationsHash
init {
if (moduleHeader != null) jsIrHeader = moduleHeader
}
val moduleHeaderArtifact by lazy(LazyThreadSafetyMode.NONE) { getArtifactWithName(JS_MODULE_HEADER) }
val jsFileArtifact by lazy(LazyThreadSafetyMode.NONE) { getArtifactWithName(if (isExportFileCachedInfo) CACHED_EXPORT_FILE_JS else CACHED_FILE_JS) }
val dtsFileArtifact by lazy(LazyThreadSafetyMode.NONE) { runIf(isExportFileCachedInfo) { getArtifactWithName(CACHED_FILE_D_TS) } }
val sourceMapFileArtifact by lazy(LazyThreadSafetyMode.NONE) { runIf(!isExportFileCachedInfo) { getArtifactWithName(CACHED_FILE_JS_MAP) } }
sealed class SerializableCachedFileInfo(
moduleArtifact: ModuleArtifact,
val fileArtifact: SrcFileArtifact,
moduleHeader: JsIrModuleHeader?
) : CachedFileInfo(moduleArtifact, moduleHeader) {
fun getArtifactWithName(name: String): File? = moduleArtifact.artifactsDir?.let { File(it, "$filePrefix.$name") }
private val filePrefix by lazy(LazyThreadSafetyMode.NONE) { fileArtifact.srcFilePath.run { "${substringAfterLast('/')}.${cityHash64()}" } }
}
private fun getArtifactWithName(name: String): File? = moduleArtifact.artifactsDir?.let { File(it, "$filePrefix.$name") }
class MainFileCachedInfo(moduleArtifact: ModuleArtifact, fileArtifact: SrcFileArtifact, moduleHeader: JsIrModuleHeader? = null) :
SerializableCachedFileInfo(moduleArtifact, fileArtifact, moduleHeader) {
var exportFileCachedInfo: ExportFileCachedInfo? = null
private val filePrefix by lazy(LazyThreadSafetyMode.NONE) {
val pathHash = fileArtifact.srcFilePath.cityHash64String()
"${fileArtifact.srcFilePath.substringAfterLast('/')}.$pathHash"
val jsFileArtifact by lazy(LazyThreadSafetyMode.NONE) { getArtifactWithName(CACHED_FILE_JS) }
val moduleHeaderArtifact by lazy(LazyThreadSafetyMode.NONE) { getArtifactWithName(JS_MODULE_HEADER) }
val sourceMapFileArtifact by lazy(LazyThreadSafetyMode.NONE) { getArtifactWithName(CACHED_FILE_JS_MAP) }
}
class ExportFileCachedInfo(
moduleArtifact: ModuleArtifact,
fileArtifact: SrcFileArtifact,
moduleHeader: JsIrModuleHeader? = null,
var tsDeclarationsHash: Long? = null
) : SerializableCachedFileInfo(moduleArtifact, fileArtifact, moduleHeader) {
val jsFileArtifact by lazy(LazyThreadSafetyMode.NONE) { getArtifactWithName(CACHED_EXPORT_FILE_JS) }
val dtsFileArtifact by lazy(LazyThreadSafetyMode.NONE) { getArtifactWithName(CACHED_FILE_D_TS) }
}
class ModuleProxyFileCachedInfo(moduleArtifact: ModuleArtifact, moduleHeader: JsIrModuleHeader? = null) :
CachedFileInfo(moduleArtifact, moduleHeader) {
val jsFileArtifact by lazy(LazyThreadSafetyMode.NONE) { getArtifactWithName(CACHED_FILE_JS) }
val dtsFileArtifact by lazy(LazyThreadSafetyMode.NONE) { getArtifactWithName(CACHED_FILE_D_TS) }
val moduleHeaderArtifact by lazy(LazyThreadSafetyMode.NONE) { getArtifactWithName(JS_MODULE_HEADER) }
private fun getArtifactWithName(name: String): File? = moduleArtifact.artifactsDir?.let { File(it, "entry.$name") }
}
}
@@ -66,13 +78,14 @@ class JsPerFileCache(private val moduleArtifacts: List<ModuleArtifact>) : JsMult
private fun JsIrProgramFragment.getExportFragmentExternalName(moduleArtifact: ModuleArtifact) =
moduleFragmentToExternalName.getExternalNameForExporterFile(name, packageFqn, moduleArtifact.moduleExternalName)
private fun JsIrProgramFragment.asIrModuleHeader(moduleName: String): JsIrModuleHeader {
private fun JsIrProgramFragment.asIrModuleHeader(moduleName: String, reexportedIn: String? = null): JsIrModuleHeader {
return JsIrModuleHeader(
moduleName = moduleName,
externalModuleName = moduleName,
definitions = definitions,
nameBindings = nameBindings.mapValues { v -> v.value.toString() },
optionalCrossModuleImports = optionalCrossModuleImports,
reexportedInModuleWithName = reexportedIn,
associatedModule = null
)
}
@@ -80,15 +93,20 @@ class JsPerFileCache(private val moduleArtifacts: List<ModuleArtifact>) : JsMult
private fun SrcFileArtifact.loadJsIrModuleHeaders(moduleArtifact: ModuleArtifact) = with(loadJsIrFragments()) {
LoadedJsIrModuleHeaders(
mainFragment.run { asIrModuleHeader(getMainFragmentExternalName(moduleArtifact)) },
exportFragment?.run { asIrModuleHeader(mainFragment.getExportFragmentExternalName(moduleArtifact)) },
exportFragment?.run { asIrModuleHeader(mainFragment.getExportFragmentExternalName(moduleArtifact), moduleArtifact.moduleExternalName) },
)
}
private fun CodedInputStream.loadSingleCachedFileInfo(cachedFileInfo: CachedFileInfo) = cachedFileInfo.also {
private fun <T : CachedFileInfo> CodedInputStream.loadSingleCachedFileInfo(cachedFileInfo: T): T = cachedFileInfo.also {
val moduleName = readString()
var reexportedIn: String? = null
it.crossFileReferencesHash = ICHash.fromProtoStream(this)
it.dtsHash = runIf(readBool()) { readInt64() }
if (it is CachedFileInfo.ExportFileCachedInfo) {
it.tsDeclarationsHash = runIf(readBool()) { readInt64() }
reexportedIn = cachedFileInfo.moduleArtifact.moduleExternalName
}
val (definitions, nameBindings, optionalCrossModuleImports) = fetchJsIrModuleHeaderNames()
@@ -98,15 +116,16 @@ class JsPerFileCache(private val moduleArtifacts: List<ModuleArtifact>) : JsMult
definitions = definitions,
nameBindings = nameBindings,
optionalCrossModuleImports = optionalCrossModuleImports,
associatedModule = null
reexportedInModuleWithName = reexportedIn,
associatedModule = null,
)
}
private fun <T> CachedFileInfo.readModuleHeaderCache(f: CodedInputStream.() -> T): T? = moduleHeaderArtifact?.useCodedInputIfExists(f)
private fun <T> CachedFileInfo.MainFileCachedInfo.readModuleHeaderCache(f: CodedInputStream.() -> T): T? =
moduleHeaderArtifact?.useCodedInputIfExists(f)
private fun ModuleArtifact.fetchFileInfoFor(fileArtifact: SrcFileArtifact): List<CachedFileInfo>? {
val moduleArtifact = this
val mainFileCachedFileInfo = CachedFileInfo(moduleArtifact, fileArtifact)
val mainFileCachedFileInfo = CachedFileInfo.MainFileCachedInfo(this, fileArtifact)
return mainFileCachedFileInfo.readModuleHeaderCache {
mainFileCachedFileInfo.run {
@@ -117,48 +136,66 @@ class JsPerFileCache(private val moduleArtifacts: List<ModuleArtifact>) : JsMult
}
}
private fun CodedInputStream.fetchFileInfoForExportedPart(mainCachedFileInfo: CachedFileInfo): CachedFileInfo? {
private fun ModuleArtifact.fetchModuleProxyFileInfo(): CachedFileInfo.ModuleProxyFileCachedInfo? {
val mainFileCachedFileInfo = CachedFileInfo.ModuleProxyFileCachedInfo(this)
return mainFileCachedFileInfo.moduleHeaderArtifact?.useCodedInputIfExists { loadSingleCachedFileInfo(mainFileCachedFileInfo) }
}
private fun CodedInputStream.fetchFileInfoForExportedPart(mainCachedFileInfo: CachedFileInfo.MainFileCachedInfo): CachedFileInfo.ExportFileCachedInfo? {
return ifTrue {
loadSingleCachedFileInfo(
CachedFileInfo(
mainCachedFileInfo.moduleArtifact,
mainCachedFileInfo.fileArtifact,
isExportFileCachedInfo = true
)
CachedFileInfo.ExportFileCachedInfo(mainCachedFileInfo.moduleArtifact, mainCachedFileInfo.fileArtifact)
)
}
}
private fun CodedOutputStream.commitSingleFileInfo(cachedFileInfo: CachedFileInfo) {
private fun CodedOutputStream.commitSingleFileInfo(cachedFileInfo: CachedFileInfo.SerializableCachedFileInfo) {
writeStringNoTag(cachedFileInfo.jsIrHeader.externalModuleName)
cachedFileInfo.crossFileReferencesHash.toProtoStream(this)
ifNotNull(cachedFileInfo.dtsHash, ::writeInt64NoTag)
if (cachedFileInfo is CachedFileInfo.ExportFileCachedInfo) {
ifNotNull(cachedFileInfo.tsDeclarationsHash, ::writeInt64NoTag)
}
commitJsIrModuleHeaderNames(cachedFileInfo.jsIrHeader)
}
private fun CachedFileInfo.commitFileInfo() = runIf(!isExportFileCachedInfo) {
moduleHeaderArtifact?.useCodedOutput {
ifNotNull(exportFileCachedInfo) { commitSingleFileInfo(it) }
commitSingleFileInfo(this@commitFileInfo)
private fun CachedFileInfo.commitFileInfo() = when (this) {
is CachedFileInfo.MainFileCachedInfo -> {
moduleHeaderArtifact?.useCodedOutput {
ifNotNull(exportFileCachedInfo) { commitSingleFileInfo(it) }
commitSingleFileInfo(this@commitFileInfo)
}
}
is CachedFileInfo.ModuleProxyFileCachedInfo -> {
moduleHeaderArtifact?.useCodedOutput {
writeStringNoTag(jsIrHeader.externalModuleName)
crossFileReferencesHash.toProtoStream(this)
commitJsIrModuleHeaderNames(jsIrHeader)
}
}
is CachedFileInfo.ExportFileCachedInfo -> {}
}
private fun ModuleArtifact.generateModuleProxyFileCachedInfo(): CachedFileInfo {
return CachedFileInfo.ModuleProxyFileCachedInfo(
this,
generateProxyIrModuleWith(moduleExternalName, moduleExternalName).makeModuleHeader()
)
}
private fun ModuleArtifact.loadFileInfoFor(fileArtifact: SrcFileArtifact): List<CachedFileInfo> {
val moduleArtifact = this
val headers = fileArtifact.loadJsIrModuleHeaders(moduleArtifact)
val headers = fileArtifact.loadJsIrModuleHeaders(this)
val mainCachedFileInfo = CachedFileInfo(headers.mainHeader, this, fileArtifact)
val mainCachedFileInfo = CachedFileInfo.MainFileCachedInfo(this, fileArtifact, headers.mainHeader)
if (headers.exportHeader != null) {
val tsDeclarationsHash = fileArtifact.loadJsIrFragments().exportFragment?.dts?.raw?.cityHash64()
val cachedExportFileInfo = mainCachedFileInfo.readModuleHeaderCache { fetchFileInfoForExportedPart(mainCachedFileInfo) }
mainCachedFileInfo.exportFileCachedInfo = if (cachedExportFileInfo?.dtsHash != tsDeclarationsHash) {
CachedFileInfo(
headers.exportHeader,
moduleArtifact,
mainCachedFileInfo.exportFileCachedInfo = if (cachedExportFileInfo?.tsDeclarationsHash != tsDeclarationsHash) {
CachedFileInfo.ExportFileCachedInfo(
this,
fileArtifact,
tsDeclarationsHash = tsDeclarationsHash,
isExportFileCachedInfo = true
headers.exportHeader,
tsDeclarationsHash,
)
} else {
cachedExportFileInfo
@@ -169,7 +206,11 @@ class JsPerFileCache(private val moduleArtifacts: List<ModuleArtifact>) : JsMult
}
private val CachedFileInfo.cachedFiles: CachedFileArtifacts?
get() = jsFileArtifact?.let { CachedFileArtifacts(it, sourceMapFileArtifact, dtsFileArtifact) }
get() = when (this) {
is CachedFileInfo.MainFileCachedInfo -> jsFileArtifact?.let { CachedFileArtifacts(it, sourceMapFileArtifact, null) }
is CachedFileInfo.ExportFileCachedInfo -> jsFileArtifact?.let { CachedFileArtifacts(it, null, dtsFileArtifact) }
is CachedFileInfo.ModuleProxyFileCachedInfo -> jsFileArtifact?.let { CachedFileArtifacts(it, null, dtsFileArtifact) }
}
override fun getMainModuleAndDependencies(cacheInfo: List<CachedFileInfo>) = null to cacheInfo
@@ -188,23 +229,40 @@ class JsPerFileCache(private val moduleArtifacts: List<ModuleArtifact>) : JsMult
} ?: compilationOutputs
override fun loadJsIrModule(cacheInfo: CachedFileInfo): JsIrModule {
if (cacheInfo !is CachedFileInfo.SerializableCachedFileInfo) {
return generateProxyIrModuleWith(cacheInfo.jsIrHeader.externalModuleName, cacheInfo.jsIrHeader.externalModuleName)
}
val fragments = cacheInfo.fileArtifact.loadJsIrFragments()
val isExportFileCachedInfo = cacheInfo is CachedFileInfo.ExportFileCachedInfo
return JsIrModule(
cacheInfo.jsIrHeader.moduleName,
cacheInfo.jsIrHeader.externalModuleName,
listOf(if (cacheInfo.isExportFileCachedInfo) fragments.exportFragment!! else fragments.mainFragment)
listOf(if (isExportFileCachedInfo) fragments.exportFragment!! else fragments.mainFragment),
runIf(isExportFileCachedInfo) { cacheInfo.moduleArtifact.moduleSafeName }
)
}
override fun loadProgramHeadersFromCache(): List<CachedFileInfo> {
return moduleArtifacts
.flatMap { module ->
module.fileArtifacts.flatMap {
if (it.isModified())
module.loadFileInfoFor(it)
else
module.fetchFileInfoFor(it) ?: module.loadFileInfoFor(it)
}
.flatMap { moduleArtifact ->
var hasFileWithJsExportedDeclaration = false
moduleArtifact.fileArtifacts
.flatMap { srcFileArtifact ->
val cachedFileInfo = if (srcFileArtifact.isModified())
moduleArtifact.loadFileInfoFor(srcFileArtifact)
else
moduleArtifact.fetchFileInfoFor(srcFileArtifact) ?: moduleArtifact.loadFileInfoFor(srcFileArtifact)
if (!hasFileWithJsExportedDeclaration && cachedFileInfo.hasExportFile()) {
hasFileWithJsExportedDeclaration = true
}
cachedFileInfo
}
.butIf(hasFileWithJsExportedDeclaration) {
it.plus(moduleArtifact.fetchModuleProxyFileInfo() ?: moduleArtifact.generateModuleProxyFileCachedInfo())
}
}
.onEach { headerToCachedInfo[it.jsIrHeader] = it }
}
@@ -228,4 +286,6 @@ class JsPerFileCache(private val moduleArtifacts: List<ModuleArtifact>) : JsMult
private data class CachedFileArtifacts(val jsCodeFile: File, val sourceMapFile: File?, val tsDeclarationsFile: File?)
private data class LoadedJsIrModuleHeaders(val mainHeader: JsIrModuleHeader, val exportHeader: JsIrModuleHeader?)
}
private fun List<JsPerFileCache.CachedFileInfo>.hasExportFile(): Boolean = size > 1
}
@@ -47,6 +47,12 @@ val String.safeModuleName: String
val IrModuleFragment.safeName: String
get() = name.asString().safeModuleName
fun generateProxyIrModuleWith(safeName: String, externalName: String) = JsIrModule(
safeName,
externalName,
listOf(JsIrProgramFragment(safeName, "<proxy-file>"))
)
enum class JsGenerationGranularity {
WHOLE_PROGRAM,
PER_MODULE,
@@ -301,10 +307,9 @@ class IrModuleToJsTransformer(
}
private fun IrAndExportedDeclarations.toJsIrProxyModule(): JsIrModule {
return JsIrModule(
return generateProxyIrModuleWith(
fragment.safeName,
moduleFragmentToNameMapper.getExternalNameFor(fragment),
listOf(JsIrProgramFragment(fragment.safeName, "<proxy-file>"))
)
}
@@ -261,20 +261,16 @@ abstract class AbstractInvalidationTest(
}
private fun verifyJsCode(stepId: Int, mainModuleName: String, jsFiles: List<String>) {
val testModuleName = "./$mainModuleName${projectInfo.moduleKind.extension}"
try {
V8IrJsTestChecker.checkWithTestFunctionArgs(
files = jsFiles,
testModuleName = testModuleName,
testModuleName = "./$mainModuleName${projectInfo.moduleKind.extension}",
testPackageName = null,
testFunctionName = BOX_FUNCTION_NAME,
testFunctionArgs = "$stepId",
expectedResult = "OK",
withModuleSystem = projectInfo.moduleKind in setOf(ModuleKind.COMMON_JS, ModuleKind.UMD, ModuleKind.AMD),
entryModulePath = when (granularity) {
JsGenerationGranularity.PER_FILE -> jsFiles.find { it.endsWith("m.export.mjs") }
else -> jsFiles.last()
}
entryModulePath = jsFiles.last()
)
} catch (e: ComparisonFailure) {
throw ComparisonFailure("Mismatched box out at step $stepId", e.expected, e.actual)
@@ -47,7 +47,7 @@ abstract class AbstractJsIrES6InvalidationPerModuleTest : IrAbstractInvalidation
abstract class AbstractJsIrInvalidationPerFileWithPLTest : AbstractJsIrInvalidationWithPLTest(
granularity = JsGenerationGranularity.PER_FILE,
workingDirPath = "incrementalOut/invalidationWithPL/perModule"
workingDirPath = "incrementalOut/invalidationWithPL/perFile"
)
abstract class AbstractJsIrInvalidationPerModuleWithPLTest : AbstractJsIrInvalidationWithPLTest(
@@ -307,6 +307,12 @@ public class JsFirInvalidationPerFileTestGenerated extends AbstractJsFirInvalida
runTest("js/js.translator/testData/incremental/invalidation/jsExport/");
}
@Test
@TestMetadata("jsExportWithMultipleFiles")
public void testJsExportWithMultipleFiles() throws Exception {
runTest("js/js.translator/testData/incremental/invalidation/jsExportWithMultipleFiles/");
}
@Test
@TestMetadata("jsModuleAnnotation")
public void testJsModuleAnnotation() throws Exception {
@@ -307,6 +307,12 @@ public class JsFirInvalidationPerModuleTestGenerated extends AbstractJsFirInvali
runTest("js/js.translator/testData/incremental/invalidation/jsExport/");
}
@Test
@TestMetadata("jsExportWithMultipleFiles")
public void testJsExportWithMultipleFiles() throws Exception {
runTest("js/js.translator/testData/incremental/invalidation/jsExportWithMultipleFiles/");
}
@Test
@TestMetadata("jsModuleAnnotation")
public void testJsModuleAnnotation() throws Exception {
@@ -307,6 +307,12 @@ public class JsIrES6InvalidationPerFileTestGenerated extends AbstractJsIrES6Inva
runTest("js/js.translator/testData/incremental/invalidation/jsExport/");
}
@Test
@TestMetadata("jsExportWithMultipleFiles")
public void testJsExportWithMultipleFiles() throws Exception {
runTest("js/js.translator/testData/incremental/invalidation/jsExportWithMultipleFiles/");
}
@Test
@TestMetadata("jsModuleAnnotation")
public void testJsModuleAnnotation() throws Exception {
@@ -307,6 +307,12 @@ public class JsIrES6InvalidationPerModuleTestGenerated extends AbstractJsIrES6In
runTest("js/js.translator/testData/incremental/invalidation/jsExport/");
}
@Test
@TestMetadata("jsExportWithMultipleFiles")
public void testJsExportWithMultipleFiles() throws Exception {
runTest("js/js.translator/testData/incremental/invalidation/jsExportWithMultipleFiles/");
}
@Test
@TestMetadata("jsModuleAnnotation")
public void testJsModuleAnnotation() throws Exception {
@@ -307,6 +307,12 @@ public class JsIrInvalidationPerFileTestGenerated extends AbstractJsIrInvalidati
runTest("js/js.translator/testData/incremental/invalidation/jsExport/");
}
@Test
@TestMetadata("jsExportWithMultipleFiles")
public void testJsExportWithMultipleFiles() throws Exception {
runTest("js/js.translator/testData/incremental/invalidation/jsExportWithMultipleFiles/");
}
@Test
@TestMetadata("jsModuleAnnotation")
public void testJsModuleAnnotation() throws Exception {
@@ -307,6 +307,12 @@ public class JsIrInvalidationPerModuleTestGenerated extends AbstractJsIrInvalida
runTest("js/js.translator/testData/incremental/invalidation/jsExport/");
}
@Test
@TestMetadata("jsExportWithMultipleFiles")
public void testJsExportWithMultipleFiles() throws Exception {
runTest("js/js.translator/testData/incremental/invalidation/jsExportWithMultipleFiles/");
}
@Test
@TestMetadata("jsModuleAnnotation")
public void testJsModuleAnnotation() throws Exception {
@@ -3,7 +3,7 @@ MODULES: lib1, lib2, main
STEP 0:
libs: lib1, lib2, main
dirty js modules: lib1, lib2, main
dirty js files: lib1/l1a, lib2/l2, main/m, main/m.export
dirty js files: lib1/l1a, lib2/l2, main/m, main/m.export, main
STEP 1:
libs: lib1, lib2, main
dirty js modules: lib1, lib2, main
@@ -3,7 +3,7 @@ MODULES: lib1, lib2, main
STEP 0:
libs: lib1, main
dirty js modules: lib1, main
dirty js files: lib1/l1a, lib1/l1b, main/m, main/m.export
dirty js files: lib1/l1a, lib1/l1b, main/m, main/m.export, main
STEP 1:
libs: lib1, lib2, main
dirty js modules: lib1, lib2, main
@@ -3,7 +3,7 @@ MODULES: lib1, main
STEP 0:
libs: lib1, main
dirty js modules: lib1, main
dirty js files: lib1/f, lib1/f1, lib1/f2, lib1/f3, main/m, main/m.export
dirty js files: lib1/f, lib1/f1, lib1/f2, lib1/f3, main/m, main/m.export, main
STEP 1..3:
libs: lib1, main
dirty js modules: lib1
@@ -3,7 +3,7 @@ MODULES: lib1, main
STEP 0:
libs: lib1, main
dirty js modules: lib1, main
dirty js files: lib1/f, lib1/f1, lib1/f2, lib1/f3, main/m, main/m.export
dirty js files: lib1/f, lib1/f1, lib1/f2, lib1/f3, main/m, main/m.export, main
STEP 1..2:
libs: lib1, main
dirty js modules: lib1, main
@@ -3,7 +3,7 @@ MODULES: lib1, main
STEP 0:
libs: lib1, main
dirty js modules: lib1, main
dirty js files: lib1/l1, main/testEquals, main/testToString, main/testHashCode, main/m, main/m.export
dirty js files: lib1/l1, main/testEquals, main/testToString, main/testHashCode, main/m, main/m.export, main
STEP 1..3:
libs: lib1, main
dirty js modules: lib1, main
@@ -3,7 +3,7 @@ MODULES: lib1, main
STEP 0:
libs: lib1, main
dirty js modules: lib1, main
dirty js files: lib1/l1, main/m, main/m.export
dirty js files: lib1/l1, main/m, main/m.export, main
STEP 1:
libs: lib1, main
dirty js modules: lib1
@@ -3,7 +3,7 @@ MODULES: lib1, lib2, main
STEP 0:
libs: lib1, lib2, main
dirty js modules: lib1, lib2, main
dirty js files: lib1/l1, lib2/l2, main/m, main/m.export
dirty js files: lib1/l1, lib2/l2, main/m, main/m.export, main
STEP 1:
libs: lib1, lib2, main
dirty js modules: lib1
@@ -3,7 +3,7 @@ MODULES: lib1, lib2, main
STEP 0:
libs: lib1, lib2, main
dirty js modules: lib1, lib2, main
dirty js files: lib1/l1, lib2/l2, main/m, main/m.export
dirty js files: lib1/l1, lib2/l2, main/m, main/m.export, main
STEP 1..4:
libs: lib1, lib2, main
dirty js modules: lib1, lib2, main
@@ -3,7 +3,7 @@ MODULES: lib1, lib2, main
STEP 0:
libs: lib1, lib2, main
dirty js modules: lib1, lib2, main
dirty js files: lib1/l1, lib2/l2, lib2/l2string, main/m, main/m.export
dirty js files: lib1/l1, lib2/l2, lib2/l2string, main/m, main/m.export, main
STEP 1:
libs: lib1, lib2, main
dirty js modules: lib1, lib2
@@ -3,7 +3,7 @@ MODULES: lib1, main
STEP 0:
libs: lib1, main
dirty js modules: lib1, main
dirty js files: lib1/l1, main/f, main/m, main/m.export
dirty js files: lib1/l1, main/f, main/m, main/m.export, main
STEP 1..2:
libs: lib1, main
dirty js modules: lib1
@@ -3,7 +3,7 @@ MODULES: lib1, lib2, main
STEP 0:
libs: lib1, lib2, main
dirty js modules: lib1, lib2, main
dirty js files: lib1/l1, lib2/l2, main/m, main/m.export
dirty js files: lib1/l1, lib2/l2, main/m, main/m.export, main
STEP 1..3:
libs: lib1, lib2, main
dirty js modules: lib1, lib2, main
@@ -3,7 +3,7 @@ MODULES: lib1, lib2, main
STEP 0:
libs: lib1, lib2, main
dirty js modules: lib1, lib2, main
dirty js files: lib1/l1, lib2/l2, main/m, main/m.export
dirty js files: lib1/l1, lib2/l2, main/m, main/m.export, main
STEP 1:
libs: lib1, lib2, main
dirty js modules: lib1, lib2
@@ -3,7 +3,7 @@ MODULES: lib1, lib2, main
STEP 0:
libs: lib1, lib2, main
dirty js modules: lib1, lib2, main
dirty js files: lib1/l1, lib2/l2, main/m, main/m.export
dirty js files: lib1/l1, lib2/l2, main/m, main/m.export, main
STEP 1..4:
libs: lib1, lib2, main
dirty js modules: lib1, lib2
@@ -3,7 +3,7 @@ MODULES: lib1, main
STEP 0:
libs: lib1, main
dirty js modules: lib1, main
dirty js files: lib1/l1, main/testEnumEntries, main/testEnumValues, main/m, main/m.export
dirty js files: lib1/l1, main/testEnumEntries, main/testEnumValues, main/m, main/m.export, main
STEP 1:
libs: lib1, main
dirty js modules: lib1
@@ -12,7 +12,7 @@ STEP 2:
language: +EnumEntries
libs: lib1, main
dirty js modules: main, lib1
dirty js files: lib1/l1, main/testEnumEntries, main/testEnumValues, main/m, main/m.export
dirty js files: lib1/l1, main/testEnumEntries, main/testEnumValues, main/m, main/m.export, main
STEP 3:
language: +EnumEntries
libs: lib1, main
@@ -3,7 +3,7 @@ MODULES: lib1, lib2, main
STEP 0:
libs: lib1, lib2, main
dirty js modules: lib1, lib2, main
dirty js files: lib1/l1, lib2/l2, main/m, main/m.export
dirty js files: lib1/l1, lib2/l2, main/m, main/m.export, main
STEP 1..2:
libs: lib1, lib2, main
dirty js modules: lib1, lib2
@@ -3,7 +3,7 @@ MODULES: lib1, lib2, main
STEP 0:
libs: lib1, lib2, main
dirty js modules: lib1, lib2, main
dirty js files: lib1/l1, lib2/l2, main/m, main/m.export
dirty js files: lib1/l1, lib2/l2, main/m, main/m.export, main
STEP 1:
libs: lib1, lib2, main
dirty js modules: lib1, lib2
@@ -3,7 +3,7 @@ MODULES: lib1, main
STEP 0:
libs: lib1, main
dirty js modules: lib1, main
dirty js files: lib1/l1, lib1/l2, main/m, main/m.export
dirty js files: lib1/l1, lib1/l2, main/m, main/m.export, main
STEP 1..4:
libs: lib1, main
dirty js modules: lib1, main
@@ -3,7 +3,7 @@ MODULES: lib1, lib2, main
STEP 0:
libs: lib1, lib2, main
dirty js modules: lib1, lib2, main
dirty js files: lib1/l1, lib2/l2, main/m, main/m.export
dirty js files: lib1/l1, lib2/l2, main/m, main/m.export, main
STEP 1:
libs: lib1, lib2, main
dirty js modules: lib1, lib2, main
@@ -3,7 +3,7 @@ MODULES: lib1, main
STEP 0:
libs: lib1, main
dirty js modules: lib1, main
dirty js files: lib1/A, lib1/B, lib1/C, main/classABC, main/m, main/m.export
dirty js files: lib1/A, lib1/B, lib1/C, main/classABC, main/m, main/m.export, main
STEP 1:
libs: lib1, main
dirty js modules: lib1, main
@@ -3,7 +3,7 @@ MODULES: lib1, main
STEP 0:
libs: lib1, main
dirty js modules: lib1, main
dirty js files: lib1/l1, main/classA, main/m, main/m.export
dirty js files: lib1/l1, main/classA, main/m, main/m.export, main
STEP 1..4:
libs: lib1, main
dirty js modules: lib1, main
@@ -3,7 +3,7 @@ MODULES: lib1, lib2, main
STEP 0:
libs: lib1, lib2, main
dirty js modules: lib1, lib2, main
dirty js files: lib1/l1, lib2/l2, main/m, main/m.export
dirty js files: lib1/l1, lib2/l2, main/m, main/m.export, main
STEP 1..2:
libs: lib1, lib2, main
dirty js modules: lib1, lib2, main
@@ -3,7 +3,7 @@ MODULES: lib1, main
STEP 0:
libs: lib1, main
dirty js modules: lib1, main
dirty js files: lib1/l1, main/classA, main/m, main/m.export
dirty js files: lib1/l1, main/classA, main/m, main/m.export, main
STEP 1..2:
libs: lib1, main
dirty js modules: lib1, main
@@ -3,7 +3,7 @@ MODULES: lib1, lib2, main
STEP 0:
libs: lib1, lib2, main
dirty js modules: lib1, lib2, main
dirty js files: lib1/l1, lib2/class2, lib2/object2, main/m, main/m.export
dirty js files: lib1/l1, lib2/class2, lib2/object2, main/m, main/m.export, main
STEP 1:
libs: lib1, lib2, main
dirty js modules: lib1, lib2, main
@@ -3,7 +3,7 @@ MODULES: lib1, lib2, main
STEP 0:
libs: lib1, lib2, main
dirty js modules: lib1, lib2, main
dirty js files: lib1/l1, lib2/l2, main/m, main/m.export
dirty js files: lib1/l1, lib2/l2, main/m, main/m.export, main
STEP 1:
libs: lib1, lib2, main
dirty js modules: lib2
@@ -3,6 +3,6 @@ MODULES: lib1, lib2, main
STEP 0:
libs: lib1, lib2, main
dirty js modules: lib1, lib2, main
dirty js files: lib1/l1, lib2/l2, main/m, main/m.export
dirty js files: lib1/l1, lib2/l2, main/m, main/m.export, main
STEP 1:
libs: lib1, lib2, main
@@ -3,7 +3,7 @@ MODULES: lib1, main
STEP 0:
libs: lib1, main
dirty js modules: lib1, main
dirty js files: lib1/l1, main/publicClass, main/test, main/m, main/m.export
dirty js files: lib1/l1, main/publicClass, main/test, main/m, main/m.export, main
STEP 1..2:
libs: lib1, main
dirty js modules: lib1
@@ -3,7 +3,7 @@ MODULES: lib1, main
STEP 0:
libs: lib1, main
dirty js modules: lib1, main
dirty js files: lib1/l1, main/m, main/m.export
dirty js files: lib1/l1, main/m, main/m.export, main
STEP 1:
libs: lib1, main
dirty js modules: lib1
@@ -3,7 +3,7 @@ MODULES: lib1, main
STEP 0:
libs: lib1, main
dirty js modules: lib1, main
dirty js files: lib1/l1, main/m, main/m.export
dirty js files: lib1/l1, main/m, main/m.export, main
STEP 1..6:
libs: lib1, main
dirty js modules: lib1, main
@@ -3,7 +3,7 @@ MODULES: lib1, lib2, main
STEP 0:
libs: lib1, lib2, main
dirty js modules: lib1, lib2, main
dirty js files: lib1/l1, lib2/l2b, lib2/l2a, main/m, main/m.export
dirty js files: lib1/l1, lib2/l2b, lib2/l2a, main/m, main/m.export, main
STEP 1..4:
libs: lib1, lib2, main
dirty js modules: lib2
@@ -3,7 +3,7 @@ MODULES: lib1, main
STEP 0:
libs: lib1, main
dirty js modules: lib1, main
dirty js files: lib1/A, lib1/B, lib1/C, main/test, main/m, main/m.export
dirty js files: lib1/A, lib1/B, lib1/C, main/test, main/m, main/m.export, main
STEP 1:
libs: lib1, main
dirty js modules: lib1, main
@@ -3,7 +3,7 @@ MODULES: lib1, main
STEP 0:
libs: lib1, main
dirty js modules: lib1, main
dirty js files: lib1/l1, main/m, main/m.export
dirty js files: lib1/l1, main/m, main/m.export, main
STEP 1..4:
libs: lib1, main
dirty js modules: lib1, main
@@ -3,7 +3,7 @@ MODULES: lib1, main, libProxy
STEP 0:
libs: lib1, main
dirty js modules: lib1, main
dirty js files: lib1/l1, main/m, main/m.export
dirty js files: lib1/l1, main/m, main/m.export, main
STEP 1..7:
libs: lib1, main
dirty js modules: lib1, main
@@ -3,7 +3,7 @@ MODULES: lib1, lib2, main
STEP 0:
libs: lib1, lib2, main
dirty js modules: lib1, lib2, main
dirty js files: lib1/l1, lib2/l2, main/m, main/m.export
dirty js files: lib1/l1, lib2/l2, main/m, main/m.export, main
STEP 1..3:
libs: lib1, lib2, main
dirty js modules: lib1, lib2, main
@@ -3,7 +3,7 @@ MODULES: lib1, main
STEP 0:
libs: lib1, main
dirty js modules: lib1, main
dirty js files: lib1/l1, main/m, main/m.export
dirty js files: lib1/l1, main/m, main/m.export, main
STEP 1:
libs: lib1, main
dirty js modules: lib1, main
@@ -3,11 +3,11 @@ MODULES: lib1, main
STEP 0:
libs: lib1, main
dirty js modules: lib1, main
dirty js files: lib1/l1, main/m, main/m.export
dirty js files: lib1/l1, main/m, main/m.export, main
STEP 1:
libs: lib1, main
dirty js modules: lib1, main
dirty js files: lib1/l1, lib1/l1.export, main/m
dirty js files: lib1/l1, lib1/l1.export, lib1, main/m
STEP 2..3:
libs: lib1, main
dirty js modules: lib1, main
@@ -3,7 +3,7 @@ MODULES: lib1, main
STEP 0:
libs: lib1, main
dirty js modules: lib1, main
dirty js files: lib1/l1, lib1/l2, main/m, main/m.export
dirty js files: lib1/l1, lib1/l2, main/m, main/m.export, main
STEP 1:
libs: lib1, main
dirty js modules: lib1, main
@@ -3,7 +3,7 @@ MODULES: lib1, main
STEP 0:
libs: lib1, main
dirty js modules: lib1, main
dirty js files: lib1/l1, main/m, main/m.export
dirty js files: lib1/l1, main/m, main/m.export, main
STEP 1..9:
libs: lib1, main
dirty js modules: lib1, main
@@ -3,7 +3,7 @@ MODULES: lib1, main
STEP 0:
libs: lib1, main
dirty js modules: lib1, main
dirty js files: lib1/l1a, lib1/l1b, main/m, main/m.export
dirty js files: lib1/l1a, lib1/l1b, main/m, main/m.export, main
STEP 1..2:
libs: lib1, main
dirty js modules: lib1, main
@@ -3,7 +3,7 @@ MODULES: lib1, main
STEP 0:
libs: lib1, main
dirty js modules: lib1, main
dirty js files: lib1/l1, main/m, main/m.export
dirty js files: lib1/l1, main/m, main/m.export, main
STEP 1..3:
libs: lib1, main
dirty js modules: lib1, main
@@ -3,7 +3,7 @@ MODULES: lib1, lib2, main
STEP 0:
libs: lib1, lib2, main
dirty js modules: lib1, lib2, main
dirty js files: lib1/l1, lib2/l2, main/m, main/m.export
dirty js files: lib1/l1, lib2/l2, main/m, main/m.export, main
STEP 1:
libs: lib1, lib2, main
dirty js modules: lib2, main
@@ -3,7 +3,7 @@ MODULES: lib1, lib2, main
STEP 0:
libs: lib1, lib2, main
dirty js modules: lib1, lib2, main
dirty js files: lib1/InterfaceA, lib1/InterfaceB, lib1/InterfaceC, lib2/MyClass, lib2/GetA, lib2/GetB, lib2/GetC, main/test, main/m, main/m.export
dirty js files: lib1/InterfaceA, lib1/InterfaceB, lib1/InterfaceC, lib2/MyClass, lib2/GetA, lib2/GetB, lib2/GetC, main/test, main/m, main/m.export, main
STEP 1:
libs: lib1, lib2, main
dirty js modules: lib1, lib2, main
@@ -3,7 +3,7 @@ MODULES: lib1, lib2, main
STEP 0:
libs: lib1, lib2, main
dirty js modules: lib1, lib2, main
dirty js files: lib1/InterfaceA, lib1/ClassB, lib2/MyClass, lib2/GetA, lib2/GetB, main/test, main/m, main/m.export
dirty js files: lib1/InterfaceA, lib1/ClassB, lib2/MyClass, lib2/GetA, lib2/GetB, main/test, main/m, main/m.export, main
STEP 1..3:
libs: lib1, lib2, main
dirty js modules: lib1, main
@@ -3,7 +3,7 @@ MODULES: lib1, main
STEP 0:
libs: lib1, main
dirty js modules: lib1, main
dirty js files: lib1/Interface, lib1/ClassA, lib1/ClassB, main/test, main/m, main/m.export
dirty js files: lib1/Interface, lib1/ClassA, lib1/ClassB, main/test, main/m, main/m.export, main
STEP 1:
libs: lib1, main
dirty js modules: lib1, main
@@ -3,7 +3,7 @@ MODULES: lib1, lib2, main
STEP 0:
libs: lib1, lib2, main
dirty js modules: lib1, lib2, main
dirty js files: lib1/l1, lib2/l2, lib2/l2test, main/m, main/m.export
dirty js files: lib1/l1, lib2/l2, lib2/l2test, main/m, main/m.export, main
STEP 1..2:
libs: lib1, lib2, main
dirty js modules: lib1, lib2
@@ -3,7 +3,7 @@ MODULES: lib1, main
STEP 0:
libs: lib1, main
dirty js modules: lib1, main
dirty js files: lib1/l1, main/m, main/m.export
dirty js files: lib1/l1, main/m, main/m.export, main
STEP 1..3:
libs: lib1, main
dirty js modules: lib1, main
@@ -3,7 +3,7 @@ MODULES: lib1, main
STEP 0:
libs: lib1, main
dirty js modules: lib1, main
dirty js files: lib1/l1, lib1/js, lib1/test, main/m, main/m.export
dirty js files: lib1/l1, lib1/js, lib1/test, main/m, main/m.export, main
STEP 1:
libs: lib1, main
dirty js modules: lib1
@@ -3,7 +3,7 @@ MODULES: lib1, main
STEP 0:
libs: lib1, main
dirty js modules: lib1, main
dirty js files: lib1/l1, lib1/js, lib1/test, main/m, main/m.export
dirty js files: lib1/l1, lib1/js, lib1/test, main/m, main/m.export, main
STEP 1:
libs: lib1, main
dirty js modules: lib1
@@ -3,11 +3,11 @@ MODULES: lib1, main
STEP 0:
libs: lib1, main
dirty js modules: lib1, main
dirty js files: lib1/l1, main/m, main/m.export
dirty js files: lib1/l1, main/m, main/m.export, main
STEP 1:
libs: lib1, main
dirty js modules: lib1, main
dirty js files: lib1/l1, lib1/l1.export, main/m
dirty js files: lib1/l1, lib1/l1.export, lib1, main/m
STEP 2..3:
libs: lib1, main
dirty js modules: lib1, main
@@ -0,0 +1 @@
fun foo() = 77
@@ -0,0 +1,2 @@
@JsExport
fun foo() = 77
@@ -0,0 +1 @@
fun foo() = 77
@@ -0,0 +1,2 @@
@JsExport
class Bar
@@ -0,0 +1 @@
class Bar
@@ -0,0 +1,2 @@
@JsExport
class Bar
@@ -0,0 +1 @@
fun foo() = 77
@@ -0,0 +1,29 @@
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 : l2.2.kt -> l2.kt
added file: l2.kt
STEP 3:
modifications:
U : l2.3.kt -> l2.kt
modified ir: l2.kt
STEP 4:
modifications:
D : l1.kt
removed file: l1.kt
STEP 5:
modifications:
U : l1.5.kt -> l1.kt
added file: l1.kt
STEP 6:
modifications:
U : l1.6.kt -> l1.kt
U : l2.6.kt -> l2.kt
modified ir: l1.kt, l2.kt
@@ -0,0 +1,3 @@
fun box(): String {
return "OK"
}
@@ -0,0 +1,3 @@
STEP 0:
added file: m.kt
STEP 1..6:
@@ -0,0 +1,30 @@
MODULES: lib1, main
STEP 0:
libs: lib1, main
dirty js modules: lib1, main
dirty js files: lib1/l1, main/m, main/m.export, main
STEP 1:
libs: lib1, main
dirty js modules: lib1
dirty js files: lib1/l1, lib1/l1.export, lib1
STEP 2:
libs: lib1, main
dirty js modules: lib1
dirty js files: lib1/l2
STEP 3:
libs: lib1, main
dirty js modules: lib1
dirty js files: lib1/l2, lib1/l2.export, lib1
STEP 4:
libs: lib1, main
dirty js modules: lib1
dirty js files: lib1
STEP 5:
libs: lib1, main
dirty js modules: lib1
dirty js files: lib1/l1
STEP 6:
libs: lib1, main
dirty js modules: lib1
dirty js files: lib1/l1, lib1/l1.export, lib1/l2, lib1
@@ -3,7 +3,7 @@ MODULES: lib1, main
STEP 0:
libs: lib1, main
dirty js modules: lib1, main
dirty js files: lib1/ObjectA, lib1/ObjectB, main/m, main/m.export
dirty js files: lib1/ObjectA, lib1/ObjectB, main/m, main/m.export, main
STEP 1:
libs: lib1, main
dirty js modules: lib1, main
@@ -3,22 +3,22 @@ MODULES: lib1, main
STEP 0:
libs: lib1, main
dirty js modules: lib1, main
dirty js files: lib1/l1, main/m, main/m.export
dirty js files: lib1/l1, main/m, main/m.export, main
STEP 1:
language: +TypeAliases
libs: lib1, main
dirty js modules: lib1, main
dirty js files: lib1/l1, main/m, main/m.export
dirty js files: lib1/l1, main/m, main/m.export, main
STEP 2:
language: +TypeAliases, +BoundCallableReferences, +LocalDelegatedProperties, +TopLevelSealedInheritance
libs: lib1, main
dirty js modules: lib1, main
dirty js files: lib1/l1, main/m, main/m.export
dirty js files: lib1/l1, main/m, main/m.export, main
STEP 3:
language: +TypeAliases, +BoundCallableReferences, +TopLevelSealedInheritance
libs: lib1, main
dirty js modules: lib1, main
dirty js files: lib1/l1, main/m, main/m.export
dirty js files: lib1/l1, main/m, main/m.export, main
STEP 4:
language: +BoundCallableReferences, +TopLevelSealedInheritance, +TypeAliases
libs: lib1, main
@@ -29,7 +29,7 @@ STEP 6:
language: +BoundCallableReferences, -TypeAliases, +TopLevelSealedInheritance
libs: lib1, main
dirty js modules: lib1, main
dirty js files: lib1/l1, main/m, main/m.export
dirty js files: lib1/l1, main/m, main/m.export, main
STEP 7:
language: +TopLevelSealedInheritance, +BoundCallableReferences, +TypeAliases
libs: lib1, main
@@ -3,7 +3,7 @@ MODULES: lib1, main
STEP 0:
libs: lib1, main
dirty js modules: lib1, main
dirty js files: lib1/l1, main/m, main/m.export
dirty js files: lib1/l1, main/m, main/m.export, main
STEP 1:
libs: lib1, main
dirty js modules: lib1
@@ -3,7 +3,7 @@ MODULES: lib1, main
STEP 0:
libs: lib1, main
dirty js modules: lib1, main
dirty js files: lib1/classA, lib1/interface, main/test, main/m, main/m.export
dirty js files: lib1/classA, lib1/interface, main/test, main/m, main/m.export, main
STEP 1:
libs: lib1, main
dirty js modules: lib1
@@ -3,7 +3,7 @@ MODULES: lib1, main
STEP 0:
libs: lib1, main
dirty js modules: lib1, main
dirty js files: lib1/l1, main/m0, main/m1, main/m, main/m.export
dirty js files: lib1/l1, main/m0, main/m1, main/m, main/m.export, main
STEP 1:
libs: lib1, main
dirty js modules: main
@@ -3,7 +3,7 @@ MODULES: lib1, main
STEP 0:
libs: lib1, main
dirty js modules: lib1, main
dirty js files: lib1/l1a, lib1/l1b, lib1/test, main/m, main/m.export
dirty js files: lib1/l1a, lib1/l1b, lib1/test, main/m, main/m.export, main
STEP 1:
libs: lib1, main
dirty js modules: lib1
@@ -4,7 +4,7 @@ MODULES: lib1, lib2, main
STEP 0:
libs: lib1, lib2, main
dirty js files: lib1/demo, lib1/JsModuleA, lib1/JsModuleB, lib2/test, main/m, main/m.export
dirty js files: lib1/demo, lib1/JsModuleA, lib1/JsModuleB, lib2/test, main/m, main/m.export, main
STEP 1:
libs: lib1, lib2, main
dirty js files: lib1/demo, lib1/JsModuleA, lib1/JsModuleB
@@ -3,7 +3,7 @@ MODULES: lib1, lib2, lib3, main
STEP 0:
libs: lib1, lib2, lib3, main
dirty js modules: lib1, lib2, lib3, main
dirty js files: lib1/l11, lib1/l12, lib2/l21, lib3/l3, main/m, main/m.export
dirty js files: lib1/l11, lib1/l12, lib2/l21, lib3/l3, main/m, main/m.export, main
STEP 1:
libs: lib1, lib2, lib3, main
dirty js modules: lib1, lib2, lib3, main
@@ -3,7 +3,7 @@ MODULES: lib1, lib2, lib3, main
STEP 0:
libs: lib1, lib2, lib3, main
dirty js modules: lib1, lib2, lib3, main
dirty js files: lib1/l1, lib2/l2, lib3/l3, main/m, main/m.export
dirty js files: lib1/l1, lib2/l2, lib3/l3, main/m, main/m.export, main
STEP 1:
libs: lib1, lib2, lib3, main
dirty js modules: lib1, lib2, lib3, main
@@ -3,7 +3,7 @@ MODULES: lib1, main
STEP 0:
libs: lib1, main
dirty js modules: lib1, main
dirty js files: lib1/l1, main/m, main/m.export
dirty js files: lib1/l1, main/m, main/m.export, main
STEP 1:
libs: lib1, main
dirty js modules: lib1, main
@@ -3,7 +3,7 @@ MODULES: lib1, main
STEP 0:
libs: lib1, main
dirty js modules: lib1, main
dirty js files: lib1/l1, main/m, main/m.export
dirty js files: lib1/l1, main/m, main/m.export, main
STEP 1..3:
libs: lib1, main
dirty js modules: lib1, main
@@ -3,7 +3,7 @@ MODULES: main
STEP 0:
libs: main
dirty js modules: main
dirty js files: main/f, main/m, main/m.export
dirty js files: main/f, main/m, main/m.export, main
STEP 1..2:
libs: main
dirty js modules: main
@@ -3,7 +3,7 @@ MODULES: lib1, lib2, main
STEP 0:
libs: lib1, lib2, main
dirty js modules: lib1, lib2, main
dirty js files: lib1/l1, lib2/l2, main/m, main/m.export
dirty js files: lib1/l1, lib2/l2, main/m, main/m.export, main
STEP 1:
libs: lib1, lib2, main
dirty js modules: lib1
@@ -3,7 +3,7 @@ MODULES: lib1, main
STEP 0:
libs: lib1, main
dirty js modules: lib1, main
dirty js files: lib1/classA, lib1/interface, main/test, main/m, main/m.export
dirty js files: lib1/classA, lib1/interface, main/test, main/m, main/m.export, main
STEP 1:
libs: lib1, main
dirty js modules: lib1
@@ -3,7 +3,7 @@ MODULES: lib1, lib2, main
STEP 0:
libs: lib1, lib2, main
dirty js modules: lib1, lib2, main
dirty js files: lib1/l1_0, lib1/l1_1, lib2/l2_0, lib2/l2_1, main/m, main/m.export
dirty js files: lib1/l1_0, lib1/l1_1, lib2/l2_0, lib2/l2_1, main/m, main/m.export, main
STEP 1:
libs: lib1, lib2, main
dirty js modules: lib1, lib2, main
@@ -3,7 +3,7 @@ MODULES: lib1, lib2, main
STEP 0:
libs: lib1, lib2, main
dirty js modules: lib1, lib2, main
dirty js files: lib1/l1, lib2/l2, main/m, main/m.export
dirty js files: lib1/l1, lib2/l2, main/m, main/m.export, main
STEP 1:
libs: lib1, lib2, main
dirty js modules: lib1, lib2
@@ -3,7 +3,7 @@ MODULES: lib1, main
STEP 0:
libs: lib1, main
dirty js modules: lib1, main
dirty js files: lib1/l1_0, lib1/l1_1, main/m, main/m.export
dirty js files: lib1/l1_0, lib1/l1_1, main/m, main/m.export, main
STEP 1:
libs: lib1, main
dirty js modules: lib1
@@ -3,7 +3,7 @@ MODULES: lib1, main
STEP 0:
libs: lib1, main
dirty js modules: lib1, main
dirty js files: lib1/l1, main/m, main/m.export
dirty js files: lib1/l1, main/m, main/m.export, main
STEP 1:
libs: lib1, main
dirty js modules: lib1, main
@@ -3,7 +3,7 @@ MODULES: lib1, lib1-new, main
STEP 0:
libs: lib1, main
dirty js modules: lib1, main
dirty js files: lib1/l1, main/m, main/m.export
dirty js files: lib1/l1, main/m, main/m.export, main
STEP 1..2:
libs: lib1-new, main
dirty js modules: lib1-new, main
@@ -3,7 +3,7 @@ MODULES: lib1, lib2, main
STEP 0:
libs: lib1, lib2, main
dirty js modules: lib1, lib2, main
dirty js files: lib1/l1, lib2/l2, main/m, main/m.export
dirty js files: lib1/l1, lib2/l2, main/m, main/m.export, main
STEP 1:
libs: lib1, lib2, main
dirty js modules: lib1
@@ -3,7 +3,7 @@ MODULES: lib1, lib1-a, lib1-b, lib1-c, lib2, main
STEP 0:
libs: lib1, lib2, main
dirty js modules: lib1, lib2, main
dirty js files: lib1/l1a, lib1/l1b, lib1/l1c, lib2/l2, main/m, main/m.export
dirty js files: lib1/l1a, lib1/l1b, lib1/l1c, lib2/l2, main/m, main/m.export, main
STEP 1:
libs: lib1-a, lib1-b, lib1-c, lib2, main
dirty js modules: lib1-a, lib1-b, lib1-c, lib2
@@ -3,7 +3,7 @@ MODULES: lib1, main
STEP 0:
libs: lib1, main
dirty js modules: lib1, main
dirty js files: lib1/l1, main/m, main/m.export
dirty js files: lib1/l1, main/m, main/m.export, main
STEP 1..2:
libs: lib1, main
dirty js modules: lib1, main
@@ -3,7 +3,7 @@ MODULES: lib1, lib2, main
STEP 0:
libs: lib1, lib2, main
dirty js modules: lib1, lib2, main
dirty js files: lib1/l1A, lib1/l1I, lib2/l2A, main/m, main/m.export
dirty js files: lib1/l1A, lib1/l1I, lib2/l2A, main/m, main/m.export, main
STEP 1:
libs: lib1, lib2, main
dirty js modules: lib1
@@ -3,7 +3,7 @@ MODULES: lib1, lib2, main
STEP 0:
libs: lib1, lib2, main
dirty js modules: lib1, lib2, main
dirty js files: lib1/l1, lib2/l2, lib2/l2globalVal, main/m, main/m.export
dirty js files: lib1/l1, lib2/l2, lib2/l2globalVal, main/m, main/m.export, main
STEP 1:
libs: lib1, lib2, main
dirty js modules: lib1
@@ -3,7 +3,7 @@ MODULES: lib1, lib2, main
STEP 0:
libs: lib1, lib2, main
dirty js modules: lib1, lib2, main
dirty js files: lib1/l1, lib2/l2, main/m, main/m.export
dirty js files: lib1/l1, lib2/l2, main/m, main/m.export, main
STEP 1:
libs: lib1, lib2, main
dirty js modules: lib1, lib2, main
@@ -4,16 +4,16 @@ MODULES: lib1, lib2, main
STEP 0:
libs: lib1, lib2, main
dirty js files: lib1/l1, lib2/l2, main/m, main/m.export
dirty js files: lib1/l1, lib2/l2, main/m, main/m.export, main
STEP 1:
libs: lib1, lib2, main
dirty js files: lib1/l1, lib1/l1.export, lib2/l2
dirty js files: lib1/l1, lib1/l1.export, lib1, lib2/l2
STEP 2:
libs: lib1, lib2, main
dirty js files: lib1/l1, lib1/l1.export, lib2/l2
STEP 3:
libs: lib1, lib2, main
dirty js files: lib2/l2, lib2/l2.export, main/m
dirty js files: lib2/l2, lib2/l2.export, lib2, main/m
STEP 4:
libs: lib1, lib2, main
dirty js files: lib1/l1, lib2/l2
@@ -3,7 +3,7 @@ MODULES: lib1, lib3, lib2, main
STEP 0:
libs: lib1, lib3, lib2, main
dirty js modules: lib1, lib2, lib3, main
dirty js files: lib1/l1, lib2/l2, lib3/l3, main/m, main/m.export
dirty js files: lib1/l1, lib2/l2, lib3/l3, main/m, main/m.export, main
STEP 1:
libs: lib1, lib3, lib2, main
dirty js modules: lib1
@@ -3,7 +3,7 @@ MODULES: lib1, lib2, main
STEP 0:
libs: lib1, lib2, main
dirty js modules: lib1, lib2, main
dirty js files: lib1/l1a, lib1/l1b, lib1/l1c, lib1/l1d, lib2/l2a, main/m, main/m.export
dirty js files: lib1/l1a, lib1/l1b, lib1/l1c, lib1/l1d, lib2/l2a, main/m, main/m.export, main
STEP 1:
libs: lib1, lib2, main
dirty js modules: lib2
@@ -3,7 +3,7 @@ MODULES: lib1, lib2, main
STEP 0:
libs: lib1, lib2, main
dirty js modules: lib1, lib2, main
dirty js files: lib1/l1a, lib1/l1b, lib2/l2a, main/m, main/m.export
dirty js files: lib1/l1a, lib1/l1b, lib2/l2a, main/m, main/m.export, main
STEP 1:
libs: lib1, lib2, main
dirty js modules: lib1, lib2, main
@@ -3,7 +3,7 @@ MODULES: lib1, main
STEP 0:
libs: lib1, main
dirty js modules: lib1, main
dirty js files: lib1/l1, main/m, main/m.export
dirty js files: lib1/l1, main/m, main/m.export, main
STEP 1..2:
libs: lib1, main
dirty js modules: lib1, main
@@ -3,7 +3,7 @@ MODULES: lib1, main
STEP 0:
libs: lib1, main
dirty js modules: lib1, main
dirty js files: lib1/l1, main/test, main/m, main/m.export
dirty js files: lib1/l1, main/test, main/m, main/m.export, main
STEP 1..2:
libs: lib1, main
dirty js modules: lib1, main

Some files were not shown because too many files have changed in this diff Show More