49 lines
1.4 KiB
Kotlin
49 lines
1.4 KiB
Kotlin
package moe.nea.firmament.util.compatloader
|
|
|
|
import java.util.ServiceLoader
|
|
import moe.nea.firmament.events.subscription.SubscriptionList
|
|
import moe.nea.firmament.init.AutoDiscoveryPlugin
|
|
import moe.nea.firmament.util.ErrorUtil
|
|
|
|
/**
|
|
* Declares the compat meta interface for the current source set.
|
|
* This is used by [CompatLoader], [SubscriptionList], and [AutoDiscoveryPlugin]. Annotate a [ICompatMeta] object with
|
|
* this.
|
|
*/
|
|
annotation class CompatMeta
|
|
|
|
interface ICompatMetaGen {
|
|
fun owns(className: String): Boolean
|
|
val meta: ICompatMeta
|
|
}
|
|
|
|
interface ICompatMeta {
|
|
fun shouldLoad(): Boolean
|
|
|
|
companion object {
|
|
val allMetas = ServiceLoader
|
|
.load(ICompatMetaGen::class.java)
|
|
.toList()
|
|
|
|
fun shouldLoad(className: String): Boolean {
|
|
// TODO: replace this with a more performant package lookup
|
|
val meta = if (ErrorUtil.aggressiveErrors) {
|
|
val fittingMetas = allMetas.filter { it.owns(className) }
|
|
require(fittingMetas.size == 1) { "Orphaned or duplicate owned class $className (${fittingMetas.map { it.meta }}). Consider adding a @CompatMeta object." }
|
|
fittingMetas.single()
|
|
} else {
|
|
allMetas.firstOrNull { it.owns(className) }
|
|
}
|
|
return meta?.meta?.shouldLoad() ?: true
|
|
}
|
|
}
|
|
}
|
|
|
|
object CompatHelper {
|
|
fun isOwnedByPackage(className: String, vararg packages: String): Boolean {
|
|
// TODO: create package lookup structure once
|
|
val packageName = className.substringBeforeLast('.')
|
|
return packageName in packages
|
|
}
|
|
}
|