Encapsulate YangStatementParserListenerImpl.walk() 76/68676/2
authorRobert Varga <robert.varga@pantheon.tech>
Sun, 25 Feb 2018 20:02:35 +0000 (21:02 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Sun, 25 Feb 2018 22:12:23 +0000 (23:12 +0100)
As it turns out, the contract between YangStatementStreamSource
is one of walking a tree with a set of parameters. Make sure we
encapsulate this contract, so that it can be efficiently implemented
using a visitor.

This has the benefit of discarding unneeded state more quickly
and not retaining it past errors. It will also allow us to very
simply convert YangStatementParserListenerImpl into a visitor.

JIRA: YANGTOOLS-713
Change-Id: Iac8c4979fb31cb527788837b41d4bbf17ce4b3cf
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/repo/YangStatementParserListenerImpl.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/repo/YangStatementStreamSource.java

index c83c2aaf0781a4ee5c70e831b5233c8106cf1291..7d9d51b89275b7901f7b3d2c6e94ae5ca5bc2885 100644 (file)
@@ -7,11 +7,15 @@
  */
 package org.opendaylight.yangtools.yang.parser.rfc7950.repo;
 
-import com.google.common.base.Verify;
+import static com.google.common.base.Verify.verify;
+import static com.google.common.base.Verify.verifyNotNull;
+import static java.util.Objects.requireNonNull;
+
 import java.util.ArrayDeque;
 import java.util.ArrayList;
 import java.util.Deque;
 import java.util.List;
+import org.antlr.v4.runtime.tree.ParseTreeWalker;
 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;
@@ -41,6 +45,7 @@ final class YangStatementParserListenerImpl extends YangStatementParserBaseListe
     private final List<String> toBeSkipped = new ArrayList<>();
     private final Deque<Counter> counters = new ArrayDeque<>();
     private final String sourceName;
+
     private QNameToStatementDefinition stmtDef;
     private PrefixToModule prefixes;
     private StatementWriter writer;
@@ -51,38 +56,40 @@ final class YangStatementParserListenerImpl extends YangStatementParserBaseListe
     }
 
     @SuppressWarnings("checkstyle:hiddenField")
-    void setAttributes(final StatementWriter writer, final QNameToStatementDefinition stmtDef) {
-        this.writer = writer;
-        this.stmtDef = stmtDef;
-        initCounters();
+    void walk(final StatementWriter writer, final QNameToStatementDefinition stmtDef, final StatementContext context) {
+        walk(writer, stmtDef, null, YangVersion.VERSION_1, context);
     }
 
     @SuppressWarnings("checkstyle:hiddenField")
-    void setAttributes(final StatementWriter writer, final QNameToStatementDefinition stmtDef,
-            final PrefixToModule prefixes) {
-        this.writer = writer;
-        this.stmtDef = stmtDef;
+    void walk(final StatementWriter writer, final QNameToStatementDefinition stmtDef,
+            final PrefixToModule prefixes, final YangVersion yangVersion, final StatementContext context) {
+        // Verify & initialize state
+        verify(toBeSkipped.isEmpty());
+        verify(counters.isEmpty());
+        this.writer = requireNonNull(writer);
+        this.stmtDef = requireNonNull(stmtDef);
         this.prefixes = prefixes;
-        initCounters();
-    }
-
-    @SuppressWarnings("checkstyle:hiddenField")
-    void setAttributes(final StatementWriter writer, final QNameToStatementDefinition stmtDef,
-            final PrefixToModule prefixes, final YangVersion yangVersion) {
-        this.yangVersion = yangVersion;
-        setAttributes(writer, stmtDef, prefixes);
-    }
-
-    private void initCounters() {
-        counters.clear();
+        this.yangVersion = requireNonNull(yangVersion);
         counters.push(new Counter());
+
+        try {
+            ParseTreeWalker.DEFAULT.walk(this, context);
+        } finally {
+            // Reset out state
+            this.writer = null;
+            this.stmtDef = null;
+            this.prefixes = null;
+            this.yangVersion = null;
+            toBeSkipped.clear();
+            counters.clear();
+        }
     }
 
     @Override
     public void enterStatement(final StatementContext ctx) {
         final StatementSourceReference ref = DeclarationInTextSource.atPosition(sourceName, ctx.getStart().getLine(),
                 ctx.getStart().getCharPositionInLine());
-        final String keywordTxt = Verify.verifyNotNull(ctx.getChild(KeywordContext.class, 0)).getText();
+        final String keywordTxt = verifyNotNull(ctx.getChild(KeywordContext.class, 0)).getText();
         final QName validStatementDefinition = getValidStatementDefinition(prefixes, stmtDef, keywordTxt, ref);
 
         final int childId = counters.peek().getAndIncrement();
index 3921192c91605859726a64c815051498d856031f..e87268119504d86612cc3f22091ef1a9820f76c8 100644 (file)
@@ -115,8 +115,7 @@ public final class YangStatementStreamSource implements StatementStreamSource {
 
     @Override
     public void writePreLinkage(final StatementWriter writer, final QNameToStatementDefinition stmtDef) {
-        yangStatementModelParser.setAttributes(writer, stmtDef);
-        ParseTreeWalker.DEFAULT.walk(yangStatementModelParser, context);
+        yangStatementModelParser.walk(writer, stmtDef, context);
     }
 
     @Override
@@ -128,8 +127,7 @@ public final class YangStatementStreamSource implements StatementStreamSource {
     @Override
     public void writeLinkage(final StatementWriter writer, final QNameToStatementDefinition stmtDef,
             final PrefixToModule preLinkagePrefixes, final YangVersion yangVersion) {
-        yangStatementModelParser.setAttributes(writer, stmtDef, preLinkagePrefixes, yangVersion);
-        ParseTreeWalker.DEFAULT.walk(yangStatementModelParser, context);
+        yangStatementModelParser.walk(writer, stmtDef, preLinkagePrefixes, yangVersion, context);
     }
 
     @Override
@@ -141,8 +139,7 @@ public final class YangStatementStreamSource implements StatementStreamSource {
     @Override
     public void writeLinkageAndStatementDefinitions(final StatementWriter writer,
             final QNameToStatementDefinition stmtDef, final PrefixToModule prefixes, final YangVersion yangVersion) {
-        yangStatementModelParser.setAttributes(writer, stmtDef, prefixes, yangVersion);
-        ParseTreeWalker.DEFAULT.walk(yangStatementModelParser, context);
+        yangStatementModelParser.walk(writer, stmtDef, prefixes, yangVersion, context);
     }
 
     @Override
@@ -154,8 +151,7 @@ public final class YangStatementStreamSource implements StatementStreamSource {
     @Override
     public void writeFull(final StatementWriter writer, final QNameToStatementDefinition stmtDef,
             final PrefixToModule prefixes, final YangVersion yangVersion) {
-        yangStatementModelParser.setAttributes(writer, stmtDef, prefixes, yangVersion);
-        ParseTreeWalker.DEFAULT.walk(yangStatementModelParser, context);
+        yangStatementModelParser.walk(writer, stmtDef, prefixes, yangVersion, context);
     }
 
     @Override