Skip to content
Snippets Groups Projects
Commit 990738c0 authored by dgelessus's avatar dgelessus
Browse files

Re-implement command inspection feature based on new argument parsing

CommandUtils.splitArgs now takes an extra (optional) parameter to ask
it to not split the entire argument string, but only up to the argument
at the given offset in the string. The returned SplitResult contains
information about which parameter the argument splitting stopped at.

This is used in the new implementation of the inspection feature: when
the kernel is asked to inspect at a certain position, the arguments are
split up to that position, and the argument at that position is
inspected. (The arguments are only split and not fully parsed, because
inspection should be possible even if the command arguments are still
incomplete or otherwise invalid.)

This new implementation replaces the old separate implementation in
CommandUtils.splitArgs.
parent 7a83460d
Branches
Tags
No related merge requests found
Showing
with 170 additions and 77 deletions
...@@ -43,7 +43,7 @@ public interface Command { ...@@ -43,7 +43,7 @@ public interface Command {
public abstract @Nullable DisplayData run(final @NotNull ParsedArguments args); public abstract @Nullable DisplayData run(final @NotNull ParsedArguments args);
public abstract @Nullable DisplayData inspect(final @NotNull String argString, final int at); public abstract @NotNull ParameterInspectors getParameterInspectors();
public abstract @Nullable ReplacementOptions complete(final @NotNull String argString, final int at); public abstract @Nullable ReplacementOptions complete(final @NotNull String argString, final int at);
} }
...@@ -90,7 +90,7 @@ public final class CommandUtils { ...@@ -90,7 +90,7 @@ public final class CommandUtils {
} }
} }
public static @NotNull SplitResult splitArgs(final @NotNull Parameters parameters, final @NotNull String argString) { public static @NotNull SplitResult splitArgs(final @NotNull Parameters parameters, final @NotNull String argString, final int upToPosition) {
final SplitArguments splitArgs = new SplitArguments(Collections.emptyMap()); final SplitArguments splitArgs = new SplitArguments(Collections.emptyMap());
PositionedString remainingArgs = new PositionedString(argString, 0); PositionedString remainingArgs = new PositionedString(argString, 0);
if (parameters.getBodyParam().isPresent()) { if (parameters.getBodyParam().isPresent()) {
...@@ -102,6 +102,7 @@ public final class CommandUtils { ...@@ -102,6 +102,7 @@ public final class CommandUtils {
} }
} }
Parameter<?> parameterAtPosition = null;
for (int i = 0; i < parameters.getPositionalParameters().size();) { for (int i = 0; i < parameters.getPositionalParameters().size();) {
final Parameter<?> param = parameters.getPositionalParameters().get(i); final Parameter<?> param = parameters.getPositionalParameters().get(i);
if (remainingArgs.getValue().isEmpty()) { if (remainingArgs.getValue().isEmpty()) {
...@@ -112,12 +113,29 @@ public final class CommandUtils { ...@@ -112,12 +113,29 @@ public final class CommandUtils {
splitArgs.add(param, splitSingleArg.getSplitArg()); splitArgs.add(param, splitSingleArg.getSplitArg());
remainingArgs = splitSingleArg.getRemainingArgString(); remainingArgs = splitSingleArg.getRemainingArgString();
if (remainingArgs.getValue().isEmpty() || remainingArgs.getStartPosition() > upToPosition) {
parameterAtPosition = param;
break;
}
if (!param.isRepeating()) { if (!param.isRepeating()) {
i++; i++;
} }
} }
return new SplitResult(splitArgs, remainingArgs); if (parameters.getBodyParam().isPresent() && splitArgs.containsKey(parameters.getBodyParam().get())) {
final List<PositionedString> bodyParamValues = splitArgs.get(parameters.getBodyParam().get());
assert bodyParamValues.size() == 1;
if (upToPosition >= bodyParamValues.get(0).getStartPosition()) {
parameterAtPosition = parameters.getBodyParam().get();
}
}
return new SplitResult(splitArgs, parameterAtPosition, remainingArgs);
}
public static @NotNull SplitResult splitArgs(final @NotNull Parameters parameters, final @NotNull String argString) {
return splitArgs(parameters, argString, argString.length());
} }
private static <T> void validateSplitParameter(final @NotNull ParsedArguments parsed, final @NotNull SplitArguments splitArgs, final @NotNull Parameter<T> param) { private static <T> void validateSplitParameter(final @NotNull ParsedArguments parsed, final @NotNull SplitArguments splitArgs, final @NotNull Parameter<T> param) {
...@@ -290,25 +308,6 @@ public final class CommandUtils { ...@@ -290,25 +308,6 @@ public final class CommandUtils {
); );
} }
public static @Nullable DisplayData inspectArgs(final @NotNull String argString, final int at, final @NotNull Inspector @NotNull... inspectors) {
final Matcher argSplitMatcher = ARG_SPLIT_PATTERN.matcher(argString);
int argStart = 0;
int argEnd = argString.length();
int i = 0;
while (argSplitMatcher.find()) {
if (argSplitMatcher.end() > at) {
argEnd = argSplitMatcher.start();
break;
}
argStart = argSplitMatcher.end();
if (i >= inspectors.length-1) {
break;
}
i++;
}
return inspectors[i].inspect(argString.substring(argStart, argEnd), at - argStart);
}
public static @Nullable ReplacementOptions completeArgs(final @NotNull String argString, final int at, final @NotNull Completer @NotNull... completers) { public static @Nullable ReplacementOptions completeArgs(final @NotNull String argString, final int at, final @NotNull Completer @NotNull... completers) {
final Matcher argSplitMatcher = ARG_SPLIT_PATTERN.matcher(argString); final Matcher argSplitMatcher = ARG_SPLIT_PATTERN.matcher(argString);
int argStart = 0; int argStart = 0;
......
package de.prob2.jupyter;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import com.google.common.base.MoreObjects;
import org.jetbrains.annotations.NotNull;
public final class ParameterInspectors {
public static final @NotNull ParameterInspectors NONE = new ParameterInspectors(Collections.emptyMap());
private final @NotNull Map<@NotNull Parameter<?>, CommandUtils.@NotNull Inspector> inspectors;
public ParameterInspectors(final @NotNull Map<@NotNull Parameter<?>, CommandUtils.@NotNull Inspector> inspectors) {
super();
this.inspectors = Collections.unmodifiableMap(new HashMap<>(inspectors));
}
public @NotNull Map<@NotNull Parameter<?>, CommandUtils.@NotNull Inspector> getInspectors() {
return this.inspectors;
}
@Override
public String toString() {
return MoreObjects.toStringHelper(this)
.add("inspectors", this.getInspectors())
.toString();
}
public @NotNull Optional<CommandUtils.Inspector> getInspectorForParameter(final @NotNull Parameter<?> parameter) {
if (this.getInspectors().containsKey(parameter)) {
return Optional.of(this.getInspectors().get(parameter));
} else {
return Optional.empty();
}
}
}
...@@ -13,6 +13,7 @@ import java.util.Collections; ...@@ -13,6 +13,7 @@ import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Optional;
import java.util.Properties; import java.util.Properties;
import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.atomic.AtomicReference;
import java.util.regex.Matcher; import java.util.regex.Matcher;
...@@ -353,6 +354,23 @@ public final class ProBKernel extends BaseKernel { ...@@ -353,6 +354,23 @@ 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(), argString, at);
if (split.getParameterAtPosition().isPresent()) {
final Optional<CommandUtils.Inspector> inspector = command.getParameterInspectors().getInspectorForParameter(split.getParameterAtPosition().get());
if (inspector.isPresent()) {
final List<PositionedString> argsAtPosition = split.getArguments().get(split.getParameterAtPosition().get());
assert !argsAtPosition.isEmpty();
final PositionedString lastArgument = argsAtPosition.get(argsAtPosition.size() - 1);
return inspector.get().inspect(lastArgument.getValue(), at - lastArgument.getStartPosition());
} else {
return null;
}
} else {
return null;
}
}
@Override @Override
public @Nullable DisplayData inspect(final @NotNull String code, final int at, final boolean extraDetail) { 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. // 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.
...@@ -373,7 +391,7 @@ public final class ProBKernel extends BaseKernel { ...@@ -373,7 +391,7 @@ public final class ProBKernel extends BaseKernel {
// The cursor is somewhere in the command arguments, ask the command to inspect. // The cursor is somewhere in the command arguments, ask the command to inspect.
assert name != null; assert name != null;
final String argString = commandMatcher.group(2) == null ? "" : commandMatcher.group(2); final String argString = commandMatcher.group(2) == null ? "" : commandMatcher.group(2);
return command.inspect(argString, at - argOffset); return inspectCommandArguments(command, argString, at - argOffset);
} }
} else { } else {
// Invalid command, can't inspect. // Invalid command, can't inspect.
...@@ -381,7 +399,7 @@ public final class ProBKernel extends BaseKernel { ...@@ -381,7 +399,7 @@ public final class ProBKernel extends BaseKernel {
} }
} else { } else {
// The code is not a valid command, ask :eval to inspect. // The code is not a valid command, ask :eval to inspect.
return this.getCommands().get(":eval").inspect(code, at); return inspectCommandArguments(this.getCommands().get(":eval"), code, at);
} }
} }
......
package de.prob2.jupyter; package de.prob2.jupyter;
import java.util.Optional;
import com.google.common.base.MoreObjects;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public final class SplitResult { public final class SplitResult {
private final @NotNull SplitArguments arguments; private final @NotNull SplitArguments arguments;
private final @Nullable Parameter<?> parameterAtPosition;
private final @NotNull PositionedString remaining; private final @NotNull PositionedString remaining;
public SplitResult(final @NotNull SplitArguments arguments, final @NotNull PositionedString remaining) { public SplitResult(final @NotNull SplitArguments arguments, final @Nullable Parameter<?> parameterAtPosition, final @NotNull PositionedString remaining) {
super(); super();
this.arguments = arguments; this.arguments = arguments;
this.parameterAtPosition = parameterAtPosition;
this.remaining = remaining; this.remaining = remaining;
} }
...@@ -17,7 +24,20 @@ public final class SplitResult { ...@@ -17,7 +24,20 @@ public final class SplitResult {
return this.arguments; return this.arguments;
} }
public @NotNull Optional<Parameter<?>> getParameterAtPosition() {
return Optional.ofNullable(this.parameterAtPosition);
}
public @NotNull PositionedString getRemaining() { public @NotNull PositionedString getRemaining() {
return this.remaining; return this.remaining;
} }
@Override
public String toString() {
return MoreObjects.toStringHelper(this)
.add("arguments", this.getArguments())
.add("parameterAtPosition", this.getParameterAtPosition())
.add("remaining", this.getRemaining())
.toString();
}
} }
...@@ -12,6 +12,7 @@ import de.prob.statespace.AnimationSelector; ...@@ -12,6 +12,7 @@ import de.prob.statespace.AnimationSelector;
import de.prob2.jupyter.Command; import de.prob2.jupyter.Command;
import de.prob2.jupyter.CommandUtils; import de.prob2.jupyter.CommandUtils;
import de.prob2.jupyter.Parameter; import de.prob2.jupyter.Parameter;
import de.prob2.jupyter.ParameterInspectors;
import de.prob2.jupyter.Parameters; import de.prob2.jupyter.Parameters;
import de.prob2.jupyter.ParsedArguments; import de.prob2.jupyter.ParsedArguments;
import de.prob2.jupyter.ProBKernel; import de.prob2.jupyter.ProBKernel;
...@@ -22,7 +23,6 @@ import io.github.spencerpark.jupyter.kernel.display.DisplayData; ...@@ -22,7 +23,6 @@ import io.github.spencerpark.jupyter.kernel.display.DisplayData;
import io.github.spencerpark.jupyter.kernel.display.mime.MIMEType; import io.github.spencerpark.jupyter.kernel.display.mime.MIMEType;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public final class AssertCommand implements Command { public final class AssertCommand implements Command {
private static final @NotNull Parameter.RequiredSingle FORMULA_PARAM = Parameter.requiredRemainder("formula"); private static final @NotNull Parameter.RequiredSingle FORMULA_PARAM = Parameter.requiredRemainder("formula");
...@@ -84,8 +84,10 @@ public final class AssertCommand implements Command { ...@@ -84,8 +84,10 @@ public final class AssertCommand implements Command {
} }
@Override @Override
public @Nullable DisplayData inspect(final @NotNull String argString, final int at) { public @NotNull ParameterInspectors getParameterInspectors() {
return CommandUtils.inspectInBExpression(this.animationSelector.getCurrentTrace(), argString, at); return new ParameterInspectors(Collections.singletonMap(
FORMULA_PARAM, CommandUtils.bExpressionInspector(this.animationSelector.getCurrentTrace())
));
} }
@Override @Override
......
...@@ -12,6 +12,7 @@ import de.prob.statespace.LoadedMachine; ...@@ -12,6 +12,7 @@ import de.prob.statespace.LoadedMachine;
import de.prob.statespace.Trace; import de.prob.statespace.Trace;
import de.prob.statespace.Transition; import de.prob.statespace.Transition;
import de.prob2.jupyter.Command; import de.prob2.jupyter.Command;
import de.prob2.jupyter.ParameterInspectors;
import de.prob2.jupyter.Parameters; import de.prob2.jupyter.Parameters;
import de.prob2.jupyter.ParsedArguments; import de.prob2.jupyter.ParsedArguments;
...@@ -90,8 +91,8 @@ public final class BrowseCommand implements Command { ...@@ -90,8 +91,8 @@ public final class BrowseCommand implements Command {
} }
@Override @Override
public @Nullable DisplayData inspect(final @NotNull String argString, final int at) { public @NotNull ParameterInspectors getParameterInspectors() {
return null; return ParameterInspectors.NONE;
} }
@Override @Override
......
...@@ -3,6 +3,7 @@ package de.prob2.jupyter.commands; ...@@ -3,6 +3,7 @@ package de.prob2.jupyter.commands;
import com.google.inject.Inject; import com.google.inject.Inject;
import de.prob2.jupyter.Command; import de.prob2.jupyter.Command;
import de.prob2.jupyter.ParameterInspectors;
import de.prob2.jupyter.Parameters; import de.prob2.jupyter.Parameters;
import de.prob2.jupyter.ParsedArguments; import de.prob2.jupyter.ParsedArguments;
...@@ -53,8 +54,8 @@ public final class BsymbCommand implements Command { ...@@ -53,8 +54,8 @@ public final class BsymbCommand implements Command {
} }
@Override @Override
public @Nullable DisplayData inspect(final @NotNull String argString, final int at) { public @NotNull ParameterInspectors getParameterInspectors() {
return null; return ParameterInspectors.NONE;
} }
@Override @Override
......
...@@ -23,6 +23,7 @@ import de.prob.unicode.UnicodeTranslator; ...@@ -23,6 +23,7 @@ import de.prob.unicode.UnicodeTranslator;
import de.prob2.jupyter.Command; import de.prob2.jupyter.Command;
import de.prob2.jupyter.CommandUtils; import de.prob2.jupyter.CommandUtils;
import de.prob2.jupyter.Parameter; import de.prob2.jupyter.Parameter;
import de.prob2.jupyter.ParameterInspectors;
import de.prob2.jupyter.Parameters; import de.prob2.jupyter.Parameters;
import de.prob2.jupyter.ParsedArguments; import de.prob2.jupyter.ParsedArguments;
import de.prob2.jupyter.UserErrorException; import de.prob2.jupyter.UserErrorException;
...@@ -31,7 +32,6 @@ import io.github.spencerpark.jupyter.kernel.ReplacementOptions; ...@@ -31,7 +32,6 @@ import io.github.spencerpark.jupyter.kernel.ReplacementOptions;
import io.github.spencerpark.jupyter.kernel.display.DisplayData; import io.github.spencerpark.jupyter.kernel.display.DisplayData;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public final class CheckCommand implements Command { public final class CheckCommand implements Command {
private static final @NotNull Parameter.RequiredSingle WHAT_PARAM = Parameter.required("what"); private static final @NotNull Parameter.RequiredSingle WHAT_PARAM = Parameter.required("what");
...@@ -113,8 +113,8 @@ public final class CheckCommand implements Command { ...@@ -113,8 +113,8 @@ public final class CheckCommand implements Command {
} }
@Override @Override
public @Nullable DisplayData inspect(final @NotNull String argString, final int at) { public @NotNull ParameterInspectors getParameterInspectors() {
return null; return ParameterInspectors.NONE;
} }
@Override @Override
......
...@@ -13,6 +13,7 @@ import de.prob.statespace.Transition; ...@@ -13,6 +13,7 @@ import de.prob.statespace.Transition;
import de.prob2.jupyter.Command; import de.prob2.jupyter.Command;
import de.prob2.jupyter.CommandUtils; import de.prob2.jupyter.CommandUtils;
import de.prob2.jupyter.Parameter; import de.prob2.jupyter.Parameter;
import de.prob2.jupyter.ParameterInspectors;
import de.prob2.jupyter.Parameters; import de.prob2.jupyter.Parameters;
import de.prob2.jupyter.ParsedArguments; import de.prob2.jupyter.ParsedArguments;
import de.prob2.jupyter.ProBKernel; import de.prob2.jupyter.ProBKernel;
...@@ -21,7 +22,6 @@ import io.github.spencerpark.jupyter.kernel.ReplacementOptions; ...@@ -21,7 +22,6 @@ import io.github.spencerpark.jupyter.kernel.ReplacementOptions;
import io.github.spencerpark.jupyter.kernel.display.DisplayData; import io.github.spencerpark.jupyter.kernel.display.DisplayData;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public final class ConstantsCommand implements Command { public final class ConstantsCommand implements Command {
private static final @NotNull Parameter.OptionalSingle PREDICATE_PARAM = Parameter.optionalRemainder("predicate"); private static final @NotNull Parameter.OptionalSingle PREDICATE_PARAM = Parameter.optionalRemainder("predicate");
...@@ -80,8 +80,10 @@ public final class ConstantsCommand implements Command { ...@@ -80,8 +80,10 @@ public final class ConstantsCommand implements Command {
} }
@Override @Override
public @Nullable DisplayData inspect(final @NotNull String argString, final int at) { public @NotNull ParameterInspectors getParameterInspectors() {
return CommandUtils.inspectInBExpression(this.animationSelector.getCurrentTrace(), argString, at); return new ParameterInspectors(Collections.singletonMap(
PREDICATE_PARAM, CommandUtils.bExpressionInspector(this.animationSelector.getCurrentTrace())
));
} }
@Override @Override
......
...@@ -10,6 +10,7 @@ import java.util.List; ...@@ -10,6 +10,7 @@ import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
import com.google.common.collect.ImmutableMap;
import com.google.inject.Inject; import com.google.inject.Inject;
import com.google.inject.Provider; import com.google.inject.Provider;
...@@ -23,6 +24,7 @@ import de.prob.statespace.Trace; ...@@ -23,6 +24,7 @@ import de.prob.statespace.Trace;
import de.prob2.jupyter.Command; import de.prob2.jupyter.Command;
import de.prob2.jupyter.CommandUtils; import de.prob2.jupyter.CommandUtils;
import de.prob2.jupyter.Parameter; import de.prob2.jupyter.Parameter;
import de.prob2.jupyter.ParameterInspectors;
import de.prob2.jupyter.Parameters; import de.prob2.jupyter.Parameters;
import de.prob2.jupyter.ParsedArguments; import de.prob2.jupyter.ParsedArguments;
import de.prob2.jupyter.ProBKernel; import de.prob2.jupyter.ProBKernel;
...@@ -135,12 +137,11 @@ public final class DotCommand implements Command { ...@@ -135,12 +137,11 @@ public final class DotCommand implements Command {
} }
@Override @Override
public @Nullable DisplayData inspect(final @NotNull String argString, final int at) { public @NotNull ParameterInspectors getParameterInspectors() {
return CommandUtils.inspectArgs( return new ParameterInspectors(ImmutableMap.of(
argString, at, COMMAND_PARAM, (commandName, at) -> null, // TODO
(commandName, at0) -> null, // TODO FORMULA_PARAM, CommandUtils.bExpressionInspector(this.animationSelector.getCurrentTrace())
CommandUtils.bExpressionInspector(this.animationSelector.getCurrentTrace()) ));
);
} }
@Override @Override
......
...@@ -10,6 +10,7 @@ import de.prob.statespace.AnimationSelector; ...@@ -10,6 +10,7 @@ import de.prob.statespace.AnimationSelector;
import de.prob2.jupyter.Command; import de.prob2.jupyter.Command;
import de.prob2.jupyter.CommandUtils; import de.prob2.jupyter.CommandUtils;
import de.prob2.jupyter.Parameter; import de.prob2.jupyter.Parameter;
import de.prob2.jupyter.ParameterInspectors;
import de.prob2.jupyter.Parameters; import de.prob2.jupyter.Parameters;
import de.prob2.jupyter.ParsedArguments; import de.prob2.jupyter.ParsedArguments;
import de.prob2.jupyter.ProBKernel; import de.prob2.jupyter.ProBKernel;
...@@ -18,7 +19,6 @@ import io.github.spencerpark.jupyter.kernel.ReplacementOptions; ...@@ -18,7 +19,6 @@ import io.github.spencerpark.jupyter.kernel.ReplacementOptions;
import io.github.spencerpark.jupyter.kernel.display.DisplayData; import io.github.spencerpark.jupyter.kernel.display.DisplayData;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public final class EvalCommand implements Command { public final class EvalCommand implements Command {
private static final @NotNull Parameter.RequiredSingle FORMULA_PARAM = Parameter.requiredRemainder("formula"); private static final @NotNull Parameter.RequiredSingle FORMULA_PARAM = Parameter.requiredRemainder("formula");
...@@ -67,8 +67,10 @@ public final class EvalCommand implements Command { ...@@ -67,8 +67,10 @@ public final class EvalCommand implements Command {
} }
@Override @Override
public @Nullable DisplayData inspect(final @NotNull String argString, final int at) { public @NotNull ParameterInspectors getParameterInspectors() {
return CommandUtils.inspectInBExpression(this.animationSelector.getCurrentTrace(), argString, at); return new ParameterInspectors(Collections.singletonMap(
FORMULA_PARAM, CommandUtils.bExpressionInspector(this.animationSelector.getCurrentTrace())
));
} }
@Override @Override
......
...@@ -5,6 +5,7 @@ import java.util.Collections; ...@@ -5,6 +5,7 @@ import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import com.google.common.collect.ImmutableMap;
import com.google.inject.Inject; import com.google.inject.Inject;
import com.google.inject.Provider; import com.google.inject.Provider;
...@@ -15,6 +16,7 @@ import de.prob.statespace.Transition; ...@@ -15,6 +16,7 @@ import de.prob.statespace.Transition;
import de.prob2.jupyter.Command; import de.prob2.jupyter.Command;
import de.prob2.jupyter.CommandUtils; import de.prob2.jupyter.CommandUtils;
import de.prob2.jupyter.Parameter; import de.prob2.jupyter.Parameter;
import de.prob2.jupyter.ParameterInspectors;
import de.prob2.jupyter.Parameters; import de.prob2.jupyter.Parameters;
import de.prob2.jupyter.ParsedArguments; import de.prob2.jupyter.ParsedArguments;
import de.prob2.jupyter.ProBKernel; import de.prob2.jupyter.ProBKernel;
...@@ -86,12 +88,11 @@ public final class ExecCommand implements Command { ...@@ -86,12 +88,11 @@ public final class ExecCommand implements Command {
} }
@Override @Override
public @Nullable DisplayData inspect(final @NotNull String argString, final int at) { public @NotNull ParameterInspectors getParameterInspectors() {
return CommandUtils.inspectArgs( return new ParameterInspectors(ImmutableMap.of(
argString, at, OPERATION_PARAM, (operation, at) -> null, // TODO
(operation, at0) -> null, // TODO PREDICATE_PARAM, CommandUtils.bExpressionInspector(this.animationSelector.getCurrentTrace())
CommandUtils.bExpressionInspector(this.animationSelector.getCurrentTrace()) ));
);
} }
@Override @Override
......
...@@ -12,6 +12,7 @@ import de.prob.statespace.Trace; ...@@ -12,6 +12,7 @@ import de.prob.statespace.Trace;
import de.prob2.jupyter.Command; import de.prob2.jupyter.Command;
import de.prob2.jupyter.CommandUtils; import de.prob2.jupyter.CommandUtils;
import de.prob2.jupyter.Parameter; import de.prob2.jupyter.Parameter;
import de.prob2.jupyter.ParameterInspectors;
import de.prob2.jupyter.Parameters; import de.prob2.jupyter.Parameters;
import de.prob2.jupyter.ParsedArguments; import de.prob2.jupyter.ParsedArguments;
import de.prob2.jupyter.ProBKernel; import de.prob2.jupyter.ProBKernel;
...@@ -20,7 +21,6 @@ import io.github.spencerpark.jupyter.kernel.ReplacementOptions; ...@@ -20,7 +21,6 @@ import io.github.spencerpark.jupyter.kernel.ReplacementOptions;
import io.github.spencerpark.jupyter.kernel.display.DisplayData; import io.github.spencerpark.jupyter.kernel.display.DisplayData;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public final class FindCommand implements Command { public final class FindCommand implements Command {
private static final @NotNull Parameter.RequiredSingle PREDICATE_PARAM = Parameter.requiredRemainder("predicate"); private static final @NotNull Parameter.RequiredSingle PREDICATE_PARAM = Parameter.requiredRemainder("predicate");
...@@ -75,8 +75,10 @@ public final class FindCommand implements Command { ...@@ -75,8 +75,10 @@ public final class FindCommand implements Command {
} }
@Override @Override
public @Nullable DisplayData inspect(final @NotNull String argString, final int at) { public @NotNull ParameterInspectors getParameterInspectors() {
return CommandUtils.inspectInBExpression(this.animationSelector.getCurrentTrace(), argString, at); return new ParameterInspectors(Collections.singletonMap(
PREDICATE_PARAM, CommandUtils.bExpressionInspector(this.animationSelector.getCurrentTrace())
));
} }
@Override @Override
......
...@@ -8,6 +8,7 @@ import de.prob.statespace.AnimationSelector; ...@@ -8,6 +8,7 @@ import de.prob.statespace.AnimationSelector;
import de.prob.statespace.Trace; import de.prob.statespace.Trace;
import de.prob2.jupyter.Command; import de.prob2.jupyter.Command;
import de.prob2.jupyter.Parameter; import de.prob2.jupyter.Parameter;
import de.prob2.jupyter.ParameterInspectors;
import de.prob2.jupyter.Parameters; import de.prob2.jupyter.Parameters;
import de.prob2.jupyter.ParsedArguments; import de.prob2.jupyter.ParsedArguments;
import de.prob2.jupyter.UserErrorException; import de.prob2.jupyter.UserErrorException;
...@@ -68,8 +69,8 @@ public final class GotoCommand implements Command { ...@@ -68,8 +69,8 @@ public final class GotoCommand implements Command {
} }
@Override @Override
public @Nullable DisplayData inspect(final @NotNull String argString, final int at) { public @NotNull ParameterInspectors getParameterInspectors() {
return null; return ParameterInspectors.NONE;
} }
@Override @Override
......
...@@ -12,6 +12,7 @@ import com.google.inject.Injector; ...@@ -12,6 +12,7 @@ import com.google.inject.Injector;
import de.prob.scripting.ScriptEngineProvider; import de.prob.scripting.ScriptEngineProvider;
import de.prob2.jupyter.Command; import de.prob2.jupyter.Command;
import de.prob2.jupyter.Parameter; import de.prob2.jupyter.Parameter;
import de.prob2.jupyter.ParameterInspectors;
import de.prob2.jupyter.Parameters; import de.prob2.jupyter.Parameters;
import de.prob2.jupyter.ParsedArguments; import de.prob2.jupyter.ParsedArguments;
import de.prob2.jupyter.ProBKernel; import de.prob2.jupyter.ProBKernel;
...@@ -76,8 +77,8 @@ public final class GroovyCommand implements Command { ...@@ -76,8 +77,8 @@ public final class GroovyCommand implements Command {
} }
@Override @Override
public @Nullable DisplayData inspect(final @NotNull String argString, final int at) { public @NotNull ParameterInspectors getParameterInspectors() {
return null; return ParameterInspectors.NONE;
} }
@Override @Override
......
...@@ -14,6 +14,7 @@ import com.google.inject.Injector; ...@@ -14,6 +14,7 @@ import com.google.inject.Injector;
import de.prob2.jupyter.Command; import de.prob2.jupyter.Command;
import de.prob2.jupyter.Parameter; import de.prob2.jupyter.Parameter;
import de.prob2.jupyter.ParameterInspectors;
import de.prob2.jupyter.Parameters; import de.prob2.jupyter.Parameters;
import de.prob2.jupyter.ParsedArguments; import de.prob2.jupyter.ParsedArguments;
import de.prob2.jupyter.ProBKernel; import de.prob2.jupyter.ProBKernel;
...@@ -23,7 +24,6 @@ import io.github.spencerpark.jupyter.kernel.ReplacementOptions; ...@@ -23,7 +24,6 @@ import io.github.spencerpark.jupyter.kernel.ReplacementOptions;
import io.github.spencerpark.jupyter.kernel.display.DisplayData; import io.github.spencerpark.jupyter.kernel.display.DisplayData;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public final class HelpCommand implements Command { public final class HelpCommand implements Command {
private static final @NotNull Parameter.OptionalSingle COMMAND_NAME_PARAM = Parameter.optional("commandName"); private static final @NotNull Parameter.OptionalSingle COMMAND_NAME_PARAM = Parameter.optional("commandName");
...@@ -170,8 +170,8 @@ public final class HelpCommand implements Command { ...@@ -170,8 +170,8 @@ public final class HelpCommand implements Command {
} }
@Override @Override
public @Nullable DisplayData inspect(final @NotNull String argString, final int at) { public @NotNull ParameterInspectors getParameterInspectors() {
return null; return ParameterInspectors.NONE;
} }
@Override @Override
......
...@@ -13,6 +13,7 @@ import de.prob.statespace.Transition; ...@@ -13,6 +13,7 @@ import de.prob.statespace.Transition;
import de.prob2.jupyter.Command; import de.prob2.jupyter.Command;
import de.prob2.jupyter.CommandUtils; import de.prob2.jupyter.CommandUtils;
import de.prob2.jupyter.Parameter; import de.prob2.jupyter.Parameter;
import de.prob2.jupyter.ParameterInspectors;
import de.prob2.jupyter.Parameters; import de.prob2.jupyter.Parameters;
import de.prob2.jupyter.ParsedArguments; import de.prob2.jupyter.ParsedArguments;
import de.prob2.jupyter.ProBKernel; import de.prob2.jupyter.ProBKernel;
...@@ -21,7 +22,6 @@ import io.github.spencerpark.jupyter.kernel.ReplacementOptions; ...@@ -21,7 +22,6 @@ import io.github.spencerpark.jupyter.kernel.ReplacementOptions;
import io.github.spencerpark.jupyter.kernel.display.DisplayData; import io.github.spencerpark.jupyter.kernel.display.DisplayData;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public final class InitialiseCommand implements Command { public final class InitialiseCommand implements Command {
private static final @NotNull Parameter.OptionalSingle PREDICATE_PARAM = Parameter.optionalRemainder("predicate"); private static final @NotNull Parameter.OptionalSingle PREDICATE_PARAM = Parameter.optionalRemainder("predicate");
...@@ -80,8 +80,10 @@ public final class InitialiseCommand implements Command { ...@@ -80,8 +80,10 @@ public final class InitialiseCommand implements Command {
} }
@Override @Override
public @Nullable DisplayData inspect(final @NotNull String argString, final int at) { public @NotNull ParameterInspectors getParameterInspectors() {
return CommandUtils.inspectInBExpression(this.animationSelector.getCurrentTrace(), argString, at); return new ParameterInspectors(Collections.singletonMap(
PREDICATE_PARAM, CommandUtils.bExpressionInspector(this.animationSelector.getCurrentTrace())
));
} }
@Override @Override
......
...@@ -12,6 +12,7 @@ import de.prob.statespace.AnimationSelector; ...@@ -12,6 +12,7 @@ import de.prob.statespace.AnimationSelector;
import de.prob2.jupyter.Command; import de.prob2.jupyter.Command;
import de.prob2.jupyter.CommandUtils; import de.prob2.jupyter.CommandUtils;
import de.prob2.jupyter.Parameter; import de.prob2.jupyter.Parameter;
import de.prob2.jupyter.ParameterInspectors;
import de.prob2.jupyter.Parameters; import de.prob2.jupyter.Parameters;
import de.prob2.jupyter.ParsedArguments; import de.prob2.jupyter.ParsedArguments;
import de.prob2.jupyter.ProBKernel; import de.prob2.jupyter.ProBKernel;
...@@ -76,9 +77,9 @@ public final class LetCommand implements Command { ...@@ -76,9 +77,9 @@ public final class LetCommand implements Command {
} }
@Override @Override
public @Nullable DisplayData inspect(final @NotNull String argString, final int at) { public @NotNull ParameterInspectors getParameterInspectors() {
// TODO // TODO
return null; return ParameterInspectors.NONE;
} }
@Override @Override
......
...@@ -4,6 +4,7 @@ import java.nio.file.Paths; ...@@ -4,6 +4,7 @@ import java.nio.file.Paths;
import java.util.Collections; import java.util.Collections;
import java.util.Map; import java.util.Map;
import com.google.common.collect.ImmutableMap;
import com.google.inject.Inject; import com.google.inject.Inject;
import com.google.inject.Provider; import com.google.inject.Provider;
...@@ -13,6 +14,7 @@ import de.prob.statespace.Trace; ...@@ -13,6 +14,7 @@ import de.prob.statespace.Trace;
import de.prob2.jupyter.Command; import de.prob2.jupyter.Command;
import de.prob2.jupyter.CommandUtils; import de.prob2.jupyter.CommandUtils;
import de.prob2.jupyter.Parameter; import de.prob2.jupyter.Parameter;
import de.prob2.jupyter.ParameterInspectors;
import de.prob2.jupyter.Parameters; import de.prob2.jupyter.Parameters;
import de.prob2.jupyter.ParsedArguments; import de.prob2.jupyter.ParsedArguments;
import de.prob2.jupyter.ProBKernel; import de.prob2.jupyter.ProBKernel;
...@@ -84,15 +86,11 @@ public final class LoadCellCommand implements Command { ...@@ -84,15 +86,11 @@ public final class LoadCellCommand implements Command {
} }
@Override @Override
public @Nullable DisplayData inspect(final @NotNull String argString, final int at) { public @NotNull ParameterInspectors getParameterInspectors() {
final int newlinePos = argString.indexOf('\n'); return new ParameterInspectors(ImmutableMap.of(
if (newlinePos == -1 || at < newlinePos) { PREFS_PARAM, CommandUtils.preferencesInspector(this.animationSelector.getCurrentTrace()),
// Cursor is on the first line, provide preference inspections. CODE_PARAM, CommandUtils.bExpressionInspector(this.animationSelector.getCurrentTrace())
return CommandUtils.inspectInPreferences(this.animationSelector.getCurrentTrace(), argString, at); ));
} else {
// Cursor is in the body, provide B inspections.
return CommandUtils.inspectInBExpression(this.animationSelector.getCurrentTrace(), argString, at);
}
} }
@Override @Override
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment