Reflection commands, fix genref

This commit is contained in:
redtea committed 2023-08-23 02:22:42 +03:00
1 parent cc6f64c3b7
commit 51ae06d7cd
270 files changed
+3319 -134

No files matched your search

+1 -1
View File
@@ -1,7 +1,7 @@
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins { plugins {
kotlin("jvm") version "1.8.21" kotlin("jvm") version "1.9.0"
id("io.codearte.nexus-staging") version "0.30.0" id("io.codearte.nexus-staging") version "0.30.0"
} }
@@ -0,0 +1,3 @@
package tech.carcadex.kotlinbukkitkit.commands
open class CommandBase{}
@@ -0,0 +1,11 @@
package tech.carcadex.kotlinbukkitkit.commands
data class CommandParams(
val name: String,
val desc: String,
val usage: String,
val perm: String?,
val aliases: List<String>,
val completeTags: Array<String>,
val isLastOptional: Boolean,
)
@@ -0,0 +1,125 @@
package tech.carcadex.kotlinbukkitkit.commands
import org.bukkit.command.CommandSender
import tech.carcadex.kotlinbukkitkit.commands.annotations.*
import tech.carcadex.kotlinbukkitkit.commands.exceptions.TypeParseException
import tech.carcadex.kotlinbukkitkit.commands.exceptions.UnsupportedTypeException
import tech.carcadex.kotlinbukkitkit.commands.service.MessagesService
import tech.carcadex.kotlinbukkitkit.commands.service.TypeService
import kotlin.reflect.KClass
import kotlin.reflect.KFunction
import kotlin.reflect.KParameter
import kotlin.reflect.full.createType
import kotlin.reflect.full.findAnnotations
import kotlin.reflect.full.hasAnnotation
import kotlin.reflect.full.isSubtypeOf
import kotlin.reflect.jvm.javaType
object Parser {
fun paramsFromAnnotations(clazz: KClass<*>): CommandParams {
val name = clazz.findAnnotations<Command>().first().name
val desc = clazz.findAnnotations<Description>().getOrNull(0)?.desc ?: ""
val usage = clazz.findAnnotations<Usage>().getOrNull(0)?.usage ?: ""
val perm = clazz.findAnnotations<Permission>().getOrNull(0)?.perm
val cmdAliases: Array<String> = clazz.findAnnotations<Aliases>().getOrNull(0)?.aliases ?: emptyArray()
val completeTags: Array<String>? = null
val isLastOptional = false
var argsSize = 1
val aliases = arrayListOf(name)
aliases.addAll(cmdAliases)
return CommandParams(name, desc, usage, perm, aliases, completeTags ?: emptyArray(), isLastOptional)
}
fun paramsFromAnnotations(func: KFunction<*>): CommandParams {
val name = if(func.hasAnnotation<Command>())func.findAnnotations<Command>().first().name else
if(func.hasAnnotation<SubCommand>()) func.findAnnotations<SubCommand>().first().name else "default"
val desc = func.findAnnotations<Description>().getOrNull(0)?.desc ?: ""
val usage = func.findAnnotations<Usage>().getOrNull(0)?.usage ?: ""
val perm = func.findAnnotations<Permission>().getOrNull(0)?.perm
val cmdAliases: Array<String> = func.findAnnotations<Aliases>().getOrNull(0)?.aliases ?: emptyArray()
val completeTags: Array<String>? = func.findAnnotations<TabComplete>().getOrNull(0)?.complete
val isLastOptional = func.parameters[func.parameters.size - 1].hasAnnotation<Optional>()
var argsSize = func.parameters.size
if (func.parameters.isNotEmpty() && func.parameters[0].type.javaType.typeName == CommandSender::class.qualifiedName!!) {
--argsSize
}
val aliases = arrayListOf(name)
aliases.addAll(cmdAliases)
return CommandParams(name, desc, usage, perm, aliases, completeTags ?: emptyArray(), isLastOptional)
}
fun parseParam(params: List<KParameter>): List<(String, CommandSender) -> Any?> {
val argsParsers = mutableListOf<(String, CommandSender) -> Any?>()
val enums = mutableMapOf<Int, (String, CommandSender) -> Enum<*>>()
for ((argIndex, argType) in params.withIndex()) {
val clazz = Class.forName(replacePrimitives(argType.type.javaType.typeName))
if (TypeService.registered(argType.type)) {
argsParsers.add { s, sender ->
val context = TypeService.TypeContext(s, sender)
try {
TypeService.byType(argType.type)(context)
} catch (e: Throwable) {
if (context.errorMessage != null) MessagesService.byTag(context.errorMessage!!)(sender)
throw TypeParseException()
}
}
} else if (!clazz.isEnum) throw UnsupportedTypeException("Type ${argType.type.javaType.typeName} is not supported")
else {
enums[argIndex] = { it, sender ->
var res: Enum<*>? = null;
for (e in clazz.enumConstants) {
if ((e as Enum<*>).name.equals(it, ignoreCase = true)) res = e;
}
if (res == null) MessagesService.byTag("#no-such-enum")(sender)
res ?: throw TypeParseException()
}
argsParsers.add { _, _ -> {} }
}
}
enums.forEach {
argsParsers[it.key] = it.value
}
return argsParsers;
}
fun replacePrimitives(s: String): String = when(s) {
"int" -> "java.lang.Integer"
"short" -> "java.lang.Short"
"long" -> "java.lang.Long"
"double" -> "java.lang.Double"
"byte" -> "java.lang.Byte"
"boolean" -> "java.lang.Boolean"
else -> s
}
fun paramMap(
cmd: CommandParams,
argsFromExecutor: Array<String>,
argsSize: Int,
sender: CommandSender,
argsParsers: List<(String, CommandSender) -> Any?>,
func: KFunction<*>,
instanceAtStart: Boolean = false,
instance: Any = Any()
): MutableMap<KParameter, Any?> {
val tempArgs = if (cmd.isLastOptional && argsFromExecutor.size < argsSize) argsFromExecutor.copyOf(argsSize)
else argsFromExecutor
val finalArgs = mutableListOf<Any?>()
if(instanceAtStart) finalArgs.add(instance)
if(func.parameters.isNotEmpty() && (
func.parameters[0 + if(instanceAtStart) 1 else 0].type == (CommandSender::class.createType()) ||
func.parameters[0 + if(instanceAtStart) 1 else 0].type.isSubtypeOf(CommandSender::class.createType())
)
)
finalArgs.add(sender)
finalArgs.addAll(tempArgs.mapIndexed { i, it ->
if (it == null) return@mapIndexed null
argsParsers[i + 1](it, sender)
})
val map = mutableMapOf<KParameter, Any?>()
for ((i, arg) in finalArgs.withIndex()) map[func.parameters[i]] = arg
return map
}
}
@@ -1,9 +0,0 @@
package tech.carcadex.kotlinbukkitkit.commands
import org.bukkit.command.CommandSender
import tech.carcadex.kotlinbukkitkit.commands.annotations.Command
import tech.carcadex.kotlinbukkitkit.commands.annotations.Permission
import tech.carcadex.kotlinbukkitkit.commands.manager.CommandManager
typealias Sender = CommandSender
@@ -0,0 +1,4 @@
package tech.carcadex.kotlinbukkitkit.commands.exceptions
class TypeParseException() : RuntimeException() {
}
@@ -0,0 +1,4 @@
package tech.carcadex.kotlinbukkitkit.commands.exceptions
class UnknownCompleteException(val msg: String) : RuntimeException(msg) {
}
@@ -1,99 +0,0 @@
package tech.carcadex.kotlinbukkitkit.commands.manager
import org.bukkit.Bukkit
import org.bukkit.Material
import org.bukkit.OfflinePlayer
import org.bukkit.World
import org.bukkit.command.CommandExecutor
import org.bukkit.command.CommandSender
import org.bukkit.entity.Player
import org.bukkit.plugin.Plugin
import tech.carcadex.kotlinbukkitkit.commands.annotations.Command
import tech.carcadex.kotlinbukkitkit.commands.exceptions.UnsupportedTypeException
import tech.carcadex.kotlinbukkitkit.extensions.offlinePlayerOrNull
import kotlin.reflect.KClass
import kotlin.reflect.KFunction
import kotlin.reflect.KParameter
import kotlin.reflect.KType
import kotlin.reflect.full.callSuspendBy
import kotlin.reflect.full.findAnnotations
import kotlin.reflect.full.hasAnnotation
import kotlin.reflect.full.isSubtypeOf
import kotlin.reflect.jvm.javaType
class CommandManager(val plugin: Plugin) {
private val types = mutableMapOf<String, (String) -> Any?>()
init {
types[CommandSender::class.qualifiedName!!] = { it }
types[String::class.qualifiedName!!] = { it }
types["java.lang.String"] = { it }
types[Int::class.qualifiedName!!] = { it.toInt() }
types["java.lang.Integer"] = { it.toInt() }
types[UInt::class.qualifiedName!!] = { it.toUInt() }
types[Long::class.qualifiedName!!] = { it.toLong() }
types["java.lang.Long"] = { it.toInt() }
types[ULong::class.qualifiedName!!] = { it.toULong() }
types[Short::class.qualifiedName!!] = { it.toShort() }
types["java.lang.Short"] = { it.toInt() }
types[UShort::class.qualifiedName!!] = { it.toUShort() }
types[Float::class.qualifiedName!!] = { it.toFloat() }
types["java.lang.Float"] = { it.toInt() }
types[Double::class.qualifiedName!!] = { it.toDouble() }
types["java.lang.Double"] = { it.toInt() }
types[Byte::class.qualifiedName!!] = { it.toByte() }
types["java.lang.Byte"] = { it.toInt() }
types[UByte::class.qualifiedName!!] = { it.toUByte() }
types[Boolean::class.qualifiedName!!] = { it.toBoolean() }
types["java.lang.Boolean"] = { it.toInt() }
types[Player::class.qualifiedName!!] = { Bukkit.getPlayer(it) }
types[OfflinePlayer::class.qualifiedName!!] = { offlinePlayerOrNull(it) }
types[World::class.qualifiedName!!] = { Bukkit.getWorld(it) }
types[Material::class.qualifiedName!!] = { Material.matchMaterial(it) }
}
private fun register(commandExecutor: CommandExecutor, aliases: Array<String>,
desc: String = "", usage: String = "") {
CommandRegister.reg(plugin, commandExecutor, aliases, desc, usage);
}
fun register(f: KFunction<Unit>) {
if(f.hasAnnotation<Command>()) {
val cmdName = f.findAnnotations<Command>().first().name
val argsParsers = mutableListOf<(String) -> Any?>({
return@mutableListOf types[CommandSender::class.qualifiedName!!]!!(it)
})
for (argType in f.parameters) {
val clazz = Class.forName(argType.type.javaType.typeName)
if(argType.type.javaType.typeName in this.types) {
argsParsers.add(this.types[argType.type.javaType.typeName]!!)
} else if(!clazz.isEnum) throw UnsupportedTypeException("Type ${argType.type.javaType.typeName} is not supported") else {
argsParsers.add {
for(e in clazz.enumConstants) {
if((e as Enum<*>).name.equals(it, ignoreCase = true)) return@add e;
}
throw NoSuchElementException("No such value in enum")
}
}
}
register(CommandExecutor { sender, command, label, args ->
val finalArgs = mutableListOf<Any?>(sender)
finalArgs.addAll(args.mapIndexed { i, it -> argsParsers[i](it) })
val map = mutableMapOf<KParameter, Any?>()
var i = 0;
for(arg in finalArgs) {
map[f.parameters[i]] = arg
++i
}
f.callBy(map)
return@CommandExecutor true;
}, arrayOf(cmdName))
} else throw IllegalArgumentException("It must be a command!")
}
fun type(clazz: KClass<*>, converter: (String) -> Any) {
types[clazz.qualifiedName!!] = converter
}
}
@@ -0,0 +1,119 @@
package tech.carcadex.kotlinbukkitkit.commands.manager
import org.bukkit.command.CommandExecutor
import org.bukkit.command.CommandSender
import org.bukkit.command.TabCompleter
import org.bukkit.plugin.Plugin
import tech.carcadex.kotlinbukkitkit.commands.CommandParams
import tech.carcadex.kotlinbukkitkit.commands.Parser
import tech.carcadex.kotlinbukkitkit.commands.Parser.paramsFromAnnotations
import tech.carcadex.kotlinbukkitkit.commands.annotations.Command
import tech.carcadex.kotlinbukkitkit.commands.exceptions.TypeParseException
import tech.carcadex.kotlinbukkitkit.commands.register.CommandRegister
import tech.carcadex.kotlinbukkitkit.commands.service.MessagesService
import tech.carcadex.kotlinbukkitkit.commands.service.SubCommandsService
import tech.carcadex.kotlinbukkitkit.commands.service.TabCompleteService
import kotlin.reflect.KFunction
import kotlin.reflect.full.createType
import kotlin.reflect.full.hasAnnotation
import kotlin.reflect.full.isSubtypeOf
import kotlin.reflect.jvm.javaType
class ReflectionCommandManager(private val plugin: Plugin) {
private fun register(
commandExecutor: CommandExecutor, commandParams: CommandParams, tabCompleter: TabCompleter =
TabCompleter { _, _, _, _ -> mutableListOf() }
) {
CommandRegister.register(
plugin,
commandExecutor,
commandParams.aliases.toTypedArray(),
commandParams.desc,
commandParams.usage,
tabCompleter
);
}
fun register(commandClass: Any) {
val (name, subs) = SubCommandsService.registerRootCommand(commandClass)
val subsNames = mutableListOf<String>()
subs.forEach {
subsNames.addAll(it.context.aliases)
}
val context = paramsFromAnnotations(commandClass::class)
register(CommandExecutor { sender, _, _, args ->
if (context.perm != null && !sender.hasPermission(context.perm)) {
MessagesService.byTag("#no-perm")(sender)
return@CommandExecutor true
}
SubCommandsService.handleCommand(name, sender, args);
true
},
context,
TabCompleter { sender, cmd, alias, args ->
if (args.size == 1) {
return@TabCompleter subsNames
} else if (args.size > 1) {
val sub = args[0];
if (subs.any { it.name.equals(sub, ignoreCase = true) }) {
val argsForSub = args.copyOfRange(1, args.size)
return@TabCompleter subs.filter { it.name.equals(sub, ignoreCase = true) }.first().tabCompleter
.onTabComplete(sender, cmd, alias, argsForSub)
} else return@TabCompleter emptyList()
} else return@TabCompleter emptyList()
})
}
fun register(func: KFunction<Unit>) {
if (func.hasAnnotation<Command>()) {
val cmd = paramsFromAnnotations(func)
var argsSize = func.parameters.size
if (func.parameters.isNotEmpty() && (
func.parameters[0].type == (CommandSender::class.createType()) ||
func.parameters[0].type.isSubtypeOf(CommandSender::class.createType())
)
) {
--argsSize
}
val argsParsers = Parser.parseParam(func.parameters)
register(CommandExecutor { sender, _, _, argsFromExecutor ->
if (cmd.perm != null && !sender.hasPermission(cmd.perm)) {
MessagesService.byTag("#no-perm")(sender)
return@CommandExecutor true
}
try {
func.callBy(
Parser.paramMap(cmd, argsFromExecutor, argsSize, sender, argsParsers, func)
)
} catch (ignored: TypeParseException) {
} catch (e: IllegalArgumentException) {
MessagesService.byTag("#wrong-usage")(sender)
}
return@CommandExecutor true
},
cmd,
cmd.completeTags.let {
TabCompleteService.completerReflection(it.toMutableList(),
func.parameters.map { it.type.javaType as Class<*> })
}
?: TabCompleter { _, _, _, _ -> mutableListOf() }
)
} else throw IllegalArgumentException("It must be a command!")
}
fun tabComplete(tag: String, func: (CommandSender) -> List<String>) {
TabCompleteService.register(tag, func)
}
fun message(tag: String, func: (CommandSender) -> Unit) {
MessagesService.register(tag, func)
}
}
@@ -1,26 +1,25 @@
package tech.carcadex.kotlinbukkitkit.commands.manager package tech.carcadex.kotlinbukkitkit.commands.register
import org.bukkit.Bukkit import org.bukkit.Bukkit
import org.bukkit.command.* import org.bukkit.command.*
import org.bukkit.plugin.Plugin import org.bukkit.plugin.Plugin
import java.util.*
class CommandRegister( class CommandRegister(
aliases: Array<String>, aliases: Array<String>,
desc: String?, desc: String?,
usage: String?, usage: String?,
protected val owner: CommandExecutor, private val executor: CommandExecutor,
protected val registeredWith: Any, private val tabCompleter: TabCompleter,
val pl: Plugin private val pl: Plugin
) : Command(aliases[0], desc!!, usage!!, Arrays.asList(*aliases)), PluginIdentifiableCommand { ) : Command(aliases[0], desc!!, usage!!, listOf(*aliases)), PluginIdentifiableCommand {
override fun execute(sender: CommandSender, label: String, args: Array<String>): Boolean { override fun execute(sender: CommandSender, label: String, args: Array<String>): Boolean {
if (!testPermission(sender)) { if (!testPermission(sender)) {
return true return true
} }
return if (owner.onCommand(sender, this, label, args)) { return if (executor.onCommand(sender, this, label, args)) {
true true
} else { } else {
sender.sendMessage(usageMessage) sender.sendMessage(usageMessage)
@@ -29,10 +28,10 @@ class CommandRegister(
} }
companion object { companion object {
fun reg(plugin: Plugin, executor: CommandExecutor, aliases: Array<String>, desc: String?, usage: String?) { fun register(plugin: Plugin, executor: CommandExecutor, aliases: Array<String>, desc: String?, usage: String?, tabCompleter: TabCompleter) {
if(aliases.size < 1) throw IllegalArgumentException("Could not found name") if(aliases.size < 1) throw IllegalArgumentException("Could not found name")
try { try {
val reg = CommandRegister(aliases, desc, usage, executor, Any(), plugin) val reg = CommandRegister(aliases, desc, usage, executor, tabCompleter, plugin)
val field = Bukkit.getServer().javaClass.getDeclaredField("commandMap") val field = Bukkit.getServer().javaClass.getDeclaredField("commandMap")
field.isAccessible = true field.isAccessible = true
val map = field[Bukkit.getServer()] as CommandMap val map = field[Bukkit.getServer()] as CommandMap
@@ -44,4 +43,8 @@ class CommandRegister(
} }
override fun getPlugin(): Plugin = pl override fun getPlugin(): Plugin = pl
override fun tabComplete(sender: CommandSender, alias: String, args: Array<out String>): MutableList<String> {
return tabCompleter.onTabComplete(sender, this, alias, args)!!
}
} }
@@ -0,0 +1,25 @@
package tech.carcadex.kotlinbukkitkit.commands.service
import org.bukkit.ChatColor
import org.bukkit.command.CommandSender
object MessagesService {
private val messages = mutableMapOf<String, (CommandSender) -> Unit>()
init {
//REGISTER DEFAULT MESSAGES
messages["#no-such-player"] = { it.sendMessage("${ChatColor.RED}No such player was found") }
messages["#no-such-world"] = { it.sendMessage("${ChatColor.RED}No such world was found") }
messages["#no-such-material"] = { it.sendMessage("${ChatColor.RED}No such material was found") }
messages["#no-such-enum"] = { it.sendMessage("${ChatColor.RED}No such value for this enum was found") }
messages["#not-a-number"] = { it.sendMessage("${ChatColor.RED}It is not a number") }
messages["#wrong-usage"] = { it.sendMessage("${ChatColor.RED}Wrong usage of command") }
messages["#no-perm"] = { it.sendMessage("${ChatColor.RED}You have not permissions for this command!") }
}
fun register(tag: String, func: (CommandSender) -> Unit) {
messages[tag] = func
}
fun byTag(tag: String): (CommandSender) -> Unit = messages[tag] ?: throw NoSuchElementException("Could not found message $tag")
}
@@ -0,0 +1,90 @@
package tech.carcadex.kotlinbukkitkit.commands.service
import org.bukkit.command.CommandSender
import org.bukkit.command.TabCompleter
import tech.carcadex.kotlinbukkitkit.commands.CommandParams
import tech.carcadex.kotlinbukkitkit.commands.Parser
import tech.carcadex.kotlinbukkitkit.commands.annotations.Command
import tech.carcadex.kotlinbukkitkit.commands.annotations.Default
import tech.carcadex.kotlinbukkitkit.commands.exceptions.TypeParseException
import kotlin.reflect.KClass
import kotlin.reflect.KFunction
import kotlin.reflect.KParameter
import kotlin.reflect.full.*
import kotlin.reflect.jvm.javaType
object SubCommandsService {
data class SubCommand(val name: String, val context: CommandParams,
val executor: (sender: CommandSender, args: Array<String>) -> Boolean, val tabCompleter: TabCompleter)
private val subs = mutableMapOf<String, List<SubCommand>>()
private val defaults = mutableMapOf<String, SubCommand>()
fun registerRootCommand(command: Any): Pair<String, List<SubCommand>> {
val clazz = command::class
if(!clazz.hasAnnotation<Command>()) throw IllegalArgumentException("$command has not Command annotation")
val name = clazz.findAnnotation<Command>()!!.name.lowercase()
val res = mutableListOf<SubCommand>()
for(func in clazz.functions) {
if(func.hasAnnotation<tech.carcadex.kotlinbukkitkit.commands.annotations.SubCommand>()) {
res.add(parseSubCommand(func, command))
} else if(func.hasAnnotation<Default>()) {
defaults[name] = parseSubCommand(func, command)
}
}
subs[name] = res
return Pair(name, res)
}
fun handleCommand(rootCommand: String, sender: CommandSender, args: Array<String>) {
if(rootCommand.lowercase() in subs) {
if(args.isNotEmpty()) for(sub in subs[rootCommand.lowercase()]!!) {
if(sub.name == args[0]) {
sub.executor(sender, args.copyOfRange(1, args.size))
return
}
}
defaults[rootCommand]?.executor?.let { it(sender, args) }
}
}
private fun parseSubCommand(func: KFunction<*>, rootCommand: Any): SubCommand {
val name = if(func.hasAnnotation<Default>()) "default" else func.findAnnotations(tech.carcadex.kotlinbukkitkit.commands.annotations.SubCommand::class).first().name
val context = Parser.paramsFromAnnotations(func)
val argsParsers = Parser.parseParam(func.parameters.toTypedArray().copyOfRange(1, func.parameters.size).toList())
var argsSize = func.parameters.size
if (func.parameters.isNotEmpty() && (
func.parameters[0].type == (CommandSender::class.createType()) ||
func.parameters[0].type.isSubtypeOf(CommandSender::class.createType())
)) {
--argsSize
}
val executor: (sender: CommandSender, args: Array<String>) -> Boolean = { sender, argsFromExecutor ->
if (context.perm != null && !sender.hasPermission(context.perm)) {
MessagesService.byTag("#no-perm")(sender)
true
} else {
try {
func.callBy(Parser.paramMap(context, argsFromExecutor, argsSize, sender, argsParsers, func, true, rootCommand))
true
} catch (ignored: TypeParseException) {
false
} catch (e: IllegalArgumentException) {
MessagesService.byTag("#wrong-usage")(sender)
false
}
}
}
return SubCommand(name, context, executor, context.completeTags.let {
TabCompleteService.completerReflection(it.toMutableList(),
func.parameters.map { it.type.javaType as Class<*> })
}
?: TabCompleter { _, _, _, _ -> mutableListOf() })
}
}
@@ -0,0 +1,65 @@
package tech.carcadex.kotlinbukkitkit.commands.service
import org.bukkit.Bukkit
import org.bukkit.command.CommandSender
import org.bukkit.command.TabCompleter
import kotlin.collections.ArrayList
object TabCompleteService {
private val completes = mutableMapOf<String, (CommandSender) -> List<String>>()
init {
//REGISTER DEFAULT COMPLETES
completes["#players"] = { Bukkit.getOnlinePlayers().map { it.name } }
completes["#offlinePlayers"] = { Bukkit.getOfflinePlayers().map { it.name ?: "" } }
completes["#worlds"] = { Bukkit.getWorlds().map { it.name } }
completes["#empty"] = { emptyList() }
}
fun register(tag: String, func: (CommandSender) -> List<String>) {
completes[tag] = func
}
fun completerReflection(list: MutableList<String>, params: List<Class<*>>): TabCompleter {
val complete: MutableList<(CommandSender) -> List<String>> = ArrayList(params.size)
for(i in params.indices) complete.add { mutableListOf() }
for((i, tag) in list.withIndex()) {
complete[i] = reflectionCompleteParser(tag, params[i+if(params[0] == CommandSender::class.java) 1 else 0])
}
return createTabCompleter(complete)
}
private fun createTabCompleter(completes: List<(CommandSender) -> List<String>>): TabCompleter =
TabCompleter { sender, _, _, args ->
if(args.size <= completes.size)
completes[args.size-1](sender)
else mutableListOf()
}
private fun reflectionCompleteParser(tagLine: String, paramClass: Class<*>): (CommandSender) -> List<String> =
when(tagLine.split(":")[0]) {
"#enum" -> { _ -> enumReflectionParse(paramClass) }
else -> defaultCompleteParse(tagLine)
}
private fun defaultCompleteParse(tagLine: String): (CommandSender) -> List<String> =
if(tagLine in completes) completes[tagLine]!! else
when(tagLine.split(":")[0]) {
"#range" -> { _ -> rangeCompleteParse(tagLine) }
else -> { _ -> emptyList() }
}
private fun rangeCompleteParse(tagLine: String): List<String> {
val diapason = tagLine.replace("#range:", "").split("-");
return (diapason[0].toInt()..diapason[1].toInt()).map { it.toString() }
}
private fun enumReflectionParse(enumClass: Class<*>): List<String> {
if(enumClass.isEnum) { return enumClass.enumConstants.map { (it as Enum<*>).name }
} else throw IllegalArgumentException("#enum complete but param ${enumClass.canonicalName} is not enum")
}
}
@@ -0,0 +1,108 @@
package tech.carcadex.kotlinbukkitkit.commands.service
import org.bukkit.Bukkit
import org.bukkit.Material
import org.bukkit.OfflinePlayer
import org.bukkit.World
import org.bukkit.command.CommandSender
import org.bukkit.entity.Player
import tech.carcadex.kotlinbukkitkit.commands.exceptions.UnsupportedTypeException
import tech.carcadex.kotlinbukkitkit.extensions.offlinePlayerOrNull
import java.lang.reflect.Type
import kotlin.reflect.KClass
import kotlin.reflect.KType
import kotlin.reflect.javaType
object TypeService {
data class TypeContext(val arg: String, val sender: CommandSender, var errorMessage: String? = null)
private val types = mutableMapOf<KClass<*>, (TypeContext) -> Any?>()
//REGISTER DEFAULT TYPES
init {
types[CommandSender::class] = { it.arg }
types[String::class] = { it.arg }
types[java.lang.String::class] = { it.arg }
types[Int::class] = { it.errorMessage = "#not-a-number"; it.arg.toInt() }
types[java.lang.Integer::class] = { it.errorMessage = "#not-a-number"; it.arg.toInt() }
types[UInt::class] = { it.errorMessage = "#not-a-number"; it.arg.toUInt() }
types[Long::class] = { it.errorMessage = "#not-a-number"; it.arg.toLong() }
types[java.lang.Long::class] = { it.errorMessage = "#not-a-number"; it.arg.toInt() }
types[ULong::class] = { it.errorMessage = "#not-a-number"; it.arg.toULong() }
types[Short::class] = { it.errorMessage = "#not-a-number"; it.arg.toShort() }
types[java.lang.Short::class] = { it.arg.toInt() }
types[UShort::class] = { it.errorMessage = "#not-a-number"; it.arg.toUShort() }
types[Float::class] = { it.errorMessage = "#not-a-number"; it.arg.toFloat() }
types[java.lang.Float::class] = { it.errorMessage = "#not-a-number"; it.arg.toInt() }
types[Double::class] = { it.errorMessage = "#not-a-number"; it.arg.toDouble() }
types[java.lang.Double::class] = { it.errorMessage = "#not-a-number"; it.arg.toInt() }
types[Byte::class] = { it.errorMessage = "#not-a-number"; it.arg.toByte() }
types[java.lang.Byte::class] = { it.errorMessage = "#not-a-number"; it.arg.toInt() }
types[UByte::class] = { it.errorMessage = "#not-a-number"; it.arg.toUByte() }
types[Boolean::class] = { it.errorMessage = "#not-a-number"; it.arg.toBoolean() }
types[java.lang.Boolean::class] = { it.errorMessage = "#not-a-number"; it.arg.toInt() }
types[Player::class] = {
Bukkit.getPlayer(it.arg).also { o -> if(o == null) it.errorMessage = "#no-such-player" }
}
types[OfflinePlayer::class] = {
offlinePlayerOrNull(it.arg).also { o -> if(o == null) it.errorMessage = "#no-such-player" }
}
types[World::class] = { Bukkit.getWorld(it.arg).also { o -> if(o == null) it.errorMessage = "#no-such-world" } }
types[Material::class] = { Material.matchMaterial(it.arg).also { o ->
if(o == null) it.errorMessage = "#no-such-material" } }
// types[CommandSender::class.qualifiedName!!] = { it }
// types[String::class.qualifiedName!!] = { it }
// types["java.lang.String"] = { it }
// types[Int::class.qualifiedName!!] = { it.errorMessage = "#not-a-number"; it.arg.toInt() }
// types["java.lang.Integer"] = { it.errorMessage = "#not-a-number"; it.arg.toInt() }
// types[UInt::class.qualifiedName!!] = { it.errorMessage = "#not-a-number"; it.arg.toUInt() }
// types[Long::class.qualifiedName!!] = { it.errorMessage = "#not-a-number"; it.arg.toLong() }
// types["java.lang.Long"] = { it.errorMessage = "#not-a-number"; it.arg.toInt() }
// types[ULong::class.qualifiedName!!] = { it.errorMessage = "#not-a-number"; it.arg.toULong() }
// types[Short::class.qualifiedName!!] = { it.errorMessage = "#not-a-number"; it.arg.toShort() }
// types["java.lang.Short"] = { it.arg.toInt() }
// types[UShort::class.qualifiedName!!] = { it.errorMessage = "#not-a-number"; it.arg.toUShort() }
// types[Float::class.qualifiedName!!] = { it.errorMessage = "#not-a-number"; it.arg.toFloat() }
// types["java.lang.Float"] = { it.errorMessage = "#not-a-number"; it.arg.toInt() }
// types[Double::class.qualifiedName!!] = { it.errorMessage = "#not-a-number"; it.arg.toDouble() }
// types["java.lang.Double"] = { it.errorMessage = "#not-a-number"; it.arg.toInt() }
// types[Byte::class.qualifiedName!!] = { it.errorMessage = "#not-a-number"; it.arg.toByte() }
// types["java.lang.Byte"] = { it.errorMessage = "#not-a-number"; it.arg.toInt() }
// types[UByte::class.qualifiedName!!] = { it.errorMessage = "#not-a-number"; it.arg.toUByte() }
// types[Boolean::class.qualifiedName!!] = { it.errorMessage = "#not-a-number"; it.arg.toBoolean() }
// types["java.lang.Boolean"] = { it.errorMessage = "#not-a-number"; it.arg.toInt() }
//
// types[Player::class.qualifiedName!!] = {
// Bukkit.getPlayer(it.arg).also { o -> if(o == null) it.errorMessage = "#no-such-player" }
// }
// types[OfflinePlayer::class.qualifiedName!!] = {
// offlinePlayerOrNull(it.arg).also { o -> if(o == null) it.errorMessage = "#no-such-player" }
// }
// types[World::class.qualifiedName!!] = { Bukkit.getWorld(it.arg).also { o -> if(o == null) it.errorMessage = "#no-such-world" } }
//
// types[Material::class.qualifiedName!!] = { Material.matchMaterial(it.arg).also { o ->
// if(o == null) it.errorMessage = "#no-such-material" } }
}
fun registered(clazz: KClass<*>): Boolean = clazz in types
fun registered(clazz: Class<*>): Boolean = registered(clazz.kotlin)
fun registered(name: String): Boolean = registered(Class.forName(name))
fun registered(type: Type): Boolean = registered(type as Class<*>)
@OptIn(ExperimentalStdlibApi::class)
fun registered(type: KType): Boolean = registered(type.javaType)
fun register(clazz: KClass<*>, func: (TypeContext) -> Any) {
types[clazz] = func
}
fun byClass(clazz: KClass<*>): (TypeContext) -> Any? = types[clazz] ?: throw UnsupportedTypeException(
"Type ${clazz.qualifiedName} is not supported!")
fun byClass(clazz: Class<*>): (TypeContext) -> Any? = types[clazz.kotlin] ?: throw UnsupportedTypeException(
"Type ${clazz.canonicalName} is not supported!")
fun byClassName(name: String) = byClass(Class.forName(name))
fun byType(type: Type): (TypeContext) -> Any? = byClass(type as Class<*>)
@OptIn(ExperimentalStdlibApi::class)
fun byType(type: KType): (TypeContext) -> Any? = byType(type.javaType)
}
+42
View File
@@ -0,0 +1,42 @@
.gradle
build/
!gradle/wrapper/gradle-wrapper.jar
!**/src/main/**/build/
!**/src/test/**/build/
### IntelliJ IDEA ###
.idea/modules.xml
.idea/jarRepositories.xml
.idea/compiler.xml
.idea/libraries/
*.iws
*.iml
*.ipr
out/
!**/src/main/**/out/
!**/src/test/**/out/
### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
bin/
!**/src/main/**/bin/
!**/src/test/**/bin/
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
### VS Code ###
.vscode/
### Mac OS ###
.DS_Store
+89
View File
@@ -0,0 +1,89 @@
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
kotlin("jvm") version "1.9.0"
id("com.google.devtools.ksp") version "1.9.0-1.0.11"
id("java")
id("net.minecrell.plugin-yml.bukkit") version "0.6.0"
id("org.jetbrains.kotlin.plugin.serialization") version "1.8.21"
id("com.github.johnrengelman.shadow") version "7.1.2"
id("xyz.jpenilla.run-paper") version "2.1.0"
}
group = "me.redtea"
version = "1.0.0-SNAPSHOT"
val carcadeXVersion = project.findProperty("carcadexversion").toString()
repositories {
mavenCentral()
maven {
name = "spigotmc-repo"
url = uri("https://hub.spigotmc.org/nexus/content/repositories/snapshots/")
}
maven {
name = "sonatype"
url = uri("https://oss.sonatype.org/content/groups/public/")
}
maven {
name = "kotlinminecraft"
url = uri("https://raw.githubusercontent.com/KotlinMinecraft/KotlinBukkitAPI-Repository/main")
}
}
dependencies {
//Spigot 1.16.5 API
compileOnly("org.spigotmc:spigot-api:1.16.5-R0.1-SNAPSHOT")
implementation(parent!!)
//Kotlin modubles
library("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
library("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.2")
library("org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.1")
library("org.jetbrains.kotlin:kotlin-reflect:1.9.0")
library("org.jetbrains:annotations:24.0.0")
//XSeries
library("com.github.cryptomorin:XSeries:9.2.0")
//CarcadeX modules
implementation(project(":architecture"))
compileOnly(project(":genref"))
ksp(project(":genref"))
//implementation files('libs/MiniMessages-0.1.0.jar')
}
bukkit {
main = "me.redtea.test.TestPlugin"
author = "itzRedTea"
apiVersion = "1.13"
}
tasks {
runServer {
minecraftVersion("1.16.5")
}
}
tasks {
shadowJar {
dependencies {
exclude {
it.moduleGroup.startsWith("org.jetbrains")
}
exclude(dependency("io.github.iredtea:carcadex:*"))
exclude(dependency("com.github.cryptomorin:XSeries:9.2.0"))
exclude(dependency("net.kyori:adventure-api:4.14.0"))
}
}
}
tasks.withType<KotlinCompile> {
kotlinOptions.jvmTarget = "1.8"
}
+1
View File
@@ -0,0 +1 @@
[]
+1
View File
@@ -0,0 +1 @@
[]
+41
View File
@@ -0,0 +1,41 @@
# This is the main configuration file for Bukkit.
# As you can see, there's actually not that much to configure without any plugins.
# For a reference for any variable inside this file, check out the Bukkit Wiki at
# https://www.spigotmc.org/go/bukkit-yml
#
# If you need help on this file, feel free to join us on irc or leave a message
# on the forums asking for advice.
#
# IRC: #spigot @ irc.spi.gt
# (If this means nothing to you, just go to https://www.spigotmc.org/go/irc )
# Forums: https://www.spigotmc.org/
# Bug tracker: https://www.spigotmc.org/go/bugs
settings:
allow-end: true
warn-on-overload: true
permissions-file: permissions.yml
update-folder: update
plugin-profiling: false
connection-throttle: 4000
query-plugins: true
deprecated-verbose: default
shutdown-message: Server closed
minimum-api: none
spawn-limits:
monsters: 70
animals: 10
water-animals: 5
water-ambient: 20
ambient: 15
chunk-gc:
period-in-ticks: 600
ticks-per:
animal-spawns: 400
monster-spawns: 1
water-spawns: 1
water-ambient-spawns: 1
ambient-spawns: 1
autosave: 6000
aliases: now-in-commands.yml
Binary file not shown.
+17
View File
@@ -0,0 +1,17 @@
# This is the commands configuration file for Bukkit.
# For documentation on how to make use of this file, check out the Bukkit Wiki at
# https://www.spigotmc.org/go/commands-yml
#
# If you need help on this file, feel free to join us on irc or leave a message
# on the forums asking for advice.
#
# IRC: #spigot @ irc.spi.gt
# (If this means nothing to you, just go to https://www.spigotmc.org/go/irc )
# Forums: https://www.spigotmc.org/
# Bug tracker: https://www.spigotmc.org/go/bugs
command-block-overrides: []
ignore-vanilla-permissions: false
aliases:
icanhasbukkit:
- version $1-
+4
View File
@@ -0,0 +1,4 @@
#By changing the setting below to TRUE you are indicating your agreement to our EULA (https://account.mojang.com/documents/minecraft_eula).
#You also agree that tacos are tasty, and the best food in the world.
#Tue Aug 22 13:05:52 MSK 2023
eula=true
+56
View File
@@ -0,0 +1,56 @@
# This is the help configuration file for Bukkit.
#
# By default you do not need to modify this file. Help topics for all plugin commands are automatically provided by
# or extracted from your installed plugins. You only need to modify this file if you wish to add new help pages to
# your server or override the help pages of existing plugin commands.
#
# This file is divided up into the following parts:
# -- general-topics: lists admin defined help topics
# -- index-topics: lists admin defined index topics
# -- amend-topics: lists topic amendments to apply to existing help topics
# -- ignore-plugins: lists any plugins that should be excluded from help
#
# Examples are given below. When amending command topic, the string <text> will be replaced with the existing value
# in the help topic. Color codes can be used in topic text. The color code character is & followed by 0-F.
# ================================================================
#
# Set this to true to list the individual command help topics in the master help.
# command-topics-in-master-index: true
#
# Each general topic will show up as a separate topic in the help index along with all the plugin command topics.
# general-topics:
# Rules:
# shortText: Rules of the server
# fullText: |
# &61. Be kind to your fellow players.
# &B2. No griefing.
# &D3. No swearing.
# permission: topics.rules
#
# Each index topic will show up as a separate sub-index in the help index along with all the plugin command topics.
# To override the default help index (displayed when the user executes /help), name the index topic "Default".
# index-topics:
# Ban Commands:
# shortText: Player banning commands
# preamble: Moderator - do not abuse these commands
# permission: op
# commands:
# - /ban
# - /ban-ip
# - /banlist
#
# Topic amendments are used to change the content of automatically generated plugin command topics.
# amended-topics:
# /stop:
# shortText: Stops the server cold....in its tracks!
# fullText: <text> - This kills the server.
# permission: you.dont.have
#
# Any plugin in the ignored plugins list will be excluded from help. The name must match the name displayed by
# the /plugins command. Ignore "Bukkit" to remove the standard bukkit commands from the index. Ignore "All"
# to completely disable automatic help topic generation.
# ignore-plugins:
# - PluginNameOne
# - PluginNameTwo
# - PluginNameThree
@@ -0,0 +1 @@
aa3d386edc9fd5d223103ad1170c941a9b794fa3
@@ -0,0 +1,272 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.github.cryptomorin</groupId>
<artifactId>XSeries</artifactId>
<version>9.2.0</version>
<name>XSeries</name>
<description>A set of utilities for Minecraft plugins</description>
<url>https://www.spigotmc.org/threads/378136/</url>
<issueManagement>
<system>GitHub Issues</system>
<url>https://github.com/CryptoMorin/XSeries/issues</url>
</issueManagement>
<inceptionYear>2019</inceptionYear>
<developers>
<developer>
<id>CryptoMorin</id>
<name>Crypto Morin</name>
<roles>
<role>Owner</role>
</roles>
</developer>
</developers>
<licenses>
<license>
<name>MIT License</name>
<url>https://opensource.org/licenses/MIT</url>
<distribution>repo</distribution>
</license>
</licenses>
<parent>
<groupId>org.sonatype.oss</groupId>
<artifactId>oss-parent</artifactId>
<version>9</version>
</parent>
<distributionManagement>
<snapshotRepository>
<id>ossrh</id>
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
</snapshotRepository>
<repository>
<id>ossrh</id>
<url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
</repository>
</distributionManagement>
<repositories>
<repository>
<id>nms-repo</id>
<url>https://repo.codemc.org/repository/nms/</url>
</repository>
</repositories>
<properties>
<!-- Latest version -->
<spigotVersion>1.19.3-R0.1-SNAPSHOT</spigotVersion>
</properties>
<dependencies>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot</artifactId>
<version>${spigotVersion}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.8.2</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.2.0</version>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<!--all,-missing-->
<doclint>none</doclint>
<release>8</release>
<excludePackageNames>com.cryptomorin.xseries.unused:com.cryptomorin.xseries.particles</excludePackageNames>
<!-- Apparently this is needed because it's a bug with maven JavaDoc plugin not being able to find the exe by itself. -->
<javadocExecutable>${java.home}/bin/javadoc</javadocExecutable>
</configuration>
<executions>
<execution>
<id>attach-javadocs</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<version>1.6</version>
<executions>
<execution>
<id>sign-artifacts</id>
<phase>verify</phase>
<goals>
<goal>sign</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.sonatype.plugins</groupId>
<artifactId>nexus-staging-maven-plugin</artifactId>
<version>1.6.8</version>
<extensions>true</extensions>
<configuration>
<serverId>ossrh</serverId>
<nexusUrl>https://oss.sonatype.org/</nexusUrl>
<autoReleaseAfterClose>true</autoReleaseAfterClose>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<proc>none</proc>
<source>8</source>
<target>8</target>
<compilerArgs>
<!-- Fails to build the JAR if one of the excluded classes are being used inside an included class. -->
<arg>-sourcepath</arg>
<arg>doesnotexist</arg>
</compilerArgs>
<excludes>
<exclude>com/cryptomorin/xseries/unused/</exclude>
<exclude>com/cryptomorin/xseries/SkullCacheListener.java</exclude>
</excludes>
</configuration>
<executions>
<execution>
<id>default-testCompile</id>
<phase>test-compile</phase>
<goals>
<goal>testCompile</goal>
</goals>
<configuration>
<skip>true</skip>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M5</version>
<configuration>
<!--<failIfNoTests>true</failIfNoTests>-->
<trimStackTrace>false</trimStackTrace>
<workingDirectory>${basedir}/target/tests</workingDirectory>
<!-- <dependenciesToScan>-->
<!-- <dependency>*:spigot:*:*:1.16.5-R0.1-SNAPSHOT</dependency>-->
<!-- </dependenciesToScan>-->
<includes>
<include>**/DummySpigot.java</include>
</includes>
</configuration>
</plugin>
</plugins>
<testSourceDirectory>src/test</testSourceDirectory>
<testResources>
<testResource>
<directory>src/test/resources</directory>
<filtering>true</filtering>
</testResource>
</testResources>
</build>
<profiles>
<profile>
<id>tester</id>
<dependencies>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot</artifactId>
<version>${spigotVersion}</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>17</source>
<target>17</target>
</configuration>
<executions>
<execution>
<id>default-testCompile</id>
<phase>test-compile</phase>
<goals>
<goal>testCompile</goal>
</goals>
<configuration>
<skip>false</skip>
<testIncludes>
<include>*/**DummySpigot.java</include>
</testIncludes>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
<profile>
<id>latest</id>
<properties>
<nms>19_R0</nms>
</properties>
</profile>
<profile>
<id>18</id>
<properties>
<nms>18_R1</nms>
<spigotVersion>1.18.1-R0.1-SNAPSHOT</spigotVersion>
</properties>
</profile>
<profile>
<id>17</id>
<properties>
<nms>17_R1</nms>
<spigotVersion>1.17.1-R0.1-SNAPSHOT</spigotVersion>
</properties>
</profile>
<profile>
<!-- Doens't seem to work. I can't find a way to compile with one dependency and test with another -->
<id>16</id>
<properties>
<nms>16_R3</nms>
<spigotVersion>1.16.5-R0.1-SNAPSHOT</spigotVersion>
</properties>
</profile>
</profiles>
</project>
@@ -0,0 +1 @@
b3a48024a3315906810a4f5c81cc26da5d1abc07
@@ -0,0 +1,4 @@
#NOTE: This is a Maven Resolver internal implementation file, its format can be changed without prior notice.
#Tue Aug 22 13:06:54 MSK 2023
XSeries-9.2.0.jar>central=
XSeries-9.2.0.pom>central=
@@ -0,0 +1,3 @@
#NOTE: This is a Maven Resolver internal implementation file, its format can be changed without prior notice.
#Tue Aug 22 13:06:50 MSK 2023
annotations-13.0.pom>central=
@@ -0,0 +1,139 @@
<?xml version="1.0" encoding="UTF-8"?>
<project
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>org.jetbrains</groupId>
<artifactId>annotations</artifactId>
<version>13.0</version>
<packaging>jar</packaging>
<name>IntelliJ IDEA Annotations</name>
<description>A set of annotations used for code inspection support and code documentation.</description>
<url>http://www.jetbrains.org</url>
<licenses>
<license>
<name>The Apache Software License, Version 2.0</name>
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
<distribution>repo</distribution>
<comments>A business-friendly OSS license</comments>
</license>
</licenses>
<scm>
<url>https://github.com/JetBrains/intellij-community</url>
<connection>scm:git:https://github.com/JetBrains/intellij-community.git</connection>
</scm>
<developers>
<developer>
<id>JetBrains</id>
<name>JetBrains Team</name>
<organization>JetBrains</organization>
<organizationUrl>http://www.jetbrains.com</organizationUrl>
</developer>
</developers>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
<plugins>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.7</version>
<executions>
<execution>
<phase>generate-sources</phase>
<configuration>
<tasks>
<delete dir="${basedir}/src/main/java" />
<mkdir dir="${basedir}/src/main/java" />
<copy todir="${basedir}/src/main/java">
<fileset dir="${basedir}/../../../community/platform/annotations/src" />
</copy>
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.1.2</version>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>2.9.1</version>
<executions>
<execution>
<id>attach-javadocs</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-gpg-plugin</artifactId>
<version>1.4</version>
<configuration>
<keyname>66770193</keyname>
<homedir>${basedir}/.gnupg</homedir>
</configuration>
<executions>
<execution>
<id>sign-artifacts</id>
<phase>verify</phase>
<goals>
<goal>sign</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<distributionManagement>
<repository>
<id>sonatype-nexus-staging</id>
<url>http://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
</repository>
<snapshotRepository>
<id>sonatype-nexus-snapshots</id>
<url>https://oss.sonatype.org/content/repositories/snapshots/</url>
</snapshotRepository>
</distributionManagement>
</project>
@@ -0,0 +1 @@
fa7d3d07cc80547e2d15bf4839d3267c637c642f
@@ -0,0 +1,3 @@
#NOTE: This is a Maven Resolver internal implementation file, its format can be changed without prior notice.
#Tue Aug 22 13:06:50 MSK 2023
annotations-23.0.0.pom>central=
@@ -0,0 +1,30 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>org.jetbrains</groupId>
<artifactId>annotations</artifactId>
<version>23.0.0</version>
<name>JetBrains Java Annotations</name>
<description>A set of annotations used for code inspection support and code documentation.</description>
<url>https://github.com/JetBrains/java-annotations</url>
<scm>
<url>https://github.com/JetBrains/java-annotations</url>
<connection>scm:git:git://github.com/JetBrains/java-annotations.git</connection>
<developerConnection>scm:git:ssh://github.com:JetBrains/java-annotations.git</developerConnection>
</scm>
<licenses>
<license>
<name>The Apache Software License, Version 2.0</name>
<url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
<distribution>repo</distribution>
</license>
</licenses>
<developers>
<developer>
<id>JetBrains</id>
<name>JetBrains Team</name>
<organization>JetBrains</organization>
<organizationUrl>https://www.jetbrains.com</organizationUrl>
</developer>
</developers>
</project>
@@ -0,0 +1 @@
deb853be3c9e05ed99fbbf83e49d349d08a6d10e
@@ -0,0 +1,4 @@
#NOTE: This is a Maven Resolver internal implementation file, its format can be changed without prior notice.
#Tue Aug 22 13:06:54 MSK 2023
annotations-24.0.0.jar>central=
annotations-24.0.0.pom>central=
@@ -0,0 +1 @@
69b8b443c437fdeefa8d20c18d257b94836a92b9
@@ -0,0 +1,30 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>org.jetbrains</groupId>
<artifactId>annotations</artifactId>
<version>24.0.0</version>
<name>JetBrains Java Annotations</name>
<description>A set of annotations used for code inspection support and code documentation.</description>
<url>https://github.com/JetBrains/java-annotations</url>
<scm>
<url>https://github.com/JetBrains/java-annotations</url>
<connection>scm:git:git://github.com/JetBrains/java-annotations.git</connection>
<developerConnection>scm:git:ssh://github.com:JetBrains/java-annotations.git</developerConnection>
</scm>
<licenses>
<license>
<name>The Apache Software License, Version 2.0</name>
<url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
<distribution>repo</distribution>
</license>
</licenses>
<developers>
<developer>
<id>JetBrains</id>
<name>JetBrains Team</name>
<organization>JetBrains</organization>
<organizationUrl>https://www.jetbrains.com</organizationUrl>
</developer>
</developers>
</project>
@@ -0,0 +1 @@
bfce1521c40f705e9fe25e1b86301035fb72d129
@@ -0,0 +1,4 @@
#NOTE: This is a Maven Resolver internal implementation file, its format can be changed without prior notice.
#Tue Aug 22 13:06:54 MSK 2023
kotlin-reflect-1.8.21.pom>central=
kotlin-reflect-1.8.21.jar>central=
@@ -0,0 +1 @@
662838019bc1141f8a311180d93b9e13765c7f55
@@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-reflect</artifactId>
<version>1.8.21</version>
<name>Kotlin Reflect</name>
<description>Kotlin Full Reflection Library</description>
<url>https://kotlinlang.org/</url>
<licenses>
<license>
<name>The Apache License, Version 2.0</name>
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
</license>
</licenses>
<developers>
<developer>
<name>Kotlin Team</name>
<organization>JetBrains</organization>
<organizationUrl>https://www.jetbrains.com</organizationUrl>
</developer>
</developers>
<scm>
<connection>scm:git:https://github.com/JetBrains/kotlin.git</connection>
<developerConnection>scm:git:https://github.com/JetBrains/kotlin.git</developerConnection>
<url>https://github.com/JetBrains/kotlin</url>
</scm>
<dependencies>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib</artifactId>
<version>1.8.21</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
@@ -0,0 +1 @@
988a6739315c721d0fa76a517ee314e4b6e29cfb
@@ -0,0 +1,4 @@
#NOTE: This is a Maven Resolver internal implementation file, its format can be changed without prior notice.
#Tue Aug 22 23:22:39 MSK 2023
kotlin-reflect-1.9.0.pom>central=
kotlin-reflect-1.9.0.jar>central=
@@ -0,0 +1 @@
2891f552979d4bf4d4ec516acb9df769fb62dbe9
@@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-reflect</artifactId>
<version>1.9.0</version>
<name>Kotlin Reflect</name>
<description>Kotlin Full Reflection Library</description>
<url>https://kotlinlang.org/</url>
<licenses>
<license>
<name>The Apache License, Version 2.0</name>
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
</license>
</licenses>
<developers>
<developer>
<name>Kotlin Team</name>
<organization>JetBrains</organization>
<organizationUrl>https://www.jetbrains.com</organizationUrl>
</developer>
</developers>
<scm>
<connection>scm:git:https://github.com/JetBrains/kotlin.git</connection>
<developerConnection>scm:git:https://github.com/JetBrains/kotlin.git</developerConnection>
<url>https://github.com/JetBrains/kotlin</url>
</scm>
<dependencies>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib</artifactId>
<version>1.9.0</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
@@ -0,0 +1 @@
eb198069ed7e9e8458d900c47325475ec581507a
@@ -0,0 +1,3 @@
#NOTE: This is a Maven Resolver internal implementation file, its format can be changed without prior notice.
#Tue Aug 22 13:06:51 MSK 2023
kotlin-stdlib-common-1.8.20.pom>central=
@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib-common</artifactId>
<version>1.8.20</version>
<name>Kotlin Stdlib Common</name>
<description>Kotlin Common Standard Library</description>
<url>https://kotlinlang.org/</url>
<licenses>
<license>
<name>The Apache License, Version 2.0</name>
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
</license>
</licenses>
<developers>
<developer>
<name>Kotlin Team</name>
<organization>JetBrains</organization>
<organizationUrl>https://www.jetbrains.com</organizationUrl>
</developer>
</developers>
<scm>
<connection>scm:git:https://github.com/JetBrains/kotlin.git</connection>
<developerConnection>scm:git:https://github.com/JetBrains/kotlin.git</developerConnection>
<url>https://github.com/JetBrains/kotlin</url>
</scm>
</project>
@@ -0,0 +1 @@
c8bc98db3b7220e49408922137dbd44fc458708c
@@ -0,0 +1,4 @@
#NOTE: This is a Maven Resolver internal implementation file, its format can be changed without prior notice.
#Tue Aug 22 13:06:54 MSK 2023
kotlin-stdlib-common-1.8.21.jar>central=
kotlin-stdlib-common-1.8.21.pom>central=
@@ -0,0 +1 @@
d749cd5ae25da36d06e5028785038e24f9d37976
@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib-common</artifactId>
<version>1.8.21</version>
<name>Kotlin Stdlib Common</name>
<description>Kotlin Common Standard Library</description>
<url>https://kotlinlang.org/</url>
<licenses>
<license>
<name>The Apache License, Version 2.0</name>
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
</license>
</licenses>
<developers>
<developer>
<name>Kotlin Team</name>
<organization>JetBrains</organization>
<organizationUrl>https://www.jetbrains.com</organizationUrl>
</developer>
</developers>
<scm>
<connection>scm:git:https://github.com/JetBrains/kotlin.git</connection>
<developerConnection>scm:git:https://github.com/JetBrains/kotlin.git</developerConnection>
<url>https://github.com/JetBrains/kotlin</url>
</scm>
</project>
@@ -0,0 +1 @@
8f1a58d8fd44b0f34359325b9b47c95df2c7ea9e
@@ -0,0 +1,4 @@
#NOTE: This is a Maven Resolver internal implementation file, its format can be changed without prior notice.
#Tue Aug 22 23:22:39 MSK 2023
kotlin-stdlib-common-1.9.0.pom>central=
kotlin-stdlib-common-1.9.0.jar>central=
@@ -0,0 +1 @@
cd65c21cfd1eec4d44ef09f9f52b6d9f8a720636
@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib-common</artifactId>
<version>1.9.0</version>
<name>Kotlin Stdlib Common</name>
<description>Kotlin Common Standard Library</description>
<url>https://kotlinlang.org/</url>
<licenses>
<license>
<name>The Apache License, Version 2.0</name>
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
</license>
</licenses>
<developers>
<developer>
<name>Kotlin Team</name>
<organization>JetBrains</organization>
<organizationUrl>https://www.jetbrains.com</organizationUrl>
</developer>
</developers>
<scm>
<connection>scm:git:https://github.com/JetBrains/kotlin.git</connection>
<developerConnection>scm:git:https://github.com/JetBrains/kotlin.git</developerConnection>
<url>https://github.com/JetBrains/kotlin</url>
</scm>
</project>
@@ -0,0 +1 @@
0a865a0c5a64618fd1dcca13d05dea4cba44c832
@@ -0,0 +1,3 @@
#NOTE: This is a Maven Resolver internal implementation file, its format can be changed without prior notice.
#Tue Aug 22 13:06:51 MSK 2023
kotlin-stdlib-jdk7-1.8.20.pom>central=
@@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib-jdk7</artifactId>
<version>1.8.20</version>
<name>Kotlin Stdlib Jdk7</name>
<description>Kotlin Standard Library JDK 7 extension</description>
<url>https://kotlinlang.org/</url>
<licenses>
<license>
<name>The Apache License, Version 2.0</name>
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
</license>
</licenses>
<developers>
<developer>
<name>Kotlin Team</name>
<organization>JetBrains</organization>
<organizationUrl>https://www.jetbrains.com</organizationUrl>
</developer>
</developers>
<scm>
<connection>scm:git:https://github.com/JetBrains/kotlin.git</connection>
<developerConnection>scm:git:https://github.com/JetBrains/kotlin.git</developerConnection>
<url>https://github.com/JetBrains/kotlin</url>
</scm>
<dependencies>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib</artifactId>
<version>1.8.20</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
@@ -0,0 +1 @@
e613a7635e90125d25b100b636a85639b4487ac4
@@ -0,0 +1,4 @@
#NOTE: This is a Maven Resolver internal implementation file, its format can be changed without prior notice.
#Tue Aug 22 13:06:54 MSK 2023
kotlin-stdlib-jdk7-1.8.21.jar>central=
kotlin-stdlib-jdk7-1.8.21.pom>central=
@@ -0,0 +1 @@
7473b8cd3c0ef9932345baf569bc398e8a717046
@@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib-jdk7</artifactId>
<version>1.8.21</version>
<name>Kotlin Stdlib Jdk7</name>
<description>Kotlin Standard Library JDK 7 extension</description>
<url>https://kotlinlang.org/</url>
<licenses>
<license>
<name>The Apache License, Version 2.0</name>
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
</license>
</licenses>
<developers>
<developer>
<name>Kotlin Team</name>
<organization>JetBrains</organization>
<organizationUrl>https://www.jetbrains.com</organizationUrl>
</developer>
</developers>
<scm>
<connection>scm:git:https://github.com/JetBrains/kotlin.git</connection>
<developerConnection>scm:git:https://github.com/JetBrains/kotlin.git</developerConnection>
<url>https://github.com/JetBrains/kotlin</url>
</scm>
<dependencies>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib</artifactId>
<version>1.8.21</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
@@ -0,0 +1 @@
d23a31049e8289c21e78078e888f3968c82ad0ac
@@ -0,0 +1,4 @@
#NOTE: This is a Maven Resolver internal implementation file, its format can be changed without prior notice.
#Tue Aug 22 23:22:39 MSK 2023
kotlin-stdlib-jdk7-1.9.0.jar>central=
kotlin-stdlib-jdk7-1.9.0.pom>central=
@@ -0,0 +1 @@
f320478990d05e0cfaadd74f9619fd6027adbf37
@@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib-jdk7</artifactId>
<version>1.9.0</version>
<name>Kotlin Stdlib Jdk7</name>
<description>Kotlin Standard Library JDK 7 extension</description>
<url>https://kotlinlang.org/</url>
<licenses>
<license>
<name>The Apache License, Version 2.0</name>
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
</license>
</licenses>
<developers>
<developer>
<name>Kotlin Team</name>
<organization>JetBrains</organization>
<organizationUrl>https://www.jetbrains.com</organizationUrl>
</developer>
</developers>
<scm>
<connection>scm:git:https://github.com/JetBrains/kotlin.git</connection>
<developerConnection>scm:git:https://github.com/JetBrains/kotlin.git</developerConnection>
<url>https://github.com/JetBrains/kotlin</url>
</scm>
<dependencies>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib</artifactId>
<version>1.9.0</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
@@ -0,0 +1 @@
5ce6c5278ef6e342507a96372ee534ed0b830e54
@@ -0,0 +1,3 @@
#NOTE: This is a Maven Resolver internal implementation file, its format can be changed without prior notice.
#Tue Aug 22 13:06:51 MSK 2023
kotlin-stdlib-jdk8-1.8.20.pom>central=
@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib-jdk8</artifactId>
<version>1.8.20</version>
<name>Kotlin Stdlib Jdk8</name>
<description>Kotlin Standard Library JDK 8 extension</description>
<url>https://kotlinlang.org/</url>
<licenses>
<license>
<name>The Apache License, Version 2.0</name>
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
</license>
</licenses>
<developers>
<developer>
<name>Kotlin Team</name>
<organization>JetBrains</organization>
<organizationUrl>https://www.jetbrains.com</organizationUrl>
</developer>
</developers>
<scm>
<connection>scm:git:https://github.com/JetBrains/kotlin.git</connection>
<developerConnection>scm:git:https://github.com/JetBrains/kotlin.git</developerConnection>
<url>https://github.com/JetBrains/kotlin</url>
</scm>
<dependencies>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib</artifactId>
<version>1.8.20</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib-jdk7</artifactId>
<version>1.8.20</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
@@ -0,0 +1 @@
f9dac9f21106bd224ea78c78b56f4e401d7df56f
@@ -0,0 +1,4 @@
#NOTE: This is a Maven Resolver internal implementation file, its format can be changed without prior notice.
#Tue Aug 22 13:06:54 MSK 2023
kotlin-stdlib-jdk8-1.8.21.jar>central=
kotlin-stdlib-jdk8-1.8.21.pom>central=
@@ -0,0 +1 @@
67f57e154437cd9e6e9cf368394b95814836ff88
@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib-jdk8</artifactId>
<version>1.8.21</version>
<name>Kotlin Stdlib Jdk8</name>
<description>Kotlin Standard Library JDK 8 extension</description>
<url>https://kotlinlang.org/</url>
<licenses>
<license>
<name>The Apache License, Version 2.0</name>
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
</license>
</licenses>
<developers>
<developer>
<name>Kotlin Team</name>
<organization>JetBrains</organization>
<organizationUrl>https://www.jetbrains.com</organizationUrl>
</developer>
</developers>
<scm>
<connection>scm:git:https://github.com/JetBrains/kotlin.git</connection>
<developerConnection>scm:git:https://github.com/JetBrains/kotlin.git</developerConnection>
<url>https://github.com/JetBrains/kotlin</url>
</scm>
<dependencies>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib</artifactId>
<version>1.8.21</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib-jdk7</artifactId>
<version>1.8.21</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
@@ -0,0 +1 @@
3e5d957c0d7c874093cdf22483d4fc024476479a
@@ -0,0 +1,4 @@
#NOTE: This is a Maven Resolver internal implementation file, its format can be changed without prior notice.
#Tue Aug 22 23:22:39 MSK 2023
kotlin-stdlib-jdk8-1.9.0.jar>central=
kotlin-stdlib-jdk8-1.9.0.pom>central=
@@ -0,0 +1 @@
e000bd084353d84c9e888f6fb341dc1f5b79d948
@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib-jdk8</artifactId>
<version>1.9.0</version>
<name>Kotlin Stdlib Jdk8</name>
<description>Kotlin Standard Library JDK 8 extension</description>
<url>https://kotlinlang.org/</url>
<licenses>
<license>
<name>The Apache License, Version 2.0</name>
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
</license>
</licenses>
<developers>
<developer>
<name>Kotlin Team</name>
<organization>JetBrains</organization>
<organizationUrl>https://www.jetbrains.com</organizationUrl>
</developer>
</developers>
<scm>
<connection>scm:git:https://github.com/JetBrains/kotlin.git</connection>
<developerConnection>scm:git:https://github.com/JetBrains/kotlin.git</developerConnection>
<url>https://github.com/JetBrains/kotlin</url>
</scm>
<dependencies>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib</artifactId>
<version>1.9.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib-jdk7</artifactId>
<version>1.9.0</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
@@ -0,0 +1 @@
4f04e57e4a12d4a59f620c63520681c4ff1d03e6
@@ -0,0 +1,3 @@
#NOTE: This is a Maven Resolver internal implementation file, its format can be changed without prior notice.
#Tue Aug 22 13:06:51 MSK 2023
kotlin-stdlib-1.8.20.pom>central=
@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib</artifactId>
<version>1.8.20</version>
<name>Kotlin Stdlib</name>
<description>Kotlin Standard Library for JVM</description>
<url>https://kotlinlang.org/</url>
<licenses>
<license>
<name>The Apache License, Version 2.0</name>
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
</license>
</licenses>
<developers>
<developer>
<name>Kotlin Team</name>
<organization>JetBrains</organization>
<organizationUrl>https://www.jetbrains.com</organizationUrl>
</developer>
</developers>
<scm>
<connection>scm:git:https://github.com/JetBrains/kotlin.git</connection>
<developerConnection>scm:git:https://github.com/JetBrains/kotlin.git</developerConnection>
<url>https://github.com/JetBrains/kotlin</url>
</scm>
<dependencies>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib-common</artifactId>
<version>1.8.20</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.jetbrains</groupId>
<artifactId>annotations</artifactId>
<version>13.0</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
@@ -0,0 +1 @@
d96c138bc67fc0c278623b3350b7f926a1db9f2f
@@ -0,0 +1,4 @@
#NOTE: This is a Maven Resolver internal implementation file, its format can be changed without prior notice.
#Tue Aug 22 13:06:54 MSK 2023
kotlin-stdlib-1.8.21.jar>central=
kotlin-stdlib-1.8.21.pom>central=
@@ -0,0 +1 @@
43d50ab85bc7587adfe3dda3dbe579e5f8d51265
@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib</artifactId>
<version>1.8.21</version>
<name>Kotlin Stdlib</name>
<description>Kotlin Standard Library for JVM</description>
<url>https://kotlinlang.org/</url>
<licenses>
<license>
<name>The Apache License, Version 2.0</name>
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
</license>
</licenses>
<developers>
<developer>
<name>Kotlin Team</name>
<organization>JetBrains</organization>
<organizationUrl>https://www.jetbrains.com</organizationUrl>
</developer>
</developers>
<scm>
<connection>scm:git:https://github.com/JetBrains/kotlin.git</connection>
<developerConnection>scm:git:https://github.com/JetBrains/kotlin.git</developerConnection>
<url>https://github.com/JetBrains/kotlin</url>
</scm>
<dependencies>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib-common</artifactId>
<version>1.8.21</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.jetbrains</groupId>
<artifactId>annotations</artifactId>
<version>13.0</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
@@ -0,0 +1 @@
69d1a37560299321348842a9e921d26ff53c80d7
@@ -0,0 +1,4 @@
#NOTE: This is a Maven Resolver internal implementation file, its format can be changed without prior notice.
#Tue Aug 22 23:22:39 MSK 2023
kotlin-stdlib-1.9.0.pom>central=
kotlin-stdlib-1.9.0.jar>central=
@@ -0,0 +1 @@
8ee15ef0c67dc83d874f412d84378d7f0eb50b63
@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib</artifactId>
<version>1.9.0</version>
<name>Kotlin Stdlib</name>
<description>Kotlin Standard Library for JVM</description>
<url>https://kotlinlang.org/</url>
<licenses>
<license>
<name>The Apache License, Version 2.0</name>
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
</license>
</licenses>
<developers>
<developer>
<name>Kotlin Team</name>
<organization>JetBrains</organization>
<organizationUrl>https://www.jetbrains.com</organizationUrl>
</developer>
</developers>
<scm>
<connection>scm:git:https://github.com/JetBrains/kotlin.git</connection>
<developerConnection>scm:git:https://github.com/JetBrains/kotlin.git</developerConnection>
<url>https://github.com/JetBrains/kotlin</url>
</scm>
<dependencies>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib-common</artifactId>
<version>1.9.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.jetbrains</groupId>
<artifactId>annotations</artifactId>
<version>13.0</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
Loaded 100 of 270 files, more files were not shown because too many files have changed in this diff. Show more