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

com.autonomousapps.tasks.CreateVariantFiles.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.advice.VariantFile
import com.autonomousapps.internal.utils.getAndDelete
import com.autonomousapps.internal.utils.toJson
import org.gradle.api.DefaultTask
import org.gradle.api.file.ConfigurableFileCollection
import org.gradle.api.file.RegularFileProperty
import org.gradle.api.provider.MapProperty
import org.gradle.api.tasks.*
import java.io.File

abstract class CreateVariantFiles : DefaultTask() {

  init {
    group = TASK_GROUP_DEP
    description = "Generates the VariantFile objects needed for later analysis"
  }

  @get:OutputFile
  abstract val output: RegularFileProperty

  @TaskAction fun action() {
    val outputFile = output.getAndDelete()
    outputFile.writeText(variantFiles().toJson())
  }

  abstract fun variantFiles(): Set

  protected fun Set.toVariantFiles(name: String): Set {
    return asSequence().map { file ->
      project.relativePath(file)
    }.map { it.removePrefix("src/$name/") }
      // remove java/, kotlin/ and /res from start
      .map { it.substring(it.indexOf("/") + 1) }
      // remove file extension from end
      .mapNotNull {
        val index = it.lastIndexOf(".")
        if (index != -1) {
          it.substring(0, index)
        } else {
          // This could happen if the directory were empty, (eg `src/main/java/` with nothing in it)
          null
        }
      }
      .map { VariantFile(name, it) }
      .toSet()
  }
}

data class CollectionHolder(
  @get:PathSensitive(PathSensitivity.RELATIVE)
  @get:InputFiles
  val collection: ConfigurableFileCollection
)

@CacheableTask
abstract class AndroidCreateVariantFiles : CreateVariantFiles() {

  @get:Nested
  abstract val namedJavaDirs: MapProperty

  @get:Nested
  abstract val namedKotlinDirs: MapProperty

  @get:Nested
  abstract val namedXmlDirs: MapProperty

  override fun variantFiles(): Set {
    val javaVariantFiles: Set = namedJavaDirs.get()
      .flatMapTo(mutableSetOf()) { (name, holder) ->
        holder.collection.asFileTree.files.toVariantFiles(name)
      }
    val kotlinVariantFiles: Set = namedKotlinDirs.get()
      .flatMapTo(mutableSetOf()) { (name, holder) ->
        holder.collection.asFileTree.files.toVariantFiles(name)
      }
    val xmlVariantFiles: Set = namedXmlDirs.get()
      .flatMapTo(mutableSetOf()) { (name, holder) ->
        holder.collection.asFileTree.files.toVariantFiles(name)
      }

    return javaVariantFiles + kotlinVariantFiles + xmlVariantFiles
  }
}

@CacheableTask
abstract class JvmCreateVariantFiles : CreateVariantFiles() {

  @get:PathSensitive(PathSensitivity.RELATIVE)
  @get:InputFiles
  abstract val mainFiles: ConfigurableFileCollection

  @get:PathSensitive(PathSensitivity.RELATIVE)
  @get:Optional
  @get:InputFiles
  abstract val testFiles: ConfigurableFileCollection

  override fun variantFiles(): Set {
    val mainFiles = mainFiles.asFileTree.files.toVariantFiles("main")
    val testFiles = testFiles.asFileTree.files.toVariantFiles("test")

    return mainFiles + testFiles
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy