X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=yang%2Fyang-parser-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang%2Fparser%2Fimpl%2FYangStatementParserListenerImpl.java;h=5da991b527a05b561303f73571a63dc1152c393c;hb=ea32c2c6fac2ebe9d0e30c9c4e5279c5ef0d2314;hp=b5b3cf02915647a449fb6b25d3086f9fcb7ed44b;hpb=856519f9e3e80427b7da5d35a6751cf24784a25d;p=yangtools.git diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/YangStatementParserListenerImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/YangStatementParserListenerImpl.java index b5b3cf0291..5da991b527 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/YangStatementParserListenerImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/YangStatementParserListenerImpl.java @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the @@ -7,103 +7,108 @@ */ package org.opendaylight.yangtools.yang.parser.impl; +import com.google.common.base.Preconditions; +import com.google.common.base.Verify; import java.util.ArrayList; import java.util.List; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import org.antlr.v4.runtime.tree.ParseTree; -import org.opendaylight.yangtools.antlrv4.code.gen.YangStatementParser; +import javax.annotation.concurrent.Immutable; +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.antlrv4.code.gen.YangStatementParserBaseListener; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.YangConstants; +import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; +import org.opendaylight.yangtools.yang.parser.spi.meta.ModelProcessingPhase; +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.stmt.rfc6020.TypeUtils; import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.Utils; - -import javax.annotation.concurrent.Immutable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; @Immutable public class YangStatementParserListenerImpl extends YangStatementParserBaseListener { + private static final Logger LOG = LoggerFactory.getLogger(YangStatementParserListenerImpl.class); - private StatementWriter writer; - private StatementSourceReference ref; + private final List toBeSkipped = new ArrayList<>(); + private final String sourceName; private QNameToStatementDefinition stmtDef; private PrefixToModule prefixes; - private List toBeSkipped = new ArrayList<>(); - private static final Logger LOG = LoggerFactory.getLogger(YangStatementParserListenerImpl.class); + private StatementWriter writer; - public YangStatementParserListenerImpl(StatementSourceReference ref) { - this.ref = ref; + public YangStatementParserListenerImpl(final String sourceName) { + this.sourceName = sourceName; } - public void setAttributes(StatementWriter writer, QNameToStatementDefinition stmtDef) { + public void setAttributes(final StatementWriter writer, final QNameToStatementDefinition stmtDef) { this.writer = writer; this.stmtDef = stmtDef; } - public void setAttributes(StatementWriter writer, QNameToStatementDefinition stmtDef, PrefixToModule prefixes) { + public void setAttributes(final StatementWriter writer, final QNameToStatementDefinition stmtDef, final PrefixToModule prefixes) { this.writer = writer; this.stmtDef = stmtDef; this.prefixes = prefixes; } @Override - public void enterStatement(YangStatementParser.StatementContext ctx) { - boolean action = true; - for (int i = 0; i < ctx.getChildCount(); i++) { - ParseTree child = ctx.getChild(i); - if (child instanceof YangStatementParser.KeywordContext) { - try { - QName identifier = new QName(YangConstants.RFC6020_YIN_NAMESPACE, - ((YangStatementParser.KeywordContext) child).children.get(0).getText()); - if (stmtDef != null && Utils.isValidStatementDefinition(prefixes, stmtDef, identifier) && toBeSkipped.isEmpty()) { - writer.startStatement(identifier, ref); - } else { - action = false; - toBeSkipped.add(((YangStatementParser.KeywordContext) child).children.get(0).getText()); - } - } catch (SourceException e) { - LOG.warn(e.getMessage(), e); + public void enterStatement(final StatementContext ctx) { + final StatementSourceReference ref = DeclarationInTextSource.atPosition(sourceName, ctx + .getStart().getLine(), ctx.getStart().getCharPositionInLine()); + final KeywordContext keywordCtx = Verify.verifyNotNull(ctx.getChild(KeywordContext.class, 0)); + final ArgumentContext argumentCtx = ctx.getChild(ArgumentContext.class, 0); + final String keywordTxt = keywordCtx.getText(); + + final QName identifier = QName.create(YangConstants.RFC6020_YIN_MODULE, keywordTxt); + final QName validStatementDefinition = Utils.getValidStatementDefinition(prefixes, stmtDef, identifier); + if (stmtDef != null && validStatementDefinition != null && toBeSkipped.isEmpty()) { + final String argument = argumentCtx != null ? Utils.stringFromStringContext(argumentCtx) : null; + // FIXME: Refactor/clean up this special case + if (identifier.equals(Rfc6020Mapping.TYPE.getStatementName())) { + Preconditions.checkArgument(argument != null); + if (TypeUtils.isYangTypeBodyStmtString(argument)) { + writer.startStatement(QName.create(YangConstants.RFC6020_YIN_MODULE, argument), ref); + } else { + writer.startStatement(QName.create(YangConstants.RFC6020_YIN_MODULE, Rfc6020Mapping + .TYPE.getStatementName().getLocalName()), ref); } - } else if (child instanceof YangStatementParser.ArgumentContext) { - try { - if (action) { - writer.argumentValue( - Utils.stringFromStringContext((YangStatementParser.ArgumentContext) child), ref); - } else { - action = true; - } - } catch (SourceException e) { - LOG.warn(e.getMessage(), e); + writer.argumentValue(argument, ref); + } else { + writer.startStatement(validStatementDefinition, ref); + if (argument != null) { + writer.argumentValue(argument, ref); } } - + } else { + Preconditions.checkArgument(writer.getPhase() != ModelProcessingPhase.FULL_DECLARATION, + "%s is not a YANG statement or use of extension. Source: %s", identifier.getLocalName(), ref); + toBeSkipped.add(keywordTxt); } } @Override - public void exitStatement(YangStatementParser.StatementContext ctx) { - for (int i = 0; i < ctx.getChildCount(); i++) { - ParseTree child = ctx.getChild(i); - if (child instanceof YangStatementParser.KeywordContext) { - try { - String statementName = ((YangStatementParser.KeywordContext) child).children.get(0).getText(); - QName identifier = new QName(YangConstants.RFC6020_YIN_NAMESPACE, statementName); - if (stmtDef != null && Utils.isValidStatementDefinition(prefixes, stmtDef, identifier) && toBeSkipped.isEmpty()) { - writer.endStatement(ref); - } + public void exitStatement(final StatementContext ctx) { + final StatementSourceReference ref = DeclarationInTextSource.atPosition( + sourceName, ctx.getStart().getLine(), ctx.getStart().getCharPositionInLine()); - if (toBeSkipped.contains(statementName)) { - toBeSkipped.remove(statementName); - } - } catch (SourceException e) { - LOG.warn(e.getMessage(), e); - } + try { + KeywordContext keyword = ctx.getChild(KeywordContext.class, 0); + String statementName = keyword.getText(); + QName identifier = QName.create(YangConstants.RFC6020_YIN_MODULE, statementName); + if (stmtDef != null && Utils.getValidStatementDefinition(prefixes, stmtDef, identifier) != null + && toBeSkipped.isEmpty()) { + writer.endStatement(ref); } + + // No-op if the statement is not on the list + toBeSkipped.remove(statementName); + } catch (SourceException e) { + LOG.warn(e.getMessage(), e); } } }