@@ -20,6 +20,7 @@ import org.gradle.api.NamedDomainObjectContainer
2020import org.gradle.api.Project
2121import org.gradle.api.file.SourceDirectorySet
2222import org.gradle.api.plugins.JavaPluginExtension
23+ import org.gradle.api.tasks.TaskProvider
2324import org.jetbrains.kotlin.gradle.dsl.KotlinProjectExtension
2425import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
2526import java.nio.file.Path
@@ -37,34 +38,111 @@ class DaggerSourceSet(
3738 private val kotlinSourceSets : NamedDomainObjectContainer <KotlinSourceSet >,
3839 private val javaSourceSets : NamedDomainObjectContainer <JavaSourceSet >,
3940) {
41+ private val resourceCopyTask: TaskProvider <ResourceCopyTask > =
42+ project.tasks.register(" copyResources" , ResourceCopyTask ::class .java) {
43+ outputDirectory.set(project.layout.buildDirectory.dir(" generated/resources" ))
44+ }
45+
46+ init {
47+ listOf (resourceCopyTask.map { it.outputDirectory }).let {
48+ kotlinSourceSets.named(" main" ).configure { resources.setSrcDirs(it) }
49+ javaSourceSets.named(" main" ).configure { resources.setSrcDirs(it) }
50+ }
51+ }
52+
53+ /* *
54+ * The main source set whose based path is `<root>/java`
55+ */
4056 val main: SourceSet = object : SourceSet {
4157 override fun setPackages (packages : List <String >) {
4258 val packagePaths = packages.map { Path (it) }
43- kotlinSourceSets.getByName(" main" ).kotlin
44- .includePackages(" ${project.rootDir} /java" , packagePaths)
45- javaSourceSets.getByName(" main" ).java
46- .includePackages(" ${project.rootDir} /java" , packagePaths)
59+ kotlinSourceSets.named(" main" ).configure {
60+ kotlin.includePackages(" ${project.rootDir} /java" , packagePaths)
61+ }
62+ javaSourceSets.named(" main" ).configure {
63+ java.includePackages(" ${project.rootDir} /java" , packagePaths)
64+ }
65+ }
66+
67+ override fun setResources (resources : Map <String , String >) {
68+ resourceCopyTask.configure {
69+ val baseDir = project.rootProject.layout.projectDirectory.dir(" java" )
70+ resources.forEach { (resourceFilePath, jarDirectoryPath) ->
71+ val resource = baseDir.file(resourceFilePath)
72+ resourceSpecs.put(resource.asFile.path, jarDirectoryPath)
73+ inputFiles.add(resource)
74+ }
75+ }
4776 }
4877 }
78+
79+ /* *
80+ * The main source set whose based path is `<root>/javatests`
81+ */
4982 val test: SourceSet = object : SourceSet {
5083 override fun setPackages (packages : List <String >) {
5184 val packagePaths = packages.map { Path (it) }
52- kotlinSourceSets.getByName(" test" ).kotlin
53- .includePackages(" ${project.rootDir} /javatests" , packagePaths)
54- javaSourceSets.getByName(" test" ).java
55- .includePackages(" ${project.rootDir} /javatests" , packagePaths)
85+ kotlinSourceSets.named(" test" ).configure {
86+ kotlin.includePackages(" ${project.rootDir} /javatests" , packagePaths)
87+ }
88+ javaSourceSets.named(" test" ).configure {
89+ java.includePackages(" ${project.rootDir} /javatests" , packagePaths)
90+ }
91+ }
92+
93+ override fun setResources (resources : Map <String , String >) {
94+ throw UnsupportedOperationException (
95+ " Resources are only configurable for the 'main' source set."
96+ )
5697 }
5798 }
5899
59100 interface SourceSet {
101+ /* *
102+ * Sets the list of source packages that are part of the project's source set.
103+ *
104+ * Only sources directly in those packages are included and not in its subpackages.
105+ *
106+ * Example usage:
107+ * ```
108+ * daggerSources {
109+ * main.setPackages(
110+ * listOf(
111+ * "dagger",
112+ * "dagger/assisted",
113+ * "dagger/internal",
114+ * "dagger/multibindings",
115+ * )
116+ * )
117+ * }
118+ * ```
119+ * @see daggerSources
120+ */
60121 fun setPackages (packages : List <String >)
122+
123+ /* *
124+ * Sets the resource file paths and their corresponding artifact location.
125+ *
126+ * Example usage:
127+ * ```
128+ * daggerSources {
129+ * main.setResources(
130+ * mapOf("dagger/r8.pro" to "META-INF/com.android.tools/r8/")
131+ * )
132+ * }
133+ * ```
134+ * @see daggerSources
135+ */
136+ fun setResources (resources : Map <String , String >)
61137 }
62138}
63139
64140/* *
65141 * Configure project's source set based on Dagger's project structure.
66142 *
67- * Specifically it will include sources in the packages specified by [DaggerSourceSet.SourceSet.setPackages].
143+ * Specifically it will include sources in the packages specified by
144+ * [DaggerSourceSet.SourceSet.setPackages] and resources as specified by
145+ * [DaggerSourceSet.SourceSet.setResources].
68146 */
69147fun Project.daggerSources (block : DaggerSourceSet .() -> Unit ) {
70148 val kotlinExtension = extensions.findByType(KotlinProjectExtension ::class .java)
0 commit comments