Fix Kotlin and Java interop issues. (#343)

The following PR fixes interop issues between Kotlin and Java.

Currently, there is no way to go from `Command.Builder` -> `MutableCommandBuilder`, nor from `MutableCommandBuilder` -> `Command.Builder`.

This PR fixes it by introducing
- A new constructor for `MutableCommandBuilder`:
  
  ```kotlin
  public constructor(commandBuilder: Command.Builder<C>, commandManager: CommandManager<C>)
  ```
- Making the `commandBuilder` variable public
- Adding the following extensions
  
  ```kotlin
  public fun <C : Any> Command.Builder<C>.toMutable(commandManager: CommandManager<C>): MutableCommandBuilder<C>
  
  public fun <C : Any> Command.Builder<C>.mutate(commandManager: CommandManager<C>, lambda: MutableCommandBuilder<C>.() -> Unit): MutableCommandBuilder<C>
  ```
This commit is contained in:
solo 2022-05-26 05:13:54 -04:00 committed by Jason
parent fc27fa5b51
commit 7b23dd0329
2 changed files with 39 additions and 17 deletions

View file

@ -39,11 +39,22 @@ import kotlin.reflect.KClass
* A mutable [Command.Builder] wrapper, providing functions to assist in creating commands using the * A mutable [Command.Builder] wrapper, providing functions to assist in creating commands using the
* Kotlin builder DSL style * Kotlin builder DSL style
* *
* @property commandBuilder the command builder the mutate
* @property commandManager the command manager which will own this command
* @constructor Create a new [MutableCommandBuilder]
* @since 1.3.0 * @since 1.3.0
*/ */
public class MutableCommandBuilder<C : Any> { public class MutableCommandBuilder<C : Any>(
private val commandManager: CommandManager<C> commandBuilder: Command.Builder<C>,
private var commandBuilder: Command.Builder<C> private val commandManager: CommandManager<C>,
) {
/**
* The command builder that is being mutated by this [MutableCommandBuilder] instance.
*
* This is public so that this can be returned to a command builder for interop with java apis.
*/
public var commandBuilder: Command.Builder<C> = commandBuilder
private set
/** /**
* Create a new [MutableCommandBuilder] * Create a new [MutableCommandBuilder]
@ -64,10 +75,7 @@ public class MutableCommandBuilder<C : Any> {
description: Description = Description.empty(), description: Description = Description.empty(),
aliases: Array<String> = emptyArray(), aliases: Array<String> = emptyArray(),
commandManager: CommandManager<C> commandManager: CommandManager<C>
) { ) : this(commandManager.commandBuilder(name, description, *aliases), commandManager)
this.commandManager = commandManager
this.commandBuilder = commandManager.commandBuilder(name, description, *aliases)
}
/** /**
* Create a new [MutableCommandBuilder] * Create a new [MutableCommandBuilder]
@ -83,10 +91,7 @@ public class MutableCommandBuilder<C : Any> {
description: ArgumentDescription = ArgumentDescription.empty(), description: ArgumentDescription = ArgumentDescription.empty(),
aliases: Array<String> = emptyArray(), aliases: Array<String> = emptyArray(),
commandManager: CommandManager<C> commandManager: CommandManager<C>
) { ) : this(commandManager.commandBuilder(name, description, *aliases), commandManager)
this.commandManager = commandManager
this.commandBuilder = commandManager.commandBuilder(name, description, *aliases)
}
/** /**
* Create a new [MutableCommandBuilder] and invoke the provided receiver lambda on it * Create a new [MutableCommandBuilder] and invoke the provided receiver lambda on it
@ -133,11 +138,6 @@ public class MutableCommandBuilder<C : Any> {
lambda(this) lambda(this)
} }
private constructor(commandManager: CommandManager<C>, commandBuilder: Command.Builder<C>) {
this.commandManager = commandManager
this.commandBuilder = commandBuilder
}
/** /**
* Build a [Command] from the current state of this builder * Build a [Command] from the current state of this builder
* *
@ -184,7 +184,7 @@ public class MutableCommandBuilder<C : Any> {
* @since 1.3.0 * @since 1.3.0
*/ */
public fun copy(): MutableCommandBuilder<C> = public fun copy(): MutableCommandBuilder<C> =
MutableCommandBuilder(this.commandManager, this.commandBuilder) MutableCommandBuilder(this.commandBuilder, this.commandManager)
/** /**
* Make a new copy of this [MutableCommandBuilder] and invoke the provided receiver lambda on it * Make a new copy of this [MutableCommandBuilder] and invoke the provided receiver lambda on it

View file

@ -129,6 +129,28 @@ public fun <C : Any> CommandManager<C>.command(
public fun <C : Any> Command.Builder<C>.senderType(type: KClass<out C>): Command.Builder<C> = public fun <C : Any> Command.Builder<C>.senderType(type: KClass<out C>): Command.Builder<C> =
senderType(type.java) senderType(type.java)
/**
* Create a new [MutableCommandBuilder].
*
* @param commandManager the command manager, which will own this command.
* @since 1.7.0
*/
public fun <C : Any> Command.Builder<C>.toMutable(
commandManager: CommandManager<C>
): MutableCommandBuilder<C> = MutableCommandBuilder(this, commandManager)
/**
* Create a new [MutableCommandBuilder] and invoke the provided receiver lambda on it.
*
* @param commandManager the command manager, which will own this command.
* @param lambda receiver lambda, which will be invoked on the new builder.
* @since 1.7.0
*/
public fun <C : Any> Command.Builder<C>.mutate(
commandManager: CommandManager<C>,
lambda: MutableCommandBuilder<C>.() -> Unit
): MutableCommandBuilder<C> = MutableCommandBuilder(this, commandManager).also(lambda)
/** /**
* Get a [Description], defaulting to [Description.empty] * Get a [Description], defaulting to [Description.empty]
* *