Add support for rebinding type definitions 43/94843/10
authorRobert Varga <robert.varga@pantheon.tech>
Wed, 27 Jan 2021 15:12:47 +0000 (16:12 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Sat, 30 Jan 2021 08:28:33 +0000 (09:28 +0100)
In order to rebase TypeDefinition efficiently we need a factory
when can just switch the name of a definition. Define a new interface,
TypeDefinitionBinder and implement it by all yang-model-util types.

This allows them to perform an efficient copy instead of a full
rebuild -- a facility used for leaf-lists.

JIRA: YANGTOOLS-1213
Change-Id: I366743dab1faa6f8349fdd0fe8f5d65558ca40e8
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
56 files changed:
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/AbstractBaseType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/AbstractDerivedType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/AbstractLengthRestrictedDerivedType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/AbstractLengthRestrictedType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/AbstractRangeRestrictedBaseType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/AbstractRangeRestrictedDerivedType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/AbstractRangeRestrictedType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/AbstractRestrictedType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/AbstractTypeDefinition.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/BaseBitsType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/BaseDecimalType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/BaseEnumerationType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/BaseIdentityrefType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/BaseInt32Type.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/BaseLeafrefType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/BaseUnionType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/DerivedBinaryType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/DerivedBitsType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/DerivedBooleanType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/DerivedDecimalType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/DerivedEmptyType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/DerivedEnumerationType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/DerivedIdentityrefType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/DerivedInstanceIdentifierType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/DerivedInt16Type.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/DerivedInt32Type.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/DerivedInt64Type.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/DerivedInt8Type.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/DerivedLeafrefType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/DerivedStringType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/DerivedUint16Type.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/DerivedUint32Type.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/DerivedUint64Type.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/DerivedUint8Type.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/DerivedUnionType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/RestrictedBinaryType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/RestrictedBitsType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/RestrictedBooleanType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/RestrictedDecimalType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/RestrictedEmptyType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/RestrictedEnumerationType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/RestrictedIdentityrefType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/RestrictedInstanceIdentifierType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/RestrictedInt16Type.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/RestrictedInt32Type.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/RestrictedInt64Type.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/RestrictedInt8Type.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/RestrictedLeafrefType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/RestrictedStringType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/RestrictedUint16Type.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/RestrictedUint32Type.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/RestrictedUint64Type.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/RestrictedUint8Type.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/RestrictedUnionType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/TypeBuilder.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/leaf_list/AbstractLeafListEffectiveStatement.java

index 457cb645a4f4e974e5a5b9ea08d9e4d4d710de24..da34949fc593e4f2206360c1576cee5d8b2f81a0 100644 (file)
@@ -24,6 +24,10 @@ abstract class AbstractBaseType<T extends TypeDefinition<T>> extends AbstractTyp
         super(qname, unknownSchemaNodes);
     }
 
+    AbstractBaseType(final AbstractBaseType<T> original, final QName qname) {
+        super(original, qname);
+    }
+
     @Override
     public final T getBaseType() {
         return null;
@@ -53,4 +57,11 @@ abstract class AbstractBaseType<T extends TypeDefinition<T>> extends AbstractTyp
     public final Status getStatus() {
         return Status.CURRENT;
     }
+
+    @Override
+    T bindTo(final QName newName) {
+        // Most implementations just return self
+        // FIXME: or do we want to assert?
+        return (T) this;
+    }
 }
index e8fa0dcb8738abc4572d961e318363de4ded1c18..50cf6befe20d97804ffc30075e7239c9aa31fca5 100644 (file)
@@ -38,6 +38,16 @@ abstract class AbstractDerivedType<T extends TypeDefinition<T>> extends Abstract
         this.units = units;
     }
 
+    AbstractDerivedType(final AbstractDerivedType<T> original, final QName qname) {
+        super(original, qname);
+        this.baseType = original.baseType;
+        this.status = original.status;
+        this.defaultValue = original.defaultValue;
+        this.description = original.description;
+        this.reference = original.reference;
+        this.units = original.units;
+    }
+
     @Override
     public final T getBaseType() {
         return baseType instanceof AbstractRestrictedType ? baseType.getBaseType() : baseType;
index 8e6928155e782d0e5b966c030f72981201350b76..aaab2e807daa7213873369b1867c51d0046aa60c 100644 (file)
@@ -23,6 +23,10 @@ abstract class AbstractLengthRestrictedDerivedType<T extends LengthRestrictedTyp
         super(baseType, qname, defaultValue, description, reference, status, units, unknownSchemaNodes);
     }
 
+    AbstractLengthRestrictedDerivedType(final AbstractLengthRestrictedDerivedType<T> original, final QName qname) {
+        super(original, qname);
+    }
+
     @Override
     public final Optional<LengthConstraint> getLengthConstraint() {
         return baseType().getLengthConstraint();
index ee1015f2e156a1d93ae5a53adaae436052f4664e..c0f7ecbee7f66530c864a2b04797bf24e2e3aeaf 100644 (file)
@@ -26,6 +26,11 @@ abstract class AbstractLengthRestrictedType<T extends LengthRestrictedTypeDefini
         this.lengthConstraint = lengthConstraint;
     }
 
+    AbstractLengthRestrictedType(final AbstractLengthRestrictedType<T> original, final QName qname) {
+        super(original, qname);
+        this.lengthConstraint = original.lengthConstraint;
+    }
+
     @Override
     public final Optional<LengthConstraint> getLengthConstraint() {
         return Optional.ofNullable(lengthConstraint);
index 3c93afe68a64a4610526a4fed9a22aa0c639d096..4731b7bebb1b6c4255146f0852ce9e6c5707dad3 100644 (file)
@@ -58,6 +58,11 @@ abstract class AbstractRangeRestrictedBaseType<T extends RangeRestrictedTypeDefi
         this.rangeConstraint = requireNonNull(rangeConstraint);
     }
 
+    AbstractRangeRestrictedBaseType(final AbstractRangeRestrictedBaseType<T, N> original, final QName qname) {
+        super(original, qname);
+        this.rangeConstraint = original.rangeConstraint;
+    }
+
     @Override
     public final Optional<RangeConstraint<N>> getRangeConstraint() {
         return Optional.of(rangeConstraint);
index 15780ba1b0363f3162eecf69c7f1e8e966faee6e..75343553ec5fe789deeff5b82cf503ca490dd754 100644 (file)
@@ -25,6 +25,10 @@ abstract class AbstractRangeRestrictedDerivedType<T extends RangeRestrictedTypeD
         super(baseType, qname, defaultValue, description, reference, status, units, unknownSchemaNodes);
     }
 
+    AbstractRangeRestrictedDerivedType(final AbstractRangeRestrictedDerivedType<T, N> original, final QName qname) {
+        super(original, qname);
+    }
+
     @Override
     public final Optional<RangeConstraint<N>> getRangeConstraint() {
         return baseType().getRangeConstraint();
index 3ee5fb40a16045daaad6e7e3de10cd44caf1cc6b..747704eb8ed51453322a6589534a0601bdf9bd8c 100644 (file)
@@ -27,6 +27,11 @@ abstract class AbstractRangeRestrictedType<T extends RangeRestrictedTypeDefiniti
         this.rangeConstraint = rangeConstraint;
     }
 
+    AbstractRangeRestrictedType(final AbstractRangeRestrictedType<T, N> original, final QName qname) {
+        super(original, qname);
+        this.rangeConstraint = original.rangeConstraint;
+    }
+
     @Override
     public final Optional<RangeConstraint<N>> getRangeConstraint() {
         return Optional.ofNullable(rangeConstraint);
index fa98721a7481164e7c6cbf20ebfffc492400e221..35c7d1dd6047d04cd66c313f54eec86d21d5cde4 100644 (file)
@@ -26,6 +26,11 @@ abstract class AbstractRestrictedType<T extends TypeDefinition<T>> extends Abstr
         this.baseType = requireNonNull(baseType);
     }
 
+    AbstractRestrictedType(final AbstractRestrictedType<T> original, final QName qname) {
+        super(original, qname);
+        this.baseType = original.baseType;
+    }
+
     @Override
     public final T getBaseType() {
         return baseType;
index b4ab82da8e733d6dd12784299ce98967b35fec24..4c2a78de55c3dda4224f344f2c391804e3246e62 100644 (file)
@@ -26,6 +26,11 @@ abstract class AbstractTypeDefinition<T extends TypeDefinition<T>> implements Im
         this.unknownSchemaNodes = ImmutableList.copyOf(unknownSchemaNodes);
     }
 
+    AbstractTypeDefinition(final AbstractTypeDefinition<T> original, final QName qname) {
+        this.unknownSchemaNodes = original.unknownSchemaNodes;
+        this.qname = requireNonNull(qname);
+    }
+
     @Override
     public final QName getQName() {
         return qname;
@@ -36,6 +41,15 @@ abstract class AbstractTypeDefinition<T extends TypeDefinition<T>> implements Im
         return unknownSchemaNodes;
     }
 
+    /**
+     * Bind this type definition to a new {@link QName}. The resulting definition will be equivalent to this definition
+     * in all aspects except its path.
+     *
+     * @param newQName New {@link QName} to use
+     * @return Bound type definition
+     */
+    abstract @NonNull T bindTo(@NonNull QName newQName);
+
     @Override
     public abstract String toString();
 
index bbf02986545fd69f8658ea90c0e00aef4b96931b..6bd23a20d506af01e45b5541aa3d962ce19623d8 100644 (file)
@@ -23,6 +23,16 @@ final class BaseBitsType extends AbstractBaseType<BitsTypeDefinition> implements
         this.bits = ImmutableList.copyOf(bits);
     }
 
+    private BaseBitsType(final BaseBitsType original, final QName qname) {
+        super(original, qname);
+        this.bits = original.bits;
+    }
+
+    @Override
+    BaseBitsType bindTo(final QName newQName) {
+        return new BaseBitsType(this, newQName);
+    }
+
     @Override
     public Collection<? extends Bit> getBits() {
         return bits;
index 14cabbe0b06e67799d164a1d48fcf6fc8c0993a5..8f1ae76ef7ff3df7680e6386f77155ab89c0196e 100644 (file)
@@ -83,6 +83,16 @@ final class BaseDecimalType extends AbstractRangeRestrictedBaseType<DecimalTypeD
         this.fractionDigits = fractionDigits;
     }
 
+    private BaseDecimalType(final BaseDecimalType original, final QName qname) {
+        super(original, qname);
+        this.fractionDigits = original.fractionDigits;
+    }
+
+    @Override
+    BaseDecimalType bindTo(final QName newQName) {
+        return new BaseDecimalType(this, newQName);
+    }
+
     @Override
     public int getFractionDigits() {
         return fractionDigits;
index 451b89becf9d68170b92f6ebfb1e51a0e28b71c0..aba5dc374b588ae780a85f9c83d22f2b95b4c87f 100644 (file)
@@ -24,6 +24,16 @@ final class BaseEnumerationType extends AbstractBaseType<EnumTypeDefinition> imp
         this.values = ImmutableList.copyOf(values);
     }
 
+    private BaseEnumerationType(final BaseEnumerationType original, final QName qname) {
+        super(original, qname);
+        this.values = original.values;
+    }
+
+    @Override
+    BaseEnumerationType bindTo(final QName newQName) {
+        return new BaseEnumerationType(this, newQName);
+    }
+
     @Override
     public List<EnumPair> getValues() {
         return values;
index a9bd92a4e6ff558ffe17d840d983bdda6e353d1e..693e1178d292136d4482ba3f6b18b062cc15d900 100644 (file)
@@ -27,6 +27,16 @@ final class BaseIdentityrefType extends AbstractBaseType<IdentityrefTypeDefiniti
         this.identities = requireNonNull(identities);
     }
 
+    private BaseIdentityrefType(final BaseIdentityrefType original, final QName qname) {
+        super(original, qname);
+        this.identities = original.identities;
+    }
+
+    @Override
+    BaseIdentityrefType bindTo(final QName newQName) {
+        return new BaseIdentityrefType(this, newQName);
+    }
+
     @Override
     public Set<? extends IdentitySchemaNode> getIdentities() {
         return identities;
index 08935902f680d151e4a3d6f6e7194a175b9ed485..8e4d65f708228b178c79b29c2e5bb1b8444c839d 100644 (file)
@@ -33,5 +33,4 @@ final class BaseInt32Type extends AbstractRangeRestrictedBaseType<Int32TypeDefin
     public String toString() {
         return Int32TypeDefinition.toString(this);
     }
-
 }
index 7235927cd6c6dea129564895d43d0750c3e0b7a3..f767c8cd59989e2557aed9185d4241ae71c90843 100644 (file)
@@ -26,6 +26,17 @@ final class BaseLeafrefType extends AbstractBaseType<LeafrefTypeDefinition> impl
         this.requireInstance = requireInstance;
     }
 
+    private BaseLeafrefType(final BaseLeafrefType original, final QName qname) {
+        super(original, qname);
+        this.pathStatement = original.pathStatement;
+        this.requireInstance = original.requireInstance;
+    }
+
+    @Override
+    BaseLeafrefType bindTo(final QName newQName) {
+        return new BaseLeafrefType(this, newQName);
+    }
+
     @Override
     public PathExpression getPathStatement() {
         return pathStatement;
index b3dd99fea1f095b122db08b52585c20a127728eb..1d70b511b4364dce8f25c54623eec73155a9003d 100644 (file)
@@ -24,6 +24,16 @@ final class BaseUnionType extends AbstractBaseType<UnionTypeDefinition> implemen
         this.types = ImmutableList.copyOf(types);
     }
 
+    private BaseUnionType(final BaseUnionType original, final QName qname) {
+        super(original, qname);
+        this.types = original.types;
+    }
+
+    @Override
+    BaseUnionType bindTo(final QName newQName) {
+        return new BaseUnionType(this, newQName);
+    }
+
     @Override
     public List<TypeDefinition<?>> getTypes() {
         return types;
index 4e01d4de8395082f89a3f269c0e6ad4ac3cfa563..396014a7860b8c206517129dd2583c7b288b66ec 100644 (file)
@@ -21,6 +21,15 @@ final class DerivedBinaryType extends AbstractLengthRestrictedDerivedType<Binary
         super(baseType, qname, defaultValue, description, reference, status, units, unknownSchemNodes);
     }
 
+    private DerivedBinaryType(final DerivedBinaryType original, final QName qname) {
+        super(original, qname);
+    }
+
+    @Override
+    DerivedBinaryType bindTo(final QName newQName) {
+        return new DerivedBinaryType(this, newQName);
+    }
+
     @Override
     public int hashCode() {
         return BinaryTypeDefinition.hashCode(this);
index d0f534aa9024d6590eea2411b97811e80561c58d..047e718844186638e682e003d9aa8b5425503f07 100644 (file)
@@ -20,6 +20,15 @@ final class DerivedBitsType extends AbstractDerivedType<BitsTypeDefinition> impl
         super(baseType, qname, defaultValue, description, reference, status, units, unknownSchemNodes);
     }
 
+    private DerivedBitsType(final DerivedBitsType original, final QName qname) {
+        super(original, qname);
+    }
+
+    @Override
+    DerivedBitsType bindTo(final QName newQName) {
+        return new DerivedBitsType(this, newQName);
+    }
+
     @Override
     public Collection<? extends Bit> getBits() {
         return baseType().getBits();
index 0cbe1fae16a26fef6c3128554951bc97ce2bf3a5..a7ef7f7f561407c98d895fae9b7fffd412ab3ed9 100644 (file)
@@ -20,6 +20,15 @@ final class DerivedBooleanType extends AbstractDerivedType<BooleanTypeDefinition
         super(baseType, qname, defaultValue, description, reference, status, units, unknownSchemNodes);
     }
 
+    private DerivedBooleanType(final DerivedBooleanType original, final QName qname) {
+        super(original, qname);
+    }
+
+    @Override
+    DerivedBooleanType bindTo(final QName newQName) {
+        return new DerivedBooleanType(this, newQName);
+    }
+
     @Override
     public int hashCode() {
         return BooleanTypeDefinition.hashCode(this);
index 030194ac989483b0f30ef2399a9f4f81454762a1..905dad949c0a5e0247c65e53fea7420e62f468ca 100644 (file)
@@ -22,6 +22,15 @@ final class DerivedDecimalType extends AbstractRangeRestrictedDerivedType<Decima
         super(baseType, qname, defaultValue, description, reference, status, units, unknownSchemNodes);
     }
 
+    private DerivedDecimalType(final DerivedDecimalType original, final QName qname) {
+        super(original, qname);
+    }
+
+    @Override
+    DerivedDecimalType bindTo(final QName newQName) {
+        return new DerivedDecimalType(this, newQName);
+    }
+
     @Override
     public int getFractionDigits() {
         return baseType().getFractionDigits();
index 71763ec7f3f3d33a4e59cda3ad7d0e029d2ff2b4..ffe5869249f6d76a4c95170a75ebd86405dc6187 100644 (file)
@@ -15,11 +15,20 @@ import org.opendaylight.yangtools.yang.model.api.type.EmptyTypeDefinition;
 
 final class DerivedEmptyType extends AbstractDerivedType<EmptyTypeDefinition> implements EmptyTypeDefinition {
     DerivedEmptyType(final EmptyTypeDefinition baseType, final QName qname, final Object defaultValue,
-        final String description, final String reference, final Status status, final String units,
-        final Collection<? extends UnknownSchemaNode> unknownSchemNodes) {
+            final String description, final String reference, final Status status, final String units,
+            final Collection<? extends UnknownSchemaNode> unknownSchemNodes) {
         super(baseType, qname, defaultValue, description, reference, status, units, unknownSchemNodes);
     }
 
+    private DerivedEmptyType(final DerivedEmptyType original, final QName qname) {
+        super(original, qname);
+    }
+
+    @Override
+    DerivedEmptyType bindTo(final QName newQName) {
+        return new DerivedEmptyType(this, newQName);
+    }
+
     @Override
     public int hashCode() {
         return EmptyTypeDefinition.hashCode(this);
index d257ec6ae3cd59987b0292c84ac03d6deb40f6cc..7880b06909e85aa4dcc2366138acb64a20bc3951 100644 (file)
@@ -21,6 +21,15 @@ final class DerivedEnumerationType extends AbstractDerivedType<EnumTypeDefinitio
         super(baseType, qname, defaultValue, description, reference, status, units, unknownSchemNodes);
     }
 
+    private DerivedEnumerationType(final DerivedEnumerationType original, final QName qname) {
+        super(original, qname);
+    }
+
+    @Override
+    DerivedEnumerationType bindTo(final QName newQName) {
+        return new DerivedEnumerationType(this, newQName);
+    }
+
     @Override
     public List<EnumPair> getValues() {
         return baseType().getValues();
index be40a9859bc8413fb0cff367a72b711ec8e88cea..ee3a15fe20112f2a5d7a4b91a62997370cbdb9fc 100644 (file)
@@ -23,6 +23,15 @@ final class DerivedIdentityrefType extends AbstractDerivedType<IdentityrefTypeDe
         super(baseType, qname, defaultValue, description, reference, status, units, unknownSchemaNodes);
     }
 
+    private DerivedIdentityrefType(final DerivedIdentityrefType original, final QName qname) {
+        super(original, qname);
+    }
+
+    @Override
+    DerivedIdentityrefType bindTo(final QName newQName) {
+        return new DerivedIdentityrefType(this, newQName);
+    }
+
     @Override
     public Set<? extends IdentitySchemaNode> getIdentities() {
         return baseType().getIdentities();
index 572178ac06c18d5887f314d3bb32be9a30126e2a..12d3e7340aeeb2c1063614a6b4ccf2bc950dc9c4 100644 (file)
@@ -25,6 +25,16 @@ final class DerivedInstanceIdentifierType extends AbstractDerivedType<InstanceId
         this.requireInstance = requireInstance;
     }
 
+    private DerivedInstanceIdentifierType(final DerivedInstanceIdentifierType original, final QName qname) {
+        super(original, qname);
+        this.requireInstance = original.requireInstance;
+    }
+
+    @Override
+    DerivedInstanceIdentifierType bindTo(final QName newQName) {
+        return new DerivedInstanceIdentifierType(this, newQName);
+    }
+
     @Override
     public boolean requireInstance() {
         return requireInstance;
index 922f5df7a87781183d7f1bd8024367e40580b2a6..2e34af50ec9970034105f3d9851fab882f995d10 100644 (file)
@@ -21,6 +21,15 @@ final class DerivedInt16Type extends AbstractRangeRestrictedDerivedType<Int16Typ
         super(baseType, qname, defaultValue, description, reference, status, units, unknownSchemaNodes);
     }
 
+    private DerivedInt16Type(final DerivedInt16Type original, final QName qname) {
+        super(original, qname);
+    }
+
+    @Override
+    DerivedInt16Type bindTo(final QName newQName) {
+        return new DerivedInt16Type(this, newQName);
+    }
+
     @Override
     public int hashCode() {
         return Int16TypeDefinition.hashCode(this);
index 7a8c22ad12d99af4ff0b075c5841443ad9bbc5c8..1d02b9f430dfd47863ccf941dfd1e6f6b3d0ea80 100644 (file)
@@ -21,6 +21,15 @@ final class DerivedInt32Type extends AbstractRangeRestrictedDerivedType<Int32Typ
         super(baseType, qname, defaultValue, description, reference, status, units, unknownSchemaNodes);
     }
 
+    private DerivedInt32Type(final DerivedInt32Type original, final QName qname) {
+        super(original, qname);
+    }
+
+    @Override
+    DerivedInt32Type bindTo(final QName newQName) {
+        return new DerivedInt32Type(this, newQName);
+    }
+
     @Override
     public int hashCode() {
         return Int32TypeDefinition.hashCode(this);
index bb54d1dda6138e6934f5df6317de33b18e37870f..08d976d1fe7c30330cc1b996c0426ac659eb6ab9 100644 (file)
@@ -21,6 +21,15 @@ final class DerivedInt64Type extends AbstractRangeRestrictedDerivedType<Int64Typ
         super(baseType, qname, defaultValue, description, reference, status, units, unknownSchemaNodes);
     }
 
+    private DerivedInt64Type(final DerivedInt64Type original, final QName qname) {
+        super(original, qname);
+    }
+
+    @Override
+    DerivedInt64Type bindTo(final QName newQName) {
+        return new DerivedInt64Type(this, newQName);
+    }
+
     @Override
     public int hashCode() {
         return Int64TypeDefinition.hashCode(this);
index ceb998261843b25e889ffb244e868d1ab0124e5a..a069197dd1f1d4baad13faaabbcedeaae6f6d5c5 100644 (file)
@@ -21,6 +21,15 @@ final class DerivedInt8Type extends AbstractRangeRestrictedDerivedType<Int8TypeD
         super(baseType, qname, defaultValue, description, reference, status, units, unknownSchemaNodes);
     }
 
+    private DerivedInt8Type(final DerivedInt8Type original, final QName qname) {
+        super(original, qname);
+    }
+
+    @Override
+    DerivedInt8Type bindTo(final QName newQName) {
+        return new DerivedInt8Type(this, newQName);
+    }
+
     @Override
     public int hashCode() {
         return Int8TypeDefinition.hashCode(this);
index b0fb713e8b5989424bdebfa0737070c38fc8bcfe..d4dd8720289e43f9579abf958ea56803d4e4a7c1 100644 (file)
@@ -16,11 +16,20 @@ import org.opendaylight.yangtools.yang.model.api.type.LeafrefTypeDefinition;
 
 final class DerivedLeafrefType extends AbstractDerivedType<LeafrefTypeDefinition> implements LeafrefTypeDefinition {
     DerivedLeafrefType(final LeafrefTypeDefinition baseType, final QName qname, final Object defaultValue,
-        final String description, final String reference, final Status status, final String units,
-        final Collection<? extends UnknownSchemaNode> unknownSchemaNodes) {
+            final String description, final String reference, final Status status, final String units,
+            final Collection<? extends UnknownSchemaNode> unknownSchemaNodes) {
         super(baseType, qname, defaultValue, description, reference, status, units, unknownSchemaNodes);
     }
 
+    private DerivedLeafrefType(final DerivedLeafrefType original, final QName qname) {
+        super(original, qname);
+    }
+
+    @Override
+    DerivedLeafrefType bindTo(final QName newQName) {
+        return new DerivedLeafrefType(this, newQName);
+    }
+
     @Override
     public PathExpression getPathStatement() {
         return baseType().getPathStatement();
index 7104a02190cae7d643d3ef84b8c774e7814f105e..af73f6f05c0ef985fcbb284b0e662449592c46a2 100644 (file)
@@ -23,6 +23,15 @@ final class DerivedStringType extends AbstractLengthRestrictedDerivedType<String
         super(baseType, qname, defaultValue, description, reference, status, units, unknownSchemaNodes);
     }
 
+    private DerivedStringType(final DerivedStringType original, final QName qname) {
+        super(original, qname);
+    }
+
+    @Override
+    DerivedStringType bindTo(final QName newQName) {
+        return new DerivedStringType(this, newQName);
+    }
+
     @Override
     public List<PatternConstraint> getPatternConstraints() {
         return baseType().getPatternConstraints();
index 1c4a5fb305ce6515c8ce3e4379aa87362dea1315..a74594ef34590643276a7a6c885147ff2fa9b1c7 100644 (file)
@@ -22,6 +22,15 @@ final class DerivedUint16Type extends AbstractRangeRestrictedDerivedType<Uint16T
         super(baseType, qname, defaultValue, description, reference, status, units, unknownSchemaNodes);
     }
 
+    private DerivedUint16Type(final DerivedUint16Type original, final QName qname) {
+        super(original, qname);
+    }
+
+    @Override
+    DerivedUint16Type bindTo(final QName newQName) {
+        return new DerivedUint16Type(this, newQName);
+    }
+
     @Override
     public int hashCode() {
         return Uint16TypeDefinition.hashCode(this);
index 84845a8f9400c7538faccff663fac446491e4b74..594abc1c01120577d095926de4040ce6e6f3fa28 100644 (file)
@@ -22,6 +22,15 @@ final class DerivedUint32Type extends AbstractRangeRestrictedDerivedType<Uint32T
         super(baseType, qname, defaultValue, description, reference, status, units, unknownSchemaNodes);
     }
 
+    private DerivedUint32Type(final DerivedUint32Type original, final QName newQName) {
+        super(original, newQName);
+    }
+
+    @Override
+    DerivedUint32Type bindTo(final QName newQName) {
+        return new DerivedUint32Type(this, newQName);
+    }
+
     @Override
     public int hashCode() {
         return Uint32TypeDefinition.hashCode(this);
index 4e42313fc0985bc83bef035da3c78713f5d8aa6c..fa678d10e49438b378207d7f86e98f2a2b5fa64f 100644 (file)
@@ -22,6 +22,15 @@ final class DerivedUint64Type extends AbstractRangeRestrictedDerivedType<Uint64T
         super(baseType, qname, defaultValue, description, reference, status, units, unknownSchemaNodes);
     }
 
+    private DerivedUint64Type(final DerivedUint64Type original, final QName qname) {
+        super(original, qname);
+    }
+
+    @Override
+    DerivedUint64Type bindTo(final QName newQName) {
+        return new DerivedUint64Type(this, newQName);
+    }
+
     @Override
     public int hashCode() {
         return Uint64TypeDefinition.hashCode(this);
index c3edc77905695d13c70a7f7b008c905819afe7aa..e94d577ef991051c6466ced290fcdd096a5add32 100644 (file)
@@ -22,6 +22,15 @@ final class DerivedUint8Type extends AbstractRangeRestrictedDerivedType<Uint8Typ
         super(baseType, qname, defaultValue, description, reference, status, units, unknownSchemaNodes);
     }
 
+    private DerivedUint8Type(final DerivedUint8Type original, final QName qname) {
+        super(original, qname);
+    }
+
+    @Override
+    DerivedUint8Type bindTo(final QName newQName) {
+        return new DerivedUint8Type(this, newQName);
+    }
+
     @Override
     public int hashCode() {
         return Uint8TypeDefinition.hashCode(this);
index 57e549c6256b5d53f2df9b75e71239b255f2e27b..1631d625dfac9b7d4766b13e1ea86ae18cd19481 100644 (file)
@@ -22,6 +22,15 @@ final class DerivedUnionType extends AbstractDerivedType<UnionTypeDefinition> im
         super(baseType, qname, defaultValue, description, reference, status, units, unknownSchemaNodes);
     }
 
+    private DerivedUnionType(final DerivedUnionType original, final QName qname) {
+        super(original, qname);
+    }
+
+    @Override
+    DerivedUnionType bindTo(final QName newQName) {
+        return new DerivedUnionType(this, newQName);
+    }
+
     @Override
     public List<TypeDefinition<?>> getTypes() {
         return baseType().getTypes();
index 9b162bf893ed6aaf660dace2adfcd4e7d2f27005..31737fbb56f6eb110f9fed704a377ae5c573f02e 100644 (file)
@@ -22,6 +22,15 @@ final class RestrictedBinaryType extends AbstractLengthRestrictedType<BinaryType
         super(baseType, qname, unknownSchemaNodes, lengthConstraint);
     }
 
+    private RestrictedBinaryType(final RestrictedBinaryType original, final QName qname) {
+        super(original, qname);
+    }
+
+    @Override
+    RestrictedBinaryType bindTo(final QName newQName) {
+        return new RestrictedBinaryType(this, newQName);
+    }
+
     @Override
     public int hashCode() {
         return BinaryTypeDefinition.hashCode(this);
index ef650b2b174047b5011827db80744475a3cf4193..180b8efaa34d1c7346efeafd0677d5d7a70eba4a 100644 (file)
@@ -23,6 +23,16 @@ final class RestrictedBitsType extends AbstractRestrictedType<BitsTypeDefinition
         this.bits = ImmutableList.copyOf(bits);
     }
 
+    private RestrictedBitsType(final RestrictedBitsType original, final QName qname) {
+        super(original, qname);
+        this.bits = original.bits;
+    }
+
+    @Override
+    RestrictedBitsType bindTo(final QName newQName) {
+        return new RestrictedBitsType(this, newQName);
+    }
+
     @Override
     public Collection<? extends Bit> getBits() {
         return bits;
index 8327be99874cd422533ae3548dc2e523f1a282d2..004306ae9740df94a998fbc61828e9444367f7d2 100644 (file)
@@ -19,6 +19,15 @@ final class RestrictedBooleanType extends AbstractRestrictedType<BooleanTypeDefi
         super(baseType, qname, unknownSchemaNodes);
     }
 
+    private RestrictedBooleanType(final RestrictedBooleanType original, final QName qname) {
+        super(original, qname);
+    }
+
+    @Override
+    RestrictedBooleanType bindTo(final QName newQName) {
+        return new RestrictedBooleanType(this, newQName);
+    }
+
     @Override
     public int hashCode() {
         return BooleanTypeDefinition.hashCode(this);
index 83f5a15063110648570bc659ee31cb2192c5539b..a6da9dafd5738249be487c9b556222296d03d4c7 100644 (file)
@@ -23,6 +23,15 @@ final class RestrictedDecimalType extends AbstractRangeRestrictedType<DecimalTyp
         super(baseType, qname, unknownSchemaNodes, rangeConstraint);
     }
 
+    private RestrictedDecimalType(final RestrictedDecimalType original, final QName qname) {
+        super(original, qname);
+    }
+
+    @Override
+    RestrictedDecimalType bindTo(final QName newQName) {
+        return new RestrictedDecimalType(this, newQName);
+    }
+
     @Override
     public int getFractionDigits() {
         return getBaseType().getFractionDigits();
index 3757992faefda0f771365d635543ccc3313025a7..521ec73ed419c80d01aec0ab73a81e315962955a 100644 (file)
@@ -18,6 +18,15 @@ final class RestrictedEmptyType extends AbstractRestrictedType<EmptyTypeDefiniti
         super(baseType, qname, unknownSchemaNodes);
     }
 
+    private RestrictedEmptyType(final RestrictedEmptyType original, final QName qname) {
+        super(original, qname);
+    }
+
+    @Override
+    RestrictedEmptyType bindTo(final QName newQName) {
+        return new RestrictedEmptyType(this, newQName);
+    }
+
     @Override
     public int hashCode() {
         return EmptyTypeDefinition.hashCode(this);
index aa728517d95ae374acb4ef38b6a372e471f52430..b40b7c54eb0f553b1669a8e368f4d09e69b10366 100644 (file)
@@ -24,6 +24,16 @@ final class RestrictedEnumerationType extends AbstractRestrictedType<EnumTypeDef
         this.values = ImmutableList.copyOf(values);
     }
 
+    private RestrictedEnumerationType(final RestrictedEnumerationType original, final QName qname) {
+        super(original, qname);
+        this.values = original.values;
+    }
+
+    @Override
+    RestrictedEnumerationType bindTo(final QName newQName) {
+        return new RestrictedEnumerationType(this, newQName);
+    }
+
     @Override
     public List<EnumPair> getValues() {
         return values;
index e67a678770a54f85f5eeab027b01ad50aca2f9b9..12bcd0c5020cd10ac7e3ba9f9f419c01dd595a0c 100644 (file)
@@ -21,6 +21,15 @@ final class RestrictedIdentityrefType extends AbstractRestrictedType<Identityref
         super(baseType, qname, unknownSchemaNodes);
     }
 
+    private RestrictedIdentityrefType(final RestrictedIdentityrefType original, final QName qname) {
+        super(original, qname);
+    }
+
+    @Override
+    RestrictedIdentityrefType bindTo(final QName newQName) {
+        return new RestrictedIdentityrefType(this, newQName);
+    }
+
     @Override
     public Set<? extends IdentitySchemaNode> getIdentities() {
         return getBaseType().getIdentities();
index 62f135c72576040b5d3233db6c5779722bb465d3..c8c6f0cc52057f9f5ae1e3ce1e53f05f0d27c3e7 100644 (file)
@@ -22,6 +22,16 @@ final class RestrictedInstanceIdentifierType extends AbstractRestrictedType<Inst
         this.requireInstance = requireInstance;
     }
 
+    private RestrictedInstanceIdentifierType(final RestrictedInstanceIdentifierType original, final QName qname) {
+        super(original, qname);
+        this.requireInstance = original.requireInstance;
+    }
+
+    @Override
+    RestrictedInstanceIdentifierType bindTo(final QName newQName) {
+        return new RestrictedInstanceIdentifierType(this, newQName);
+    }
+
     @Override
     public boolean requireInstance() {
         return requireInstance;
index 61cd9f9cfa1825d5a225e827b48f2fb173aad3d2..d17a701b1983a38692207b5855e626b3c7678a95 100644 (file)
@@ -22,6 +22,15 @@ final class RestrictedInt16Type extends AbstractRangeRestrictedType<Int16TypeDef
         super(baseType, qname, unknownSchemaNodes, rangeConstraint);
     }
 
+    private RestrictedInt16Type(final RestrictedInt16Type original, final QName qname) {
+        super(original, qname);
+    }
+
+    @Override
+    RestrictedInt16Type bindTo(final QName newQName) {
+        return new RestrictedInt16Type(this, newQName);
+    }
+
     @Override
     public int hashCode() {
         return Int16TypeDefinition.hashCode(this);
index 61e79a1588823a5b7cdf5a79bda35d927abea02c..147daadd525637849b55f0872bf7fe062e897c61 100644 (file)
@@ -22,6 +22,15 @@ final class RestrictedInt32Type extends AbstractRangeRestrictedType<Int32TypeDef
         super(baseType, qname, unknownSchemaNodes, rangeConstraint);
     }
 
+    private RestrictedInt32Type(final RestrictedInt32Type original, final QName qname) {
+        super(original, qname);
+    }
+
+    @Override
+    RestrictedInt32Type bindTo(final QName newQName) {
+        return new RestrictedInt32Type(this, newQName);
+    }
+
     @Override
     public int hashCode() {
         return Int32TypeDefinition.hashCode(this);
index 686fa8a6dd03ab3238de608936081cf51d6b3fd8..95a1aa1c9c66eca1bed6fa56f83f22624b23fe3f 100644 (file)
@@ -22,6 +22,15 @@ final class RestrictedInt64Type extends AbstractRangeRestrictedType<Int64TypeDef
         super(baseType, qname, unknownSchemaNodes, rangeConstraint);
     }
 
+    private RestrictedInt64Type(final RestrictedInt64Type original, final QName qname) {
+        super(original, qname);
+    }
+
+    @Override
+    RestrictedInt64Type bindTo(final QName newQName) {
+        return new RestrictedInt64Type(this, newQName);
+    }
+
     @Override
     public int hashCode() {
         return Int64TypeDefinition.hashCode(this);
index c61d5a5fca9c4107bf69712f0ad2d7ab66575c19..3e34a028be39942d92bbcd2b405298da63e0187f 100644 (file)
@@ -22,6 +22,15 @@ final class RestrictedInt8Type extends AbstractRangeRestrictedType<Int8TypeDefin
         super(baseType, qname, unknownSchemaNodes, rangeConstraint);
     }
 
+    private RestrictedInt8Type(final RestrictedInt8Type original, final QName qname) {
+        super(original, qname);
+    }
+
+    @Override
+    RestrictedInt8Type bindTo(final QName newQName) {
+        return new RestrictedInt8Type(this, newQName);
+    }
+
     @Override
     public int hashCode() {
         return Int8TypeDefinition.hashCode(this);
index b4340ba3832a400d304bc9707443fdf5b0bfa2ab..a7ac1afb9c459c9fdff81c6cc5e2c7370798cd52 100644 (file)
@@ -23,6 +23,16 @@ final class RestrictedLeafrefType extends AbstractRestrictedType<LeafrefTypeDefi
         this.requireInstance = requireInstance;
     }
 
+    private RestrictedLeafrefType(final RestrictedLeafrefType original, final QName qname) {
+        super(original, qname);
+        this.requireInstance = original.requireInstance;
+    }
+
+    @Override
+    RestrictedLeafrefType bindTo(final QName newQName) {
+        return new RestrictedLeafrefType(this, newQName);
+    }
+
     @Override
     public PathExpression getPathStatement() {
         return getBaseType().getPathStatement();
index a1a6acbf69b0bfbbcefd164c4e66b890b87905c5..828f4ad49c8d348f4f1f98593bebcd6302678f68 100644 (file)
@@ -30,6 +30,16 @@ final class RestrictedStringType extends AbstractLengthRestrictedType<StringType
         this.patternConstraints = ImmutableList.copyOf(patternConstraints);
     }
 
+    private RestrictedStringType(final RestrictedStringType original, final QName qname) {
+        super(original, qname);
+        this.patternConstraints = original.patternConstraints;
+    }
+
+    @Override
+    RestrictedStringType bindTo(final QName newQName) {
+        return new RestrictedStringType(this, newQName);
+    }
+
     @Override
     public List<PatternConstraint> getPatternConstraints() {
         return patternConstraints;
index 68ae8a28075c633cd79f33a01ffd035705bbdc98..6ad18983930bb230377685c7fc039c35df48fb0f 100644 (file)
@@ -23,6 +23,15 @@ final class RestrictedUint16Type extends AbstractRangeRestrictedType<Uint16TypeD
         super(baseType, qname, unknownSchemaNodes, rangeConstraint);
     }
 
+    private RestrictedUint16Type(final RestrictedUint16Type original, final QName qname) {
+        super(original, qname);
+    }
+
+    @Override
+    RestrictedUint16Type bindTo(final QName newQName) {
+        return new RestrictedUint16Type(this, newQName);
+    }
+
     @Override
     public int hashCode() {
         return Uint16TypeDefinition.hashCode(this);
index ead97f4d902be316b4785e50d84631455fb92ecc..045a3aeeccc4c2ce5fc0421ba8294efb4f0870e2 100644 (file)
@@ -23,6 +23,15 @@ final class RestrictedUint32Type extends AbstractRangeRestrictedType<Uint32TypeD
         super(baseType, qname, unknownSchemaNodes, rangeConstraint);
     }
 
+    private RestrictedUint32Type(final RestrictedUint32Type original, final QName qname) {
+        super(original, qname);
+    }
+
+    @Override
+    RestrictedUint32Type bindTo(final QName newQName) {
+        return new RestrictedUint32Type(this, newQName);
+    }
+
     @Override
     public int hashCode() {
         return Uint32TypeDefinition.hashCode(this);
index 6a5b4d571adce54019013cca6fe262e86ccb6d58..7a6010059c8b87738ee2108a9481f60a7c8a94ad 100644 (file)
@@ -23,6 +23,15 @@ final class RestrictedUint64Type extends AbstractRangeRestrictedType<Uint64TypeD
         super(baseType, qname, unknownSchemaNodes, rangeConstraint);
     }
 
+    private RestrictedUint64Type(final RestrictedUint64Type original, final QName qname) {
+        super(original, qname);
+    }
+
+    @Override
+    RestrictedUint64Type bindTo(final QName newQName) {
+        return new RestrictedUint64Type(this, newQName);
+    }
+
     @Override
     public int hashCode() {
         return Uint64TypeDefinition.hashCode(this);
index 423bffd62e8424aff7c6b445898c866d6b360c0c..918f7e02ed075b2c6d14aa228d1ffb2b64c82427 100644 (file)
@@ -23,6 +23,15 @@ final class RestrictedUint8Type extends AbstractRangeRestrictedType<Uint8TypeDef
         super(baseType, qname, unknownSchemaNodes, rangeConstraint);
     }
 
+    private RestrictedUint8Type(final RestrictedUint8Type original, final QName qname) {
+        super(original, qname);
+    }
+
+    @Override
+    RestrictedUint8Type bindTo(final QName newQName) {
+        return new RestrictedUint8Type(this, newQName);
+    }
+
     @Override
     public int hashCode() {
         return Uint8TypeDefinition.hashCode(this);
index dd8e59256f94fd1d9aa1caf3d095435578206727..20a247935ba1b203423a06da7cd32785ba6cc97b 100644 (file)
@@ -20,6 +20,15 @@ final class RestrictedUnionType extends AbstractRestrictedType<UnionTypeDefiniti
         super(baseType, qname, unknownSchemaNodes);
     }
 
+    private RestrictedUnionType(final RestrictedUnionType original, final QName qname) {
+        super(original, qname);
+    }
+
+    @Override
+    RestrictedUnionType bindTo(final QName newQName) {
+        return new RestrictedUnionType(this, newQName);
+    }
+
     @Override
     public List<TypeDefinition<?>> getTypes() {
         return getBaseType().getTypes();
index 99e6141132bd1c6ecf69f6b018937f812c06e96b..2aa24a298ea627da4af25864a2e327570e715a95 100644 (file)
@@ -7,6 +7,7 @@
  */
 package org.opendaylight.yangtools.yang.model.util.type;
 
+import static com.google.common.base.Preconditions.checkArgument;
 import static java.util.Objects.requireNonNull;
 
 import com.google.common.collect.ImmutableList;
@@ -27,6 +28,24 @@ public abstract class TypeBuilder<T extends TypeDefinition<T>> implements Builde
         this.baseType = baseType;
     }
 
+    /**
+     * Create a copy of specified {@link TypeDefinition} with specified {@link QName}.
+     *
+     * @param <T> Type definition type
+     * @param type Original type definition
+     * @param qname QName for the copy
+     * @return A copy of type definition
+     * @throws NullPointerException if any argument is null
+     * @throws IllegalArgumentException if {@code type} is not a recognised implementation
+     */
+    public static <T extends TypeDefinition<?>> @NonNull T copyTypeDefinition(final T type, final QName qname) {
+        if (qname.equals(type.getQName())) {
+            return type;
+        }
+        checkArgument(type instanceof AbstractTypeDefinition, "Unsupported type %s", type);
+        return (T) ((AbstractTypeDefinition<?>) type).bindTo(requireNonNull(qname));
+    }
+
     final T getBaseType() {
         return baseType;
     }
index 21b68d538d41feb4dec30709fa6bb3a02a37246d..228acaec260eadb42c4e5683337d8a146bdd10de 100644 (file)
@@ -26,6 +26,7 @@ import org.opendaylight.yangtools.yang.model.api.stmt.TypeEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.UnitsEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.util.type.ConcreteTypeBuilder;
 import org.opendaylight.yangtools.yang.model.util.type.ConcreteTypes;
+import org.opendaylight.yangtools.yang.model.util.type.TypeBuilder;
 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredEffectiveStatement;
 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.DataSchemaNodeMixin;
 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.MustConstraintMixin;
@@ -57,8 +58,7 @@ abstract class AbstractLeafListEffectiveStatement
         this.substatements = original.substatements;
         this.path = path;
         this.flags = flags;
-        // TODO: lazy instantiation?
-        this.type = buildType();
+        this.type = TypeBuilder.copyTypeDefinition(original.type, getQName());
     }
 
     @Override