@@ -29,52 +29,105 @@ import dev.shreyaspatil.composeCompilerMetricsGenerator.core.ComposeCompilerRawR
2929import dev.shreyaspatil.composeCompilerMetricsGenerator.generator.HtmlReportGenerator
3030import dev.shreyaspatil.composeCompilerMetricsGenerator.generator.ReportSpec
3131import dev.shreyaspatil.composeCompilerMetricsGenerator.plugin.ComposeCompilerReportExtension
32+ import org.gradle.api.DefaultTask
3233import org.gradle.api.Project
33- import org.gradle.api.Task
34- import org.gradle.api.tasks.GradleBuild
34+ import org.gradle.api.provider.Property
35+ import org.gradle.api.tasks.Input
36+ import org.gradle.api.tasks.TaskAction
3537import org.gradle.api.tasks.TaskProvider
36- import org.gradle.configurationcache.extensions.capitalized
38+ import org.gradle.tooling.GradleConnector
3739import java.io.File
3840import java.io.FileNotFoundException
3941
4042const val KEY_ENABLE_REPORT_GEN = " dev.shreyaspatil.composeCompiler.reportGen.enable"
4143
42- fun Project.createComposeCompilerReportGenTaskForVariant (
43- variant : Variant ,
44- reportExtension : ComposeCompilerReportExtension
45- ): TaskProvider <GradleBuild > {
46- val taskName = variant.name + " ComposeCompilerHtmlReport"
47- return tasks.register(taskName, GradleBuild ::class .java) {
48- startParameter.projectProperties[KEY_ENABLE_REPORT_GEN ] = true .toString()
44+ abstract class ComposeCompilerReportGenerateTask : DefaultTask () {
45+ @get:Input
46+ abstract val compileKotlinTasks: Property <String >
4947
50- // All compilation tasks should be re-run. Because if any developer deletes report
51- // and again runs this task then compose metrics won't be generated by compiler again
52- startParameter.isRerunTasks = true
48+ private val reportExtension: ComposeCompilerReportExtension
49+ get() = ComposeCompilerReportExtension .get(project)
5350
54- tasks = listOf (" compile${variant.name.capitalized()} Kotlin" )
51+ @TaskAction
52+ fun generate () {
53+ val reportExt = reportExtension
54+ cleanupDirectory(reportExtension.outputPath.get())
5555
56- doFirst {
57- cleanupDirectory(reportExtension.outputPath.get())
58- }
56+ generateRawMetricsAndReport()
5957
60- doLast {
61- generateReport(reportExtension)
62- }
58+ generateReport(reportExt)
59+ }
6360
64- group = " compose compiler report"
65- description = " Generate Compose Compiler Metrics and Report"
61+ private fun generateRawMetricsAndReport () {
62+ GradleConnector .newConnector().forProjectDirectory(project.layout.projectDirectory.asFile)
63+ .connect()
64+ .use {
65+ it.newBuild()
66+ .setStandardOutput(System .out )
67+ .setStandardError(System .err)
68+ .setStandardInput(System .`in `)
69+ .forTasks(compileKotlinTasks.get())
70+ .withArguments(
71+ // Re-running is necessary. In case devs deleted raw files and if task uses cache
72+ // then this task will explode 💣
73+ " --rerun-tasks" ,
74+
75+ // Signal for enabling report generation in `kotlinOptions{}` block.
76+ " -P$KEY_ENABLE_REPORT_GEN =true"
77+ )
78+ .run ()
79+ }
6680 }
67- }
6881
69- fun cleanupDirectory (directory : String ) {
70- val dirFile = File (directory)
71- if (dirFile.exists()) {
72- if (! dirFile.isDirectory) {
73- throw FileNotFoundException (" '$directory ' is not a directory" )
82+ private fun generateReport (reportExtension : ComposeCompilerReportExtension ) {
83+ val outputDirectory = reportExtension.outputPath.get().let { File (it) }
84+
85+ // Create a report specification with application name
86+ val reportSpec = ReportSpec (reportExtension.name.get())
87+
88+ val rawReportProvider = ComposeCompilerRawReportProvider .FromDirectory (
89+ directory = reportExtension.composeRawMetricsOutputDirectory
90+ )
91+
92+ // Provide metric files to generator
93+ val htmlGenerator = HtmlReportGenerator (
94+ reportSpec = reportSpec,
95+ metricsProvider = ComposeCompilerMetricsProvider (rawReportProvider)
96+ )
97+
98+ // Generate HTML (as String)
99+ val html = htmlGenerator.generateHtml()
100+
101+ // Create a report file
102+ val file = outputDirectory.resolve(" index.html" )
103+ file.writeText(html)
104+
105+ val reportUrl = file.toURI().toURL().toExternalForm()
106+ logger.quiet(" Compose Compiler report is generated: $reportUrl " )
107+ }
108+
109+ private fun cleanupDirectory (directory : String ) {
110+ val dirFile = File (directory)
111+ if (dirFile.exists()) {
112+ if (! dirFile.isDirectory) {
113+ throw FileNotFoundException (" '$directory ' is not a directory" )
114+ }
74115 }
116+
117+ dirFile.deleteRecursively()
75118 }
119+ }
120+
121+ fun Project.registerComposeCompilerReportGenTaskForVariant (variant : Variant ): TaskProvider <ComposeCompilerReportGenerateTask > {
122+ val taskName = variant.name + " ComposeCompilerHtmlReport"
123+ val compileKotlinTaskName = compileKotlinTaskNameFromVariant(variant)
124+
125+ return tasks.register(taskName, ComposeCompilerReportGenerateTask ::class .java) {
126+ compileKotlinTasks.set(compileKotlinTaskName)
76127
77- dirFile.deleteRecursively()
128+ group = " compose compiler report"
129+ description = " Generate Compose Compiler Metrics and Report"
130+ }
78131}
79132
80133/* *
@@ -84,28 +137,10 @@ fun Project.executingComposeCompilerReportGenerationGradleTask() = runCatching {
84137 property(KEY_ENABLE_REPORT_GEN )
85138}.getOrNull() == " true"
86139
87- private fun Task.generateReport (reportExtension : ComposeCompilerReportExtension ) {
88- val outputDirectory = reportExtension.outputPath.get().let { File (it) }
89-
90- // Create a report specification with application name
91- val reportSpec = ReportSpec (reportExtension.name.get())
92-
93- val rawReportProvider = ComposeCompilerRawReportProvider .FromDirectory (
94- directory = reportExtension.composeRawMetricsOutputDirectory
95- )
96-
97- // Provide metric files to generator
98- val htmlGenerator = HtmlReportGenerator (
99- reportSpec = reportSpec,
100- metricsProvider = ComposeCompilerMetricsProvider (rawReportProvider)
101- )
102-
103- // Generate HTML (String)
104- val html = htmlGenerator.generateHtml()
105-
106- // Create a report file
107- val file = outputDirectory.resolve(" index.html" )
108- file.writeText(html)
109-
110- logger.quiet(" Compose Compiler report is generated: ${file.absolutePath} " )
140+ /* *
141+ * Returns a task name for compile<VARIANT>Kotlin with [variant]
142+ */
143+ fun compileKotlinTaskNameFromVariant (variant : Variant ): String {
144+ val variantName = variant.name.let { it[0 ].toUpperCase() + it.substring(1 ) }
145+ return " compile${variantName} Kotlin"
111146}
0 commit comments