mirror of
https://github.com/openjdk/jdk.git
synced 2026-02-22 16:26:05 +00:00
8133549: Generalize jshell's EditingHistory
Using a generic EditingHistory in jjs Reviewed-by: sundar
This commit is contained in:
parent
165edba622
commit
0e4ffbab48
@ -30,12 +30,10 @@ import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.PrintStream;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.io.Writer;
|
||||
import java.nio.file.Files;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
import jdk.internal.jline.NoInterruptUnixTerminal;
|
||||
import jdk.internal.jline.Terminal;
|
||||
import jdk.internal.jline.TerminalFactory;
|
||||
@ -43,23 +41,28 @@ import jdk.internal.jline.TerminalFactory.Flavor;
|
||||
import jdk.internal.jline.WindowsTerminal;
|
||||
import jdk.internal.jline.console.ConsoleReader;
|
||||
import jdk.internal.jline.console.KeyMap;
|
||||
import jdk.internal.jline.console.completer.Completer;
|
||||
import jdk.internal.jline.console.history.FileHistory;
|
||||
import jdk.internal.jline.extra.EditingHistory;
|
||||
|
||||
class Console implements AutoCloseable {
|
||||
private static final String DOCUMENTATION_SHORTCUT = "\033\133\132"; //Shift-TAB
|
||||
private final ConsoleReader in;
|
||||
private final FileHistory history;
|
||||
private final File historyFile;
|
||||
|
||||
Console(final InputStream cmdin, final PrintStream cmdout, final File historyFile,
|
||||
final Completer completer, final Function<String, String> docHelper) throws IOException {
|
||||
final NashornCompleter completer, final Function<String, String> docHelper) throws IOException {
|
||||
this.historyFile = historyFile;
|
||||
|
||||
TerminalFactory.registerFlavor(Flavor.WINDOWS, isCygwin()? JJSUnixTerminal::new : JJSWindowsTerminal::new);
|
||||
TerminalFactory.registerFlavor(Flavor.UNIX, JJSUnixTerminal::new);
|
||||
in = new ConsoleReader(cmdin, cmdout);
|
||||
in.setExpandEvents(false);
|
||||
in.setHandleUserInterrupt(true);
|
||||
in.setBellEnabled(true);
|
||||
in.setHistory(history = new FileHistory(historyFile));
|
||||
in.setHistory(new EditingHistory(in, Files.readAllLines(historyFile.toPath())) {
|
||||
@Override protected boolean isComplete(CharSequence input) {
|
||||
return completer.isComplete(input.toString());
|
||||
}
|
||||
});
|
||||
in.addCompleter(completer);
|
||||
Runtime.getRuntime().addShutdownHook(new Thread((Runnable)this::saveHistory));
|
||||
bind(DOCUMENTATION_SHORTCUT, (ActionListener)evt -> showDocumentation(docHelper));
|
||||
@ -75,13 +78,17 @@ class Console implements AutoCloseable {
|
||||
}
|
||||
|
||||
private void saveHistory() {
|
||||
try {
|
||||
getHistory().flush();
|
||||
try (Writer out = Files.newBufferedWriter(historyFile.toPath())) {
|
||||
String lineSeparator = System.getProperty("line.separator");
|
||||
|
||||
out.write(getHistory().save()
|
||||
.stream()
|
||||
.collect(Collectors.joining(lineSeparator)));
|
||||
} catch (final IOException exp) {}
|
||||
}
|
||||
|
||||
FileHistory getHistory() {
|
||||
return (FileHistory) in.getHistory();
|
||||
EditingHistory getHistory() {
|
||||
return (EditingHistory) in.getHistory();
|
||||
}
|
||||
|
||||
boolean terminalEditorRunning() {
|
||||
|
||||
@ -36,7 +36,6 @@ import java.util.Set;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.function.Function;
|
||||
import java.util.function.Supplier;
|
||||
import jdk.internal.jline.console.history.FileHistory;
|
||||
import jdk.internal.jline.console.history.History;
|
||||
import jdk.nashorn.api.scripting.AbstractJSObject;
|
||||
import jdk.nashorn.api.scripting.JSObject;
|
||||
@ -61,11 +60,11 @@ final class HistoryObject extends AbstractJSObject {
|
||||
props = Collections.unmodifiableSet(s);
|
||||
}
|
||||
|
||||
private final FileHistory hist;
|
||||
private final History hist;
|
||||
private final PrintWriter err;
|
||||
private final Consumer<String> evaluator;
|
||||
|
||||
HistoryObject(final FileHistory hist, final PrintWriter err,
|
||||
HistoryObject(final History hist, final PrintWriter err,
|
||||
final Consumer<String> evaluator) {
|
||||
this.hist = hist;
|
||||
this.err = err;
|
||||
|
||||
@ -185,6 +185,22 @@ final class NashornCompleter implements Completer {
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isComplete(String input) {
|
||||
try {
|
||||
parser.parse("<shell>", input, null);
|
||||
} catch (final Exception pexp) {
|
||||
// Do we have a parse error at the end of current line?
|
||||
// If so, read more lines from the console.
|
||||
int line = input.split("\n").length;
|
||||
int lastLineLen = input.length() - (input.lastIndexOf("\n") + 1);
|
||||
|
||||
if (isParseErrorAt(pexp, line, lastLineLen)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// Pattern to match a unfinished member selection expression. object part and "."
|
||||
// but property name missing pattern.
|
||||
private static final Pattern SELECT_PROP_MISSING = Pattern.compile(".*\\.\\s*");
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user