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

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

There is a newer version: 2.0.2
Show newest version
@file:Suppress("UnstableApiUsage")

package com.autonomousapps.tasks

import com.autonomousapps.TASK_GROUP_DEP
import com.autonomousapps.internal.AbiExclusions
import com.autonomousapps.internal.kotlin.computeAbi
import com.autonomousapps.internal.utils.*
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.RegularFileProperty
import org.gradle.api.provider.Property
import org.gradle.api.tasks.*
import org.gradle.workers.WorkAction
import org.gradle.workers.WorkParameters
import org.gradle.workers.WorkerExecutor
import javax.inject.Inject

@CacheableTask
abstract class AbiAnalysisTask @Inject constructor(
  private val workerExecutor: WorkerExecutor
) : DefaultTask() {

  init {
    group = TASK_GROUP_DEP
    description = "Produces a report of the ABI of this project"
  }

  /** Mutually exclusive with [javaClasses] and [kotlinClasses]. */
  @get:Optional
  @get:Classpath
  abstract val jar: RegularFileProperty

  /** 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 Java source. Mutually exclusive with [jar]. */
  @get:Optional
  @get:Classpath
  @get:InputFiles
  abstract val javaClasses: ConfigurableFileCollection

  /** Class files generated by Kotlin source. Mutually exclusive with [jar]. */
  @get:Optional
  @get:Classpath
  @get:InputFiles
  abstract val kotlinClasses: ConfigurableFileCollection

  @get:Optional
  @get:Input
  abstract val exclusions: Property

  @get:OutputFile
  abstract val output: RegularFileProperty

  @get:OutputFile
  abstract val abiDump: RegularFileProperty

  @TaskAction
  fun action() {
    workerExecutor.noIsolation().submit(AbiAnalysisWorkAction::class.java) {
      jar.set([email protected])
      classFiles.setFrom(
        classes.asFileTree
          .plus(javaClasses.asFileTree)
          .plus(kotlinClasses.asFileTree)
          .filterToClassFiles()
          .files
      )
      exclusions.set([email protected])
      output.set([email protected])
      abiDump.set([email protected])
    }
  }

  interface AbiAnalysisParameters : WorkParameters {
    val jar: RegularFileProperty
    val classFiles: ConfigurableFileCollection
    val exclusions: Property
    val output: RegularFileProperty
    val abiDump: RegularFileProperty
  }

  abstract class AbiAnalysisWorkAction : WorkAction {

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

      val jarFile = parameters.jar.orNull?.asFile
      val classFiles = parameters.classFiles.files
      val exclusions = parameters.exclusions.orNull?.fromJson() ?: AbiExclusions.NONE

      val explodingAbi = if (jarFile != null) {
        computeAbi(jarFile, exclusions, outputAbiDump)
      } else {
        computeAbi(classFiles, exclusions, outputAbiDump)
      }

      output.bufferWriteJsonSet(explodingAbi)
    }
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy