package org.opendaylight.yangtools.yang.parser.rfc7950.repo;
import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Verify.verifyNotNull;
+import static java.util.Objects.requireNonNull;
import com.google.common.annotations.Beta;
-import com.google.common.base.MoreObjects;
-import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
import java.io.IOException;
import java.io.InputStream;
import org.antlr.v4.runtime.tree.ParseTreeListener;
import org.antlr.v4.runtime.tree.ParseTreeWalker;
import org.antlr.v4.runtime.tree.TerminalNode;
-import org.opendaylight.yangtools.antlrv4.code.gen.YangStatementLexer;
-import org.opendaylight.yangtools.antlrv4.code.gen.YangStatementParser;
-import org.opendaylight.yangtools.antlrv4.code.gen.YangStatementParser.StatementContext;
+import org.opendaylight.yangtools.concepts.AbstractIdentifiable;
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.common.QNameModule;
import org.opendaylight.yangtools.yang.common.YangVersion;
+import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
import org.opendaylight.yangtools.yang.model.parser.api.YangSyntaxErrorException;
import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier;
import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource;
+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.antlr.YangStatementParser.KeywordContext;
+import org.opendaylight.yangtools.yang.parser.antlr.YangStatementParser.StatementContext;
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.StatementStreamSource;
import org.opendaylight.yangtools.yang.parser.spi.source.StatementWriter;
* @author Robert Varga
*/
@Beta
-public final class YangStatementStreamSource implements StatementStreamSource {
+public final class YangStatementStreamSource extends AbstractIdentifiable<SourceIdentifier>
+ implements StatementStreamSource {
private static final ParseTreeListener MAKE_IMMUTABLE_LISTENER = new ParseTreeListener() {
@Override
public void enterEveryRule(final ParserRuleContext ctx) {
}
};
- private final YangStatementParserListenerImpl yangStatementModelParser;
- private final SourceIdentifier identifier;
private final StatementContext context;
+ private final String sourceName;
- private YangStatementStreamSource(final SourceIdentifier identifier, final YangStatementParserListenerImpl parser,
- final StatementContext context) {
- this.identifier = Preconditions.checkNotNull(identifier);
- this.yangStatementModelParser = Preconditions.checkNotNull(parser);
- this.context = Preconditions.checkNotNull(context);
+ private YangStatementStreamSource(final SourceIdentifier identifier, final StatementContext context,
+ final String sourceName) {
+ super(identifier);
+ this.context = requireNonNull(context);
+ this.sourceName = sourceName;
}
/**
context = parseYangSource(source.getIdentifier(), stream);
}
- final String sourceName = source.getSymbolicName().orElse(null);
- final YangStatementParserListenerImpl parser = new YangStatementParserListenerImpl(sourceName);
- return new YangStatementStreamSource(source.getIdentifier(), parser, context);
+ return new YangStatementStreamSource(source.getIdentifier(), context, source.getSymbolicName().orElse(null));
}
/**
public static YangStatementStreamSource create(final SourceIdentifier identifier, final StatementContext context,
final String symbolicName) {
- return new YangStatementStreamSource(identifier, new YangStatementParserListenerImpl(symbolicName), context);
+ return new YangStatementStreamSource(identifier, context, symbolicName);
}
@Override
public void writePreLinkage(final StatementWriter writer, final QNameToStatementDefinition stmtDef) {
- yangStatementModelParser.setAttributes(writer, stmtDef);
- ParseTreeWalker.DEFAULT.walk(yangStatementModelParser, context);
- }
-
- @Override
- public void writeLinkage(final StatementWriter writer, final QNameToStatementDefinition stmtDef,
- final PrefixToModule preLinkagePrefixes) {
- writeLinkage(writer, stmtDef, preLinkagePrefixes, YangVersion.VERSION_1);
+ new StatementContextVisitor(sourceName, writer, stmtDef, null, YangVersion.VERSION_1).visit(context);
}
@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);
- }
-
- @Override
- public void writeLinkageAndStatementDefinitions(final StatementWriter writer,
- final QNameToStatementDefinition stmtDef, final PrefixToModule prefixes) {
- writeLinkageAndStatementDefinitions(writer, stmtDef, prefixes, YangVersion.VERSION_1);
+ new StatementContextVisitor(sourceName, writer, stmtDef, preLinkagePrefixes, yangVersion) {
+ @Override
+ StatementDefinition resolveStatement(final QNameModule module, final String localName) {
+ return stmtDef.getByNamespaceAndLocalName(module.getNamespace(), localName);
+ }
+ }.visit(context);
}
@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);
- }
-
- @Override
- public void writeFull(final StatementWriter writer, final QNameToStatementDefinition stmtDef,
- final PrefixToModule prefixes) {
- writeFull(writer, stmtDef, prefixes, YangVersion.VERSION_1);
+ new StatementContextVisitor(sourceName, writer, stmtDef, prefixes, yangVersion).visit(context);
}
@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);
- }
-
- @Override
- public SourceIdentifier getIdentifier() {
- return identifier;
+ new StatementContextVisitor(sourceName, writer, stmtDef, prefixes, yangVersion) {
+ @Override
+ QName getValidStatementDefinition(final KeywordContext keyword, final StatementSourceReference ref) {
+ final QName ret = super.getValidStatementDefinition(keyword, ref);
+ if (ret == null) {
+ throw new SourceException(ref, "%s is not a YANG statement or use of extension.",
+ keyword.getText());
+ }
+ return ret;
+ }
+ }.visit(context);
}
public ParserRuleContext getYangAST() {
private static StatementContext parseYangSource(final SourceIdentifier source, final InputStream stream)
throws IOException, YangSyntaxErrorException {
final YangStatementLexer lexer = new YangStatementLexer(CharStreams.fromStream(stream));
- final CommonTokenStream tokens = new CommonTokenStream(lexer);
- final YangStatementParser parser = new YangStatementParser(tokens);
- //disconnect from console error output
+ final YangStatementParser parser = new YangStatementParser(new CommonTokenStream(lexer));
+ // disconnect from console error output
+ lexer.removeErrorListeners();
parser.removeErrorListeners();
final YangErrorListener errorListener = new YangErrorListener(source);
+ lexer.addErrorListener(errorListener);
parser.addErrorListener(errorListener);
- final StatementContext result = parser.statement();
+ final FileContext result = parser.file();
errorListener.validate();
// Walk the resulting tree and replace each children with an immutable list, lowering memory requirements
// org.antlr.v4.runtime.Parser.TrimToSizeListener, but that does not make the tree immutable.
ParseTreeWalker.DEFAULT.walk(MAKE_IMMUTABLE_LISTENER, result);
- return result;
- }
-
- @Override
- public String toString() {
- return MoreObjects.toStringHelper(this).add("identifier", getIdentifier()).toString();
+ return verifyNotNull(result.statement());
}
}