Добавлены подсказки автодополнения

This commit is contained in:
Victor 2018-03-09 14:23:57 +02:00
parent 9353bf9d20
commit a89b02ee8d
3 changed files with 47 additions and 1 deletions

View File

@ -5,6 +5,7 @@ import java.util.ArrayList;
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.Set;
/** /**
* *
@ -105,6 +106,10 @@ public final class Lexer {
KEYWORDS.put("include", TokenType.INCLUDE); KEYWORDS.put("include", TokenType.INCLUDE);
} }
public static Set<String> getKeywords() {
return KEYWORDS.keySet();
}
private final String input; private final String input;
private final int length; private final int length;

View File

@ -14,6 +14,7 @@ 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.JLineConsole;
import com.annimon.ownlang.utils.repl.OwnLangCompleter;
import com.annimon.ownlang.utils.repl.ReplConsole; import com.annimon.ownlang.utils.repl.ReplConsole;
import com.annimon.ownlang.utils.repl.SystemConsole; import com.annimon.ownlang.utils.repl.SystemConsole;
import java.io.IOException; import java.io.IOException;
@ -22,6 +23,7 @@ import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import jline.console.completer.CandidateListCompletionHandler;
public final class Repl { public final class Repl {
@ -91,7 +93,12 @@ public final class Repl {
private static ReplConsole initReplConsole() { private static ReplConsole initReplConsole() {
try { try {
return new JLineConsole(); JLineConsole jline = new JLineConsole();
CandidateListCompletionHandler handler = new CandidateListCompletionHandler();
handler.setPrintSpaceAfterFullCompletion(false);
jline.getConsole().setCompletionHandler(handler);
jline.getConsole().addCompleter(new OwnLangCompleter(HELP, VARS, FUNCS, SOURCE, RESET, EXIT));
return jline;
} catch (IOException ioe) { } catch (IOException ioe) {
return new SystemConsole(); return new SystemConsole();
} }

View File

@ -0,0 +1,34 @@
package com.annimon.ownlang.utils.repl;
import com.annimon.ownlang.lib.Functions;
import com.annimon.ownlang.lib.Variables;
import com.annimon.ownlang.parser.Lexer;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import jline.console.completer.StringsCompleter;
public final class OwnLangCompleter extends StringsCompleter {
private final Set<String> staticCandidates;
public OwnLangCompleter(String... candidates) {
staticCandidates = new HashSet<>();
Collections.addAll(staticCandidates, candidates);
}
@Override
public int complete(String buffer, int cursor, List<CharSequence> candidates) {
updateCandidates();
return super.complete(buffer, cursor, candidates);
}
private void updateCandidates() {
getStrings().clear();
getStrings().addAll(Lexer.getKeywords());
getStrings().addAll(staticCandidates);
getStrings().addAll(Variables.variables().keySet());
getStrings().addAll(Functions.getFunctions().keySet());
}
}