From cb47120e5b508cdb7495042408d0663d166cc215 Mon Sep 17 00:00:00 2001 From: dgelessus <dgelessus@users.noreply.github.com> Date: Tue, 16 Jun 2020 16:47:16 +0200 Subject: [PATCH] Change ProBKernel.inspect internals to use PositionedString The PositionedString offsets here now use the same origin as the "at" index received from Jupyter. This way the "at" index no longer needs to be offset manually after the command name is removed from the string. --- .../java/de/prob2/jupyter/ProBKernel.java | 26 ++++++++++++------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/src/main/java/de/prob2/jupyter/ProBKernel.java b/src/main/java/de/prob2/jupyter/ProBKernel.java index 64c0739..96995ee 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(), -- GitLab