diff --git a/README.md b/README.md index ca01308..e482d4b 100644 --- a/README.md +++ b/README.md @@ -3,20 +3,22 @@ # Kotlin Binary Compatibility Validator (Mirror Universe) -[BCV-MU](https://github.com/adamko-dev/kotlin-binary-compatibility-validator-mu) is a -re-imagined [Gradle](https://gradle.org/) Plugin for -[Kotlin/binary-compatibility-validator](https://github.com/Kotlin/binary-compatibility-validator). +[BCV-MU](https://github.com/adamko-dev/kotlin-binary-compatibility-validator-mu) +is a [Gradle](https://gradle.org/) Plugin that validates the public JVM binary API of libraries, to +make sure that breaking changes are tracked. -This plugin validates the public JVM binary API of libraries to make sure that breaking changes are -tracked. +BCV-MU is based on +[Kotlin/binary-compatibility-validator](https://github.com/Kotlin/binary-compatibility-validator), +and contains improvements to better work with the Gradle API, especially in large projects. -Read more in the BCV project: +Read more about the validation of the public API in the BCV project: * [What constitutes the public API?](https://github.com/Kotlin/binary-compatibility-validator/#what-constitutes-the-public-api) * [What makes an incompatible change to the public binary API?](https://github.com/Kotlin/binary-compatibility-validator/#what-makes-an-incompatible-change-to-the-public-binary-api) -(The [Mirror Universe](https://en.wikipedia.org/wiki/Mirror_Universe) tag was chosen because I hope -to banish this plugin as soon the improvements here are merged upstream.) +(The MU tag was chosen because I hope to banish this plugin to the +[Mirror Universe](https://en.wikipedia.org/wiki/Mirror_Universe) +as soon the improvements here are merged upstream.) ### Description @@ -30,7 +32,7 @@ or (**experimentally**) [as a Settings plugin](#settings-plugin) in `settings.gr The minimal supported Gradle version is 7.6. -By default, BCV-MU uses BCV version `0.13.0`, which can be overridden, but may introduce runtime +By default, BCV-MU uses BCV version `0.13.1`, which can be overridden, but may introduce runtime errors. ### Build plugin @@ -75,6 +77,14 @@ plugins { } binaryCompatibilityValidator { + + // Explicitly include specific classes, markers, or packages. + // If any class, marker, or package is defined then all other declarations will be excluded. + // If no explicit public declarations are defined, then all declarations will be included by default. + publicClasses.add("com.company.api.FooPublicClass") + publicMarkers.add("com.company.api.ExplicitApiAnnotation") + publicPackages.add("com.company.api") + // Packages that are excluded from public API dumps even if they contain public API. ignoredPackages.add("kotlinx.coroutines.internal") // Classes (fully qualified) that are excluded from public API dumps even if they contain public API. @@ -88,14 +98,14 @@ binaryCompatibilityValidator { bcvEnabled.set(true) // Override the default BCV version - kotlinxBinaryCompatibilityValidatorVersion.set("0.13.0") + kotlinxBinaryCompatibilityValidatorVersion.set("0.13.1") } ``` ##### Advanced configuration -BCV automatically generates 'targets' for each Kotlin/JVM target that it finds. -These targets can be specifically modified, or manually defined, for fine-grained control. +BCV automatically generates 'targets' for each Kotlin/JVM source set that it finds. +these `BCVTarget`s can be specifically modified, or manually defined, for fine-grained control. ```kotlin // build.gradle.kts diff --git a/build.gradle.kts b/build.gradle.kts index 83d923b..84cda03 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -6,12 +6,10 @@ plugins { } group = "dev.adamko.kotlin.binary_compatibility_validator" -version = "0.0.4" +version = "0.0.5" idea { module { - isDownloadSources = true - isDownloadJavadoc = false excludeGeneratedGradleDsl(layout) excludeDirs = excludeDirs + layout.files( ".idea", diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index 2e44743..1d243d8 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -14,6 +14,6 @@ dependencies { java { toolchain { - languageVersion.set(JavaLanguageVersion.of(11)) + languageVersion = JavaLanguageVersion.of(11) } } diff --git a/buildSrc/settings.gradle.kts b/buildSrc/settings.gradle.kts index a768971..a1038fe 100644 --- a/buildSrc/settings.gradle.kts +++ b/buildSrc/settings.gradle.kts @@ -2,15 +2,15 @@ rootProject.name = "buildSrc" pluginManagement { repositories { - gradlePluginPortal() mavenCentral() + gradlePluginPortal() } } @Suppress("UnstableApiUsage") dependencyResolutionManagement { - repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS) + repositoriesMode = RepositoriesMode.PREFER_SETTINGS repositories { mavenCentral() diff --git a/buildSrc/src/main/kotlin/buildsrc/conventions/java-base.gradle.kts b/buildSrc/src/main/kotlin/buildsrc/conventions/java-base.gradle.kts index 22ac817..9b1f10d 100644 --- a/buildSrc/src/main/kotlin/buildsrc/conventions/java-base.gradle.kts +++ b/buildSrc/src/main/kotlin/buildsrc/conventions/java-base.gradle.kts @@ -13,7 +13,7 @@ plugins { extensions.getByType().apply { toolchain { - languageVersion.set(JavaLanguageVersion.of(11)) + languageVersion = JavaLanguageVersion.of(11) } withSourcesJar() } diff --git a/buildSrc/src/main/kotlin/buildsrc/conventions/kotlin-gradle-plugin.gradle.kts b/buildSrc/src/main/kotlin/buildsrc/conventions/kotlin-gradle-plugin.gradle.kts index 97344fe..2382654 100644 --- a/buildSrc/src/main/kotlin/buildsrc/conventions/kotlin-gradle-plugin.gradle.kts +++ b/buildSrc/src/main/kotlin/buildsrc/conventions/kotlin-gradle-plugin.gradle.kts @@ -9,7 +9,7 @@ plugins { } tasks.validatePlugins { - enableStricterValidation.set(true) + enableStricterValidation = true } sourceSets { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 572511c..037b15b 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -5,7 +5,7 @@ kotlinGradle = "1.6.0" javaDiffUtils = "4.12" junit = "5.9.2" kotest = "5.5.5" -kotlinx-bcv = "0.13.0" +kotlinx-bcv = "0.13.1" gradlePluginPublishPlugin = "1.1.0" shadowPlugin = "8.1.0" diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 943f0cb..ccebba7 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index fc10b60..37aef8d 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 65dcd68..79a61d4 100755 --- a/gradlew +++ b/gradlew @@ -144,7 +144,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac @@ -152,7 +152,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then '' | soft) :;; #( *) # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac diff --git a/modules/bcv-gradle-plugin-functional-tests/build.gradle.kts b/modules/bcv-gradle-plugin-functional-tests/build.gradle.kts index aa4051d..a83f050 100644 --- a/modules/bcv-gradle-plugin-functional-tests/build.gradle.kts +++ b/modules/bcv-gradle-plugin-functional-tests/build.gradle.kts @@ -23,7 +23,6 @@ dependencies { testFixturesApi(testFixtures(projects.modules.bcvGradlePlugin)) } - @Suppress("UnstableApiUsage") testing.suites { withType().configureEach { diff --git a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/kotlin/kotlinx/validation/test/JavaTestFixturesTest.kt b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/kotlin/kotlinx/validation/test/JavaTestFixturesTest.kt index 82393cb..ee1b56d 100644 --- a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/kotlin/kotlinx/validation/test/JavaTestFixturesTest.kt +++ b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/kotlin/kotlinx/validation/test/JavaTestFixturesTest.kt @@ -125,7 +125,7 @@ private fun FunSpec.createTestFixturesProject( buildGradleKts = """ |plugins { | kotlin("jvm") version "1.7.10" - | id("dev.adamko.kotlin.binary-compatibility-validator") version "0.0.4-SNAPSHOT" + | id("dev.adamko.kotlin.binary-compatibility-validator") version "0.0.5" | `java-test-fixtures` |} | diff --git a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/kotlin/kotlinx/validation/test/MixedMarkersTest.kt b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/kotlin/kotlinx/validation/test/MixedMarkersTest.kt new file mode 100644 index 0000000..30539e6 --- /dev/null +++ b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/kotlin/kotlinx/validation/test/MixedMarkersTest.kt @@ -0,0 +1,36 @@ +package kotlinx.validation.test + +import dev.adamko.kotlin.binary_compatibility_validator.test.utils.api.* +import dev.adamko.kotlin.binary_compatibility_validator.test.utils.build +import dev.adamko.kotlin.binary_compatibility_validator.test.utils.shouldHaveTaskWithOutcome +import org.gradle.testkit.runner.TaskOutcome.SUCCESS +import org.junit.jupiter.api.Test + +class MixedMarkersTest : BaseKotlinGradleTest() { + + @Test + fun testMixedMarkers() { + val runner = test { + buildGradleKts { + resolve("/examples/gradle/base/withPlugin.gradle.kts") + resolve("/examples/gradle/configuration/publicMarkers/mixedMarkers.gradle.kts") + } + + kotlin("MixedAnnotations.kt") { + resolve("/examples/classes/MixedAnnotations.kt") + } + + apiFile(projectName = rootProjectDir.name) { + resolve("/examples/classes/MixedAnnotations.dump") + } + + runner { + arguments.add(":apiCheck") + } + } + + runner.build { + shouldHaveTaskWithOutcome(":apiCheck", SUCCESS) + } + } +} diff --git a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/kotlin/kotlinx/validation/test/NonPublicMarkersTest.kt b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/kotlin/kotlinx/validation/test/NonPublicMarkersTest.kt index 9406296..9f39c8e 100644 --- a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/kotlin/kotlinx/validation/test/NonPublicMarkersTest.kt +++ b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/kotlin/kotlinx/validation/test/NonPublicMarkersTest.kt @@ -2,7 +2,6 @@ package kotlinx.validation.test import dev.adamko.kotlin.binary_compatibility_validator.test.utils.api.* import dev.adamko.kotlin.binary_compatibility_validator.test.utils.build -import dev.adamko.kotlin.binary_compatibility_validator.test.utils.shouldHaveOutcome import dev.adamko.kotlin.binary_compatibility_validator.test.utils.shouldHaveTaskWithOutcome import org.gradle.testkit.runner.TaskOutcome.SUCCESS import org.junit.jupiter.api.Test diff --git a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/kotlin/kotlinx/validation/test/PublicMarkersTest.kt b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/kotlin/kotlinx/validation/test/PublicMarkersTest.kt new file mode 100644 index 0000000..dea8f24 --- /dev/null +++ b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/kotlin/kotlinx/validation/test/PublicMarkersTest.kt @@ -0,0 +1,40 @@ +package kotlinx.validation.test + +import dev.adamko.kotlin.binary_compatibility_validator.test.utils.api.* +import dev.adamko.kotlin.binary_compatibility_validator.test.utils.build +import dev.adamko.kotlin.binary_compatibility_validator.test.utils.shouldHaveTaskWithOutcome +import org.gradle.testkit.runner.TaskOutcome.SUCCESS +import org.junit.jupiter.api.Test + +class PublicMarkersTest : BaseKotlinGradleTest() { + + @Test + fun testPublicMarkers() { + val runner = test { + buildGradleKts { + resolve("/examples/gradle/base/withPlugin.gradle.kts") + resolve("/examples/gradle/configuration/publicMarkers/markers.gradle.kts") + } + + kotlin("ClassWithPublicMarkers.kt") { + resolve("/examples/classes/ClassWithPublicMarkers.kt") + } + + kotlin("ClassInPublicPackage.kt") { + resolve("/examples/classes/ClassInPublicPackage.kt") + } + + apiFile(projectName = rootProjectDir.name) { + resolve("/examples/classes/ClassWithPublicMarkers.dump") + } + + runner { + arguments.add(":apiCheck") + } + } + + runner.build { + shouldHaveTaskWithOutcome(":apiCheck", SUCCESS) + } + } +} diff --git a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/kotlin/kotlinx/validation/test/SettingsPluginDslTest.kt b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/kotlin/kotlinx/validation/test/SettingsPluginDslTest.kt index 5712881..851860e 100644 --- a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/kotlin/kotlinx/validation/test/SettingsPluginDslTest.kt +++ b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/kotlin/kotlinx/validation/test/SettingsPluginDslTest.kt @@ -154,7 +154,7 @@ buildscript { plugins { - id("dev.adamko.kotlin.binary-compatibility-validator") version "0.0.4-SNAPSHOT" + id("dev.adamko.kotlin.binary-compatibility-validator") version "0.0.5" } include( diff --git a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/classes/AnotherBuildConfig.kt b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/classes/AnotherBuildConfig.kt index 50e638b..037e50d 100644 --- a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/classes/AnotherBuildConfig.kt +++ b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/classes/AnotherBuildConfig.kt @@ -1,12 +1,7 @@ -/* - * Copyright 2016-2020 JetBrains s.r.o. - * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file. - */ - package org.different.pack public class BuildConfig { - public val p1 = 1 + public val p1 = 1 - public fun f1() = p1 -} \ No newline at end of file + public fun f1() = p1 +} diff --git a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/classes/BuildConfig.kt b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/classes/BuildConfig.kt index 09cc036..abfc35f 100644 --- a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/classes/BuildConfig.kt +++ b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/classes/BuildConfig.kt @@ -1,12 +1,7 @@ -/* - * Copyright 2016-2020 JetBrains s.r.o. - * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file. - */ - package com.company public class BuildConfig { - public val property = 1 + public val property = 1 - public fun function() = property -} \ No newline at end of file + public fun function() = property +} diff --git a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/classes/ClassInPublicPackage.kt b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/classes/ClassInPublicPackage.kt new file mode 100644 index 0000000..0cb91b5 --- /dev/null +++ b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/classes/ClassInPublicPackage.kt @@ -0,0 +1,5 @@ +package foo.api + +class ClassInPublicPackage { + class Inner +} diff --git a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/classes/ClassWithPublicMarkers.dump b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/classes/ClassWithPublicMarkers.dump new file mode 100644 index 0000000..89b68db --- /dev/null +++ b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/classes/ClassWithPublicMarkers.dump @@ -0,0 +1,23 @@ +public final class foo/ClassWithPublicMarkers { + public final fun getBar1 ()I + public final fun getBar2 ()I + public final fun setBar1 (I)V + public final fun setBar2 (I)V +} + +public final class foo/ClassWithPublicMarkers$MarkedClass { + public fun ()V + public final fun getBar1 ()I +} + +public abstract interface annotation class foo/PublicClass : java/lang/annotation/Annotation { +} + +public final class foo/api/ClassInPublicPackage { + public fun ()V +} + +public final class foo/api/ClassInPublicPackage$Inner { + public fun ()V +} + diff --git a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/classes/ClassWithPublicMarkers.kt b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/classes/ClassWithPublicMarkers.kt new file mode 100644 index 0000000..96e5769 --- /dev/null +++ b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/classes/ClassWithPublicMarkers.kt @@ -0,0 +1,27 @@ +package foo + +@Target(AnnotationTarget.CLASS) +annotation class PublicClass + +@Target(AnnotationTarget.FIELD) +annotation class PublicField + +@Target(AnnotationTarget.PROPERTY) +annotation class PublicProperty + +public class ClassWithPublicMarkers { + @PublicField + var bar1 = 42 + + @PublicProperty + var bar2 = 42 + + @PublicClass + class MarkedClass { + val bar1 = 41 + } + + var notMarkedPublic = 42 + + class NotMarkedClass +} diff --git a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/classes/JavaLib.java b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/classes/JavaLib.java index d13c4a5..e358341 100644 --- a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/classes/JavaLib.java +++ b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/classes/JavaLib.java @@ -1,8 +1,3 @@ -/* - * Copyright 2016-2022 JetBrains s.r.o. - * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file. - */ - package examples.classes; public final class JavaLib { diff --git a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/classes/KotlinLib.kt b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/classes/KotlinLib.kt index 0945cd3..da6258d 100644 --- a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/classes/KotlinLib.kt +++ b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/classes/KotlinLib.kt @@ -1,13 +1,8 @@ -/* - * Copyright 2016-2022 JetBrains s.r.o. - * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file. - */ - package examples.classes class KotlinLib { - fun foo(): String = "foo" - internal fun bar(): String = "bar" + fun foo(): String = "foo" + internal fun bar(): String = "bar" } diff --git a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/classes/MixedAnnotations.dump b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/classes/MixedAnnotations.dump new file mode 100644 index 0000000..9d7982f --- /dev/null +++ b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/classes/MixedAnnotations.dump @@ -0,0 +1,5 @@ +public final class mixed/MarkedPublicWithPrivateMembers { + public fun ()V + public final fun otherFun ()V +} + diff --git a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/classes/MixedAnnotations.kt b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/classes/MixedAnnotations.kt new file mode 100644 index 0000000..07fbb95 --- /dev/null +++ b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/classes/MixedAnnotations.kt @@ -0,0 +1,54 @@ +package mixed + +@Target( + AnnotationTarget.CLASS, + AnnotationTarget.PROPERTY, + AnnotationTarget.FIELD, + AnnotationTarget.FUNCTION +) +annotation class PublicApi + +@Target( + AnnotationTarget.CLASS, + AnnotationTarget.PROPERTY, + AnnotationTarget.FIELD, + AnnotationTarget.FUNCTION +) +annotation class PrivateApi + +@PublicApi +class MarkedPublicWithPrivateMembers { + @PrivateApi + var private1 = 42 + + @field:PrivateApi + var private2 = 15 + + @PrivateApi + fun privateFun() = Unit + + @PublicApi + @PrivateApi + fun privateFun2() = Unit + + fun otherFun() = Unit +} + +// Member annotations should be ignored in explicitly private classes +@PrivateApi +class MarkedPrivateWithPublicMembers { + @PublicApi + var public1 = 42 + + @field:PublicApi + var public2 = 15 + + @PublicApi + fun publicFun() = Unit + + fun otherFun() = Unit +} + +@PrivateApi +@PublicApi +class PublicAndPrivateFilteredOut diff --git a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/classes/Properties.kt b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/classes/Properties.kt index d412d7c..1830e3b 100644 --- a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/classes/Properties.kt +++ b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/classes/Properties.kt @@ -1,7 +1,3 @@ -/* - * Copyright 2016-2022 JetBrains s.r.o. - * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file. - */ package foo @Target(AnnotationTarget.FIELD) @@ -11,10 +7,9 @@ annotation class HiddenField annotation class HiddenProperty public class ClassWithProperties { - @HiddenField - var bar1 = 42 + @HiddenField + var bar1 = 42 - @HiddenProperty - var bar2 = 42 + @HiddenProperty + var bar2 = 42 } - diff --git a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/classes/Subsub1Class.kt b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/classes/Subsub1Class.kt index 6ae96d6..7c16bea 100644 --- a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/classes/Subsub1Class.kt +++ b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/classes/Subsub1Class.kt @@ -1,10 +1,5 @@ -/* - * Copyright 2016-2021 JetBrains s.r.o. - * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file. - */ - package com.company.subsub1 class Subsub1Class { - val prop = 42 -} \ No newline at end of file + val prop = 42 +} diff --git a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/classes/Subsub2Class.kt b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/classes/Subsub2Class.kt index e63d290..06da55f 100644 --- a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/classes/Subsub2Class.kt +++ b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/classes/Subsub2Class.kt @@ -1,10 +1,5 @@ -/* - * Copyright 2016-2021 JetBrains s.r.o. - * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file. - */ - package com.company.subsub2 class Subsub2Class { - val prop = 23 -} \ No newline at end of file + val prop = 23 +} diff --git a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/androidJavaLibrary.gradle.kts b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/androidJavaLibrary.gradle.kts index 69f1cf6..6c186a5 100644 --- a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/androidJavaLibrary.gradle.kts +++ b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/androidJavaLibrary.gradle.kts @@ -1,40 +1,32 @@ -/* - * Copyright 2016-2022 JetBrains s.r.o. - * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file. - */ - plugins { - id("com.android.library") - //id("org.jetbrains.kotlinx.binary-compatibility-validator") - id("dev.adamko.kotlin.binary-compatibility-validator") version "0.0.4-SNAPSHOT" + id("com.android.library") + id("dev.adamko.kotlin.binary-compatibility-validator") version "0.0.5" } android { + namespace = "org.jetbrains.kotlinx.android.java.library" - namespace = "org.jetbrains.kotlinx.android.java.library" - - compileSdk = 32 + compileSdk = 32 - defaultConfig { - minSdk = 31 - targetSdk = 32 + defaultConfig { + minSdk = 31 + targetSdk = 32 - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - consumerProguardFiles("consumer-rules.pro") - } + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + consumerProguardFiles("consumer-rules.pro") + } - buildTypes { - release { - isMinifyEnabled = true - proguardFiles( - getDefaultProguardFile("proguard-android-optimize.txt"), - "proguard-rules.pro" - ) - } + buildTypes { + release { + isMinifyEnabled = true + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) } - + } } dependencies { - // no dependencies required + // no dependencies required } diff --git a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/androidKotlinLibrary.gradle.kts b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/androidKotlinLibrary.gradle.kts index dc0e490..611b722 100644 --- a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/androidKotlinLibrary.gradle.kts +++ b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/androidKotlinLibrary.gradle.kts @@ -1,41 +1,33 @@ -/* - * Copyright 2016-2022 JetBrains s.r.o. - * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file. - */ - plugins { - id("com.android.library") - id("kotlin-android") - //id("org.jetbrains.kotlinx.binary-compatibility-validator") - id("dev.adamko.kotlin.binary-compatibility-validator") version "0.0.4-SNAPSHOT" + id("com.android.library") + id("kotlin-android") + id("dev.adamko.kotlin.binary-compatibility-validator") version "0.0.5" } android { + namespace = "org.jetbrains.kotlinx.android.kotlin.library" - namespace = "org.jetbrains.kotlinx.android.kotlin.library" - - compileSdk = 32 + compileSdk = 32 - defaultConfig { - minSdk = 31 - targetSdk = 32 + defaultConfig { + minSdk = 31 + targetSdk = 32 - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - consumerProguardFiles("consumer-rules.pro") - } + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + consumerProguardFiles("consumer-rules.pro") + } - buildTypes { - release { - isMinifyEnabled = true - proguardFiles( - getDefaultProguardFile("proguard-android-optimize.txt"), - "proguard-rules.pro" - ) - } + buildTypes { + release { + isMinifyEnabled = true + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) } - + } } dependencies { - // no dependencies required + // no dependencies required } diff --git a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/androidProjectRoot.gradle.kts b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/androidProjectRoot.gradle.kts index 21d659f..463a1ee 100644 --- a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/androidProjectRoot.gradle.kts +++ b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/androidProjectRoot.gradle.kts @@ -1,11 +1,10 @@ plugins { - id("com.android.application").version("7.2.2").apply(false) - id("com.android.library").version("7.2.2").apply(false) - id("org.jetbrains.kotlin.android").version("1.7.10").apply(false) - //id("org.jetbrains.kotlinx.binary-compatibility-validator").apply(false) - id("dev.adamko.kotlin.binary-compatibility-validator") version "0.0.4-SNAPSHOT" apply false + id("com.android.application").version("7.2.2").apply(false) + id("com.android.library").version("7.2.2").apply(false) + id("org.jetbrains.kotlin.android").version("1.7.10").apply(false) + id("dev.adamko.kotlin.binary-compatibility-validator") version "0.0.5" apply false } tasks.register("clean", Delete::class) { - delete(rootProject.buildDir) + delete(rootProject.buildDir) } diff --git a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/multiplatformWithJvmTargets.gradle.kts b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/multiplatformWithJvmTargets.gradle.kts index 5dce66b..359c186 100644 --- a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/multiplatformWithJvmTargets.gradle.kts +++ b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/multiplatformWithJvmTargets.gradle.kts @@ -1,58 +1,48 @@ -/* - * Copyright 2016-2021 JetBrains s.r.o. - * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file. - */ - plugins { - kotlin("multiplatform") version "1.5.20" - //id("org.jetbrains.kotlinx.binary-compatibility-validator") - id("dev.adamko.kotlin.binary-compatibility-validator") version "0.0.4-SNAPSHOT" + kotlin("multiplatform") version "1.5.20" + id("dev.adamko.kotlin.binary-compatibility-validator") version "0.0.5" } -//repositories { -// mavenCentral() -//} - kotlin { - targets { - jvm { - compilations.all { - kotlinOptions.jvmTarget = "1.8" - } - testRuns["test"].executionTask.configure { - useJUnit() - } - } - jvm("anotherJvm") { - compilations.all { - kotlinOptions.jvmTarget = "1.8" - } - testRuns["test"].executionTask.configure { - useJUnit() - } - } + targets { + jvm { + compilations.all { + kotlinOptions.jvmTarget = "1.8" + } + testRuns["test"].executionTask.configure { + useJUnit() + } + } + jvm("anotherJvm") { + compilations.all { + kotlinOptions.jvmTarget = "1.8" + } + testRuns["test"].executionTask.configure { + useJUnit() + } + } + } + sourceSets { + val commonMain by getting + val commonTest by getting { + dependencies { + implementation(kotlin("stdlib")) + implementation(kotlin("test-common")) + implementation(kotlin("test-annotations-common")) + } + } + val jvmMain by getting + val jvmTest by getting { + dependencies { + implementation(kotlin("stdlib")) + implementation(kotlin("test-junit")) + } } - sourceSets { - val commonMain by getting - val commonTest by getting { - dependencies { - implementation(kotlin("stdlib")) - implementation(kotlin("test-common")) - implementation(kotlin("test-annotations-common")) - } - } - val jvmMain by getting - val jvmTest by getting { - dependencies { - implementation(kotlin("stdlib")) - implementation(kotlin("test-junit")) - } - } - val anotherJvmMain by getting - val anotherJvmTest by getting { - dependencies { - implementation(kotlin("test-junit")) - } - } + val anotherJvmMain by getting + val anotherJvmTest by getting { + dependencies { + implementation(kotlin("test-junit")) + } } + } } diff --git a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/multiplatformWithSingleJvmTarget.gradle.kts b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/multiplatformWithSingleJvmTarget.gradle.kts index f5b64e6..6af93c2 100644 --- a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/multiplatformWithSingleJvmTarget.gradle.kts +++ b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/multiplatformWithSingleJvmTarget.gradle.kts @@ -1,47 +1,34 @@ -/* - * Copyright 2016-2021 JetBrains s.r.o. - * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file. - */ - plugins { - kotlin("multiplatform") version "1.7.20" - //id("org.jetbrains.kotlinx.binary-compatibility-validator") - id("dev.adamko.kotlin.binary-compatibility-validator") version "0.0.4-SNAPSHOT" + kotlin("multiplatform") version "1.7.20" + id("dev.adamko.kotlin.binary-compatibility-validator") version "0.0.5" } -//repositories { -// mavenCentral() -//} - kotlin { - targets { - jvm { - compilations.all { - kotlinOptions.jvmTarget = "1.8" - } - testRuns["test"].executionTask.configure { - useJUnit() - } - } -// android { -// -// } + targets { + jvm { + compilations.all { + kotlinOptions.jvmTarget = "1.8" + } + testRuns["test"].executionTask.configure { + useJUnit() + } + } + } + sourceSets { + val commonMain by getting + val commonTest by getting { + dependencies { + implementation(kotlin("stdlib")) + implementation(kotlin("test-common")) + implementation(kotlin("test-annotations-common")) + } } - sourceSets { - val commonMain by getting - val commonTest by getting { - dependencies { - implementation(kotlin("stdlib")) - implementation(kotlin("test-common")) - implementation(kotlin("test-annotations-common")) - } - } - val jvmMain by getting - val jvmTest by getting { - dependencies { - implementation(kotlin("stdlib")) - implementation(kotlin("test-junit")) - } - } + val jvmMain by getting + val jvmTest by getting { + dependencies { + implementation(kotlin("stdlib")) + implementation(kotlin("test-junit")) + } } + } } diff --git a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/withPlugin-noKotlinVersion.gradle.kts b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/withPlugin-noKotlinVersion.gradle.kts index c84f729..a7af066 100644 --- a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/withPlugin-noKotlinVersion.gradle.kts +++ b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/withPlugin-noKotlinVersion.gradle.kts @@ -1,18 +1,8 @@ -/* - * Copyright 2016-2020 JetBrains s.r.o. - * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file. - */ - plugins { - kotlin("jvm") - //id("org.jetbrains.kotlinx.binary-compatibility-validator") - id("dev.adamko.kotlin.binary-compatibility-validator") version "0.0.4-SNAPSHOT" + kotlin("jvm") + id("dev.adamko.kotlin.binary-compatibility-validator") version "0.0.5" } -//repositories { -// mavenCentral() -//} - dependencies { - implementation(kotlin("stdlib-jdk8")) + implementation(kotlin("stdlib-jdk8")) } diff --git a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/withPlugin.gradle.kts b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/withPlugin.gradle.kts index 2e78038..87fb43d 100644 --- a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/withPlugin.gradle.kts +++ b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/withPlugin.gradle.kts @@ -1,18 +1,4 @@ -/* - * Copyright 2016-2020 JetBrains s.r.o. - * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file. - */ - plugins { - kotlin("jvm") version "1.7.20" - //id("org.jetbrains.kotlinx.binary-compatibility-validator") - id("dev.adamko.kotlin.binary-compatibility-validator") version "0.0.4-SNAPSHOT" -} - -//repositories { -// mavenCentral() -//} - -dependencies { - implementation(kotlin("stdlib-jdk8")) + kotlin("jvm") version "1.7.20" + id("dev.adamko.kotlin.binary-compatibility-validator") version "0.0.5" } diff --git a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/withoutPlugin-noKotlinVersion.gradle.kts b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/withoutPlugin-noKotlinVersion.gradle.kts index fcc61f4..09e9387 100644 --- a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/withoutPlugin-noKotlinVersion.gradle.kts +++ b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/withoutPlugin-noKotlinVersion.gradle.kts @@ -1,16 +1,7 @@ -/* - * Copyright 2016-2020 JetBrains s.r.o. - * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file. - */ - plugins { - kotlin("jvm") + kotlin("jvm") } -//repositories { -// mavenCentral() -//} - dependencies { - implementation(kotlin("stdlib-jdk8")) + implementation(kotlin("stdlib-jdk8")) } diff --git a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/withoutPlugin.gradle.kts b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/withoutPlugin.gradle.kts index e72c713..1ac35f3 100644 --- a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/withoutPlugin.gradle.kts +++ b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/withoutPlugin.gradle.kts @@ -1,16 +1,7 @@ -/* - * Copyright 2016-2020 JetBrains s.r.o. - * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file. - */ - plugins { - kotlin("jvm") version "1.3.70" + kotlin("jvm") version "1.3.70" } -//repositories { -// mavenCentral() -//} - dependencies { - implementation(kotlin("stdlib-jdk8")) + implementation(kotlin("stdlib-jdk8")) } diff --git a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/configuration/ignoredClasses/oneValidFullyQualifiedClass.gradle.kts b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/configuration/ignoredClasses/oneValidFullyQualifiedClass.gradle.kts index b5bde75..abda226 100644 --- a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/configuration/ignoredClasses/oneValidFullyQualifiedClass.gradle.kts +++ b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/configuration/ignoredClasses/oneValidFullyQualifiedClass.gradle.kts @@ -1,3 +1,3 @@ configure { - ignoredClasses.add("com.company.BuildConfig") + ignoredClasses.add("com.company.BuildConfig") } diff --git a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/configuration/ignoredPackages/oneValidPackage.gradle.kts b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/configuration/ignoredPackages/oneValidPackage.gradle.kts index 31dee85..6292368 100644 --- a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/configuration/ignoredPackages/oneValidPackage.gradle.kts +++ b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/configuration/ignoredPackages/oneValidPackage.gradle.kts @@ -1,3 +1,3 @@ configure { - ignoredPackages.add("com.company") + ignoredPackages.add("com.company") } diff --git a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/configuration/jarAsInput/inputJar.gradle.kts b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/configuration/jarAsInput/inputJar.gradle.kts index c3efaf2..b8a1585 100644 --- a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/configuration/jarAsInput/inputJar.gradle.kts +++ b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/configuration/jarAsInput/inputJar.gradle.kts @@ -1,13 +1,3 @@ -//tasks { -// jar { -// exclude("foo/HiddenField.class") -// exclude("foo/HiddenProperty.class") -// } -// apiBuild { -// inputJar.value(jar.flatMap { it.archiveFile }) -// } -//} - tasks.jar { exclude("foo/HiddenField.class") exclude("**/HiddenProperty.class") diff --git a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/configuration/nonPublicMarkers/markers.gradle.kts b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/configuration/nonPublicMarkers/markers.gradle.kts index 2195984..77e468f 100644 --- a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/configuration/nonPublicMarkers/markers.gradle.kts +++ b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/configuration/nonPublicMarkers/markers.gradle.kts @@ -1,4 +1,4 @@ configure { - ignoredMarkers.add("foo.HiddenField") - ignoredMarkers.add("foo.HiddenProperty") + ignoredMarkers.add("foo.HiddenField") + ignoredMarkers.add("foo.HiddenProperty") } diff --git a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/configuration/publicMarkers/markers.gradle.kts b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/configuration/publicMarkers/markers.gradle.kts new file mode 100644 index 0000000..58c67f2 --- /dev/null +++ b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/configuration/publicMarkers/markers.gradle.kts @@ -0,0 +1,8 @@ +configure { + publicMarkers.add("foo.PublicClass") + publicMarkers.add("foo.PublicField") + publicMarkers.add("foo.PublicProperty") + + publicPackages.add("foo.api") + publicClasses.add("foo.PublicClass") +} diff --git a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/configuration/publicMarkers/mixedMarkers.gradle.kts b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/configuration/publicMarkers/mixedMarkers.gradle.kts new file mode 100644 index 0000000..61e6534 --- /dev/null +++ b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/configuration/publicMarkers/mixedMarkers.gradle.kts @@ -0,0 +1,4 @@ +configure { + ignoredMarkers.add("mixed.PrivateApi") + publicMarkers.add("mixed.PublicApi") +} diff --git a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/settings/settings-android-project.gradle.kts b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/settings/settings-android-project.gradle.kts index 9f409b5..4b53276 100644 --- a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/settings/settings-android-project.gradle.kts +++ b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/settings/settings-android-project.gradle.kts @@ -1,18 +1,18 @@ pluginManagement { - repositories { - mavenLocal() - gradlePluginPortal() - google() - mavenCentral() - } + repositories { + mavenLocal() + gradlePluginPortal() + google() + mavenCentral() + } } dependencyResolutionManagement { - repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) - repositories { - google() - mavenCentral() - } + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { + google() + mavenCentral() + } } rootProject.name = "android-project" diff --git a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest2/kotlin/DefaultConfigTests.kt b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest2/kotlin/DefaultConfigTests.kt index 75f2375..0259854 100644 --- a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest2/kotlin/DefaultConfigTests.kt +++ b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest2/kotlin/DefaultConfigTests.kt @@ -23,7 +23,7 @@ internal class DefaultConfigTests : FunSpec({ buildGradleKts += """ |plugins { | kotlin("jvm") version "1.7.20" - | id("dev.adamko.kotlin.binary-compatibility-validator") version "0.0.4-SNAPSHOT" + | id("dev.adamko.kotlin.binary-compatibility-validator") version "0.0.5" |} | """.trimMargin() diff --git a/modules/bcv-gradle-plugin-functional-tests/src/testFixtures/kotlin/api/TestDsl.kt b/modules/bcv-gradle-plugin-functional-tests/src/testFixtures/kotlin/api/TestDsl.kt index 5a1422d..79f3653 100644 --- a/modules/bcv-gradle-plugin-functional-tests/src/testFixtures/kotlin/api/TestDsl.kt +++ b/modules/bcv-gradle-plugin-functional-tests/src/testFixtures/kotlin/api/TestDsl.kt @@ -19,7 +19,14 @@ fun BaseKotlinGradleTest.test(fn: BaseKotlinScope.() -> Unit): GradleRunner { |dependencyResolutionManagement { | repositories { | mavenCentral() - | maven(file("$testMavenRepoPathString")) + | maven(file("$testMavenRepoPathString")) { + | mavenContent { + | includeGroup("dev.adamko.kotlin.binary_compatibility_validator") + | includeGroup("dev.adamko.kotlin.binary-compatibility-validator") + | includeGroup("dev.adamko.kotlin.binary-compatibility-validator.project") + | includeGroup("dev.adamko.kotlin.binary-compatibility-validator.settings") + | } + | } | } |} | @@ -27,7 +34,14 @@ fun BaseKotlinGradleTest.test(fn: BaseKotlinScope.() -> Unit): GradleRunner { | repositories { | gradlePluginPortal() | mavenCentral() - | maven(file("$testMavenRepoPathString")) + | maven(file("$testMavenRepoPathString")) { + | mavenContent { + | includeGroup("dev.adamko.kotlin.binary_compatibility_validator") + | includeGroup("dev.adamko.kotlin.binary-compatibility-validator") + | includeGroup("dev.adamko.kotlin.binary-compatibility-validator.project") + | includeGroup("dev.adamko.kotlin.binary-compatibility-validator.settings") + | } + | } | } |} | diff --git a/modules/bcv-gradle-plugin/api/bcv-gradle-plugin.api b/modules/bcv-gradle-plugin/api/bcv-gradle-plugin.api index ba8725b..a8d194e 100644 --- a/modules/bcv-gradle-plugin/api/bcv-gradle-plugin.api +++ b/modules/bcv-gradle-plugin/api/bcv-gradle-plugin.api @@ -20,6 +20,9 @@ public abstract interface class dev/adamko/kotlin/binary_compatibility_validator public abstract fun getNonPublicMarkers ()Lorg/gradle/api/provider/SetProperty; public abstract fun getOutputApiDir ()Lorg/gradle/api/file/DirectoryProperty; public abstract fun getProjectName ()Lorg/gradle/api/provider/Property; + public abstract fun getPublicClasses ()Lorg/gradle/api/provider/SetProperty; + public abstract fun getPublicMarkers ()Lorg/gradle/api/provider/SetProperty; + public abstract fun getPublicPackages ()Lorg/gradle/api/provider/SetProperty; public abstract fun getTargets ()Lorg/gradle/api/NamedDomainObjectContainer; } @@ -55,6 +58,9 @@ public abstract class dev/adamko/kotlin/binary_compatibility_validator/targets/B public abstract fun getInputJar ()Lorg/gradle/api/file/RegularFileProperty; public fun getName ()Ljava/lang/String; public final fun getPlatformType ()Ljava/lang/String; + public abstract fun getPublicClasses ()Lorg/gradle/api/provider/SetProperty; + public abstract fun getPublicMarkers ()Lorg/gradle/api/provider/SetProperty; + public abstract fun getPublicPackages ()Lorg/gradle/api/provider/SetProperty; } public abstract interface class dev/adamko/kotlin/binary_compatibility_validator/targets/BCVTargetSpec : java/io/Serializable { @@ -64,6 +70,9 @@ public abstract interface class dev/adamko/kotlin/binary_compatibility_validator public abstract fun getIgnoredPackages ()Lorg/gradle/api/provider/SetProperty; public abstract fun getInputClasses ()Lorg/gradle/api/file/ConfigurableFileCollection; public abstract fun getInputJar ()Lorg/gradle/api/file/RegularFileProperty; + public abstract fun getPublicClasses ()Lorg/gradle/api/provider/SetProperty; + public abstract fun getPublicMarkers ()Lorg/gradle/api/provider/SetProperty; + public abstract fun getPublicPackages ()Lorg/gradle/api/provider/SetProperty; } public abstract class dev/adamko/kotlin/binary_compatibility_validator/tasks/BCVApiCheckTask : dev/adamko/kotlin/binary_compatibility_validator/tasks/BCVDefaultTask { diff --git a/modules/bcv-gradle-plugin/build.gradle.kts b/modules/bcv-gradle-plugin/build.gradle.kts index 4cbcfde..55b530f 100644 --- a/modules/bcv-gradle-plugin/build.gradle.kts +++ b/modules/bcv-gradle-plugin/build.gradle.kts @@ -1,7 +1,7 @@ import buildsrc.utils.configurationNames import buildsrc.utils.skipTestFixturesPublications import org.gradle.api.attributes.plugin.GradlePluginApiVersion.GRADLE_PLUGIN_API_VERSION_ATTRIBUTE -import org.jetbrains.kotlin.gradle.tasks.KotlinCompile +import org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask plugins { buildsrc.conventions.`kotlin-gradle-plugin` @@ -32,8 +32,8 @@ dependencies { @Suppress("UnstableApiUsage") gradlePlugin { - website.set("https://github.com/adamko-dev/kotlin-binary-compatibility-validator-mu") - vcsUrl.set("https://github.com/adamko-dev/kotlin-binary-compatibility-validator-mu") + website = "https://github.com/adamko-dev/kotlin-binary-compatibility-validator-mu" + vcsUrl = "https://github.com/adamko-dev/kotlin-binary-compatibility-validator-mu" isAutomatedPublishing = true plugins.configureEach { @@ -91,9 +91,9 @@ skipTestFixturesPublications() // archiveClassifier.set("") //} -tasks.withType().configureEach { - kotlinOptions { - freeCompilerArgs += listOf( +tasks.withType>().configureEach { + compilerOptions { + freeCompilerArgs.addAll( "-opt-in=dev.adamko.kotlin.binary_compatibility_validator.internal.BCVInternalApi" ) } diff --git a/modules/bcv-gradle-plugin/src/main/kotlin/BCVProjectExtension.kt b/modules/bcv-gradle-plugin/src/main/kotlin/BCVProjectExtension.kt index e0ff4a4..264891e 100644 --- a/modules/bcv-gradle-plugin/src/main/kotlin/BCVProjectExtension.kt +++ b/modules/bcv-gradle-plugin/src/main/kotlin/BCVProjectExtension.kt @@ -17,6 +17,15 @@ interface BCVProjectExtension : BCVTargetSpec, ExtensionAware { /** Sets the default [BCVTarget.ignoredPackages] value for all [targets]. */ override val ignoredPackages: SetProperty + /** Sets the default [BCVTarget.publicMarkers] for all [targets] */ + override val publicMarkers: SetProperty + + /** Sets the default [BCVTarget.publicPackages] for all [targets] */ + override val publicPackages: SetProperty + + /** Sets the default [BCVTarget.publicClasses] for all [targets] */ + override val publicClasses: SetProperty + /** Sets the default [BCVTarget.ignoredMarkers] value for all [targets]. */ override val ignoredMarkers: SetProperty diff --git a/modules/bcv-gradle-plugin/src/main/kotlin/BCVProjectPlugin.kt b/modules/bcv-gradle-plugin/src/main/kotlin/BCVProjectPlugin.kt index b9b6615..a9d1aaf 100644 --- a/modules/bcv-gradle-plugin/src/main/kotlin/BCVProjectPlugin.kt +++ b/modules/bcv-gradle-plugin/src/main/kotlin/BCVProjectPlugin.kt @@ -101,11 +101,16 @@ constructor( enabled.convention(true) outputApiDir.convention(layout.projectDirectory.dir(API_DIR)) projectName.convention(providers.provider { project.name }) - kotlinxBinaryCompatibilityValidatorVersion.convention("0.13.0") + kotlinxBinaryCompatibilityValidatorVersion.convention("0.13.1") } extension.targets.configureEach { enabled.convention(true) + + publicMarkers.convention(extension.publicMarkers) + publicPackages.convention(extension.publicPackages) + publicClasses.convention(extension.publicClasses) + ignoredClasses.convention(extension.ignoredClasses) ignoredMarkers.convention( @Suppress("DEPRECATION") diff --git a/modules/bcv-gradle-plugin/src/main/kotlin/targets/BCVTarget.kt b/modules/bcv-gradle-plugin/src/main/kotlin/targets/BCVTarget.kt index 733f87f..639a838 100644 --- a/modules/bcv-gradle-plugin/src/main/kotlin/targets/BCVTarget.kt +++ b/modules/bcv-gradle-plugin/src/main/kotlin/targets/BCVTarget.kt @@ -34,18 +34,36 @@ constructor( @get:PathSensitive(PathSensitivity.RELATIVE) abstract override val inputJar: RegularFileProperty + /** @see dev.adamko.kotlin.binary_compatibility_validator.targets.BCVTarget.publicMarkers */ + @get:Input + @get:Optional + abstract override val publicMarkers: SetProperty + + /** @see dev.adamko.kotlin.binary_compatibility_validator.targets.BCVTarget.publicPackages */ + @get:Input + @get:Optional + abstract override val publicPackages: SetProperty + + /** @see dev.adamko.kotlin.binary_compatibility_validator.targets.BCVTarget.publicClasses */ + @get:Input + @get:Optional + abstract override val publicClasses: SetProperty + + /** @see dev.adamko.kotlin.binary_compatibility_validator.targets.BCVTarget.ignoredMarkers */ @get:Input @get:Optional abstract override val ignoredMarkers: SetProperty + /** @see dev.adamko.kotlin.binary_compatibility_validator.targets.BCVTarget.ignoredPackages */ @get:Input @get:Optional abstract override val ignoredPackages: SetProperty + /** @see dev.adamko.kotlin.binary_compatibility_validator.targets.BCVTarget.ignoredClasses */ @get:Input @get:Optional abstract override val ignoredClasses: SetProperty @Internal - override fun getName() = platformType + override fun getName(): String = platformType } diff --git a/modules/bcv-gradle-plugin/src/main/kotlin/targets/BCVTargetSpec.kt b/modules/bcv-gradle-plugin/src/main/kotlin/targets/BCVTargetSpec.kt index f49f4ed..1d1fd5e 100644 --- a/modules/bcv-gradle-plugin/src/main/kotlin/targets/BCVTargetSpec.kt +++ b/modules/bcv-gradle-plugin/src/main/kotlin/targets/BCVTargetSpec.kt @@ -25,6 +25,35 @@ interface BCVTargetSpec : Serializable { */ val inputJar: RegularFileProperty + /** + * Fully qualified names of annotations that can be used to explicitly mark public declarations. + * + * If at least one of [publicMarkers], [publicPackages] or [publicClasses] is defined, + * all declarations not covered by any of them will be considered non-public. + * [ignoredPackages], [ignoredClasses] and [ignoredMarkers] can be used for additional filtering. + */ + val publicMarkers: SetProperty + + /** + * Fully qualified package names that contain public declarations. + * + * If at least one of [publicMarkers], [publicPackages] or [publicClasses] is defined, + * all declarations not covered by any of them will be considered non-public. + * + * [ignoredPackages], [ignoredClasses] and [ignoredMarkers] can be used for additional filtering. + */ + val publicPackages: SetProperty + + /** + * Fully qualified names of public classes. + * + * If at least one of [publicMarkers], [publicPackages] or [publicClasses] is defined, + * all declarations not covered by any of them will be considered non-public. + * + * [ignoredPackages], [ignoredClasses] and [ignoredMarkers] can be used for additional filtering. + */ + val publicClasses: SetProperty + /** * Fully qualified names of annotations that effectively exclude declarations from being public. * Example of such annotation could be `kotlinx.coroutines.InternalCoroutinesApi`. diff --git a/modules/bcv-gradle-plugin/src/main/kotlin/tasks/BCVApiGenerateTask.kt b/modules/bcv-gradle-plugin/src/main/kotlin/tasks/BCVApiGenerateTask.kt index dc25ed6..f2924a5 100644 --- a/modules/bcv-gradle-plugin/src/main/kotlin/tasks/BCVApiGenerateTask.kt +++ b/modules/bcv-gradle-plugin/src/main/kotlin/tasks/BCVApiGenerateTask.kt @@ -84,13 +84,19 @@ constructor( @OptIn(BCVInternalApi::class) submit(BCVSignaturesWorker::class) worker@{ + this@worker.projectName.set(task.projectName) + this@worker.outputApiDir.set(outputDir) this@worker.inputClasses.from(target.inputClasses) this@worker.inputJar.set(target.inputJar) + + this@worker.publicMarkers.set(target.publicMarkers) + this@worker.publicPackages.set(target.publicPackages) + this@worker.publicClasses.set(target.publicClasses) + this@worker.ignoredPackages.set(target.ignoredPackages) this@worker.ignoredMarkers.set(target.ignoredMarkers) this@worker.ignoredClasses.set(target.ignoredClasses) - this@worker.projectName.set(task.projectName) } } } diff --git a/modules/bcv-gradle-plugin/src/main/kotlin/workers/BCVSignaturesWorker.kt b/modules/bcv-gradle-plugin/src/main/kotlin/workers/BCVSignaturesWorker.kt index b5b4c41..45da136 100644 --- a/modules/bcv-gradle-plugin/src/main/kotlin/workers/BCVSignaturesWorker.kt +++ b/modules/bcv-gradle-plugin/src/main/kotlin/workers/BCVSignaturesWorker.kt @@ -25,6 +25,10 @@ abstract class BCVSignaturesWorker : WorkAction val inputClasses: ConfigurableFileCollection val inputJar: RegularFileProperty + val publicMarkers: SetProperty + val publicPackages: SetProperty + val publicClasses: SetProperty + val ignoredPackages: SetProperty val ignoredMarkers: SetProperty val ignoredClasses: SetProperty @@ -39,6 +43,11 @@ abstract class BCVSignaturesWorker : WorkAction val signatures = generateSignatures( inputJar = parameters.inputJar.orNull, inputClasses = parameters.inputClasses, + + publicMarkers = parameters.publicMarkers.get(), + publicPackages = parameters.publicPackages.get(), + publicClasses = parameters.publicClasses.get(), + ignoredPackages = parameters.ignoredPackages.get(), ignoredMarkers = parameters.ignoredMarkers.get(), ignoredClasses = parameters.ignoredClasses.get(), @@ -56,10 +65,12 @@ abstract class BCVSignaturesWorker : WorkAction logger.info("BCVSignaturesWorker generated $signaturesCount signatures for $projectName in $duration") } - private fun generateSignatures( inputJar: RegularFile?, inputClasses: FileCollection, + publicMarkers: Set, + publicPackages: Set, + publicClasses: Set, ignoredClasses: Set, ignoredMarkers: Set, ignoredPackages: Set, @@ -89,8 +100,9 @@ abstract class BCVSignaturesWorker : WorkAction } return signatures + .retainExplicitlyIncludedIfDeclared(publicPackages, publicClasses, publicMarkers) .filterOutNonPublic(ignoredPackages, ignoredClasses) - .filterOutAnnotated(ignoredMarkers.map { it.replace(".", "/") }.toSet()) + .filterOutAnnotated(ignoredMarkers.map(::replaceDots).toSet()) } private fun writeSignatures( @@ -123,5 +135,8 @@ abstract class BCVSignaturesWorker : WorkAction val end = System.nanoTime() return value to (end - start).nanoseconds } + + private fun replaceDots(dotSeparated: String): String = + dotSeparated.replace('.', '/') } } diff --git a/modules/bcv-gradle-plugin/src/test/kotlin/internal/GlobMatchingTest.kt b/modules/bcv-gradle-plugin/src/test/kotlin/internal/GlobMatchingTest.kt index c08a9cd..80d0c1a 100644 --- a/modules/bcv-gradle-plugin/src/test/kotlin/internal/GlobMatchingTest.kt +++ b/modules/bcv-gradle-plugin/src/test/kotlin/internal/GlobMatchingTest.kt @@ -49,8 +49,8 @@ class GlobMatchingTest : FunSpec({ }) -private fun Regex.shouldMatchAll(strs: Collection) = - shouldMatchAll(*strs.toTypedArray()) +private fun Regex.shouldMatchAll(strings: Collection) = + shouldMatchAll(*strings.toTypedArray()) -private fun Regex.shouldNotMatchAny(strs: Collection) = - shouldNotMatchAny(*strs.toTypedArray()) +private fun Regex.shouldNotMatchAny(strings: Collection) = + shouldNotMatchAny(*strings.toTypedArray()) diff --git a/settings.gradle.kts b/settings.gradle.kts index 132a801..a0161b5 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -2,18 +2,17 @@ rootProject.name = "kotlin-binary-compatibility-validator-mu" pluginManagement { repositories { - gradlePluginPortal() mavenCentral() + gradlePluginPortal() } } @Suppress("UnstableApiUsage") dependencyResolutionManagement { - repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS) + repositoriesMode = RepositoriesMode.PREFER_SETTINGS repositories { mavenCentral() - gradlePluginPortal() } }