From 81747daafe13e7dd288229dc0846e482b0089e9f Mon Sep 17 00:00:00 2001 From: Daniil Ovchinnikov Date: Fri, 4 Oct 2024 15:37:09 +0200 Subject: [PATCH] API dumps: dump experimental APIs into a separate file `api-dump-experimental.txt` GitOrigin-RevId: 2073b4ee9a1c8c13742aad0554a4e87b3f9c0fac --- tools/apiDump/src/impl.kt | 43 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/tools/apiDump/src/impl.kt b/tools/apiDump/src/impl.kt index 354850ae952c..c338d9938872 100644 --- a/tools/apiDump/src/impl.kt +++ b/tools/apiDump/src/impl.kt @@ -12,7 +12,6 @@ import org.objectweb.asm.Opcodes import org.objectweb.asm.Type import org.objectweb.asm.tree.AnnotationNode import java.nio.file.Path -import kotlin.collections.set import kotlin.io.path.ExperimentalPathApi import kotlin.io.path.inputStream import kotlin.io.path.name @@ -86,6 +85,14 @@ class API internal constructor( val publicApi: List by lazy { publicApi(index, signatures) } + + private val stableAndExperimentalApi: Pair, List> by lazy { + stableAndExperimentalApi(publicApi) + } + + val stableApi: List get() = stableAndExperimentalApi.first + + val experimentalApi: List get() = stableAndExperimentalApi.second } /** @@ -257,6 +264,40 @@ private fun publicApi(index: ApiIndex, classSignatures: List): Pair, List> { + val stableClassSignatures = ArrayList() + val experimentalClassSignatures = ArrayList() + for (classSignature in classSignatures) { + if (classSignature.flags.annotationExperimental) { + // the whole class is experimental + experimentalClassSignatures.add(classSignature) + continue + } + val stableMembers = ArrayList() + val experimentalMembers = ArrayList() + for (member in classSignature.members) { + val memberList = if (member.flags.annotationExperimental) { + experimentalMembers + } + else { + stableMembers + } + memberList.add(member) + } + if (experimentalMembers.isEmpty()) { + // a stable class has only stable members + stableClassSignatures.add(classSignature) + continue + } + // keep only experimental members + experimentalClassSignatures.add(classSignature.copy(members = experimentalMembers)) + + // keep only stable members but also keep the signature in the stable list even if all members are experimental + stableClassSignatures.add(classSignature.copy(members = stableMembers)) + } + return Pair(stableClassSignatures, experimentalClassSignatures) +} + @OptIn(ExperimentalPathApi::class) private fun classFilePaths(classRoot: Path): Sequence { return classRoot