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,7 @@
* Copyright 2010-2018 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") // delegate implementation
package kotlinx.metadata.jvm
@@ -2,7 +2,10 @@
* Copyright 2010-2023 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", "UNUSED_PARAMETER")
@file:Suppress(
"DEPRECATION_ERROR", // Deprecated .accept implementation
"UNUSED_PARAMETER" // For deprecated Writer.write
)
package kotlinx.metadata.jvm
@@ -5,11 +5,11 @@
@file:Suppress(
"MemberVisibilityCanBePrivate",
"DEPRECATION",
"DEPRECATION_ERROR",
"DEPRECATION", // For KmModule.annotations — remove reading when deprecation is raised to error
"DEPRECATION_ERROR", // deprecated .accept implementation
"INVISIBLE_MEMBER", // InconsistentKotlinMetadataException
"INVISIBLE_REFERENCE",
"UNUSED_PARAMETER"
"UNUSED_PARAMETER" // For deprecated Writer.write
)
package kotlinx.metadata.jvm
@@ -2,7 +2,7 @@
* Copyright 2010-2022 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","DEPRECATION_ERROR")
@file:Suppress("DEPRECATION","DEPRECATION_ERROR") // inheritance of deprecated visitors will be removed with visitors
package kotlinx.metadata.jvm.internal
@@ -15,272 +15,212 @@ import org.jetbrains.kotlin.metadata.deserialization.getExtensionOrNull
import org.jetbrains.kotlin.metadata.jvm.JvmProtoBuf
import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmProtoBufUtil
@Suppress("DEPRECATION_ERROR")
internal class JvmMetadataExtensions : MetadataExtensions {
override fun readClassExtensions(v: KmClassVisitor, proto: ProtoBuf.Class, c: ReadContext) {
val ext = v.visitExtensions(JvmClassExtensionVisitor.TYPE) as? JvmClassExtensionVisitor ?: return
ext as JvmClassExtension
override fun readClassExtensions(kmClass: KmClass, proto: ProtoBuf.Class, c: ReadContext) {
val ext = kmClass.jvm
val anonymousObjectOriginName = proto.getExtensionOrNull(JvmProtoBuf.anonymousObjectOriginName)
if (anonymousObjectOriginName != null) {
ext.visitAnonymousObjectOriginName(c[anonymousObjectOriginName])
ext.anonymousObjectOriginName = c[anonymousObjectOriginName]
}
for (property in proto.getExtension(JvmProtoBuf.classLocalVariable)) {
ext.localDelegatedProperties.add(property.toKmProperty(c))
}
ext.visitModuleName(proto.getExtensionOrNull(JvmProtoBuf.classModuleName)?.let(c::get) ?: JvmProtoBufUtil.DEFAULT_MODULE_NAME)
ext.moduleName = proto.getExtensionOrNull(JvmProtoBuf.classModuleName)?.let(c::get) ?: JvmProtoBufUtil.DEFAULT_MODULE_NAME
proto.getExtensionOrNull(JvmProtoBuf.jvmClassFlags)?.let(ext::visitJvmFlags)
ext.visitEnd()
proto.getExtensionOrNull(JvmProtoBuf.jvmClassFlags)?.let {
ext.jvmFlags = it
}
}
override fun readPackageExtensions(v: KmPackageVisitor, proto: ProtoBuf.Package, c: ReadContext) {
val ext = v.visitExtensions(JvmPackageExtensionVisitor.TYPE) as? JvmPackageExtensionVisitor ?: return
ext as JvmPackageExtension
override fun readPackageExtensions(kmPackage: KmPackage, proto: ProtoBuf.Package, c: ReadContext) {
val ext = kmPackage.jvm
for (property in proto.getExtension(JvmProtoBuf.packageLocalVariable)) {
ext.localDelegatedProperties.add(property.toKmProperty(c))
}
ext.visitModuleName(proto.getExtensionOrNull(JvmProtoBuf.packageModuleName)?.let(c::get) ?: JvmProtoBufUtil.DEFAULT_MODULE_NAME)
ext.visitEnd()
ext.moduleName = proto.getExtensionOrNull(JvmProtoBuf.packageModuleName)?.let(c::get) ?: JvmProtoBufUtil.DEFAULT_MODULE_NAME
}
// ModuleFragment is not used by JVM backend.
override fun readModuleFragmentExtensions(v: KmModuleFragmentVisitor, proto: ProtoBuf.PackageFragment, c: ReadContext) {}
override fun readModuleFragmentExtensions(kmModuleFragment: KmModuleFragment, proto: ProtoBuf.PackageFragment, c: ReadContext) {}
override fun readFunctionExtensions(v: KmFunctionVisitor, proto: ProtoBuf.Function, c: ReadContext) {
val ext = v.visitExtensions(JvmFunctionExtensionVisitor.TYPE) as? JvmFunctionExtensionVisitor ?: return
ext.visit(JvmProtoBufUtil.getJvmMethodSignature(proto, c.strings, c.types)?.wrapAsPublic())
override fun readFunctionExtensions(kmFunction: KmFunction, proto: ProtoBuf.Function, c: ReadContext) {
val ext = kmFunction.jvm
ext.signature = JvmProtoBufUtil.getJvmMethodSignature(proto, c.strings, c.types)?.wrapAsPublic()
val lambdaClassOriginName = proto.getExtensionOrNull(JvmProtoBuf.lambdaClassOriginName)
if (lambdaClassOriginName != null) {
ext.visitLambdaClassOriginName(c[lambdaClassOriginName])
ext.lambdaClassOriginName = c[lambdaClassOriginName]
}
ext.visitEnd()
}
override fun readPropertyExtensions(v: KmPropertyVisitor, proto: ProtoBuf.Property, c: ReadContext) {
val ext = v.visitExtensions(JvmPropertyExtensionVisitor.TYPE) as? JvmPropertyExtensionVisitor ?: return
override fun readPropertyExtensions(kmProperty: KmProperty, proto: ProtoBuf.Property, c: ReadContext) {
val ext = kmProperty.jvm
val fieldSignature = JvmProtoBufUtil.getJvmFieldSignature(proto, c.strings, c.types)
val propertySignature = proto.getExtensionOrNull(JvmProtoBuf.propertySignature)
val getterSignature =
if (propertySignature != null && propertySignature.hasGetter()) propertySignature.getter else null
val setterSignature =
if (propertySignature != null && propertySignature.hasSetter()) propertySignature.setter else null
ext.visit(
proto.getExtension(JvmProtoBuf.flags),
fieldSignature?.wrapAsPublic(),
getterSignature?.run { JvmMethodSignature(c[name], c[desc]) },
setterSignature?.run { JvmMethodSignature(c[name], c[desc]) }
)
ext.jvmFlags = proto.getExtension(JvmProtoBuf.flags)
ext.fieldSignature = fieldSignature?.wrapAsPublic()
ext.getterSignature = getterSignature?.run { JvmMethodSignature(c[name], c[desc]) }
ext.setterSignature = setterSignature?.run { JvmMethodSignature(c[name], c[desc]) }
val syntheticMethod =
if (propertySignature != null && propertySignature.hasSyntheticMethod()) propertySignature.syntheticMethod else null
ext.visitSyntheticMethodForAnnotations(syntheticMethod?.run { JvmMethodSignature(c[name], c[desc]) })
ext.syntheticMethodForAnnotations = syntheticMethod?.run { JvmMethodSignature(c[name], c[desc]) }
val delegateMethod =
if (propertySignature != null && propertySignature.hasDelegateMethod()) propertySignature.delegateMethod else null
ext.visitSyntheticMethodForDelegate(delegateMethod?.run { JvmMethodSignature(c[name], c[desc]) })
ext.visitEnd()
ext.syntheticMethodForDelegate = delegateMethod?.run { JvmMethodSignature(c[name], c[desc]) }
}
override fun readConstructorExtensions(v: KmConstructorVisitor, proto: ProtoBuf.Constructor, c: ReadContext) {
val ext = v.visitExtensions(JvmConstructorExtensionVisitor.TYPE) as? JvmConstructorExtensionVisitor ?: return
ext.visit(JvmProtoBufUtil.getJvmConstructorSignature(proto, c.strings, c.types)?.wrapAsPublic())
override fun readConstructorExtensions(kmConstructor: KmConstructor, proto: ProtoBuf.Constructor, c: ReadContext) {
val ext = kmConstructor.jvm
ext.signature = JvmProtoBufUtil.getJvmConstructorSignature(proto, c.strings, c.types)?.wrapAsPublic()
}
override fun readTypeParameterExtensions(v: KmTypeParameterVisitor, proto: ProtoBuf.TypeParameter, c: ReadContext) {
val ext = v.visitExtensions(JvmTypeParameterExtensionVisitor.TYPE) as? JvmTypeParameterExtensionVisitor ?: return
override fun readTypeParameterExtensions(kmTypeParameter: KmTypeParameter, proto: ProtoBuf.TypeParameter, c: ReadContext) {
val ext = kmTypeParameter.jvm
for (annotation in proto.getExtension(JvmProtoBuf.typeParameterAnnotation)) {
ext.visitAnnotation(annotation.readAnnotation(c.strings))
ext.annotations.add(annotation.readAnnotation(c.strings))
}
ext.visitEnd()
}
override fun readTypeExtensions(v: KmTypeVisitor, proto: ProtoBuf.Type, c: ReadContext) {
val ext = v.visitExtensions(JvmTypeExtensionVisitor.TYPE) as? JvmTypeExtensionVisitor ?: return
ext.visit(proto.getExtension(JvmProtoBuf.isRaw))
override fun readTypeExtensions(kmType: KmType, proto: ProtoBuf.Type, c: ReadContext) {
val ext = kmType.jvm
ext.isRaw = proto.getExtension(JvmProtoBuf.isRaw)
for (annotation in proto.getExtension(JvmProtoBuf.typeAnnotation)) {
ext.visitAnnotation(annotation.readAnnotation(c.strings))
ext.annotations.add(annotation.readAnnotation(c.strings))
}
ext.visitEnd()
}
override fun readTypeAliasExtensions(v: KmTypeAliasVisitor, proto: ProtoBuf.TypeAlias, c: ReadContext) {}
override fun readTypeAliasExtensions(kmTypeAlias: KmTypeAlias, proto: ProtoBuf.TypeAlias, c: ReadContext) {}
override fun readValueParameterExtensions(v: KmValueParameterVisitor, proto: ProtoBuf.ValueParameter, c: ReadContext) {}
override fun readValueParameterExtensions(kmValueParameter: KmValueParameter, proto: ProtoBuf.ValueParameter, c: ReadContext) {}
override fun writeClassExtensions(extension: KmClassExtension, proto: ProtoBuf.Class.Builder, c: WriteContext): Boolean {
if (extension.type != JvmClassExtensionVisitor.TYPE) return false
extension as JvmClassExtension
extension.anonymousObjectOriginName?.let { proto.setExtension(JvmProtoBuf.anonymousObjectOriginName, c[it]) }
extension.localDelegatedProperties.forEach {
proto.addExtension(JvmProtoBuf.classLocalVariable, c.writeProperty(it).build())
override fun writeClassExtensions(kmClass: KmClass, proto: ProtoBuf.Class.Builder, c: WriteContext) =
with(kmClass.jvm) {
anonymousObjectOriginName?.let {
proto.setExtension(JvmProtoBuf.anonymousObjectOriginName, c[it])
}
localDelegatedProperties.forEach {
proto.addExtension(JvmProtoBuf.classLocalVariable, c.writeProperty(it).build())
}
moduleName?.let { moduleName ->
if (moduleName != JvmProtoBufUtil.DEFAULT_MODULE_NAME) proto.setExtension(JvmProtoBuf.classModuleName, c[moduleName])
}
if (jvmFlags != 0) proto.setExtension(JvmProtoBuf.jvmClassFlags, jvmFlags)
}
extension.moduleName?.let { moduleName ->
if (moduleName != JvmProtoBufUtil.DEFAULT_MODULE_NAME) proto.setExtension(JvmProtoBuf.classModuleName, c[moduleName])
}
if (extension.jvmFlags != 0) proto.setExtension(JvmProtoBuf.jvmClassFlags, extension.jvmFlags)
return true
}
override fun writePackageExtensions(
extension: KmPackageExtension, proto: ProtoBuf.Package.Builder, c: WriteContext
): Boolean {
if (extension.type != JvmPackageExtensionVisitor.TYPE) return false
extension as JvmPackageExtension
extension.localDelegatedProperties.forEach {
kmPackage: KmPackage, proto: ProtoBuf.Package.Builder, c: WriteContext,
): Unit = with(kmPackage.jvm) {
localDelegatedProperties.forEach {
proto.addExtension(JvmProtoBuf.packageLocalVariable, c.writeProperty(it).build())
}
extension.moduleName?.let { name ->
moduleName?.let { name ->
if (name != JvmProtoBufUtil.DEFAULT_MODULE_NAME) {
proto.setExtension(JvmProtoBuf.packageModuleName, c[name])
}
}
return true
}
// PackageFragment is not used by JVM backend.
override fun writeModuleFragmentExtensions(
type: KmExtensionType,
kmModuleFragment: KmModuleFragment,
proto: ProtoBuf.PackageFragment.Builder,
c: WriteContext
): KmModuleFragmentExtensionVisitor? = null
c: WriteContext,
) = Unit
override fun writeFunctionExtensions(
type: KmExtensionType, proto: ProtoBuf.Function.Builder, c: WriteContext
): KmFunctionExtensionVisitor? {
if (type != JvmFunctionExtensionVisitor.TYPE) return null
return object : JvmFunctionExtensionVisitor() {
override fun visit(signature: JvmMethodSignature?) {
if (signature != null) {
proto.setExtension(JvmProtoBuf.methodSignature, signature.toJvmMethodSignature(c))
}
}
override fun visitLambdaClassOriginName(internalName: String) {
proto.setExtension(JvmProtoBuf.lambdaClassOriginName, c[internalName])
}
kmFunction: KmFunction, proto: ProtoBuf.Function.Builder, c: WriteContext,
) {
with(kmFunction.jvm) {
signature?.let { proto.setExtension(JvmProtoBuf.methodSignature, it.toJvmMethodSignature(c)) }
lambdaClassOriginName?.let { proto.setExtension(JvmProtoBuf.lambdaClassOriginName, c[it]) }
}
}
override fun writePropertyExtensions(
type: KmExtensionType, proto: ProtoBuf.Property.Builder, c: WriteContext
): KmPropertyExtensionVisitor? {
if (type != JvmPropertyExtensionVisitor.TYPE) return null
return object : JvmPropertyExtensionVisitor() {
private var jvmFlags: Int = ProtoBuf.Property.getDefaultInstance().getExtension(JvmProtoBuf.flags)
private var signatureOrNull: JvmProtoBuf.JvmPropertySignature.Builder? = null
kmProperty: KmProperty, proto: ProtoBuf.Property.Builder, c: WriteContext,
) = with(kmProperty.jvm) {
val composedSignature: JvmProtoBuf.JvmPropertySignature.Builder = JvmProtoBuf.JvmPropertySignature.newBuilder()
var hasSignature = false
private val signature: JvmProtoBuf.JvmPropertySignature.Builder
get() = signatureOrNull ?: JvmProtoBuf.JvmPropertySignature.newBuilder().also { signatureOrNull = it }
override fun visit(
jvmFlags: Int,
fieldSignature: JvmFieldSignature?,
getterSignature: JvmMethodSignature?,
setterSignature: JvmMethodSignature?
) {
this.jvmFlags = jvmFlags
if (fieldSignature != null) {
signature.field = JvmProtoBuf.JvmFieldSignature.newBuilder().also { field ->
field.name = c[fieldSignature.name]
field.desc = c[fieldSignature.descriptor]
}.build()
}
if (getterSignature != null) {
signature.getter = getterSignature.toJvmMethodSignature(c)
}
if (setterSignature != null) {
signature.setter = setterSignature.toJvmMethodSignature(c)
}
}
override fun visitSyntheticMethodForAnnotations(signature: JvmMethodSignature?) {
if (signature == null) return
this.signature.syntheticMethod = signature.toJvmMethodSignature(c)
}
override fun visitSyntheticMethodForDelegate(signature: JvmMethodSignature?) {
if (signature == null) return
this.signature.delegateMethod = signature.toJvmMethodSignature(c)
}
override fun visitEnd() {
if (jvmFlags != ProtoBuf.Property.getDefaultInstance().getExtension(JvmProtoBuf.flags)) {
proto.setExtension(JvmProtoBuf.flags, jvmFlags)
}
if (signatureOrNull != null) {
proto.setExtension(JvmProtoBuf.propertySignature, signature.build())
}
}
if (fieldSignature != null) {
hasSignature = true
composedSignature.field = JvmProtoBuf.JvmFieldSignature.newBuilder().also { field ->
field.name = c[fieldSignature!!.name]
field.desc = c[fieldSignature!!.descriptor]
}.build()
}
if (getterSignature != null) {
hasSignature = true
composedSignature.getter = getterSignature!!.toJvmMethodSignature(c)
}
if (setterSignature != null) {
hasSignature = true
composedSignature.setter = setterSignature!!.toJvmMethodSignature(c)
}
if (hasSignature && syntheticMethodForAnnotations != null) {
composedSignature.syntheticMethod = syntheticMethodForAnnotations!!.toJvmMethodSignature(c)
}
if (hasSignature && syntheticMethodForDelegate != null) {
composedSignature.delegateMethod = syntheticMethodForDelegate!!.toJvmMethodSignature(c)
}
if (jvmFlags != ProtoBuf.Property.getDefaultInstance().getExtension(JvmProtoBuf.flags)) {
proto.setExtension(JvmProtoBuf.flags, jvmFlags)
}
if (hasSignature) {
proto.setExtension(JvmProtoBuf.propertySignature, composedSignature.build())
}
}
override fun writeConstructorExtensions(
type: KmExtensionType, proto: ProtoBuf.Constructor.Builder, c: WriteContext
): KmConstructorExtensionVisitor? {
if (type != JvmConstructorExtensionVisitor.TYPE) return null
return object : JvmConstructorExtensionVisitor() {
override fun visit(signature: JvmMethodSignature?) {
if (signature != null) {
proto.setExtension(JvmProtoBuf.constructorSignature, signature.toJvmMethodSignature(c))
}
}
}
kmConstructor: KmConstructor, proto: ProtoBuf.Constructor.Builder, c: WriteContext,
): Unit = with(kmConstructor.jvm) {
signature?.let { proto.setExtension(JvmProtoBuf.constructorSignature, it.toJvmMethodSignature(c)) }
}
override fun writeTypeParameterExtensions(
type: KmExtensionType, proto: ProtoBuf.TypeParameter.Builder, c: WriteContext
): KmTypeParameterExtensionVisitor? {
if (type != JvmTypeParameterExtensionVisitor.TYPE) return null
return object : JvmTypeParameterExtensionVisitor() {
override fun visitAnnotation(annotation: KmAnnotation) {
proto.addExtension(JvmProtoBuf.typeParameterAnnotation, annotation.writeAnnotation(c.strings).build())
}
kmTypeParameter: KmTypeParameter, proto: ProtoBuf.TypeParameter.Builder, c: WriteContext,
) = with(kmTypeParameter.jvm) {
annotations.forEach { annotation ->
proto.addExtension(JvmProtoBuf.typeParameterAnnotation, annotation.writeAnnotation(c.strings).build())
}
}
override fun writeTypeExtensions(type: KmExtensionType, proto: ProtoBuf.Type.Builder, c: WriteContext): KmTypeExtensionVisitor? {
if (type != JvmTypeExtensionVisitor.TYPE) return null
return object : JvmTypeExtensionVisitor() {
override fun visit(isRaw: Boolean) {
if (isRaw) {
proto.setExtension(JvmProtoBuf.isRaw, true)
}
}
override fun visitAnnotation(annotation: KmAnnotation) {
override fun writeTypeExtensions(type: KmType, proto: ProtoBuf.Type.Builder, c: WriteContext) =
with(type.jvm) {
if (isRaw) proto.setExtension(JvmProtoBuf.isRaw, true)
annotations.forEach { annotation ->
proto.addExtension(JvmProtoBuf.typeAnnotation, annotation.writeAnnotation(c.strings).build())
}
}
}
override fun writeTypeAliasExtensions(
type: KmExtensionType,
typeAlias: KmTypeAlias,
proto: ProtoBuf.TypeAlias.Builder,
c: WriteContext
): KmTypeAliasExtensionVisitor? = null
c: WriteContext,
) = Unit
override fun writeValueParameterExtensions(
type: KmExtensionType,
valueParameter: KmValueParameter,
proto: ProtoBuf.ValueParameter.Builder,
c: WriteContext
): KmValueParameterExtensionVisitor? = null
c: WriteContext,
) = Unit
override fun createClassExtension(): KmClassExtension = JvmClassExtension()
override fun createPackageExtension(): KmPackageExtension = JvmPackageExtension()
@Suppress("DEPRECATION_ERROR")
override fun createModuleFragmentExtensions(): KmModuleFragmentExtension =
object : KmModuleFragmentExtension {
override val type: KmExtensionType = KmExtensionType(KmModuleFragmentExtension::class)
@@ -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
@@ -821,7 +821,7 @@ public class KmTypeParameter @Deprecated(flagsCtorDeprecated) constructor(
KmType(flags).addTo(upperBounds)
@Deprecated(VISITOR_API_MESSAGE, level = DeprecationLevel.ERROR)
override fun visitExtensions(type: KmExtensionType): KmTypeParameterExtensionVisitor? =
override fun visitExtensions(type: KmExtensionType): KmTypeParameterExtensionVisitor =
extensions.singleOfType(type)
/**
@@ -86,9 +86,7 @@ public fun ProtoBuf.Class.toKmClass(
contextReceiverTypes(c.types).mapTo(v.contextReceiverTypes) { it.toKmType(c) }
versionRequirementList.mapTo(v.versionRequirements) { readVersionRequirement(it, c) }
for (extension in c.extensions) {
extension.readClassExtensions(v, this, c)
}
c.extensions.forEach { it.readClassExtensions(v, this, c) }
return v
}
@@ -119,9 +117,7 @@ public fun ProtoBuf.Package.toKmPackage(
v.visitDeclarations(functionList, propertyList, typeAliasList, c)
for (extension in c.extensions) {
extension.readPackageExtensions(v, this, c)
}
c.extensions.forEach { it.readPackageExtensions(v, this, c) }
return v
}
@@ -141,9 +137,7 @@ public fun ProtoBuf.PackageFragment.toKmModuleFragment(
v.pkg = `package`.toKmPackage(strings, contextExtensions)
class_List.mapTo(v.classes) { it.toKmClass(strings, contextExtensions) }
for (extension in c.extensions) {
extension.readModuleFragmentExtensions(v, this, c)
}
c.extensions.forEach { it.readModuleFragmentExtensions(v, this, c) }
return v
}
@@ -171,9 +165,7 @@ private fun ProtoBuf.Constructor.toKmConstructor(c: ReadContext): KmConstructor
valueParameterList.mapTo(v.valueParameters) { it.toKmValueParameter(c) }
versionRequirementList.mapTo(v.versionRequirements) { readVersionRequirement(it, c) }
for (extension in c.extensions) {
extension.readConstructorExtensions(v, this, c)
}
c.extensions.forEach { it.readConstructorExtensions(v, this, c) }
return v
}
@@ -196,9 +188,7 @@ private fun ProtoBuf.Function.toKmFunction(outer: ReadContext): KmFunction {
versionRequirementList.mapTo(v.versionRequirements) { readVersionRequirement(it, c) }
for (extension in c.extensions) {
extension.readFunctionExtensions(v, this, c)
}
c.extensions.forEach { it.readFunctionExtensions(v, this, c) }
return v
}
@@ -217,9 +207,7 @@ public fun ProtoBuf.Property.toKmProperty(outer: ReadContext): KmProperty {
v.returnType = returnType(c.types).toKmType(c)
versionRequirementList.mapTo(v.versionRequirements) { readVersionRequirement(it, c) }
for (extension in c.extensions) {
extension.readPropertyExtensions(v, this, c)
}
c.extensions.forEach { it.readPropertyExtensions(v, this, c) }
return v
}
@@ -236,9 +224,7 @@ private fun ProtoBuf.TypeAlias.toKmTypeAlias(outer: ReadContext): KmTypeAlias {
versionRequirementList.mapTo(v.versionRequirements) { readVersionRequirement(it, c) }
for (extension in c.extensions) {
extension.readTypeAliasExtensions(v, this, c)
}
c.extensions.forEach { it.readTypeAliasExtensions(v, this, c) }
return v
}
@@ -249,9 +235,7 @@ private fun ProtoBuf.ValueParameter.toKmValueParameter(c: ReadContext): KmValueP
v.varargElementType = varargElementType(c.types)?.toKmType(c)
for (extension in c.extensions) {
extension.readValueParameterExtensions(v, this, c)
}
c.extensions.forEach { it.readValueParameterExtensions(v, this, c) }
return v
}
@@ -268,9 +252,7 @@ private fun ProtoBuf.TypeParameter.toKmTypeParameter(
upperBounds(c.types).mapTo(ktp.upperBounds) { it.toKmType(c) }
for (extension in c.extensions) {
extension.readTypeParameterExtensions(ktp, this, c)
}
c.extensions.forEach { it.readTypeParameterExtensions(ktp, this, c) }
return ktp
}
@@ -313,9 +295,7 @@ private fun ProtoBuf.Type.toKmType(c: ReadContext): KmType {
KmFlexibleTypeUpperBound(it, if (hasFlexibleTypeCapabilitiesId()) c[flexibleTypeCapabilitiesId] else null)
}
for (extension in c.extensions) {
extension.readTypeExtensions(v, this, c)
}
c.extensions.forEach { it.readTypeExtensions(v, this, c) }
return v
}
@@ -6,9 +6,6 @@
package kotlinx.metadata.internal
import kotlinx.metadata.*
import kotlinx.metadata.internal.extensions.KmExtension
import kotlinx.metadata.internal.extensions.MetadataExtensions
import kotlinx.metadata.internal.extensions.applySingleExtension
import org.jetbrains.kotlin.metadata.ProtoBuf
import org.jetbrains.kotlin.metadata.deserialization.Flags
import org.jetbrains.kotlin.metadata.serialization.StringTable
@@ -115,9 +112,3 @@ internal fun StringTable.getClassNameIndex(name: ClassName): Int =
getQualifiedClassNameIndex(name.substring(1), true)
else
getQualifiedClassNameIndex(name, false)
@Suppress("DEPRECATION_ERROR")
internal fun <V : KmExtensionVisitor, E : KmExtension<V>> List<E>.writeExtensions(writer: MetadataExtensions.(KmExtensionType) -> V?) =
forEach { ext ->
applySingleExtension(ext.type) { writer(ext.type) }?.let { ext.accept(it) }
}
@@ -8,7 +8,6 @@ package kotlinx.metadata.internal
import kotlinx.metadata.*
import kotlinx.metadata.internal.common.KmModuleFragment
import kotlinx.metadata.internal.extensions.MetadataExtensions
import kotlinx.metadata.internal.extensions.matchExtensions
import org.jetbrains.kotlin.metadata.ProtoBuf
import org.jetbrains.kotlin.metadata.deserialization.VersionRequirement
import org.jetbrains.kotlin.metadata.serialization.MutableVersionRequirementTable
@@ -24,6 +23,8 @@ public interface WriteContextExtension
public open class WriteContext(public val strings: StringTable, public val contextExtensions: List<WriteContextExtension> = emptyList()) {
internal val versionRequirements: MutableVersionRequirementTable = MutableVersionRequirementTable()
internal val extensions = MetadataExtensions.INSTANCES
public operator fun get(string: String): Int =
strings.getStringIndex(string)
@@ -36,8 +37,8 @@ private fun WriteContext.writeTypeParameter(kmTypeParameter: KmTypeParameter): P
kmTypeParameter.upperBounds.forEach { ub ->
t.addUpperBound(writeType(ub).build())
}
kmTypeParameter.extensions.writeExtensions {
writeTypeParameterExtensions(it, t, this@writeTypeParameter)
extensions.forEach {
it.writeTypeParameterExtensions(kmTypeParameter, t, this)
}
t.name = this[kmTypeParameter.name]
t.id = kmTypeParameter.id
@@ -91,9 +92,7 @@ private fun WriteContext.writeType(kmType: KmType): ProtoBuf.Type.Builder {
t.flexibleUpperBound = fubType.build()
}
kmType.extensions.writeExtensions {
writeTypeExtensions(it, t, this@writeType)
}
extensions.forEach { it.writeTypeExtensions(kmType, t, this) }
if (kmType.isNullable) {
t.nullable = true
@@ -112,8 +111,8 @@ private fun WriteContext.writeConstructor(kmConstructor: KmConstructor): ProtoBu
t.addValueParameter(writeValueParameter(it).build())
}
kmConstructor.versionRequirements.forEach { t.addVersionRequirement(writeVersionRequirement(it)) }
kmConstructor.extensions.writeExtensions {
writeConstructorExtensions(it, t, this@writeConstructor)
extensions.forEach {
it.writeConstructorExtensions(kmConstructor, t, this)
}
if (kmConstructor.flags != ProtoBuf.Constructor.getDefaultInstance().flags) {
t.flags = kmConstructor.flags
@@ -125,14 +124,18 @@ private fun WriteContext.writeFunction(kmFunction: KmFunction): ProtoBuf.Functio
val t = ProtoBuf.Function.newBuilder()
t.addAllTypeParameter(kmFunction.typeParameters.map { writeTypeParameter(it).build() })
kmFunction.receiverParameterType?.let { t.receiverType = writeType(it).build() }
@OptIn(ExperimentalContextReceivers::class)
t.addAllContextReceiverType(kmFunction.contextReceiverTypes.map { writeType(it).build() })
t.addAllValueParameter(kmFunction.valueParameters.map { writeValueParameter(it).build() })
t.returnType = writeType(kmFunction.returnType).build()
t.addAllVersionRequirement(kmFunction.versionRequirements.map(::writeVersionRequirement))
@OptIn(ExperimentalContracts::class)
kmFunction.contract?.let { t.contract = writeContract(it) }
kmFunction.extensions.writeExtensions { writeFunctionExtensions(it, t, this@writeFunction) }
extensions.forEach { it.writeFunctionExtensions(kmFunction, t, this) }
t.name = this[kmFunction.name]
if (kmFunction.flags != ProtoBuf.Function.getDefaultInstance().flags) {
t.flags = kmFunction.flags
@@ -148,12 +151,15 @@ public fun WriteContext.writeProperty(kmProperty: KmProperty): ProtoBuf.Property
t.addTypeParameter(writeTypeParameter(tp).build())
}
kmProperty.receiverParameterType?.let { t.receiverType = writeType(it).build() }
@OptIn(ExperimentalContextReceivers::class)
t.addAllContextReceiverType(kmProperty.contextReceiverTypes.map { writeType(it).build() })
kmProperty.setterParameter?.let { t.setterValueParameter = writeValueParameter(it).build() }
t.returnType = writeType(kmProperty.returnType).build()
t.addAllVersionRequirement(kmProperty.versionRequirements.map { writeVersionRequirement(it) })
kmProperty.extensions.writeExtensions { writePropertyExtensions(it, t, this@writeProperty) }
extensions.forEach { it.writePropertyExtensions(kmProperty, t, this) }
t.name = this[kmProperty.name]
if (kmProperty.flags != ProtoBuf.Property.getDefaultInstance().flags) {
t.flags = kmProperty.flags
@@ -170,7 +176,7 @@ private fun WriteContext.writeValueParameter(
val t = ProtoBuf.ValueParameter.newBuilder()
t.type = writeType(kmValueParameter.type).build()
kmValueParameter.varargElementType?.let { t.varargElementType = writeType(it).build() }
kmValueParameter.extensions.writeExtensions { writeValueParameterExtensions(it, t, this@writeValueParameter) }
extensions.forEach { it.writeValueParameterExtensions(kmValueParameter, t, this) }
if (kmValueParameter.flags != ProtoBuf.ValueParameter.getDefaultInstance().flags) {
t.flags = kmValueParameter.flags
}
@@ -187,7 +193,7 @@ private fun WriteContext.writeTypeAlias(
t.expandedType = writeType(typeAlias.expandedType).build()
t.addAllAnnotation(typeAlias.annotations.map { it.writeAnnotation(strings).build() })
t.addAllVersionRequirement(typeAlias.versionRequirements.map(::writeVersionRequirement))
typeAlias.extensions.writeExtensions { writeTypeAliasExtensions(it, t, this@writeTypeAlias) }
extensions.forEach { it.writeTypeAliasExtensions(typeAlias, t, this) }
if (typeAlias.flags != ProtoBuf.TypeAlias.getDefaultInstance().flags) {
t.flags = typeAlias.flags
@@ -232,7 +238,7 @@ private fun WriteContext.writeVersionRequirement(kmVersionRequirement: KmVersion
writeVersionFull = { t!!.versionFull = it }
)
return this.versionRequirements[t] //??
return this.versionRequirements[t]
}
@ExperimentalContracts
@@ -324,7 +330,8 @@ public open class ClassWriter(stringTable: StringTable, contextExtensions: List<
t.addAllContextReceiverType(kmClass.contextReceiverTypes.map { c.writeType(it).build() })
t.addAllVersionRequirement(kmClass.versionRequirements.map { c.writeVersionRequirement(it) })
kmClass.extensions.matchExtensions { writeClassExtensions(it, t, c) }
c.extensions.forEach { it.writeClassExtensions(kmClass, t, c) }
c.versionRequirements.serialize()?.let {
t.versionRequirementTable = it
@@ -340,7 +347,7 @@ public open class PackageWriter(stringTable: StringTable, contextExtensions: Lis
t.addAllFunction(kmPackage.functions.map { c.writeFunction(it).build() })
t.addAllProperty(kmPackage.properties.map { c.writeProperty(it).build() })
t.addAllTypeAlias(kmPackage.typeAliases.map { c.writeTypeAlias(it).build() })
kmPackage.extensions.matchExtensions { writePackageExtensions(it, t, c) }
c.extensions.forEach { it.writePackageExtensions(kmPackage, t, c) }
c.versionRequirements.serialize()?.let {
t.versionRequirementTable = it
}
@@ -364,7 +371,7 @@ public open class ModuleFragmentWriter(stringTable: StringTable, contextExtensio
t.addClass_(classWriter.t)
}
kmPackageFragment.extensions.writeExtensions { writeModuleFragmentExtensions(it, t, c) }
c.extensions.forEach { it.writeModuleFragmentExtensions(kmPackageFragment, t, c) }
}
}
@@ -2,7 +2,7 @@
* Copyright 2010-2022 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") // deprecated .accept implementation
package kotlinx.metadata.internal.common
@@ -23,9 +23,9 @@ import java.io.ByteArrayInputStream
* Usually such metadata comes from serialized klibs. However, special `kotlin_builtins` file from standard library
* distribution can also be read with this reader.
*/
public class KotlinCommonMetadata private constructor(private val proto: ProtoBuf.PackageFragment) {
public class KotlinCommonMetadata private constructor(proto: ProtoBuf.PackageFragment) {
public val kmModuleFragment: KmModuleFragment = readImpl()
public val kmModuleFragment: KmModuleFragment = readImpl(proto)
@Deprecated(
"To avoid excessive copying, use .kmModuleFragment property instead. Note that it returns a view and not a copy.",
@@ -43,7 +43,7 @@ public class KotlinCommonMetadata private constructor(private val proto: ProtoBu
@Deprecated(VISITOR_API_MESSAGE, level = DeprecationLevel.ERROR)
public fun accept(v: KmModuleFragmentVisitor): Unit = kmModuleFragment.accept(v)
private fun readImpl(): KmModuleFragment {
private fun readImpl(proto: ProtoBuf.PackageFragment): KmModuleFragment {
val v = KmModuleFragment()
val strings = NameResolverImpl(proto.strings, proto.qualifiedNames)
if (proto.hasPackage()) {
@@ -2,7 +2,7 @@
* Copyright 2010-2022 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") // deprecated visitors API
package kotlinx.metadata.internal.extensions
@@ -2,34 +2,10 @@
* Copyright 2010-2022 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") // KmExtensionType will be moved to an internal package
package kotlinx.metadata.internal.extensions
import kotlinx.metadata.KmExtensionType
import kotlinx.metadata.KmExtensionVisitor
internal fun <T : KmExtensionVisitor> applySingleExtension(type: KmExtensionType, block: MetadataExtensions.() -> T?): T? {
var result: T? = null
for (extension in MetadataExtensions.INSTANCES) {
val current = block(extension) ?: continue
if (result != null) {
throw IllegalStateException("Multiple extensions handle the same extension type: $type")
}
result = current
}
return result
}
internal fun <E : KmExtension<*>> List<E>.matchExtensions(block: MetadataExtensions.(E) -> Boolean) {
forEach { ext ->
var processed = false
for (extesion in MetadataExtensions.INSTANCES) {
val current = extesion.block(ext)
if (processed && current) throw IllegalStateException("Multiple extensions handle the same extension type: ${ext.type}")
processed = current
}
}
}
internal fun <N : KmExtension<*>> Collection<N>.singleOfType(type: KmExtensionType): N {
var result: N? = null
@@ -11,55 +11,54 @@ import kotlinx.metadata.internal.common.*
import org.jetbrains.kotlin.metadata.ProtoBuf
import java.util.*
@Suppress("DEPRECATION_ERROR")
public interface MetadataExtensions {
public fun readClassExtensions(v: KmClassVisitor, proto: ProtoBuf.Class, c: ReadContext)
public fun readClassExtensions(kmClass: KmClass, proto: ProtoBuf.Class, c: ReadContext)
public fun readPackageExtensions(v: KmPackageVisitor, proto: ProtoBuf.Package, c: ReadContext)
public fun readPackageExtensions(kmPackage: KmPackage, proto: ProtoBuf.Package, c: ReadContext)
public fun readModuleFragmentExtensions(v: KmModuleFragmentVisitor, proto: ProtoBuf.PackageFragment, c: ReadContext)
public fun readModuleFragmentExtensions(kmModuleFragment: KmModuleFragment, proto: ProtoBuf.PackageFragment, c: ReadContext)
public fun readFunctionExtensions(v: KmFunctionVisitor, proto: ProtoBuf.Function, c: ReadContext)
public fun readFunctionExtensions(kmFunction: KmFunction, proto: ProtoBuf.Function, c: ReadContext)
public fun readPropertyExtensions(v: KmPropertyVisitor, proto: ProtoBuf.Property, c: ReadContext)
public fun readPropertyExtensions(kmProperty: KmProperty, proto: ProtoBuf.Property, c: ReadContext)
public fun readConstructorExtensions(v: KmConstructorVisitor, proto: ProtoBuf.Constructor, c: ReadContext)
public fun readConstructorExtensions(kmConstructor: KmConstructor, proto: ProtoBuf.Constructor, c: ReadContext)
public fun readTypeParameterExtensions(v: KmTypeParameterVisitor, proto: ProtoBuf.TypeParameter, c: ReadContext)
public fun readTypeParameterExtensions(kmTypeParameter: KmTypeParameter, proto: ProtoBuf.TypeParameter, c: ReadContext)
public fun readTypeExtensions(v: KmTypeVisitor, proto: ProtoBuf.Type, c: ReadContext)
public fun readTypeExtensions(kmType: KmType, proto: ProtoBuf.Type, c: ReadContext)
public fun readTypeAliasExtensions(v: KmTypeAliasVisitor, proto: ProtoBuf.TypeAlias, c: ReadContext)
public fun readTypeAliasExtensions(kmTypeAlias: KmTypeAlias, proto: ProtoBuf.TypeAlias, c: ReadContext)
public fun readValueParameterExtensions(v: KmValueParameterVisitor, proto: ProtoBuf.ValueParameter, c: ReadContext)
public fun readValueParameterExtensions(kmValueParameter: KmValueParameter, proto: ProtoBuf.ValueParameter, c: ReadContext)
public fun writeClassExtensions(extension: KmClassExtension, proto: ProtoBuf.Class.Builder, c: WriteContext): Boolean
public fun writeClassExtensions(kmClass: KmClass, proto: ProtoBuf.Class.Builder, c: WriteContext)
public fun writePackageExtensions(extension: KmPackageExtension, proto: ProtoBuf.Package.Builder, c: WriteContext): Boolean
public fun writePackageExtensions(kmPackage: KmPackage, proto: ProtoBuf.Package.Builder, c: WriteContext)
public fun writeModuleFragmentExtensions(
type: KmExtensionType, proto: ProtoBuf.PackageFragment.Builder, c: WriteContext
): KmModuleFragmentExtensionVisitor?
kmModuleFragment: KmModuleFragment, proto: ProtoBuf.PackageFragment.Builder, c: WriteContext
)
public fun writeFunctionExtensions(type: KmExtensionType, proto: ProtoBuf.Function.Builder, c: WriteContext): KmFunctionExtensionVisitor?
public fun writeFunctionExtensions(kmFunction: KmFunction, proto: ProtoBuf.Function.Builder, c: WriteContext)
public fun writePropertyExtensions(type: KmExtensionType, proto: ProtoBuf.Property.Builder, c: WriteContext): KmPropertyExtensionVisitor?
public fun writePropertyExtensions(kmProperty: KmProperty, proto: ProtoBuf.Property.Builder, c: WriteContext)
public fun writeConstructorExtensions(
type: KmExtensionType, proto: ProtoBuf.Constructor.Builder, c: WriteContext
): KmConstructorExtensionVisitor?
kmConstructor: KmConstructor, proto: ProtoBuf.Constructor.Builder, c: WriteContext
)
public fun writeTypeParameterExtensions(
type: KmExtensionType, proto: ProtoBuf.TypeParameter.Builder, c: WriteContext
): KmTypeParameterExtensionVisitor?
kmTypeParameter: KmTypeParameter, proto: ProtoBuf.TypeParameter.Builder, c: WriteContext
)
public fun writeTypeExtensions(type: KmExtensionType, proto: ProtoBuf.Type.Builder, c: WriteContext): KmTypeExtensionVisitor?
public fun writeTypeExtensions(type: KmType, proto: ProtoBuf.Type.Builder, c: WriteContext)
public fun writeTypeAliasExtensions(type: KmExtensionType, proto: ProtoBuf.TypeAlias.Builder, c: WriteContext): KmTypeAliasExtensionVisitor?
public fun writeTypeAliasExtensions(typeAlias: KmTypeAlias, proto: ProtoBuf.TypeAlias.Builder, c: WriteContext)
public fun writeValueParameterExtensions(
type: KmExtensionType, proto: ProtoBuf.ValueParameter.Builder, c: WriteContext
): KmValueParameterExtensionVisitor?
valueParameter: KmValueParameter, proto: ProtoBuf.ValueParameter.Builder, c: WriteContext
)
public fun createClassExtension(): KmClassExtension
@@ -81,10 +81,10 @@ private fun compileAndPrintAllFiles(
"class" -> {
val metadata = kotlinp.readClassFile(outputFile)
val classFile = kotlinp.readMetadata(metadata)
val classFile3 = KotlinClassMetadata.read(transformClassFileWithNodes(metadata, classFile))
val classFile2 = KotlinClassMetadata.read(transformClassFileWithNodes(metadata, classFile))
for ((sb, classFileToRender) in listOf(
main to classFile, afterNodes to classFile3
main to classFile, afterNodes to classFile2
)) {
sb.appendFileName(outputFile.relativeTo(tmpdir))
sb.append(kotlinp.renderClassFile(classFileToRender))