mirror of
https://github.com/aNNiMON/Own-Programming-Language-Tutorial.git
synced 2024-09-20 08:44:20 +03:00
Добавлены подсказки автодополнения
This commit is contained in:
parent
9353bf9d20
commit
a89b02ee8d
@ -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;
|
||||||
|
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
@ -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());
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user