/// <summary>
        /// Parse schema definition extension.
        /// <see cref="SchemaExtensionNode" />:
        /// * - extend schema Directives[Const]? { OperationTypeDefinition+ }
        /// * - extend schema Directives[Const]
        /// </summary>
        /// <param name="context">The parser context.</param>
        private SchemaExtensionNode ParseSchemaExtension(ParserContext context)
        {
            SyntaxToken start = context.Current;

            context.ExpectExtendKeyword();
            context.ExpectSchemaKeyword();

            List <DirectiveNode> directives =
                ParseDirectives(context, true);

            List <OperationTypeDefinitionNode> operationTypeDefinitions =
                ParseOperationTypeDefinitions(context);

            if (directives.Count == 0 && operationTypeDefinitions.Count == 0)
            {
                throw context.Unexpected(start);
            }

            Location location = context.CreateLocation(start);

            return(new SchemaExtensionNode
                   (
                       location,
                       directives,
                       operationTypeDefinitions
                   ));
        }
        private InputObjectTypeExtensionNode ParseInputObjectTypeExtension(ParserContext context)
        {
            SyntaxToken start = context.Current;

            context.ExpectExtendKeyword();
            context.ExpectInputKeyword();
            NameNode             name       = context.ParseName();
            List <DirectiveNode> directives =
                ParseDirectives(context, true);
            List <InputValueDefinitionNode> fields =
                ParseInputFieldsDefinition(context);
            Location location = context.CreateLocation(start);

            if (directives.Count == 0 && fields.Count == 0)
            {
                throw context.Unexpected(start);
            }

            return(new InputObjectTypeExtensionNode
                   (
                       location,
                       name,
                       directives,
                       fields
                   ));
        }
        private EnumTypeExtensionNode ParseEnumTypeExtension(ParserContext context)
        {
            SyntaxToken start = context.Current;

            context.ExpectExtendKeyword();
            context.ExpectEnumKeyword();
            NameNode             name       = context.ParseName();
            List <DirectiveNode> directives =
                ParseDirectives(context, true);
            List <EnumValueDefinitionNode> values =
                ParseEnumValuesDefinition(context);
            Location location = context.CreateLocation(start);

            if (directives.Count == 0 && values.Count == 0)
            {
                throw context.Unexpected(start);
            }

            return(new EnumTypeExtensionNode
                   (
                       location,
                       name,
                       directives,
                       values
                   ));
        }
        private UnionTypeExtensionNode ParseUnionTypeExtension(ParserContext context)
        {
            SyntaxToken start = context.Current;

            context.ExpectExtendKeyword();
            context.ExpectUnionKeyword();
            NameNode             name       = context.ParseName();
            List <DirectiveNode> directives =
                ParseDirectives(context, true);
            List <NamedTypeNode> types =
                ParseUnionMemberTypes(context);
            Location location = context.CreateLocation(start);

            if (directives.Count == 0 && types.Count == 0)
            {
                throw context.Unexpected(start);
            }

            return(new UnionTypeExtensionNode
                   (
                       location,
                       name,
                       directives,
                       types
                   ));
        }
        private ObjectTypeExtensionNode ParseObjectTypeExtension(ParserContext context)
        {
            SyntaxToken start = context.Current;

            context.ExpectExtendKeyword();
            context.ExpectTypeKeyword();
            NameNode             name       = context.ParseName();
            List <NamedTypeNode> interfaces =
                ParseImplementsInterfaces(context);
            List <DirectiveNode> directives =
                ParseDirectives(context, true);
            List <FieldDefinitionNode> fields =
                ParseFieldsDefinition(context);
            Location location = context.CreateLocation(start);

            if (interfaces.Count == 0 &&
                directives.Count == 0 &&
                fields.Count == 0)
            {
                throw context.Unexpected(start);
            }

            return(new ObjectTypeExtensionNode
                   (
                       location,
                       name,
                       directives,
                       interfaces,
                       fields
                   ));
        }
        private ScalarTypeExtensionNode ParseScalarTypeExtension(
            ParserContext context)
        {
            SyntaxToken start = context.Current;

            context.ExpectExtendKeyword();
            context.ExpectScalarKeyword();
            NameNode             name       = context.ParseName();
            List <DirectiveNode> directives =
                ParseDirectives(context, true);

            if (directives.Count == 0)
            {
                throw context.Unexpected(start);
            }
            Location location = context.CreateLocation(start);

            return(new ScalarTypeExtensionNode
                   (
                       location,
                       name,
                       directives
                   ));
        }