@@ -38,22 +38,34 @@ private val androidPluginIds = listOf(
38
38
" com.android.library"
39
39
)
40
40
41
- internal fun Project.configureComposeResources () {
42
- val projectId = provider {
43
- val groupName = project.group.toString().lowercase().asUnderscoredIdentifier()
44
- val moduleName = project.name.lowercase().asUnderscoredIdentifier()
45
- if (groupName.isNotEmpty()) " $groupName .$moduleName "
46
- else moduleName
41
+ internal fun Project.configureComposeResources (config : ResourcesExtension ) {
42
+ val resourcePackage = provider {
43
+ config.packageOfResClass.takeIf { it.isNotEmpty() } ? : run {
44
+ val groupName = project.group.toString().lowercase().asUnderscoredIdentifier()
45
+ val moduleName = project.name.lowercase().asUnderscoredIdentifier()
46
+ val id = if (groupName.isNotEmpty()) " $groupName .$moduleName " else moduleName
47
+ " $id .generated.resources"
48
+ }
47
49
}
48
50
51
+ val publicResClass = provider { config.publicResClass }
52
+
53
+ val generateResClassMode = provider { config.generateResClass }
54
+
49
55
plugins.withId(KOTLIN_MPP_PLUGIN_ID ) {
50
56
val kotlinExtension = project.extensions.getByType(KotlinMultiplatformExtension ::class .java)
51
57
52
58
val hasKmpResources = extraProperties.has(KMP_RES_EXT )
53
59
val currentGradleVersion = GradleVersion .current()
54
60
val minGradleVersion = GradleVersion .version(MIN_GRADLE_VERSION_FOR_KMP_RESOURCES )
55
61
if (hasKmpResources && currentGradleVersion >= minGradleVersion) {
56
- configureKmpResources(kotlinExtension, extraProperties.get(KMP_RES_EXT )!! , projectId)
62
+ configureKmpResources(
63
+ kotlinExtension,
64
+ extraProperties.get(KMP_RES_EXT )!! ,
65
+ resourcePackage,
66
+ publicResClass,
67
+ generateResClassMode
68
+ )
57
69
} else {
58
70
if (! hasKmpResources) {
59
71
logger.info(
@@ -73,7 +85,13 @@ internal fun Project.configureComposeResources() {
73
85
}
74
86
75
87
// current KGP doesn't have KPM resources
76
- configureComposeResources(kotlinExtension, KotlinSourceSet .COMMON_MAIN_SOURCE_SET_NAME , projectId)
88
+ configureComposeResources(
89
+ kotlinExtension,
90
+ KotlinSourceSet .COMMON_MAIN_SOURCE_SET_NAME ,
91
+ resourcePackage,
92
+ publicResClass,
93
+ generateResClassMode
94
+ )
77
95
78
96
// when applied AGP then configure android resources
79
97
androidPluginIds.forEach { pluginId ->
@@ -86,14 +104,22 @@ internal fun Project.configureComposeResources() {
86
104
}
87
105
plugins.withId(KOTLIN_JVM_PLUGIN_ID ) {
88
106
val kotlinExtension = project.extensions.getByType(KotlinProjectExtension ::class .java)
89
- configureComposeResources(kotlinExtension, SourceSet .MAIN_SOURCE_SET_NAME , projectId)
107
+ configureComposeResources(
108
+ kotlinExtension,
109
+ SourceSet .MAIN_SOURCE_SET_NAME ,
110
+ resourcePackage,
111
+ publicResClass,
112
+ generateResClassMode
113
+ )
90
114
}
91
115
}
92
116
93
117
private fun Project.configureComposeResources (
94
118
kotlinExtension : KotlinProjectExtension ,
95
119
commonSourceSetName : String ,
96
- projectId : Provider <String >
120
+ resourcePackage : Provider <String >,
121
+ publicResClass : Provider <Boolean >,
122
+ generateResClassMode : Provider <ResourcesExtension .ResourceClassGeneration >
97
123
) {
98
124
logger.info(" Configure compose resources" )
99
125
kotlinExtension.sourceSets.all { sourceSet ->
@@ -105,7 +131,14 @@ private fun Project.configureComposeResources(
105
131
sourceSet.resources.srcDirs(composeResourcesPath)
106
132
107
133
if (sourceSetName == commonSourceSetName) {
108
- configureResourceGenerator(composeResourcesPath, sourceSet, projectId, false )
134
+ configureResourceGenerator(
135
+ composeResourcesPath,
136
+ sourceSet,
137
+ resourcePackage,
138
+ publicResClass,
139
+ generateResClassMode,
140
+ false
141
+ )
109
142
}
110
143
}
111
144
}
@@ -114,7 +147,9 @@ private fun Project.configureComposeResources(
114
147
private fun Project.configureKmpResources (
115
148
kotlinExtension : KotlinProjectExtension ,
116
149
kmpResources : Any ,
117
- projectId : Provider <String >
150
+ resourcePackage : Provider <String >,
151
+ publicResClass : Provider <Boolean >,
152
+ generateResClassMode : Provider <ResourcesExtension .ResourceClassGeneration >
118
153
) {
119
154
kotlinExtension as KotlinMultiplatformExtension
120
155
kmpResources as KotlinTargetResourcesPublication
@@ -136,7 +171,7 @@ private fun Project.configureKmpResources(
136
171
if (target is KotlinAndroidTarget ) listOf (" **/font*/*" ) else emptyList()
137
172
)
138
173
},
139
- projectId .asModuleDir()
174
+ resourcePackage .asModuleDir()
140
175
)
141
176
142
177
if (target is KotlinAndroidTarget ) {
@@ -151,7 +186,7 @@ private fun Project.configureKmpResources(
151
186
emptyList()
152
187
)
153
188
},
154
- projectId .asModuleDir()
189
+ resourcePackage .asModuleDir()
155
190
)
156
191
}
157
192
}
@@ -161,7 +196,14 @@ private fun Project.configureKmpResources(
161
196
val sourceSetName = sourceSet.name
162
197
if (sourceSetName == KotlinSourceSet .COMMON_MAIN_SOURCE_SET_NAME ) {
163
198
val composeResourcesPath = project.projectDir.resolve(" src/$sourceSetName /$COMPOSE_RESOURCES_DIR " )
164
- configureResourceGenerator(composeResourcesPath, sourceSet, projectId, true )
199
+ configureResourceGenerator(
200
+ composeResourcesPath,
201
+ sourceSet,
202
+ resourcePackage,
203
+ publicResClass,
204
+ generateResClassMode,
205
+ true
206
+ )
165
207
}
166
208
}
167
209
@@ -251,27 +293,35 @@ private fun Project.configureAndroidComposeResources(
251
293
private fun Project.configureResourceGenerator (
252
294
commonComposeResourcesDir : File ,
253
295
commonSourceSet : KotlinSourceSet ,
254
- projectId : Provider <String >,
296
+ resourcePackage : Provider <String >,
297
+ publicResClass : Provider <Boolean >,
298
+ generateResClassMode : Provider <ResourcesExtension .ResourceClassGeneration >,
255
299
generateModulePath : Boolean
256
300
) {
257
- val packageName = projectId.map { " $it .generated.resources" }
258
-
259
301
logger.info(" Configure accessors for '${commonSourceSet.name} '" )
260
302
261
303
fun buildDir (path : String ) = layout.dir(layout.buildDirectory.map { File (it.asFile, path) })
262
304
263
305
// lazy check a dependency on the Resources library
264
- val shouldGenerateResClass: Provider <Boolean > = provider {
265
- if (ComposeProperties .alwaysGenerateResourceAccessors(project).get()) {
266
- true
267
- } else {
268
- configurations.run {
269
- // because the implementation configuration doesn't extend the api in the KGP ¯\_(ツ)_/¯
270
- getByName(commonSourceSet.implementationConfigurationName).allDependencies +
271
- getByName(commonSourceSet.apiConfigurationName).allDependencies
272
- }.any { dep ->
273
- val depStringNotation = dep.let { " ${it.group} :${it.name} :${it.version} " }
274
- depStringNotation == ComposePlugin .CommonComponentsDependencies .resources
306
+ val shouldGenerateResClass = generateResClassMode.map { mode ->
307
+ when (mode) {
308
+ ResourcesExtension .ResourceClassGeneration .Auto -> {
309
+ // todo remove the gradle property when the gradle plugin will be published
310
+ if (ComposeProperties .alwaysGenerateResourceAccessors(project).get()) {
311
+ true
312
+ } else {
313
+ configurations.run {
314
+ // because the implementation configuration doesn't extend the api in the KGP ¯\_(ツ)_/¯
315
+ getByName(commonSourceSet.implementationConfigurationName).allDependencies +
316
+ getByName(commonSourceSet.apiConfigurationName).allDependencies
317
+ }.any { dep ->
318
+ val depStringNotation = dep.let { " ${it.group} :${it.name} :${it.version} " }
319
+ depStringNotation == ComposePlugin .CommonComponentsDependencies .resources
320
+ }
321
+ }
322
+ }
323
+ ResourcesExtension .ResourceClassGeneration .Always -> {
324
+ true
275
325
}
276
326
}
277
327
}
@@ -280,13 +330,14 @@ private fun Project.configureResourceGenerator(
280
330
" generateComposeResClass" ,
281
331
GenerateResClassTask ::class .java
282
332
) { task ->
283
- task.packageName.set(packageName )
333
+ task.packageName.set(resourcePackage )
284
334
task.shouldGenerateResClass.set(shouldGenerateResClass)
335
+ task.makeResClassPublic.set(publicResClass)
285
336
task.resDir.set(commonComposeResourcesDir)
286
337
task.codeDir.set(buildDir(" $RES_GEN_DIR /kotlin" ))
287
338
288
339
if (generateModulePath) {
289
- task.moduleDir.set(projectId .asModuleDir())
340
+ task.moduleDir.set(resourcePackage .asModuleDir())
290
341
}
291
342
}
292
343
0 commit comments