+
+ @Override
+ protected final IdentityRefSpecification createDeclared(final StmtContext<String, IdentityRefSpecification, ?> ctx,
+ final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+ return new IdentityRefSpecificationImpl(ctx.getRawArgument(), substatements);
+ }
+
+ @Override
+ protected final IdentityRefSpecification createEmptyDeclared(
+ final StmtContext<String, IdentityRefSpecification, ?> ctx) {
+ throw noBase(ctx);
+ }
+
+ @Override
+ protected final EffectiveStatement<String, IdentityRefSpecification> createEffective(
+ final Current<String, IdentityRefSpecification> stmt,
+ final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+ if (substatements.isEmpty()) {
+ throw noBase(stmt);
+ }
+
+ final IdentityrefTypeBuilder builder = BaseTypes.identityrefTypeBuilder(stmt.getSchemaPath());
+ for (final EffectiveStatement<?, ?> subStmt : substatements) {
+ if (subStmt instanceof BaseEffectiveStatement) {
+ final QName identityQName = ((BaseEffectiveStatement) subStmt).argument();
+ final StmtContext<?, IdentityStatement, IdentityEffectiveStatement> identityCtx =
+ stmt.getFromNamespace(IdentityNamespace.class, identityQName);
+ builder.addIdentity((IdentitySchemaNode) identityCtx.buildEffective());
+ }
+ }
+
+ return new TypeEffectiveStatementImpl<>(stmt.declared(), substatements, builder);
+ }
+
+ private static SourceException noBase(final CommonStmtCtx stmt) {
+ /*
+ * https://tools.ietf.org/html/rfc7950#section-9.10.2
+ *
+ * The "base" statement, which is a substatement to the "type"
+ * statement, MUST be present at least once if the type is
+ * "identityref".
+ */
+ return new SourceException("At least one base statement has to be present", stmt);
+ }