LiteCommands icon indicating copy to clipboard operation
LiteCommands copied to clipboard

OptionalArg don't support collections types

Open creatorfromhell opened this issue 1 year ago • 4 comments

This is a suggestion to change what class file LiteCommands looks for when it comes to collections. I think instead of checking for a suggestion on List.class, it should instead check the class of the objects the List contains. Example List<GameMode> should look for completion based on GameMode.class not List.class.

creatorfromhell avatar Feb 18 '24 19:02 creatorfromhell

This is how it currently works only indirectly to be able to better manage suggestions. LiteCommands -> List suggester -> GameMode suggester

Rollczi avatar Feb 18 '24 19:02 Rollczi

This is how it currently works only indirectly to be able to better manage suggestions. LiteCommands -> List suggester -> GameMode suggester

Currently, when providing for the class type of the object in the collection, and not providing for the collection class results in an error. As an example, I changed to using ArgumentKey as suggested in #377 and it errors out when it gets to the List argument.

java.lang.IllegalArgumentException: No parser found for argument List
	at phantomworlds.libs.lc.litecommands.argument.parser.ParserSet.getValidParserOrThrow(ParserSet.java:17) ~[PhantomWorlds-2.0.5.jar:?]
	at phantomworlds.libs.lc.litecommands.input.raw.RawInputAnalyzer.isNextOptional(RawInputAnalyzer.java:63) ~[PhantomWorlds-2.0.5.jar:?]
	at phantomworlds.libs.lc.litecommands.argument.suggester.input.SuggestionInputRawImpl$Matcher.isNextOptional(SuggestionInputRawImpl.java:71) ~[PhantomWorlds-2.0.5.jar:?]
	at phantomworlds.libs.lc.litecommands.suggestion.SuggestionService.suggestArgument(SuggestionService.java:109) ~[PhantomWorlds-2.0.5.jar:?]
	at phantomworlds.libs.lc.litecommands.suggestion.SuggestionService.suggestExecutor(SuggestionService.java:87) ~[PhantomWorlds-2.0.5.jar:?]
	at phantomworlds.libs.lc.litecommands.suggestion.SuggestionService.suggest0(SuggestionService.java:55) ~[PhantomWorlds-2.0.5.jar:?]
	at phantomworlds.libs.lc.litecommands.suggestion.SuggestionService.suggest(SuggestionService.java:34) ~[PhantomWorlds-2.0.5.jar:?]
	at phantomworlds.libs.lc.litecommands.command.CommandManager$PlatformListener.suggest(CommandManager.java:71) ~[PhantomWorlds-2.0.5.jar:?]
	at phantomworlds.libs.lc.litecommands.bukkit.BukkitCommand.suggest(BukkitCommand.java:82) ~[PhantomWorlds-2.0.5.jar:?]
	at phantomworlds.libs.lc.litecommands.bukkit.TabComplete.callListener(TabComplete.java:65) ~[PhantomWorlds-2.0.5.jar:?]
	at phantomworlds.libs.lc.litecommands.bukkit.TabCompletePaperAsync.executeListener(TabCompletePaperAsync.java:25) ~[PhantomWorlds-2.0.5.jar:?]
	at phantomworlds.libs.lc.litecommands.bukkit.TabCompletePaperAsync.lambda$new$0(TabCompletePaperAsync.java:20) ~[PhantomWorlds-2.0.5.jar:?]
	at co.aikar.timings.TimedEventExecutor.execute(TimedEventExecutor.java:77) ~[purpur-api-1.20.2-R0.1-SNAPSHOT.jar:git-Purpur-2092]
	at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:70) ~[purpur-api-1.20.2-R0.1-SNAPSHOT.jar:?]
	at io.papermc.paper.plugin.manager.PaperEventManager.callEvent(PaperEventManager.java:54) ~[purpur-1.20.2.jar:git-Purpur-2092]
	at io.papermc.paper.plugin.manager.PaperPluginManagerImpl.callEvent(PaperPluginManagerImpl.java:126) ~[purpur-1.20.2.jar:git-Purpur-2092]
	at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:617) ~[purpur-api-1.20.2-R0.1-SNAPSHOT.jar:?]
	at org.bukkit.event.Event.callEvent(Event.java:45) ~[purpur-api-1.20.2-R0.1-SNAPSHOT.jar:?]
	at net.minecraft.server.network.ServerGamePacketListenerImpl.lambda$handleCustomCommandSuggestions$7(ServerGamePacketListenerImpl.java:822) ~[?:?]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) ~[?:?]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) ~[?:?]
	at java.lang.Thread.run(Thread.java:1623) ~[?:?]

Code to register argument parser:

.argument(String.class, ArgumentKey.of("world-setting"), new SettingParameterRedux())

creatorfromhell avatar Feb 18 '24 19:02 creatorfromhell

This is how it currently works only indirectly to be able to better manage suggestions. LiteCommands -> List suggester -> GameMode suggester

Currently, when providing for the class type of the object in the collection, and not providing for the collection class results in an error. As an example, I changed to using ArgumentKey as suggested in #377 and it errors out when it gets to the List argument.

java.lang.IllegalArgumentException: No parser found for argument List
	at phantomworlds.libs.lc.litecommands.argument.parser.ParserSet.getValidParserOrThrow(ParserSet.java:17) ~[PhantomWorlds-2.0.5.jar:?]
	at phantomworlds.libs.lc.litecommands.input.raw.RawInputAnalyzer.isNextOptional(RawInputAnalyzer.java:63) ~[PhantomWorlds-2.0.5.jar:?]
	at phantomworlds.libs.lc.litecommands.argument.suggester.input.SuggestionInputRawImpl$Matcher.isNextOptional(SuggestionInputRawImpl.java:71) ~[PhantomWorlds-2.0.5.jar:?]
	at phantomworlds.libs.lc.litecommands.suggestion.SuggestionService.suggestArgument(SuggestionService.java:109) ~[PhantomWorlds-2.0.5.jar:?]
	at phantomworlds.libs.lc.litecommands.suggestion.SuggestionService.suggestExecutor(SuggestionService.java:87) ~[PhantomWorlds-2.0.5.jar:?]
	at phantomworlds.libs.lc.litecommands.suggestion.SuggestionService.suggest0(SuggestionService.java:55) ~[PhantomWorlds-2.0.5.jar:?]
	at phantomworlds.libs.lc.litecommands.suggestion.SuggestionService.suggest(SuggestionService.java:34) ~[PhantomWorlds-2.0.5.jar:?]
	at phantomworlds.libs.lc.litecommands.command.CommandManager$PlatformListener.suggest(CommandManager.java:71) ~[PhantomWorlds-2.0.5.jar:?]
	at phantomworlds.libs.lc.litecommands.bukkit.BukkitCommand.suggest(BukkitCommand.java:82) ~[PhantomWorlds-2.0.5.jar:?]
	at phantomworlds.libs.lc.litecommands.bukkit.TabComplete.callListener(TabComplete.java:65) ~[PhantomWorlds-2.0.5.jar:?]
	at phantomworlds.libs.lc.litecommands.bukkit.TabCompletePaperAsync.executeListener(TabCompletePaperAsync.java:25) ~[PhantomWorlds-2.0.5.jar:?]
	at phantomworlds.libs.lc.litecommands.bukkit.TabCompletePaperAsync.lambda$new$0(TabCompletePaperAsync.java:20) ~[PhantomWorlds-2.0.5.jar:?]
	at co.aikar.timings.TimedEventExecutor.execute(TimedEventExecutor.java:77) ~[purpur-api-1.20.2-R0.1-SNAPSHOT.jar:git-Purpur-2092]
	at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:70) ~[purpur-api-1.20.2-R0.1-SNAPSHOT.jar:?]
	at io.papermc.paper.plugin.manager.PaperEventManager.callEvent(PaperEventManager.java:54) ~[purpur-1.20.2.jar:git-Purpur-2092]
	at io.papermc.paper.plugin.manager.PaperPluginManagerImpl.callEvent(PaperPluginManagerImpl.java:126) ~[purpur-1.20.2.jar:git-Purpur-2092]
	at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:617) ~[purpur-api-1.20.2-R0.1-SNAPSHOT.jar:?]
	at org.bukkit.event.Event.callEvent(Event.java:45) ~[purpur-api-1.20.2-R0.1-SNAPSHOT.jar:?]
	at net.minecraft.server.network.ServerGamePacketListenerImpl.lambda$handleCustomCommandSuggestions$7(ServerGamePacketListenerImpl.java:822) ~[?:?]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) ~[?:?]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) ~[?:?]
	at java.lang.Thread.run(Thread.java:1623) ~[?:?]

Code to register argument parser:

.argument(String.class, ArgumentKey.of("world-setting"), new SettingParameterRedux())

I cannot reproduce this issue. You can see how use List<T> arguments in the following example When I use list arguments, everything works normally. Maybe this is a problem with the use of @OptionalArg ? Try use @Arg (a collection can be empty)

Rollczi avatar Feb 18 '24 20:02 Rollczi

This is how it currently works only indirectly to be able to better manage suggestions. LiteCommands -> List suggester -> GameMode suggester

Currently, when providing for the class type of the object in the collection, and not providing for the collection class results in an error. As an example, I changed to using ArgumentKey as suggested in #377 and it errors out when it gets to the List argument.

java.lang.IllegalArgumentException: No parser found for argument List
	at phantomworlds.libs.lc.litecommands.argument.parser.ParserSet.getValidParserOrThrow(ParserSet.java:17) ~[PhantomWorlds-2.0.5.jar:?]
	at phantomworlds.libs.lc.litecommands.input.raw.RawInputAnalyzer.isNextOptional(RawInputAnalyzer.java:63) ~[PhantomWorlds-2.0.5.jar:?]
	at phantomworlds.libs.lc.litecommands.argument.suggester.input.SuggestionInputRawImpl$Matcher.isNextOptional(SuggestionInputRawImpl.java:71) ~[PhantomWorlds-2.0.5.jar:?]
	at phantomworlds.libs.lc.litecommands.suggestion.SuggestionService.suggestArgument(SuggestionService.java:109) ~[PhantomWorlds-2.0.5.jar:?]
	at phantomworlds.libs.lc.litecommands.suggestion.SuggestionService.suggestExecutor(SuggestionService.java:87) ~[PhantomWorlds-2.0.5.jar:?]
	at phantomworlds.libs.lc.litecommands.suggestion.SuggestionService.suggest0(SuggestionService.java:55) ~[PhantomWorlds-2.0.5.jar:?]
	at phantomworlds.libs.lc.litecommands.suggestion.SuggestionService.suggest(SuggestionService.java:34) ~[PhantomWorlds-2.0.5.jar:?]
	at phantomworlds.libs.lc.litecommands.command.CommandManager$PlatformListener.suggest(CommandManager.java:71) ~[PhantomWorlds-2.0.5.jar:?]
	at phantomworlds.libs.lc.litecommands.bukkit.BukkitCommand.suggest(BukkitCommand.java:82) ~[PhantomWorlds-2.0.5.jar:?]
	at phantomworlds.libs.lc.litecommands.bukkit.TabComplete.callListener(TabComplete.java:65) ~[PhantomWorlds-2.0.5.jar:?]
	at phantomworlds.libs.lc.litecommands.bukkit.TabCompletePaperAsync.executeListener(TabCompletePaperAsync.java:25) ~[PhantomWorlds-2.0.5.jar:?]
	at phantomworlds.libs.lc.litecommands.bukkit.TabCompletePaperAsync.lambda$new$0(TabCompletePaperAsync.java:20) ~[PhantomWorlds-2.0.5.jar:?]
	at co.aikar.timings.TimedEventExecutor.execute(TimedEventExecutor.java:77) ~[purpur-api-1.20.2-R0.1-SNAPSHOT.jar:git-Purpur-2092]
	at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:70) ~[purpur-api-1.20.2-R0.1-SNAPSHOT.jar:?]
	at io.papermc.paper.plugin.manager.PaperEventManager.callEvent(PaperEventManager.java:54) ~[purpur-1.20.2.jar:git-Purpur-2092]
	at io.papermc.paper.plugin.manager.PaperPluginManagerImpl.callEvent(PaperPluginManagerImpl.java:126) ~[purpur-1.20.2.jar:git-Purpur-2092]
	at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:617) ~[purpur-api-1.20.2-R0.1-SNAPSHOT.jar:?]
	at org.bukkit.event.Event.callEvent(Event.java:45) ~[purpur-api-1.20.2-R0.1-SNAPSHOT.jar:?]
	at net.minecraft.server.network.ServerGamePacketListenerImpl.lambda$handleCustomCommandSuggestions$7(ServerGamePacketListenerImpl.java:822) ~[?:?]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) ~[?:?]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) ~[?:?]
	at java.lang.Thread.run(Thread.java:1623) ~[?:?]

Code to register argument parser:

.argument(String.class, ArgumentKey.of("world-setting"), new SettingParameterRedux())

I cannot reproduce this issue. You can see how use List<T> arguments in the following example When I use list arguments, everything works normally. Maybe this is a problem with the use of @OptionalArg ? Try use @Arg (a collection can be empty)

Seems to be the case with OptionalArg throwing the error.

Thank You,

creatorfromhell avatar Feb 18 '24 21:02 creatorfromhell