[Native] Export KDoc into generated native header

This commit is contained in:
Vladimir Ivanov
2021-03-09 16:50:23 +03:00
committed by GitHub
parent 6427117a35
commit fd02802028
22 changed files with 174 additions and 17 deletions
@@ -15,6 +15,8 @@ import org.jetbrains.kotlin.resolve.checkers.ExpectedActualDeclarationChecker
import org.jetbrains.kotlin.resolve.descriptorUtil.module
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPropertyDescriptor
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedSimpleFunctionDescriptor
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedClassDescriptor
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedClassConstructorDescriptor
internal val DeclarationDescriptor.isExpectMember: Boolean
get() = this is MemberDescriptor && this.isExpect
@@ -51,3 +53,11 @@ fun CallableMemberDescriptor.findSourceFile(): SourceFile {
else -> TODO()
}
}
fun DeclarationDescriptor.extractSerializedKdocString(): String? = when (this) {
is DeserializedClassDescriptor -> classProto.getExtension(KlibMetadataProtoBuf.classKdoc)
is DeserializedSimpleFunctionDescriptor -> proto.getExtension(KlibMetadataProtoBuf.functionKdoc)
is DeserializedPropertyDescriptor -> proto.getExtension(KlibMetadataProtoBuf.propertyKdoc)
is DeserializedClassConstructorDescriptor -> proto.getExtension(KlibMetadataProtoBuf.constructorKdoc)
else -> null
}
@@ -24,9 +24,10 @@ class KlibMetadataIncrementalSerializer(
languageVersionSettings: LanguageVersionSettings,
metadataVersion: BinaryVersion,
project: Project,
exportKDoc: Boolean,
skipExpects: Boolean,
allowErrorTypes: Boolean = false
) : KlibMetadataSerializer(languageVersionSettings, metadataVersion, project, skipExpects, allowErrorTypes = allowErrorTypes) {
) : KlibMetadataSerializer(languageVersionSettings, metadataVersion, project, exportKDoc, skipExpects, allowErrorTypes = allowErrorTypes) {
fun serializePackageFragment(
module: ModuleDescriptor,
@@ -24,10 +24,11 @@ class KlibMetadataMonolithicSerializer(
languageVersionSettings: LanguageVersionSettings,
metadataVersion: BinaryVersion,
project: Project?,
exportKDoc: Boolean,
skipExpects: Boolean,
includeOnlyModuleContent: Boolean = false,
allowErrorTypes: Boolean = false
) : KlibMetadataSerializer(languageVersionSettings, metadataVersion, project, skipExpects, includeOnlyModuleContent, allowErrorTypes) {
) : KlibMetadataSerializer(languageVersionSettings, metadataVersion, project, exportKDoc, skipExpects, includeOnlyModuleContent, allowErrorTypes) {
private fun serializePackageFragment(fqName: FqName, module: ModuleDescriptor): List<ProtoBuf.PackageFragment> {
@@ -34,6 +34,7 @@ abstract class KlibMetadataSerializer(
val languageVersionSettings: LanguageVersionSettings,
val metadataVersion: BinaryVersion,
val project: Project?,
val exportKDoc: Boolean = false,
val skipExpects: Boolean = false,
val includeOnlyModuleContent: Boolean = false,
private val allowErrorTypes: Boolean
@@ -53,7 +54,8 @@ abstract class KlibMetadataSerializer(
languageVersionSettings,
metadataVersion,
ApproximatingStringTable(),
allowErrorTypes
allowErrorTypes,
exportKDoc
)
return SerializerContext(
extension,
@@ -18,12 +18,19 @@ import org.jetbrains.kotlin.serialization.KotlinSerializerExtensionBase
import org.jetbrains.kotlin.serialization.StringTableImpl
import org.jetbrains.kotlin.types.FlexibleType
import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.descriptors.DeclarationDescriptorWithSource
import org.jetbrains.kotlin.kdoc.psi.impl.KDocTag
import org.jetbrains.kotlin.psi.KtDeclaration
import org.jetbrains.kotlin.psi.KtPrimaryConstructor
import org.jetbrains.kotlin.resolve.source.getPsi
class KlibMetadataSerializerExtension(
private val languageVersionSettings: LanguageVersionSettings,
override val metadataVersion: BinaryVersion,
override val stringTable: StringTableImpl,
private val allowErrorTypes: Boolean
private val allowErrorTypes: Boolean,
private val exportKDoc: Boolean
) : KotlinSerializerExtensionBase(KlibMetadataSerializerProtocol) {
override fun shouldUseTypeTable(): Boolean = true
@@ -47,10 +54,20 @@ class KlibMetadataSerializerExtension(
childSerializer: DescriptorSerializer
) {
descriptorFileId(descriptor)?.let { proto.setExtension(KlibMetadataProtoBuf.classFile, it) }
if (exportKDoc) descriptor.findKDocString()?.let { proto.setExtension(KlibMetadataProtoBuf.classKdoc, it) }
super.serializeClass(descriptor, proto, versionRequirementTable, childSerializer)
childSerializer.typeTable.serialize()?.let { proto.mergeTypeTable(it) }
}
override fun serializeConstructor(
descriptor: ConstructorDescriptor,
proto: ProtoBuf.Constructor.Builder,
childSerializer: DescriptorSerializer
) {
if (exportKDoc) descriptor.findKDocString()?.let { proto.setExtension(KlibMetadataProtoBuf.constructorKdoc, it) }
super.serializeConstructor(descriptor, proto, childSerializer)
}
override fun serializeProperty(
descriptor: PropertyDescriptor,
proto: ProtoBuf.Property.Builder,
@@ -58,6 +75,7 @@ class KlibMetadataSerializerExtension(
childSerializer: DescriptorSerializer
) {
descriptorFileId(descriptor)?.let { proto.setExtension(KlibMetadataProtoBuf.propertyFile, it) }
if (exportKDoc) descriptor.findKDocString()?.let { proto.setExtension(KlibMetadataProtoBuf.propertyKdoc, it) }
super.serializeProperty(descriptor, proto, versionRequirementTable, childSerializer)
}
@@ -68,9 +86,23 @@ class KlibMetadataSerializerExtension(
childSerializer: DescriptorSerializer
) {
descriptorFileId(descriptor)?.let { proto.setExtension(KlibMetadataProtoBuf.functionFile, it) }
if (exportKDoc) descriptor.findKDocString()?.let { proto.setExtension(KlibMetadataProtoBuf.functionKdoc, it) }
super.serializeFunction(descriptor, proto, versionRequirementTable, childSerializer)
}
override fun releaseCoroutines() =
languageVersionSettings.supportsFeature(LanguageFeature.ReleaseCoroutines)
}
fun DeclarationDescriptorWithSource.findKDocString(): String? {
val psi = source.getPsi()
if (psi is KtDeclaration) {
if (psi is KtPrimaryConstructor)
return null // to be rendered with class itself
val kdoc = psi.docComment
if (kdoc != null) {
return kdoc.getDefaultSection().parent.text
}
}
return null
}