From 0a7537212eda613f29a13fb59e04d17c014bd21b Mon Sep 17 00:00:00 2001 From: "Alexander.Likhachev" Date: Tue, 23 Jul 2024 14:43:25 +0200 Subject: [PATCH] Introduce a workaround for apiCheck similar to apiDump Also, update the dump to reflect the actual state of the Gradle plugin. Reorders entries in the dumps: https://github.com/Kotlin/binary-compatibility-validator/pull/225, https://github.com/Kotlin/binary-compatibility-validator/issues/196 Removes internal constants from the dump: https://github.com/Kotlin/binary-compatibility-validator/issues/90 Fixes #248 --- build.gradle | 5 + plugin/api/kotlinx-benchmark-plugin.api | 23 ++-- .../benchmark/gradle/BenchmarksPlugin.kt | 2 - .../api/kotlinx-benchmark-runtime.klib.api | 112 +++++++++++------- 4 files changed, 86 insertions(+), 56 deletions(-) diff --git a/build.gradle b/build.gradle index 0a180d49..19cc8d4b 100644 --- a/build.gradle +++ b/build.gradle @@ -58,6 +58,10 @@ tasks.register("apiDump") { it.dependsOn(gradle.includedBuild("plugin").task(":apiDump")) } +tasks.register("apiCheck") { + it.dependsOn(gradle.includedBuild("plugin").task(":apiCheck")) +} + afterEvaluate { gradle.includedBuilds.forEach { included -> project(":kotlinx-benchmark-runtime").tasks.named("publishToMavenLocal") { dependsOn(included.task(":publishToMavenLocal")) } @@ -110,4 +114,5 @@ tasks.register("checkReadme", CheckReadmeTask) { tasks.check { dependsOn(tasks.named("checkReadme")) + dependsOn(tasks.named("apiCheck")) } diff --git a/plugin/api/kotlinx-benchmark-plugin.api b/plugin/api/kotlinx-benchmark-plugin.api index cf5ad773..25230912 100644 --- a/plugin/api/kotlinx-benchmark-plugin.api +++ b/plugin/api/kotlinx-benchmark-plugin.api @@ -34,11 +34,12 @@ public class kotlinx/benchmark/gradle/BenchmarkTarget { public final fun setWorkingDir (Ljava/lang/String;)V } -public class kotlinx/benchmark/gradle/BenchmarksExtension { +public abstract class kotlinx/benchmark/gradle/BenchmarksExtension { public final fun configurations (Lgroovy/lang/Closure;)Lorg/gradle/api/NamedDomainObjectContainer; public final fun getBenchsDescriptionDir ()Ljava/lang/String; public final fun getBuildDir ()Ljava/lang/String; public final fun getConfigurations ()Lorg/gradle/api/NamedDomainObjectContainer; + public abstract fun getKotlinCompilerVersion ()Lorg/gradle/api/provider/Property; public final fun getProject ()Lorg/gradle/api/Project; public final fun getReportsDir ()Ljava/lang/String; public final fun getTargets ()Lorg/gradle/api/NamedDomainObjectContainer; @@ -56,15 +57,8 @@ public final class kotlinx/benchmark/gradle/BenchmarksExtensionKt { public abstract class kotlinx/benchmark/gradle/BenchmarksPlugin : org/gradle/api/Plugin { public static final field ASSEMBLE_BENCHMARKS_TASKNAME Ljava/lang/String; public static final field BENCHMARKS_TASK_GROUP Ljava/lang/String; - public static final field BENCHMARK_COMPILATION_SUFFIX Ljava/lang/String; - public static final field BENCHMARK_COMPILE_SUFFIX Ljava/lang/String; - public static final field BENCHMARK_EXEC_SUFFIX Ljava/lang/String; public static final field BENCHMARK_EXTENSION_NAME Ljava/lang/String; - public static final field BENCHMARK_GENERATE_SUFFIX Ljava/lang/String; - public static final field BENCHMARK_JAR_SUFFIX Ljava/lang/String; public static final field Companion Lkotlinx/benchmark/gradle/BenchmarksPlugin$Companion; - public static final field JMH_CORE_DEPENDENCY Ljava/lang/String; - public static final field JMH_GENERATOR_DEPENDENCY Ljava/lang/String; public static final field PLUGIN_ID Ljava/lang/String; public static final field PLUGIN_VERSION Ljava/lang/String; public static final field RUN_BENCHMARKS_TASKNAME Ljava/lang/String; @@ -111,7 +105,7 @@ public final class kotlinx/benchmark/gradle/JsBenchmarksExecutor : java/lang/Enu public static fun values ()[Lkotlinx/benchmark/gradle/JsBenchmarksExecutor; } -public class kotlinx/benchmark/gradle/JsSourceGeneratorTask : org/gradle/api/DefaultTask { +public abstract class kotlinx/benchmark/gradle/JsSourceGeneratorTask : org/gradle/api/DefaultTask { public field inputClassesDirs Lorg/gradle/api/file/FileCollection; public field inputDependencies Lorg/gradle/api/file/FileCollection; public field outputResourcesDir Ljava/io/File; @@ -122,6 +116,7 @@ public class kotlinx/benchmark/gradle/JsSourceGeneratorTask : org/gradle/api/Def public final fun getInputDependencies ()Lorg/gradle/api/file/FileCollection; public final fun getOutputResourcesDir ()Ljava/io/File; public final fun getOutputSourcesDir ()Ljava/io/File; + public abstract fun getRuntimeClasspath ()Lorg/gradle/api/file/ConfigurableFileCollection; public final fun getTitle ()Ljava/lang/String; public final fun getUseBenchmarkJs ()Z public final fun setInputClassesDirs (Lorg/gradle/api/file/FileCollection;)V @@ -140,7 +135,7 @@ public abstract class kotlinx/benchmark/gradle/JvmBenchmarkTarget : kotlinx/benc public class kotlinx/benchmark/gradle/KotlinJvmBenchmarkTarget : kotlinx/benchmark/gradle/JvmBenchmarkTarget { } -public class kotlinx/benchmark/gradle/NativeBenchmarkExec : org/gradle/api/DefaultTask { +public abstract class kotlinx/benchmark/gradle/NativeBenchmarkExec : org/gradle/api/DefaultTask { public field benchProgressPath Ljava/lang/String; public field benchsDescriptionDir Ljava/io/File; public field configFile Ljava/io/File; @@ -164,9 +159,11 @@ public class kotlinx/benchmark/gradle/NativeBenchmarkExec : org/gradle/api/Defau } public final class kotlinx/benchmark/gradle/NativeBenchmarkTarget : kotlinx/benchmark/gradle/BenchmarkTarget { + public final fun getBuildType ()Lorg/jetbrains/kotlin/gradle/plugin/mpp/NativeBuildType; + public final fun setBuildType (Lorg/jetbrains/kotlin/gradle/plugin/mpp/NativeBuildType;)V } -public class kotlinx/benchmark/gradle/NativeSourceGeneratorTask : org/gradle/api/DefaultTask { +public abstract class kotlinx/benchmark/gradle/NativeSourceGeneratorTask : org/gradle/api/DefaultTask { public field inputClassesDirs Lorg/gradle/api/file/FileCollection; public field inputDependencies Lorg/gradle/api/file/FileCollection; public field nativeTarget Ljava/lang/String; @@ -179,6 +176,7 @@ public class kotlinx/benchmark/gradle/NativeSourceGeneratorTask : org/gradle/api public final fun getNativeTarget ()Ljava/lang/String; public final fun getOutputResourcesDir ()Ljava/io/File; public final fun getOutputSourcesDir ()Ljava/io/File; + public abstract fun getRuntimeClasspath ()Lorg/gradle/api/file/ConfigurableFileCollection; public final fun getTitle ()Ljava/lang/String; public final fun setInputClassesDirs (Lorg/gradle/api/file/FileCollection;)V public final fun setInputDependencies (Lorg/gradle/api/file/FileCollection;)V @@ -196,7 +194,7 @@ public final class kotlinx/benchmark/gradle/UtilsKt$sam$i$org_gradle_api_Action$ public final class kotlinx/benchmark/gradle/WasmBenchmarkTarget : kotlinx/benchmark/gradle/BenchmarkTarget { } -public class kotlinx/benchmark/gradle/WasmSourceGeneratorTask : org/gradle/api/DefaultTask { +public abstract class kotlinx/benchmark/gradle/WasmSourceGeneratorTask : org/gradle/api/DefaultTask { public field inputClassesDirs Lorg/gradle/api/file/FileCollection; public field inputDependencies Lorg/gradle/api/file/FileCollection; public field outputResourcesDir Ljava/io/File; @@ -207,6 +205,7 @@ public class kotlinx/benchmark/gradle/WasmSourceGeneratorTask : org/gradle/api/D public final fun getInputDependencies ()Lorg/gradle/api/file/FileCollection; public final fun getOutputResourcesDir ()Ljava/io/File; public final fun getOutputSourcesDir ()Ljava/io/File; + public abstract fun getRuntimeClasspath ()Lorg/gradle/api/file/ConfigurableFileCollection; public final fun getTitle ()Ljava/lang/String; public final fun setInputClassesDirs (Lorg/gradle/api/file/FileCollection;)V public final fun setInputDependencies (Lorg/gradle/api/file/FileCollection;)V diff --git a/plugin/main/src/kotlinx/benchmark/gradle/BenchmarksPlugin.kt b/plugin/main/src/kotlinx/benchmark/gradle/BenchmarksPlugin.kt index a3d11005..5cf0b49b 100644 --- a/plugin/main/src/kotlinx/benchmark/gradle/BenchmarksPlugin.kt +++ b/plugin/main/src/kotlinx/benchmark/gradle/BenchmarksPlugin.kt @@ -30,8 +30,6 @@ constructor( const val ASSEMBLE_BENCHMARKS_TASKNAME = "assembleBenchmarks" //region Internal constants - // Note that despite the @InternalApi annotation, `const val`s are still present in the API Dump - // https://github.com/Kotlin/binary-compatibility-validator/issues/90 @KotlinxBenchmarkPluginInternalApi const val BENCHMARK_GENERATE_SUFFIX = "BenchmarkGenerate" diff --git a/runtime/api/kotlinx-benchmark-runtime.klib.api b/runtime/api/kotlinx-benchmark-runtime.klib.api index bf7470ef..4da8e38b 100644 --- a/runtime/api/kotlinx-benchmark-runtime.klib.api +++ b/runtime/api/kotlinx-benchmark-runtime.klib.api @@ -6,61 +6,24 @@ // - Show declarations: true // Library unique name: -final class kotlinx.benchmark/Blackhole { // kotlinx.benchmark/Blackhole|null[0] - constructor () // kotlinx.benchmark/Blackhole.|(){}[0] - final inline fun consume(kotlin/Any?) // kotlinx.benchmark/Blackhole.consume|consume(kotlin.Any?){}[0] - final inline fun consume(kotlin/Boolean) // kotlinx.benchmark/Blackhole.consume|consume(kotlin.Boolean){}[0] - final inline fun consume(kotlin/Byte) // kotlinx.benchmark/Blackhole.consume|consume(kotlin.Byte){}[0] - final inline fun consume(kotlin/Char) // kotlinx.benchmark/Blackhole.consume|consume(kotlin.Char){}[0] - final inline fun consume(kotlin/Double) // kotlinx.benchmark/Blackhole.consume|consume(kotlin.Double){}[0] - final inline fun consume(kotlin/Float) // kotlinx.benchmark/Blackhole.consume|consume(kotlin.Float){}[0] - final inline fun consume(kotlin/Int) // kotlinx.benchmark/Blackhole.consume|consume(kotlin.Int){}[0] - final inline fun consume(kotlin/Long) // kotlinx.benchmark/Blackhole.consume|consume(kotlin.Long){}[0] - final inline fun consume(kotlin/Short) // kotlinx.benchmark/Blackhole.consume|consume(kotlin.Short){}[0] - // Targets: [js.jsIr, wasmJs] - final fun consumeAny(kotlin/Any?) // kotlinx.benchmark/Blackhole.consumeAny|consumeAny(kotlin.Any?){}[0] - // Targets: [js.jsIr, wasmJs] - final fun consumeInt(kotlin/Int) // kotlinx.benchmark/Blackhole.consumeInt|consumeInt(kotlin.Int){}[0] -} -final enum class kotlinx.benchmark/BenchmarkTimeUnit : kotlin/Enum { // kotlinx.benchmark/BenchmarkTimeUnit|null[0] - enum entry MICROSECONDS // kotlinx.benchmark/BenchmarkTimeUnit.MICROSECONDS|null[0] - enum entry MILLISECONDS // kotlinx.benchmark/BenchmarkTimeUnit.MILLISECONDS|null[0] - enum entry MINUTES // kotlinx.benchmark/BenchmarkTimeUnit.MINUTES|null[0] - enum entry NANOSECONDS // kotlinx.benchmark/BenchmarkTimeUnit.NANOSECONDS|null[0] - enum entry SECONDS // kotlinx.benchmark/BenchmarkTimeUnit.SECONDS|null[0] - final fun valueOf(kotlin/String): kotlinx.benchmark/BenchmarkTimeUnit // kotlinx.benchmark/BenchmarkTimeUnit.valueOf|valueOf#static(kotlin.String){}[0] - final fun values(): kotlin/Array // kotlinx.benchmark/BenchmarkTimeUnit.values|values#static(){}[0] - final val entries // kotlinx.benchmark/BenchmarkTimeUnit.entries|#static{}entries[0] - final fun (): kotlin.enums/EnumEntries // kotlinx.benchmark/BenchmarkTimeUnit.entries.|#static(){}[0] -} -final enum class kotlinx.benchmark/Mode : kotlin/Enum { // kotlinx.benchmark/Mode|null[0] - enum entry AverageTime // kotlinx.benchmark/Mode.AverageTime|null[0] - enum entry Throughput // kotlinx.benchmark/Mode.Throughput|null[0] - final fun valueOf(kotlin/String): kotlinx.benchmark/Mode // kotlinx.benchmark/Mode.valueOf|valueOf#static(kotlin.String){}[0] - final fun values(): kotlin/Array // kotlinx.benchmark/Mode.values|values#static(){}[0] - final val entries // kotlinx.benchmark/Mode.entries|#static{}entries[0] - final fun (): kotlin.enums/EnumEntries // kotlinx.benchmark/Mode.entries.|#static(){}[0] -} -final enum class kotlinx.benchmark/Scope : kotlin/Enum { // kotlinx.benchmark/Scope|null[0] - enum entry Benchmark // kotlinx.benchmark/Scope.Benchmark|null[0] - final fun valueOf(kotlin/String): kotlinx.benchmark/Scope // kotlinx.benchmark/Scope.valueOf|valueOf#static(kotlin.String){}[0] - final fun values(): kotlin/Array // kotlinx.benchmark/Scope.values|values#static(){}[0] - final val entries // kotlinx.benchmark/Scope.entries|#static{}entries[0] - final fun (): kotlin.enums/EnumEntries // kotlinx.benchmark/Scope.entries.|#static(){}[0] -} open annotation class kotlinx.benchmark.internal/KotlinxBenchmarkRuntimeInternalApi : kotlin/Annotation { // kotlinx.benchmark.internal/KotlinxBenchmarkRuntimeInternalApi|null[0] constructor () // kotlinx.benchmark.internal/KotlinxBenchmarkRuntimeInternalApi.|(){}[0] } + open annotation class kotlinx.benchmark/Benchmark : kotlin/Annotation { // kotlinx.benchmark/Benchmark|null[0] constructor () // kotlinx.benchmark/Benchmark.|(){}[0] } + open annotation class kotlinx.benchmark/BenchmarkMode : kotlin/Annotation { // kotlinx.benchmark/BenchmarkMode|null[0] constructor (kotlin/Array...) // kotlinx.benchmark/BenchmarkMode.|(kotlin.Array...){}[0] + final val value // kotlinx.benchmark/BenchmarkMode.value|{}value[0] final fun (): kotlin/Array // kotlinx.benchmark/BenchmarkMode.value.|(){}[0] } + open annotation class kotlinx.benchmark/Measurement : kotlin/Annotation { // kotlinx.benchmark/Measurement|null[0] constructor (kotlin/Int =..., kotlin/Int =..., kotlinx.benchmark/BenchmarkTimeUnit =..., kotlin/Int =...) // kotlinx.benchmark/Measurement.|(kotlin.Int;kotlin.Int;kotlinx.benchmark.BenchmarkTimeUnit;kotlin.Int){}[0] + final val batchSize // kotlinx.benchmark/Measurement.batchSize|{}batchSize[0] final fun (): kotlin/Int // kotlinx.benchmark/Measurement.batchSize.|(){}[0] final val iterations // kotlinx.benchmark/Measurement.iterations|{}iterations[0] @@ -70,29 +33,39 @@ open annotation class kotlinx.benchmark/Measurement : kotlin/Annotation { // kot final val timeUnit // kotlinx.benchmark/Measurement.timeUnit|{}timeUnit[0] final fun (): kotlinx.benchmark/BenchmarkTimeUnit // kotlinx.benchmark/Measurement.timeUnit.|(){}[0] } + open annotation class kotlinx.benchmark/OutputTimeUnit : kotlin/Annotation { // kotlinx.benchmark/OutputTimeUnit|null[0] constructor (kotlinx.benchmark/BenchmarkTimeUnit) // kotlinx.benchmark/OutputTimeUnit.|(kotlinx.benchmark.BenchmarkTimeUnit){}[0] + final val value // kotlinx.benchmark/OutputTimeUnit.value|{}value[0] final fun (): kotlinx.benchmark/BenchmarkTimeUnit // kotlinx.benchmark/OutputTimeUnit.value.|(){}[0] } + open annotation class kotlinx.benchmark/Param : kotlin/Annotation { // kotlinx.benchmark/Param|null[0] constructor (kotlin/Array...) // kotlinx.benchmark/Param.|(kotlin.Array...){}[0] + final val value // kotlinx.benchmark/Param.value|{}value[0] final fun (): kotlin/Array // kotlinx.benchmark/Param.value.|(){}[0] } + open annotation class kotlinx.benchmark/Setup : kotlin/Annotation { // kotlinx.benchmark/Setup|null[0] constructor () // kotlinx.benchmark/Setup.|(){}[0] } + open annotation class kotlinx.benchmark/State : kotlin/Annotation { // kotlinx.benchmark/State|null[0] constructor (kotlinx.benchmark/Scope) // kotlinx.benchmark/State.|(kotlinx.benchmark.Scope){}[0] + final val value // kotlinx.benchmark/State.value|{}value[0] final fun (): kotlinx.benchmark/Scope // kotlinx.benchmark/State.value.|(){}[0] } + open annotation class kotlinx.benchmark/TearDown : kotlin/Annotation { // kotlinx.benchmark/TearDown|null[0] constructor () // kotlinx.benchmark/TearDown.|(){}[0] } + open annotation class kotlinx.benchmark/Warmup : kotlin/Annotation { // kotlinx.benchmark/Warmup|null[0] constructor (kotlin/Int =..., kotlin/Int =..., kotlinx.benchmark/BenchmarkTimeUnit =..., kotlin/Int =...) // kotlinx.benchmark/Warmup.|(kotlin.Int;kotlin.Int;kotlinx.benchmark.BenchmarkTimeUnit;kotlin.Int){}[0] + final val batchSize // kotlinx.benchmark/Warmup.batchSize|{}batchSize[0] final fun (): kotlin/Int // kotlinx.benchmark/Warmup.batchSize.|(){}[0] final val iterations // kotlinx.benchmark/Warmup.iterations|{}iterations[0] @@ -102,3 +75,58 @@ open annotation class kotlinx.benchmark/Warmup : kotlin/Annotation { // kotlinx. final val timeUnit // kotlinx.benchmark/Warmup.timeUnit|{}timeUnit[0] final fun (): kotlinx.benchmark/BenchmarkTimeUnit // kotlinx.benchmark/Warmup.timeUnit.|(){}[0] } + +final enum class kotlinx.benchmark/BenchmarkTimeUnit : kotlin/Enum { // kotlinx.benchmark/BenchmarkTimeUnit|null[0] + enum entry MICROSECONDS // kotlinx.benchmark/BenchmarkTimeUnit.MICROSECONDS|null[0] + enum entry MILLISECONDS // kotlinx.benchmark/BenchmarkTimeUnit.MILLISECONDS|null[0] + enum entry MINUTES // kotlinx.benchmark/BenchmarkTimeUnit.MINUTES|null[0] + enum entry NANOSECONDS // kotlinx.benchmark/BenchmarkTimeUnit.NANOSECONDS|null[0] + enum entry SECONDS // kotlinx.benchmark/BenchmarkTimeUnit.SECONDS|null[0] + + final val entries // kotlinx.benchmark/BenchmarkTimeUnit.entries|#static{}entries[0] + final fun (): kotlin.enums/EnumEntries // kotlinx.benchmark/BenchmarkTimeUnit.entries.|#static(){}[0] + + final fun valueOf(kotlin/String): kotlinx.benchmark/BenchmarkTimeUnit // kotlinx.benchmark/BenchmarkTimeUnit.valueOf|valueOf#static(kotlin.String){}[0] + final fun values(): kotlin/Array // kotlinx.benchmark/BenchmarkTimeUnit.values|values#static(){}[0] +} + +final enum class kotlinx.benchmark/Mode : kotlin/Enum { // kotlinx.benchmark/Mode|null[0] + enum entry AverageTime // kotlinx.benchmark/Mode.AverageTime|null[0] + enum entry Throughput // kotlinx.benchmark/Mode.Throughput|null[0] + + final val entries // kotlinx.benchmark/Mode.entries|#static{}entries[0] + final fun (): kotlin.enums/EnumEntries // kotlinx.benchmark/Mode.entries.|#static(){}[0] + + final fun valueOf(kotlin/String): kotlinx.benchmark/Mode // kotlinx.benchmark/Mode.valueOf|valueOf#static(kotlin.String){}[0] + final fun values(): kotlin/Array // kotlinx.benchmark/Mode.values|values#static(){}[0] +} + +final enum class kotlinx.benchmark/Scope : kotlin/Enum { // kotlinx.benchmark/Scope|null[0] + enum entry Benchmark // kotlinx.benchmark/Scope.Benchmark|null[0] + + final val entries // kotlinx.benchmark/Scope.entries|#static{}entries[0] + final fun (): kotlin.enums/EnumEntries // kotlinx.benchmark/Scope.entries.|#static(){}[0] + + final fun valueOf(kotlin/String): kotlinx.benchmark/Scope // kotlinx.benchmark/Scope.valueOf|valueOf#static(kotlin.String){}[0] + final fun values(): kotlin/Array // kotlinx.benchmark/Scope.values|values#static(){}[0] +} + +final class kotlinx.benchmark/Blackhole { // kotlinx.benchmark/Blackhole|null[0] + constructor () // kotlinx.benchmark/Blackhole.|(){}[0] + + final inline fun consume(kotlin/Any?) // kotlinx.benchmark/Blackhole.consume|consume(kotlin.Any?){}[0] + final inline fun consume(kotlin/Boolean) // kotlinx.benchmark/Blackhole.consume|consume(kotlin.Boolean){}[0] + final inline fun consume(kotlin/Byte) // kotlinx.benchmark/Blackhole.consume|consume(kotlin.Byte){}[0] + final inline fun consume(kotlin/Char) // kotlinx.benchmark/Blackhole.consume|consume(kotlin.Char){}[0] + final inline fun consume(kotlin/Double) // kotlinx.benchmark/Blackhole.consume|consume(kotlin.Double){}[0] + final inline fun consume(kotlin/Float) // kotlinx.benchmark/Blackhole.consume|consume(kotlin.Float){}[0] + final inline fun consume(kotlin/Int) // kotlinx.benchmark/Blackhole.consume|consume(kotlin.Int){}[0] + final inline fun consume(kotlin/Long) // kotlinx.benchmark/Blackhole.consume|consume(kotlin.Long){}[0] + final inline fun consume(kotlin/Short) // kotlinx.benchmark/Blackhole.consume|consume(kotlin.Short){}[0] + + // Targets: [js.jsIr, wasmJs] + final fun consumeAny(kotlin/Any?) // kotlinx.benchmark/Blackhole.consumeAny|consumeAny(kotlin.Any?){}[0] + + // Targets: [js.jsIr, wasmJs] + final fun consumeInt(kotlin/Int) // kotlinx.benchmark/Blackhole.consumeInt|consumeInt(kotlin.Int){}[0] +}