Skip to content

Commit

Permalink
Create java-like api for plugins
Browse files Browse the repository at this point in the history
  • Loading branch information
romanowski authored and Kordyjan committed Sep 28, 2020
1 parent aa745c9 commit db21563
Show file tree
Hide file tree
Showing 3 changed files with 77 additions and 3 deletions.
1 change: 1 addition & 0 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ allprojects {
group = "org.jetbrains.dokka"
version = dokka_version


val language_version: String by project
tasks.withType(KotlinCompile::class).all {
kotlinOptions {
Expand Down
68 changes: 68 additions & 0 deletions core/src/main/kotlin/plugability/DokkaJavaPlugin.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package org.jetbrains.dokka.plugability

import org.jetbrains.dokka.DokkaConfiguration

class ExtensionBuilderStart internal constructor(){
fun <T: Any> extensionPoint(ext: ExtensionPoint<T>): ProvidedExtension<T> = ProvidedExtension(ext)
}

class ProvidedExtension<T: Any> internal constructor(val ext: ExtensionPoint<T>){
fun fromInstance(inst: T): ExtensionBuilder<T> = createBuilder(
LazyEvaluated.fromInstance(
inst
)
)
fun fromRecipe(recipe: (DokkaContext) -> T): ExtensionBuilder<T> = createBuilder(
LazyEvaluated.fromRecipe(recipe)
)

private val defaultName = "${ext.pointName}/in/${javaClass.simpleName}"

private fun createBuilder(action: LazyEvaluated<T>) =
ExtensionBuilder(defaultName, ext, action,
OrderingKind.None,
OverrideKind.None, emptyList())
}

data class ExtensionBuilder<T: Any> internal constructor(
private val name: String,
private val ext: ExtensionPoint<T>,
private val action: LazyEvaluated<T>,
private val ordering: OrderingKind = OrderingKind.None,
private val override: OverrideKind = OverrideKind.None,
private val conditions: List<(DokkaConfiguration) -> Boolean>
){
fun build(): Extension<T, *, *> = Extension(
ext,
javaClass.name,
name,
action,
ordering,
override,
conditions
)

fun overrideExtension(extension: Extension<T, *, *>) = copy(override = OverrideKind.Present(extension))

fun newOrdering(before: Array<Extension<*, *, *>>, after: Array<Extension<*, *, *>>) {
copy(ordering = OrderingKind.ByDsl {
before(*before)
after(*after)
})
}

fun addCondition(c: (DokkaConfiguration) -> Boolean) = copy(conditions = conditions + c)

fun name(name: String) = copy(name = name)
}

abstract class DokkaJavaPlugin: DokkaPlugin() {

fun <T: DokkaPlugin> plugin(clazz: Class<T>): T? =
context?.plugin(clazz.kotlin) ?: throwIllegalQuery()


fun <T: Any> extend(func: (ExtensionBuilderStart) -> ExtensionBuilder<T>): Lazy<Extension<T, *, *>> =
lazy { func(ExtensionBuilderStart()).build() }.also { unsafeInstall(it) }

}
11 changes: 8 additions & 3 deletions core/src/main/kotlin/plugability/DokkaPlugin.kt
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import kotlin.reflect.full.createInstance

abstract class DokkaPlugin {
private val extensionDelegates = mutableListOf<KProperty<*>>()
private val unsafePlugins = mutableListOf<Lazy<Extension<*, *, *>>>()

@PublishedApi
internal var context: DokkaContext? = null
Expand Down Expand Up @@ -37,10 +38,14 @@ abstract class DokkaPlugin {
}

internal fun internalInstall(ctx: DokkaContextConfiguration, configuration: DokkaConfiguration) {
extensionDelegates.asSequence()
val extensionsToInstall = extensionDelegates.asSequence()
.filterIsInstance<KProperty1<DokkaPlugin, Extension<*, *, *>>>() // should be always true
.map { it.get(this) }
.forEach { if (configuration.(it.condition)()) ctx.installExtension(it) }
.map { it.get(this) } + unsafePlugins.map{ it.value }
extensionsToInstall.forEach { if (configuration.(it.condition)()) ctx.installExtension(it) }
}

protected fun <T: Any> unsafeInstall(ext: Lazy<Extension<T, *, *>>){
unsafePlugins.add(ext)
}
}

Expand Down

0 comments on commit db21563

Please sign in to comment.