+ typeEffectiveQName(ctx)));
+ }
+
+ private static @NonNull TypeEffectiveStatement<TypeStatement> createInstanceIdentifier(final Current<String, ?> ctx,
+ final InstanceIdentifierTypeDefinition baseType, final TypeStatement declared,
+ final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+ final InstanceIdentifierTypeBuilder builder = RestrictedTypes.newInstanceIdentifierBuilder(baseType,
+ typeEffectiveQName(ctx));
+
+ for (EffectiveStatement<?, ?> stmt : substatements) {
+ if (stmt instanceof RequireInstanceEffectiveStatement) {
+ builder.setRequireInstance(((RequireInstanceEffectiveStatement)stmt).argument());
+ }
+ }
+
+ return new TypeEffectiveStatementImpl<>(declared, substatements, builder);
+ }
+
+ private static <T extends RangeRestrictedTypeDefinition<T, N>, N extends Number & Comparable<N>>
+ @NonNull TypeEffectiveStatement<TypeStatement> createIntegral(final Current<?, ?> ctx,
+ final TypeStatement declared, final ImmutableList<? extends EffectiveStatement<?, ?>> substatements,
+ final RangeRestrictedTypeBuilder<T, N> builder) {
+ for (EffectiveStatement<?, ?> stmt : substatements) {
+ if (stmt instanceof RangeEffectiveStatement) {
+ final RangeEffectiveStatement rangeStmt = (RangeEffectiveStatement)stmt;
+ builder.setRangeConstraint(rangeStmt, rangeStmt.argument());
+ }
+ }
+
+ try {
+ return new TypeEffectiveStatementImpl<>(declared, substatements, builder);
+ } catch (InvalidRangeConstraintException e) {
+ throw new SourceException(ctx, e, "Invalid range constraint: %s", e.getOffendingRanges());
+ }
+ }
+
+ private static @NonNull TypeEffectiveStatement<TypeStatement> createLeafref(final Current<String, ?> ctx,
+ final LeafrefTypeDefinition baseType, final TypeStatement declared,
+ final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+ final RequireInstanceRestrictedTypeBuilder<LeafrefTypeDefinition> builder =
+ RestrictedTypes.newLeafrefBuilder(baseType, AbstractTypeStatementSupport.typeEffectiveQName(ctx));
+
+ for (final EffectiveStatement<?, ?> stmt : substatements) {
+ if (stmt instanceof RequireInstanceEffectiveStatement) {
+ builder.setRequireInstance(((RequireInstanceEffectiveStatement) stmt).argument());
+ }
+ }
+ return new TypeEffectiveStatementImpl<>(declared, substatements, builder);
+ }
+
+ private static @NonNull TypeEffectiveStatement<TypeStatement> createString(final Current<String, ?> ctx,
+ final StringTypeDefinition baseType, final TypeStatement declared,
+ final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+ final StringTypeBuilder builder = RestrictedTypes.newStringBuilder(baseType,
+ AbstractTypeStatementSupport.typeEffectiveQName(ctx));
+
+ for (EffectiveStatement<?, ?> stmt : substatements) {
+ if (stmt instanceof LengthEffectiveStatement) {
+ final LengthEffectiveStatement length = (LengthEffectiveStatement)stmt;
+
+ try {
+ builder.setLengthConstraint(length, length.argument());
+ } catch (IllegalStateException e) {
+ throw new SourceException(ctx, e, "Multiple length constraints encountered");
+ } catch (InvalidLengthConstraintException e) {
+ throw new SourceException(ctx, e, "Invalid length constraint %s", length.argument());
+ }
+ }
+ if (stmt instanceof PatternEffectiveStatement) {
+ builder.addPatternConstraint((PatternEffectiveStatement) stmt);
+ }
+ }
+
+ return new TypeEffectiveStatementImpl<>(declared, substatements, builder);