Skip to content

Commit 7380c2c

Browse files
authored
Fixed broken Provider values (#347)
1 parent baedda3 commit 7380c2c

4 files changed

Lines changed: 36 additions & 17 deletions

File tree

demo-project/kmp/build.gradle.kts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,14 @@ dependencies {
3838
commonTestImplementation(libs.kotlin.test)
3939
}
4040

41+
val lazyProvidedValue = objects.property<String>()
42+
43+
gradle.projectsEvaluated {
44+
lazyProvidedValue.set("aLazyProvidedValue")
45+
}
46+
4147
buildConfig {
42-
buildConfigField("COMMON_VALUE", expect("aCommonValue")) // a constant for all platforms
48+
buildConfigField("COMMON_VALUE", expect("aCommonValue")) // a constant for all platforms
4349
buildConfigField("PLATFORM", expect<String>()) // expect a platform specific value
4450
buildConfigField("DEBUG", expect(false)) // expect with a default
4551
buildConfigField("com.eygraber.uri.Uri", "ENDPOINT",
@@ -67,6 +73,7 @@ buildConfig {
6773

6874
sourceSets.named("test") {
6975
buildConfigField("TEST_VALUE", "aTestValue")
76+
buildConfigField("PROVIDED_VALUE", lazyProvidedValue)
7077
}
7178

7279
sourceSets.named("jvmMain") {

demo-project/kmp/src/commonTest/kotlin/com/github/gmazzo/buildconfig/demos/kmp/CommonBuildConfigTest.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,10 @@ abstract class CommonBuildConfigTest(
3232
assertEquals(expectedMobile, Single.IS_MOBILE)
3333
}
3434

35+
@Test
36+
fun testTestProperties() {
37+
assertEquals("aTestValue", TestBuildConfig.TEST_VALUE)
38+
assertEquals("aLazyProvidedValue", TestBuildConfig.PROVIDED_VALUE)
39+
}
40+
3541
}

plugin/src/main/kotlin/com/github/gmazzo/buildconfig/BuildConfigField.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.github.gmazzo.buildconfig
22

3+
import com.github.gmazzo.buildconfig.generators.BuildConfigKotlinGenerator
34
import com.github.gmazzo.buildconfig.internal.nameOf
45
import java.io.Serializable
56
import java.lang.reflect.Type
@@ -21,7 +22,6 @@ public interface BuildConfigField : Named, Comparable<BuildConfigField> {
2122
public val type: Property<BuildConfigType>
2223

2324
@get:Input
24-
@get:Optional
2525
public val value: Property<BuildConfigValue>
2626

2727
@get:Input
@@ -59,6 +59,9 @@ public interface BuildConfigField : Named, Comparable<BuildConfigField> {
5959
public fun value(literal: Serializable?): BuildConfigField = apply {
6060
value.value(
6161
when (literal) {
62+
is BuildConfigValue.Expect -> literal.also {
63+
tags.add(BuildConfigKotlinGenerator.TagExpect)
64+
}
6265
is BuildConfigValue -> literal
6366
else -> BuildConfigValue.Literal(literal)
6467
}

plugin/src/main/kotlin/com/github/gmazzo/buildconfig/internal/bindings/KotlinBinder.kt

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.github.gmazzo.buildconfig.internal.bindings
22

33
import com.github.gmazzo.buildconfig.BuildConfigClassSpec
4-
import com.github.gmazzo.buildconfig.BuildConfigValue
4+
import com.github.gmazzo.buildconfig.BuildConfigField
55
import com.github.gmazzo.buildconfig.generators.BuildConfigKotlinGenerator
66
import com.github.gmazzo.buildconfig.internal.BuildConfigExtensionInternal
77
import com.github.gmazzo.buildconfig.internal.bindings.JavaBinder.registerExtension
@@ -142,23 +142,16 @@ internal object KotlinBinder {
142142
fillMissingActuals(specsOfTargets)
143143
}
144144

145-
private fun BuildConfigClassSpec.hasExpects() =
146-
buildConfigFields.any { it.value.orNull is BuildConfigValue.Expect }
147-
148-
private fun BuildConfigClassSpec.hasActuals() =
149-
buildConfigFields.any { it.tags.get().contains(BuildConfigKotlinGenerator.TagActual) }
150-
151145
private fun lookForExpectFields(spec: BuildConfigClassSpec, dependsOnSpecs: Set<BuildConfigClassSpec>) {
152146
val expectSpecs = linkedSetOf<BuildConfigClassSpec>()
153147
for (field in spec.buildConfigFields) {
154148
for (dependsOnSpec in dependsOnSpecs) {
155149
val dependsOnField = dependsOnSpec.buildConfigFields.findByName(field.name) ?: continue
156150

157-
check(dependsOnField.value.orNull is BuildConfigValue.Expect) {
151+
check(dependsOnField.isExpect) {
158152
"Field '${dependsOnField.name}' in '$dependsOnSpec' must be `expect`, since it's defined as `actual` in '$spec'"
159153
}
160154

161-
dependsOnField.tags.add(BuildConfigKotlinGenerator.TagExpect)
162155
field.tags.add(BuildConfigKotlinGenerator.TagActual)
163156
expectSpecs.add(dependsOnSpec)
164157

@@ -170,9 +163,7 @@ internal object KotlinBinder {
170163
// then, in case we have mixed expect and regular constants in the same spec, we promote them all to this spec
171164
for (expectSpec in expectSpecs) {
172165
for (expectField in expectSpec.buildConfigFields) {
173-
expectField.tags.add(BuildConfigKotlinGenerator.TagExpect)
174-
175-
if (expectField.value.orNull.isExpectNoDefault) continue
166+
if (expectField.isExpectNoDefault) continue
176167
if (spec.buildConfigFields.names.contains(expectField.name)) continue
177168

178169
spec.buildConfigField(expectField).tags.add(BuildConfigKotlinGenerator.TagActual)
@@ -187,7 +178,7 @@ internal object KotlinBinder {
187178
for (expectSpec in dependsOnSpecs) {
188179
for (expectField in expectSpec.buildConfigFields) {
189180
if (spec.buildConfigFields.names.contains(expectField.name)) continue
190-
if (expectField.value.orNull.isExpectNoDefault) continue
181+
if (expectField.isExpectNoDefault) continue
191182

192183
spec.buildConfigField(expectField)
193184
.tags.add(BuildConfigKotlinGenerator.TagActual)
@@ -199,8 +190,20 @@ internal object KotlinBinder {
199190
}
200191
}
201192

202-
private val BuildConfigValue?.isExpectNoDefault: Boolean
203-
get() = this is BuildConfigValue.Expect && value == null
193+
private fun BuildConfigClassSpec.hasExpects() =
194+
buildConfigFields.any { it.isExpect }
195+
196+
private fun BuildConfigClassSpec.hasActuals() =
197+
buildConfigFields.any { it.isActual }
198+
199+
private val BuildConfigField.isExpect: Boolean
200+
get() = BuildConfigKotlinGenerator.TagExpect in tags.get()
201+
202+
private val BuildConfigField.isExpectNoDefault: Boolean
203+
get() = isExpect && value.get().value == null
204+
205+
private val BuildConfigField.isActual: Boolean
206+
get() = BuildConfigKotlinGenerator.TagActual in tags.get()
204207

205208
}
206209

0 commit comments

Comments
 (0)