Skip to content

Commit b8b237f

Browse files
committed
Enhance: Bind extension to product flavor for robust type safety
This commit refactors flavor configuration in NiaFlavor.kt. The previous implementation relied on runtime type checks for ApplicationExtension and ApplicationProductFlavor, whereas the updated code leverages generics to explicitly bind the extension (E) to the product flavor (F). This change eliminates unnecessary runtime checks and enhances compile-time type safety. Additionally, the introduction of @JvmName(“configureFlavorsImpl”) resolves JVM signature clashes, streamlining our DSL and improving overall code clarity.
1 parent 25d80b4 commit b8b237f

File tree

1 file changed

+17
-9
lines changed
  • build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid

1 file changed

+17
-9
lines changed

build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/NiaFlavor.kt

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.google.samples.apps.nowinandroid
22

33
import com.android.build.api.dsl.ApplicationExtension
4-
import com.android.build.api.dsl.ApplicationProductFlavor
54
import com.android.build.api.dsl.CommonExtension
65
import com.android.build.api.dsl.ProductFlavor
76

@@ -19,11 +18,25 @@ enum class NiaFlavor(val dimension: FlavorDimension, val applicationIdSuffix: St
1918
prod(FlavorDimension.contentType),
2019
}
2120

22-
fun configureFlavors(
23-
commonExtension: CommonExtension<*, *, *, *, *, *>,
21+
fun <E : CommonExtension<*, *, *, F, *, *>, F : ProductFlavor> configureFlavors(
22+
commonExtension: E,
2423
flavorConfigurationBlock: ProductFlavor.(flavor: NiaFlavor) -> Unit = {},
2524
) {
26-
commonExtension.apply {
25+
when (commonExtension) {
26+
is ApplicationExtension -> commonExtension.configureFlavors { nia ->
27+
flavorConfigurationBlock(this, nia)
28+
this.applicationIdSuffix = nia.applicationIdSuffix
29+
}
30+
31+
else -> commonExtension.configureFlavors(flavorConfigurationBlock)
32+
}
33+
}
34+
35+
@JvmName("configureFlavorsImpl")
36+
private inline fun <E : CommonExtension<*, *, *, F, *, *>, F : ProductFlavor> E.configureFlavors(
37+
crossinline flavorConfigurationBlock: F.(flavor: NiaFlavor) -> Unit = {},
38+
) {
39+
apply {
2740
FlavorDimension.values().forEach { flavorDimension ->
2841
flavorDimensions += flavorDimension.name
2942
}
@@ -33,11 +46,6 @@ fun configureFlavors(
3346
register(niaFlavor.name) {
3447
dimension = niaFlavor.dimension.name
3548
flavorConfigurationBlock(this, niaFlavor)
36-
if (this@apply is ApplicationExtension && this is ApplicationProductFlavor) {
37-
if (niaFlavor.applicationIdSuffix != null) {
38-
applicationIdSuffix = niaFlavor.applicationIdSuffix
39-
}
40-
}
4149
}
4250
}
4351
}

0 commit comments

Comments
 (0)