Refactor augment statement implementation 86/87486/5
authorRobert Varga <robert.varga@pantheon.tech>
Wed, 5 Feb 2020 10:34:25 +0000 (11:34 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Thu, 6 Feb 2020 17:10:50 +0000 (18:10 +0100)
Augment has an interesting interplay with EffectiveStatementBase,
where it overrides the list of statements to be built by wrapping
them in implicit definition.

Furthermore the implementation classes are needlessly wasteful,
we refactor them to not carry the definitions.

JIRA: YANGTOOLS-1065
Change-Id: I55407a26f163aeecff820048a6545eae8879b5e1
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/AugmentEffectiveStatement.java
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/AugmentStatement.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractEffectiveDocumentedDataNodeContainer.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/BaseStatementSupport.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/EffectiveStatementBase.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/augment/AbstractAugmentStatementSupport.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/augment/AugmentEffectiveStatementImpl.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/augment/EmptyAugmentStatement.java [moved from yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/augment/AugmentStatementImpl.java with 59% similarity]
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/augment/RegularAugmentStatement.java [new file with mode: 0644]

index e35d26d7297a780e109a06dfe2be45209f8f7d8b..bbdd448d21ba31b3e5edf64605b069796dc1036b 100644 (file)
@@ -8,9 +8,14 @@
 package org.opendaylight.yangtools.yang.model.api.stmt;
 
 import com.google.common.annotations.Beta;
+import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
 
 @Beta
 public interface AugmentEffectiveStatement extends EffectiveStatement<SchemaNodeIdentifier, AugmentStatement> {
-
+    @Override
+    default StatementDefinition statementDefinition() {
+        return YangStmtMapping.AUGMENT;
+    }
 }
index ac8dc25e062bc0a33fa7496810bb6a23942ae9ba..2084abb95256fab3a8fe62ceee1bf4461c97fa19 100644 (file)
@@ -11,6 +11,8 @@ import static com.google.common.base.Verify.verifyNotNull;
 
 import java.util.Collection;
 import org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
+import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
 import org.opendaylight.yangtools.yang.model.api.stmt.DocumentedDeclaredStatement.WithStatus;
 
 public interface AugmentStatement extends WithStatus<SchemaNodeIdentifier>,
@@ -18,6 +20,10 @@ public interface AugmentStatement extends WithStatus<SchemaNodeIdentifier>,
         NotificationStatementAwareDeclaredStatement<SchemaNodeIdentifier>,
         ActionStatementAwareDeclaredStatement<SchemaNodeIdentifier>,
         WhenStatementAwareDeclaredStatement<SchemaNodeIdentifier> {
+    @Override
+    default StatementDefinition statementDefinition() {
+        return YangStmtMapping.AUGMENT;
+    }
 
     default @NonNull SchemaNodeIdentifier getTargetNode() {
         // FIXME: YANGTOOLS-908: verifyNotNull() should not be needed here
index 9f8573b92ed32d3de24c9cf8fd89ae75058f6c94..f48ab11d79c61b9c6a647fb164d2a448f8251819 100644 (file)
@@ -23,6 +23,7 @@ import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.TypedefEffectiveStatement;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
 
+@Deprecated(forRemoval = true)
 public abstract class AbstractEffectiveDocumentedDataNodeContainer<A, D extends DeclaredStatement<A>>
         extends AbstractSchemaEffectiveDocumentedNode<A, D> implements DataNodeContainer {
 
index 645e24ce2f8682fff9366cbe174ba58bb7346d57..24a7abbf4abf07c874094c54997324a97fd4db7d 100644 (file)
@@ -56,7 +56,8 @@ public abstract class BaseStatementSupport<A, D extends DeclaredStatement<A>,
     @Override
     public final E createEffective(final StmtContext<A, D, E> ctx) {
         final D declared = ctx.buildDeclared();
-        final ImmutableList<? extends EffectiveStatement<?, ?>> substatements = buildEffectiveSubstatements(ctx);
+        final ImmutableList<? extends EffectiveStatement<?, ?>> substatements =
+                buildEffectiveSubstatements(statementsToBuild(ctx, declaredSubstatements(ctx)));
         return substatements.isEmpty() ? createEmptyEffective(ctx, declared)
                 : createEffective(ctx, declared, substatements);
     }
@@ -66,6 +67,19 @@ public abstract class BaseStatementSupport<A, D extends DeclaredStatement<A>,
 
     protected abstract @NonNull E createEmptyEffective(@NonNull StmtContext<A, D, E> ctx, @NonNull D declared);
 
+    /**
+     * Give statement support a hook to transform statement contexts before they are built. Default implementation
+     * does nothing, but note {@code augment} statement performs a real transformation.
+     *
+     * @param ctx Parent statement context
+     * @param substatements Substatement contexts which have been determined to be built
+     * @return Substatement context which are to be actually built
+     */
+    protected List<? extends StmtContext<?, ?, ?>> statementsToBuild(final StmtContext<A, D, E> ctx,
+            final List<? extends StmtContext<?, ?, ?>> substatements) {
+        return substatements;
+    }
+
     protected static final <E extends EffectiveStatement<?, ?>> @Nullable E findFirstStatement(
             final ImmutableList<? extends EffectiveStatement<?, ?>> statements, final Class<E> type) {
         for (EffectiveStatement<?, ?> stmt : statements) {
index 97f7ca2ce2f75f4826cab9e8da3f60962ec1ed7d..77ceab24e06213cb0908451722abb10e766ae8bc 100644 (file)
@@ -7,7 +7,6 @@
  */
 package org.opendaylight.yangtools.yang.parser.rfc7950.stmt;
 
-import com.google.common.annotations.Beta;
 import com.google.common.collect.Collections2;
 import com.google.common.collect.ImmutableList;
 import java.util.Collection;
@@ -42,14 +41,7 @@ public abstract class EffectiveStatementBase<A, D extends DeclaredStatement<A>>
      * @param ctx context of statement.
      */
     protected EffectiveStatementBase(final StmtContext<A, D, ?> ctx) {
-        this.substatements = ImmutableList.copyOf(initSubstatements(ctx,
-            BaseStatementSupport.declaredSubstatements(ctx)));
-    }
-
-    @Beta
-    protected Collection<? extends EffectiveStatement<?, ?>> initSubstatements(final StmtContext<A, D, ?> ctx,
-            final Collection<? extends StmtContext<?, ?, ?>> substatementsInit) {
-        return initSubstatements(substatementsInit);
+        this.substatements = ImmutableList.copyOf(initSubstatements(BaseStatementSupport.declaredSubstatements(ctx)));
     }
 
     /**
index ba1c857c7bb6b76258a38ff73cb905cddf5be3be..87b690388d5499de6e035c60fd3c531760f86c43 100644 (file)
@@ -7,26 +7,36 @@
  */
 package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.augment;
 
+import static com.google.common.base.Verify.verify;
+
 import com.google.common.base.Verify;
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Lists;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.List;
 import java.util.Objects;
 import java.util.Optional;
 import java.util.regex.Pattern;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.YangVersion;
+import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.Status;
 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.stmt.AugmentEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.AugmentStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.DataDefinitionStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier;
+import org.opendaylight.yangtools.yang.model.api.stmt.StatusEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.UsesStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.WhenStatement;
 import org.opendaylight.yangtools.yang.parser.rfc7950.namespace.ChildSchemaNodeNamespace;
 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.ArgumentUtils;
-import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.BaseStatementSupport;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.EffectiveStatementWithFlags.FlagsBuilder;
 import org.opendaylight.yangtools.yang.parser.spi.meta.CopyType;
 import org.opendaylight.yangtools.yang.parser.spi.meta.InferenceException;
 import org.opendaylight.yangtools.yang.parser.spi.meta.ModelActionBuilder;
@@ -46,7 +56,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 abstract class AbstractAugmentStatementSupport
-        extends AbstractStatementSupport<SchemaNodeIdentifier, AugmentStatement, AugmentEffectiveStatement> {
+        extends BaseStatementSupport<SchemaNodeIdentifier, AugmentStatement, AugmentEffectiveStatement> {
     private static final Logger LOG = LoggerFactory.getLogger(AbstractAugmentStatementSupport.class);
     private static final Pattern PATH_REL_PATTERN1 = Pattern.compile("\\.\\.?\\s*/(.+)");
     private static final Pattern PATH_REL_PATTERN2 = Pattern.compile("//.*");
@@ -65,17 +75,6 @@ abstract class AbstractAugmentStatementSupport
         return ArgumentUtils.nodeIdentifierFromPath(ctx, value);
     }
 
-    @Override
-    public final AugmentStatement createDeclared(final StmtContext<SchemaNodeIdentifier, AugmentStatement, ?> ctx) {
-        return new AugmentStatementImpl(ctx);
-    }
-
-    @Override
-    public final AugmentEffectiveStatement createEffective(
-            final StmtContext<SchemaNodeIdentifier, AugmentStatement, AugmentEffectiveStatement> ctx) {
-        return new AugmentEffectiveStatementImpl(ctx);
-    }
-
     @Override
     public final void onFullDefinitionDeclared(
             final Mutable<SchemaNodeIdentifier, AugmentStatement, AugmentEffectiveStatement> augmentNode) {
@@ -164,6 +163,50 @@ abstract class AbstractAugmentStatementSupport
         });
     }
 
+    @Override
+    protected final AugmentStatement createDeclared(final StmtContext<SchemaNodeIdentifier, AugmentStatement, ?> ctx,
+            final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+        return new RegularAugmentStatement(ctx, substatements);
+    }
+
+    @Override
+    protected final AugmentStatement createEmptyDeclared(
+            final StmtContext<SchemaNodeIdentifier, AugmentStatement, ?> ctx) {
+        return new EmptyAugmentStatement(ctx);
+    }
+
+    @Override
+    protected final List<? extends StmtContext<?, ?, ?>> statementsToBuild(
+            final StmtContext<SchemaNodeIdentifier, AugmentStatement, AugmentEffectiveStatement> ctx,
+            final List<? extends StmtContext<?, ?, ?>> substatements) {
+        final StatementContextBase<?, ?, ?> implicitDef = ctx.getFromNamespace(AugmentImplicitHandlingNamespace.class,
+            ctx);
+        return implicitDef == null ? substatements : Lists.transform(substatements, subCtx -> {
+            verify(subCtx instanceof StatementContextBase);
+            return implicitDef.wrapWithImplicit((StatementContextBase<?, ?, ?>) subCtx);
+        });
+    }
+
+    @Override
+    protected final AugmentEffectiveStatement createEffective(
+            final StmtContext<SchemaNodeIdentifier, AugmentStatement, AugmentEffectiveStatement> ctx,
+            final AugmentStatement declared, final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+        final int flags = new FlagsBuilder()
+                .setStatus(findFirstArgument(substatements, StatusEffectiveStatement.class, Status.CURRENT))
+                .toFlags();
+
+        return new AugmentEffectiveStatementImpl(declared, flags, StmtContextUtils.getRootModuleQName(ctx),
+            substatements, ctx.getStatementSourceReference(),
+            (AugmentationSchemaNode) ctx.getOriginalCtx().map(StmtContext::buildEffective).orElse(null));
+    }
+
+    @Override
+    protected final AugmentEffectiveStatement createEmptyEffective(
+            final StmtContext<SchemaNodeIdentifier, AugmentStatement, AugmentEffectiveStatement> ctx,
+            final AugmentStatement declared) {
+        return createEffective(ctx, declared, ImmutableList.of());
+    }
+
     private static StmtContext<?, ?, ?> getSearchRoot(final StmtContext<?, ?, ?> augmentContext) {
         // Augment is in uses - we need to augment instantiated nodes in parent.
         final StmtContext<?, ?, ?> parent = augmentContext.coerceParentContext();
index ac6adf8fc5acdd94e3e3959686ff7df79340dfd4..30c8806853541dc472bfee4e59c4b8fc8d122fd8 100644 (file)
@@ -7,99 +7,69 @@
  */
 package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.augment;
 
-import static com.google.common.base.Verify.verify;
+import static java.util.Objects.requireNonNull;
 
-import com.google.common.collect.Collections2;
-import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.ImmutableList;
 import java.net.URI;
-import java.util.Collection;
 import java.util.Objects;
 import java.util.Optional;
-import java.util.Set;
 import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jdt.annotation.Nullable;
 import org.opendaylight.yangtools.yang.common.QNameModule;
 import org.opendaylight.yangtools.yang.common.Revision;
-import org.opendaylight.yangtools.yang.model.api.ActionDefinition;
 import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.NamespaceRevisionAware;
-import org.opendaylight.yangtools.yang.model.api.NotificationDefinition;
-import org.opendaylight.yangtools.yang.model.api.RevisionAwareXPath;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.AugmentEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.AugmentStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier;
-import org.opendaylight.yangtools.yang.model.api.stmt.WhenEffectiveStatement;
-import org.opendaylight.yangtools.yang.model.api.stmt.compat.ActionNodeContainerCompat;
-import org.opendaylight.yangtools.yang.model.api.stmt.compat.NotificationNodeContainerCompat;
-import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractEffectiveDocumentedDataNodeContainer;
-import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
-import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils;
-import org.opendaylight.yangtools.yang.parser.stmt.reactor.StatementContextBase;
-
-final class AugmentEffectiveStatementImpl
-        extends AbstractEffectiveDocumentedDataNodeContainer<SchemaNodeIdentifier, AugmentStatement>
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredEffectiveStatement.DefaultDataNodeContainer;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.ActionNodeContainerMixin;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.DataNodeContainerMixin;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.DocumentedNodeMixin;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.NotificationNodeContainerMixin;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.WhenConditionMixin;
+import org.opendaylight.yangtools.yang.parser.spi.source.StatementSourceReference;
+
+final class AugmentEffectiveStatementImpl extends DefaultDataNodeContainer<SchemaNodeIdentifier, AugmentStatement>
         implements AugmentEffectiveStatement, AugmentationSchemaNode, NamespaceRevisionAware,
-            ActionNodeContainerCompat<SchemaNodeIdentifier, AugmentStatement>,
-            NotificationNodeContainerCompat<SchemaNodeIdentifier, AugmentStatement> {
-    private final SchemaPath targetPath;
-    private final QNameModule rootModuleQName;
-    private final @NonNull ImmutableSet<ActionDefinition> actions;
-    private final @NonNull ImmutableSet<NotificationDefinition> notifications;
-    private final RevisionAwareXPath whenCondition;
-    private final AugmentationSchemaNode copyOf;
-
-    AugmentEffectiveStatementImpl(
-            final StmtContext<SchemaNodeIdentifier, AugmentStatement, AugmentEffectiveStatement> ctx) {
-        super(ctx);
-        targetPath = ctx.coerceStatementArgument().asSchemaPath();
-        rootModuleQName = StmtContextUtils.getRootModuleQName(ctx);
-        copyOf = (AugmentationSchemaNode) ctx.getOriginalCtx().map(StmtContext::buildEffective).orElse(null);
-        whenCondition = findFirstEffectiveSubstatementArgument(WhenEffectiveStatement.class).orElse(null);
-
-        // initSubstatementCollections
-        final ImmutableSet.Builder<ActionDefinition> actionsBuilder = ImmutableSet.builder();
-        final ImmutableSet.Builder<NotificationDefinition> notificationsBuilder = ImmutableSet.builder();
-        for (final EffectiveStatement<?, ?> effectiveStatement : effectiveSubstatements()) {
-            if (effectiveStatement instanceof ActionDefinition) {
-                actionsBuilder.add((ActionDefinition) effectiveStatement);
-            } else if (effectiveStatement instanceof NotificationDefinition) {
-                notificationsBuilder.add((NotificationDefinition) effectiveStatement);
-            }
-        }
-
-        actions = actionsBuilder.build();
-        notifications = notificationsBuilder.build();
+            DocumentedNodeMixin.WithStatus<SchemaNodeIdentifier, AugmentStatement>,
+            DataNodeContainerMixin<SchemaNodeIdentifier, AugmentStatement>,
+            ActionNodeContainerMixin<SchemaNodeIdentifier, AugmentStatement>,
+            NotificationNodeContainerMixin<SchemaNodeIdentifier, AugmentStatement>,
+            WhenConditionMixin<SchemaNodeIdentifier, AugmentStatement> {
+    private final @Nullable AugmentationSchemaNode original;
+    private final @NonNull QNameModule rootModuleQName;
+    private final int flags;
+
+    AugmentEffectiveStatementImpl(final AugmentStatement declared, final int flags, final QNameModule rootModuleQName,
+            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements, final StatementSourceReference ref,
+            final @Nullable AugmentationSchemaNode original) {
+        super(declared, ref, substatements);
+        this.rootModuleQName = requireNonNull(rootModuleQName);
+        this.flags = flags;
+        this.original = original;
     }
 
     @Override
-    protected Collection<? extends EffectiveStatement<?, ?>> initSubstatements(
-            final StmtContext<SchemaNodeIdentifier, AugmentStatement, ?> ctx,
-            final Collection<? extends StmtContext<?, ?, ?>> substatementsInit) {
-        final StatementContextBase<?, ?, ?> implicitDef = ctx.getFromNamespace(AugmentImplicitHandlingNamespace.class,
-            ctx);
-        return implicitDef == null ? super.initSubstatements(ctx, substatementsInit)
-                : Collections2.transform(Collections2.filter(substatementsInit,
-                    StmtContext::isSupportedToBuildEffective),
-                    subCtx -> {
-                        verify(subCtx instanceof StatementContextBase);
-                        return implicitDef.wrapWithImplicit((StatementContextBase<?, ?, ?>) subCtx).buildEffective();
-                    });
+    public SchemaNodeIdentifier argument() {
+        return getDeclared().argument();
     }
 
     @Override
     public Optional<AugmentationSchemaNode> getOriginalDefinition() {
-        return Optional.ofNullable(this.copyOf);
+        return Optional.ofNullable(this.original);
     }
 
     @Override
     public SchemaPath getTargetPath() {
-        return targetPath;
+        return argument().asSchemaPath();
     }
 
     @Override
-    public Optional<RevisionAwareXPath> getWhenCondition() {
-        return Optional.ofNullable(whenCondition);
+    public int flags() {
+        return flags;
     }
 
     @Override
@@ -112,22 +82,12 @@ final class AugmentEffectiveStatementImpl
         return rootModuleQName.getRevision();
     }
 
-    @Override
-    public Set<ActionDefinition> getActions() {
-        return actions;
-    }
-
-    @Override
-    public Set<NotificationDefinition> getNotifications() {
-        return notifications;
-    }
-
     @Override
     public int hashCode() {
         final int prime = 17;
         int result = 1;
-        result = prime * result + Objects.hashCode(targetPath);
-        result = prime * result + Objects.hashCode(whenCondition);
+        result = prime * result + Objects.hashCode(getTargetPath());
+        result = prime * result + Objects.hashCode(getWhenCondition());
         result = prime * result + getChildNodes().hashCode();
         return result;
     }
@@ -141,13 +101,15 @@ final class AugmentEffectiveStatementImpl
             return false;
         }
         final AugmentEffectiveStatementImpl other = (AugmentEffectiveStatementImpl) obj;
-        return Objects.equals(targetPath, other.targetPath) && Objects.equals(whenCondition, other.whenCondition)
+        return Objects.equals(getTargetPath(), other.getTargetPath())
+                && Objects.equals(getWhenCondition(), other.getWhenCondition())
                 && getChildNodes().equals(other.getChildNodes());
     }
 
     @Override
+
     public String toString() {
-        return AugmentEffectiveStatementImpl.class.getSimpleName() + "[" + "targetPath=" + targetPath + ", when="
-                + whenCondition + "]";
+        return AugmentEffectiveStatementImpl.class.getSimpleName() + "[" + "targetPath=" + getTargetPath() + ", when="
+                + getWhenCondition() + "]";
     }
 }
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
+ * Copyright (c) 2020 PANTHEON.tech, s.r.o. and others.  All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
@@ -9,11 +9,11 @@ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.augment;
 
 import org.opendaylight.yangtools.yang.model.api.stmt.AugmentStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier;
-import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredStatement.WithArgument;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
 
-final class AugmentStatementImpl extends AbstractDeclaredStatement<SchemaNodeIdentifier> implements AugmentStatement {
-    AugmentStatementImpl(final StmtContext<SchemaNodeIdentifier, AugmentStatement, ?> context) {
+final class EmptyAugmentStatement extends WithArgument<SchemaNodeIdentifier> implements AugmentStatement {
+    EmptyAugmentStatement(final StmtContext<SchemaNodeIdentifier, ?, ?> context) {
         super(context);
     }
 }
diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/augment/RegularAugmentStatement.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/augment/RegularAugmentStatement.java
new file mode 100644 (file)
index 0000000..ca39c66
--- /dev/null
@@ -0,0 +1,22 @@
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.augment;
+
+import com.google.common.collect.ImmutableList;
+import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.AugmentStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredStatement.WithArgument.WithSubstatements;
+import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
+
+final class RegularAugmentStatement extends WithSubstatements<SchemaNodeIdentifier> implements AugmentStatement {
+    RegularAugmentStatement(final StmtContext<SchemaNodeIdentifier, ?, ?> ctx,
+            final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+        super(ctx, substatements);
+    }
+}