package org.jetbrains.dokka import org.jetbrains.dokka.generation.Generation import org.jetbrains.dokka.generation.SingleModuleGeneration import org.jetbrains.dokka.plugability.* import org.jetbrains.dokka.plugability.LazyEvaluated import org.jetbrains.dokka.renderers.Renderer import org.jetbrains.dokka.transformers.documentation.DocumentableMerger import org.jetbrains.dokka.transformers.documentation.DocumentableToPageTranslator import org.jetbrains.dokka.transformers.documentation.DocumentableTransformer import org.jetbrains.dokka.transformers.documentation.PreMergeDocumentableTransformer import org.jetbrains.dokka.transformers.pages.PageCreator import org.jetbrains.dokka.transformers.pages.PageTransformer import org.jetbrains.dokka.transformers.sources.SourceToDocumentableTranslator import org.jetbrains.dokka.validity.PreGenerationChecker import kotlin.reflect.KProperty object CoreExtensions { private val extensionDelegates = mutableListOf>>() val preGenerationCheck by coreExtensionPoint() val generation by coreExtensionPoint() val sourceToDocumentableTranslator by coreExtensionPoint() val preMergeDocumentableTransformer by coreExtensionPoint() val documentableMerger by coreExtensionPoint() val documentableTransformer by coreExtensionPoint() val documentableToPageTranslator by coreExtensionPoint() val allModulePageCreator by coreExtensionPoint() val pageTransformer by coreExtensionPoint() val allModulePageTransformer by coreExtensionPoint() val renderer by coreExtensionPoint() val singleGeneration by generation extendWith LazyEvaluated.fromRecipe(::SingleModuleGeneration) private fun coreExtensionPoint() = object { operator fun provideDelegate(thisRef: CoreExtensions, property: KProperty<*>): Lazy> = lazy { ExtensionPoint(thisRef::class.qualifiedName!!, property.name) } } private infix fun ExtensionPoint.extendWith(action: LazyEvaluated) = object { operator fun provideDelegate(thisRef: CoreExtensions, property: KProperty<*>): Lazy> = lazy { Extension(this@extendWith, thisRef::class.qualifiedName!!, property.name, action) } .also { extensionDelegates += it } } internal fun installTo(context: DokkaContextConfiguration) { extensionDelegates.forEach { context.installExtension(it.value) } } }