Split out RFC7950 ANTLR grammars
[yangtools.git] / yang / yang-parser-rfc7950 / src / main / java / org / opendaylight / yangtools / yang / parser / rfc7950 / repo / StatementContextVisitor.java
index 5116b3411f75afb5e60a5739f57d1a96eeb88796..faefa05cc12a071621c3648a2159218fe7f4786c 100644 (file)
@@ -10,54 +10,32 @@ package org.opendaylight.yangtools.yang.parser.rfc7950.repo;
 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);
@@ -84,7 +62,7 @@ abstract class StatementContextVisitor {
     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;
         }
 
@@ -104,39 +82,53 @@ abstract class StatementContextVisitor {
         }
 
         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;
     }
 }