diff --git a/litecommands-core/src/main/java/dev/rollczi/litecommands/LiteCommandsBuilder.java b/litecommands-core/src/main/java/dev/rollczi/litecommands/LiteCommandsBuilder.java index 6cfb8acd0..c5d049bf0 100644 --- a/litecommands-core/src/main/java/dev/rollczi/litecommands/LiteCommandsBuilder.java +++ b/litecommands-core/src/main/java/dev/rollczi/litecommands/LiteCommandsBuilder.java @@ -26,6 +26,7 @@ import org.panda_lang.utilities.inject.Injector; import panda.utilities.text.Formatter; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashMap; @@ -46,7 +47,7 @@ public class LiteCommandsBuilder { private final LiteRegisterResolvers registerResolvers = new LiteRegisterResolvers(); private final Formatter placeholders = new Formatter(); private ExecutionResultHandler executionResultHandler; - private LitePlatformManager platformManager; + private LitePlatformManager platformManager; private Injector baseInjector = DependencyInjection.createInjector(); private Logger logger = Logger.getLogger("LiteCommands"); @@ -137,7 +138,7 @@ public LiteCommandsBuilder placeholders(Map> placeholde return this; } - public LiteCommandsBuilder platform(LitePlatformManager platformManager) { + public LiteCommandsBuilder platform(LitePlatformManager platformManager) { this.platformManager = platformManager; return this; } @@ -245,7 +246,25 @@ private DefaultSuggester(LiteComponent resolver) { @Override public List suggest(LiteInvocation invocation) { - return resolver.resolveCompletion(LiteComponent.ContextOfResolving.create(invocation)); + List completions = resolver.resolveCompletion(LiteComponent.ContextOfResolving.create(invocation)); + String[] arguments = invocation.arguments(); + + if (arguments.length == 0) { + return completions; + } + + String argument = arguments[arguments.length - 1]; + List completionsStartsWith = new ArrayList<>(); + + for (String completion : completions) { + if (!completion.startsWith(argument)) { + continue; + } + + completionsStartsWith.add(completion); + } + + return completionsStartsWith; } } diff --git a/litecommands-core/src/main/java/dev/rollczi/litecommands/component/LiteComponentFactory.java b/litecommands-core/src/main/java/dev/rollczi/litecommands/component/LiteComponentFactory.java index 098b137e7..4605edf8f 100644 --- a/litecommands-core/src/main/java/dev/rollczi/litecommands/component/LiteComponentFactory.java +++ b/litecommands-core/src/main/java/dev/rollczi/litecommands/component/LiteComponentFactory.java @@ -56,7 +56,7 @@ public Option createExecution(Object instance, Method executionMe MethodExecutor methodExecutor = new MethodExecutor(executionMethod, instance, injector, parser); return parser.parse(executionMethod) - .map((scope) -> new LiteExecution(logger, parser, scope, methodExecutor)); + .map((scope) -> new LiteExecution(logger, scope, methodExecutor)); } } diff --git a/litecommands-core/src/main/java/dev/rollczi/litecommands/component/LiteExecution.java b/litecommands-core/src/main/java/dev/rollczi/litecommands/component/LiteExecution.java index 4c7a5915a..dadf93411 100644 --- a/litecommands-core/src/main/java/dev/rollczi/litecommands/component/LiteExecution.java +++ b/litecommands-core/src/main/java/dev/rollczi/litecommands/component/LiteExecution.java @@ -1,6 +1,5 @@ package dev.rollczi.litecommands.component; -import dev.rollczi.litecommands.annotations.parser.AnnotationParser; import dev.rollczi.litecommands.scope.ScopeMetaData; import dev.rollczi.litecommands.valid.ValidationCommandException; import dev.rollczi.litecommands.valid.ValidationInfo; @@ -16,13 +15,11 @@ public final class LiteExecution extends AbstractComponent { private final Logger logger; - private final AnnotationParser parser; private final MethodExecutor executor; - LiteExecution(Logger logger, AnnotationParser parser, ScopeMetaData scopeMetaData, MethodExecutor executor) { + LiteExecution(Logger logger, ScopeMetaData scopeMetaData, MethodExecutor executor) { super(scopeMetaData); this.logger = logger; - this.parser = parser; this.executor = executor; } diff --git a/litecommands-core/src/main/java/dev/rollczi/litecommands/component/LiteSection.java b/litecommands-core/src/main/java/dev/rollczi/litecommands/component/LiteSection.java index 20549fdb3..948a8a4b4 100644 --- a/litecommands-core/src/main/java/dev/rollczi/litecommands/component/LiteSection.java +++ b/litecommands-core/src/main/java/dev/rollczi/litecommands/component/LiteSection.java @@ -1,6 +1,5 @@ package dev.rollczi.litecommands.component; -import dev.rollczi.litecommands.LiteInvocation; import dev.rollczi.litecommands.scope.ScopeMetaData; import dev.rollczi.litecommands.valid.ValidationInfo; import panda.std.Option; @@ -77,6 +76,7 @@ public ExecutionResult resolveExecution(ContextOfResolving context) { public List resolveCompletion(ContextOfResolving data) { ContextOfResolving currentContextOfResolving = data.resolverNestingTracing(this); + // /command subcommand| if (data.isLastResolver()) { ArrayList suggestions = new ArrayList<>(resolvers.keySet()); @@ -89,18 +89,20 @@ public List resolveCompletion(ContextOfResolving data) { String partCommand = data.getNextPredictedPartOfSuggestion(); + // /command subcommand |litecomponent if (partCommand.isEmpty()) { - List suggestions = new ArrayList<>(resolvers.keySet()); + List suggestions = new ArrayList<>(resolvers.keySet()); // suggestions (subcommands) LiteComponent executor = resolvers.get(StringUtils.EMPTY); - suggestions.remove(StringUtils.EMPTY); if (executor != null) { - suggestions.addAll(executor.resolveCompletion(currentContextOfResolving)); + suggestions.remove(StringUtils.EMPTY); + suggestions.addAll(executor.resolveCompletion(currentContextOfResolving)); // suggestions (arguments) } return suggestions; } + // /command subcommand| litecomponent for (Map.Entry entry : resolvers.entrySet()) { if (!partCommand.equalsIgnoreCase(entry.getKey())) { continue; @@ -112,11 +114,12 @@ public List resolveCompletion(ContextOfResolving data) { String[] arguments = data.invocation.arguments(); LiteComponent component = resolvers.get(StringUtils.EMPTY); - if (component != null && arguments.length != 0 && component instanceof LiteExecution) { + // /command subcommand argument |[...] + if (component instanceof LiteExecution && arguments.length != 0) { LiteExecution liteExecution = (LiteExecution) component; - LiteInvocation invocation = data.getInvocation(); List oldSuggestions = liteExecution.generateCompletion(currentContextOfResolving.getCurrentArgsCount(this) - 1, currentContextOfResolving); + // /command subcommand argument |argument if (oldSuggestions.contains(arguments[arguments.length - 2])) { return component.resolveCompletion(currentContextOfResolving); }