*/
package org.opendaylight.yangtools.rfc7952.parser;
+import com.google.common.collect.ImmutableList;
import org.eclipse.jdt.annotation.NonNull;
import org.opendaylight.yangtools.rfc7952.model.api.AnnotationEffectiveStatement;
import org.opendaylight.yangtools.rfc7952.model.api.AnnotationSchemaNode;
import org.opendaylight.yangtools.yang.model.api.SchemaPath;
import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
+import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
+import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
import org.opendaylight.yangtools.yang.model.api.stmt.TypeEffectiveStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.UnitsStatement;
import org.opendaylight.yangtools.yang.model.util.type.ConcreteTypeBuilder;
import org.opendaylight.yangtools.yang.model.util.type.ConcreteTypes;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredStatement.WithQNameArgument.WithSubstatements;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.BaseStatementSupport;
import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.UnknownEffectiveStatementBase;
-import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement;
-import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport;
+import org.opendaylight.yangtools.yang.parser.spi.meta.EffectiveStmtCtx.Current;
import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable;
import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils;
import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
public final class AnnotationStatementSupport
- extends AbstractStatementSupport<QName, AnnotationStatement, AnnotationEffectiveStatement> {
+ extends BaseStatementSupport<QName, AnnotationStatement, AnnotationEffectiveStatement> {
- private static final class Declared extends AbstractDeclaredStatement<QName> implements AnnotationStatement {
- Declared(final StmtContext<QName, ?, ?> context) {
- super(context);
- }
-
- @Override
- public QName getArgument() {
- return argument();
+ private static final class Declared extends WithSubstatements implements AnnotationStatement {
+ Declared(final QName argument, final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+ super(argument, substatements);
}
}
private final @NonNull TypeDefinition<?> type;
private final @NonNull SchemaPath path;
- Effective(final StmtContext<QName, AnnotationStatement, ?> ctx) {
- super(ctx);
- path = ctx.coerceParentContext().getSchemaPath().get().createChild(argument());
+ Effective(final Current<QName, AnnotationStatement> stmt,
+ final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+ super(stmt, substatements);
+ path = stmt.getEffectiveParent().getSchemaPath().createChild(argument());
final TypeEffectiveStatement<?> typeStmt = SourceException.throwIfNull(
- firstSubstatementOfType(TypeEffectiveStatement.class), ctx.getStatementSourceReference(),
+ firstSubstatementOfType(TypeEffectiveStatement.class), stmt,
"AnnotationStatementSupport %s is missing a 'type' statement", argument());
final ConcreteTypeBuilder<?> builder = ConcreteTypes.concreteTypeBuilder(typeStmt.getTypeDefinition(),
path);
- final StmtContext<String, ?, ?> unitsStmt = StmtContextUtils.findFirstEffectiveSubstatement(ctx,
- UnitsStatement.class);
+ final StmtContext<String, ?, ?> unitsStmt = StmtContextUtils.findFirstEffectiveSubstatement(
+ stmt.caerbannog(), UnitsStatement.class);
if (unitsStmt != null) {
- builder.setUnits(unitsStmt.getStatementArgument());
+ builder.setUnits(unitsStmt.argument());
}
type = builder.build();
}
}
@Override
+ @Deprecated
public SchemaPath getPath() {
return path;
}
public TypeDefinition<?> getTypeDefinition() {
return type;
}
+
+ @Override
+ public AnnotationEffectiveStatement asEffectiveStatement() {
+ return this;
+ }
}
private static final AnnotationStatementSupport INSTANCE = new AnnotationStatementSupport(
return INSTANCE;
}
- @Override
- public AnnotationStatement createDeclared(final StmtContext<QName, AnnotationStatement, ?> ctx) {
- return new Declared(ctx);
- }
-
- @Override
- public AnnotationEffectiveStatement createEffective(
- final StmtContext<QName, AnnotationStatement, AnnotationEffectiveStatement> ctx) {
- return new Effective(ctx);
- }
-
@Override
public QName parseArgumentValue(final StmtContext<?, ?, ?> ctx, final String value) {
return StmtContextUtils.parseIdentifier(ctx, value);
@Override
public void onStatementAdded(final Mutable<QName, AnnotationStatement, AnnotationEffectiveStatement> stmt) {
- final StatementDefinition parentDef = stmt.coerceParentContext().getPublicDefinition();
+ final StatementDefinition parentDef = stmt.coerceParentContext().publicDefinition();
SourceException.throwIf(YangStmtMapping.MODULE != parentDef && YangStmtMapping.SUBMODULE != parentDef,
- stmt.getStatementSourceReference(),
- "Annotations may only be defined at root of either a module or a submodule");
+ stmt, "Annotations may only be defined at root of either a module or a submodule");
}
@Override
protected SubstatementValidator getSubstatementValidator() {
return validator;
}
+
+ @Override
+ protected AnnotationStatement createDeclared(final StmtContext<QName, AnnotationStatement, ?> ctx,
+ final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+ return new Declared(ctx.getArgument(), substatements);
+ }
+
+ @Override
+ protected AnnotationStatement createEmptyDeclared(final StmtContext<QName, AnnotationStatement, ?> ctx) {
+ return createDeclared(ctx, ImmutableList.of());
+ }
+
+ @Override
+ protected AnnotationEffectiveStatement createEffective(final Current<QName, AnnotationStatement> stmt,
+ final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+ return new Effective(stmt, substatements);
+ }
}