Initialize IRStatementContext 25/92425/1
authorRobert Varga <robert.varga@pantheon.tech>
Mon, 7 Sep 2020 19:02:32 +0000 (21:02 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Mon, 7 Sep 2020 19:03:15 +0000 (21:03 +0200)
For compatibility reasons we may need to provide IRStatement-backed
StatementContext. This patch adds the basic conversion capability.

JIRA: YANGTOOLS-1130
Change-Id: I380d9c0438be60c3c6fef5377ebc674ebfe87f53
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/antlr/ExplicitTextToken.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/repo/IRParserRuleContext.java [deleted file]
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/repo/IRStatementContext.java [new file with mode: 0644]
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/repo/YangStatementStreamSource.java

index 33f8ce1bbbc03ba1865274a3d98a43c4b1bfe4bc..ddea716020f87ea34533d0df475db60047c2a8c6 100644 (file)
@@ -9,14 +9,16 @@ package org.opendaylight.yangtools.yang.parser.rfc7950.antlr;
 
 import static java.util.Objects.requireNonNull;
 
+import com.google.common.annotations.Beta;
 import org.antlr.v4.runtime.CharStream;
 import org.antlr.v4.runtime.TokenSource;
 
-final class ExplicitTextToken extends AbstractToken {
+@Beta
+public final class ExplicitTextToken extends AbstractToken {
     private final int type;
     private final String text;
 
-    ExplicitTextToken(final int type, final String text) {
+    public ExplicitTextToken(final int type, final String text) {
         this.type = type;
         this.text = requireNonNull(text);
     }
diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/repo/IRParserRuleContext.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/repo/IRParserRuleContext.java
deleted file mode 100644 (file)
index d9dbf8a..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- * Copyright (c) 2020 PANTHEON.tech, s.r.o. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-package org.opendaylight.yangtools.yang.parser.rfc7950.repo;
-
-import org.antlr.v4.runtime.ParserRuleContext;
-import org.opendaylight.yangtools.yang.parser.rfc7950.ir.IRStatement;
-
-final class IRParserRuleContext extends ParserRuleContext {
-    IRParserRuleContext(final IRStatement rootStatement) {
-        // FIXME: initialize state
-    }
-}
diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/repo/IRStatementContext.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/repo/IRStatementContext.java
new file mode 100644 (file)
index 0000000..4c567bb
--- /dev/null
@@ -0,0 +1,113 @@
+/*
+ * Copyright (c) 2020 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.yang.parser.rfc7950.repo;
+
+import com.google.common.collect.ImmutableList;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import org.antlr.v4.runtime.tree.ParseTree;
+import org.antlr.v4.runtime.tree.TerminalNode;
+import org.antlr.v4.runtime.tree.TerminalNodeImpl;
+import org.opendaylight.yangtools.yang.parser.antlr.YangStatementParser;
+import org.opendaylight.yangtools.yang.parser.antlr.YangStatementParser.StatementContext;
+import org.opendaylight.yangtools.yang.parser.rfc7950.antlr.ExplicitTextToken;
+import org.opendaylight.yangtools.yang.parser.rfc7950.ir.IRArgument;
+import org.opendaylight.yangtools.yang.parser.rfc7950.ir.IRArgument.Concatenation;
+import org.opendaylight.yangtools.yang.parser.rfc7950.ir.IRArgument.Single;
+import org.opendaylight.yangtools.yang.parser.rfc7950.ir.IRKeyword;
+import org.opendaylight.yangtools.yang.parser.rfc7950.ir.IRStatement;
+
+final class IRStatementContext extends StatementContext {
+    private static final TerminalNode COLON =
+            new TerminalNodeImpl(new ExplicitTextToken(YangStatementParser.COLON, ":"));
+    private static final TerminalNode SEMICOLON =
+            new TerminalNodeImpl(new ExplicitTextToken(YangStatementParser.SEMICOLON, ";"));
+    private static final TerminalNode LBRACE =
+            new TerminalNodeImpl(new ExplicitTextToken(YangStatementParser.LEFT_BRACE, "{"));
+    private static final TerminalNode RBRACE =
+            new TerminalNodeImpl(new ExplicitTextToken(YangStatementParser.RIGHT_BRACE, "}"));
+    private static final TerminalNode PLUS =
+            new TerminalNodeImpl(new ExplicitTextToken(YangStatementParser.PLUS, "+"));
+    private static final TerminalNode SEP =
+            new TerminalNodeImpl(new ExplicitTextToken(YangStatementParser.SEP, " "));
+    private static final TerminalNode DQUOT_END =
+            new TerminalNodeImpl(new ExplicitTextToken(YangStatementParser.DQUOT_END, "\""));
+    private static final TerminalNode SQUOT_END =
+            new TerminalNodeImpl(new ExplicitTextToken(YangStatementParser.SQUOT_END, "'"));
+
+    IRStatementContext(final IRStatement rootStatement) {
+        super(null, -1);
+        initialize(rootStatement);
+    }
+
+    private void initialize(final IRStatement stmt) {
+        final List<ParseTree> tmp = new ArrayList<>();
+        final IRKeyword keyword = stmt.keyword();
+        final String prefix = keyword.prefix();
+        if (prefix != null) {
+            start = new ExplicitTextToken(YangStatementParser.IDENTIFIER, prefix);
+            tmp.add(new TerminalNodeImpl(start));
+            tmp.add(COLON);
+            tmp.add(new TerminalNodeImpl(new ExplicitTextToken(YangStatementParser.IDENTIFIER,
+                keyword.identifier())));
+        } else {
+            start = new ExplicitTextToken(YangStatementParser.IDENTIFIER, keyword.identifier());
+            tmp.add(new TerminalNodeImpl(start));
+        }
+
+        final IRArgument argument = stmt.argument();
+        if (argument != null) {
+            tmp.add(SEP);
+            addArgumentChildren(tmp, stmt.argument());
+        }
+
+        final List<? extends IRStatement> stmts = stmt.statements();
+        if (!stmts.isEmpty()) {
+            tmp.add(LBRACE);
+            for (IRStatement child : stmt.statements()) {
+                tmp.add(new IRStatementContext(child));
+            }
+            tmp.add(RBRACE);
+        } else {
+            tmp.add(SEMICOLON);
+        }
+
+        this.children = ImmutableList.copyOf(tmp);
+    }
+
+    private static void addArgumentChildren(final List<ParseTree> children, final IRArgument argument) {
+        if (argument instanceof Concatenation) {
+            final Iterator<? extends Single> it = ((Concatenation) argument).parts().iterator();
+            addArgumentChildren(children, it.next());
+            while (it.hasNext()) {
+                children.add(PLUS);
+                addArgumentChildren(children, it.next());
+            }
+        } else if (argument instanceof Single) {
+            addArgumentChildren(children, (Single) argument);
+        } else {
+            throw new IllegalStateException("Unhandled argument " + argument);
+        }
+    }
+
+    private static void addArgumentChildren(final List<ParseTree> children, final Single argument) {
+        final String str = argument.string();
+        if (argument.isValidIdentifier()) {
+            children.add(new TerminalNodeImpl(new ExplicitTextToken(YangStatementParser.IDENTIFIER, str)));
+        } else if (argument.needQuoteCheck()) {
+            children.add(new TerminalNodeImpl(new ExplicitTextToken(YangStatementParser.UQUOT_STRING, str)));
+        } else if (argument.needUnescape()) {
+            children.add(new TerminalNodeImpl(new ExplicitTextToken(YangStatementParser.DQUOT_STRING, str)));
+            children.add(DQUOT_END);
+        } else {
+            children.add(new TerminalNodeImpl(new ExplicitTextToken(YangStatementParser.SQUOT_STRING, str)));
+            children.add(SQUOT_END);
+        }
+    }
+}
index fa11c747f425a16258707ae72bada8b8a0a300e8..5683cacb446cd97cbd479b6a8c0438de64c0b8f8 100644 (file)
@@ -141,7 +141,7 @@ public final class YangStatementStreamSource extends AbstractIdentifiable<Source
 
     @Deprecated(forRemoval = true)
     public ParserRuleContext getYangAST() {
-        return new IRParserRuleContext(rootStatement);
+        return new IRStatementContext(rootStatement);
     }
 
     IRStatement rootStatement() {