Skip to content

Commit b22ac65

Browse files
authored
Revert "Relaxed expect requirement (#352)" (#355)
This reverts commit 4ad9831.
1 parent afcdf94 commit b22ac65

8 files changed

Lines changed: 33 additions & 17 deletions

File tree

demo-project/kmp/build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,7 @@ gradle.projectsEvaluated {
4545
}
4646

4747
buildConfig {
48-
buildConfigField("COMMON_VALUE", "aCommonValue") // a constant for all platforms
49-
buildConfigField("PROVIDED_VALUE", lazyProvidedValue) // a provided constant for all platforms
48+
buildConfigField("COMMON_VALUE", expect("aCommonValue")) // a constant for all platforms
5049
buildConfigField("PLATFORM", expect<String>()) // expect a platform specific value
5150
buildConfigField("DEBUG", expect(false)) // expect with a default
5251
buildConfigField("com.eygraber.uri.Uri", "ENDPOINT",
@@ -74,6 +73,7 @@ buildConfig {
7473

7574
sourceSets.named("test") {
7675
buildConfigField("TEST_VALUE", "aTestValue")
76+
buildConfigField("PROVIDED_VALUE", lazyProvidedValue)
7777
}
7878

7979
sourceSets.named("jvmMain") {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ abstract class CommonBuildConfigTest(
1919
assertEquals(expectedDebug, BuildConfig.DEBUG)
2020
assertEquals(expectedUri, BuildConfig.ENDPOINT)
2121
assertEquals(expectedProduct, BuildConfig.PRODUCT_VALUE)
22-
assertEquals("aLazyProvidedValue", BuildConfig.PROVIDED_VALUE)
2322
}
2423

2524
@Test
@@ -36,6 +35,7 @@ abstract class CommonBuildConfigTest(
3635
@Test
3736
fun testTestProperties() {
3837
assertEquals("aTestValue", TestBuildConfig.TEST_VALUE)
38+
assertEquals("aLazyProvidedValue", TestBuildConfig.PROVIDED_VALUE)
3939
}
4040

4141
}

plugin/api/plugin.api

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ public abstract interface class com/github/gmazzo/buildconfig/BuildConfigClassSp
77
public fun buildConfigField (Ljava/lang/String;Ljava/lang/String;Lorg/gradle/api/provider/Provider;)Lcom/github/gmazzo/buildconfig/BuildConfigField;
88
public fun buildConfigField (Ljava/lang/String;Lorg/gradle/api/Action;)Lcom/github/gmazzo/buildconfig/BuildConfigField;
99
public fun className (Ljava/lang/String;)Lcom/github/gmazzo/buildconfig/BuildConfigClassSpec;
10-
public fun expect ()Ljava/io/Serializable;
1110
public fun expect (Lcom/github/gmazzo/buildconfig/BuildConfigValue;)Lcom/github/gmazzo/buildconfig/BuildConfigValue$Expect;
1211
public fun expect (Ljava/io/Serializable;)Ljava/io/Serializable;
12+
public static synthetic fun expect$default (Lcom/github/gmazzo/buildconfig/BuildConfigClassSpec;Ljava/io/Serializable;ILjava/lang/Object;)Ljava/io/Serializable;
1313
public fun expression (Ljava/lang/String;)Lcom/github/gmazzo/buildconfig/BuildConfigValue$Expression;
1414
public fun generator (Lcom/github/gmazzo/buildconfig/generators/BuildConfigGenerator;)Lcom/github/gmazzo/buildconfig/BuildConfigClassSpec;
1515
public abstract fun getBuildConfigFields ()Lorg/gradle/api/NamedDomainObjectContainer;

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

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -160,11 +160,7 @@ public interface BuildConfigClassSpec : Named {
160160
BuildConfigValue.Expression(expression)
161161

162162
@Suppress("UNCHECKED_CAST")
163-
public fun <Type : Serializable?> expect(): Type =
164-
BuildConfigValue.Expect(value = null) as Type
165-
166-
@Suppress("UNCHECKED_CAST")
167-
public fun <Type : Serializable?> expect(defaultsTo: Type?): Type =
163+
public fun <Type : Serializable?> expect(defaultsTo: Type? = null): Type =
168164
expect(BuildConfigValue.Literal(defaultsTo)) as Type
169165

170166
public fun expect(defaultsTo: BuildConfigValue): BuildConfigValue.Expect =

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

Lines changed: 4 additions & 0 deletions
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
@@ -58,6 +59,9 @@ public interface BuildConfigField : Named, Comparable<BuildConfigField> {
5859
public fun value(literal: Serializable?): BuildConfigField = apply {
5960
value.value(
6061
when (literal) {
62+
is BuildConfigValue.Expect -> literal.also {
63+
tags.add(BuildConfigKotlinGenerator.TagExpect)
64+
}
6165
is BuildConfigValue -> literal
6266
else -> BuildConfigValue.Literal(literal)
6367
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ public class BuildConfigPlugin : Plugin<Project> {
157157
it.type.finalizeValueOnRead()
158158
it.value.finalizeValueOnRead()
159159
it.position.finalizeValueOnRead()
160-
// it.tags.finalizeValueOnRead() // tags can be modified later (e.g., to add expect/actual)
160+
it.tags.finalizeValueOnRead()
161161
}
162162

163163
/**

plugin/src/main/kotlin/com/github/gmazzo/buildconfig/generators/BuildConfigKotlinGenerator.kt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,11 +72,11 @@ public open class BuildConfigKotlinGenerator(
7272
.writeTo(spec.outputDir)
7373
}
7474

75-
private fun Iterable<BuildConfigField>.asPropertiesSpec() = mapNotNull { field ->
75+
private fun Iterable<BuildConfigField>.asPropertiesSpec() = map { field ->
7676
try {
7777
val (expect, actual) = field.tags.getOrElse(emptySet())
7878
.let { tags -> (TagExpect in tags) to (TagActual in tags) }
79-
val value = field.value.get().let { (it as? BuildConfigValue.Expect)?.value ?: it }
79+
val value = field.value.get().unwrap()
8080
val typeName = field.type.get().toTypeName()
8181
.let { it.copy(nullable = it.isNullable || (!expect && value.value == null)) }
8282

@@ -105,7 +105,7 @@ public open class BuildConfigKotlinGenerator(
105105
is BuildConfigValue.Expect -> error("Field '${field.name}' should be have an expect value here: ${value}")
106106
}
107107
}
108-
return@mapNotNull prop.build()
108+
return@map prop.build()
109109

110110
} catch (e: Exception) {
111111
throw IllegalArgumentException(
@@ -115,6 +115,9 @@ public open class BuildConfigKotlinGenerator(
115115
}
116116
}
117117

118+
private fun BuildConfigValue.unwrap() =
119+
if (this is BuildConfigValue.Expect) value!! else this
120+
118121
private fun BuildConfigType.toTypeName(): TypeName {
119122
val kotlinClassName = runCatching { Class.forName(className).kotlin.qualifiedName!! }.getOrDefault(className)
120123
var type: TypeName = when (kotlinClassName.lowercase()) {

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

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ internal object KotlinBinder {
116116

117117
val dependsOn = spec.allDependsOn
118118
.filter { !it.isSuperseded }
119+
.filter { it.hasExpects() }
119120
.toSet()
120121

121122
if (dependsOn.isNotEmpty()) {
@@ -132,6 +133,7 @@ internal object KotlinBinder {
132133
spec.extraSpecs.asSequence().map { extra ->
133134
extra to specDependsOn
134135
.mapNotNull { it.extraSpecs.findByName(extra.name) }
136+
.filter { it.hasExpects() }
135137
.toSet()
136138
}
137139
}
@@ -156,7 +158,10 @@ internal object KotlinBinder {
156158
for (dependsOnSpec in dependsOnSpecs) {
157159
val dependsOnField = dependsOnSpec.buildConfigFields.findByName(field.name) ?: continue
158160

159-
dependsOnField.tags.add(BuildConfigKotlinGenerator.TagExpect)
161+
check(dependsOnField.isExpect) {
162+
"Field '${dependsOnField.name}' in '$dependsOnSpec' must be `expect`, since it's defined as `actual` in '$spec'"
163+
}
164+
160165
field.tags.add(BuildConfigKotlinGenerator.TagActual)
161166
expectSpecs.add(dependsOnSpec)
162167

@@ -168,8 +173,7 @@ internal object KotlinBinder {
168173
// then, in case we have mixed expect and regular constants in the same spec, we promote them all to this spec
169174
for (expectSpec in expectSpecs) {
170175
for (expectField in expectSpec.buildConfigFields) {
171-
expectField.tags.add(BuildConfigKotlinGenerator.TagExpect)
172-
176+
if (expectField.isExpectNoDefault) continue
173177
if (spec.buildConfigFields.names.contains(expectField.name)) continue
174178

175179
spec.buildConfigField(expectField).tags.add(BuildConfigKotlinGenerator.TagActual)
@@ -184,8 +188,8 @@ internal object KotlinBinder {
184188
for (expectSpec in dependsOnSpecs) {
185189
for (expectField in expectSpec.buildConfigFields) {
186190
if (spec.buildConfigFields.names.contains(expectField.name)) continue
191+
if (expectField.isExpectNoDefault) continue
187192

188-
expectField.tags.add(BuildConfigKotlinGenerator.TagExpect)
189193
spec.buildConfigField(expectField)
190194
.tags.add(BuildConfigKotlinGenerator.TagActual)
191195

@@ -196,9 +200,18 @@ internal object KotlinBinder {
196200
}
197201
}
198202

203+
private fun BuildConfigClassSpec.hasExpects() =
204+
buildConfigFields.any { it.isExpect }
205+
199206
private fun BuildConfigClassSpec.hasActuals() =
200207
buildConfigFields.any { it.isActual }
201208

209+
private val BuildConfigField.isExpect: Boolean
210+
get() = BuildConfigKotlinGenerator.TagExpect in tags.get()
211+
212+
private val BuildConfigField.isExpectNoDefault: Boolean
213+
get() = isExpect && value.get().value == null
214+
202215
private val BuildConfigField.isActual: Boolean
203216
get() = BuildConfigKotlinGenerator.TagActual in tags.get()
204217

0 commit comments

Comments
 (0)