jvm-abi-gen: Reformat files and add comments
This commit is contained in:
committed by
Alexander Udalov
parent
023db4f376
commit
fc6c2c9631
+33
-12
@@ -65,14 +65,17 @@ sealed class AbiClassInfo {
|
|||||||
class JvmAbiClassBuilderInterceptor : ClassBuilderInterceptorExtension {
|
class JvmAbiClassBuilderInterceptor : ClassBuilderInterceptorExtension {
|
||||||
val abiClassInfo: MutableMap<String, AbiClassInfo> = mutableMapOf()
|
val abiClassInfo: MutableMap<String, AbiClassInfo> = mutableMapOf()
|
||||||
|
|
||||||
override fun interceptClassBuilderFactory(interceptedFactory: ClassBuilderFactory, bindingContext: BindingContext, diagnostics: DiagnosticSink): ClassBuilderFactory =
|
override fun interceptClassBuilderFactory(
|
||||||
object : DelegatingClassBuilderFactory(interceptedFactory) {
|
interceptedFactory: ClassBuilderFactory,
|
||||||
override fun newClassBuilder(origin: JvmDeclarationOrigin): DelegatingClassBuilder {
|
bindingContext: BindingContext,
|
||||||
val descriptor = origin.descriptor as? ClassDescriptor
|
diagnostics: DiagnosticSink
|
||||||
val isPrivate = descriptor?.visibility?.let(DescriptorVisibilities::isPrivate) ?: false
|
): ClassBuilderFactory = object : DelegatingClassBuilderFactory(interceptedFactory) {
|
||||||
return AbiInfoClassBuilder(interceptedFactory.newClassBuilder(origin), isPrivate)
|
override fun newClassBuilder(origin: JvmDeclarationOrigin): DelegatingClassBuilder {
|
||||||
}
|
val descriptor = origin.descriptor as? ClassDescriptor
|
||||||
|
val isPrivate = descriptor?.visibility?.let(DescriptorVisibilities::isPrivate) ?: false
|
||||||
|
return AbiInfoClassBuilder(interceptedFactory.newClassBuilder(origin), isPrivate)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private inner class AbiInfoClassBuilder(
|
private inner class AbiInfoClassBuilder(
|
||||||
private val delegate: ClassBuilder,
|
private val delegate: ClassBuilder,
|
||||||
@@ -86,8 +89,17 @@ class JvmAbiClassBuilderInterceptor : ClassBuilderInterceptorExtension {
|
|||||||
|
|
||||||
override fun getDelegate(): ClassBuilder = delegate
|
override fun getDelegate(): ClassBuilder = delegate
|
||||||
|
|
||||||
override fun defineClass(origin: PsiElement?, version: Int, access: Int, name: String, signature: String?, superName: String, interfaces: Array<out String>) {
|
override fun defineClass(
|
||||||
|
origin: PsiElement?,
|
||||||
|
version: Int,
|
||||||
|
access: Int,
|
||||||
|
name: String,
|
||||||
|
signature: String?,
|
||||||
|
superName: String,
|
||||||
|
interfaces: Array<out String>
|
||||||
|
) {
|
||||||
// Always keep annotation classes
|
// Always keep annotation classes
|
||||||
|
// TODO: Investigate whether there are cases where we can remove annotation classes from the ABI.
|
||||||
if (access and Opcodes.ACC_ANNOTATION != 0) {
|
if (access and Opcodes.ACC_ANNOTATION != 0) {
|
||||||
publicAbi = true
|
publicAbi = true
|
||||||
}
|
}
|
||||||
@@ -101,7 +113,14 @@ class JvmAbiClassBuilderInterceptor : ClassBuilderInterceptorExtension {
|
|||||||
super.visitOuterClass(owner, name, desc)
|
super.visitOuterClass(owner, name, desc)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun newMethod(origin: JvmDeclarationOrigin, access: Int, name: String, desc: String, signature: String?, exceptions: Array<out String>?): MethodVisitor {
|
override fun newMethod(
|
||||||
|
origin: JvmDeclarationOrigin,
|
||||||
|
access: Int,
|
||||||
|
name: String,
|
||||||
|
desc: String,
|
||||||
|
signature: String?,
|
||||||
|
exceptions: Array<out String>?
|
||||||
|
): MethodVisitor {
|
||||||
if (publicAbi) {
|
if (publicAbi) {
|
||||||
return super.newMethod(origin, access, name, desc, signature, exceptions)
|
return super.newMethod(origin, access, name, desc, signature, exceptions)
|
||||||
}
|
}
|
||||||
@@ -121,8 +140,10 @@ class JvmAbiClassBuilderInterceptor : ClassBuilderInterceptorExtension {
|
|||||||
|
|
||||||
// Remove private functions from the ABI jars
|
// Remove private functions from the ABI jars
|
||||||
val descriptor = origin.descriptor as? MemberDescriptor
|
val descriptor = origin.descriptor as? MemberDescriptor
|
||||||
if (access and Opcodes.ACC_PRIVATE != 0 && descriptor?.visibility?.let(DescriptorVisibilities::isPrivate) == true
|
if (
|
||||||
|| name == "<clinit>" || name.startsWith("access\$") && access and Opcodes.ACC_SYNTHETIC != 0) {
|
access and Opcodes.ACC_PRIVATE != 0 && descriptor?.visibility?.let(DescriptorVisibilities::isPrivate) == true
|
||||||
|
|| name == "<clinit>" || name.startsWith("access\$") && access and Opcodes.ACC_SYNTHETIC != 0
|
||||||
|
) {
|
||||||
return super.newMethod(origin, access, name, desc, signature, exceptions)
|
return super.newMethod(origin, access, name, desc, signature, exceptions)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -153,7 +174,7 @@ class JvmAbiClassBuilderInterceptor : ClassBuilderInterceptorExtension {
|
|||||||
|
|
||||||
override fun done() {
|
override fun done() {
|
||||||
// Remove local or anonymous classes unless they are in the scope of an inline function and
|
// Remove local or anonymous classes unless they are in the scope of an inline function and
|
||||||
// strip non-inline methods from all other classe.
|
// strip non-inline methods from all other classes.
|
||||||
when {
|
when {
|
||||||
publicAbi ->
|
publicAbi ->
|
||||||
abiClassInfo[internalName] = AbiClassInfo.Public
|
abiClassInfo[internalName] = AbiClassInfo.Public
|
||||||
|
|||||||
@@ -22,8 +22,12 @@ fun abiMetadataProcessor(annotationVisitor: AnnotationVisitor): AnnotationVisito
|
|||||||
kotlinClassHeaderVisitor { header ->
|
kotlinClassHeaderVisitor { header ->
|
||||||
// kotlinx-metadata only supports writing Kotlin metadata of version >= 1.4, so we need to
|
// kotlinx-metadata only supports writing Kotlin metadata of version >= 1.4, so we need to
|
||||||
// update the metadata version if we encounter older metadata annotations.
|
// update the metadata version if we encounter older metadata annotations.
|
||||||
val metadataVersion =
|
val metadataVersion = header.metadataVersion.takeIf { v ->
|
||||||
if (header.metadataVersion.let { it.size >= 2 && it[0] >= 1 && it[1] >= 4 }) header.metadataVersion else intArrayOf(1, 4)
|
val major = v.getOrNull(0) ?: 0
|
||||||
|
val minor = v.getOrNull(1) ?: 0
|
||||||
|
major > 1 || major == 1 && minor >= 4
|
||||||
|
} ?: intArrayOf(1, 4)
|
||||||
|
|
||||||
val newHeader = when (val metadata = KotlinClassMetadata.read(header)) {
|
val newHeader = when (val metadata = KotlinClassMetadata.read(header)) {
|
||||||
is KotlinClassMetadata.Class -> {
|
is KotlinClassMetadata.Class -> {
|
||||||
val writer = KotlinClassMetadata.Class.Writer()
|
val writer = KotlinClassMetadata.Class.Writer()
|
||||||
@@ -70,30 +74,31 @@ private fun kotlinClassHeaderVisitor(body: (KotlinClassHeader) -> Unit): Annotat
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun visitArray(name: String): AnnotationVisitor {
|
override fun visitArray(name: String): AnnotationVisitor? {
|
||||||
val destination = when (name) {
|
val destination = when (name) {
|
||||||
METADATA_DATA_FIELD_NAME -> data1
|
METADATA_DATA_FIELD_NAME -> data1
|
||||||
METADATA_STRINGS_FIELD_NAME -> data2
|
METADATA_STRINGS_FIELD_NAME -> data2
|
||||||
else -> error("Wrong array field in kotlin metadata: $name")
|
else -> return null
|
||||||
}
|
}
|
||||||
return object : AnnotationVisitor(Opcodes.ASM7) {
|
return object : AnnotationVisitor(Opcodes.API_VERSION) {
|
||||||
override fun visit(name: String?, value: Any?) {
|
override fun visit(name: String?, value: Any?) {
|
||||||
destination += value as String
|
destination += value as String
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
override fun visitEnd() {
|
override fun visitEnd() {
|
||||||
body(KotlinClassHeader(
|
body(
|
||||||
kind,
|
KotlinClassHeader(
|
||||||
metadataVersion,
|
kind,
|
||||||
data1.toTypedArray(),
|
metadataVersion,
|
||||||
data2.toTypedArray(),
|
data1.toTypedArray(),
|
||||||
extraString,
|
data2.toTypedArray(),
|
||||||
packageName,
|
extraString,
|
||||||
extraInt
|
packageName,
|
||||||
))
|
extraInt
|
||||||
|
)
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -158,7 +163,8 @@ private class AbiKmClassVisitor(delegate: KmClassVisitor) : KmClassVisitor(deleg
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class metadata adapter which removes private functions, properties, and type aliases.
|
* Class metadata adapter which removes private functions, properties, type aliases,
|
||||||
|
* and local delegated properties.
|
||||||
*/
|
*/
|
||||||
private class AbiKmPackageVisitor(delegate: KmPackageVisitor) : KmPackageVisitor(delegate) {
|
private class AbiKmPackageVisitor(delegate: KmPackageVisitor) : KmPackageVisitor(delegate) {
|
||||||
override fun visitFunction(flags: Flags, name: String): KmFunctionVisitor? {
|
override fun visitFunction(flags: Flags, name: String): KmFunctionVisitor? {
|
||||||
|
|||||||
Reference in New Issue
Block a user