.
This commit is contained in:
parent
682cff9a8b
commit
a2d1153ae8
17 changed files with 439 additions and 326 deletions
2
.idea/misc.xml
generated
2
.idea/misc.xml
generated
|
|
@ -1,5 +1,5 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project version="4">
|
<project version="4">
|
||||||
<component name="ExternalStorageConfigurationManager" enabled="true" />
|
<component name="ExternalStorageConfigurationManager" enabled="true" />
|
||||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="21" project-jdk-type="JavaSDK" />
|
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="21 (3)" project-jdk-type="JavaSDK" />
|
||||||
</project>
|
</project>
|
||||||
187
.idea/workspace.xml
generated
187
.idea/workspace.xml
generated
|
|
@ -4,29 +4,30 @@
|
||||||
<option name="autoReloadType" value="SELECTIVE" />
|
<option name="autoReloadType" value="SELECTIVE" />
|
||||||
</component>
|
</component>
|
||||||
<component name="ChangeListManager">
|
<component name="ChangeListManager">
|
||||||
<list default="true" id="6414223f-1761-4683-97f5-9dab59d6c44a" name="Changes" comment=".">
|
<list default="true" id="6414223f-1761-4683-97f5-9dab59d6c44a" name="Changes" comment="add TODO">
|
||||||
<change afterPath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/parser2/AbstractCommandParser.java" afterDir="false" />
|
<change afterPath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/parser/CommandParseHelper.java" afterDir="false" />
|
||||||
<change afterPath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/parser2/InvocationCommandParser.java" afterDir="false" />
|
<change afterPath="$PROJECT_DIR$/kencommandapi-core/src/test/java/de/kentoj/kencommandapi/api/parser/SuggestionCommandParserTest.java" afterDir="false" />
|
||||||
<change afterPath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/parser2/SuggestionCommandParser.java" afterDir="false" />
|
<change afterPath="$PROJECT_DIR$/../build-logic/convention/src/main/kotlin/scrow/RunServerConvention.kt" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/.idea/misc.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/misc.xml" afterDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/TODO" beforeDir="false" afterPath="$PROJECT_DIR$/TODO" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/TODO" beforeDir="false" afterPath="$PROJECT_DIR$/TODO" afterDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/build.gradle.kts" beforeDir="false" afterPath="$PROJECT_DIR$/build.gradle.kts" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/kencommandapi-bukkit/build.gradle.kts" beforeDir="false" afterPath="$PROJECT_DIR$/kencommandapi-bukkit/build.gradle.kts" afterDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/BukkitKenCommand.java" beforeDir="false" afterPath="$PROJECT_DIR$/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/BukkitKenCommand.java" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/CommandAPI.java" beforeDir="false" afterPath="$PROJECT_DIR$/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/CommandAPI.java" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/TabCompleteListener.java" beforeDir="false" afterPath="$PROJECT_DIR$/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/TabCompleteListener.java" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/TabCompleteListener.java" beforeDir="false" afterPath="$PROJECT_DIR$/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/TabCompleteListener.java" afterDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/CommandHandler.java" beforeDir="false" afterPath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/CommandHandler.java" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/CommandHandler.java" beforeDir="false" afterPath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/CommandHandler.java" afterDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/node/CommandNode.java" beforeDir="false" afterPath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/literal/Literal.java" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/literal/Literal.java" beforeDir="false" afterPath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/literal/Literal.java" afterDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/node/RootCommandNode.java" beforeDir="false" afterPath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/literal/RootLiteral.java" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/parser2/AbstractCommandParser.java" beforeDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/parser/CommandParser.java" beforeDir="false" />
|
<change beforePath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/parser2/InvocationCommandParser.java" beforeDir="false" afterPath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/parser/InvocationCommandParser.java" afterDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/parser/ParseResult.java" beforeDir="false" />
|
<change beforePath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/parser2/SuggestionCommandParser.java" beforeDir="false" afterPath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/parser/SuggestionCommandParser.java" afterDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/platform/HasPermissionMethod.java" beforeDir="false" afterPath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/platform/HasPermissionMethod.java" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/kencommandapi-core/src/test/java/de/kentoj/kencommandapi/api/parser/CommandHandlerTest.java" beforeDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/internal/CommandNodeImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/internal/LiteralImpl.java" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/internal/RootCommandNodeImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/internal/RootLiteralImpl.java" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/kencommandapi-core/src/test/java/de/kentoj/kencommandapi/api/parser/CommandHandlerTest.java" beforeDir="false" afterPath="$PROJECT_DIR$/kencommandapi-core/src/test/java/de/kentoj/kencommandapi/api/parser/CommandHandlerTest.java" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/kencommandapi-core/src/test/java/de/kentoj/kencommandapi/api/parser/CommandParserTest.java" beforeDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/kencommandapi-core/src/test/java/de/kentoj/kencommandapi/api/parser/ENV.java" beforeDir="false" afterPath="$PROJECT_DIR$/kencommandapi-core/src/test/java/de/kentoj/kencommandapi/api/parser/ENV.java" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/kencommandapi-velocity/src/main/java/de/kentoj/kencommandapi/CommandAPI.java" beforeDir="false" afterPath="$PROJECT_DIR$/kencommandapi-velocity/src/main/java/de/kentoj/kencommandapi/CommandAPI.java" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/kencommandapi-velocity/src/main/java/de/kentoj/kencommandapi/VelocityCommand.java" beforeDir="false" afterPath="$PROJECT_DIR$/kencommandapi-velocity/src/main/java/de/kentoj/kencommandapi/VelocityCommand.java" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/kencommandapi-velocity/src/main/java/de/kentoj/kencommandapi/VelocityCommand.java" beforeDir="false" afterPath="$PROJECT_DIR$/kencommandapi-velocity/src/main/java/de/kentoj/kencommandapi/VelocityCommand.java" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/settings.gradle.kts" beforeDir="false" afterPath="$PROJECT_DIR$/settings.gradle.kts" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/../build-logic/.idea/.gitignore" beforeDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/../build-logic/.idea/compiler.xml" beforeDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/../build-logic/.idea/gradle.xml" beforeDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/../build-logic/.idea/kotlinc.xml" beforeDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/../build-logic/.idea/misc.xml" beforeDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/../build-logic/.idea/vcs.xml" beforeDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/../build-logic/convention/src/main/kotlin/scrow/ScrowRepositoryConvention.kt" beforeDir="false" afterPath="$PROJECT_DIR$/../build-logic/convention/src/main/kotlin/scrow/ScrowRepositoryConvention.kt" afterDir="false" />
|
||||||
</list>
|
</list>
|
||||||
<option name="SHOW_DIALOG" value="false" />
|
<option name="SHOW_DIALOG" value="false" />
|
||||||
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
||||||
|
|
@ -78,6 +79,20 @@
|
||||||
<item name="Tasks" type="e4a08cd1:TasksNode" />
|
<item name="Tasks" type="e4a08cd1:TasksNode" />
|
||||||
<item name="build" type="c8890929:TasksNode$1" />
|
<item name="build" type="c8890929:TasksNode$1" />
|
||||||
</path>
|
</path>
|
||||||
|
<path>
|
||||||
|
<item name="" type="6a2764b6:ExternalProjectsStructure$RootNode" />
|
||||||
|
<item name="KenCommandAPI" type="f1a62948:ProjectNode" />
|
||||||
|
<item name="KenCommandAPI" type="2d1252cf:ModuleNode" />
|
||||||
|
<item name="Tasks" type="e4a08cd1:TasksNode" />
|
||||||
|
<item name="documentation" type="c8890929:TasksNode$1" />
|
||||||
|
</path>
|
||||||
|
<path>
|
||||||
|
<item name="" type="6a2764b6:ExternalProjectsStructure$RootNode" />
|
||||||
|
<item name="KenCommandAPI" type="f1a62948:ProjectNode" />
|
||||||
|
<item name="KenCommandAPI" type="2d1252cf:ModuleNode" />
|
||||||
|
<item name="Tasks" type="e4a08cd1:TasksNode" />
|
||||||
|
<item name="other" type="c8890929:TasksNode$1" />
|
||||||
|
</path>
|
||||||
<path>
|
<path>
|
||||||
<item name="" type="6a2764b6:ExternalProjectsStructure$RootNode" />
|
<item name="" type="6a2764b6:ExternalProjectsStructure$RootNode" />
|
||||||
<item name="KenCommandAPI" type="f1a62948:ProjectNode" />
|
<item name="KenCommandAPI" type="f1a62948:ProjectNode" />
|
||||||
|
|
@ -134,41 +149,42 @@
|
||||||
<option name="hideEmptyMiddlePackages" value="true" />
|
<option name="hideEmptyMiddlePackages" value="true" />
|
||||||
<option name="showLibraryContents" value="true" />
|
<option name="showLibraryContents" value="true" />
|
||||||
</component>
|
</component>
|
||||||
<component name="PropertiesComponent">{
|
<component name="PropertiesComponent"><![CDATA[{
|
||||||
"keyToString": {
|
"keyToString": {
|
||||||
"Gradle./home/a/src/kento2/KenCommandAPI/kencommandapi-core [:kencommandapi-core:de.kentoj.kencommandapi.Main.main()].executor": "Run",
|
"Gradle./home/a/src/kento2/KenCommandAPI/kencommandapi-core [:kencommandapi-core:de.kentoj.kencommandapi.Main.main()].executor": "Run",
|
||||||
"Gradle./home/a/src/kento2/KenCommandAPI/kencommandapi-core [build].executor": "Run",
|
"Gradle./home/a/src/kento2/KenCommandAPI/kencommandapi-core [build].executor": "Run",
|
||||||
"Gradle./home/a/src/kento2/KenCommandAPI/kencommandapi-core [publish].executor": "Run",
|
"Gradle./home/a/src/kento2/KenCommandAPI/kencommandapi-core [publish].executor": "Run",
|
||||||
"Gradle.CommandParserTest.checkArgumentExpected.executor": "Run",
|
"Gradle.CommandParserTest.checkArgumentExpected.executor": "Run",
|
||||||
"Gradle.Download Sources.executor": "Run",
|
"Gradle.Download Sources.executor": "Run",
|
||||||
"Gradle.KenCommandAPI [:de.kencommand.Main.main()].executor": "Run",
|
"Gradle.KenCommandAPI [:de.kencommand.Main.main()].executor": "Run",
|
||||||
"Gradle.KenCommandAPI [assemble].executor": "Run",
|
"Gradle.KenCommandAPI [assemble].executor": "Run",
|
||||||
"Gradle.KenCommandAPI [buildEnvironment].executor": "Run",
|
"Gradle.KenCommandAPI [buildEnvironment].executor": "Run",
|
||||||
"Gradle.KenCommandAPI [build].executor": "Run",
|
"Gradle.KenCommandAPI [build].executor": "Run",
|
||||||
"Gradle.KenCommandAPI [clean test].executor": "Run",
|
"Gradle.KenCommandAPI [clean test].executor": "Run",
|
||||||
"Gradle.KenCommandAPI [clean].executor": "Run",
|
"Gradle.KenCommandAPI [clean].executor": "Run",
|
||||||
"Gradle.KenCommandAPI [publishAllPublicationsToScrowRepository].executor": "Run",
|
"Gradle.KenCommandAPI [javadoc].executor": "Run",
|
||||||
"Gradle.KenCommandAPI [publish].executor": "Run",
|
"Gradle.KenCommandAPI [publishAllPublicationsToScrowRepository].executor": "Run",
|
||||||
"Gradle.KenCommandAPI [test].executor": "Run",
|
"Gradle.KenCommandAPI [publish].executor": "Run",
|
||||||
"Gradle.KenCommandAPI:kencommandapi-bukkit [build].executor": "Run",
|
"Gradle.KenCommandAPI [test].executor": "Run",
|
||||||
"Gradle.KenCommandAPI:kencommandapi-bukkit [generatePomFileForKenCommandAPIBukkitPublication].executor": "Run",
|
"Gradle.KenCommandAPI:kencommandapi-bukkit [build].executor": "Run",
|
||||||
"Gradle.KenCommandAPI:kencommandapi-bukkit [publishAllPublicationsToScrowRepository].executor": "Run",
|
"Gradle.KenCommandAPI:kencommandapi-bukkit [generatePomFileForKenCommandAPIBukkitPublication].executor": "Run",
|
||||||
"Gradle.KenCommandAPI:kencommandapi-bukkit [publish].executor": "Run",
|
"Gradle.KenCommandAPI:kencommandapi-bukkit [publishAllPublicationsToScrowRepository].executor": "Run",
|
||||||
"Gradle.KenCommandAPI:kencommandapi-velocity [publish].executor": "Run",
|
"Gradle.KenCommandAPI:kencommandapi-bukkit [publish].executor": "Run",
|
||||||
"Gradle.kencommandapi-core [build].executor": "Run",
|
"Gradle.KenCommandAPI:kencommandapi-velocity [publish].executor": "Run",
|
||||||
"ModuleVcsDetector.initialDetectionPerformed": "true",
|
"Gradle.kencommandapi-core [build].executor": "Run",
|
||||||
"RunOnceActivity.ShowReadmeOnStart": "true",
|
"ModuleVcsDetector.initialDetectionPerformed": "true",
|
||||||
"RunOnceActivity.TerminalTabsStorage.copyFrom.TerminalArrangementManager.252": "true",
|
"RunOnceActivity.ShowReadmeOnStart": "true",
|
||||||
"RunOnceActivity.git.unshallow": "true",
|
"RunOnceActivity.TerminalTabsStorage.copyFrom.TerminalArrangementManager.252": "true",
|
||||||
"git-widget-placeholder": "master",
|
"RunOnceActivity.git.unshallow": "true",
|
||||||
"kotlin-language-version-configured": "true",
|
"git-widget-placeholder": "master",
|
||||||
"last_opened_file_path": "/home/a/src/scrow/core",
|
"kotlin-language-version-configured": "true",
|
||||||
"project.structure.last.edited": "Modules",
|
"last_opened_file_path": "/home/a/src/scrow/KenCommandAPI/kencommandapi-core/src/test/java/a",
|
||||||
"project.structure.proportion": "0.15",
|
"project.structure.last.edited": "Modules",
|
||||||
"project.structure.side.proportion": "0.6268199",
|
"project.structure.proportion": "0.15",
|
||||||
"settings.editor.selected.configurable": "preferences.pluginManager"
|
"project.structure.side.proportion": "0.6268199",
|
||||||
|
"settings.editor.selected.configurable": "preferences.pluginManager"
|
||||||
}
|
}
|
||||||
}</component>
|
}]]></component>
|
||||||
<component name="RecentsManager">
|
<component name="RecentsManager">
|
||||||
<key name="CreateClassDialog.RecentsKey">
|
<key name="CreateClassDialog.RecentsKey">
|
||||||
<recent name="de.kentoj.kencommandapi.api" />
|
<recent name="de.kentoj.kencommandapi.api" />
|
||||||
|
|
@ -178,6 +194,7 @@
|
||||||
<recent name="de.kencommand.api" />
|
<recent name="de.kencommand.api" />
|
||||||
</key>
|
</key>
|
||||||
<key name="CopyFile.RECENT_KEYS">
|
<key name="CopyFile.RECENT_KEYS">
|
||||||
|
<recent name="$PROJECT_DIR$/kencommandapi-core/src/test/java/a" />
|
||||||
<recent name="$PROJECT_DIR$/kencommandapi-core" />
|
<recent name="$PROJECT_DIR$/kencommandapi-core" />
|
||||||
<recent name="$PROJECT_DIR$/kencommandapi-velocity/src/main/java/de/kentoj/kencommandapi" />
|
<recent name="$PROJECT_DIR$/kencommandapi-velocity/src/main/java/de/kentoj/kencommandapi" />
|
||||||
<recent name="$PROJECT_DIR$/src/main/java/de/kencommand/api" />
|
<recent name="$PROJECT_DIR$/src/main/java/de/kencommand/api" />
|
||||||
|
|
@ -202,31 +219,7 @@
|
||||||
<command value="gradlew test" />
|
<command value="gradlew test" />
|
||||||
</option>
|
</option>
|
||||||
</component>
|
</component>
|
||||||
<component name="RunManager" selected="Gradle.KenCommandAPI [publish]">
|
<component name="RunManager" selected="Gradle.KenCommandAPI [publishAllPublicationsToScrowRepository]">
|
||||||
<configuration name="CommandParserTest.checkArgumentExpected" type="GradleRunConfiguration" factoryName="Gradle" temporary="true">
|
|
||||||
<ExternalSystemSettings>
|
|
||||||
<option name="executionName" />
|
|
||||||
<option name="externalProjectPath" value="$PROJECT_DIR$" />
|
|
||||||
<option name="externalSystemIdString" value="GRADLE" />
|
|
||||||
<option name="scriptParameters" value="" />
|
|
||||||
<option name="taskDescriptions">
|
|
||||||
<list />
|
|
||||||
</option>
|
|
||||||
<option name="taskNames">
|
|
||||||
<list>
|
|
||||||
<option value=":kencommandapi-core:test" />
|
|
||||||
<option value="--tests" />
|
|
||||||
<option value=""de.kentoj.kencommandapi.api.parser.CommandParserTest.checkArgumentExpected"" />
|
|
||||||
</list>
|
|
||||||
</option>
|
|
||||||
<option name="vmOptions" />
|
|
||||||
</ExternalSystemSettings>
|
|
||||||
<ExternalSystemDebugServerProcess>false</ExternalSystemDebugServerProcess>
|
|
||||||
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
|
|
||||||
<DebugAllEnabled>false</DebugAllEnabled>
|
|
||||||
<RunAsTest>true</RunAsTest>
|
|
||||||
<method v="2" />
|
|
||||||
</configuration>
|
|
||||||
<configuration name="KenCommandAPI [build]" type="GradleRunConfiguration" factoryName="Gradle" temporary="true">
|
<configuration name="KenCommandAPI [build]" type="GradleRunConfiguration" factoryName="Gradle" temporary="true">
|
||||||
<ExternalSystemSettings>
|
<ExternalSystemSettings>
|
||||||
<option name="executionName" />
|
<option name="executionName" />
|
||||||
|
|
@ -249,19 +242,40 @@
|
||||||
<RunAsTest>false</RunAsTest>
|
<RunAsTest>false</RunAsTest>
|
||||||
<method v="2" />
|
<method v="2" />
|
||||||
</configuration>
|
</configuration>
|
||||||
<configuration name="KenCommandAPI [clean test]" type="GradleRunConfiguration" factoryName="Gradle" temporary="true">
|
<configuration name="KenCommandAPI [javadoc]" type="GradleRunConfiguration" factoryName="Gradle" temporary="true">
|
||||||
<ExternalSystemSettings>
|
<ExternalSystemSettings>
|
||||||
<option name="executionName" />
|
<option name="executionName" />
|
||||||
<option name="externalProjectPath" value="$PROJECT_DIR$" />
|
<option name="externalProjectPath" value="$PROJECT_DIR$" />
|
||||||
<option name="externalSystemIdString" value="GRADLE" />
|
<option name="externalSystemIdString" value="GRADLE" />
|
||||||
<option name="scriptParameters" value="" />
|
<option name="scriptParameters" />
|
||||||
<option name="taskDescriptions">
|
<option name="taskDescriptions">
|
||||||
<list />
|
<list />
|
||||||
</option>
|
</option>
|
||||||
<option name="taskNames">
|
<option name="taskNames">
|
||||||
<list>
|
<list>
|
||||||
<option value="clean" />
|
<option value="javadoc" />
|
||||||
<option value="test" />
|
</list>
|
||||||
|
</option>
|
||||||
|
<option name="vmOptions" />
|
||||||
|
</ExternalSystemSettings>
|
||||||
|
<ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>
|
||||||
|
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
|
||||||
|
<DebugAllEnabled>false</DebugAllEnabled>
|
||||||
|
<RunAsTest>false</RunAsTest>
|
||||||
|
<method v="2" />
|
||||||
|
</configuration>
|
||||||
|
<configuration name="KenCommandAPI [publishAllPublicationsToScrowRepository]" type="GradleRunConfiguration" factoryName="Gradle" temporary="true">
|
||||||
|
<ExternalSystemSettings>
|
||||||
|
<option name="executionName" />
|
||||||
|
<option name="externalProjectPath" value="$PROJECT_DIR$" />
|
||||||
|
<option name="externalSystemIdString" value="GRADLE" />
|
||||||
|
<option name="scriptParameters" />
|
||||||
|
<option name="taskDescriptions">
|
||||||
|
<list />
|
||||||
|
</option>
|
||||||
|
<option name="taskNames">
|
||||||
|
<list>
|
||||||
|
<option value="publishAllPublicationsToScrowRepository" />
|
||||||
</list>
|
</list>
|
||||||
</option>
|
</option>
|
||||||
<option name="vmOptions" />
|
<option name="vmOptions" />
|
||||||
|
|
@ -318,11 +332,11 @@
|
||||||
</configuration>
|
</configuration>
|
||||||
<recent_temporary>
|
<recent_temporary>
|
||||||
<list>
|
<list>
|
||||||
<item itemvalue="Gradle.KenCommandAPI [publish]" />
|
<item itemvalue="Gradle.KenCommandAPI [publishAllPublicationsToScrowRepository]" />
|
||||||
<item itemvalue="Gradle.KenCommandAPI [build]" />
|
<item itemvalue="Gradle.KenCommandAPI [build]" />
|
||||||
<item itemvalue="Gradle.KenCommandAPI [test]" />
|
<item itemvalue="Gradle.KenCommandAPI [test]" />
|
||||||
<item itemvalue="Gradle.KenCommandAPI [clean test]" />
|
<item itemvalue="Gradle.KenCommandAPI [javadoc]" />
|
||||||
<item itemvalue="Gradle.CommandParserTest.checkArgumentExpected" />
|
<item itemvalue="Gradle.KenCommandAPI [publish]" />
|
||||||
</list>
|
</list>
|
||||||
</recent_temporary>
|
</recent_temporary>
|
||||||
</component>
|
</component>
|
||||||
|
|
@ -579,10 +593,11 @@
|
||||||
<MESSAGE value="need to implement some argument types" />
|
<MESSAGE value="need to implement some argument types" />
|
||||||
<MESSAGE value="implement PlayerArgumentType implement OfflinePlayerArgumentType" />
|
<MESSAGE value="implement PlayerArgumentType implement OfflinePlayerArgumentType" />
|
||||||
<MESSAGE value="fix aliases not being registered" />
|
<MESSAGE value="fix aliases not being registered" />
|
||||||
<MESSAGE value="add TODO" />
|
|
||||||
<MESSAGE value="make SuggestionProvider use CompletableFuture" />
|
<MESSAGE value="make SuggestionProvider use CompletableFuture" />
|
||||||
<MESSAGE value="currently refactoring a lot." />
|
<MESSAGE value="currently refactoring a lot." />
|
||||||
<MESSAGE value="." />
|
<MESSAGE value="." />
|
||||||
<option name="LAST_COMMIT_MESSAGE" value="." />
|
<MESSAGE value="reworked parsing" />
|
||||||
|
<MESSAGE value="add TODO" />
|
||||||
|
<option name="LAST_COMMIT_MESSAGE" value="add TODO" />
|
||||||
</component>
|
</component>
|
||||||
</project>
|
</project>
|
||||||
3
TODO
3
TODO
|
|
@ -1,9 +1,10 @@
|
||||||
|
- version catalog
|
||||||
- suggest next literal/argument
|
- suggest next literal/argument
|
||||||
- fix:
|
- fix:
|
||||||
```
|
```
|
||||||
[22:05:39 ERROR]: Could not pass event AsyncTabCompleteEvent to CoreBukkit v1.0.0-SNAPSHOT
|
[22:05:39 ERROR]: Could not pass event AsyncTabCompleteEvent to CoreBukkit v1.0.0-SNAPSHOT
|
||||||
java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0
|
java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0
|
||||||
at core-bukkit-impl-all-1783368113525.jar//de.kentoj.kencommandapi.api.parser2.SuggestionCommandParser.getSuggestions(SuggestionCommandParser.java:39) ~[?:?]
|
at core-bukkit-impl-all-1783368113525.jar//de.kentoj.kencommandapi.api.parser.SuggestionCommandParser.getSuggestions(SuggestionCommandParser.java:39) ~[?:?]
|
||||||
at core-bukkit-impl-all-1783368113525.jar//de.kentoj.kencommandapi.api.CommandHandler.getSuggestions(CommandHandler.java:44) ~[?:?]
|
at core-bukkit-impl-all-1783368113525.jar//de.kentoj.kencommandapi.api.CommandHandler.getSuggestions(CommandHandler.java:44) ~[?:?]
|
||||||
at core-bukkit-impl-all-1783368113525.jar//de.kentoj.kencommandapi.TabCompleteListener.onAsyncTabComplete(TabCompleteListener.java:27) ~[?:?]
|
at core-bukkit-impl-all-1783368113525.jar//de.kentoj.kencommandapi.TabCompleteListener.onAsyncTabComplete(TabCompleteListener.java:27) ~[?:?]
|
||||||
at co.aikar.timings.TimedEventExecutor.execute(TimedEventExecutor.java:80) ~[paper-api-1.21.11-R0.1-SNAPSHOT.jar:?]
|
at co.aikar.timings.TimedEventExecutor.execute(TimedEventExecutor.java:80) ~[paper-api-1.21.11-R0.1-SNAPSHOT.jar:?]
|
||||||
|
|
|
||||||
|
|
@ -5,14 +5,8 @@ plugins {
|
||||||
id("scrow.java-library")
|
id("scrow.java-library")
|
||||||
}
|
}
|
||||||
|
|
||||||
repositories {
|
|
||||||
maven("https://repo.papermc.io/repository/maven-public/") {
|
|
||||||
name = "papermc"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
compileOnly(project(":kencommandapi-core"))
|
api(project(":kencommandapi-core"))
|
||||||
compileOnly("io.papermc.paper:paper-api:1.21.11-rc3-R0.1-SNAPSHOT")
|
compileOnly("io.papermc.paper:paper-api:1.21.11-rc3-R0.1-SNAPSHOT")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -18,12 +18,19 @@ public class TabCompleteListener implements Listener {
|
||||||
@EventHandler(ignoreCancelled = true)
|
@EventHandler(ignoreCancelled = true)
|
||||||
public void onAsyncTabComplete(AsyncTabCompleteEvent ev) {
|
public void onAsyncTabComplete(AsyncTabCompleteEvent ev) {
|
||||||
if (!ev.isCommand()) return;
|
if (!ev.isCommand()) return;
|
||||||
|
|
||||||
var args = ev.getBuffer().substring(1).split(" ");
|
var args = ev.getBuffer().substring(1).split(" ");
|
||||||
|
if (args.length == 0) return;
|
||||||
|
|
||||||
var label = args[0];
|
var label = args[0];
|
||||||
|
{
|
||||||
|
// commands can be called with a '<plugin name>:' prefix. strip it.
|
||||||
|
int l = label.indexOf(':');
|
||||||
|
if (l >= 0)
|
||||||
|
label = label.substring(l+1);
|
||||||
|
}
|
||||||
var rootNode = commandAPI.getRegistered(label);
|
var rootNode = commandAPI.getRegistered(label);
|
||||||
if (rootNode == null) return;
|
if (rootNode == null) return;
|
||||||
ev.setHandled(true);
|
ev.setHandled(true);
|
||||||
ev.setCompletions(commandHandler.getSuggestions(rootNode, ev.getSender(), Arrays.copyOfRange(args, 1, args.length)));
|
ev.setCompletions(commandHandler.getSuggestions(rootNode, ev.getSender(), Arrays.copyOfRange(args, 1, args.length), ev.getBuffer().endsWith(" ")));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,12 +2,14 @@ package de.kentoj.kencommandapi.api;
|
||||||
|
|
||||||
import de.kentoj.kencommandapi.api.invocation.CommandContext;
|
import de.kentoj.kencommandapi.api.invocation.CommandContext;
|
||||||
import de.kentoj.kencommandapi.api.literal.RootLiteral;
|
import de.kentoj.kencommandapi.api.literal.RootLiteral;
|
||||||
import de.kentoj.kencommandapi.api.parser2.InvocationCommandParser;
|
import de.kentoj.kencommandapi.api.parser.CommandParseHelper;
|
||||||
import de.kentoj.kencommandapi.api.parser2.SuggestionCommandParser;
|
import de.kentoj.kencommandapi.api.parser.InvocationCommandParser;
|
||||||
|
import de.kentoj.kencommandapi.api.parser.SuggestionCommandParser;
|
||||||
import de.kentoj.kencommandapi.api.platform.HasPermissionMethod;
|
import de.kentoj.kencommandapi.api.platform.HasPermissionMethod;
|
||||||
import de.kentoj.kencommandapi.api.platform.SendMessageMethod;
|
import de.kentoj.kencommandapi.api.platform.SendMessageMethod;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
|
|
@ -20,13 +22,14 @@ public class CommandHandler<T> {
|
||||||
|
|
||||||
public CommandHandler(SendMessageMethod<T> sendMessageMethod, HasPermissionMethod<T> hasPermissionMethod) {
|
public CommandHandler(SendMessageMethod<T> sendMessageMethod, HasPermissionMethod<T> hasPermissionMethod) {
|
||||||
this.sendMessageMethod = sendMessageMethod;
|
this.sendMessageMethod = sendMessageMethod;
|
||||||
invocationParser = new InvocationCommandParser<>(hasPermissionMethod);
|
var parseHelper = new CommandParseHelper<>(hasPermissionMethod);
|
||||||
suggestionParser = new SuggestionCommandParser<>(hasPermissionMethod);
|
invocationParser = new InvocationCommandParser<>(parseHelper);
|
||||||
|
suggestionParser = new SuggestionCommandParser<>(parseHelper);
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("CodeBlock2Expr")
|
@SuppressWarnings("CodeBlock2Expr")
|
||||||
public void invoke(RootLiteral<T> rootLiteral, T sender, String[] args) {
|
public void invoke(RootLiteral<T> rootLiteral, T sender, String[] args) {
|
||||||
invocationParser.invoke(rootLiteral, sender, args)
|
invocationParser.parse(rootLiteral, sender, Arrays.stream(args).iterator())
|
||||||
.ifSuccessOrElse(data -> {
|
.ifSuccessOrElse(data -> {
|
||||||
var ctx = new CommandContext<>(sender, data.getArguments());
|
var ctx = new CommandContext<>(sender, data.getArguments());
|
||||||
data.getExecutor().execute(ctx).whenComplete((result, ex) -> {
|
data.getExecutor().execute(ctx).whenComplete((result, ex) -> {
|
||||||
|
|
@ -40,7 +43,8 @@ public class CommandHandler<T> {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<String> getSuggestions(RootLiteral<T> rootNode, T sender, String[] args) {
|
public List<String> getSuggestions(RootLiteral<T> rootNode, T sender, String[] args, boolean trailingSpace) {
|
||||||
return suggestionParser.getSuggestions(rootNode, sender, args);
|
System.out.println("youre using the latest n greatest command parsing 3");
|
||||||
|
return suggestionParser.suggest(rootNode, sender, Arrays.stream(args).iterator(), trailingSpace);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -33,7 +33,6 @@ public interface Literal<T> {
|
||||||
/**
|
/**
|
||||||
* @throws IllegalArgumentException if there is already an argument with the same id
|
* @throws IllegalArgumentException if there is already an argument with the same id
|
||||||
* @throws IllegalStateException if a greedy argument was added to the literal previously
|
* @throws IllegalStateException if a greedy argument was added to the literal previously
|
||||||
* @throws IllegalStateException if the literal already has a child literal assigned to it
|
|
||||||
*/
|
*/
|
||||||
<V> void addArgument(CommandArgument<T, V> argument);
|
<V> void addArgument(CommandArgument<T, V> argument);
|
||||||
|
|
||||||
|
|
@ -50,7 +49,6 @@ public interface Literal<T> {
|
||||||
/**
|
/**
|
||||||
* @throws IllegalArgumentException if there is already a literal with the same name
|
* @throws IllegalArgumentException if there is already a literal with the same name
|
||||||
* @throws IllegalStateException if a greedy argument was added to the literal previously
|
* @throws IllegalStateException if a greedy argument was added to the literal previously
|
||||||
* @throws IllegalStateException if the literal already has an argument assigned to it
|
|
||||||
*/
|
*/
|
||||||
void addLiteral(@NotNull Literal<T> literal);
|
void addLiteral(@NotNull Literal<T> literal);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,26 @@
|
||||||
|
package de.kentoj.kencommandapi.api.parser;
|
||||||
|
|
||||||
|
import de.kentoj.kencommandapi.api.literal.Literal;
|
||||||
|
import de.kentoj.kencommandapi.api.platform.HasPermissionMethod;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public final class CommandParseHelper<T> {
|
||||||
|
private final HasPermissionMethod<T> hasPermission;
|
||||||
|
|
||||||
|
public boolean hasPermission(T sender, Literal<T> literal) {
|
||||||
|
if (literal.getPermission() == null) return true;
|
||||||
|
return hasPermission.test(sender, literal.getPermission());
|
||||||
|
}
|
||||||
|
|
||||||
|
public String parseInput(Iterator<String> tokenIter, boolean isGreedy) {
|
||||||
|
if (!isGreedy)
|
||||||
|
return tokenIter.next();
|
||||||
|
var builder = new StringBuilder();
|
||||||
|
tokenIter.forEachRemaining(tok -> builder.append(" ").append(tok));
|
||||||
|
builder.deleteCharAt(0);
|
||||||
|
return builder.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,91 @@
|
||||||
|
package de.kentoj.kencommandapi.api.parser;
|
||||||
|
|
||||||
|
import com.leakyabstractions.result.api.Result;
|
||||||
|
import com.leakyabstractions.result.core.Results;
|
||||||
|
import de.kentoj.kencommandapi.api.argument.CommandArgument;
|
||||||
|
import de.kentoj.kencommandapi.api.invocation.CommandExecutor;
|
||||||
|
import de.kentoj.kencommandapi.api.invocation.ParsedArgument;
|
||||||
|
import de.kentoj.kencommandapi.api.literal.Literal;
|
||||||
|
import de.kentoj.kencommandapi.api.literal.RootLiteral;
|
||||||
|
import de.kentoj.kencommandapi.internal.ParsedArgumentImpl;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import lombok.Value;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class InvocationCommandParser<T> {
|
||||||
|
private final CommandParseHelper<T> helper;
|
||||||
|
|
||||||
|
public Result<ExecutionData, String> parse(
|
||||||
|
RootLiteral<T> rootLiteral,
|
||||||
|
T sender,
|
||||||
|
Iterator<String> tokenIter
|
||||||
|
) {
|
||||||
|
Literal<T> currentLiteral = rootLiteral;
|
||||||
|
Map<String, ParsedArgument<T, ?>> parsedArguments = new HashMap<>();
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
{
|
||||||
|
var result = processArguments(currentLiteral, sender, tokenIter)
|
||||||
|
.ifSuccess(parsedArguments::putAll);
|
||||||
|
if (result.hasFailure())
|
||||||
|
return result.mapSuccess(__ -> null);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!tokenIter.hasNext()) {
|
||||||
|
if (currentLiteral.getExecutor() == null)
|
||||||
|
return Results.failure("Literal expected");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
var literalName = tokenIter.next();
|
||||||
|
var nextLiteral = currentLiteral.getLiteral(literalName);
|
||||||
|
var isIncompleteOrUnknown = nextLiteral == null || !helper.hasPermission(sender, nextLiteral);
|
||||||
|
if (isIncompleteOrUnknown)
|
||||||
|
return Results.failure("Unknown literal: " + literalName);
|
||||||
|
currentLiteral = nextLiteral;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Results.success(new ExecutionData(currentLiteral.getExecutor(), parsedArguments));
|
||||||
|
}
|
||||||
|
|
||||||
|
private Result<Map<String, ParsedArgument<T, ?>>, String> processArguments(
|
||||||
|
Literal<T> literal,
|
||||||
|
T sender,
|
||||||
|
Iterator<String> tokenIter
|
||||||
|
) {
|
||||||
|
Map<String, ParsedArgument<T, ?>> parsedArguments = new HashMap<>();
|
||||||
|
|
||||||
|
for (var _argument : literal.getArguments()) {
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
var argument = ((CommandArgument<T, Object>) _argument);
|
||||||
|
|
||||||
|
Object value;
|
||||||
|
if (!tokenIter.hasNext()) {
|
||||||
|
if (argument.getDefaultValueProvider() == null)
|
||||||
|
return Results.failure("Argument expected: " + argument.getId());
|
||||||
|
value = argument.getDefaultValueProvider().apply(sender);
|
||||||
|
} else {
|
||||||
|
var input = helper.parseInput(tokenIter, argument.getType().isGreedy());
|
||||||
|
try {
|
||||||
|
value = argument.getType().parseInput(input);
|
||||||
|
} catch (IllegalArgumentException ex) {
|
||||||
|
return Results.failure("Illegal argument '" + input + "' for " + argument.getId() + ": " + ex.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
parsedArguments.put(argument.getId(), new ParsedArgumentImpl<>(value, argument));
|
||||||
|
}
|
||||||
|
|
||||||
|
return Results.success(parsedArguments);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Value
|
||||||
|
public class ExecutionData {
|
||||||
|
CommandExecutor<T> executor;
|
||||||
|
Map<String, ParsedArgument<T, ?>> arguments;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,98 @@
|
||||||
|
package de.kentoj.kencommandapi.api.parser;
|
||||||
|
|
||||||
|
import de.kentoj.kencommandapi.api.literal.Literal;
|
||||||
|
import de.kentoj.kencommandapi.api.literal.RootLiteral;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class SuggestionCommandParser<T> {
|
||||||
|
|
||||||
|
private final CommandParseHelper<T> helper;
|
||||||
|
|
||||||
|
public List<String> suggest(
|
||||||
|
RootLiteral<T> rootLiteral,
|
||||||
|
T sender,
|
||||||
|
Iterator<String> tokenIter,
|
||||||
|
boolean suggestNext
|
||||||
|
) {
|
||||||
|
Literal<T> currentLiteral = rootLiteral;
|
||||||
|
Literal<T> previousLiteral = null;
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
var argumentSuggestions = processArguments(currentLiteral, tokenIter, sender, suggestNext);
|
||||||
|
if (argumentSuggestions != null)
|
||||||
|
return argumentSuggestions;
|
||||||
|
|
||||||
|
if (!tokenIter.hasNext()) {
|
||||||
|
if (suggestNext || previousLiteral == null)
|
||||||
|
return suggestions(currentLiteral, sender).toList();
|
||||||
|
return suggestions(previousLiteral, sender).toList();
|
||||||
|
}
|
||||||
|
|
||||||
|
var input = tokenIter.next();
|
||||||
|
var nextLiteral = currentLiteral.getLiteral(input);
|
||||||
|
var isIncompleteOrUnknown = nextLiteral == null || !helper.hasPermission(sender, nextLiteral);
|
||||||
|
if (isIncompleteOrUnknown) {
|
||||||
|
var finalInput = input.toLowerCase();
|
||||||
|
return suggestions(currentLiteral, sender)
|
||||||
|
.filter(name -> name.toLowerCase().startsWith(finalInput))
|
||||||
|
.toList();
|
||||||
|
}
|
||||||
|
|
||||||
|
previousLiteral = currentLiteral;
|
||||||
|
currentLiteral = nextLiteral;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private @Nullable List<String> processArguments(
|
||||||
|
Literal<T> literal,
|
||||||
|
Iterator<String> tokenIter,
|
||||||
|
T sender,
|
||||||
|
boolean suggestNext
|
||||||
|
) {
|
||||||
|
var argsIter = literal.getArguments().iterator();
|
||||||
|
|
||||||
|
/*
|
||||||
|
for each argument:
|
||||||
|
if no next token: suggest current
|
||||||
|
parse token
|
||||||
|
if not last token: skip
|
||||||
|
if nextToken:
|
||||||
|
if has next argument: suggest next argument
|
||||||
|
else: return null
|
||||||
|
return current argument's suggestions filtered
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
while (argsIter.hasNext()) {
|
||||||
|
var argument = argsIter.next();
|
||||||
|
if (!tokenIter.hasNext())
|
||||||
|
return argument.getSuggestionProvider().suggest(sender);
|
||||||
|
var input = helper.parseInput(tokenIter, argument.getType().isGreedy()).toLowerCase();
|
||||||
|
if (tokenIter.hasNext())
|
||||||
|
continue;
|
||||||
|
if (suggestNext) {
|
||||||
|
if (argsIter.hasNext())
|
||||||
|
return argsIter.next().getSuggestionProvider().suggest(sender);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return argument.getSuggestionProvider().suggest(sender).stream()
|
||||||
|
.filter(suggestion -> suggestion.toLowerCase().startsWith(input))
|
||||||
|
.toList();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Stream<String> suggestions(Literal<T> literal, T sender) {
|
||||||
|
return literal.getLiterals().stream()
|
||||||
|
.filter(lit -> helper.hasPermission(sender, lit))
|
||||||
|
.map(Literal::getNames)
|
||||||
|
.flatMap(Arrays::stream);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,39 +0,0 @@
|
||||||
package de.kentoj.kencommandapi.api.parser2;
|
|
||||||
|
|
||||||
import com.leakyabstractions.result.api.Result;
|
|
||||||
import com.leakyabstractions.result.core.Results;
|
|
||||||
import de.kentoj.kencommandapi.api.argument.CommandArgument;
|
|
||||||
import de.kentoj.kencommandapi.api.literal.Literal;
|
|
||||||
import de.kentoj.kencommandapi.api.platform.HasPermissionMethod;
|
|
||||||
import lombok.RequiredArgsConstructor;
|
|
||||||
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
|
||||||
|
|
||||||
@RequiredArgsConstructor
|
|
||||||
public abstract class AbstractCommandParser<T> {
|
|
||||||
|
|
||||||
private final HasPermissionMethod<T> hasPermission;
|
|
||||||
|
|
||||||
protected boolean hasPermission(T sender, Literal<T> literal) {
|
|
||||||
if (literal.getPermission() == null) return true;
|
|
||||||
return hasPermission.test(sender, literal.getPermission());
|
|
||||||
}
|
|
||||||
|
|
||||||
protected String parseInput(String[] args, AtomicInteger index, boolean isGreedy) {
|
|
||||||
if (!isGreedy)
|
|
||||||
return args[index.getAndIncrement()];
|
|
||||||
|
|
||||||
var ret = String.join(" ", Arrays.copyOfRange(args, index.get(), args.length));
|
|
||||||
index.set(args.length);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected Result<Object, String> parseArgument(CommandArgument<T, Object> argument, String input) {
|
|
||||||
try {
|
|
||||||
return Results.success(argument.getType().parseInput(input));
|
|
||||||
} catch (IllegalArgumentException ex) {
|
|
||||||
return Results.failure("Illegal argument '" + input + "' for " + argument.getId() + ": " + ex.getMessage());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,74 +0,0 @@
|
||||||
package de.kentoj.kencommandapi.api.parser2;
|
|
||||||
|
|
||||||
import com.leakyabstractions.result.api.Result;
|
|
||||||
import com.leakyabstractions.result.core.Results;
|
|
||||||
import de.kentoj.kencommandapi.api.argument.CommandArgument;
|
|
||||||
import de.kentoj.kencommandapi.api.invocation.CommandExecutor;
|
|
||||||
import de.kentoj.kencommandapi.api.invocation.ParsedArgument;
|
|
||||||
import de.kentoj.kencommandapi.api.literal.Literal;
|
|
||||||
import de.kentoj.kencommandapi.api.literal.RootLiteral;
|
|
||||||
import de.kentoj.kencommandapi.api.platform.HasPermissionMethod;
|
|
||||||
import de.kentoj.kencommandapi.internal.ParsedArgumentImpl;
|
|
||||||
import lombok.Value;
|
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
|
||||||
|
|
||||||
public class InvocationCommandParser<T> extends AbstractCommandParser<T> {
|
|
||||||
|
|
||||||
public InvocationCommandParser(HasPermissionMethod<T> hasPermission) {
|
|
||||||
super(hasPermission);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Result<ExecutionData, String> invoke(
|
|
||||||
RootLiteral<T> rootLiteral,
|
|
||||||
T sender,
|
|
||||||
String[] args
|
|
||||||
) {
|
|
||||||
Map<String, ParsedArgument<T, ?>> parsedArguments = new HashMap<>();
|
|
||||||
Literal<T> currentLiteral = rootLiteral;
|
|
||||||
AtomicInteger index = new AtomicInteger(0);
|
|
||||||
|
|
||||||
while (true) {
|
|
||||||
for (var _argument : currentLiteral.getArguments()) {
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
var argument = ((CommandArgument<T, Object>) _argument);
|
|
||||||
|
|
||||||
Object value;
|
|
||||||
if (index.get() >= args.length) {
|
|
||||||
if (argument.getDefaultValueProvider() == null)
|
|
||||||
return Results.failure("Argument expected: " + argument.getId());
|
|
||||||
value = argument.getDefaultValueProvider().apply(sender);
|
|
||||||
} else {
|
|
||||||
var input = parseInput(args, index, argument.getType().isGreedy());
|
|
||||||
var parseResult = parseArgument(argument, input);
|
|
||||||
if (parseResult.hasFailure()) return parseResult.mapSuccess(__ -> null);
|
|
||||||
value = parseResult.getSuccess().orElseThrow();
|
|
||||||
}
|
|
||||||
|
|
||||||
parsedArguments.put(argument.getId(), new ParsedArgumentImpl<>(value, argument));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (index.get() >= args.length) {
|
|
||||||
if (currentLiteral.getExecutor() == null)
|
|
||||||
return Results.failure("Literal expected");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
var literalName = args[index.getAndIncrement()];
|
|
||||||
var nextLiteral = currentLiteral.getLiteral(literalName);
|
|
||||||
if (nextLiteral == null || !hasPermission(sender, nextLiteral))
|
|
||||||
return Results.failure("Unknown literal: " + literalName);
|
|
||||||
currentLiteral = nextLiteral;
|
|
||||||
}
|
|
||||||
|
|
||||||
return Results.success(new ExecutionData(currentLiteral.getExecutor(), parsedArguments));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Value
|
|
||||||
public class ExecutionData {
|
|
||||||
CommandExecutor<T> executor;
|
|
||||||
Map<String, ParsedArgument<T, ?>> arguments;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,60 +0,0 @@
|
||||||
package de.kentoj.kencommandapi.api.parser2;
|
|
||||||
|
|
||||||
import de.kentoj.kencommandapi.api.literal.Literal;
|
|
||||||
import de.kentoj.kencommandapi.api.literal.RootLiteral;
|
|
||||||
import de.kentoj.kencommandapi.api.platform.HasPermissionMethod;
|
|
||||||
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
|
||||||
import java.util.stream.Stream;
|
|
||||||
|
|
||||||
public class SuggestionCommandParser<T> extends AbstractCommandParser<T> {
|
|
||||||
|
|
||||||
public SuggestionCommandParser(HasPermissionMethod<T> hasPermission) {
|
|
||||||
super(hasPermission);
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<String> getSuggestions(
|
|
||||||
RootLiteral<T> rootNode,
|
|
||||||
T sender,
|
|
||||||
String[] args
|
|
||||||
) {
|
|
||||||
Literal<T> currentLiteral = rootNode;
|
|
||||||
AtomicInteger index = new AtomicInteger(0);
|
|
||||||
|
|
||||||
while (true) {
|
|
||||||
for (var argument : currentLiteral.getArguments()) {
|
|
||||||
// TODO somewhere suggest next argument at trailing space
|
|
||||||
if (index.getAndIncrement() >= args.length)
|
|
||||||
return argument.getSuggestionProvider().suggest(sender);
|
|
||||||
if (argument.getType().isGreedy())
|
|
||||||
index.set(args.length);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (index.get() >= args.length) {
|
|
||||||
// TODO suggest next argument at trailing space
|
|
||||||
if (currentLiteral.getExecutor() == null)
|
|
||||||
return suggestions(currentLiteral, sender).toList();
|
|
||||||
}
|
|
||||||
|
|
||||||
var input = args[index.getAndIncrement()];
|
|
||||||
var nextLiteral = currentLiteral.getLiteral(input);
|
|
||||||
if (nextLiteral == null || !hasPermission(sender, nextLiteral)) {
|
|
||||||
var finalInput = input.toLowerCase();
|
|
||||||
return suggestions(currentLiteral, sender)
|
|
||||||
.filter(name -> name.toLowerCase().startsWith(finalInput))
|
|
||||||
.toList();
|
|
||||||
}
|
|
||||||
|
|
||||||
currentLiteral = nextLiteral;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private Stream<String> suggestions(Literal<T> literal, T sender) {
|
|
||||||
return literal.getLiterals().stream()
|
|
||||||
.filter(lit -> hasPermission(sender, lit))
|
|
||||||
.map(Literal::getNames)
|
|
||||||
.flatMap(Arrays::stream);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,41 +0,0 @@
|
||||||
package de.kentoj.kencommandapi.api.parser;
|
|
||||||
|
|
||||||
import de.kentoj.kencommandapi.api.CommandHandler;
|
|
||||||
import de.kentoj.kencommandapi.api.argument.CommandArgument;
|
|
||||||
import de.kentoj.kencommandapi.api.argument.types.StringArgumentType;
|
|
||||||
import de.kentoj.kencommandapi.api.literal.Literal;
|
|
||||||
import de.kentoj.kencommandapi.api.platform.MessageStyle;
|
|
||||||
import org.junit.jupiter.api.Test;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
|
||||||
|
|
||||||
public class CommandHandlerTest {
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void suggestArgument() {
|
|
||||||
var rootNode = Literal.rootLiteral(MessageStyle.PLAIN, "someRootNode");
|
|
||||||
var arg = CommandArgument.arg("someArg", new StringArgumentType<>());
|
|
||||||
arg.setSuggestionProvider(__ -> List.of("a", "b", "c"));
|
|
||||||
rootNode.addArgument(arg);
|
|
||||||
rootNode.setExecutor(ENV.EMPTY_EXECUTOR);
|
|
||||||
|
|
||||||
var handler = new CommandHandler<>((__, ___) -> {}, (__, ___) -> true);
|
|
||||||
var suggestions = handler.getSuggestions(rootNode, ENV.SENDER, new String[0]);
|
|
||||||
assertEquals(List.of("a", "b", "c"), suggestions);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void suggestLiterals() {
|
|
||||||
var rootNode = Literal.rootLiteral(MessageStyle.PLAIN, "someRootNode");
|
|
||||||
var literal1 = Literal.literal("lit1");
|
|
||||||
var literal2 = Literal.literal("lit2");
|
|
||||||
rootNode.addLiteral(literal1);
|
|
||||||
rootNode.addLiteral(literal2);
|
|
||||||
|
|
||||||
var handler = new CommandHandler<>((__, ___) -> {}, (__, ___) -> true);
|
|
||||||
var suggestions = handler.getSuggestions(rootNode, ENV.SENDER, new String[0]);
|
|
||||||
assertEquals(List.of("lit1", "lit2"), suggestions.stream().sorted().toList());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -0,0 +1,87 @@
|
||||||
|
package de.kentoj.kencommandapi.api.parser;
|
||||||
|
|
||||||
|
import de.kentoj.kencommandapi.api.argument.CommandArgument;
|
||||||
|
import de.kentoj.kencommandapi.api.argument.types.StringArgumentType;
|
||||||
|
import de.kentoj.kencommandapi.api.literal.Literal;
|
||||||
|
import de.kentoj.kencommandapi.api.literal.RootLiteral;
|
||||||
|
import de.kentoj.kencommandapi.api.platform.MessageStyle;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
|
||||||
|
public class SuggestionCommandParserTest {
|
||||||
|
|
||||||
|
private final SuggestionCommandParser<Object> suggestionParser;
|
||||||
|
private final RootLiteral<Object> rootLiteral;
|
||||||
|
|
||||||
|
public SuggestionCommandParserTest() {
|
||||||
|
rootLiteral = Literal.rootLiteral(MessageStyle.PLAIN, "someRootNode");
|
||||||
|
suggestionParser = new SuggestionCommandParser<>((__, ___) -> true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void suggestNextArgument() {
|
||||||
|
var arg = CommandArgument.arg("someArg", new StringArgumentType<>());
|
||||||
|
arg.setSuggestionProvider(__ -> List.of("foo", "bar"));
|
||||||
|
rootLiteral.addArgument(arg);
|
||||||
|
|
||||||
|
var suggestions = suggestionParser.getSuggestions(rootLiteral, ENV.SENDER, args(""));
|
||||||
|
assertEquals(Stream.of("foo", "bar").sorted().toList(), suggestions.stream().sorted().toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void suggestNextArgumentAtSpace() {
|
||||||
|
var uselessArg = CommandArgument.arg("someUselessArg", new StringArgumentType<>());
|
||||||
|
var arg = CommandArgument.arg("someArg", new StringArgumentType<>());
|
||||||
|
arg.setSuggestionProvider(__ -> List.of("foo", "bar"));
|
||||||
|
rootLiteral.addArgument(uselessArg);
|
||||||
|
rootLiteral.addArgument(arg);
|
||||||
|
|
||||||
|
var suggestions = suggestionParser.getSuggestions(rootLiteral, ENV.SENDER, args("hi "));
|
||||||
|
assertEquals(Stream.of("foo", "bar").sorted().toList(), suggestions.stream().sorted().toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void suggestCurrentArgument() {
|
||||||
|
var arg = CommandArgument.arg("someArg", new StringArgumentType<>());
|
||||||
|
arg.setSuggestionProvider(__ -> List.of("foo", "bar"));
|
||||||
|
rootLiteral.addArgument(arg);
|
||||||
|
|
||||||
|
var suggestions = suggestionParser.getSuggestions(rootLiteral, ENV.SENDER, args("f"));
|
||||||
|
assertEquals(List.of("foo"), suggestions);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void suggestNextLiteral() {
|
||||||
|
var literalFoo = Literal.literal("foo");
|
||||||
|
var literalBar = Literal.literal("bar");
|
||||||
|
rootLiteral.addLiteral(literalFoo);
|
||||||
|
rootLiteral.addLiteral(literalBar);
|
||||||
|
|
||||||
|
var suggestions = suggestionParser.getSuggestions(rootLiteral, ENV.SENDER, args(""));
|
||||||
|
assertEquals(Stream.of("foo", "bar").sorted().toList(), suggestions.stream().sorted().toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void suggestCurrentLiteral() {
|
||||||
|
var literalFoo = Literal.literal("foo");
|
||||||
|
var literalBar = Literal.literal("bar");
|
||||||
|
rootLiteral.addLiteral(literalFoo);
|
||||||
|
rootLiteral.addLiteral(literalBar);
|
||||||
|
|
||||||
|
var suggestions = suggestionParser.getSuggestions(rootLiteral, ENV.SENDER, args("f"));
|
||||||
|
assertEquals(List.of("foo"), suggestions);
|
||||||
|
}
|
||||||
|
|
||||||
|
private String[] args(String input) {
|
||||||
|
List<String> args = new ArrayList<>(Arrays.asList(input.split(" ")));
|
||||||
|
if (input.endsWith(" "))
|
||||||
|
args.add("");
|
||||||
|
return args.toArray(new String[0]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
package de.kentoj.kencommandapi;
|
package de.kentoj.kencommandapi;
|
||||||
|
|
||||||
import com.velocitypowered.api.command.CommandSource;
|
import com.velocitypowered.api.command.CommandSource;
|
||||||
import com.velocitypowered.api.command.SimpleCommand;
|
import com.velocitypowered.api.command.RawCommand;
|
||||||
import de.kentoj.kencommandapi.api.CommandHandler;
|
import de.kentoj.kencommandapi.api.CommandHandler;
|
||||||
import de.kentoj.kencommandapi.api.literal.RootLiteral;
|
import de.kentoj.kencommandapi.api.literal.RootLiteral;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
|
|
@ -9,14 +9,15 @@ import lombok.RequiredArgsConstructor;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
public class VelocityCommand implements SimpleCommand {
|
public class VelocityCommand implements RawCommand {
|
||||||
|
|
||||||
private final CommandHandler<CommandSource> commandHandler;
|
private final CommandHandler<CommandSource> commandHandler;
|
||||||
private final RootLiteral<CommandSource> rootNode;
|
private final RootLiteral<CommandSource> rootNode;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void execute(Invocation invocation) {
|
public void execute(Invocation invocation) {
|
||||||
commandHandler.invoke(rootNode, invocation.source(), invocation.arguments());
|
var args = invocation.arguments().split(" ");
|
||||||
|
commandHandler.invoke(rootNode, invocation.source(), args);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
@ -27,6 +28,7 @@ public class VelocityCommand implements SimpleCommand {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<String> suggest(Invocation invocation) {
|
public List<String> suggest(Invocation invocation) {
|
||||||
return commandHandler.getSuggestions(rootNode, invocation.source(), invocation.arguments());
|
var args = invocation.arguments().split(" ");
|
||||||
|
return commandHandler.getSuggestions(rootNode, invocation.source(), args, invocation.arguments().endsWith(" "));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1,5 +1,10 @@
|
||||||
pluginManagement {
|
pluginManagement {
|
||||||
includeBuild("../build-logic")
|
includeBuild("../build-logic")
|
||||||
|
repositories {
|
||||||
|
maven("https://repo.papermc.io/repository/maven-public/") {
|
||||||
|
name = "papermc"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
plugins {
|
plugins {
|
||||||
|
|
@ -8,9 +13,8 @@ plugins {
|
||||||
|
|
||||||
dependencyResolutionManagement {
|
dependencyResolutionManagement {
|
||||||
repositories {
|
repositories {
|
||||||
maven {
|
maven("https://repo.papermc.io/repository/maven-public/") {
|
||||||
name = "papermc"
|
name = "papermc"
|
||||||
url = uri("https://repo.papermc.io/repository/maven-public/")
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue