Skip to content

Commit 7b851b4

Browse files
committed
Continue cleaning tasks up
1 parent c76f31f commit 7b851b4

6 files changed

+95
-80
lines changed

api/binary-compatibility-validator.api

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,10 @@ public class kotlinx/validation/KotlinApiCompareTask : org/gradle/api/DefaultTas
8585
public final fun setProjectApiFile (Ljava/io/File;)V
8686
}
8787

88+
public final class kotlinx/validation/_UtilsKt {
89+
public static final fun toKlibTarget (Lorg/jetbrains/kotlin/gradle/plugin/KotlinTarget;)Lkotlinx/validation/api/klib/KlibTarget;
90+
}
91+
8892
public final class kotlinx/validation/api/ClassBinarySignature {
8993
public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/util/List;Lkotlinx/validation/api/AccessFlags;ZZLjava/util/List;)Lkotlinx/validation/api/ClassBinarySignature;
9094
public static synthetic fun copy$default (Lkotlinx/validation/api/ClassBinarySignature;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/util/List;Lkotlinx/validation/api/AccessFlags;ZZLjava/util/List;ILjava/lang/Object;)Lkotlinx/validation/api/ClassBinarySignature;

src/main/kotlin/-Utils.kt

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
/*
2+
* Copyright 2016-2024 JetBrains s.r.o.
3+
* Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file.
4+
*/
5+
6+
package kotlinx.validation
7+
8+
import kotlinx.validation.api.klib.KlibTarget
9+
import kotlinx.validation.api.klib.konanTargetNameMapping
10+
import org.gradle.api.file.RegularFileProperty
11+
import org.gradle.api.tasks.Input
12+
import org.gradle.api.tasks.InputFiles
13+
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
14+
import org.jetbrains.kotlin.gradle.plugin.KotlinTarget
15+
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
16+
import org.jetbrains.kotlin.gradle.targets.js.KotlinWasmTargetType
17+
import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTarget
18+
import java.io.Serializable
19+
20+
/**
21+
* Converts [KotlinTarget] to a [KlibTarget].
22+
*/
23+
public fun KotlinTarget.toKlibTarget(): KlibTarget = KlibTarget(extractUnderlyingTarget(this), targetName)
24+
25+
private fun extractUnderlyingTarget(target: KotlinTarget): String {
26+
if (target is KotlinNativeTarget) {
27+
return konanTargetNameMapping[target.konanTarget.name]!!
28+
}
29+
return when (target.platformType) {
30+
KotlinPlatformType.js -> "js"
31+
KotlinPlatformType.wasm -> when ((target as KotlinJsIrTarget).wasmTargetType) {
32+
KotlinWasmTargetType.WASI -> "wasmWasi"
33+
KotlinWasmTargetType.JS -> "wasmJs"
34+
else -> throw IllegalStateException("Unreachable")
35+
}
36+
else -> throw IllegalArgumentException("Unsupported platform type: ${target.platformType}")
37+
}
38+
}
39+
40+
/**
41+
* Information about a generated klib dump.
42+
*/
43+
public class GeneratedDump(
44+
/**
45+
* The target the dump was generated for.
46+
*/
47+
@get:Input
48+
public val target: KlibTarget,
49+
50+
/**
51+
* Path to a resulting dump file.
52+
*/
53+
@get:InputFiles
54+
public val dumpFile: RegularFileProperty
55+
) : Serializable

src/main/kotlin/BinaryCompatibilityValidatorPlugin.kt

Lines changed: 27 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -511,6 +511,23 @@ private class KlibValidationPipelineBuilder(
511511
val kotlin = project.kotlinMultiplatform
512512

513513
val supportedTargetsProvider = supportedTargets()
514+
val generatedDumps = objects.listProperty(GeneratedDump::class.java)
515+
val inferredDumps = objects.listProperty(GeneratedDump::class.java)
516+
mergeTask.configure {
517+
it.dumps.addAll(generatedDumps)
518+
it.doFirst {
519+
if (supportedTargetsProvider.get().isEmpty()) {
520+
throw IllegalStateException(
521+
"KLib ABI dump/validation requires at least one enabled klib target, but none were found."
522+
)
523+
}
524+
}
525+
}
526+
mergeInferredTask.configure {
527+
it.dumps.addAll(generatedDumps)
528+
it.dumps.addAll(inferredDumps)
529+
}
530+
514531
kotlin.targets.matching { it.emitsKlib }.configureEach { currentTarget ->
515532
val mainCompilation = currentTarget.mainCompilationOrNull ?: return@configureEach
516533

@@ -521,14 +538,9 @@ private class KlibValidationPipelineBuilder(
521538
// If a target is supported, the workflow is simple: create a dump, then merge it along with other dumps.
522539
if (targetSupported) {
523540
val buildTargetAbi = configureKlibCompilation(mainCompilation, extension, targetConfig, apiBuildDir)
524-
mergeTask.configure {
525-
it.dumps.add(GeneratedDump(targetName,
526-
objects.fileProperty().fileProvider(buildTargetAbi.map { it.outputApiFile })))
527-
}
528-
mergeInferredTask.configure {
529-
it.dumps.add(GeneratedDump(targetName,
530-
objects.fileProperty().fileProvider(buildTargetAbi.map { it.outputApiFile })))
531-
}
541+
generatedDumps.add(GeneratedDump(
542+
currentTarget.toKlibTarget(),
543+
objects.fileProperty().fileProvider(buildTargetAbi.map { it.outputApiFile })))
532544
return@configureEach
533545
}
534546
// If the target is unsupported, the regular merge task will only depend on a task complaining about
@@ -542,22 +554,12 @@ private class KlibValidationPipelineBuilder(
542554
val proxy = unsupportedTargetDumpProxy(
543555
mainCompilation,
544556
klibApiDir, targetConfig,
545-
KlibTarget(extractUnderlyingTarget(currentTarget), currentTarget.targetName),
546-
apiBuildDir, supportedTargetsProvider
557+
currentTarget.toKlibTarget(),
558+
apiBuildDir
547559
)
548-
mergeInferredTask.configure {
549-
it.dumps.add(GeneratedDump(targetName,
550-
objects.fileProperty().fileProvider(proxy.map { it.outputFile })))
551-
}
552-
}
553-
mergeTask.configure {
554-
it.doFirst {
555-
if (supportedTargetsProvider.get().isEmpty()) {
556-
throw IllegalStateException(
557-
"KLib ABI dump/validation requires at least one enabled klib target, but none were found."
558-
)
559-
}
560-
}
560+
proxy.configure { it.dumps.addAll(generatedDumps) }
561+
inferredDumps.add(GeneratedDump(currentTarget.toKlibTarget(),
562+
objects.fileProperty().fileProvider(proxy.map { it.outputFile })))
561563
}
562564
}
563565

@@ -584,7 +586,7 @@ private class KlibValidationPipelineBuilder(
584586
true
585587
}
586588
}
587-
.map { KlibTarget(extractUnderlyingTarget(it), it.targetName) }
589+
.map { it.toKlibTarget() }
588590
.toSet()
589591
}
590592
}
@@ -639,8 +641,7 @@ private class KlibValidationPipelineBuilder(
639641
klibApiDir: Provider<File>,
640642
targetConfig: TargetConfig,
641643
unsupportedTarget: KlibTarget,
642-
apiBuildDir: File,
643-
supportedTargets: Provider<Set<KlibTarget>>
644+
apiBuildDir: File
644645
): TaskProvider<KotlinKlibInferAbiForUnsupportedTargetTask> {
645646
val targetName = targetConfig.targetName!!
646647
return project.task<KotlinKlibInferAbiForUnsupportedTargetTask>(targetConfig.apiTaskName("Infer")) {
@@ -650,12 +651,9 @@ private class KlibValidationPipelineBuilder(
650651
description = "Try to infer the dump for unsupported target $targetName using dumps " +
651652
"generated for supported targets."
652653
group = "other"
653-
this.supportedTargets.addAll(supportedTargets)
654654
inputImageFile = klibApiDir.get().resolve(klibDumpFileName)
655-
outputApiDir = apiBuildDir.toString()
656655
outputFile = apiBuildDir.resolve(klibDumpFileName)
657656
this.unsupportedTarget = unsupportedTarget
658-
dumpFileName = klibDumpFileName
659657
dependsOn(project.tasks.withType(KotlinKlibAbiBuildTask::class.java))
660658
}
661659
}
@@ -675,21 +673,6 @@ private val KotlinTarget.jvmBased: Boolean
675673
return platformType == KotlinPlatformType.jvm || platformType == KotlinPlatformType.androidJvm
676674
}
677675

678-
private fun extractUnderlyingTarget(target: KotlinTarget): String {
679-
if (target is KotlinNativeTarget) {
680-
return konanTargetNameMapping[target.konanTarget.name]!!
681-
}
682-
return when (target.platformType) {
683-
KotlinPlatformType.js -> "js"
684-
KotlinPlatformType.wasm -> when ((target as KotlinJsIrTarget).wasmTargetType) {
685-
KotlinWasmTargetType.WASI -> "wasmWasi"
686-
KotlinWasmTargetType.JS -> "wasmJs"
687-
else -> throw IllegalStateException("Unreachable")
688-
}
689-
else -> throw IllegalArgumentException("Unsupported platform type: ${target.platformType}")
690-
}
691-
}
692-
693676
private val Project.kotlinMultiplatform
694677
get() = extensions.getByName("kotlin") as KotlinMultiplatformExtension
695678

src/main/kotlin/KotlinKlibExtractSupportedTargetsAbiTask.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,6 @@ import java.io.File
1717
* Extracts dump for targets supported by the host compiler from a merged API dump stored in a project.
1818
*/
1919
internal abstract class KotlinKlibExtractSupportedTargetsAbiTask : DefaultTask() {
20-
@get:Internal
21-
internal val projectName = project.name
2220

2321
/**
2422
* Merged KLib dump that should be filtered by this task.

src/main/kotlin/KotlinKlibInferAbiForUnsupportedTargetTask.kt

Lines changed: 7 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -23,40 +23,24 @@ import java.io.File
2323
* The resulting dump is then used as an inferred dump for the unsupported target.
2424
*/
2525
internal abstract class KotlinKlibInferAbiForUnsupportedTargetTask : DefaultTask() {
26-
@get:Internal
27-
internal val projectName = project.name
28-
2926
/**
3027
* The name of a target to infer a dump for.
3128
*/
3229
@Input
3330
lateinit var unsupportedTarget: KlibTarget
3431

35-
/**
36-
* A root directory containing dumps successfully generated for each supported target.
37-
* It is assumed that this directory contains subdirectories named after targets.
38-
*/
39-
@InputFiles
40-
lateinit var outputApiDir: String
41-
4232
/**
4333
* Set of all supported targets.
4434
*/
45-
@get:Input
46-
val supportedTargets: ListProperty<KlibTarget> = project.objects.listProperty(KlibTarget::class.java)
35+
@Nested
36+
val dumps: ListProperty<GeneratedDump> = project.objects.listProperty(GeneratedDump::class.java)
4737

4838
/**
4939
* Previously generated merged ABI dump file, the golden image every dump should be verified against.
5040
*/
5141
@InputFiles
5242
lateinit var inputImageFile: File
5343

54-
/**
55-
* The name of a dump file.
56-
*/
57-
@Input
58-
lateinit var dumpFileName: String
59-
6044
/**
6145
* A path to an inferred dump file.
6246
*/
@@ -66,13 +50,15 @@ internal abstract class KotlinKlibInferAbiForUnsupportedTargetTask : DefaultTask
6650
@OptIn(ExperimentalBCVApi::class)
6751
@TaskAction
6852
internal fun generate() {
69-
val supportedTargetNames = supportedTargets.get().toSet()
53+
val availableDumps = dumps.get().map {
54+
it.target to it.dumpFile.asFile.get()
55+
}.filter { it.second.exists() }.toMap()
7056
// Find a set of supported targets that are closer to unsupported target in the hierarchy.
7157
// Note that dumps are stored using configurable name, but grouped by the canonical target name.
72-
val matchingTargets = findMatchingTargets(supportedTargetNames, unsupportedTarget)
58+
val matchingTargets = findMatchingTargets(availableDumps.keys, unsupportedTarget)
7359
// Load dumps that are a good fit for inference
7460
val supportedTargetDumps = matchingTargets.map { target ->
75-
val dumpFile = File(outputApiDir).parentFile.resolve(target.configurableName).resolve(dumpFileName)
61+
val dumpFile = availableDumps[target]!!
7662
KlibDump.from(dumpFile, target.configurableName).also {
7763
check(it.targets.single() == target)
7864
}

src/main/kotlin/KotlinKlibMergeAbiTask.kt

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,29 +6,18 @@
66
package kotlinx.validation
77

88
import kotlinx.validation.api.klib.KlibDump
9+
import kotlinx.validation.api.klib.KlibTarget
910
import kotlinx.validation.api.klib.saveTo
1011
import org.gradle.api.DefaultTask
1112
import org.gradle.api.file.RegularFileProperty
1213
import org.gradle.api.provider.ListProperty
1314
import org.gradle.api.tasks.*
1415
import java.io.File
15-
import java.io.Serializable
16-
17-
internal class GeneratedDump(
18-
@get:Input
19-
val targetName: String,
20-
21-
@get:InputFiles
22-
val dumpFile: RegularFileProperty
23-
) : Serializable
2416

2517
/**
2618
* Merges multiple individual KLib ABI dumps into a single merged dump.
2719
*/
2820
internal abstract class KotlinKlibMergeAbiTask : DefaultTask() {
29-
@get:Internal
30-
internal val projectName = project.name
31-
3221
@get:Nested
3322
val dumps: ListProperty<GeneratedDump> = project.objects.listProperty(GeneratedDump::class.java)
3423

@@ -52,7 +41,7 @@ internal abstract class KotlinKlibMergeAbiTask : DefaultTask() {
5241
dumps.get().forEach { dump ->
5342
val dumpFile = dump.dumpFile.asFile.get()
5443
if (dumpFile.exists()) {
55-
merge(dumpFile, dump.targetName)
44+
merge(dumpFile, dump.target.configurableName)
5645
}
5746
}
5847
}.saveTo(mergedFile)

0 commit comments

Comments
 (0)