X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;ds=sidebyside;f=yang%2Fyang-parser-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang%2Fparser%2Fimpl%2FYangStatementParserListenerImpl.java;h=c9bd2c61a499ad76d73b6fb23967ea197785be46;hb=refs%2Fchanges%2F73%2F48273%2F4;hp=075269e1d2edd27b8514fe9a96b832e750e307cb;hpb=2a36389b98992385717bec633f037030e32e6dbb;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 075269e1d2..c9bd2c61a4 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 @@ -7,7 +7,6 @@ */ 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; @@ -18,7 +17,6 @@ import org.opendaylight.yangtools.antlrv4.code.gen.YangStatementParser.Statement 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; @@ -26,15 +24,10 @@ import org.opendaylight.yangtools.yang.parser.spi.source.QNameToStatementDefinit 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 org.slf4j.Logger; -import org.slf4j.LoggerFactory; @Immutable public class YangStatementParserListenerImpl extends YangStatementParserBaseListener { - private static final Logger LOG = LoggerFactory.getLogger(YangStatementParserListenerImpl.class); - private final List toBeSkipped = new ArrayList<>(); private final String sourceName; private QNameToStatementDefinition stmtDef; @@ -59,37 +52,21 @@ public class YangStatementParserListenerImpl extends YangStatementParserBaseList @Override 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(); - - // FIXME: This is broken for extensions - not all statements are in RFC6020 ns. + .getStart().getLine(), ctx.getStart().getCharPositionInLine()); + final String keywordTxt = Verify.verifyNotNull(ctx.getChild(KeywordContext.class, 0)).getText(); final QName identifier = QName.create(YangConstants.RFC6020_YIN_MODULE, keywordTxt); - if (stmtDef != null && Utils.isValidStatementDefinition(prefixes, stmtDef, identifier) - && toBeSkipped.isEmpty()) { - final String argument = argumentCtx != null ? Utils.stringFromStringContext(argumentCtx) : null; - // FIXME: this looks like a fishy 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); - } - writer.argumentValue(argument, ref); - } else { - writer.startStatement(identifier, 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); + final QName validStatementDefinition = Utils.getValidStatementDefinition(prefixes, stmtDef, identifier); + + if (stmtDef == null || validStatementDefinition == null || !toBeSkipped.isEmpty()) { + SourceException.throwIf(writer.getPhase() == ModelProcessingPhase.FULL_DECLARATION, ref, + "%s is not a YANG statement or use of extension.", keywordTxt); toBeSkipped.add(keywordTxt); + return; } + + final ArgumentContext argumentCtx = ctx.getChild(ArgumentContext.class, 0); + final String argument = argumentCtx != null ? Utils.stringFromStringContext(argumentCtx) : null; + writer.startStatement(validStatementDefinition, argument, ref); } @Override @@ -97,19 +74,15 @@ public class YangStatementParserListenerImpl extends YangStatementParserBaseList final StatementSourceReference ref = DeclarationInTextSource.atPosition( sourceName, ctx.getStart().getLine(), ctx.getStart().getCharPositionInLine()); - 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.isValidStatementDefinition(prefixes, stmtDef, identifier) - && 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); + 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); } }