Disconnect IRStatement from ANTLR 58/92258/2
authorRobert Varga <robert.varga@pantheon.tech>
Sun, 23 Aug 2020 10:44:21 +0000 (12:44 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Mon, 7 Sep 2020 12:07:37 +0000 (14:07 +0200)
While we currently allow instantiation only from ANTLR, we may end
up with other ways of instantiating the intermediate form. Make sure
IRStatement does not have a dependency on ANTLR.

JIRA: YANGTOOLS-1130
Change-Id: I4d28f7c4fd8457fe01e7eae967e0917c1a91b4e0
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/ir/AntlrSupport.java [moved from yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/ir/StatementFactory.java with 94% similarity]
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/ir/IRStatement.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/ir/package-info.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/repo/YangStatementStreamSource.java
yang/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/parser/rfc7950/ir/AntlrSupportTest.java [moved from yang/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/parser/rfc7950/ir/StatementFactoryTest.java with 96% similarity]

similarity index 94%
rename from yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/ir/StatementFactory.java
rename to yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/ir/AntlrSupport.java
index e120466f502fb7fcf7cc9ac90450674dcd91b3cd..b215c218a9f245a1ba94fea0efcfcdcc8210c8df 100644 (file)
@@ -9,6 +9,7 @@ package org.opendaylight.yangtools.yang.parser.rfc7950.ir;
 
 import static com.google.common.base.Verify.verify;
 
+import com.google.common.annotations.Beta;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.CharMatcher;
 import com.google.common.base.VerifyException;
@@ -25,6 +26,7 @@ import org.antlr.v4.runtime.tree.TerminalNode;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.yang.parser.antlr.YangStatementParser;
 import org.opendaylight.yangtools.yang.parser.antlr.YangStatementParser.ArgumentContext;
+import org.opendaylight.yangtools.yang.parser.antlr.YangStatementParser.FileContext;
 import org.opendaylight.yangtools.yang.parser.antlr.YangStatementParser.KeywordContext;
 import org.opendaylight.yangtools.yang.parser.antlr.YangStatementParser.StatementContext;
 import org.opendaylight.yangtools.yang.parser.antlr.YangStatementParser.UnquotedStringContext;
@@ -37,7 +39,8 @@ import org.opendaylight.yangtools.yang.parser.rfc7950.ir.IRArgument.Unquoted;
 import org.opendaylight.yangtools.yang.parser.rfc7950.ir.IRKeyword.Qualified;
 import org.opendaylight.yangtools.yang.parser.rfc7950.ir.IRKeyword.Unqualified;
 
-final class StatementFactory {
+@Beta
+public final class AntlrSupport {
     private static final CharMatcher WHITESPACE_MATCHER = CharMatcher.whitespace();
 
     private final Map<String, DoubleQuoted> dquotArguments = new HashMap<>();
@@ -48,7 +51,22 @@ final class StatementFactory {
     private final Map<Entry<String, String>, Qualified> qualKeywords = new HashMap<>();
     private final Map<String, String> strings = new HashMap<>();
 
-    @NonNull IRStatement createStatement(final StatementContext stmt) {
+    private AntlrSupport() {
+        // Hidden on purpose
+    }
+
+    /**
+     * Create an {@link IRStatement} from a parsed {@link StatementContext}.
+     *
+     * @param file ANTLR file context
+     * @return A new IRStatement
+     * @throws NullPointerException if {@code file} is null or it does not contain a root statement
+     */
+    public static @NonNull IRStatement createStatement(final FileContext file) {
+        return new AntlrSupport().createStatement(file.statement());
+    }
+
+    private @NonNull IRStatement createStatement(final StatementContext stmt) {
         final ParseTree firstChild = stmt.getChild(0);
         verify(firstChild instanceof KeywordContext, "Unexpected shape of %s", stmt);
 
index adaf5dbf2c2541edce61ba0521ad414e4640f948..ccc8942a4da342e9b1a8e1edaab5ad56200bdcca 100644 (file)
@@ -14,7 +14,6 @@ import com.google.common.collect.ImmutableList;
 import java.util.List;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.yangtools.yang.parser.antlr.YangStatementParser.StatementContext;
 
 /**
  * A single YANG statement in its raw string form. A statement is composed of:
@@ -34,17 +33,6 @@ public abstract class IRStatement extends AbstractIRObject {
         this.argument = argument;
     }
 
-    /**
-     * Create an {@link IRStatement} from a parsed {@link StatementContext}.
-     *
-     * @param context ANTLR statement context
-     * @return A new IRStatement
-     * @throws NullPointerException if {@code context} is null
-     */
-    public static @NonNull IRStatement forContext(final StatementContext context) {
-        return new StatementFactory().createStatement(context);
-    }
-
     /**
      * Return this statement's keyword.
      *
index 5b1472302341486dd6d55e5522f22a47113af7c3..ad2e79caa6582e64490ecc8c0d583e8ad1a3d13b 100644 (file)
  * is not required for the purposes of statement inference.
  *
  * <p>
- * The main entrypoint into this package is {@link org.opendaylight.yangtools.yang.parser.rfc7950.ir.IRStatement}, which
- * represents a single YANG statement. Every YANG file is required to contain exactly one top-level statement,
+ * The main entry point into this package is {@link org.opendaylight.yangtools.yang.parser.rfc7950.ir.IRStatement},
+ * which represents a single YANG statement. Every YANG file is required to contain exactly one top-level statement,
  * {@code module} or {@code submodule}, hence an IRStatement also represents the significant contents of a YANG file.
+ * One way of creating an IRStatement is through
+ * {@link org.opendaylight.yangtools.yang.parser.rfc7950.ir.AntlrSupport#createStatement(
+ * org.opendaylight.yangtools.yang.parser.antlr.YangStatementParser.FileContext)}.
  */
 package org.opendaylight.yangtools.yang.parser.rfc7950.ir;
\ No newline at end of file
index e7dbd87c780949603575d76ef6652cf18e706f4f..153fa372f4eeba93706a36753651ed69d5a04eda 100644 (file)
@@ -27,6 +27,7 @@ import org.opendaylight.yangtools.yang.parser.antlr.YangStatementLexer;
 import org.opendaylight.yangtools.yang.parser.antlr.YangStatementParser;
 import org.opendaylight.yangtools.yang.parser.antlr.YangStatementParser.FileContext;
 import org.opendaylight.yangtools.yang.parser.rfc7950.antlr.CompactYangStatementLexer;
+import org.opendaylight.yangtools.yang.parser.rfc7950.ir.AntlrSupport;
 import org.opendaylight.yangtools.yang.parser.rfc7950.ir.IRKeyword;
 import org.opendaylight.yangtools.yang.parser.rfc7950.ir.IRStatement;
 import org.opendaylight.yangtools.yang.parser.spi.source.PrefixToModule;
@@ -150,6 +151,6 @@ public final class YangStatementStreamSource extends AbstractIdentifiable<Source
 
         final FileContext result = parser.file();
         errorListener.validate();
-        return IRStatement.forContext(result.statement());
+        return AntlrSupport.createStatement(result);
     }
 }
@@ -8,11 +8,11 @@
 package org.opendaylight.yangtools.yang.parser.rfc7950.ir;
 
 import static org.junit.Assert.assertEquals;
-import static org.opendaylight.yangtools.yang.parser.rfc7950.ir.StatementFactory.trimWhitespace;
+import static org.opendaylight.yangtools.yang.parser.rfc7950.ir.AntlrSupport.trimWhitespace;
 
 import org.junit.Test;
 
-public class StatementFactoryTest {
+public class AntlrSupportTest {
     @Test
     public void testTrimWhitespace() {
         assertEquals("\n", trimWhitespace("\n", 0));