import static java.util.Objects.requireNonNull;
import java.util.Optional;
+import org.antlr.v4.runtime.Token;
import org.antlr.v4.runtime.tree.ParseTree;
-import org.opendaylight.yangtools.antlrv4.code.gen.YangStatementParser.ArgumentContext;
-import org.opendaylight.yangtools.antlrv4.code.gen.YangStatementParser.KeywordContext;
-import org.opendaylight.yangtools.antlrv4.code.gen.YangStatementParser.StatementContext;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.common.QNameModule;
import org.opendaylight.yangtools.yang.common.YangConstants;
import org.opendaylight.yangtools.yang.common.YangVersion;
import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
+import org.opendaylight.yangtools.yang.parser.antlr.YangStatementParser.ArgumentContext;
+import org.opendaylight.yangtools.yang.parser.antlr.YangStatementParser.KeywordContext;
+import org.opendaylight.yangtools.yang.parser.antlr.YangStatementParser.StatementContext;
import org.opendaylight.yangtools.yang.parser.spi.source.DeclarationInTextSource;
import org.opendaylight.yangtools.yang.parser.spi.source.PrefixToModule;
import org.opendaylight.yangtools.yang.parser.spi.source.QNameToStatementDefinition;
class StatementContextVisitor {
private final QNameToStatementDefinition stmtDef;
+ private final ArgumentContextUtils utils;
private final StatementWriter writer;
- private final YangVersion yangVersion;
private final PrefixToModule prefixes;
private final String sourceName;
final QNameToStatementDefinition stmtDef, final PrefixToModule prefixes, final YangVersion yangVersion) {
this.writer = requireNonNull(writer);
this.stmtDef = requireNonNull(stmtDef);
- this.yangVersion = requireNonNull(yangVersion);
+ this.utils = ArgumentContextUtils.forVersion(yangVersion);
this.sourceName = sourceName;
this.prefixes = prefixes;
}
*
* @param prefixes collection of all relevant prefix mappings supplied for actual parsing phase
* @param stmtDef collection of all relevant statement definition mappings provided for actual parsing phase
- * @param keywordText statement keyword text to parse from source
+ * @param keyword statement keyword text to parse from source
* @param ref Source reference
* @return valid QName for declared statement to be written, or null
*/
- QName getValidStatementDefinition(final String keywordText, final StatementSourceReference ref) {
+ QName getValidStatementDefinition(final KeywordContext keyword, final StatementSourceReference ref) {
+ final String keywordText = keyword.getText();
final int firstColon = keywordText.indexOf(':');
if (firstColon == -1) {
final StatementDefinition def = stmtDef.get(QName.create(YangConstants.RFC6020_YIN_MODULE, keywordText));
return stmtDef.get(QName.create(module, localName));
}
+ // Normal entry point, checks for potential resume
private boolean processStatement(final int myOffset, final StatementContext ctx) {
final Optional<? extends ResumedStatement> optResumed = writer.resumeStatement(myOffset);
- final StatementSourceReference ref;
if (optResumed.isPresent()) {
final ResumedStatement resumed = optResumed.get();
- if (resumed.isFullyDefined()) {
- return true;
- }
-
- ref = resumed.getSourceReference();
- } else {
- final String keywordTxt = verifyNotNull(ctx.getChild(KeywordContext.class, 0)).getText();
- ref = DeclarationInTextSource.atPosition(sourceName, ctx.getStart().getLine(),
- ctx.getStart().getCharPositionInLine());
- final QName def = getValidStatementDefinition(keywordTxt, ref);
- if (def == null) {
- return false;
- }
+ return resumed.isFullyDefined() || doProcessStatement(ctx, resumed.getSourceReference());
+ }
+ return processNewStatement(myOffset, ctx);
+ }
- final ArgumentContext argumentCtx = ctx.getChild(ArgumentContext.class, 0);
- final String argument = argumentCtx == null ? null
- : ArgumentContextUtils.stringFromStringContext(argumentCtx, yangVersion, ref);
- writer.startStatement(myOffset, def, argument, ref);
+ // Slow-path allocation of a new statement
+ private boolean processNewStatement(final int myOffset, final StatementContext ctx) {
+ final Token start = ctx.getStart();
+ final StatementSourceReference ref = DeclarationInTextSource.atPosition(sourceName, start.getLine(),
+ start.getCharPositionInLine());
+ final QName def = getValidStatementDefinition(verifyNotNull(ctx.getChild(KeywordContext.class, 0)), ref);
+ if (def == null) {
+ return false;
}
+ final ArgumentContext argumentCtx = ctx.getChild(ArgumentContext.class, 0);
+ final String argument = argumentCtx == null ? null : utils.stringFromStringContext(argumentCtx, ref);
+ writer.startStatement(myOffset, def, argument, ref);
+ return doProcessStatement(ctx, ref);
+ }
+
+ // Actual processing
+ private boolean doProcessStatement(final StatementContext ctx, final StatementSourceReference ref) {
int childOffset = 0;
boolean fullyDefined = true;
if (ctx.children != null) {
for (ParseTree s : ctx.children) {
- if (s instanceof StatementContext) {
- if (!processStatement(childOffset++, (StatementContext) s)) {
- fullyDefined = false;
- }
+ if (s instanceof StatementContext && !processStatement(childOffset++, (StatementContext) s)) {
+ fullyDefined = false;
}
}
}