Refactor MetadataExtensions.kt to remove extension visitors

This helps to completely get rid of Visitors API during reading and writing
of the JVM metadata.

Note: Klib writers still use .accept and left for future refactorings.

See also #KT-59442
This commit is contained in:
Leonid Startsev
2023-07-25 16:41:51 +02:00
committed by Space Team
parent b8e4b44b04
commit f450122d63
18 changed files with 241 additions and 358 deletions
@@ -2,7 +2,6 @@
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@file:Suppress("DEPRECATION_ERROR")
package kotlinx.metadata.klib
@@ -2,7 +2,7 @@
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@file:Suppress("DEPRECATION_ERROR")
@file:Suppress("DEPRECATION_ERROR") // Extension visitors
package kotlinx.metadata.klib.impl
@@ -18,7 +18,7 @@ import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.serialization.StringTableImpl
@Suppress("DEPRECATION", "DEPRECATION_ERROR")
@Suppress("DEPRECATION_ERROR")
internal class KlibMetadataExtensions : MetadataExtensions {
private fun ReadContext.getSourceFile(index: Int) =
@@ -27,8 +27,8 @@ internal class KlibMetadataExtensions : MetadataExtensions {
private fun WriteContext.getIndexOf(file: KlibSourceFile) =
strings.getStringIndex(file.name)
override fun readClassExtensions(v: KmClassVisitor, proto: ProtoBuf.Class, c: ReadContext) {
val extension = v.visitExtensions(KlibClassExtensionVisitor.TYPE) as? KlibClassExtensionVisitor ?: return
override fun readClassExtensions(kmClass: KmClass, proto: ProtoBuf.Class, c: ReadContext) {
val extension = kmClass.visitExtensions(KlibClassExtensionVisitor.TYPE) as? KlibClassExtensionVisitor ?: return
proto.getExtension(KlibMetadataProtoBuf.classAnnotation).forEach { annotation ->
extension.visitAnnotation(annotation.readAnnotation(c.strings))
@@ -48,8 +48,8 @@ internal class KlibMetadataExtensions : MetadataExtensions {
}
}
override fun readPackageExtensions(v: KmPackageVisitor, proto: ProtoBuf.Package, c: ReadContext) {
val extension = v.visitExtensions(KlibPackageExtensionVisitor.TYPE) as? KlibPackageExtensionVisitor ?: return
override fun readPackageExtensions(kmPackage: KmPackage, proto: ProtoBuf.Package, c: ReadContext) {
val extension = kmPackage.visitExtensions(KlibPackageExtensionVisitor.TYPE) as? KlibPackageExtensionVisitor ?: return
proto.getExtensionOrNull(KlibMetadataProtoBuf.packageFqName)?.let {
val fqName = (c.strings as NameResolverImpl).getPackageFqName(it)
@@ -57,8 +57,8 @@ internal class KlibMetadataExtensions : MetadataExtensions {
}
}
override fun readModuleFragmentExtensions(v: KmModuleFragmentVisitor, proto: ProtoBuf.PackageFragment, c: ReadContext) {
val extension = v.visitExtensions(KlibModuleFragmentExtensionVisitor.TYPE) as? KlibModuleFragmentExtensionVisitor ?: return
override fun readModuleFragmentExtensions(kmModuleFragment: KmModuleFragment, proto: ProtoBuf.PackageFragment, c: ReadContext) {
val extension = kmModuleFragment.visitExtensions(KlibModuleFragmentExtensionVisitor.TYPE) as? KlibModuleFragmentExtensionVisitor ?: return
proto.getExtension(KlibMetadataProtoBuf.packageFragmentFiles)
.map { c.getSourceFile(it) }
@@ -69,8 +69,8 @@ internal class KlibMetadataExtensions : MetadataExtensions {
.forEach(extension::visitClassName)
}
override fun readFunctionExtensions(v: KmFunctionVisitor, proto: ProtoBuf.Function, c: ReadContext) {
val extension = v.visitExtensions(KlibFunctionExtensionVisitor.TYPE) as? KlibFunctionExtensionVisitor ?: return
override fun readFunctionExtensions(kmFunction: KmFunction, proto: ProtoBuf.Function, c: ReadContext) {
val extension = kmFunction.visitExtensions(KlibFunctionExtensionVisitor.TYPE) as? KlibFunctionExtensionVisitor ?: return
proto.getExtension(KlibMetadataProtoBuf.functionAnnotation).forEach { annotation ->
extension.visitAnnotation(annotation.readAnnotation(c.strings))
@@ -84,8 +84,8 @@ internal class KlibMetadataExtensions : MetadataExtensions {
}
}
override fun readPropertyExtensions(v: KmPropertyVisitor, proto: ProtoBuf.Property, c: ReadContext) {
val extension = v.visitExtensions(KlibPropertyExtensionVisitor.TYPE) as? KlibPropertyExtensionVisitor ?: return
override fun readPropertyExtensions(kmProperty: KmProperty, proto: ProtoBuf.Property, c: ReadContext) {
val extension = kmProperty.visitExtensions(KlibPropertyExtensionVisitor.TYPE) as? KlibPropertyExtensionVisitor ?: return
proto.getExtension(KlibMetadataProtoBuf.propertyAnnotation).forEach { annotation ->
extension.visitAnnotation(annotation.readAnnotation(c.strings))
@@ -105,8 +105,8 @@ internal class KlibMetadataExtensions : MetadataExtensions {
}
}
override fun readConstructorExtensions(v: KmConstructorVisitor, proto: ProtoBuf.Constructor, c: ReadContext) {
val extension = v.visitExtensions(KlibConstructorExtensionVisitor.TYPE) as? KlibConstructorExtensionVisitor ?: return
override fun readConstructorExtensions(kmConstructor: KmConstructor, proto: ProtoBuf.Constructor, c: ReadContext) {
val extension = kmConstructor.visitExtensions(KlibConstructorExtensionVisitor.TYPE) as? KlibConstructorExtensionVisitor ?: return
proto.getExtension(KlibMetadataProtoBuf.constructorAnnotation).forEach { annotation ->
extension.visitAnnotation(annotation.readAnnotation(c.strings))
@@ -116,8 +116,8 @@ internal class KlibMetadataExtensions : MetadataExtensions {
}
}
override fun readTypeParameterExtensions(v: KmTypeParameterVisitor, proto: ProtoBuf.TypeParameter, c: ReadContext) {
val extension = v.visitExtensions(KlibTypeParameterExtensionVisitor.TYPE) as? KlibTypeParameterExtensionVisitor ?: return
override fun readTypeParameterExtensions(kmTypeParameter: KmTypeParameter, proto: ProtoBuf.TypeParameter, c: ReadContext) {
val extension = kmTypeParameter.visitExtensions(KlibTypeParameterExtensionVisitor.TYPE) as? KlibTypeParameterExtensionVisitor ?: return
proto.getExtension(KlibMetadataProtoBuf.typeParameterAnnotation).forEach { annotation ->
extension.visitAnnotation(annotation.readAnnotation(c.strings))
@@ -127,33 +127,32 @@ internal class KlibMetadataExtensions : MetadataExtensions {
}
}
override fun readTypeExtensions(v: KmTypeVisitor, proto: ProtoBuf.Type, c: ReadContext) {
val extension = v.visitExtensions(KlibTypeExtensionVisitor.TYPE) as? KlibTypeExtensionVisitor ?: return
override fun readTypeExtensions(kmType: KmType, proto: ProtoBuf.Type, c: ReadContext) {
val extension = kmType.visitExtensions(KlibTypeExtensionVisitor.TYPE) as? KlibTypeExtensionVisitor ?: return
proto.getExtension(KlibMetadataProtoBuf.typeAnnotation).forEach { annotation ->
extension.visitAnnotation(annotation.readAnnotation(c.strings))
}
}
override fun readTypeAliasExtensions(v: KmTypeAliasVisitor, proto: ProtoBuf.TypeAlias, c: ReadContext) {
val extension = v.visitExtensions(KlibTypeAliasExtensionVisitor.TYPE) as? KlibTypeAliasExtensionVisitor ?: return
override fun readTypeAliasExtensions(kmTypeAlias: KmTypeAlias, proto: ProtoBuf.TypeAlias, c: ReadContext) {
val extension = kmTypeAlias.visitExtensions(KlibTypeAliasExtensionVisitor.TYPE) as? KlibTypeAliasExtensionVisitor ?: return
proto.getExtension(KlibMetadataProtoBuf.typeAliasUniqId).let { descriptorUniqId ->
extension.visitUniqId(descriptorUniqId.readUniqId())
}
}
override fun readValueParameterExtensions(v: KmValueParameterVisitor, proto: ProtoBuf.ValueParameter, c: ReadContext) {
val extension = v.visitExtensions(KlibValueParameterExtensionVisitor.TYPE) as? KlibValueParameterExtensionVisitor ?: return
override fun readValueParameterExtensions(kmValueParameter: KmValueParameter, proto: ProtoBuf.ValueParameter, c: ReadContext) {
val extension = kmValueParameter.visitExtensions(KlibValueParameterExtensionVisitor.TYPE) as? KlibValueParameterExtensionVisitor ?: return
proto.getExtension(KlibMetadataProtoBuf.parameterAnnotation).forEach { annotation ->
extension.visitAnnotation(annotation.readAnnotation(c.strings))
}
}
override fun writeClassExtensions(extension: KmClassExtension, proto: ProtoBuf.Class.Builder, c: WriteContext): Boolean {
if (extension.type != KlibClassExtensionVisitor.TYPE) return false
extension.accept(object : KlibClassExtensionVisitor() {
override fun writeClassExtensions(kmClass: KmClass, proto: ProtoBuf.Class.Builder, c: WriteContext) {
kmClass.klibExtensions.accept(object : KlibClassExtensionVisitor() {
override fun visitAnnotation(annotation: KmAnnotation) {
proto.addExtension(
KlibMetadataProtoBuf.classAnnotation,
@@ -192,31 +191,27 @@ internal class KlibMetadataExtensions : MetadataExtensions {
}
}
})
return true
}
override fun writePackageExtensions(
extension: KmPackageExtension,
kmPackage: KmPackage,
proto: ProtoBuf.Package.Builder,
c: WriteContext
): Boolean {
if (extension.type != KlibPackageExtensionVisitor.TYPE) return false
extension.accept(object : KlibPackageExtensionVisitor() {
) {
kmPackage.klibExtensions.accept(object : KlibPackageExtensionVisitor() {
override fun visitFqName(name: String) {
val nameIdx = (c.strings as StringTableImpl).getPackageFqNameIndex(FqName(name))
proto.setExtension(KlibMetadataProtoBuf.packageFqName, nameIdx)
}
})
return true
}
override fun writeModuleFragmentExtensions(
type: KmExtensionType,
kmModuleFragment: KmModuleFragment,
proto: ProtoBuf.PackageFragment.Builder,
c: WriteContext
): KmModuleFragmentExtensionVisitor? {
if (type != KlibModuleFragmentExtensionVisitor.TYPE) return null
return object : KlibModuleFragmentExtensionVisitor() {
) {
kmModuleFragment.klibExtensions.accept(object : KlibModuleFragmentExtensionVisitor() {
override fun visitFile(file: KlibSourceFile) {
val fileIdx = c.getIndexOf(file)
proto.addExtension(KlibMetadataProtoBuf.packageFragmentFiles, fileIdx)
@@ -230,16 +225,15 @@ internal class KlibMetadataExtensions : MetadataExtensions {
val classNameIdx = (c.strings as StringTableImpl).getQualifiedClassNameIndex(ClassId.fromString(className))
proto.addExtension(KlibMetadataProtoBuf.className, classNameIdx)
}
}
})
}
override fun writeFunctionExtensions(
type: KmExtensionType,
kmFunction: KmFunction,
proto: ProtoBuf.Function.Builder,
c: WriteContext
): KmFunctionExtensionVisitor? {
if (type != KlibFunctionExtensionVisitor.TYPE) return null
return object : KlibFunctionExtensionVisitor() {
) {
kmFunction.klibExtensions.accept(object : KlibFunctionExtensionVisitor() {
override fun visitAnnotation(annotation: KmAnnotation) {
proto.addExtension(
KlibMetadataProtoBuf.functionAnnotation,
@@ -258,16 +252,15 @@ internal class KlibMetadataExtensions : MetadataExtensions {
val index = c.getIndexOf(file)
proto.setExtension(KlibMetadataProtoBuf.functionFile, index)
}
}
})
}
override fun writePropertyExtensions(
type: KmExtensionType,
kmProperty: KmProperty,
proto: ProtoBuf.Property.Builder,
c: WriteContext
): KmPropertyExtensionVisitor? {
if (type != KlibPropertyExtensionVisitor.TYPE) return null
return object : KlibPropertyExtensionVisitor() {
) {
kmProperty.klibExtensions.accept(object : KlibPropertyExtensionVisitor() {
override fun visitAnnotation(annotation: KmAnnotation) {
proto.addExtension(
KlibMetadataProtoBuf.propertyAnnotation,
@@ -309,16 +302,15 @@ internal class KlibMetadataExtensions : MetadataExtensions {
value.writeAnnotationArgument(c.strings).build()
)
}
}
})
}
override fun writeConstructorExtensions(
type: KmExtensionType,
kmConstructor: KmConstructor,
proto: ProtoBuf.Constructor.Builder,
c: WriteContext
): KmConstructorExtensionVisitor? {
if (type != KlibConstructorExtensionVisitor.TYPE) return null
return object : KlibConstructorExtensionVisitor() {
) {
kmConstructor.klibExtensions.accept(object : KlibConstructorExtensionVisitor() {
override fun visitAnnotation(annotation: KmAnnotation) {
proto.addExtension(
KlibMetadataProtoBuf.constructorAnnotation,
@@ -332,16 +324,15 @@ internal class KlibMetadataExtensions : MetadataExtensions {
uniqId.writeUniqId().build()
)
}
}
})
}
override fun writeTypeParameterExtensions(
type: KmExtensionType,
kmTypeParameter: KmTypeParameter,
proto: ProtoBuf.TypeParameter.Builder,
c: WriteContext
): KmTypeParameterExtensionVisitor? {
if (type != KlibTypeParameterExtensionVisitor.TYPE) return null
return object : KlibTypeParameterExtensionVisitor() {
) {
kmTypeParameter.klibExtensions.accept(object : KlibTypeParameterExtensionVisitor() {
override fun visitAnnotation(annotation: KmAnnotation) {
proto.addExtension(
KlibMetadataProtoBuf.typeParameterAnnotation,
@@ -355,51 +346,48 @@ internal class KlibMetadataExtensions : MetadataExtensions {
uniqId.writeUniqId().build()
)
}
}
})
}
override fun writeTypeExtensions(type: KmExtensionType, proto: ProtoBuf.Type.Builder, c: WriteContext): KmTypeExtensionVisitor? {
if (type != KlibTypeExtensionVisitor.TYPE) return null
return object : KlibTypeExtensionVisitor() {
override fun writeTypeExtensions(type: KmType, proto: ProtoBuf.Type.Builder, c: WriteContext) {
type.klibExtensions.accept(object : KlibTypeExtensionVisitor() {
override fun visitAnnotation(annotation: KmAnnotation) {
proto.addExtension(
KlibMetadataProtoBuf.typeAnnotation,
annotation.writeAnnotation(c.strings).build()
)
}
}
})
}
override fun writeTypeAliasExtensions(
type: KmExtensionType,
typeAlias: KmTypeAlias,
proto: ProtoBuf.TypeAlias.Builder,
c: WriteContext
): KmTypeAliasExtensionVisitor? {
if (type != KlibTypeAliasExtensionVisitor.TYPE) return null
return object : KlibTypeAliasExtensionVisitor() {
) {
typeAlias.klibExtensions.accept(object : KlibTypeAliasExtensionVisitor() {
override fun visitUniqId(uniqId: UniqId) {
proto.setExtension(
KlibMetadataProtoBuf.typeAliasUniqId,
uniqId.writeUniqId().build()
)
}
}
})
}
override fun writeValueParameterExtensions(
type: KmExtensionType,
valueParameter: KmValueParameter,
proto: ProtoBuf.ValueParameter.Builder,
c: WriteContext
): KmValueParameterExtensionVisitor? {
if (type != KlibValueParameterExtensionVisitor.TYPE) return null
return object : KlibValueParameterExtensionVisitor() {
) {
valueParameter.klibExtensions.accept(object : KlibValueParameterExtensionVisitor() {
override fun visitAnnotation(annotation: KmAnnotation) {
proto.addExtension(
KlibMetadataProtoBuf.parameterAnnotation,
annotation.writeAnnotation(c.strings).build()
)
}
}
})
}
override fun createClassExtension(): KmClassExtension =
@@ -2,7 +2,7 @@
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@file:Suppress("DEPRECATION_ERROR")
@file:Suppress("DEPRECATION_ERROR") // Extension visitors
package kotlinx.metadata.klib