Skip to content

Commit 6e444f3

Browse files
committed
Implement hierarchical configuration.
1 parent 11ab488 commit 6e444f3

File tree

105 files changed

+1343
-579
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

105 files changed

+1343
-579
lines changed

SKIE/acceptance-tests

SKIE/common/analytics/src/commonMain/kotlin/co/touchlab/skie/plugin/analytics/AnalyticsCollector.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
package co.touchlab.skie.plugin.analytics
22

33
import co.touchlab.skie.configuration.SkieConfigurationFlag
4-
import co.touchlab.skie.configuration.TypedSkieConfiguration
4+
import co.touchlab.skie.configuration.UntypedSkieConfigurationData
55
import co.touchlab.skie.util.directory.SkieBuildDirectory
66

77
class AnalyticsCollector(
88
private val skieBuildDirectory: SkieBuildDirectory,
9-
private val skieConfiguration: TypedSkieConfiguration<SkieConfigurationFlag>,
9+
private val skieConfiguration: UntypedSkieConfigurationData<SkieConfigurationFlag>,
1010
) {
1111

1212
fun collectAsync(producers: List<AnalyticsProducer>) {

SKIE/common/configuration/api/src/commonMain/kotlin/co/touchlab/skie/configuration/ConfigurationKey.kt

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,26 +20,43 @@ interface ConfigurationKey<T> {
2020

2121
val skieRuntimeValue: T
2222

23-
fun getAnnotationValue(configurationTarget: ConfigurationTarget): T?
23+
val isInheritable: kotlin.Boolean
24+
get() = false
25+
26+
fun hasAnnotationValue(configurationTarget: ConfigurationTarget): kotlin.Boolean
27+
28+
fun getAnnotationValue(configurationTarget: ConfigurationTarget): T
2429

2530
fun deserialize(value: kotlin.String?): T
2631

2732
fun serialize(value: T): kotlin.String? =
2833
value?.toString()
2934

30-
interface String : ConfigurationKey<kotlin.String> {
35+
interface NonOptional<T : Any> : ConfigurationKey<T> {
36+
37+
override fun hasAnnotationValue(configurationTarget: ConfigurationTarget): kotlin.Boolean =
38+
findAnnotationValue(configurationTarget) != null
39+
40+
fun findAnnotationValue(configurationTarget: ConfigurationTarget): T?
41+
42+
override fun getAnnotationValue(configurationTarget: ConfigurationTarget): T =
43+
findAnnotationValue(configurationTarget)
44+
?: throw IllegalStateException("Target $configurationTarget does not have an annotation value.")
45+
}
46+
47+
interface String : NonOptional<kotlin.String> {
3148

3249
override fun deserialize(value: kotlin.String?): kotlin.String =
3350
value.throwIfNull()
3451
}
3552

36-
interface Boolean : ConfigurationKey<kotlin.Boolean> {
53+
interface Boolean : NonOptional<kotlin.Boolean> {
3754

3855
override fun deserialize(value: kotlin.String?): kotlin.Boolean =
3956
value.throwIfNull().toBooleanStrict()
4057
}
4158

42-
interface Int : ConfigurationKey<kotlin.Int> {
59+
interface Int : NonOptional<kotlin.Int> {
4360

4461
override fun deserialize(value: kotlin.String?): kotlin.Int =
4562
value.throwIfNull().toInt()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package co.touchlab.skie.configuration
2+
3+
interface ConfigurationScope {
4+
5+
interface Root : ConfigurationScope
6+
7+
interface Module : ConfigurationScope
8+
9+
interface Package : ConfigurationScope
10+
11+
interface File : ConfigurationScope
12+
13+
interface Class : ConfigurationScope
14+
15+
interface Constructor : ConfigurationScope
16+
17+
interface SimpleFunction : ConfigurationScope
18+
19+
interface Property : ConfigurationScope
20+
21+
interface ValueParameter : ConfigurationScope
22+
23+
interface Function : SimpleFunction, Constructor
24+
25+
interface CallableDeclaration : Function, Property
26+
27+
interface AllExceptCallableDeclarations : Root, Module, Package, File, Class
28+
29+
interface AllExceptConstructorsAndProperties : AllExceptCallableDeclarations, SimpleFunction
30+
31+
interface All : AllExceptConstructorsAndProperties, CallableDeclaration, ValueParameter
32+
}

SKIE/common/configuration/api/src/commonMain/kotlin/co/touchlab/skie/configuration/ConfigurationTarget.kt

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,6 @@ import kotlin.reflect.KClass
44

55
interface ConfigurationTarget {
66

7-
val fqName: String
8-
9-
val belongsToSkieRuntime: Boolean
10-
117
fun <T : Annotation> hasAnnotation(kClass: KClass<T>): Boolean
128

139
fun <T : Annotation> findAnnotation(kClass: KClass<T>): T?
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package co.touchlab.skie.configuration
22

3-
interface TypedSkieConfiguration<FLAGS> {
3+
interface UntypedSkieConfigurationData<FLAGS> {
44

55
val enabledConfigurationFlags: Set<FLAGS>
66

SKIE/common/configuration/declaration/src/commonMain/kotlin/co/touchlab/skie/configuration/ClassInterop.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,13 @@ object ClassInterop {
1111
*
1212
* (Both Kotlin compiler and SKIE rename classes to avoid name conflicts.)
1313
*/
14-
object StableTypeAlias : ConfigurationKey.Boolean {
14+
object StableTypeAlias : ConfigurationKey.Boolean, ConfigurationScope.AllExceptCallableDeclarations {
1515

1616
override val defaultValue: Boolean = false
1717

1818
override val skieRuntimeValue: Boolean = true
1919

20-
override fun getAnnotationValue(configurationTarget: ConfigurationTarget): Boolean? =
20+
override fun findAnnotationValue(configurationTarget: ConfigurationTarget): Boolean? =
2121
when {
2222
configurationTarget.hasAnnotation<ClassInterop.StableTypeAlias.Enabled>() -> true
2323
configurationTarget.hasAnnotation<ClassInterop.StableTypeAlias.Disabled>() -> false
@@ -31,12 +31,14 @@ object ClassInterop {
3131
* However, external Obj-C classes with custom bindings (for example generated by the cinterop tool) must be configured manually.
3232
* Without knowing the Framework name, SKIE cannot reference such a class in the generated code.
3333
*/
34-
object CInteropFrameworkName : ConfigurationKey.OptionalString {
34+
object CInteropFrameworkName : ConfigurationKey.OptionalString, ConfigurationScope.AllExceptCallableDeclarations {
3535

3636
override val defaultValue: String? = null
3737

3838
override val skieRuntimeValue: String? = null
3939

40+
override fun hasAnnotationValue(configurationTarget: ConfigurationTarget): Boolean = false
41+
4042
override fun getAnnotationValue(configurationTarget: ConfigurationTarget): String? = null
4143
}
4244
}

SKIE/common/configuration/declaration/src/commonMain/kotlin/co/touchlab/skie/configuration/DefaultArgumentInterop.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,27 +4,27 @@ import co.touchlab.skie.configuration.annotations.DefaultArgumentInterop
44

55
object DefaultArgumentInterop {
66

7-
object Enabled : ConfigurationKey.Boolean {
7+
object Enabled : ConfigurationKey.Boolean, ConfigurationScope.All {
88

99
override val defaultValue: Boolean = false
1010

1111
override val skieRuntimeValue: Boolean = false
1212

13-
override fun getAnnotationValue(configurationTarget: ConfigurationTarget): Boolean? =
13+
override fun findAnnotationValue(configurationTarget: ConfigurationTarget): Boolean? =
1414
when {
1515
configurationTarget.hasAnnotation<DefaultArgumentInterop.Enabled>() -> true
1616
configurationTarget.hasAnnotation<DefaultArgumentInterop.Disabled>() -> false
1717
else -> null
1818
}
1919
}
2020

21-
object MaximumDefaultArgumentCount : ConfigurationKey.Int {
21+
object MaximumDefaultArgumentCount : ConfigurationKey.Int, ConfigurationScope.All {
2222

2323
override val defaultValue: Int = 5
2424

2525
override val skieRuntimeValue: Int = 5
2626

27-
override fun getAnnotationValue(configurationTarget: ConfigurationTarget): Int? =
27+
override fun findAnnotationValue(configurationTarget: ConfigurationTarget): Int? =
2828
configurationTarget.findAnnotation<DefaultArgumentInterop.MaximumDefaultArgumentCount>()?.count
2929
}
3030
}

SKIE/common/configuration/declaration/src/commonMain/kotlin/co/touchlab/skie/configuration/EnumInterop.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,13 @@ object EnumInterop {
77
/**
88
* If true, the interop code is generated for the given enum.
99
*/
10-
object Enabled : ConfigurationKey.Boolean {
10+
object Enabled : ConfigurationKey.Boolean, ConfigurationScope.AllExceptCallableDeclarations {
1111

1212
override val defaultValue: Boolean = true
1313

1414
override val skieRuntimeValue: Boolean = true
1515

16-
override fun getAnnotationValue(configurationTarget: ConfigurationTarget): Boolean? =
16+
override fun findAnnotationValue(configurationTarget: ConfigurationTarget): Boolean? =
1717
when {
1818
configurationTarget.hasAnnotation<EnumInterop.Enabled>() -> true
1919
configurationTarget.hasAnnotation<EnumInterop.Disabled>() -> false
@@ -51,13 +51,13 @@ object EnumInterop {
5151
* case none
5252
* ```
5353
*/
54-
object LegacyCaseName : ConfigurationKey.Boolean {
54+
object LegacyCaseName : ConfigurationKey.Boolean, ConfigurationScope.AllExceptCallableDeclarations {
5555

5656
override val defaultValue: Boolean = false
5757

5858
override val skieRuntimeValue: Boolean = false
5959

60-
override fun getAnnotationValue(configurationTarget: ConfigurationTarget): Boolean? =
60+
override fun findAnnotationValue(configurationTarget: ConfigurationTarget): Boolean? =
6161
when {
6262
configurationTarget.hasAnnotation<EnumInterop.LegacyCaseName.Enabled>() -> true
6363
configurationTarget.hasAnnotation<EnumInterop.LegacyCaseName.Disabled>() -> false

SKIE/common/configuration/declaration/src/commonMain/kotlin/co/touchlab/skie/configuration/ExperimentalFeatures.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,13 @@ object ExperimentalFeatures {
77
/**
88
* If true, enables experimental features which might not be fully implemented yet which may cause compilation problems.
99
*/
10-
object Enabled : ConfigurationKey.Boolean {
10+
object Enabled : ConfigurationKey.Boolean, ConfigurationScope.All {
1111

1212
override val defaultValue: Boolean = false
1313

1414
override val skieRuntimeValue: Boolean = true
1515

16-
override fun getAnnotationValue(configurationTarget: ConfigurationTarget): Boolean? =
16+
override fun findAnnotationValue(configurationTarget: ConfigurationTarget): Boolean? =
1717
when {
1818
configurationTarget.hasAnnotation<ExperimentalFeatures.Enabled>() -> true
1919
configurationTarget.hasAnnotation<ExperimentalFeatures.Disabled>() -> false

0 commit comments

Comments
 (0)