/*
* 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.antlr.works.editor.grammar.navigation;
import org.antlr.netbeans.editor.navigation.Description;
import org.antlr.netbeans.editor.text.DocumentSnapshot;
import org.antlr.netbeans.editor.text.OffsetRegion;
import org.antlr.netbeans.editor.text.SnapshotPositionRegion;
import org.antlr.runtime.CommonToken;
import org.antlr.runtime.tree.CommonTree;
import org.antlr.works.editor.grammar.parser.CompiledFileModel;
import org.antlr.works.editor.grammar.parser.CompiledModel;
import org.netbeans.api.annotations.common.CheckForNull;
import org.netbeans.api.annotations.common.NonNull;
import org.netbeans.api.annotations.common.NullAllowed;
import org.openide.util.NbBundle;
/**
*
* @author Sam Harwell
*/
@NbBundle.Messages({
"LBL_ParserRules=Parser Rules",
"LBL_LexerRules=Lexer Rules"
})
public abstract class RuleScanner {
public Description scan(CompiledModel model) {
GrammarNode.GrammarNodeDescription rootDescription = scanImpl(model);
return rootDescription;
}
protected abstract GrammarNode.GrammarNodeDescription scanImpl(CompiledModel model);
@CheckForNull
protected CommonToken getToken(@NonNull CompiledFileModel result, int tokenIndex) {
CommonToken[] tokens = result.getTokens();
if (tokens != null && tokenIndex >= 0 && tokenIndex < tokens.length) {
return tokens[tokenIndex];
}
return null;
}
@CheckForNull
protected SnapshotPositionRegion getSpan(@NullAllowed DocumentSnapshot snapshot, @NullAllowed CommonToken startToken, @NullAllowed CommonToken stopToken) {
if (snapshot == null) {
return null;
}
if (startToken == null || stopToken == null) {
return null;
}
if (startToken.getStartIndex() > stopToken.getStopIndex() + 1) {
return null;
}
return new SnapshotPositionRegion(snapshot, OffsetRegion.fromBounds(startToken.getStartIndex(), stopToken.getStopIndex() + 1));
}
@CheckForNull
protected SnapshotPositionRegion getSpan(@NullAllowed DocumentSnapshot snapshot, @NonNull CompiledFileModel result, @NullAllowed CommonTree tree) {
if (snapshot == null || tree == null) {
return null;
}
CommonToken startToken = getToken(result, tree.getTokenStartIndex());
CommonToken stopToken = getToken(result, tree.getTokenStopIndex());
return getSpan(snapshot, startToken, stopToken);
}
}