Integrate {Inference,Source}Exception with CommonStmtCtx
[yangtools.git] / yang / rfc7952-parser-support / src / main / java / org / opendaylight / yangtools / rfc7952 / parser / AnnotationStatementSupport.java
index 637c079a4a82cf01698e9f57ee32a28f00e2ab78..7e306dbabca93e871e2f800cf6f4b592811ca76c 100644 (file)
@@ -7,6 +7,7 @@
  */
 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;
@@ -16,14 +17,17 @@ import org.opendaylight.yangtools.yang.common.QName;
 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;
@@ -31,16 +35,11 @@ import org.opendaylight.yangtools.yang.parser.spi.meta.SubstatementValidator;
 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);
         }
     }
 
@@ -50,20 +49,21 @@ public final class AnnotationStatementSupport
         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();
         }
@@ -74,6 +74,7 @@ public final class AnnotationStatementSupport
         }
 
         @Override
+        @Deprecated
         public SchemaPath getPath() {
             return path;
         }
@@ -87,6 +88,11 @@ public final class AnnotationStatementSupport
         public TypeDefinition<?> getTypeDefinition() {
             return type;
         }
+
+        @Override
+        public AnnotationEffectiveStatement asEffectiveStatement() {
+            return this;
+        }
     }
 
     private static final AnnotationStatementSupport INSTANCE = new AnnotationStatementSupport(
@@ -110,17 +116,6 @@ public final class 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);
@@ -128,14 +123,30 @@ public final class AnnotationStatementSupport
 
     @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);
+    }
 }