Add verbose mode to build reports

#KT-12700

Verbose mode can be enabled by adding `kotlin.build.report.verbose=true`
to `gradle.properties` file.
This commit is contained in:
Alexey Tsvetkov
2019-02-05 23:49:10 +03:00
parent 01c23510c7
commit dbdc7a5b07
24 changed files with 320 additions and 155 deletions
@@ -39,7 +39,8 @@ internal class GradleCompilationResults(
log.kotlinDebug { "compiler exit code: $exitCode" }
}
}
CompilationResultCategory.IC_LOG.code -> {
CompilationResultCategory.BUILD_REPORT_LINES.code,
CompilationResultCategory.VERBOSE_BUILD_REPORT_LINES.code -> {
@Suppress("UNCHECKED_CAST")
icLogLines = value as? List<String>
}
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.compilerRunner
import org.gradle.api.file.FileCollection
import org.jetbrains.kotlin.config.Services
import org.jetbrains.kotlin.gradle.logging.GradlePrintingMessageCollector
import org.jetbrains.kotlin.gradle.report.BuildReportMode
import org.jetbrains.kotlin.gradle.tasks.findToolsJar
import java.io.File
@@ -16,7 +17,7 @@ internal class GradleCompilerEnvironment(
messageCollector: GradlePrintingMessageCollector,
outputItemsCollector: OutputItemsCollector,
val outputFiles: FileCollection,
val reportExecutionResult: Boolean,
val buildReportMode: BuildReportMode?,
val incrementalCompilationEnvironment: IncrementalCompilationEnvironment? = null
) : CompilerEnvironment(Services.EMPTY, messageCollector, outputItemsCollector) {
val toolsJar: File? by lazy { findToolsJar() }
@@ -142,7 +142,7 @@ internal open class GradleCompilerRunner(protected val task: Task) {
buildFile = buildFile,
outputFiles = environment.outputFiles.toList(),
taskPath = task.path,
reportExecutionResult = environment.reportExecutionResult
buildReportMode = environment.buildReportMode
)
TaskLoggers.put(task.path, task.logger)
runCompilerAsync(workArgs)
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.daemon.common.*
import org.jetbrains.kotlin.gradle.logging.*
import org.jetbrains.kotlin.gradle.plugin.internal.state.TaskExecutionResults
import org.jetbrains.kotlin.gradle.plugin.internal.state.TaskLoggers
import org.jetbrains.kotlin.gradle.report.BuildReportMode
import org.jetbrains.kotlin.gradle.report.TaskExecutionResult
import org.jetbrains.kotlin.gradle.tasks.throwGradleExceptionIfError
import org.jetbrains.kotlin.gradle.utils.stackTraceAsString
@@ -54,7 +55,7 @@ internal class GradleKotlinCompilerWorkArguments(
val buildFile: File?,
val outputFiles: List<File>,
val taskPath: String,
val reportExecutionResult: Boolean
val buildReportMode: BuildReportMode?
) : Serializable {
companion object {
const val serialVersionUID: Long = 0
@@ -92,7 +93,7 @@ internal class GradleKotlinCompilerWork @Inject constructor(
private val buildFile = config.buildFile
private val outputFiles = config.outputFiles
private val taskPath = config.taskPath
private val reportExecutionResult = config.reportExecutionResult
private val buildReportMode = config.buildReportMode
private val log: KotlinLogger =
TaskLoggers.get(taskPath)?.let { GradleKotlinLogger(it).apply { debug("Using '$taskPath' logger") } }
@@ -253,9 +254,11 @@ internal class GradleKotlinCompilerWork @Inject constructor(
val knownChangedFiles = icEnv.changedFiles as? ChangedFiles.Known
val requestedCompilationResults = EnumSet.of(CompilationResultCategory.IC_COMPILE_ITERATION)
if (reportExecutionResult) {
requestedCompilationResults.add(CompilationResultCategory.IC_LOG)
}
when (buildReportMode) {
BuildReportMode.SIMPLE -> CompilationResultCategory.BUILD_REPORT_LINES
BuildReportMode.VERBOSE -> CompilationResultCategory.VERBOSE_BUILD_REPORT_LINES
null -> null
}?.let { requestedCompilationResults.add(it) }
val compilationOptions = IncrementalCompilationOptions(
areFileChangesKnown = knownChangedFiles != null,
@@ -366,7 +369,7 @@ internal class GradleKotlinCompilerWork @Inject constructor(
}
private inline fun reportExecutionResultIfNeeded(fn: () -> TaskExecutionResult) {
if (reportExecutionResult) {
if (buildReportMode != null) {
val result = fn()
TaskExecutionResults[taskPath] = result
}
@@ -64,7 +64,7 @@ open class KaptWithKotlincTask : KaptTask(), CompilerArgumentAwareWithInput<K2JV
val outputItemCollector = OutputItemsCollectorImpl()
val environment = GradleCompilerEnvironment(
compilerClasspath, messageCollector, outputItemCollector,
reportExecutionResult = kotlinCompileTask.reportExecutionResult,
buildReportMode = kotlinCompileTask.buildReportMode,
outputFiles = allOutputFiles()
)
if (environment.toolsJar == null && !isAtLeastJava9) {
@@ -59,6 +59,9 @@ internal class PropertiesProvider(private val project: Project) {
val buildReportEnabled: Boolean
get() = booleanProperty("kotlin.build.report.enable") ?: false
val buildReportVerbose: Boolean
get() = booleanProperty("kotlin.build.report.verbose") ?: false
val buildReportDir: File?
get() = property("kotlin.build.report.dir")?.let { File(it) }
@@ -0,0 +1,11 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
* that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.gradle.report
enum class BuildReportMode {
SIMPLE,
VERBOSE
}
@@ -43,10 +43,12 @@ internal fun configureBuildReporter(gradle: Gradle, log: Logger) {
val reporter = KotlinBuildReporter(perfReportFile)
gradle.addBuildListener(reporter)
val buildReportMode = if (properties.buildReportVerbose) BuildReportMode.VERBOSE else BuildReportMode.SIMPLE
gradle.taskGraph.whenReady { graph ->
graph.allTasks.asSequence()
.filterIsInstance<AbstractKotlinCompile<*>>()
.forEach { it.reportExecutionResult = true }
.forEach { it.buildReportMode = buildReportMode }
}
log.kotlinDebug { "Configured Kotlin build reporter" }
@@ -71,7 +71,7 @@ open class KotlinCompileCommon : AbstractKotlinCompile<K2MetadataCompilerArgumen
val compilerRunner = compilerRunner()
val environment = GradleCompilerEnvironment(
computedCompilerClasspath, messageCollector, outputItemCollector,
reportExecutionResult = reportExecutionResult,
buildReportMode = buildReportMode,
outputFiles = allOutputFiles()
)
compilerRunner.runMetadataCompilerAsync(sourceRoots.kotlinSourceFiles, args, environment)
@@ -30,6 +30,7 @@ import org.jetbrains.kotlin.gradle.internal.tasks.TaskWithLocalState
import org.jetbrains.kotlin.gradle.internal.tasks.allOutputFiles
import org.jetbrains.kotlin.gradle.logging.*
import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.report.BuildReportMode
import org.jetbrains.kotlin.gradle.utils.*
import org.jetbrains.kotlin.incremental.ChangedFiles
import org.jetbrains.kotlin.incremental.classpathAsList
@@ -133,7 +134,7 @@ abstract class AbstractKotlinCompile<T : CommonCompilerArguments>() : AbstractKo
}
@get:Internal
var reportExecutionResult: Boolean = false
internal var buildReportMode: BuildReportMode? = null
@get:Internal
internal val buildHistoryFile: File
@@ -439,7 +440,7 @@ open class KotlinCompile : AbstractKotlinCompile<K2JVMCompilerArguments>(), Kotl
val environment = GradleCompilerEnvironment(
computedCompilerClasspath, messageCollector, outputItemCollector,
outputFiles = allOutputFiles(),
reportExecutionResult = reportExecutionResult,
buildReportMode = buildReportMode,
incrementalCompilationEnvironment = icEnv
)
compilerRunner.runJvmCompilerAsync(
@@ -597,7 +598,7 @@ open class Kotlin2JsCompile : AbstractKotlinCompile<K2JSCompilerArguments>(), Ko
val environment = GradleCompilerEnvironment(
computedCompilerClasspath, messageCollector, outputItemCollector,
outputFiles = allOutputFiles(),
reportExecutionResult = reportExecutionResult,
buildReportMode = buildReportMode,
incrementalCompilationEnvironment = icEnv
)
compilerRunner.runJsCompilerAsync(sourceRoots.kotlinSourceFiles, commonSourceSet.toList(), args, environment)