import static com.google.common.base.Verify.verifyNotNull;
import static java.util.Objects.requireNonNull;
+import java.util.Optional;
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;
import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
import org.opendaylight.yangtools.yang.parser.spi.source.StatementSourceReference;
import org.opendaylight.yangtools.yang.parser.spi.source.StatementWriter;
+import org.opendaylight.yangtools.yang.parser.spi.source.StatementWriter.ResumedStatement;
-abstract class StatementContextVisitor {
- static final class Loose extends StatementContextVisitor {
- Loose(final String sourceName, final StatementWriter writer,
- final QNameToStatementDefinition stmtDef, final PrefixToModule prefixes, final YangVersion yangVersion) {
- super(sourceName, writer, stmtDef, prefixes, yangVersion);
- }
-
- Loose(final String sourceName, final StatementWriter writer, final QNameToStatementDefinition stmtDef) {
- this(sourceName, writer, stmtDef, null, YangVersion.VERSION_1);
- }
- }
-
- static final class Strict extends StatementContextVisitor {
- Strict(final String sourceName, final StatementWriter writer,
- final QNameToStatementDefinition stmtDef, final PrefixToModule prefixes, final YangVersion yangVersion) {
- super(sourceName, writer, stmtDef, prefixes, yangVersion);
- }
-
- @Override
- QName getValidStatementDefinition(final String keywordText, final StatementSourceReference ref) {
- return SourceException.throwIfNull(super.getValidStatementDefinition(keywordText, ref), ref,
- "%s is not a YANG statement or use of extension.", keywordText);
- }
- }
-
+class StatementContextVisitor {
private final QNameToStatementDefinition stmtDef;
private final StatementWriter writer;
private final YangVersion yangVersion;
private final PrefixToModule prefixes;
private final String sourceName;
- private StatementContextVisitor(final String sourceName, final StatementWriter writer,
+ StatementContextVisitor(final String sourceName, final StatementWriter writer,
final QNameToStatementDefinition stmtDef, final PrefixToModule prefixes, final YangVersion yangVersion) {
this.writer = requireNonNull(writer);
this.stmtDef = requireNonNull(stmtDef);
QName getValidStatementDefinition(final String keywordText, final StatementSourceReference ref) {
final int firstColon = keywordText.indexOf(':');
if (firstColon == -1) {
- final StatementDefinition def = stmtDef.get(QName.create(YangConstants.RFC6020_YIN_NAMESPACE, keywordText));
+ final StatementDefinition def = stmtDef.get(QName.create(YangConstants.RFC6020_YIN_MODULE, keywordText));
return def != null ? def.getStatementName() : null;
}
}
final String localName = keywordText.substring(firstColon + 1);
- final StatementDefinition foundStmtDef;
- if (prefixes.isPreLinkageMap()) {
- foundStmtDef = stmtDef.getByNamespaceAndLocalName(qNameModule.getNamespace(), localName);
- } else {
- foundStmtDef = stmtDef.get(QName.create(qNameModule, localName));
- }
-
+ final StatementDefinition foundStmtDef = resolveStatement(qNameModule, localName);
return foundStmtDef != null ? foundStmtDef.getStatementName() : null;
}
- private void processStatement(final int myOffset, final StatementContext ctx) {
- final String keywordTxt = verifyNotNull(ctx.getChild(KeywordContext.class, 0)).getText();
- final StatementSourceReference ref = DeclarationInTextSource.atPosition(sourceName, ctx.getStart().getLine(),
- ctx.getStart().getCharPositionInLine());
- final QName def = getValidStatementDefinition(keywordTxt, ref);
- if (def == null) {
- return;
- }
+ StatementDefinition resolveStatement(final QNameModule module, final String localName) {
+ return stmtDef.get(QName.create(module, localName));
+ }
- 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);
+ 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;
+ }
+
+ 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);
+ }
+ int childOffset = 0;
+ boolean fullyDefined = true;
if (ctx.children != null) {
- int childOffset = 0;
for (ParseTree s : ctx.children) {
if (s instanceof StatementContext) {
- processStatement(childOffset++, (StatementContext) s);
+ if (!processStatement(childOffset++, (StatementContext) s)) {
+ fullyDefined = false;
+ }
}
}
}
+ writer.storeStatement(childOffset, fullyDefined);
writer.endStatement(ref);
+ return fullyDefined;
}
}