Добавлен обработчик консольного ввода JLine

This commit is contained in:
Victor 2018-03-09 14:23:09 +02:00
parent cc4bd1f6af
commit 9353bf9d20
5 changed files with 100 additions and 7 deletions

View File

@ -93,6 +93,7 @@ dependencies {
} }
compile 'org.json:json:20160212' compile 'org.json:json:20160212'
compile 'org.yaml:snakeyaml:1.17' compile 'org.yaml:snakeyaml:1.17'
compile 'jline:jline:2.14.5'
testCompile 'junit:junit:4.12' testCompile 'junit:junit:4.12'
testCompile 'org.openjdk.jmh:jmh-core:1.13' testCompile 'org.openjdk.jmh:jmh-core:1.13'

View File

@ -13,11 +13,14 @@ import com.annimon.ownlang.parser.Token;
import com.annimon.ownlang.parser.ast.BlockStatement; import com.annimon.ownlang.parser.ast.BlockStatement;
import com.annimon.ownlang.parser.ast.Statement; import com.annimon.ownlang.parser.ast.Statement;
import com.annimon.ownlang.parser.visitors.PrintVisitor; import com.annimon.ownlang.parser.visitors.PrintVisitor;
import com.annimon.ownlang.utils.repl.JLineConsole;
import com.annimon.ownlang.utils.repl.ReplConsole;
import com.annimon.ownlang.utils.repl.SystemConsole;
import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.Scanner;
import java.util.stream.Collectors; import java.util.stream.Collectors;
public final class Repl { public final class Repl {
@ -36,14 +39,13 @@ public final class Repl {
final BlockStatement history = new BlockStatement(); final BlockStatement history = new BlockStatement();
final StringBuilder buffer = new StringBuilder(); final StringBuilder buffer = new StringBuilder();
final Scanner scanner = new Scanner(System.in); final ReplConsole console = initReplConsole();
while (true) { while (true) {
System.out.print((buffer.length() == 0) ? "\n> " : " "); console.setPrompt((buffer.length() == 0) ? "\n> " : " ");
if (!scanner.hasNextLine()) break; final String line = console.readLine();
if (line == null || EXIT.equalsIgnoreCase(line)) break;
final String line = scanner.nextLine();
if (EXIT.equalsIgnoreCase(line)) break;
switch (line.toLowerCase(Locale.ENGLISH)) { switch (line.toLowerCase(Locale.ENGLISH)) {
case RESET: case RESET:
buffer.setLength(0); buffer.setLength(0);
@ -84,7 +86,15 @@ public final class Repl {
} }
buffer.setLength(0); buffer.setLength(0);
} }
scanner.close(); console.close();
}
private static ReplConsole initReplConsole() {
try {
return new JLineConsole();
} catch (IOException ioe) {
return new SystemConsole();
}
} }
private static void printHelp(boolean full) { private static void printHelp(boolean full) {

View File

@ -0,0 +1,41 @@
package com.annimon.ownlang.utils.repl;
import java.io.IOException;
import jline.TerminalFactory;
import jline.console.ConsoleReader;
public class JLineConsole implements ReplConsole {
private final ConsoleReader console;
public JLineConsole() throws IOException {
console = new ConsoleReader();
}
public ConsoleReader getConsole() {
return console;
}
@Override
public void setPrompt(String prompt) {
console.setPrompt(prompt);
}
@Override
public String readLine() {
try {
return console.readLine();
} catch (IOException ex) {
return null;
}
}
@Override
public void close() {
try {
TerminalFactory.get().restore();
} catch (Exception ignored) {
}
}
}

View File

@ -0,0 +1,10 @@
package com.annimon.ownlang.utils.repl;
public interface ReplConsole {
void setPrompt(String prompt);
String readLine();
void close();
}

View File

@ -0,0 +1,31 @@
package com.annimon.ownlang.utils.repl;
import java.util.Scanner;
public class SystemConsole implements ReplConsole {
private final Scanner scanner;
public SystemConsole() {
scanner = new Scanner(System.in);
}
@Override
public void setPrompt(String prompt) {
System.out.print(prompt);
}
@Override
public String readLine() {
if (!scanner.hasNextLine()) {
return null;
}
return scanner.nextLine();
}
@Override
public void close() {
scanner.close();
}
}