From b6ebed0c96d92608f43f3732d13c5a355d94524b Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Fri, 27 Aug 2021 20:26:38 +0200 Subject: [PATCH] IR serialization: cleanup/optimize DescriptorExportCheckerVisitor Check if visibility is public API first, then check if declaration is annotated with `@PublishedApi`. This is needed because loading annotations and iterating over them can be slow. --- .../DescriptorExportCheckerVisitor.kt | 72 ++++++++----------- 1 file changed, 29 insertions(+), 43 deletions(-) diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/mangle/descriptor/DescriptorExportCheckerVisitor.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/mangle/descriptor/DescriptorExportCheckerVisitor.kt index b20d27b6cc7..5ebb73c8e94 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/mangle/descriptor/DescriptorExportCheckerVisitor.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/mangle/descriptor/DescriptorExportCheckerVisitor.kt @@ -10,24 +10,23 @@ import org.jetbrains.kotlin.backend.common.serialization.mangle.SpecialDeclarati import org.jetbrains.kotlin.backend.common.serialization.mangle.ir.isAnonymous import org.jetbrains.kotlin.backend.common.serialization.mangle.publishedApiAnnotation import org.jetbrains.kotlin.descriptors.* -import org.jetbrains.kotlin.descriptors.annotations.Annotations abstract class DescriptorExportCheckerVisitor : DeclarationDescriptorVisitor, KotlinExportChecker { - override fun check(declaration: DeclarationDescriptor, type: SpecialDeclarationType): Boolean { - return declaration.accept(this, type) - } + override fun check(declaration: DeclarationDescriptor, type: SpecialDeclarationType): Boolean = + declaration.accept(this, type) - private fun DescriptorVisibility.isPubliclyVisible(): Boolean = isPublicAPI || this === DescriptorVisibilities.INTERNAL + private fun D.isExported(): Boolean where D : DeclarationDescriptorNonRoot, D : DeclarationDescriptorWithVisibility { + if (getContainingDeclaration() is PackageFragmentDescriptor) { + val visibility = visibility + if (visibility.isPublicAPI || visibility === DescriptorVisibilities.INTERNAL) return true + if (visibility === DescriptorVisibilities.LOCAL) return false + return annotations.hasAnnotation(publishedApiAnnotation) || isPlatformSpecificExported() + } - private fun DeclarationDescriptorNonRoot.isExported(annotations: Annotations, visibility: DescriptorVisibility?): Boolean { - if (visibility == DescriptorVisibilities.LOCAL) return false - return if (containingDeclaration is PackageFragmentDescriptor) { - val speciallyExported = annotations.hasAnnotation(publishedApiAnnotation) || isPlatformSpecificExported() - return speciallyExported || visibility?.isPubliclyVisible() ?: error("VISIBILITY == null: $this") - - } else containingDeclaration.accept(this@DescriptorExportCheckerVisitor, SpecialDeclarationType.REGULAR) + return visibility !== DescriptorVisibilities.LOCAL && + getContainingDeclaration().accept(this@DescriptorExportCheckerVisitor, SpecialDeclarationType.REGULAR) } override fun visitPackageFragmentDescriptor(descriptor: PackageFragmentDescriptor, data: SpecialDeclarationType) = true @@ -36,51 +35,38 @@ abstract class DescriptorExportCheckerVisitor : DeclarationDescriptorVisitor