From e1266bcdfd64a9ff6cf05220686a9a58d71e9d1d Mon Sep 17 00:00:00 2001
From: dgelessus <dgelessus@users.noreply.github.com>
Date: Mon, 17 Feb 2020 18:17:10 +0100
Subject: [PATCH] Store command names in command classes instead of ProBKernel

This way all information about a command is in a single place.
The ProBKernel class now only needs to contain a list of all commands
that exist, and all other information is obtained from the command
objects.
---
 .../java/de/prob2/jupyter/BsymbCommand.java   |  5 ++
 .../java/de/prob2/jupyter/ProBKernel.java     | 66 ++++++++++---------
 .../prob2/jupyter/commands/AssertCommand.java |  5 ++
 .../prob2/jupyter/commands/BrowseCommand.java |  5 ++
 .../prob2/jupyter/commands/CheckCommand.java  |  5 ++
 .../de/prob2/jupyter/commands/Command.java    |  2 +
 .../jupyter/commands/ConstantsCommand.java    |  5 ++
 .../de/prob2/jupyter/commands/DotCommand.java |  5 ++
 .../prob2/jupyter/commands/EvalCommand.java   |  5 ++
 .../prob2/jupyter/commands/ExecCommand.java   |  5 ++
 .../prob2/jupyter/commands/FindCommand.java   |  5 ++
 .../prob2/jupyter/commands/GotoCommand.java   |  5 ++
 .../prob2/jupyter/commands/GroovyCommand.java |  5 ++
 .../prob2/jupyter/commands/HelpCommand.java   |  5 ++
 .../jupyter/commands/InitialiseCommand.java   |  5 ++
 .../de/prob2/jupyter/commands/LetCommand.java |  5 ++
 .../jupyter/commands/LoadCellCommand.java     |  5 ++
 .../jupyter/commands/LoadFileCommand.java     |  5 ++
 .../jupyter/commands/ModelCheckCommand.java   |  5 ++
 .../prob2/jupyter/commands/PrefCommand.java   |  5 ++
 .../jupyter/commands/PrettyPrintCommand.java  |  5 ++
 .../prob2/jupyter/commands/RenderCommand.java |  5 ++
 .../prob2/jupyter/commands/ShowCommand.java   |  5 ++
 .../prob2/jupyter/commands/SolveCommand.java  |  5 ++
 .../prob2/jupyter/commands/StatsCommand.java  |  5 ++
 .../prob2/jupyter/commands/TableCommand.java  |  5 ++
 .../prob2/jupyter/commands/TimeCommand.java   |  5 ++
 .../prob2/jupyter/commands/TraceCommand.java  |  5 ++
 .../prob2/jupyter/commands/TypeCommand.java   |  5 ++
 .../prob2/jupyter/commands/UnletCommand.java  |  5 ++
 .../jupyter/commands/VersionCommand.java      |  5 ++
 31 files changed, 183 insertions(+), 30 deletions(-)

diff --git a/src/main/java/de/prob2/jupyter/BsymbCommand.java b/src/main/java/de/prob2/jupyter/BsymbCommand.java
index ab782cd..c22ad93 100644
--- a/src/main/java/de/prob2/jupyter/BsymbCommand.java
+++ b/src/main/java/de/prob2/jupyter/BsymbCommand.java
@@ -16,6 +16,11 @@ public final class BsymbCommand implements Command {
 		super();
 	}
 	
+	@Override
+	public @NotNull String getName() {
+		return ":bsymb";
+	}
+	
 	@Override
 	public @NotNull String getSyntax() {
 		return ":bsymb";
diff --git a/src/main/java/de/prob2/jupyter/ProBKernel.java b/src/main/java/de/prob2/jupyter/ProBKernel.java
index 86b60b5..53a6b24 100644
--- a/src/main/java/de/prob2/jupyter/ProBKernel.java
+++ b/src/main/java/de/prob2/jupyter/ProBKernel.java
@@ -4,6 +4,7 @@ import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
@@ -75,6 +76,38 @@ public final class ProBKernel extends BaseKernel {
 	private static final @NotNull Pattern BSYMB_COMMAND_PATTERN = Pattern.compile("\\\\([a-z]+)");
 	private static final @NotNull Pattern LATEX_FORMULA_PATTERN = Pattern.compile("(\\$\\$?)([^\\$]+)\\1");
 	
+	private static final @NotNull Collection<@NotNull Class<? extends Command>> COMMAND_CLASSES = Collections.unmodifiableList(Arrays.asList(
+		HelpCommand.class,
+		VersionCommand.class,
+		EvalCommand.class,
+		TypeCommand.class,
+		TableCommand.class,
+		SolveCommand.class,
+		LetCommand.class,
+		UnletCommand.class,
+		LoadFileCommand.class,
+		LoadCellCommand.class,
+		PrefCommand.class,
+		BrowseCommand.class,
+		TraceCommand.class,
+		StatsCommand.class,
+		ExecCommand.class,
+		ConstantsCommand.class,
+		InitialiseCommand.class,
+		GotoCommand.class,
+		FindCommand.class,
+		ShowCommand.class,
+		DotCommand.class,
+		AssertCommand.class,
+		CheckCommand.class,
+		TimeCommand.class,
+		GroovyCommand.class,
+		RenderCommand.class,
+		BsymbCommand.class,
+		PrettyPrintCommand.class,
+		ModelCheckCommand.class
+	));
+	
 	private static final @NotNull Map<@NotNull String, @NotNull String> BSYMB_COMMAND_DEFINITIONS;
 	static {
 		final Map<String, String> map = new HashMap<>();
@@ -151,36 +184,9 @@ public final class ProBKernel extends BaseKernel {
 		
 		this.animationSelector = animationSelector;
 		
-		this.commands = new HashMap<>();
-		this.commands.put(":help", injector.getInstance(HelpCommand.class));
-		this.commands.put(":version", injector.getInstance(VersionCommand.class));
-		this.commands.put(":eval", injector.getInstance(EvalCommand.class));
-		this.commands.put(":type", injector.getInstance(TypeCommand.class));
-		this.commands.put(":table", injector.getInstance(TableCommand.class));
-		this.commands.put(":solve", injector.getInstance(SolveCommand.class));
-		this.commands.put(":let", injector.getInstance(LetCommand.class));
-		this.commands.put(":unlet", injector.getInstance(UnletCommand.class));
-		this.commands.put(":load", injector.getInstance(LoadFileCommand.class));
-		this.commands.put("::load", injector.getInstance(LoadCellCommand.class));
-		this.commands.put(":pref", injector.getInstance(PrefCommand.class));
-		this.commands.put(":browse", injector.getInstance(BrowseCommand.class));
-		this.commands.put(":trace", injector.getInstance(TraceCommand.class));
-		this.commands.put(":stats", injector.getInstance(StatsCommand.class));
-		this.commands.put(":exec", injector.getInstance(ExecCommand.class));
-		this.commands.put(":constants", injector.getInstance(ConstantsCommand.class));
-		this.commands.put(":init", injector.getInstance(InitialiseCommand.class));
-		this.commands.put(":goto", injector.getInstance(GotoCommand.class));
-		this.commands.put(":find", injector.getInstance(FindCommand.class));
-		this.commands.put(":show", injector.getInstance(ShowCommand.class));
-		this.commands.put(":dot", injector.getInstance(DotCommand.class));
-		this.commands.put(":assert", injector.getInstance(AssertCommand.class));
-		this.commands.put(":check", injector.getInstance(CheckCommand.class));
-		this.commands.put(":time", injector.getInstance(TimeCommand.class));
-		this.commands.put(":groovy", injector.getInstance(GroovyCommand.class));
-		this.commands.put("::render", injector.getInstance(RenderCommand.class));
-		this.commands.put(":bsymb", injector.getInstance(BsymbCommand.class));
-		this.commands.put(":prettyprint", injector.getInstance(PrettyPrintCommand.class));
-		this.commands.put(":modelcheck", injector.getInstance(ModelCheckCommand.class));
+		this.commands = COMMAND_CLASSES.stream()
+			.map(injector::getInstance)
+			.collect(Collectors.toMap(Command::getName, cmd -> cmd));
 		
 		this.variables = new HashMap<>();
 		
diff --git a/src/main/java/de/prob2/jupyter/commands/AssertCommand.java b/src/main/java/de/prob2/jupyter/commands/AssertCommand.java
index ba2d648..f4fe97d 100644
--- a/src/main/java/de/prob2/jupyter/commands/AssertCommand.java
+++ b/src/main/java/de/prob2/jupyter/commands/AssertCommand.java
@@ -29,6 +29,11 @@ public final class AssertCommand implements Command {
 		this.animationSelector = animationSelector;
 	}
 	
+	@Override
+	public @NotNull String getName() {
+		return ":assert";
+	}
+	
 	@Override
 	public @NotNull String getSyntax() {
 		return ":assert PREDICATE";
diff --git a/src/main/java/de/prob2/jupyter/commands/BrowseCommand.java b/src/main/java/de/prob2/jupyter/commands/BrowseCommand.java
index a26229b..f65282f 100644
--- a/src/main/java/de/prob2/jupyter/commands/BrowseCommand.java
+++ b/src/main/java/de/prob2/jupyter/commands/BrowseCommand.java
@@ -32,6 +32,11 @@ public final class BrowseCommand implements Command {
 		this.animationSelector = animationSelector;
 	}
 	
+	@Override
+	public @NotNull String getName() {
+		return ":browse";
+	}
+	
 	@Override
 	public @NotNull String getSyntax() {
 		return ":browse";
diff --git a/src/main/java/de/prob2/jupyter/commands/CheckCommand.java b/src/main/java/de/prob2/jupyter/commands/CheckCommand.java
index e8cdcdb..3897044 100644
--- a/src/main/java/de/prob2/jupyter/commands/CheckCommand.java
+++ b/src/main/java/de/prob2/jupyter/commands/CheckCommand.java
@@ -47,6 +47,11 @@ public final class CheckCommand implements Command {
 		this.animationSelector = animationSelector;
 	}
 	
+	@Override
+	public @NotNull String getName() {
+		return ":check";
+	}
+	
 	@Override
 	public @NotNull String getSyntax() {
 		return ":check WHAT";
diff --git a/src/main/java/de/prob2/jupyter/commands/Command.java b/src/main/java/de/prob2/jupyter/commands/Command.java
index 1e9471c..3552677 100644
--- a/src/main/java/de/prob2/jupyter/commands/Command.java
+++ b/src/main/java/de/prob2/jupyter/commands/Command.java
@@ -7,6 +7,8 @@ import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
 public interface Command {
+	public abstract @NotNull String getName();
+	
 	public abstract @NotNull String getSyntax();
 	
 	public abstract @NotNull String getShortHelp();
diff --git a/src/main/java/de/prob2/jupyter/commands/ConstantsCommand.java b/src/main/java/de/prob2/jupyter/commands/ConstantsCommand.java
index 85e7b39..c541c4e 100644
--- a/src/main/java/de/prob2/jupyter/commands/ConstantsCommand.java
+++ b/src/main/java/de/prob2/jupyter/commands/ConstantsCommand.java
@@ -30,6 +30,11 @@ public final class ConstantsCommand implements Command {
 		this.animationSelector = animationSelector;
 	}
 	
+	@Override
+	public @NotNull String getName() {
+		return ":constants";
+	}
+	
 	@Override
 	public @NotNull String getSyntax() {
 		return ":constants [PREDICATE]";
diff --git a/src/main/java/de/prob2/jupyter/commands/DotCommand.java b/src/main/java/de/prob2/jupyter/commands/DotCommand.java
index a287991..e42637c 100644
--- a/src/main/java/de/prob2/jupyter/commands/DotCommand.java
+++ b/src/main/java/de/prob2/jupyter/commands/DotCommand.java
@@ -40,6 +40,11 @@ public final class DotCommand implements Command {
 		this.animationSelector = animationSelector;
 	}
 	
+	@Override
+	public @NotNull String getName() {
+		return ":dot";
+	}
+	
 	@Override
 	public @NotNull String getSyntax() {
 		return ":dot COMMAND [FORMULA]";
diff --git a/src/main/java/de/prob2/jupyter/commands/EvalCommand.java b/src/main/java/de/prob2/jupyter/commands/EvalCommand.java
index 7999d76..3e63983 100644
--- a/src/main/java/de/prob2/jupyter/commands/EvalCommand.java
+++ b/src/main/java/de/prob2/jupyter/commands/EvalCommand.java
@@ -25,6 +25,11 @@ public final class EvalCommand implements Command {
 		this.animationSelector = animationSelector;
 	}
 	
+	@Override
+	public @NotNull String getName() {
+		return ":eval";
+	}
+	
 	@Override
 	public @NotNull String getSyntax() {
 		return ":eval FORMULA";
diff --git a/src/main/java/de/prob2/jupyter/commands/ExecCommand.java b/src/main/java/de/prob2/jupyter/commands/ExecCommand.java
index 9413830..e41a07e 100644
--- a/src/main/java/de/prob2/jupyter/commands/ExecCommand.java
+++ b/src/main/java/de/prob2/jupyter/commands/ExecCommand.java
@@ -31,6 +31,11 @@ public final class ExecCommand implements Command {
 		this.animationSelector = animationSelector;
 	}
 	
+	@Override
+	public @NotNull String getName() {
+		return ":exec";
+	}
+	
 	@Override
 	public @NotNull String getSyntax() {
 		return ":exec OPERATION [PREDICATE]";
diff --git a/src/main/java/de/prob2/jupyter/commands/FindCommand.java b/src/main/java/de/prob2/jupyter/commands/FindCommand.java
index c85a972..d9ee3c6 100644
--- a/src/main/java/de/prob2/jupyter/commands/FindCommand.java
+++ b/src/main/java/de/prob2/jupyter/commands/FindCommand.java
@@ -27,6 +27,11 @@ public final class FindCommand implements Command {
 		this.animationSelector = animationSelector;
 	}
 	
+	@Override
+	public @NotNull String getName() {
+		return ":find";
+	}
+	
 	@Override
 	public @NotNull String getSyntax() {
 		return ":find PREDICATE";
diff --git a/src/main/java/de/prob2/jupyter/commands/GotoCommand.java b/src/main/java/de/prob2/jupyter/commands/GotoCommand.java
index c247816..497202e 100644
--- a/src/main/java/de/prob2/jupyter/commands/GotoCommand.java
+++ b/src/main/java/de/prob2/jupyter/commands/GotoCommand.java
@@ -23,6 +23,11 @@ public final class GotoCommand implements Command {
 		this.animationSelector = animationSelector;
 	}
 	
+	@Override
+	public @NotNull String getName() {
+		return ":goto";
+	}
+	
 	@Override
 	public @NotNull String getSyntax() {
 		return ":goto INDEX";
diff --git a/src/main/java/de/prob2/jupyter/commands/GroovyCommand.java b/src/main/java/de/prob2/jupyter/commands/GroovyCommand.java
index 8a0a1e4..e8fc3e8 100644
--- a/src/main/java/de/prob2/jupyter/commands/GroovyCommand.java
+++ b/src/main/java/de/prob2/jupyter/commands/GroovyCommand.java
@@ -30,6 +30,11 @@ public final class GroovyCommand implements Command {
 		this.groovyScriptEngine = scriptEngineProvider.get();
 	}
 	
+	@Override
+	public @NotNull String getName() {
+		return ":groovy";
+	}
+	
 	@Override
 	public @NotNull String getSyntax() {
 		return ":groovy EXPRESSION";
diff --git a/src/main/java/de/prob2/jupyter/commands/HelpCommand.java b/src/main/java/de/prob2/jupyter/commands/HelpCommand.java
index 31badb3..5121368 100644
--- a/src/main/java/de/prob2/jupyter/commands/HelpCommand.java
+++ b/src/main/java/de/prob2/jupyter/commands/HelpCommand.java
@@ -26,6 +26,11 @@ public final class HelpCommand implements Command {
 		this.injector = injector;
 	}
 	
+	@Override
+	public @NotNull String getName() {
+		return ":help";
+	}
+	
 	@Override
 	public @NotNull String getSyntax() {
 		return ":help [COMMAND]";
diff --git a/src/main/java/de/prob2/jupyter/commands/InitialiseCommand.java b/src/main/java/de/prob2/jupyter/commands/InitialiseCommand.java
index 3e91bb6..f67f808 100644
--- a/src/main/java/de/prob2/jupyter/commands/InitialiseCommand.java
+++ b/src/main/java/de/prob2/jupyter/commands/InitialiseCommand.java
@@ -30,6 +30,11 @@ public final class InitialiseCommand implements Command {
 		this.animationSelector = animationSelector;
 	}
 	
+	@Override
+	public @NotNull String getName() {
+		return ":init";
+	}
+	
 	@Override
 	public @NotNull String getSyntax() {
 		return ":init [PREDICATE]";
diff --git a/src/main/java/de/prob2/jupyter/commands/LetCommand.java b/src/main/java/de/prob2/jupyter/commands/LetCommand.java
index f71d3bc..35669d3 100644
--- a/src/main/java/de/prob2/jupyter/commands/LetCommand.java
+++ b/src/main/java/de/prob2/jupyter/commands/LetCommand.java
@@ -30,6 +30,11 @@ public final class LetCommand implements Command {
 		this.animationSelector = animationSelector;
 	}
 	
+	@Override
+	public @NotNull String getName() {
+		return ":let";
+	}
+	
 	@Override
 	public @NotNull String getSyntax() {
 		return ":let NAME EXPR";
diff --git a/src/main/java/de/prob2/jupyter/commands/LoadCellCommand.java b/src/main/java/de/prob2/jupyter/commands/LoadCellCommand.java
index c8a482b..08ee240 100644
--- a/src/main/java/de/prob2/jupyter/commands/LoadCellCommand.java
+++ b/src/main/java/de/prob2/jupyter/commands/LoadCellCommand.java
@@ -37,6 +37,11 @@ public final class LoadCellCommand implements Command {
 		this.proBKernelProvider = proBKernelProvider;
 	}
 	
+	@Override
+	public @NotNull String getName() {
+		return "::load";
+	}
+	
 	@Override
 	public @NotNull String getSyntax() {
 		return "::load [PREF=VALUE ...]\nMACHINE\n...\nEND";
diff --git a/src/main/java/de/prob2/jupyter/commands/LoadFileCommand.java b/src/main/java/de/prob2/jupyter/commands/LoadFileCommand.java
index a9ab661..04fb385 100644
--- a/src/main/java/de/prob2/jupyter/commands/LoadFileCommand.java
+++ b/src/main/java/de/prob2/jupyter/commands/LoadFileCommand.java
@@ -49,6 +49,11 @@ public final class LoadFileCommand implements Command {
 		this.proBKernelProvider = proBKernelProvider;
 	}
 	
+	@Override
+	public @NotNull String getName() {
+		return ":load";
+	}
+	
 	@Override
 	public @NotNull String getSyntax() {
 		return ":load FILENAME [PREF=VALUE ...]";
diff --git a/src/main/java/de/prob2/jupyter/commands/ModelCheckCommand.java b/src/main/java/de/prob2/jupyter/commands/ModelCheckCommand.java
index 1c49d6e..e29022d 100644
--- a/src/main/java/de/prob2/jupyter/commands/ModelCheckCommand.java
+++ b/src/main/java/de/prob2/jupyter/commands/ModelCheckCommand.java
@@ -39,6 +39,11 @@ public final class ModelCheckCommand implements Command {
 		this.animationSelector = animationSelector;
 	}
 	
+	@Override
+	public @NotNull String getName() {
+		return ":modelcheck";
+	}
+	
 	@Override
 	public @NotNull String getSyntax() {
 		return ":modelcheck";
diff --git a/src/main/java/de/prob2/jupyter/commands/PrefCommand.java b/src/main/java/de/prob2/jupyter/commands/PrefCommand.java
index ff9eb38..28df02a 100644
--- a/src/main/java/de/prob2/jupyter/commands/PrefCommand.java
+++ b/src/main/java/de/prob2/jupyter/commands/PrefCommand.java
@@ -30,6 +30,11 @@ public final class PrefCommand implements Command {
 		this.animationSelector = animationSelector;
 	}
 	
+	@Override
+	public @NotNull String getName() {
+		return ":pref";
+	}
+	
 	@Override
 	public @NotNull String getSyntax() {
 		return ":pref [NAME ...]\n:pref NAME=VALUE [NAME=VALUE ...]";
diff --git a/src/main/java/de/prob2/jupyter/commands/PrettyPrintCommand.java b/src/main/java/de/prob2/jupyter/commands/PrettyPrintCommand.java
index 118eed3..9df9783 100644
--- a/src/main/java/de/prob2/jupyter/commands/PrettyPrintCommand.java
+++ b/src/main/java/de/prob2/jupyter/commands/PrettyPrintCommand.java
@@ -23,6 +23,11 @@ public final class PrettyPrintCommand implements Command {
 		this.animationSelector = animationSelector;
 	}
 	
+	@Override
+	public @NotNull String getName() {
+		return ":prettyprint";
+	}
+	
 	@Override
 	public @NotNull String getSyntax() {
 		return ":prettyprint PREDICATE";
diff --git a/src/main/java/de/prob2/jupyter/commands/RenderCommand.java b/src/main/java/de/prob2/jupyter/commands/RenderCommand.java
index aa5b871..3b46ff3 100644
--- a/src/main/java/de/prob2/jupyter/commands/RenderCommand.java
+++ b/src/main/java/de/prob2/jupyter/commands/RenderCommand.java
@@ -16,6 +16,11 @@ public final class RenderCommand implements Command {
 		super();
 	}
 	
+	@Override
+	public @NotNull String getName() {
+		return "::render";
+	}
+	
 	@Override
 	public @NotNull String getSyntax() {
 		return "::render MIMETYPE\nCONTENT";
diff --git a/src/main/java/de/prob2/jupyter/commands/ShowCommand.java b/src/main/java/de/prob2/jupyter/commands/ShowCommand.java
index e849cdc..0c8a2e6 100644
--- a/src/main/java/de/prob2/jupyter/commands/ShowCommand.java
+++ b/src/main/java/de/prob2/jupyter/commands/ShowCommand.java
@@ -36,6 +36,11 @@ public final class ShowCommand implements Command {
 		this.proBKernelProvider = proBKernelProvider;
 	}
 	
+	@Override
+	public @NotNull String getName() {
+		return ":show";
+	}
+	
 	@Override
 	public @NotNull String getSyntax() {
 		return ":show";
diff --git a/src/main/java/de/prob2/jupyter/commands/SolveCommand.java b/src/main/java/de/prob2/jupyter/commands/SolveCommand.java
index 1e6887d..31f2d10 100644
--- a/src/main/java/de/prob2/jupyter/commands/SolveCommand.java
+++ b/src/main/java/de/prob2/jupyter/commands/SolveCommand.java
@@ -38,6 +38,11 @@ public final class SolveCommand implements Command {
 		this.animationSelector = animationSelector;
 	}
 	
+	@Override
+	public @NotNull String getName() {
+		return ":solve";
+	}
+	
 	@Override
 	public @NotNull String getSyntax() {
 		return ":solve SOLVER PREDICATE";
diff --git a/src/main/java/de/prob2/jupyter/commands/StatsCommand.java b/src/main/java/de/prob2/jupyter/commands/StatsCommand.java
index a693fb9..c26f7c1 100644
--- a/src/main/java/de/prob2/jupyter/commands/StatsCommand.java
+++ b/src/main/java/de/prob2/jupyter/commands/StatsCommand.java
@@ -24,6 +24,11 @@ public final class StatsCommand implements Command {
 		this.animationSelector = animationSelector;
 	}
 	
+	@Override
+	public @NotNull String getName() {
+		return ":stats";
+	}
+	
 	@Override
 	public @NotNull String getSyntax() {
 		return ":stats";
diff --git a/src/main/java/de/prob2/jupyter/commands/TableCommand.java b/src/main/java/de/prob2/jupyter/commands/TableCommand.java
index 0e335fb..fca1b6f 100644
--- a/src/main/java/de/prob2/jupyter/commands/TableCommand.java
+++ b/src/main/java/de/prob2/jupyter/commands/TableCommand.java
@@ -36,6 +36,11 @@ public final class TableCommand implements Command {
 		this.animationSelector = animationSelector;
 	}
 	
+	@Override
+	public @NotNull String getName() {
+		return ":table";
+	}
+	
 	@Override
 	public @NotNull String getSyntax() {
 		return ":table EXPRESSION";
diff --git a/src/main/java/de/prob2/jupyter/commands/TimeCommand.java b/src/main/java/de/prob2/jupyter/commands/TimeCommand.java
index 7aee70f..c9270d8 100644
--- a/src/main/java/de/prob2/jupyter/commands/TimeCommand.java
+++ b/src/main/java/de/prob2/jupyter/commands/TimeCommand.java
@@ -25,6 +25,11 @@ public final class TimeCommand implements Command {
 		this.injector = injector;
 	}
 	
+	@Override
+	public @NotNull String getName() {
+		return ":time";
+	}
+	
 	@Override
 	public @NotNull String getSyntax() {
 		return ":time COMMAND [ARGS ...]";
diff --git a/src/main/java/de/prob2/jupyter/commands/TraceCommand.java b/src/main/java/de/prob2/jupyter/commands/TraceCommand.java
index 4d61435..773f1bc 100644
--- a/src/main/java/de/prob2/jupyter/commands/TraceCommand.java
+++ b/src/main/java/de/prob2/jupyter/commands/TraceCommand.java
@@ -26,6 +26,11 @@ public final class TraceCommand implements Command {
 		this.animationSelector = animationSelector;
 	}
 	
+	@Override
+	public @NotNull String getName() {
+		return ":trace";
+	}
+	
 	@Override
 	public @NotNull String getSyntax() {
 		return ":trace";
diff --git a/src/main/java/de/prob2/jupyter/commands/TypeCommand.java b/src/main/java/de/prob2/jupyter/commands/TypeCommand.java
index 4a444af..8c0de73 100644
--- a/src/main/java/de/prob2/jupyter/commands/TypeCommand.java
+++ b/src/main/java/de/prob2/jupyter/commands/TypeCommand.java
@@ -29,6 +29,11 @@ public final class TypeCommand implements Command {
 		this.animationSelector = animationSelector;
 	}
 	
+	@Override
+	public @NotNull String getName() {
+		return ":type";
+	}
+	
 	@Override
 	public @NotNull String getSyntax() {
 		return ":type FORMULA";
diff --git a/src/main/java/de/prob2/jupyter/commands/UnletCommand.java b/src/main/java/de/prob2/jupyter/commands/UnletCommand.java
index cae424e..3c90e9f 100644
--- a/src/main/java/de/prob2/jupyter/commands/UnletCommand.java
+++ b/src/main/java/de/prob2/jupyter/commands/UnletCommand.java
@@ -24,6 +24,11 @@ public final class UnletCommand implements Command {
 		this.injector = injector;
 	}
 	
+	@Override
+	public @NotNull String getName() {
+		return ":unlet";
+	}
+	
 	@Override
 	public @NotNull String getSyntax() {
 		return ":unlet NAME";
diff --git a/src/main/java/de/prob2/jupyter/commands/VersionCommand.java b/src/main/java/de/prob2/jupyter/commands/VersionCommand.java
index 82af3da..c71915f 100644
--- a/src/main/java/de/prob2/jupyter/commands/VersionCommand.java
+++ b/src/main/java/de/prob2/jupyter/commands/VersionCommand.java
@@ -22,6 +22,11 @@ public final class VersionCommand implements Command {
 		this.animationSelector = animationSelector;
 	}
 	
+	@Override
+	public @NotNull String getName() {
+		return ":version";
+	}
+	
 	@Override
 	public @NotNull String getSyntax() {
 		return ":version";
-- 
GitLab