Remove AugmentationSchemaNode.getOriginalDefinition()
[yangtools.git] / model / yang-model-ri / src / main / java / org / opendaylight / yangtools / yang / model / ri / stmt / EffectiveStatements.java
index 36a305f87bf7d3fba364b2a107b07974fa9cf265..e9ca7fc01d90cbe645516d760213c5b64540e42a 100644 (file)
@@ -17,18 +17,9 @@ import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.QNameModule;
-import org.opendaylight.yangtools.yang.common.SchemaNodeIdentifier;
-import org.opendaylight.yangtools.yang.model.api.AnydataSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.AnyxmlSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.CaseSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.ElementCountConstraint;
 import org.opendaylight.yangtools.yang.model.api.IdentitySchemaNode;
-import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.ActionEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.ActionStatement;
@@ -140,6 +131,7 @@ import org.opendaylight.yangtools.yang.model.api.stmt.RevisionEffectiveStatement
 import org.opendaylight.yangtools.yang.model.api.stmt.RevisionStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.RpcEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.RpcStatement;
+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.StatusStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.TypedefEffectiveStatement;
@@ -160,11 +152,11 @@ import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyRequireInstanceStatement;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyStatusStatement;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.decl.EmptyYangVersionStatement;
+import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.AbstractChoiceEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.AbstractContainerEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.AbstractLeafEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.ActionEffectiveStatementImpl;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.AugmentEffectiveStatementImpl;
-import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.ChoiceEffectiveStatementImpl;
-import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.ContainerEffectiveStatementImpl;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.DeclaredCaseEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.DeclaredInputEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.DeclaredOutputEffectiveStatement;
@@ -176,8 +168,10 @@ import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyArgumentEffec
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyBaseEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyBelongsToEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyBitEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyChoiceEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyConfigEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyContactEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyContainerEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyDefaultEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyDescriptionEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyEnumEffectiveStatement;
@@ -186,6 +180,7 @@ import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyErrorMessageE
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyFeatureEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyForeignKeyEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyFractionDigitsEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyGroupingEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyIdentityEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyIfFeatureEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyIncludeEffectiveStatement;
@@ -220,7 +215,6 @@ import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyWhenEffective
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyYangVersionEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyYinElementEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.ExtensionEffectiveStatementImpl;
-import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.GroupingEffectiveStatementImpl;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.ImportEffectiveStatementImpl;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.NotificationEffectiveStatementImpl;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularAnydataEffectiveStatement;
@@ -229,8 +223,10 @@ import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularArgumentEff
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularBaseEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularBelongsToEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularBitEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularChoiceEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularConfigEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularContactEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularContainerEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularDefaultEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularDescriptionEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularEnumEffectiveStatement;
@@ -239,6 +235,7 @@ import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularErrorMessag
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularFeatureEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularForeignKeyEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularFractionDigitsEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularGroupingEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularIdentityEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularIfFeatureEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularIncludeEffectiveStatement;
@@ -277,11 +274,12 @@ import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.SlimLeafListEffect
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.TypedefEffectiveStatementImpl;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.UndeclaredCaseEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.UndeclaredInputEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.UndeclaredLeafEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.UndeclaredOutputEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.spi.meta.SubstatementIndexingException;
 
 /**
- * Static entry point to instantiating {@link EffectiveStatement} covered in the {@code RFC7950} metamodel.
+ * Static entry point to instantiating declared {@link EffectiveStatement} covered in the {@code RFC7950} metamodel.
  */
 @Beta
 @NonNullByDefault
@@ -303,43 +301,37 @@ public final class EffectiveStatements {
     }
 
     public static AnydataEffectiveStatement copyAnydata(final AnydataEffectiveStatement original, final QName argument,
-            final int flags, final @Nullable AnydataSchemaNode newOriginal) {
+            final int flags) {
         if (original instanceof RegularAnydataEffectiveStatement) {
-            return new RegularAnydataEffectiveStatement((RegularAnydataEffectiveStatement) original, argument, flags,
-                newOriginal);
+            return new RegularAnydataEffectiveStatement((RegularAnydataEffectiveStatement) original, argument, flags);
         } else if (original instanceof EmptyAnydataEffectiveStatement) {
-            return new EmptyAnydataEffectiveStatement((EmptyAnydataEffectiveStatement) original, argument, flags,
-                newOriginal);
+            return new EmptyAnydataEffectiveStatement((EmptyAnydataEffectiveStatement) original, argument, flags);
         } else {
             throw new IllegalArgumentException("Unsupported original " + original);
         }
     }
 
     public static AnydataEffectiveStatement createAnydata(final AnydataStatement declared, final QName argument,
-            final int flags, final ImmutableList<? extends EffectiveStatement<?, ?>> substatements,
-            final @Nullable AnydataSchemaNode original) {
-        return substatements.isEmpty() ? new EmptyAnydataEffectiveStatement(declared, argument, flags, original)
-            : new RegularAnydataEffectiveStatement(declared, argument, flags, original, substatements);
+            final int flags, final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+        return substatements.isEmpty() ? new EmptyAnydataEffectiveStatement(declared, argument, flags)
+            : new RegularAnydataEffectiveStatement(declared, argument, flags, substatements);
     }
 
     public static AnyxmlEffectiveStatement copyAnyxml(final AnyxmlEffectiveStatement original, final QName argument,
-            final int flags, final @Nullable AnyxmlSchemaNode newOriginal) {
+            final int flags) {
         if (original instanceof RegularAnyxmlEffectiveStatement) {
-            return new RegularAnyxmlEffectiveStatement((RegularAnyxmlEffectiveStatement) original, argument, flags,
-                newOriginal);
+            return new RegularAnyxmlEffectiveStatement((RegularAnyxmlEffectiveStatement) original, argument, flags);
         } else if (original instanceof EmptyAnyxmlEffectiveStatement) {
-            return new EmptyAnyxmlEffectiveStatement((EmptyAnyxmlEffectiveStatement) original, argument, flags,
-                newOriginal);
+            return new EmptyAnyxmlEffectiveStatement((EmptyAnyxmlEffectiveStatement) original, argument, flags);
         } else {
             throw new IllegalArgumentException("Unsupported original " + original);
         }
     }
 
     public static AnyxmlEffectiveStatement createAnyxml(final AnyxmlStatement declared, final QName argument,
-            final int flags, final ImmutableList<? extends EffectiveStatement<?, ?>> substatements,
-            final @Nullable AnyxmlSchemaNode original) {
-        return substatements.isEmpty() ? new EmptyAnyxmlEffectiveStatement(declared, argument, flags, original)
-            : new RegularAnyxmlEffectiveStatement(declared, argument, flags, original, substatements);
+            final int flags, final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+        return substatements.isEmpty() ? new EmptyAnyxmlEffectiveStatement(declared, argument, flags)
+            : new RegularAnyxmlEffectiveStatement(declared, argument, flags, substatements);
     }
 
     public static ArgumentEffectiveStatement createArgument(final ArgumentStatement declared,
@@ -350,9 +342,9 @@ public final class EffectiveStatements {
 
     public static AugmentEffectiveStatement createAugment(final AugmentStatement declared,
             final SchemaNodeIdentifier argument, final int flags, final QNameModule rootModuleQName,
-            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements,
-            final @Nullable AugmentationSchemaNode original) throws SubstatementIndexingException {
-        return new AugmentEffectiveStatementImpl(declared, argument, flags, rootModuleQName, substatements, original);
+            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements)
+                throws SubstatementIndexingException {
+        return new AugmentEffectiveStatementImpl(declared, argument, flags, rootModuleQName, substatements);
     }
 
     public static BaseEffectiveStatement createBase(final BaseStatement declared,
@@ -374,40 +366,36 @@ public final class EffectiveStatements {
     }
 
     public static CaseEffectiveStatement copyCase(final CaseEffectiveStatement original, final QName argument,
-            final int flags, final @Nullable CaseSchemaNode newOriginal) {
+            final int flags) {
         if (original instanceof DeclaredCaseEffectiveStatement) {
-            return new DeclaredCaseEffectiveStatement((DeclaredCaseEffectiveStatement) original, argument, flags,
-                newOriginal);
+            return new DeclaredCaseEffectiveStatement((DeclaredCaseEffectiveStatement) original, argument, flags);
         } else if (original instanceof UndeclaredCaseEffectiveStatement) {
-            return new UndeclaredCaseEffectiveStatement((UndeclaredCaseEffectiveStatement) original, argument, flags,
-                newOriginal);
+            return new UndeclaredCaseEffectiveStatement((UndeclaredCaseEffectiveStatement) original, argument, flags);
         } else {
             throw new IllegalArgumentException("Unsupported origin " + original);
         }
     }
 
-    public static CaseEffectiveStatement createCase(final QName argument, final int flags,
-            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements,
-            final @Nullable CaseSchemaNode original) {
-        return new UndeclaredCaseEffectiveStatement(substatements, argument, flags, original);
-    }
-
     public static CaseEffectiveStatement createCase(final CaseStatement declared, final QName argument,
-            final int flags, final ImmutableList<? extends EffectiveStatement<?, ?>> substatements,
-            final @Nullable CaseSchemaNode original) {
-        return new DeclaredCaseEffectiveStatement(declared, substatements, argument, flags, original);
+            final int flags, final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+        return new DeclaredCaseEffectiveStatement(declared, substatements, argument, flags);
     }
 
     public static ChoiceEffectiveStatement copyChoice(final ChoiceEffectiveStatement original,
-            final QName argument, final int flags, final @Nullable ChoiceSchemaNode newOriginal) {
-        checkArgument(original instanceof ChoiceEffectiveStatementImpl, "Unsupported original %s", original);
-        return new ChoiceEffectiveStatementImpl((ChoiceEffectiveStatementImpl) original, argument, flags, newOriginal);
+            final QName argument, final int flags) {
+        checkArgument(original instanceof AbstractChoiceEffectiveStatement, "Unsupported original %s", original);
+        final var orig = (AbstractChoiceEffectiveStatement) original;
+        return argument.equals(orig.getDeclared().argument()) && orig.getDefaultCase().isEmpty()
+            ? new EmptyChoiceEffectiveStatement(orig, flags)
+                : new RegularChoiceEffectiveStatement((AbstractChoiceEffectiveStatement) original, argument, flags);
     }
 
     public static ChoiceEffectiveStatement createChoice(final ChoiceStatement declared, final QName argument,
             final int flags, final ImmutableList<? extends EffectiveStatement<?, ?>> substatements,
-            final @Nullable CaseSchemaNode defaultCase, final @Nullable ChoiceSchemaNode original) {
-        return new ChoiceEffectiveStatementImpl(declared, substatements, argument, flags, defaultCase, original);
+            final @Nullable CaseSchemaNode defaultCase) {
+        return defaultCase == null && argument.equals(declared.argument())
+            ? new EmptyChoiceEffectiveStatement(declared, substatements, flags)
+                : new RegularChoiceEffectiveStatement(declared, substatements, argument, flags, defaultCase);
     }
 
     public static ConfigEffectiveStatement createConfig(final boolean argument) {
@@ -435,15 +423,18 @@ public final class EffectiveStatements {
     }
 
     public static ContainerEffectiveStatement copyContainer(final ContainerEffectiveStatement original,
-            final QName argument, final int flags, final @Nullable ContainerSchemaNode orig) {
-        checkArgument(original instanceof ContainerEffectiveStatementImpl, "Unsupported original %s", original);
-        return new ContainerEffectiveStatementImpl((ContainerEffectiveStatementImpl) original, argument, flags, orig);
+            final QName argument, final int flags) {
+        checkArgument(original instanceof AbstractContainerEffectiveStatement, "Unsupported original %s", original);
+        final var orig = (AbstractContainerEffectiveStatement) original;
+        return argument.equals(orig.getDeclared().argument()) ? new EmptyContainerEffectiveStatement(orig, flags)
+            : new RegularContainerEffectiveStatement(orig, argument, flags);
     }
 
     public static ContainerEffectiveStatement createContainer(final ContainerStatement declared, final QName argument,
-            final int flags, final ImmutableList<? extends EffectiveStatement<?, ?>> substatements,
-            final @Nullable ContainerSchemaNode original) {
-        return new ContainerEffectiveStatementImpl(declared, substatements, argument, flags, original);
+            final int flags, final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+        return argument.equals(declared.argument())
+            ? new EmptyContainerEffectiveStatement(declared, substatements, flags)
+                : new RegularContainerEffectiveStatement(declared, substatements, argument, flags);
     }
 
     public static DefaultEffectiveStatement createDefault(final DefaultStatement declared,
@@ -510,7 +501,9 @@ public final class EffectiveStatements {
     public static GroupingEffectiveStatement createGrouping(final GroupingStatement declared,
             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements, final QName argument,
             final int flags) throws SubstatementIndexingException {
-        return new GroupingEffectiveStatementImpl(declared, substatements, argument, flags);
+        return argument.equals(declared.argument())
+            ? new EmptyGroupingEffectiveStatement(declared, substatements, flags)
+                : new RegularGroupingEffectiveStatement(declared, substatements, argument, flags);
     }
 
     public static IfFeatureEffectiveStatement createIfFeature(final IfFeatureStatement declared,
@@ -552,12 +545,6 @@ public final class EffectiveStatements {
         }
     }
 
-    public static InputEffectiveStatement createInput(final QName argument, final int flags,
-            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements)
-            throws SubstatementIndexingException {
-        return new UndeclaredInputEffectiveStatement(substatements, argument, flags);
-    }
-
     public static InputEffectiveStatement createInput(final InputStatement declared, final QName argument,
             final int flags, final ImmutableList<? extends EffectiveStatement<?, ?>> substatements)
                 throws SubstatementIndexingException {
@@ -575,31 +562,34 @@ public final class EffectiveStatements {
     }
 
     public static LeafEffectiveStatement copyLeaf(final LeafEffectiveStatement original, final QName argument,
-            final int flags, final @Nullable LeafSchemaNode newOriginal) {
-        checkArgument(original instanceof AbstractLeafEffectiveStatement, "Unsupported original %s", original);
-        return new RegularLeafEffectiveStatement((AbstractLeafEffectiveStatement) original, argument, flags,
-            newOriginal);
+            final int flags) {
+        if (original instanceof AbstractLeafEffectiveStatement) {
+            final var orig = (AbstractLeafEffectiveStatement) original;
+            return argument.equals(orig.getDeclared().argument()) ? new EmptyLeafEffectiveStatement(orig, flags)
+                : new RegularLeafEffectiveStatement(orig, argument, flags);
+        } else if (original instanceof UndeclaredLeafEffectiveStatement) {
+            return new UndeclaredLeafEffectiveStatement((UndeclaredLeafEffectiveStatement) original, argument, flags);
+        } else {
+            throw new IllegalArgumentException("Unsupported original " + original);
+        }
     }
 
     public static LeafEffectiveStatement createLeaf(final LeafStatement declared, final QName argument, final int flags,
-            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements,
-            final @Nullable LeafSchemaNode original)  throws SubstatementIndexingException {
-        return original == null ? new EmptyLeafEffectiveStatement(declared, argument, flags, substatements)
-            : new RegularLeafEffectiveStatement(declared, argument, flags, substatements, original);
+            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements)
+                throws SubstatementIndexingException {
+        return argument.equals(declared.argument()) ? new EmptyLeafEffectiveStatement(declared, flags, substatements)
+            : new RegularLeafEffectiveStatement(declared, argument, flags, substatements);
     }
 
     public static LeafListEffectiveStatement copyLeafList(final LeafListEffectiveStatement original,
-            final QName argument, final int flags, final @Nullable LeafListSchemaNode newOriginal) {
+            final QName argument, final int flags) {
         if (original instanceof RegularLeafListEffectiveStatement) {
-            return new RegularLeafListEffectiveStatement((RegularLeafListEffectiveStatement) original, newOriginal,
-                argument, flags);
+            return new RegularLeafListEffectiveStatement((RegularLeafListEffectiveStatement) original, argument, flags);
         } else if (original instanceof SlimLeafListEffectiveStatement) {
-            return new SlimLeafListEffectiveStatement((SlimLeafListEffectiveStatement) original, newOriginal, argument,
-                flags);
+            return new SlimLeafListEffectiveStatement((SlimLeafListEffectiveStatement) original, argument, flags);
         } else if (original instanceof EmptyLeafListEffectiveStatement) {
             // Promote to slim
-            return new SlimLeafListEffectiveStatement((EmptyLeafListEffectiveStatement) original, newOriginal, argument,
-                flags);
+            return new SlimLeafListEffectiveStatement((EmptyLeafListEffectiveStatement) original, argument, flags);
         } else {
             throw new IllegalArgumentException("Unsupported original " + original);
         }
@@ -607,17 +597,16 @@ public final class EffectiveStatements {
 
     public static LeafListEffectiveStatement createLeafList(final LeafListStatement declared, final QName argument,
             final int flags, final ImmutableList<? extends EffectiveStatement<?, ?>> substatements,
-            final ImmutableSet<String> defaultValues, final @Nullable ElementCountConstraint elementCountConstraint,
-            final @Nullable LeafListSchemaNode original)
+            final ImmutableSet<String> defaultValues, final @Nullable ElementCountConstraint elementCountConstraint)
                 throws SubstatementIndexingException {
         if (defaultValues.isEmpty()) {
-            return original == null && elementCountConstraint == null
-                ? new EmptyLeafListEffectiveStatement(declared, argument, flags, substatements)
-                    : new SlimLeafListEffectiveStatement(declared, argument, flags, substatements, original,
+            return elementCountConstraint == null && argument.equals(declared.argument())
+                ? new EmptyLeafListEffectiveStatement(declared, flags, substatements)
+                    : new SlimLeafListEffectiveStatement(declared, argument, flags, substatements,
                         elementCountConstraint);
         }
 
-        return new RegularLeafListEffectiveStatement(declared, argument, flags, substatements, original, defaultValues,
+        return new RegularLeafListEffectiveStatement(declared, argument, flags, substatements, defaultValues,
             elementCountConstraint);
     }
 
@@ -628,13 +617,11 @@ public final class EffectiveStatements {
     }
 
     public static ListEffectiveStatement copyList(final ListEffectiveStatement original, final QName argument,
-            final int flags, final @Nullable ListSchemaNode newOriginal) {
+            final int flags) {
         if (original instanceof RegularListEffectiveStatement) {
-            return new RegularListEffectiveStatement((RegularListEffectiveStatement) original, argument, flags,
-                newOriginal);
+            return new RegularListEffectiveStatement((RegularListEffectiveStatement) original, argument, flags);
         } else if (original instanceof EmptyListEffectiveStatement) {
-            return new RegularListEffectiveStatement((EmptyListEffectiveStatement) original, argument, flags,
-                newOriginal);
+            return new RegularListEffectiveStatement((EmptyListEffectiveStatement) original, argument, flags);
         } else {
             throw new IllegalArgumentException("Unsupported original " + original);
         }
@@ -642,12 +629,11 @@ public final class EffectiveStatements {
 
     public static ListEffectiveStatement createList(final ListStatement declared, final QName argument,
             final int flags, final ImmutableList<? extends EffectiveStatement<?, ?>> substatements,
-            final ImmutableList<QName> keyDefinition, final @Nullable ElementCountConstraint elementCountConstraint,
-            final @Nullable ListSchemaNode original) {
-        return original == null && elementCountConstraint == null
-            ? new EmptyListEffectiveStatement(declared, argument, flags, substatements, keyDefinition)
+            final ImmutableList<QName> keyDefinition, final @Nullable ElementCountConstraint elementCountConstraint) {
+        return elementCountConstraint == null && argument.equals(declared.argument())
+            ? new EmptyListEffectiveStatement(declared, flags, substatements, keyDefinition)
                 : new RegularListEffectiveStatement(declared, argument, flags, substatements, keyDefinition,
-                    elementCountConstraint, original);
+                    elementCountConstraint);
     }
 
     public static MandatoryEffectiveStatement createMandatory(final MandatoryStatement declared) {
@@ -719,12 +705,6 @@ public final class EffectiveStatements {
         }
     }
 
-    public static OutputEffectiveStatement createOutput(final QName argument, final int flags,
-            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements)
-            throws SubstatementIndexingException {
-        return new UndeclaredOutputEffectiveStatement(substatements, argument, flags);
-    }
-
     public static OutputEffectiveStatement createOutput(final OutputStatement declared, final QName argument,
             final int flags, final ImmutableList<? extends EffectiveStatement<?, ?>> substatements)
                 throws SubstatementIndexingException {