@@ -20,6 +20,7 @@ import org.gradle.api.NamedDomainObjectContainer
20
20
import org.gradle.api.Project
21
21
import org.gradle.api.file.SourceDirectorySet
22
22
import org.gradle.api.plugins.JavaPluginExtension
23
+ import org.gradle.api.tasks.TaskProvider
23
24
import org.jetbrains.kotlin.gradle.dsl.KotlinProjectExtension
24
25
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
25
26
import java.nio.file.Path
@@ -37,34 +38,111 @@ class DaggerSourceSet(
37
38
private val kotlinSourceSets : NamedDomainObjectContainer <KotlinSourceSet >,
38
39
private val javaSourceSets : NamedDomainObjectContainer <JavaSourceSet >,
39
40
) {
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
+ */
40
56
val main: SourceSet = object : SourceSet {
41
57
override fun setPackages (packages : List <String >) {
42
58
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
+ }
47
76
}
48
77
}
78
+
79
+ /* *
80
+ * The main source set whose based path is `<root>/javatests`
81
+ */
49
82
val test: SourceSet = object : SourceSet {
50
83
override fun setPackages (packages : List <String >) {
51
84
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
+ )
56
97
}
57
98
}
58
99
59
100
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
+ */
60
121
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 >)
61
137
}
62
138
}
63
139
64
140
/* *
65
141
* Configure project's source set based on Dagger's project structure.
66
142
*
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].
68
146
*/
69
147
fun Project.daggerSources (block : DaggerSourceSet .() -> Unit ) {
70
148
val kotlinExtension = extensions.findByType(KotlinProjectExtension ::class .java)
0 commit comments