diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/K2MetadataKlibSerializer.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/K2MetadataKlibSerializer.kt index e73a20012e5..160584fbcac 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/K2MetadataKlibSerializer.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/K2MetadataKlibSerializer.kt @@ -74,6 +74,7 @@ internal class K2MetadataKlibSerializer(private val metadataVersion: BuiltInsBin configuration.languageVersionSettings, metadataVersion, project, + exportKDoc = false, skipExpects = false, includeOnlyModuleContent = true ).serializeModule(module) diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/LegacyDescriptorUtils.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/LegacyDescriptorUtils.kt index cc98d91a0ac..078a6388130 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/LegacyDescriptorUtils.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/LegacyDescriptorUtils.kt @@ -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 +} diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/metadata/KlibMetadataIncrementalSerializer.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/metadata/KlibMetadataIncrementalSerializer.kt index d5783df4044..1ae029cdeed 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/metadata/KlibMetadataIncrementalSerializer.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/metadata/KlibMetadataIncrementalSerializer.kt @@ -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, diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/metadata/KlibMetadataMonolithicSerializer.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/metadata/KlibMetadataMonolithicSerializer.kt index ec9bdc46465..c46c4455c42 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/metadata/KlibMetadataMonolithicSerializer.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/metadata/KlibMetadataMonolithicSerializer.kt @@ -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 { diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/metadata/KlibMetadataSerializer.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/metadata/KlibMetadataSerializer.kt index 34acc719404..06ab825154b 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/metadata/KlibMetadataSerializer.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/metadata/KlibMetadataSerializer.kt @@ -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, diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/metadata/KlibMetadataSerializerExtension.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/metadata/KlibMetadataSerializerExtension.kt index 80e6dc60c12..98979d36f6d 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/metadata/KlibMetadataSerializerExtension.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/metadata/KlibMetadataSerializerExtension.kt @@ -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 +} diff --git a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/klib.kt b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/klib.kt index 35f6212ddf3..9d9436d1875 100644 --- a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/klib.kt +++ b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/klib.kt @@ -599,6 +599,7 @@ private fun KlibMetadataIncrementalSerializer(configuration: CompilerConfigurati languageVersionSettings = configuration.languageVersionSettings, metadataVersion = configuration.metadataVersion, project = project, + exportKDoc = false, skipExpects = !configuration.expectActualLinker, allowErrorTypes = allowErrors ) diff --git a/compiler/tests-common/tests/org/jetbrains/kotlin/test/KlibTestUtil.kt b/compiler/tests-common/tests/org/jetbrains/kotlin/test/KlibTestUtil.kt index 0c827cd9440..c82143a3430 100644 --- a/compiler/tests-common/tests/org/jetbrains/kotlin/test/KlibTestUtil.kt +++ b/compiler/tests-common/tests/org/jetbrains/kotlin/test/KlibTestUtil.kt @@ -78,6 +78,7 @@ object KlibTestUtil { val serializer = KlibMetadataMonolithicSerializer( languageVersionSettings = LanguageVersionSettingsImpl.DEFAULT, metadataVersion = KlibMetadataVersion.INSTANCE, + exportKDoc = false, skipExpects = false, project = null ) diff --git a/compiler/util-klib-metadata/src/KlibMetadataProtoBuf.proto b/compiler/util-klib-metadata/src/KlibMetadataProtoBuf.proto index 30599bbf2e7..2b6a67daac4 100644 --- a/compiler/util-klib-metadata/src/KlibMetadataProtoBuf.proto +++ b/compiler/util-klib-metadata/src/KlibMetadataProtoBuf.proto @@ -60,17 +60,20 @@ extend org.jetbrains.kotlin.metadata.Package { extend org.jetbrains.kotlin.metadata.Class { repeated org.jetbrains.kotlin.metadata.Annotation class_annotation = 170; optional int32 class_file = 175 [(org.jetbrains.kotlin.metadata.skip_in_comparison) = true]; + optional string class_kdoc = 176; optional DescriptorUniqId class_uniq_id = 171; } extend org.jetbrains.kotlin.metadata.Constructor { repeated org.jetbrains.kotlin.metadata.Annotation constructor_annotation = 170; + optional string constructor_kdoc = 173; optional DescriptorUniqId constructor_uniq_id = 172; } extend org.jetbrains.kotlin.metadata.Function { repeated org.jetbrains.kotlin.metadata.Annotation function_annotation = 170; optional int32 function_file = 172 [(org.jetbrains.kotlin.metadata.skip_in_comparison) = true]; + optional string function_kdoc = 174; optional DescriptorUniqId function_uniq_id = 173; } @@ -80,6 +83,7 @@ extend org.jetbrains.kotlin.metadata.Property { repeated org.jetbrains.kotlin.metadata.Annotation property_setter_annotation = 178; optional org.jetbrains.kotlin.metadata.Annotation.Argument.Value compile_time_value = 173; optional int32 property_file = 176 [(org.jetbrains.kotlin.metadata.skip_in_comparison) = true]; + optional string property_kdoc = 180; optional DescriptorUniqId property_uniq_id = 179; } diff --git a/compiler/util-klib-metadata/src/org/jetbrains/kotlin/library/metadata/KlibMetadataProtoBuf.java b/compiler/util-klib-metadata/src/org/jetbrains/kotlin/library/metadata/KlibMetadataProtoBuf.java index af6fac74df5..b464093c3f6 100644 --- a/compiler/util-klib-metadata/src/org/jetbrains/kotlin/library/metadata/KlibMetadataProtoBuf.java +++ b/compiler/util-klib-metadata/src/org/jetbrains/kotlin/library/metadata/KlibMetadataProtoBuf.java @@ -10,17 +10,21 @@ public final class KlibMetadataProtoBuf { registry.add(org.jetbrains.kotlin.library.metadata.KlibMetadataProtoBuf.packageFqName); registry.add(org.jetbrains.kotlin.library.metadata.KlibMetadataProtoBuf.classAnnotation); registry.add(org.jetbrains.kotlin.library.metadata.KlibMetadataProtoBuf.classFile); + registry.add(org.jetbrains.kotlin.library.metadata.KlibMetadataProtoBuf.classKdoc); registry.add(org.jetbrains.kotlin.library.metadata.KlibMetadataProtoBuf.classUniqId); registry.add(org.jetbrains.kotlin.library.metadata.KlibMetadataProtoBuf.constructorAnnotation); + registry.add(org.jetbrains.kotlin.library.metadata.KlibMetadataProtoBuf.constructorKdoc); registry.add(org.jetbrains.kotlin.library.metadata.KlibMetadataProtoBuf.constructorUniqId); registry.add(org.jetbrains.kotlin.library.metadata.KlibMetadataProtoBuf.functionAnnotation); registry.add(org.jetbrains.kotlin.library.metadata.KlibMetadataProtoBuf.functionFile); + registry.add(org.jetbrains.kotlin.library.metadata.KlibMetadataProtoBuf.functionKdoc); registry.add(org.jetbrains.kotlin.library.metadata.KlibMetadataProtoBuf.functionUniqId); registry.add(org.jetbrains.kotlin.library.metadata.KlibMetadataProtoBuf.propertyAnnotation); registry.add(org.jetbrains.kotlin.library.metadata.KlibMetadataProtoBuf.propertyGetterAnnotation); registry.add(org.jetbrains.kotlin.library.metadata.KlibMetadataProtoBuf.propertySetterAnnotation); registry.add(org.jetbrains.kotlin.library.metadata.KlibMetadataProtoBuf.compileTimeValue); registry.add(org.jetbrains.kotlin.library.metadata.KlibMetadataProtoBuf.propertyFile); + registry.add(org.jetbrains.kotlin.library.metadata.KlibMetadataProtoBuf.propertyKdoc); registry.add(org.jetbrains.kotlin.library.metadata.KlibMetadataProtoBuf.propertyUniqId); registry.add(org.jetbrains.kotlin.library.metadata.KlibMetadataProtoBuf.enumEntryAnnotation); registry.add(org.jetbrains.kotlin.library.metadata.KlibMetadataProtoBuf.enumEntryOrdinal); @@ -2561,6 +2565,22 @@ public final class KlibMetadataProtoBuf { 175, org.jetbrains.kotlin.protobuf.WireFormat.FieldType.INT32, java.lang.Integer.class); + public static final int CLASS_KDOC_FIELD_NUMBER = 176; + /** + * extend .org.jetbrains.kotlin.metadata.Class { ... } + */ + public static final + org.jetbrains.kotlin.protobuf.GeneratedMessageLite.GeneratedExtension< + org.jetbrains.kotlin.metadata.ProtoBuf.Class, + java.lang.String> classKdoc = org.jetbrains.kotlin.protobuf.GeneratedMessageLite + .newSingularGeneratedExtension( + org.jetbrains.kotlin.metadata.ProtoBuf.Class.getDefaultInstance(), + "", + null, + null, + 176, + org.jetbrains.kotlin.protobuf.WireFormat.FieldType.STRING, + java.lang.String.class); public static final int CLASS_UNIQ_ID_FIELD_NUMBER = 171; /** * extend .org.jetbrains.kotlin.metadata.Class { ... } @@ -2593,6 +2613,22 @@ public final class KlibMetadataProtoBuf { org.jetbrains.kotlin.protobuf.WireFormat.FieldType.MESSAGE, false, org.jetbrains.kotlin.metadata.ProtoBuf.Annotation.class); + public static final int CONSTRUCTOR_KDOC_FIELD_NUMBER = 173; + /** + * extend .org.jetbrains.kotlin.metadata.Constructor { ... } + */ + public static final + org.jetbrains.kotlin.protobuf.GeneratedMessageLite.GeneratedExtension< + org.jetbrains.kotlin.metadata.ProtoBuf.Constructor, + java.lang.String> constructorKdoc = org.jetbrains.kotlin.protobuf.GeneratedMessageLite + .newSingularGeneratedExtension( + org.jetbrains.kotlin.metadata.ProtoBuf.Constructor.getDefaultInstance(), + "", + null, + null, + 173, + org.jetbrains.kotlin.protobuf.WireFormat.FieldType.STRING, + java.lang.String.class); public static final int CONSTRUCTOR_UNIQ_ID_FIELD_NUMBER = 172; /** * extend .org.jetbrains.kotlin.metadata.Constructor { ... } @@ -2641,6 +2677,22 @@ public final class KlibMetadataProtoBuf { 172, org.jetbrains.kotlin.protobuf.WireFormat.FieldType.INT32, java.lang.Integer.class); + public static final int FUNCTION_KDOC_FIELD_NUMBER = 174; + /** + * extend .org.jetbrains.kotlin.metadata.Function { ... } + */ + public static final + org.jetbrains.kotlin.protobuf.GeneratedMessageLite.GeneratedExtension< + org.jetbrains.kotlin.metadata.ProtoBuf.Function, + java.lang.String> functionKdoc = org.jetbrains.kotlin.protobuf.GeneratedMessageLite + .newSingularGeneratedExtension( + org.jetbrains.kotlin.metadata.ProtoBuf.Function.getDefaultInstance(), + "", + null, + null, + 174, + org.jetbrains.kotlin.protobuf.WireFormat.FieldType.STRING, + java.lang.String.class); public static final int FUNCTION_UNIQ_ID_FIELD_NUMBER = 173; /** * extend .org.jetbrains.kotlin.metadata.Function { ... } @@ -2737,6 +2789,22 @@ public final class KlibMetadataProtoBuf { 176, org.jetbrains.kotlin.protobuf.WireFormat.FieldType.INT32, java.lang.Integer.class); + public static final int PROPERTY_KDOC_FIELD_NUMBER = 180; + /** + * extend .org.jetbrains.kotlin.metadata.Property { ... } + */ + public static final + org.jetbrains.kotlin.protobuf.GeneratedMessageLite.GeneratedExtension< + org.jetbrains.kotlin.metadata.ProtoBuf.Property, + java.lang.String> propertyKdoc = org.jetbrains.kotlin.protobuf.GeneratedMessageLite + .newSingularGeneratedExtension( + org.jetbrains.kotlin.metadata.ProtoBuf.Property.getDefaultInstance(), + "", + null, + null, + 180, + org.jetbrains.kotlin.protobuf.WireFormat.FieldType.STRING, + java.lang.String.class); public static final int PROPERTY_UNIQ_ID_FIELD_NUMBER = 179; /** * extend .org.jetbrains.kotlin.metadata.Property { ... } @@ -2958,4 +3026,4 @@ public final class KlibMetadataProtoBuf { } // @@protoc_insertion_point(outer_class_scope) -} \ No newline at end of file +} diff --git a/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt b/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt index cb56451555b..18077773de8 100644 --- a/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt +++ b/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt @@ -173,6 +173,8 @@ class K2Native : CLICompiler() { put(OVERRIDE_CLANG_OPTIONS, arguments.clangOptions.toNonNullList()) put(ALLOCATION_MODE, arguments.allocator) + put(EXPORT_KDOC, arguments.exportKDoc) + put(PRINT_IR, arguments.printIr) put(PRINT_IR_WITH_DESCRIPTORS, arguments.printIrWithDescriptors) put(PRINT_DESCRIPTORS, arguments.printDescriptors) diff --git a/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2NativeCompilerArguments.kt b/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2NativeCompilerArguments.kt index a371604f89f..ddbf57d4422 100644 --- a/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2NativeCompilerArguments.kt +++ b/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2NativeCompilerArguments.kt @@ -181,6 +181,9 @@ class K2NativeCompilerArguments : CommonCompilerArguments() { ) var libraryToAddToCache: String? = null + @Argument(value = "-Xexport-kdoc", description = "Export KDoc in framework header") + var exportKDoc: Boolean = false + @Argument(value = "-Xprint-bitcode", deprecatedName = "--print_bitcode", description = "Print llvm bitcode") var printBitCode: Boolean = false diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt index c2ce9f75889..5d84678bd42 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt @@ -399,6 +399,9 @@ internal class Context(config: KonanConfig) : KonanBackendContext(config) { printIr() printBitCode() } + + fun shouldExportKDoc() = config.configuration.getBoolean(KonanConfigKeys.EXPORT_KDOC) + fun shouldVerifyBitCode() = config.configuration.getBoolean(KonanConfigKeys.VERIFY_BITCODE) fun shouldPrintBitCode() = config.configuration.getBoolean(KonanConfigKeys.PRINT_BITCODE) diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanCompilerFrontendServices.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanCompilerFrontendServices.kt index 0d0e2540546..535eccb846e 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanCompilerFrontendServices.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanCompilerFrontendServices.kt @@ -46,7 +46,7 @@ internal fun ComponentProvider.postprocessComponents(context: Context, files: Co context.frontendServices = this.get() context.config.configuration.get(KonanConfigKeys.EMIT_LAZY_OBJC_HEADER_FILE)?.let { - this.get().dumpObjCHeader(files, it) + this.get().dumpObjCHeader(files, it, context.shouldExportKDoc()) } } diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfigurationKeys.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfigurationKeys.kt index 821b079779c..d13186fc95a 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfigurationKeys.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfigurationKeys.kt @@ -94,7 +94,9 @@ class KonanConfigKeys { = CompilerConfigurationKey.create("arguments for clang") val ALLOCATION_MODE: CompilerConfigurationKey = CompilerConfigurationKey.create("allocation mode") - val PRINT_BITCODE: CompilerConfigurationKey + val EXPORT_KDOC: CompilerConfigurationKey + = CompilerConfigurationKey.create("export KDoc into klib and framework") + val PRINT_BITCODE: CompilerConfigurationKey = CompilerConfigurationKey.create("print bitcode") val PRINT_DESCRIPTORS: CompilerConfigurationKey = CompilerConfigurationKey.create("print descriptors") diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ToplevelPhases.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ToplevelPhases.kt index 34d828197a4..bc29ab00f34 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ToplevelPhases.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ToplevelPhases.kt @@ -181,6 +181,7 @@ internal val serializerPhase = konanUnitPhase( this.config.configuration.languageVersionSettings, config.configuration.get(CommonConfigurationKeys.METADATA_VERSION)!!, config.project, + exportKDoc = this.shouldExportKDoc(), !expectActualLinker, includeOnlyModuleContent = true) serializedMetadata = serializer.serializeModule(moduleDescriptor) }, diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportHeaderGenerator.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportHeaderGenerator.kt index ed4768bba78..0a6d3cd354f 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportHeaderGenerator.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportHeaderGenerator.kt @@ -981,6 +981,8 @@ abstract class ObjCExportHeaderGenerator internal constructor( private val extensions = mutableMapOf>() private val topLevel = mutableMapOf>() + open val shouldExportKDoc = false + fun build(): List = mutableListOf().apply { addImports(foundationImports) addImports(getAdditionalImports()) @@ -1013,7 +1015,7 @@ abstract class ObjCExportHeaderGenerator internal constructor( add("") stubs.forEach { - addAll(StubRenderer.render(it)) + addAll(StubRenderer.render(it, shouldExportKDoc)) add("") } diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportHeaderGeneratorImpl.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportHeaderGeneratorImpl.kt index bfe6882f5ce..eab83c6ed65 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportHeaderGeneratorImpl.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportHeaderGeneratorImpl.kt @@ -23,6 +23,9 @@ internal class ObjCExportHeaderGeneratorImpl( namer: ObjCExportNamer, objcGenerics: Boolean ) : ObjCExportHeaderGenerator(moduleDescriptors, mapper, namer, objcGenerics, ProblemCollector(context)) { + + override val shouldExportKDoc = context.shouldExportKDoc() + private class ProblemCollector(val context: Context) : ObjCExportProblemCollector { override fun reportWarning(text: String) { context.reportCompilationWarning(text) diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportLazyUtils.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportLazyUtils.kt index bdea63ee33e..31882ebc524 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportLazyUtils.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportLazyUtils.kt @@ -8,9 +8,9 @@ package org.jetbrains.kotlin.backend.konan.objcexport import org.jetbrains.kotlin.konan.file.File import org.jetbrains.kotlin.psi.KtFile -internal fun ObjCExportLazy.dumpObjCHeader(files: Collection, outputFile: String) { +internal fun ObjCExportLazy.dumpObjCHeader(files: Collection, outputFile: String, shouldExportKDoc: Boolean) { val lines = (this.generateBase() + files.flatMap { this.translate(it) }) - .flatMap { StubRenderer.render(it) + listOf("") } + .flatMap { StubRenderer.render(it, shouldExportKDoc) + listOf("") } File(outputFile).writeLines(lines) } \ No newline at end of file diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/StubRenderer.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/StubRenderer.kt index 76605186c7c..447e4397a44 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/StubRenderer.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/StubRenderer.kt @@ -6,18 +6,32 @@ package org.jetbrains.kotlin.backend.konan.objcexport import org.jetbrains.kotlin.descriptors.ClassDescriptor +import org.jetbrains.kotlin.descriptors.DeclarationDescriptor +import org.jetbrains.kotlin.descriptors.DeclarationDescriptorWithSource +import org.jetbrains.kotlin.backend.common.serialization.extractSerializedKdocString +import org.jetbrains.kotlin.backend.common.serialization.metadata.findKDocString object StubRenderer { - fun render(stub: Stub<*>): List = collect { + fun render(stub: Stub<*>): List = render(stub, false) + internal fun render(stub: Stub<*>, shouldExportKDoc: Boolean): List = collect { stub.run { - this.comment?.let { comment -> + val kDoc = if (shouldExportKDoc) { + this.descriptor?.extractKDocString() + } else null + kDoc?.let { +"" // Probably makes the output more readable. + +it // Let's try to keep non-trivial kdoc formatting intact + } + + this.comment?.let { comment -> + kDoc?: let { +"" } // Probably makes the output more readable. +"/**" comment.contentLines.forEach { +" $it" } +"*/" } + when (this) { is ObjCProtocol -> { attributes.forEach { @@ -25,7 +39,7 @@ object StubRenderer { } +renderProtocolHeader() +"@required" - renderMembers(this) + renderMembers(this, shouldExportKDoc) +"@end;" } is ObjCInterface -> { @@ -33,7 +47,7 @@ object StubRenderer { +renderAttribute(it) } +renderInterfaceHeader() - renderMembers(this) + renderMembers(this, shouldExportKDoc) +"@end;" } is ObjCMethod -> { @@ -168,9 +182,9 @@ object StubRenderer { appendSuperProtocols(this@renderInterfaceHeader) } - private fun Collector.renderMembers(clazz: ObjCClass<*>) { + private fun Collector.renderMembers(clazz: ObjCClass<*>, shouldExportKDoc: Boolean) { clazz.members.forEach { - +render(it) + +render(it, shouldExportKDoc) } } @@ -202,3 +216,8 @@ internal fun formatGenerics(buffer: Appendable, generics:List) { } } +private fun DeclarationDescriptor.extractKDocString(): String? { + return (this as? DeclarationDescriptorWithSource)?.findKDocString() + ?: extractSerializedKdocString() +} + diff --git a/kotlin-native/runtime/src/main/cpp/Exceptions.cpp b/kotlin-native/runtime/src/main/cpp/Exceptions.cpp index 5c604905658..bbe5e15eff8 100644 --- a/kotlin-native/runtime/src/main/cpp/Exceptions.cpp +++ b/kotlin-native/runtime/src/main/cpp/Exceptions.cpp @@ -247,7 +247,7 @@ void processUnhandledKotlinException(KRef throwable) { RUNTIME_NORETURN void TerminateWithUnhandledException(KRef throwable) { concurrentTerminateWrapper([=]() { - processUnhandledKotlinException(throwable); + processUnhandledKotlinException(throwable); konan::abort(); }); } diff --git a/native/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/utils/mocks.kt b/native/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/utils/mocks.kt index 06afad2a406..bad5a9b7d22 100644 --- a/native/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/utils/mocks.kt +++ b/native/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/utils/mocks.kt @@ -118,6 +118,7 @@ internal class MockModulesProvider private constructor( val SERIALIZER = KlibMetadataMonolithicSerializer( languageVersionSettings = LanguageVersionSettingsImpl.DEFAULT, metadataVersion = KlibMetadataVersion.INSTANCE, + exportKDoc = false, skipExpects = false, project = null, includeOnlyModuleContent = true,