Skip to content

Commit fa3fb02

Browse files
committed
breaking: removed SpecSheet and CompactSpecSheet
- added ElementDefinition.isBuiltin() - added CompactElementDefinition.isBuiltin() - added CompactElementDefinition.strip() - added Sequence<CompactElementDefinition>.inflate(...) - removed SpecSheet - removed CompactSpecSheet - removed GenFeature.NO_BUILTIN - removed MmrpcExtension.Kotlin.noBuiltin()
1 parent 82e62fd commit fa3fb02

9 files changed

Lines changed: 86 additions & 230 deletions

File tree

mmrpc-definition/src/commonMain/kotlin/Definition.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
package org.cufy.mmrpc
1717

1818
import kotlinx.serialization.Serializable
19+
import org.cufy.mmrpc.builtin.elements
1920

2021
@Serializable
2122
sealed class ElementDefinition {
@@ -26,6 +27,7 @@ sealed class ElementDefinition {
2627
val name by lazy { canonicalName.name }
2728
val namespace by lazy { canonicalName.namespace }
2829

30+
fun isBuiltin() = elements.any { it.canonicalName == canonicalName }
2931
fun collect() = sequenceOf(this) + collectChildren()
3032

3133
abstract fun collectChildren(): Sequence<ElementDefinition>

mmrpc-definition/src/commonMain/kotlin/SpecSheet.kt

Lines changed: 0 additions & 104 deletions
This file was deleted.

mmrpc-definition/src/commonMain/kotlin/compact/CompactElementDefinition.kt

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package org.cufy.mmrpc.compact
22

33
import kotlinx.serialization.Serializable
44
import org.cufy.mmrpc.*
5+
import kotlin.js.JsName
56

67
@Suppress("PropertyName")
78
@Serializable
@@ -13,6 +14,8 @@ sealed interface CompactElementDefinition {
1314

1415
val name get() = canonical_name.name
1516
val namespace get() = canonical_name.namespace
17+
18+
fun isBuiltin() = builtin.elements.any { it.canonicalName == canonical_name }
1619
}
1720

1821
fun ElementDefinition.toCompact(): CompactElementDefinition {
@@ -34,6 +37,25 @@ fun ElementDefinition.toCompact(): CompactElementDefinition {
3437
}
3538
}
3639

40+
fun CompactElementDefinition.strip(): CompactElementDefinition {
41+
return when (this) {
42+
is CompactConstDefinition -> copy(description = "")
43+
is CompactFaultDefinition -> copy(description = "")
44+
is CompactFieldDefinition -> copy(description = "")
45+
is CompactMetadataDefinition -> copy(description = "")
46+
is CompactProtocolDefinition -> copy(description = "")
47+
is CompactRoutineDefinition -> copy(description = "")
48+
is CompactArrayDefinition -> copy(description = "")
49+
is CompactEnumDefinition -> copy(description = "")
50+
is CompactInterDefinition -> copy(description = "")
51+
is CompactOptionalDefinition -> copy(description = "")
52+
is CompactScalarDefinition -> copy(description = "")
53+
is CompactStructDefinition -> copy(description = "")
54+
is CompactTupleDefinition -> copy(description = "")
55+
is CompactUnionDefinition -> copy(description = "")
56+
}
57+
}
58+
3759
fun CompactElementDefinition.inflateOrNull(
3860
onLookup: (CanonicalName) -> ElementDefinition?,
3961
): ElementDefinition? {
@@ -54,3 +76,53 @@ fun CompactElementDefinition.inflateOrNull(
5476
is CompactUnionDefinition -> inflateOrNull(onLookup)
5577
}
5678
}
79+
80+
fun Sequence<CompactElementDefinition>.inflate(
81+
builtins: Iterable<ElementDefinition>,
82+
): Sequence<ElementDefinition> {
83+
@JsName("a")
84+
data class LazyInflate(
85+
@JsName("c")
86+
var compact: CompactElementDefinition? = null,
87+
@JsName("b")
88+
var element: ElementDefinition? = null,
89+
)
90+
91+
val builtinsMap = builtins.associateBy { it.canonicalName }
92+
val elementsMap = this.associate { it.canonical_name to LazyInflate(it) }
93+
val requested = mutableSetOf<CanonicalName>()
94+
95+
fun LazyInflate.tryInflate(): ElementDefinition? {
96+
fun onLookup(canonicalName: CanonicalName): ElementDefinition? {
97+
builtinsMap[canonicalName]?.let { return it }
98+
requested += canonicalName
99+
return elementsMap[canonicalName]?.tryInflate()
100+
}
101+
102+
if (this.element != null) return this.element
103+
val inflated = compact?.inflateOrNull(::onLookup) ?: return null
104+
this.element = inflated
105+
return inflated
106+
}
107+
108+
for (it in elementsMap)
109+
it.value.tryInflate()
110+
111+
val failed = buildList {
112+
for (it in requested) if (it !in elementsMap) add(it)
113+
for (it in elementsMap) if (it.value.element == null) add(it.key)
114+
}
115+
116+
if (failed.isNotEmpty()) {
117+
error(buildString {
118+
append("Inflation failed: failed to inflate the following definitions: ")
119+
for (it in failed) {
120+
appendLine()
121+
append("- ")
122+
append(it.value)
123+
}
124+
})
125+
}
126+
127+
return elementsMap.asSequence().map { it.value.element!! }
128+
}

mmrpc-definition/src/commonMain/kotlin/compact/CompactSpecSheet.kt

Lines changed: 0 additions & 105 deletions
This file was deleted.

mmrpc-gen-kotlin/src/commonMain/kotlin/Declarations.kt

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,6 @@ enum class GenFeature {
1717
*/
1818
DEBUG,
1919

20-
/**
21-
* Don't implicitly add builtin elements.
22-
*/
23-
NO_BUILTIN,
24-
2520
/**
2621
* Generate field name constant properties.
2722
*/

mmrpc-gen-kotlin/src/commonMain/kotlin/GenContext.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import org.cufy.mmrpc.CanonicalName
55
import org.cufy.mmrpc.ElementDefinition
66

77
class GenContext(
8-
val elements: Set<ElementDefinition>,
8+
val elements: List<ElementDefinition>,
99
val ignore: Set<CanonicalName>,
1010

1111
//

mmrpc-gradle-plugin/src/main/kotlin/MmrpcExtension.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,6 @@ open class MmrpcExtension {
9797

9898
// @formatter:off
9999
fun debug() { features += GenFeature.DEBUG }
100-
fun noBuiltin() { features += GenFeature.NO_BUILTIN }
101100
fun kotlinxSerialization() { features += GenFeature.KOTLINX_SERIALIZATION }
102101

103102
fun keepTypeClassNames() { features += GenFeature.KEEP_TYPE_CLASS_NAMES }

0 commit comments

Comments
 (0)