diff options
author | Kamil Doległo <kamilok1965@interia.pl> | 2019-10-29 11:46:04 +0100 |
---|---|---|
committer | Kamil Doległo <kamilok1965@interia.pl> | 2019-10-29 15:49:53 +0100 |
commit | 14a290009098b777521b1dedb551047fb66ba73b (patch) | |
tree | ae68219051b080ff8888308d5521aaeea7431fb4 /core/src/main/kotlin/links | |
parent | 5f358199788fefb78f5db7791e718480793a77fc (diff) | |
download | dokka-14a290009098b777521b1dedb551047fb66ba73b.tar.gz dokka-14a290009098b777521b1dedb551047fb66ba73b.tar.bz2 dokka-14a290009098b777521b1dedb551047fb66ba73b.zip |
[WIP] new model
Diffstat (limited to 'core/src/main/kotlin/links')
-rw-r--r-- | core/src/main/kotlin/links/DRI.kt | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/core/src/main/kotlin/links/DRI.kt b/core/src/main/kotlin/links/DRI.kt new file mode 100644 index 00000000..64989701 --- /dev/null +++ b/core/src/main/kotlin/links/DRI.kt @@ -0,0 +1,70 @@ +package org.jetbrains.dokka.links + +import java.text.ParseException + +/** + * [DRI] stands for DokkaResourceIdentifier + */ +data class DRI(val packageName: String? = null, + val classNames: String? = null, + val callable: Callable? = null, + val target: Int? = null, + val extra: String? = null) { + + constructor(packageName: String? = null, + classNames: String? = null, + callableName: String? = null, + signature: String? = null, + target: Int? = null, + extra: String? = null) : this(packageName, classNames, Callable.from(callableName, signature), target, extra) + + override fun toString(): String = + "${packageName.orEmpty()}/${classNames.orEmpty()}/${callable?.name.orEmpty()}/${callable?.signature().orEmpty()}/${target?.toString().orEmpty()}/${extra.orEmpty()}" + + companion object { + fun from(s: String): DRI = try { + s.split('/') + .map { it.takeIf(String::isNotBlank) } + .let { (packageName, classNames, callableName, callableSignature, target, ext) -> + DRI( + packageName, + classNames, + try { Callable.from(callableName, callableSignature) } catch(e: ParseException) { null }, + target?.toInt(), + ext + ) + } + } catch (e: Throwable) { + throw ParseException(s, 0) + } + } +} + +data class Callable(val name: String, val receiver: String, val returnType: String, val params: List<String>) { + fun signature() = "$receiver.$returnType.${params.joinToString(".")}" + companion object { + fun from(name: String?, signature: String?): Callable = try { + signature.toString() + .split('#', ignoreCase = false, limit = 3) + .let { (receiver, returnType, params) -> + Callable( + name.toString(), + receiver, + returnType, + params.split('#') + ) + } + } catch (e: Throwable) { + throw ParseException(signature, 0) + } + + fun from(s: String): Callable = try { + s.split('/').let { (name, signature) -> from(name, signature) } + } catch (e: Throwable) { + throw ParseException(s, 0) + } + } +} + +private operator fun <T> List<T>.component6(): T = get(5) + |