我正在尝试使用Netbeans Code Completion,使用ANTLR的Parsing和Lexer API为我的语言自动完成。我已经基于ANTLR语法文件生成了java类,例如ANTLR Parser,Lexer和BaseListener。我的目标是根据当前范围进行自动完成。例如,类范围,方法范围,内部范围等。
如何根据编辑器中的插入位置确定范围?
是否有一种机制允许在调用代码完成弹出窗口之前确定当前范围,以根据当前范围准备完成项目?
public class XxxParser extends Parser {
private Snapshot snapshot;
private XxxcodeParser xxxcodeParser;
@Override
public void parse(Snapshot snapshot, Task task, SourceModificationEvent event) {
this.snapshot = snapshot;
ANTLRInputStream input = new ANTLRInputStream(snapshot.getText().toString());
Lexer lexer = new XxxcodeLexer(input);
CommonTokenStream tokens = new CommonTokenStream(lexer);
xxxcodeParser = new XxxcodeParser(tokens);
xxxcodeParser.addParseListener(new XxxcodeBaseListener());
CompilationUnitContext context = xxxcodeParser.compilationUnit();
}
XxxcodeBaseListener类包含enter和exit方法。当我在编辑器中输入字母时,parse(Snapshot snapshot, Task task, SourceModificationEvent event)
方法执行。在解析当前文件时,侦听器会调用不同的进入和退出方法,例如@Override public void enterClassBody(
XxxcodeParser.ClassBodyContext ctx) { }
,@Override public void exitClassBody(XxxcodeParser.ClassBodyContext ctx) { }
等。