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