[KPM] Exclude 'InternalKotlinGradlePluginApi' apis from binary validation

^KT-51262
This commit is contained in:
sebastian.sellmair
2022-02-13 10:22:43 +01:00
committed by Space
parent 113e363b22
commit 627cb0be3a
13 changed files with 62 additions and 155 deletions
@@ -34,14 +34,18 @@ class RuntimePublicAPITest {
}
@Test fun kotlinGradlePluginIdea() {
snapshotAPIAndCompare("../kotlin-gradle-plugin-idea/build/libs", "kotlin-gradle-plugin-idea(?!-[-a-z]+)")
snapshotAPIAndCompare(
"../kotlin-gradle-plugin-idea/build/libs", "kotlin-gradle-plugin-idea(?!-[-a-z]+)",
nonPublicAnnotations = listOf("org/jetbrains/kotlin/gradle/kpm/idea/InternalKotlinGradlePluginApi")
)
}
private fun snapshotAPIAndCompare(
basePath: String,
jarPattern: String,
publicPackages: List<String> = emptyList(),
nonPublicPackages: List<String> = emptyList()
nonPublicPackages: List<String> = emptyList(),
nonPublicAnnotations: List<String> = emptyList()
) {
val base = File(basePath).absoluteFile.normalize()
val jarFile = getJarPath(base, jarPattern, System.getProperty("kotlinVersion"))
@@ -50,7 +54,9 @@ class RuntimePublicAPITest {
val publicPackageFilter = { className: String -> publicPackagePrefixes.none { className.startsWith(it) } }
println("Reading binary API from $jarFile")
val api = JarFile(jarFile).loadApiFromJvmClasses(publicPackageFilter).filterOutNonPublic(nonPublicPackages)
val api = JarFile(jarFile).loadApiFromJvmClasses(publicPackageFilter)
.filterOutNonPublic(nonPublicPackages)
.filterOutAnnotated(nonPublicAnnotations.toSet())
val target = File("reference-public-api")
.resolve(testName.methodName.replaceCamelCaseWithDashedLowerCase() + ".txt")
@@ -72,3 +78,26 @@ class RuntimePublicAPITest {
}
/*
Copied from `binary-compatibility-validator
Can be removed after:
https://github.com/Kotlin/binary-compatibility-validator/pull/75
*/
private fun List<ClassBinarySignature>.filterOutAnnotated(targetAnnotations: Set<String>): List<ClassBinarySignature> {
if (targetAnnotations.isEmpty()) return this
return filter {
it.annotations.all { ann -> !targetAnnotations.any { ann.refersToName(it) } }
}.map {
ClassBinarySignature(
it.name,
it.superName,
it.outerName,
it.supertypes,
it.memberSignatures.filter { it.annotations.all { ann -> !targetAnnotations.any { ann.refersToName(it) } } },
it.access,
it.isEffectivelyPublic,
it.isNotUsedWhenEmpty,
it.annotations
)
}
}