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.
This commit is contained in:
+28
-42
@@ -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.ir.isAnonymous
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.mangle.publishedApiAnnotation
|
import org.jetbrains.kotlin.backend.common.serialization.mangle.publishedApiAnnotation
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
import org.jetbrains.kotlin.descriptors.annotations.Annotations
|
|
||||||
|
|
||||||
abstract class DescriptorExportCheckerVisitor : DeclarationDescriptorVisitor<Boolean, SpecialDeclarationType>,
|
abstract class DescriptorExportCheckerVisitor : DeclarationDescriptorVisitor<Boolean, SpecialDeclarationType>,
|
||||||
KotlinExportChecker<DeclarationDescriptor> {
|
KotlinExportChecker<DeclarationDescriptor> {
|
||||||
|
|
||||||
override fun check(declaration: DeclarationDescriptor, type: SpecialDeclarationType): Boolean {
|
override fun check(declaration: DeclarationDescriptor, type: SpecialDeclarationType): Boolean =
|
||||||
return declaration.accept(this, type)
|
declaration.accept(this, type)
|
||||||
}
|
|
||||||
|
|
||||||
private fun DescriptorVisibility.isPubliclyVisible(): Boolean = isPublicAPI || this === DescriptorVisibilities.INTERNAL
|
private fun <D> 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 {
|
return visibility !== DescriptorVisibilities.LOCAL &&
|
||||||
if (visibility == DescriptorVisibilities.LOCAL) return false
|
getContainingDeclaration().accept(this@DescriptorExportCheckerVisitor, SpecialDeclarationType.REGULAR)
|
||||||
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)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun visitPackageFragmentDescriptor(descriptor: PackageFragmentDescriptor, data: SpecialDeclarationType) = true
|
override fun visitPackageFragmentDescriptor(descriptor: PackageFragmentDescriptor, data: SpecialDeclarationType) = true
|
||||||
@@ -36,51 +35,38 @@ abstract class DescriptorExportCheckerVisitor : DeclarationDescriptorVisitor<Boo
|
|||||||
|
|
||||||
override fun visitVariableDescriptor(descriptor: VariableDescriptor, data: SpecialDeclarationType) = false
|
override fun visitVariableDescriptor(descriptor: VariableDescriptor, data: SpecialDeclarationType) = false
|
||||||
|
|
||||||
override fun visitFunctionDescriptor(descriptor: FunctionDescriptor, data: SpecialDeclarationType): Boolean {
|
override fun visitFunctionDescriptor(descriptor: FunctionDescriptor, data: SpecialDeclarationType): Boolean =
|
||||||
if (descriptor.name.isAnonymous) return false
|
!descriptor.name.isAnonymous && descriptor.isExported()
|
||||||
return descriptor.run { isExported(annotations, visibility) }
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun visitTypeParameterDescriptor(descriptor: TypeParameterDescriptor, data: SpecialDeclarationType): Boolean {
|
override fun visitTypeParameterDescriptor(descriptor: TypeParameterDescriptor, data: SpecialDeclarationType): Boolean =
|
||||||
return descriptor.containingDeclaration.accept(this, data)
|
descriptor.containingDeclaration.accept(this, data)
|
||||||
}
|
|
||||||
|
|
||||||
override fun visitClassDescriptor(descriptor: ClassDescriptor, data: SpecialDeclarationType): Boolean {
|
override fun visitClassDescriptor(descriptor: ClassDescriptor, data: SpecialDeclarationType): Boolean {
|
||||||
if (data == SpecialDeclarationType.ANON_INIT) return false
|
if (data == SpecialDeclarationType.ANON_INIT) return false
|
||||||
if (descriptor.name.isAnonymous) return false
|
if (descriptor.name.isAnonymous) return false
|
||||||
return descriptor.run { isExported(annotations, visibility) }
|
return descriptor.isExported()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun visitTypeAliasDescriptor(descriptor: TypeAliasDescriptor, data: SpecialDeclarationType): Boolean {
|
override fun visitTypeAliasDescriptor(descriptor: TypeAliasDescriptor, data: SpecialDeclarationType): Boolean =
|
||||||
return descriptor.run { isExported(annotations, visibility) }
|
descriptor.isExported()
|
||||||
}
|
|
||||||
|
|
||||||
override fun visitModuleDeclaration(descriptor: ModuleDescriptor, data: SpecialDeclarationType): Boolean {
|
override fun visitModuleDeclaration(descriptor: ModuleDescriptor, data: SpecialDeclarationType): Boolean = false
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun visitConstructorDescriptor(constructorDescriptor: ConstructorDescriptor, data: SpecialDeclarationType): Boolean {
|
override fun visitConstructorDescriptor(constructorDescriptor: ConstructorDescriptor, data: SpecialDeclarationType): Boolean =
|
||||||
return constructorDescriptor.constructedClass.run { isExported(annotations, visibility) }
|
constructorDescriptor.constructedClass.isExported()
|
||||||
}
|
|
||||||
|
|
||||||
override fun visitScriptDescriptor(scriptDescriptor: ScriptDescriptor, data: SpecialDeclarationType): Boolean = false
|
override fun visitScriptDescriptor(scriptDescriptor: ScriptDescriptor, data: SpecialDeclarationType): Boolean = false
|
||||||
|
|
||||||
override fun visitPropertyDescriptor(descriptor: PropertyDescriptor, data: SpecialDeclarationType): Boolean {
|
override fun visitPropertyDescriptor(descriptor: PropertyDescriptor, data: SpecialDeclarationType): Boolean =
|
||||||
return descriptor.run { isExported(annotations, visibility) }
|
descriptor.isExported()
|
||||||
}
|
|
||||||
|
|
||||||
override fun visitValueParameterDescriptor(descriptor: ValueParameterDescriptor, data: SpecialDeclarationType): Boolean {
|
override fun visitValueParameterDescriptor(descriptor: ValueParameterDescriptor, data: SpecialDeclarationType): Boolean = false
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun visitPropertyGetterDescriptor(descriptor: PropertyGetterDescriptor, data: SpecialDeclarationType): Boolean {
|
override fun visitPropertyGetterDescriptor(descriptor: PropertyGetterDescriptor, data: SpecialDeclarationType): Boolean =
|
||||||
return descriptor.correspondingProperty.run { isExported(annotations, visibility) }
|
descriptor.correspondingProperty.isExported()
|
||||||
}
|
|
||||||
|
|
||||||
override fun visitPropertySetterDescriptor(descriptor: PropertySetterDescriptor, data: SpecialDeclarationType): Boolean {
|
override fun visitPropertySetterDescriptor(descriptor: PropertySetterDescriptor, data: SpecialDeclarationType): Boolean =
|
||||||
return descriptor.correspondingProperty.run { isExported(annotations, visibility) }
|
descriptor.correspondingProperty.isExported()
|
||||||
}
|
|
||||||
|
|
||||||
override fun visitReceiverParameterDescriptor(descriptor: ReceiverParameterDescriptor, data: SpecialDeclarationType) = false
|
override fun visitReceiverParameterDescriptor(descriptor: ReceiverParameterDescriptor, data: SpecialDeclarationType) = false
|
||||||
|
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user