@@ -23,6 +23,7 @@ import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTarget
23
23
import util.KOTLIN_JVM_PLUGIN_ID
24
24
import util.KOTLIN_MULTIPLATFORM_PLUGIN_ID
25
25
import util.other.isPublicModule
26
+ import util.other.optionalPropertyValue
26
27
import java.io.File
27
28
import java.nio.file.Files
28
29
@@ -38,13 +39,15 @@ enum class TableColumn {
38
39
sealed interface PlatformTarget {
39
40
val name: String
40
41
val subtargets: List <PlatformTarget >
42
+ val stub: Boolean get() = false
41
43
42
44
class Group (
43
45
override val name : String ,
44
46
override val subtargets : List <PlatformTarget >,
47
+ override val stub : Boolean ,
45
48
) : PlatformTarget
46
49
47
- class LeafTarget (override val name : String ) : PlatformTarget {
50
+ class LeafTarget (override val name : String , override val stub : Boolean ) : PlatformTarget {
48
51
override val subtargets: List <PlatformTarget > = emptyList()
49
52
}
50
53
}
@@ -113,32 +116,44 @@ abstract class DumpPlatformsTask : DefaultTask() {
113
116
.mapValues { (platform, targets) ->
114
117
when (platform) {
115
118
KotlinPlatformType .jvm -> {
116
- PlatformTarget .LeafTarget (TableColumn .Jvm .name.lowercase())
119
+ val isStub = subproject.optionalPropertyValue(targets[0 ].name, " stub" )
120
+ PlatformTarget .LeafTarget (TableColumn .Jvm .name.lowercase(), isStub)
117
121
}
118
122
119
123
KotlinPlatformType .js -> {
120
- val subtargets = targets.jsOrWasmSubTargets(" js" , subproject) {
124
+ val (target, subtargets) = targets.jsOrWasmSubTargets(" js" , subproject) {
121
125
it is KotlinJsIrTarget
122
- }
126
+ } ? : return @mapValues null
123
127
124
- PlatformTarget .Group (TableColumn .Js .name, subtargets)
128
+ val isStub = subproject.optionalPropertyValue(target.name, " stub" )
129
+ PlatformTarget .Group (TableColumn .Js .name, subtargets, isStub)
125
130
}
126
131
127
132
KotlinPlatformType .wasm -> {
128
- val jsSubtargets = targets.jsOrWasmSubTargets(" wasmJs" , subproject) {
133
+ val (jsTarget, jsSubtargets) = targets.jsOrWasmSubTargets(" wasmJs" , subproject) {
129
134
it is KotlinWasmJsTargetDsl && it.wasmTargetType == KotlinWasmTargetType .JS
130
- }
135
+ } ? : ( null to emptyList())
131
136
132
- val wasiSubtargets = targets.jsOrWasmSubTargets(" wasmWasi" , subproject) {
137
+ val (wasiTarget, wasiSubtargets) = targets.jsOrWasmSubTargets(" wasmWasi" , subproject) {
133
138
it is KotlinWasmWasiTargetDsl && it.wasmTargetType == KotlinWasmTargetType .WASI
134
- }
139
+ } ? : (null to emptyList())
140
+
141
+ val jsIsStub = jsTarget?.name
142
+ ?.let { subproject.optionalPropertyValue(it, " stub" ) } ? : false
143
+
144
+ val wasiIsStub = wasiTarget?.name
145
+ ?.let { subproject.optionalPropertyValue(it, " stub" ) } ? : false
135
146
136
147
val wasmSubtargets = listOfNotNull(
137
- PlatformTarget .Group (" wasmJs" , jsSubtargets).takeIf { jsSubtargets.isNotEmpty() },
138
- PlatformTarget .Group (" wasmWasi" , wasiSubtargets).takeIf { wasiSubtargets.isNotEmpty() },
148
+ PlatformTarget .Group (" wasmJs" , jsSubtargets, jsIsStub ).takeIf { jsSubtargets.isNotEmpty() },
149
+ PlatformTarget .Group (" wasmWasi" , wasiSubtargets, wasiIsStub ).takeIf { wasiSubtargets.isNotEmpty() },
139
150
)
140
151
141
- PlatformTarget .Group (TableColumn .Wasm .name, wasmSubtargets)
152
+ PlatformTarget .Group (
153
+ name = TableColumn .Wasm .name,
154
+ subtargets = wasmSubtargets,
155
+ stub = subproject.optionalPropertyValue(TableColumn .Wasm .name, " stub" ),
156
+ )
142
157
}
143
158
144
159
KotlinPlatformType .native -> {
@@ -148,15 +163,17 @@ abstract class DumpPlatformsTask : DefaultTask() {
148
163
PlatformTarget .Group (
149
164
name = " apple" ,
150
165
subtargets = listOf (
151
- targets.nativeGroup(" ios" ),
152
- targets.nativeGroup(" macos" ),
153
- targets.nativeGroup(" watchos" ),
154
- targets.nativeGroup(" tvos" ),
166
+ targets.nativeGroup(subproject, " ios" ),
167
+ targets.nativeGroup(subproject, " macos" ),
168
+ targets.nativeGroup(subproject, " watchos" ),
169
+ targets.nativeGroup(subproject, " tvos" ),
155
170
),
171
+ stub = subproject.optionalPropertyValue(" apple" , " stub" ),
156
172
),
157
- targets.nativeGroup(" linux" ),
158
- targets.nativeGroup(" windows" , " mingw" ),
159
- )
173
+ targets.nativeGroup(subproject, " linux" ),
174
+ targets.nativeGroup(subproject, " windows" , " mingw" ),
175
+ ),
176
+ stub = subproject.optionalPropertyValue(TableColumn .Native .name, " stub" ),
160
177
)
161
178
}
162
179
@@ -173,29 +190,34 @@ abstract class DumpPlatformsTask : DefaultTask() {
173
190
name : String ,
174
191
project : Project ,
175
192
condition : (KotlinTarget ) -> Boolean ,
176
- ): List <PlatformTarget .LeafTarget > {
193
+ ): Pair < KotlinTarget , List <PlatformTarget .LeafTarget >> ? {
177
194
val foundTargets = filter(condition)
178
195
.filterIsInstance<KotlinJsIrTarget >()
179
196
180
197
if (foundTargets.isEmpty()) {
181
- return emptyList()
198
+ return null
182
199
}
183
200
184
201
if (foundTargets.size > 1 ) {
185
202
error(" Multiple $name targets are not supported (project ${project.name} )" )
186
203
}
187
204
188
- val jsSubtargets = foundTargets.single().subTargets.map { subTargetWithBinary ->
189
- PlatformTarget .LeafTarget (subTargetWithBinary.name)
205
+ val target = foundTargets.single()
206
+ val jsSubtargets = target.subTargets.map { subTargetWithBinary ->
207
+ val isStub = project.optionalPropertyValue(subTargetWithBinary.name, " stub" , target.name)
208
+ PlatformTarget .LeafTarget (subTargetWithBinary.name, isStub)
190
209
}
191
210
192
- return jsSubtargets
211
+ return target to jsSubtargets
193
212
}
194
213
195
- private fun List<KotlinTarget>.nativeGroup (name : String , prefix : String = name): PlatformTarget .Group {
214
+ private fun List<KotlinTarget>.nativeGroup (subproject : Project , name : String , prefix : String = name): PlatformTarget .Group {
196
215
return PlatformTarget .Group (
197
216
name = name,
198
- subtargets = filter { it.name.startsWith(prefix) }.map { PlatformTarget .LeafTarget (it.name) },
217
+ subtargets = filter { it.name.startsWith(prefix) }.map {
218
+ PlatformTarget .LeafTarget (it.name, subproject.optionalPropertyValue(it.name, " stub" ))
219
+ },
220
+ stub = subproject.optionalPropertyValue(name, " stub" )
199
221
)
200
222
}
201
223
@@ -224,12 +246,25 @@ abstract class DumpPlatformsTask : DefaultTask() {
224
246
225
247
is PlatformTarget .LeafTarget -> {
226
248
append(target.name)
249
+ if (target.stub) {
250
+ append(" <b>[stub]</b>" )
251
+ }
227
252
}
228
253
229
254
is PlatformTarget .Group -> {
230
- if (! topLevel) {
231
- append(target.name)
255
+ when {
256
+ ! topLevel -> {
257
+ append(target.name)
258
+ if (target.stub) {
259
+ append(" <b>[stub]</b>" )
260
+ }
261
+ }
262
+
263
+ target.stub -> {
264
+ append(" <b>[stubs]</b>" )
265
+ }
232
266
}
267
+
233
268
append(" <list>" )
234
269
target.subtargets.forEach { subtarget ->
235
270
append(" <li>" )
0 commit comments