All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.autonomousapps.tasks.ByteCodeSourceExploderTask.kt Maven / Gradle / Ivy

There is a newer version: 2.0.2
Show newest version
package com.autonomousapps.tasks

import com.autonomousapps.TASK_GROUP_DEP_INTERNAL
import com.autonomousapps.internal.ClassFilesParser
import com.autonomousapps.internal.utils.bufferWriteJsonSet
import com.autonomousapps.internal.utils.filterToClassFiles
import com.autonomousapps.internal.utils.getAndDelete
import org.gradle.api.DefaultTask
import org.gradle.api.file.ConfigurableFileCollection
import org.gradle.api.file.DirectoryProperty
import org.gradle.api.file.ProjectLayout
import org.gradle.api.file.RegularFileProperty
import org.gradle.api.tasks.*
import org.gradle.workers.WorkAction
import org.gradle.workers.WorkParameters
import org.gradle.workers.WorkerExecutor
import javax.inject.Inject

// TODO no need for this hierarchy anymore
abstract class ByteCodeSourceExploderTask : DefaultTask() {

  @get:OutputFile
  abstract val output: RegularFileProperty
}

@CacheableTask
abstract class ClassListExploderTask @Inject constructor(
  private val workerExecutor: WorkerExecutor,
  private val layout: ProjectLayout
) : ByteCodeSourceExploderTask() {

  init {
    group = TASK_GROUP_DEP_INTERNAL
    description = "Produces a report of all classes referenced by a given set of class files"
  }

  /** Class files generated by any JVM source (Java, Kotlin, Groovy, etc.). May be empty. */
  @get:Classpath
  @get:InputFiles
  abstract val classes: ConfigurableFileCollection

  /** Class files generated by Kotlin source. May be empty. Android-only. */
  @get:Classpath
  @get:InputFiles
  abstract val kotlinClasses: ConfigurableFileCollection

  /** Class files generated by Java source. May be empty. Android-only. */
  @get:Classpath
  @get:InputFiles
  abstract val javaClasses: ConfigurableFileCollection

  @TaskAction fun action() {
    workerExecutor.noIsolation().submit(ClassListExploderWorkAction::class.java) {
      classFiles.setFrom(
        classes.asFileTree
          .plus(javaClasses.asFileTree)
          .plus(kotlinClasses.asFileTree)
          .filterToClassFiles()
          .files
      )
      buildDir.set(layout.buildDirectory)
      output.set([email protected])
    }
  }

  interface ClassListExploderParameters : WorkParameters {
    val classFiles: ConfigurableFileCollection
    val buildDir: DirectoryProperty
    val output: RegularFileProperty
  }

  abstract class ClassListExploderWorkAction : WorkAction {

    override fun execute() {
      val output = parameters.output.getAndDelete()

      val usedClasses = ClassFilesParser(
        classes = parameters.classFiles.asFileTree.files,
        buildDir = parameters.buildDir.get().asFile
      ).analyze()

      output.bufferWriteJsonSet(usedClasses)
    }
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy