From dda24329eb568c0c331ff5f94ed3c0237ca51e32 Mon Sep 17 00:00:00 2001 From: dgelessus <dgelessus@users.noreply.github.com> Date: Tue, 16 Jun 2020 22:20:15 +0200 Subject: [PATCH] Fix completion not working if no arguments have been typed yet --- .../java/de/prob2/jupyter/ProBKernel.java | 35 +++++++++++++------ 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/src/main/java/de/prob2/jupyter/ProBKernel.java b/src/main/java/de/prob2/jupyter/ProBKernel.java index 8f7f26a..bde37e6 100644 --- a/src/main/java/de/prob2/jupyter/ProBKernel.java +++ b/src/main/java/de/prob2/jupyter/ProBKernel.java @@ -472,17 +472,32 @@ public final class ProBKernel extends BaseKernel { private static @Nullable ReplacementOptions completeCommandArguments(final @NotNull Command command, final @NotNull PositionedString argString, final int at) { final SplitResult split = CommandUtils.splitArgs(command.getParameters(), argString, at); + + final Parameter<?> parameterToComplete; + final PositionedString argumentToComplete; if (split.getParameterAtPosition().isPresent()) { - final Optional<Completer> completer = command.getParameterCompleters().getCompleterForParameter(split.getParameterAtPosition().get()); - if (completer.isPresent()) { - final List<PositionedString> argsAtPosition = split.getArguments().get(split.getParameterAtPosition().get()); - assert !argsAtPosition.isEmpty(); - final PositionedString lastArgument = argsAtPosition.get(argsAtPosition.size() - 1); - final ReplacementOptions replacements = completer.get().complete(lastArgument.getValue(), at - lastArgument.getStartPosition()); - return replacements == null ? null : offsetReplacementOptions(replacements, lastArgument.getStartPosition()); - } else { - return null; - } + // If any arguments were split, + // use the last parameter for completion. + parameterToComplete = split.getParameterAtPosition().get(); + final List<PositionedString> argsAtPosition = split.getArguments().get(parameterToComplete); + assert !argsAtPosition.isEmpty(); + argumentToComplete = argsAtPosition.get(argsAtPosition.size() - 1); + } else if (!command.getParameters().getPositionalParameters().isEmpty()) { + // Special case: if the command has parameters, + // but argument splitting stopped before any arguments were split, + // perform completion on the first parameter and an empty string at the cursor. + parameterToComplete = command.getParameters().getPositionalParameters().get(0); + argumentToComplete = new PositionedString("", at); + } else { + // Command has no parameters, + // so completion in the arguments is not possible. + return null; + } + + final Optional<Completer> completer = command.getParameterCompleters().getCompleterForParameter(parameterToComplete); + if (completer.isPresent()) { + final ReplacementOptions replacements = completer.get().complete(argumentToComplete.getValue(), at - argumentToComplete.getStartPosition()); + return replacements == null ? null : offsetReplacementOptions(replacements, argumentToComplete.getStartPosition()); } else { return null; } -- GitLab