/*
* Copyright (c) 2012 Sam Harwell, Tunnel Vision Laboratories LLC
* All rights reserved.
*
* The source code of this document is proprietary work, and is not licensed for
* distribution. For information about licensing, contact Sam Harwell at:
* sam@tunnelvisionlabs.com
*/
package org.tvl.goworks.editor.go.completion;
import org.antlr.v4.runtime.Parser;
import org.antlr.v4.runtime.ParserRuleContext;
import org.antlr.v4.runtime.TokenStream;
import org.antlr.v4.runtime.atn.ATN;
import org.antlr.v4.runtime.atn.PredictionMode;
import org.antlr.v4.runtime.atn.SemanticContext;
import org.antlr.v4.runtime.misc.IntervalSet;
import org.antlr.works.editor.antlr4.completion.AbstractCompletionParserATNSimulator;
import org.antlr.works.editor.antlr4.completion.CaretToken;
import org.netbeans.api.annotations.common.NonNull;
import org.tvl.goworks.editor.go.parser.GoParser;
import org.tvl.goworks.editor.go.parser.GoParserFactory;
/**
*
* @author Sam Harwell
*/
public class CompletionParserATNSimulator extends AbstractCompletionParserATNSimulator {
private final SemanticContext qidPredicate;
private final int QID_DECISION;
public CompletionParserATNSimulator(@NonNull Parser parser, ATN atn) {
super(parser, atn);
setPredictionMode(PredictionMode.SLL);
QID_DECISION = GoParserFactory.getQidDecision(atn);
qidPredicate = GoParserFactory.getQidPredicate(atn);
}
public static final IntervalSet WORDLIKE_TOKEN_TYPES =
new IntervalSet() {{
// keywords
addAll(KeywordCompletionItem.KEYWORD_TYPES);
// identifiers
add(GoParser.IDENTIFIER);
}};
@Override
protected IntervalSet getWordlikeTokenTypes() {
return WORDLIKE_TOKEN_TYPES;
}
@Override
public int adaptivePredict(TokenStream input, int decision, ParserRuleContext outerContext) {
if (decision == QID_DECISION && QID_DECISION >= 0) {
if (input.LA(1) == GoParser.IDENTIFIER) {
if (input.LA(2) == GoParser.Dot) {
if (input.LA(3) == GoParser.IDENTIFIER) {
return qidPredicate.eval(parser, outerContext) ? 1 : 2;
} else if (input.LA(3) != CaretToken.CARET_TOKEN_TYPE) {
return 2;
}
} else if (input.LA(2) != CaretToken.CARET_TOKEN_TYPE) {
return 2;
}
}
}
return super.adaptivePredict(input, decision, outerContext);
}
}