[Commonizer] Logging: Implement ProgressLogger.fork

^KT-36679
This commit is contained in:
sebastian.sellmair
2021-04-29 10:45:44 +02:00
committed by TeamCityServer
parent ec440aecf6
commit 7349ec8f2f
12 changed files with 79 additions and 72 deletions
@@ -9,15 +9,16 @@ import org.jetbrains.kotlin.commonizer.konan.NativeManifestDataProvider
import org.jetbrains.kotlin.commonizer.mergedtree.CirFictitiousFunctionClassifiers import org.jetbrains.kotlin.commonizer.mergedtree.CirFictitiousFunctionClassifiers
import org.jetbrains.kotlin.commonizer.mergedtree.CirProvidedClassifiers import org.jetbrains.kotlin.commonizer.mergedtree.CirProvidedClassifiers
import org.jetbrains.kotlin.commonizer.stats.StatsCollector import org.jetbrains.kotlin.commonizer.stats.StatsCollector
import org.jetbrains.kotlin.commonizer.utils.ProgressLogger
class CommonizerParameters( data class CommonizerParameters(
val outputTarget: SharedCommonizerTarget, val outputTarget: SharedCommonizerTarget,
val manifestProvider: TargetDependent<NativeManifestDataProvider>, val manifestProvider: TargetDependent<NativeManifestDataProvider>,
val dependenciesProvider: TargetDependent<ModulesProvider?>, val dependenciesProvider: TargetDependent<ModulesProvider?>,
val targetProviders: TargetDependent<TargetProvider?>, val targetProviders: TargetDependent<TargetProvider?>,
val resultsConsumer: ResultsConsumer, val resultsConsumer: ResultsConsumer,
val statsCollector: StatsCollector? = null, val statsCollector: StatsCollector? = null,
val progressLogger: ((String) -> Unit)? = null, val logger: ProgressLogger? = null,
) )
internal fun CommonizerParameters.dependencyClassifiers(target: CommonizerTarget): CirProvidedClassifiers { internal fun CommonizerParameters.dependencyClassifiers(target: CommonizerTarget): CirProvidedClassifiers {
@@ -30,3 +31,5 @@ internal fun CommonizerParameters.dependencyClassifiers(target: CommonizerTarget
CirProvidedClassifiers.of(classifiers, CirProvidedClassifiers.by(module)) CirProvidedClassifiers.of(classifiers, CirProvidedClassifiers.by(module))
} }
} }
internal fun CommonizerParameters.with(logger: ProgressLogger?) = copy(logger = logger)
@@ -31,19 +31,19 @@ interface ResultsConsumer {
/** /**
* Consume a single [ModuleResult] for the specified [CommonizerTarget]. * Consume a single [ModuleResult] for the specified [CommonizerTarget].
*/ */
fun consume(target: CommonizerTarget, moduleResult: ModuleResult) = Unit fun consume(parameters: CommonizerParameters, target: CommonizerTarget, moduleResult: ModuleResult) = Unit
/** /**
* Mark the specified [CommonizerTarget] as fully consumed. * Mark the specified [CommonizerTarget] as fully consumed.
* It's forbidden to make subsequent [consume] calls for fully consumed targets. * It's forbidden to make subsequent [consume] calls for fully consumed targets.
*/ */
fun targetConsumed(target: CommonizerTarget) = Unit fun targetConsumed(parameters: CommonizerParameters, target: CommonizerTarget) = Unit
/** /**
* Notify that all results have been consumed. * Notify that all results have been consumed.
* It's forbidden to make any subsequent [consume] and [targetConsumed] calls after this call. * It's forbidden to make any subsequent [consume] and [targetConsumed] calls after this call.
*/ */
fun allConsumed(status: Status) = Unit fun allConsumed(parameters: CommonizerParameters, status: Status) = Unit
} }
internal class ResultsConsumerBuilder { internal class ResultsConsumerBuilder {
@@ -72,21 +72,21 @@ operator fun ResultsConsumer.plus(other: ResultsConsumer?): ResultsConsumer {
} }
private class CompositeResultsConsumer(val consumers: List<ResultsConsumer>) : ResultsConsumer { private class CompositeResultsConsumer(val consumers: List<ResultsConsumer>) : ResultsConsumer {
override fun consume(target: CommonizerTarget, moduleResult: ResultsConsumer.ModuleResult) { override fun consume(parameters: CommonizerParameters, target: CommonizerTarget, moduleResult: ResultsConsumer.ModuleResult) {
consumers.forEach { consumer -> consumers.forEach { consumer ->
consumer.consume(target, moduleResult) consumer.consume(parameters, target, moduleResult)
} }
} }
override fun targetConsumed(target: CommonizerTarget) { override fun targetConsumed(parameters: CommonizerParameters, target: CommonizerTarget) {
consumers.forEach { consumer -> consumers.forEach { consumer ->
consumer.targetConsumed(target) consumer.targetConsumed(parameters, target)
} }
} }
override fun allConsumed(status: ResultsConsumer.Status) { override fun allConsumed(parameters: CommonizerParameters, status: ResultsConsumer.Status) {
consumers.forEach { consumer -> consumers.forEach { consumer ->
consumer.allConsumed(status) consumer.allConsumed(parameters, status)
} }
} }
} }
@@ -8,13 +8,15 @@ package org.jetbrains.kotlin.commonizer.cli
import org.jetbrains.kotlin.util.Logger import org.jetbrains.kotlin.util.Logger
import kotlin.system.exitProcess import kotlin.system.exitProcess
internal class CliLoggerAdapter(indentSize: Int) : Logger { internal class CliLoggerAdapter(indentSize: Int = 0) : Logger {
private val indent = " ".repeat(indentSize) private val indent = " ".repeat(indentSize)
override fun log(message: String) = printlnIndented(message) override fun log(message: String) = printlnIndented(message)
override fun warning(message: String) = printlnIndented("Warning: $message") override fun warning(message: String) = printlnIndented("Warning: $message")
override fun error(message: String) = fatal(message) override fun error(message: String) = fatal(message)
override fun fatal(message: String): Nothing { override fun fatal(message: String): Nothing {
printlnIndented("Error: $message\n") printlnIndented("Error: $message\n")
exitProcess(1) exitProcess(1)
@@ -54,7 +54,7 @@ internal class NativeKlibCommonize(options: Collection<Option<*>>) : Task(option
val konanTargets = outputCommonizerTarget.konanTargets val konanTargets = outputCommonizerTarget.konanTargets
val commonizerTargets = konanTargets.map(::CommonizerTarget) val commonizerTargets = konanTargets.map(::CommonizerTarget)
val progressLogger = ProgressLogger(CliLoggerAdapter(2), startImmediately = true) val progressLogger = ProgressLogger(CliLoggerAdapter(2))
val libraryLoader = DefaultNativeLibraryLoader(progressLogger) val libraryLoader = DefaultNativeLibraryLoader(progressLogger)
val statsCollector = StatsCollector(statsType, commonizerTargets) val statsCollector = StatsCollector(statsType, commonizerTargets)
val repository = FilesRepository(targetLibraries.toSet(), libraryLoader) val repository = FilesRepository(targetLibraries.toSet(), libraryLoader)
@@ -62,9 +62,9 @@ internal class NativeKlibCommonize(options: Collection<Option<*>>) : Task(option
val resultsConsumer = buildResultsConsumer { val resultsConsumer = buildResultsConsumer {
this add ModuleSerializer(destination, HierarchicalCommonizerOutputLayout) this add ModuleSerializer(destination, HierarchicalCommonizerOutputLayout)
this add CopyUnconsumedModulesAsIsConsumer( this add CopyUnconsumedModulesAsIsConsumer(
repository, destination, commonizerTargets.toSet(), NativeDistributionCommonizerOutputLayout, progressLogger repository, destination, commonizerTargets.toSet(), NativeDistributionCommonizerOutputLayout
) )
this add LoggingResultsConsumer(outputCommonizerTarget, progressLogger) this add LoggingResultsConsumer(outputCommonizerTarget)
} }
LibraryCommonizer( LibraryCommonizer(
@@ -98,17 +98,17 @@ internal class NativeDistributionCommonize(options: Collection<Option<*>>) : Tas
val copyEndorsedLibs = getOptional<Boolean, BooleanOptionType> { it == "copy-endorsed-libs" } ?: false val copyEndorsedLibs = getOptional<Boolean, BooleanOptionType> { it == "copy-endorsed-libs" } ?: false
val statsType = getOptional<StatsType, StatsTypeOptionType> { it == "log-stats" } ?: StatsType.NONE val statsType = getOptional<StatsType, StatsTypeOptionType> { it == "log-stats" } ?: StatsType.NONE
val progressLogger = ProgressLogger(CliLoggerAdapter(2), startImmediately = true) val progressLogger = ProgressLogger(CliLoggerAdapter(2))
val libraryLoader = DefaultNativeLibraryLoader(progressLogger) val libraryLoader = DefaultNativeLibraryLoader(progressLogger)
val repository = KonanDistributionRepository(distribution, outputTarget.konanTargets, libraryLoader) val repository = KonanDistributionRepository(distribution, outputTarget.konanTargets, libraryLoader)
val statsCollector = StatsCollector(statsType, outputTarget.withAllAncestors().toList()) val statsCollector = StatsCollector(statsType, outputTarget.withAllAncestors().toList())
val resultsConsumer = buildResultsConsumer { val resultsConsumer = buildResultsConsumer {
this add ModuleSerializer(destination, outputLayout) this add ModuleSerializer(destination, outputLayout)
this add CopyUnconsumedModulesAsIsConsumer(repository, destination, outputTarget.allLeaves(), outputLayout, progressLogger) this add CopyUnconsumedModulesAsIsConsumer(repository, destination, outputTarget.allLeaves(), outputLayout)
if (copyStdlib) this add CopyStdlibResultsConsumer(distribution, destination, progressLogger) if (copyStdlib) this add CopyStdlibResultsConsumer(distribution, destination)
if (copyEndorsedLibs) this add CopyEndorsedLibrairesResultsConsumer(distribution, destination, progressLogger) if (copyEndorsedLibs) this add CopyEndorsedLibrairesResultsConsumer(distribution, destination)
this add LoggingResultsConsumer(outputTarget, progressLogger) this add LoggingResultsConsumer(outputTarget)
} }
val descriptionSuffix = estimateLibrariesCount(repository, outputTarget.allLeaves()).let { " ($it items)" } val descriptionSuffix = estimateLibrariesCount(repository, outputTarget.allLeaves()).let { " ($it items)" }
@@ -26,13 +26,13 @@ import org.jetbrains.kotlin.storage.StorageManager
fun runCommonization(parameters: CommonizerParameters) { fun runCommonization(parameters: CommonizerParameters) {
if (!parameters.containsCommonModuleNames()) { if (!parameters.containsCommonModuleNames()) {
parameters.resultsConsumer.allConsumed(Status.NOTHING_TO_DO) parameters.resultsConsumer.allConsumed(parameters, Status.NOTHING_TO_DO)
return return
} }
val storageManager = LockBasedStorageManager("Declarations commonization") val storageManager = LockBasedStorageManager("Declarations commonization")
commonize(parameters, storageManager, parameters.outputTarget) commonize(parameters, storageManager, parameters.outputTarget)
parameters.resultsConsumer.allConsumed(Status.DONE) parameters.resultsConsumer.allConsumed(parameters, Status.DONE)
} }
private fun commonize( private fun commonize(
@@ -41,7 +41,7 @@ private fun commonize(
target: SharedCommonizerTarget, target: SharedCommonizerTarget,
): CirRootNode? { ): CirRootNode? {
val cirTrees = getCirTree(parameters, storageManager, target) val cirTrees = getCirTree(parameters, storageManager, target)
parameters.progressLogger?.invoke("Build cir tree for $target") parameters.logProgress("Built declaration tree for $target")
// build merged tree: // build merged tree:
val classifiers = CirKnownClassifiers( val classifiers = CirKnownClassifiers(
@@ -51,10 +51,9 @@ private fun commonize(
val mergedTree = merge(storageManager, classifiers, cirTrees) ?: return null val mergedTree = merge(storageManager, classifiers, cirTrees) ?: return null
mergedTree.accept(CommonizationVisitor(classifiers, mergedTree), Unit) mergedTree.accept(CommonizationVisitor(classifiers, mergedTree), Unit)
parameters.progressLogger?.invoke("Commonized declarations for $target") parameters.logProgress("Commonized declarations for $target")
serialize(parameters, mergedTree, target) serialize(parameters, mergedTree, target)
parameters.progressLogger?.invoke("Commonized target $target")
return mergedTree return mergedTree
} }
@@ -65,7 +64,9 @@ private fun getCirTree(
return EagerTargetDependent(target.targets) { childTarget -> return EagerTargetDependent(target.targets) { childTarget ->
when (childTarget) { when (childTarget) {
is LeafCommonizerTarget -> deserialize(parameters, childTarget) is LeafCommonizerTarget -> deserialize(parameters, childTarget)
is SharedCommonizerTarget -> commonize(parameters, storageManager, childTarget)?.assembleCirTree() is SharedCommonizerTarget -> commonize(parameters.fork(), storageManager, childTarget)?.assembleCirTree().also {
parameters.logProgress("Commonized target $childTarget")
}
} }
} }
} }
@@ -103,9 +104,9 @@ private fun serialize(parameters: CommonizerParameters, mergedTree: CirRootNode,
SerializedMetadata(header, fragments, fragmentNames) SerializedMetadata(header, fragments, fragmentNames)
} }
val manifestData = parameters.manifestProvider[target].buildManifest(libraryName) val manifestData = parameters.manifestProvider[target].buildManifest(libraryName)
parameters.resultsConsumer.consume(target, ModuleResult.Commonized(libraryName, serializedMetadata, manifestData)) parameters.resultsConsumer.consume(parameters, target, ModuleResult.Commonized(libraryName, serializedMetadata, manifestData))
} }
parameters.resultsConsumer.targetConsumed(target) parameters.resultsConsumer.targetConsumed(parameters, target)
} }
private fun serializeMissingModules(parameters: CommonizerParameters, requestedTarget: CommonizerTarget) { private fun serializeMissingModules(parameters: CommonizerParameters, requestedTarget: CommonizerTarget) {
@@ -114,8 +115,14 @@ private fun serializeMissingModules(parameters: CommonizerParameters, requestedT
targetProvider.modulesProvider.loadModuleInfos() targetProvider.modulesProvider.loadModuleInfos()
.filter { it.name !in commonModuleNames } .filter { it.name !in commonModuleNames }
.forEach { missingModule -> parameters.resultsConsumer.consume(requestedTarget, Missing(missingModule.originalLocation)) } .forEach { missingModule ->
parameters.resultsConsumer.consume(parameters, requestedTarget, Missing(missingModule.originalLocation))
}
} }
private fun CommonizerParameters.fork(): CommonizerParameters = with(logger?.fork())
private fun CommonizerParameters.logProgress(message: String) = logger?.progress(message)
private val KLIB_FRAGMENT_WRITE_STRATEGY = ChunkedKlibModuleFragmentWriteStrategy() private val KLIB_FRAGMENT_WRITE_STRATEGY = ChunkedKlibModuleFragmentWriteStrategy()
@@ -7,23 +7,22 @@
package org.jetbrains.kotlin.commonizer.konan package org.jetbrains.kotlin.commonizer.konan
import org.jetbrains.kotlin.commonizer.CommonizerParameters
import org.jetbrains.kotlin.commonizer.KonanDistribution import org.jetbrains.kotlin.commonizer.KonanDistribution
import org.jetbrains.kotlin.commonizer.ResultsConsumer import org.jetbrains.kotlin.commonizer.ResultsConsumer
import org.jetbrains.kotlin.commonizer.klibDir import org.jetbrains.kotlin.commonizer.klibDir
import org.jetbrains.kotlin.konan.library.KONAN_DISTRIBUTION_COMMON_LIBS_DIR import org.jetbrains.kotlin.konan.library.KONAN_DISTRIBUTION_COMMON_LIBS_DIR
import org.jetbrains.kotlin.konan.library.KONAN_STDLIB_NAME import org.jetbrains.kotlin.konan.library.KONAN_STDLIB_NAME
import org.jetbrains.kotlin.util.Logger
import java.io.File import java.io.File
internal fun CopyStdlibResultsConsumer( internal fun CopyStdlibResultsConsumer(
konanDistribution: KonanDistribution, konanDistribution: KonanDistribution,
destination: File, destination: File
logger: Logger
): ResultsConsumer { ): ResultsConsumer {
return CopyLibrariesFromKonanDistributionResultsConsumer( return CopyLibrariesFromKonanDistributionResultsConsumer(
konanDistribution, konanDistribution,
destination, destination,
invokeWhenCopied = { logger.log("Copied standard library") }, invokeWhenCopied = { logger?.progress("Copied standard library") },
copyFileIf = { file -> file.endsWith(KONAN_STDLIB_NAME) } copyFileIf = { file -> file.endsWith(KONAN_STDLIB_NAME) }
) )
} }
@@ -31,12 +30,11 @@ internal fun CopyStdlibResultsConsumer(
internal fun CopyEndorsedLibrairesResultsConsumer( internal fun CopyEndorsedLibrairesResultsConsumer(
konanDistribution: KonanDistribution, konanDistribution: KonanDistribution,
destination: File, destination: File,
logger: Logger
): ResultsConsumer { ): ResultsConsumer {
return CopyLibrariesFromKonanDistributionResultsConsumer( return CopyLibrariesFromKonanDistributionResultsConsumer(
konanDistribution, konanDistribution,
destination, destination,
invokeWhenCopied = { logger.log("Copied endorsed libraries") }, invokeWhenCopied = { logger?.progress("Copied endorsed libraries") },
copyFileIf = { file -> !file.endsWith(KONAN_STDLIB_NAME) } copyFileIf = { file -> !file.endsWith(KONAN_STDLIB_NAME) }
) )
} }
@@ -44,10 +42,10 @@ internal fun CopyEndorsedLibrairesResultsConsumer(
private class CopyLibrariesFromKonanDistributionResultsConsumer( private class CopyLibrariesFromKonanDistributionResultsConsumer(
private val konanDistribution: KonanDistribution, private val konanDistribution: KonanDistribution,
private val destination: File, private val destination: File,
private val invokeWhenCopied: () -> Unit = {}, private val invokeWhenCopied: CommonizerParameters.() -> Unit = {},
private val copyFileIf: (File) -> Boolean = { true } private val copyFileIf: (File) -> Boolean = { true }
) : ResultsConsumer { ) : ResultsConsumer {
override fun allConsumed(status: ResultsConsumer.Status) { override fun allConsumed(parameters: CommonizerParameters, status: ResultsConsumer.Status) {
konanDistribution.klibDir konanDistribution.klibDir
.resolve(KONAN_DISTRIBUTION_COMMON_LIBS_DIR) .resolve(KONAN_DISTRIBUTION_COMMON_LIBS_DIR)
.listFiles().orEmpty() .listFiles().orEmpty()
@@ -57,6 +55,6 @@ private class CopyLibrariesFromKonanDistributionResultsConsumer(
val libraryDestination = destination.resolve(KONAN_DISTRIBUTION_COMMON_LIBS_DIR).resolve(libraryOrigin.name) val libraryDestination = destination.resolve(KONAN_DISTRIBUTION_COMMON_LIBS_DIR).resolve(libraryOrigin.name)
libraryOrigin.copyRecursively(libraryDestination) libraryOrigin.copyRecursively(libraryDestination)
} }
invokeWhenCopied() parameters.invokeWhenCopied()
} }
} }
@@ -7,7 +7,6 @@ package org.jetbrains.kotlin.commonizer.konan
import org.jetbrains.kotlin.commonizer.* import org.jetbrains.kotlin.commonizer.*
import org.jetbrains.kotlin.commonizer.repository.Repository import org.jetbrains.kotlin.commonizer.repository.Repository
import org.jetbrains.kotlin.util.Logger
import java.io.File import java.io.File
internal class CopyUnconsumedModulesAsIsConsumer( internal class CopyUnconsumedModulesAsIsConsumer(
@@ -15,25 +14,24 @@ internal class CopyUnconsumedModulesAsIsConsumer(
private val destination: File, private val destination: File,
private val targets: Set<LeafCommonizerTarget>, private val targets: Set<LeafCommonizerTarget>,
private val outputLayout: CommonizerOutputLayout, private val outputLayout: CommonizerOutputLayout,
private val logger: Logger? = null
) : ResultsConsumer { ) : ResultsConsumer {
private val consumedTargets = mutableSetOf<LeafCommonizerTarget>() private val consumedTargets = mutableSetOf<LeafCommonizerTarget>()
override fun targetConsumed(target: CommonizerTarget) { override fun targetConsumed(parameters: CommonizerParameters, target: CommonizerTarget) {
if (target is LeafCommonizerTarget) { if (target is LeafCommonizerTarget) {
consumedTargets += target consumedTargets += target
} }
} }
override fun allConsumed(status: ResultsConsumer.Status) { override fun allConsumed(parameters: CommonizerParameters, status: ResultsConsumer.Status) {
when (status) { when (status) {
ResultsConsumer.Status.NOTHING_TO_DO -> targets.forEach(::copyTargetAsIs) ResultsConsumer.Status.NOTHING_TO_DO -> targets.forEach { target -> copyTargetAsIs(parameters, target) }
ResultsConsumer.Status.DONE -> targets.minus(consumedTargets).forEach(::copyTargetAsIs) ResultsConsumer.Status.DONE -> targets.minus(consumedTargets).forEach { target -> copyTargetAsIs(parameters, target) }
} }
} }
private fun copyTargetAsIs(target: LeafCommonizerTarget) { private fun copyTargetAsIs(parameters: CommonizerParameters, target: LeafCommonizerTarget) {
val libraries = repository.getLibraries(target) val libraries = repository.getLibraries(target)
val librariesDestination = outputLayout.getTargetDirectory(destination, target) val librariesDestination = outputLayout.getTargetDirectory(destination, target)
librariesDestination.mkdirs() // always create an empty directory even if there is nothing to copy librariesDestination.mkdirs() // always create an empty directory even if there is nothing to copy
@@ -41,6 +39,6 @@ internal class CopyUnconsumedModulesAsIsConsumer(
libraryFile.copyRecursively(destination.resolve(libraryFile.name)) libraryFile.copyRecursively(destination.resolve(libraryFile.name))
} }
logger?.log("Copied ${libraries.size} libraries for ${target.prettyName}") parameters.logger?.progress("Copied ${libraries.size} libraries for ${target.prettyName}")
} }
} }
@@ -39,7 +39,7 @@ internal class LibraryCommonizer internal constructor(
) )
} }
progressLogger.log("Resolved libraries to be commonized") progressLogger.progress("Resolved libraries to be commonized")
return libraries return libraries
} }
@@ -51,7 +51,7 @@ internal class LibraryCommonizer internal constructor(
dependenciesProvider = createDependenciesProvider(), dependenciesProvider = createDependenciesProvider(),
resultsConsumer = resultsConsumer, resultsConsumer = resultsConsumer,
statsCollector = statsCollector, statsCollector = statsCollector,
progressLogger = progressLogger::log logger = progressLogger
) )
runCommonization(parameters) runCommonization(parameters)
} }
@@ -5,16 +5,12 @@
package org.jetbrains.kotlin.commonizer.konan package org.jetbrains.kotlin.commonizer.konan
import org.jetbrains.kotlin.commonizer.CommonizerTarget import org.jetbrains.kotlin.commonizer.*
import org.jetbrains.kotlin.commonizer.ResultsConsumer
import org.jetbrains.kotlin.commonizer.SharedCommonizerTarget
import org.jetbrains.kotlin.commonizer.prettyName
import org.jetbrains.kotlin.util.Logger
internal class LoggingResultsConsumer( internal class LoggingResultsConsumer(
private val outputCommonizerTarget: SharedCommonizerTarget, private val logger: Logger private val outputCommonizerTarget: SharedCommonizerTarget
) : ResultsConsumer { ) : ResultsConsumer {
override fun targetConsumed(target: CommonizerTarget) { override fun targetConsumed(parameters: CommonizerParameters, target: CommonizerTarget) {
logger.log("Written libraries for ${outputCommonizerTarget.prettyName(target)}") parameters.logger?.progress("Written libraries for ${outputCommonizerTarget.prettyName(target)}")
} }
} }
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.commonizer.konan package org.jetbrains.kotlin.commonizer.konan
import org.jetbrains.kotlin.commonizer.CommonizerOutputLayout import org.jetbrains.kotlin.commonizer.CommonizerOutputLayout
import org.jetbrains.kotlin.commonizer.CommonizerParameters
import org.jetbrains.kotlin.commonizer.CommonizerTarget import org.jetbrains.kotlin.commonizer.CommonizerTarget
import org.jetbrains.kotlin.commonizer.ResultsConsumer import org.jetbrains.kotlin.commonizer.ResultsConsumer
import org.jetbrains.kotlin.library.SerializedMetadata import org.jetbrains.kotlin.library.SerializedMetadata
@@ -19,7 +20,7 @@ internal class ModuleSerializer(
private val destination: File, private val destination: File,
private val outputLayout: CommonizerOutputLayout, private val outputLayout: CommonizerOutputLayout,
) : ResultsConsumer { ) : ResultsConsumer {
override fun consume(target: CommonizerTarget, moduleResult: ResultsConsumer.ModuleResult) { override fun consume(parameters: CommonizerParameters, target: CommonizerTarget, moduleResult: ResultsConsumer.ModuleResult) {
val librariesDestination = outputLayout.getTargetDirectory(destination, target) val librariesDestination = outputLayout.getTargetDirectory(destination, target)
when (moduleResult) { when (moduleResult) {
is ResultsConsumer.ModuleResult.Commonized -> { is ResultsConsumer.ModuleResult.Commonized -> {
@@ -5,28 +5,26 @@
package org.jetbrains.kotlin.commonizer.utils package org.jetbrains.kotlin.commonizer.utils
import org.jetbrains.kotlin.commonizer.cli.CliLoggerAdapter
import org.jetbrains.kotlin.util.Logger import org.jetbrains.kotlin.util.Logger
class ProgressLogger( class ProgressLogger(
private val wrapped: Logger, private val wrapped: Logger = CliLoggerAdapter(0),
startImmediately: Boolean = false private val indent: Int = 0,
) : Logger by wrapped { ) : Logger by wrapped {
private val clockMark = ResettableClockMark() private val clockMark = ResettableClockMark()
private var finished = true private var finished = false
private val prefix = " ".repeat(indent) + " * "
init { init {
if (startImmediately)
reset()
}
fun reset() {
clockMark.reset() clockMark.reset()
finished = false require(indent >= 0) { "Required indent >= 1" }
} }
override fun log(message: String) { fun progress(message: String) {
check(!finished) check(!finished)
wrapped.log("* $message in ${clockMark.elapsedSinceLast()}") wrapped.log("$prefix$message in ${clockMark.elapsedSinceLast()}")
} }
fun logTotal() { fun logTotal() {
@@ -34,4 +32,8 @@ class ProgressLogger(
wrapped.log("TOTAL: ${clockMark.elapsedSinceStart()}") wrapped.log("TOTAL: ${clockMark.elapsedSinceStart()}")
finished = true finished = true
} }
fun fork(): ProgressLogger {
return ProgressLogger(this, indent + 1)
}
} }
@@ -146,7 +146,7 @@ internal class MockResultsConsumer : ResultsConsumer {
lateinit var status: ResultsConsumer.Status lateinit var status: ResultsConsumer.Status
override fun consume(target: CommonizerTarget, moduleResult: ModuleResult) { override fun consume(parameters: CommonizerParameters, target: CommonizerTarget, moduleResult: ModuleResult) {
check(!this::status.isInitialized) check(!this::status.isInitialized)
check(target !in finishedTargets) { "$target already finished" } check(target !in finishedTargets) { "$target already finished" }
val moduleResults: ModuleResults = _modulesByTargets.getOrPut(target) { ModuleResults() } val moduleResults: ModuleResults = _modulesByTargets.getOrPut(target) { ModuleResults() }
@@ -154,13 +154,13 @@ internal class MockResultsConsumer : ResultsConsumer {
check(oldResult == null) // to avoid accidental overwriting check(oldResult == null) // to avoid accidental overwriting
} }
override fun targetConsumed(target: CommonizerTarget) { override fun targetConsumed(parameters: CommonizerParameters, target: CommonizerTarget) {
check(!this::status.isInitialized) check(!this::status.isInitialized)
check(target !in finishedTargets) check(target !in finishedTargets)
finishedTargets += target finishedTargets += target
} }
override fun allConsumed(status: ResultsConsumer.Status) { override fun allConsumed(parameters: CommonizerParameters, status: ResultsConsumer.Status) {
check(!this::status.isInitialized) check(!this::status.isInitialized)
check(finishedTargets.containsAll(_modulesByTargets.keys)) check(finishedTargets.containsAll(_modulesByTargets.keys))
this.status = status this.status = status