From 65c6345a4528491c4e4b3924efe15a6d6d24f311 Mon Sep 17 00:00:00 2001
From: dgelessus <dgelessus@users.noreply.github.com>
Date: Tue, 16 Jun 2020 15:57:02 +0200
Subject: [PATCH] Change CommandUtils argument parsing methods to accept
 PositionedString

---
 .../java/de/prob2/jupyter/CommandUtils.java    | 18 +++++++++---------
 src/main/java/de/prob2/jupyter/ProBKernel.java |  6 +++---
 .../java/de/prob2/jupyter/SplitResult.java     |  4 ++--
 3 files changed, 14 insertions(+), 14 deletions(-)

diff --git a/src/main/java/de/prob2/jupyter/CommandUtils.java b/src/main/java/de/prob2/jupyter/CommandUtils.java
index 9ca689d..cf09dee 100644
--- a/src/main/java/de/prob2/jupyter/CommandUtils.java
+++ b/src/main/java/de/prob2/jupyter/CommandUtils.java
@@ -92,7 +92,7 @@ public final class CommandUtils {
 	 * which means that it will parse any input string without errors
 	 * (although the result might not be meaningful).
 	 * Use {@link #validateSplitArgs(Parameters, SplitResult)} to validate the result of this method,
-	 * or use {@link #parseArgs(Parameters, String)} to perform splitting and validation in a single call.
+	 * or use {@link #parseArgs(Parameters, PositionedString)} to perform splitting and validation in a single call.
 	 * </p>
 	 * 
 	 * @param parameters the parameter specification based on which the arguments should be split
@@ -100,9 +100,9 @@ public final class CommandUtils {
 	 * @param upToPosition the position in the argument string after which to stop splitting
 	 * @return the result of the split operation (see {@link SplitResult} for details)
 	 */
-	public static @NotNull SplitResult splitArgs(final @NotNull Parameters parameters, final @NotNull String argString, final int upToPosition) {
+	public static @NotNull SplitResult splitArgs(final @NotNull Parameters parameters, final @NotNull PositionedString argString, final int upToPosition) {
 		final SplitArguments splitArgs = new SplitArguments(Collections.emptyMap());
-		PositionedString remainingArgs = new PositionedString(argString, 0);
+		PositionedString remainingArgs = argString;
 		if (parameters.getBodyParam().isPresent()) {
 			final Matcher bodySplitMatcher = BODY_SPLIT_PATTERN.matcher(remainingArgs.getValue());
 			if (bodySplitMatcher.find()) {
@@ -155,18 +155,18 @@ public final class CommandUtils {
 	 * which means that it will parse any input string without errors
 	 * (although the result might not be meaningful).
 	 * Use {@link #validateSplitArgs(Parameters, SplitResult)} to validate the result of this method,
-	 * or use {@link #parseArgs(Parameters, String)} to perform splitting and validation in a single call.
+	 * or use {@link #parseArgs(Parameters, PositionedString)} to perform splitting and validation in a single call.
 	 * </p>
 	 * <p>
-	 * This method is equivalent to calling {@link #splitArgs(Parameters, String, int)} with {@code upToPosition} set so that as much as possible of the argument string is consumed.
+	 * This method is equivalent to calling {@link #splitArgs(Parameters, PositionedString, int)} with {@code upToPosition} set so that as much as possible of the argument string is consumed.
 	 * </p>
 	 *
 	 * @param parameters the parameter specification based on which the arguments should be split
 	 * @param argString the argument string to split
 	 * @return the result of the split operation (see {@link SplitResult} for details)
 	 */
-	public static @NotNull SplitResult splitArgs(final @NotNull Parameters parameters, final @NotNull String argString) {
-		return splitArgs(parameters, argString, argString.length());
+	public static @NotNull SplitResult splitArgs(final @NotNull Parameters parameters, final @NotNull PositionedString argString) {
+		return splitArgs(parameters, argString, argString.getStartPosition() + argString.getValue().length());
 	}
 	
 	private static <T> void validateSplitParameter(final @NotNull ParsedArguments parsed, final @NotNull SplitArguments splitArgs, final @NotNull Parameter<T> param) {
@@ -199,14 +199,14 @@ public final class CommandUtils {
 	
 	/**
 	 * Parse an argument string according to the given parameter specification.
-	 * This is a shorthand for calling {@link #splitArgs(Parameters, String)} followed by {@link #validateSplitArgs(Parameters, SplitResult)}.
+	 * This is a shorthand for calling {@link #splitArgs(Parameters, PositionedString)} followed by {@link #validateSplitArgs(Parameters, SplitResult)}.
 	 * 
 	 * @param parameters the parameter specification based on which the argument string should be parsed
 	 * @param argString the argument string to parse
 	 * @return the parsed and validated argument string
 	 * @throws UserErrorException if the argument string is invalid
 	 */
-	public static @NotNull ParsedArguments parseArgs(final @NotNull Parameters parameters, final @NotNull String argString) {
+	public static @NotNull ParsedArguments parseArgs(final @NotNull Parameters parameters, final @NotNull PositionedString argString) {
 		return validateSplitArgs(parameters, splitArgs(parameters, argString));
 	}
 	
diff --git a/src/main/java/de/prob2/jupyter/ProBKernel.java b/src/main/java/de/prob2/jupyter/ProBKernel.java
index da1fd8e..7e5e0bf 100644
--- a/src/main/java/de/prob2/jupyter/ProBKernel.java
+++ b/src/main/java/de/prob2/jupyter/ProBKernel.java
@@ -301,7 +301,7 @@ public final class ProBKernel extends BaseKernel {
 		}
 		final DisplayData result;
 		try {
-			result = command.run(CommandUtils.parseArgs(command.getParameters(), argString));
+			result = command.run(CommandUtils.parseArgs(command.getParameters(), new PositionedString(argString, 0)));
 		} catch (final UserErrorException e) {
 			throw new CommandExecutionException(name, e);
 		}
@@ -355,7 +355,7 @@ 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);
+		final SplitResult split = CommandUtils.splitArgs(command.getParameters(), new PositionedString(argString, 0), at);
 		if (split.getParameterAtPosition().isPresent()) {
 			final Optional<Inspector> inspector = command.getParameterInspectors().getInspectorForParameter(split.getParameterAtPosition().get());
 			if (inspector.isPresent()) {
@@ -412,7 +412,7 @@ public final class ProBKernel extends BaseKernel {
 	}
 	
 	private static @Nullable ReplacementOptions completeCommandArguments(final @NotNull Command command, final @NotNull String argString, final int at) {
-		final SplitResult split = CommandUtils.splitArgs(command.getParameters(), argString, at);
+		final SplitResult split = CommandUtils.splitArgs(command.getParameters(), new PositionedString(argString, 0), at);
 		if (split.getParameterAtPosition().isPresent()) {
 			final Optional<Completer> completer = command.getParameterCompleters().getCompleterForParameter(split.getParameterAtPosition().get());
 			if (completer.isPresent()) {
diff --git a/src/main/java/de/prob2/jupyter/SplitResult.java b/src/main/java/de/prob2/jupyter/SplitResult.java
index ec067a8..cda20c3 100644
--- a/src/main/java/de/prob2/jupyter/SplitResult.java
+++ b/src/main/java/de/prob2/jupyter/SplitResult.java
@@ -8,7 +8,7 @@ import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
 /**
- * The unvalidated result of a command argument splitting operation ({@link CommandUtils#splitArgs(Parameters, String, int)} or {@link CommandUtils#splitArgs(Parameters, String)}).
+ * The unvalidated result of a command argument splitting operation ({@link CommandUtils#splitArgs(Parameters, PositionedString, int)} or {@link CommandUtils#splitArgs(Parameters, PositionedString)}).
  */
 public final class SplitResult {
 	private final @NotNull SplitArguments arguments;
@@ -37,7 +37,7 @@ public final class SplitResult {
 	/**
 	 * Return the parameter to which the last split argument belongs,
 	 * or {@link Optional#empty()} if no arguments have been split.
-	 * This information is mainly useful when calling {@link CommandUtils#splitArgs(Parameters, String, int)} with an explicit {@code upToPosition} argument.
+	 * This information is mainly useful when calling {@link CommandUtils#splitArgs(Parameters, PositionedString, int)} with an explicit {@code upToPosition} argument.
 	 * 
 	 * @return the parameter to which the last split argument belongs,
 	 * or {@link Optional#empty()} if no arguments have been split
-- 
GitLab