@@ -6,52 +6,57 @@ fun merge(list: List<Namespace>): Namespace {
6
6
val types = mergeTypes(list.flatMap { it.types ? : emptyList() })
7
7
8
8
val properties = list
9
- .flatMap { it.properties?.entries ? : emptySet() }
10
- .associate { it.key to it.value.resolve(it.key, types) }
11
- .takeUnless { it.isEmpty() }
9
+ .flatMap { it.properties?.entries ? : emptySet() }
10
+ .associate { it.key to it.value.resolve(it.key, types) }
11
+ .takeUnless { it.isEmpty() }
12
12
13
13
val functions = list
14
- .flatMap { it.functions?.map { it.resolve(types) } ? : emptyList() }
15
- .takeUnless { it.isEmpty() }
14
+ .flatMap { it.functions?.map { it.resolve(types) } ? : emptyList() }
15
+ .takeUnless { it.isEmpty() }
16
16
17
17
val events = list
18
- .flatMap { it.events?.map { it.resolve(types) } ? : emptyList() }
19
- .takeUnless { it.isEmpty() }
18
+ .flatMap { it.events?.map { it.resolve(types) } ? : emptyList() }
19
+ .takeUnless { it.isEmpty() }
20
20
21
21
return Namespace (
22
- namespace = list.first().namespace,
23
- description = list.mapNotNull { it.description }.firstOrNull(),
24
- types = types.values.toList().takeUnless { it.isEmpty() },
25
- properties = properties,
26
- functions = functions,
27
- events = events
22
+ namespace = list.first().namespace,
23
+ description = list.mapNotNull { it.description }.firstOrNull(),
24
+ types = types.values.toList().takeUnless { it.isEmpty() },
25
+ properties = properties,
26
+ functions = functions,
27
+ events = events
28
28
)
29
29
}
30
30
31
31
private fun mergeTypes (types : List <Type >): MutableMap <String ?, Type > {
32
32
val result = types
33
- .groupingBy { it.id ? : it.`$extend` }
34
- .reduceTo(mutableMapOf ()) { key, left, right ->
35
- Type (
36
- id = key,
37
- description = left.description ? : right.description,
38
- type = left.type ? : right.type,
39
- properties = (left.properties.orEmpty() + right.properties.orEmpty()).takeUnless { it.isEmpty() },
40
- choices = (left.choices.orEmpty() + right.choices.orEmpty()).takeUnless { it.isEmpty() },
41
- `$extend` = null ,
42
- actual = false ,
43
- items = left.items ? : right.items,
44
- additionalProperties = left.additionalProperties ? : right.additionalProperties,
45
- patternProperties = (left.patternProperties.orEmpty() + right.patternProperties.orEmpty()).takeUnless { it.isEmpty() }
46
- )
47
- }
33
+ .groupingBy { it.id ? : it.`$extend` }
34
+ .reduceTo(mutableMapOf ()) { key, left, right ->
35
+ Type (
36
+ id = key,
37
+ description = left.description ? : right.description,
38
+ type = left.type ? : right.type,
39
+ properties = (left.properties.orEmpty() + right.properties.orEmpty()).takeUnless { it.isEmpty() },
40
+ choices = (left.choices.orEmpty() + right.choices.orEmpty()).takeUnless { it.isEmpty() },
41
+ `$extend` = null ,
42
+ actual = false ,
43
+ items = left.items ? : right.items,
44
+ additionalProperties = left.additionalProperties ? : right.additionalProperties,
45
+ patternProperties = (left.patternProperties.orEmpty() + right.patternProperties.orEmpty()).takeUnless { it.isEmpty() }
46
+ )
47
+ }
48
48
49
49
for ((key, value) in result.toMap()) {
50
50
if (key == null ) continue
51
51
52
52
result[key] = value.copy(
53
- properties = value.properties?.entries?.associate { it.key to it.value.resolve(it.key, result) },
54
- items = value.items?.resolve(key, result)
53
+ properties = value.properties?.entries?.associate {
54
+ it.key to it.value.resolve(
55
+ it.key,
56
+ result
57
+ )
58
+ },
59
+ items = value.items?.resolve(key, result)
55
60
)
56
61
}
57
62
@@ -60,30 +65,43 @@ private fun mergeTypes(types: List<Type>): MutableMap<String?, Type> {
60
65
61
66
private fun Event.resolve (types : MutableMap <String ?, Type >): Event {
62
67
return copy(
63
- parameters = parameters?.map { it.resolve(it.name!! , types) }
68
+ parameters = parameters?.map { it.resolve(it.name!! , types) }
64
69
)
65
70
}
66
71
67
72
private fun Function.resolve (types : MutableMap <String ?, Type >): Function {
68
73
return copy(
69
- parameters = parameters?.map { it.resolve(it.name!! , types, it.name != async, it.name == async) },
70
- returns = returns?.resolve(name + " Result" , types)
74
+ parameters = parameters?.map {
75
+ it.resolve(
76
+ it.name!! ,
77
+ types,
78
+ it.name != async,
79
+ it.name == async
80
+ )
81
+ },
82
+ returns = returns?.resolve(name + " Result" , types)
71
83
)
72
84
}
73
85
74
86
private fun Parameter.resolve (
75
- name : String ,
76
- types : MutableMap <String ?, Type >,
77
- actual : Boolean = false,
78
- isReturn : Boolean = false
87
+ name : String ,
88
+ types : MutableMap <String ?, Type >,
89
+ actual : Boolean = false,
90
+ isReturn : Boolean = false
79
91
): Parameter {
80
- if (type == " function" ) return copy(parameters = parameters?.map { it.resolve(it.name ? : name, types) })
92
+ if (type == " function" ) return copy(parameters = parameters?.map {
93
+ it.resolve(
94
+ it.name ? : name,
95
+ types
96
+ )
97
+ })
81
98
if (type == " array" ) return copy(items = items?.resolve(name, types, actual))
82
99
if (type != " object" &&
83
- choices == null &&
84
- parameters == null &&
85
- additionalProperties == null &&
86
- patternProperties == null ) {
100
+ choices == null &&
101
+ parameters == null &&
102
+ additionalProperties == null &&
103
+ patternProperties == null
104
+ ) {
87
105
return this
88
106
}
89
107
@@ -98,31 +116,39 @@ private fun Parameter.resolve(
98
116
while (types.containsKey(typeName)) typeName = name.capitalize() + ++ counter
99
117
100
118
if (! isReturn) {
101
- val previous = types.put(typeName, Type (
119
+ val previous = types.put(
120
+ typeName, Type (
102
121
id = typeName,
103
122
type = null ,
104
- properties = properties?.map { it.key to it.value.resolve(it.key, types, actual) }?.toMap(),
123
+ properties = properties?.map {
124
+ it.key to it.value.resolve(
125
+ it.key,
126
+ types,
127
+ actual
128
+ )
129
+ }?.toMap(),
105
130
description = description,
106
131
`$extend` = null ,
107
132
choices = null ,
108
133
actual = actual,
109
134
items = null ,
110
135
additionalProperties = additionalProperties,
111
136
patternProperties = patternProperties
112
- ))
137
+ )
138
+ )
113
139
114
140
require(previous == null ) {
115
141
" A type with the name $typeName already existed"
116
142
}
117
143
}
118
144
119
145
return copy(
120
- type = null ,
121
- properties = null ,
122
- `$ref` = typeName,
123
- parameters = parameters,
124
- choices = choices,
125
- additionalProperties = null ,
126
- patternProperties = null
146
+ type = null ,
147
+ properties = null ,
148
+ `$ref` = typeName,
149
+ parameters = parameters,
150
+ choices = choices,
151
+ additionalProperties = null ,
152
+ patternProperties = null
127
153
)
128
154
}
0 commit comments