diff --git a/src/main/java/de/prob2/jupyter/ProBKernel.java b/src/main/java/de/prob2/jupyter/ProBKernel.java index 64c0739983741ff2e727c145eeb23e79f5fe0ea0..96995ee72621595ca7d8b4c9e7de50e157c83dbd 100644 --- a/src/main/java/de/prob2/jupyter/ProBKernel.java +++ b/src/main/java/de/prob2/jupyter/ProBKernel.java @@ -361,8 +361,8 @@ public final class ProBKernel extends BaseKernel { } } - private static @Nullable DisplayData inspectCommandArguments(final @NotNull Command command, final @NotNull String argString, final int at) { - final SplitResult split = CommandUtils.splitArgs(command.getParameters(), new PositionedString(argString, 0), at); + private static @Nullable DisplayData inspectCommandArguments(final @NotNull Command command, final @NotNull PositionedString argString, final int at) { + final SplitResult split = CommandUtils.splitArgs(command.getParameters(), argString, at); if (split.getParameterAtPosition().isPresent()) { final Optional<Inspector> inspector = command.getParameterInspectors().getInspectorForParameter(split.getParameterAtPosition().get()); if (inspector.isPresent()) { @@ -378,13 +378,10 @@ public final class ProBKernel extends BaseKernel { } } - @Override - public @Nullable DisplayData inspect(final @NotNull String code, final int at, final boolean extraDetail) { - // Note: We ignore the extraDetail parameter, because in practice it is always false. This is because the inspect_request messages sent by Jupyter Notebook always have their detail_level set to 0. - final Matcher commandMatcher = COMMAND_PATTERN.matcher(code); + private @Nullable DisplayData inspectInternal(final @NotNull PositionedString code, final int at) { + final Matcher commandMatcher = COMMAND_PATTERN.matcher(code.getValue()); if (commandMatcher.matches()) { // The code is a valid command. - final int argOffset = commandMatcher.start(2); final String name = commandMatcher.group(1); if (this.getCommands().containsKey(name)) { final Command command = this.getCommands().get(name); @@ -397,8 +394,13 @@ public final class ProBKernel extends BaseKernel { } else { // The cursor is somewhere in the command arguments, ask the command to inspect. assert name != null; - final String argString = commandMatcher.group(2) == null ? "" : commandMatcher.group(2); - return inspectCommandArguments(command, argString, at - argOffset); + final PositionedString argString; + if (commandMatcher.group(2) == null) { + argString = code.substring(code.getValue().length()); + } else { + argString = code.substring(commandMatcher.start(2), commandMatcher.end(2)); + } + return inspectCommandArguments(command, argString, at); } } else { // Invalid command, can't inspect. @@ -410,6 +412,12 @@ public final class ProBKernel extends BaseKernel { } } + @Override + public @Nullable DisplayData inspect(final @NotNull String code, final int at, final boolean extraDetail) { + // Note: We ignore the extraDetail parameter, because in practice it is always false. This is because the inspect_request messages sent by Jupyter Notebook always have their detail_level set to 0. + return this.inspectInternal(new PositionedString(code, 0), at); + } + private static @NotNull ReplacementOptions offsetReplacementOptions(final @NotNull ReplacementOptions replacements, final int offset) { return new ReplacementOptions( replacements.getReplacements(),