diff options
| author | Simon Ogorodnik <Simon.Ogorodnik@jetbrains.com> | 2018-01-31 23:49:51 +0300 |
|---|---|---|
| committer | Simon Ogorodnik <Simon.Ogorodnik@jetbrains.com> | 2018-07-13 18:31:32 +0300 |
| commit | f1252678883133709f13fa2d6b7adbce3156f112 (patch) | |
| tree | 30f9a36fa358d11cfd85ea12ae0d243374822fe1 /core/src/main/kotlin/Utilities | |
| parent | 85d2ea3a100001d3e5555786202e64ef3ea1679e (diff) | |
| download | dokka-f1252678883133709f13fa2d6b7adbce3156f112.tar.gz dokka-f1252678883133709f13fa2d6b7adbce3156f112.tar.bz2 dokka-f1252678883133709f13fa2d6b7adbce3156f112.zip | |
Refactor selecting of inbound link resolvers
Diffstat (limited to 'core/src/main/kotlin/Utilities')
| -rw-r--r-- | core/src/main/kotlin/Utilities/ServiceLocator.kt | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/core/src/main/kotlin/Utilities/ServiceLocator.kt b/core/src/main/kotlin/Utilities/ServiceLocator.kt index 71bfd21b..83c4c65c 100644 --- a/core/src/main/kotlin/Utilities/ServiceLocator.kt +++ b/core/src/main/kotlin/Utilities/ServiceLocator.kt @@ -14,12 +14,21 @@ class ServiceLookupException(message: String) : Exception(message) object ServiceLocator { fun <T : Any> lookup(clazz: Class<T>, category: String, implementationName: String): T { val descriptor = lookupDescriptor(category, implementationName) + return lookup(clazz, descriptor) + } + + fun <T : Any> lookup( + clazz: Class<T>, + descriptor: ServiceDescriptor + ): T { val loadedClass = javaClass.classLoader.loadClass(descriptor.className) val constructor = loadedClass.constructors - .filter { it.parameterTypes.isEmpty() } - .firstOrNull() ?: throw ServiceLookupException("Class ${descriptor.className} has no corresponding constructor") + .filter { it.parameterTypes.isEmpty() } + .firstOrNull() + ?: throw ServiceLookupException("Class ${descriptor.className} has no corresponding constructor") - val implementationRawType: Any = if (constructor.parameterTypes.isEmpty()) constructor.newInstance() else constructor.newInstance(constructor) + val implementationRawType: Any = + if (constructor.parameterTypes.isEmpty()) constructor.newInstance() else constructor.newInstance(constructor) if (!clazz.isInstance(implementationRawType)) { throw ServiceLookupException("Class ${descriptor.className} is not a subtype of ${clazz.name}") @@ -79,6 +88,7 @@ object ServiceLocator { } inline fun <reified T : Any> ServiceLocator.lookup(category: String, implementationName: String): T = lookup(T::class.java, category, implementationName) +inline fun <reified T : Any> ServiceLocator.lookup(desc: ServiceDescriptor): T = lookup(T::class.java, desc) private val ZipEntry.fileName: String get() = name.substringAfterLast("/", name) |
