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