Ejemplo n.º 1
0
        /// <summary>
        /// Parses a field.
        /// <see cref="FieldNode"  />:
        /// Alias? : Name Arguments? Directives? SelectionSet?
        /// </summary>
        /// <param name="context">The parser context.</param>
        private FieldNode ParseField(ParserContext context)
        {
            SyntaxToken start    = context.Current;
            bool        hasAlias = context.Peek(TokenKind.Colon);
            NameNode    alias    = null;
            NameNode    name     = null;

            if (hasAlias)
            {
                alias = context.ParseName();
                context.ExpectColon();
                name = context.ParseName();
            }
            else
            {
                name = context.ParseName();
            }

            List <ArgumentNode>  arguments    = ParseArguments(context, false);
            List <DirectiveNode> directives   = ParseDirectives(context, false);
            SelectionSetNode     selectionSet = context.Current.IsLeftBrace()
                ? ParseSelectionSet(context)
                : null;
            Location location = context.CreateLocation(start);

            return(new FieldNode
                   (
                       location,
                       name,
                       alias,
                       directives,
                       arguments,
                       selectionSet
                   ));
        }
        /// <summary>
        /// Parses input value definitions.
        /// <see cref="InputValueDefinitionNode" />:
        /// Description? Name : Type DefaultValue? Directives[isConstant=true]?
        /// </summary>
        /// <param name="context">The parser context.</param>
        private InputValueDefinitionNode ParseInputValueDefinition(
            ParserContext context)
        {
            SyntaxToken     start       = context.Current;
            StringValueNode description = ParseDescription(context);
            NameNode        name        = context.ParseName();

            context.ExpectColon();
            ITypeNode  type         = ParseTypeReference(context);
            IValueNode defaultValue = null;

            if (context.Skip(TokenKind.Equal))
            {
                defaultValue = ParseConstantValue(context);
            }
            List <DirectiveNode> directives =
                ParseDirectives(context, true);
            Location location = context.CreateLocation(start);

            return(new InputValueDefinitionNode
                   (
                       location,
                       name,
                       description,
                       type,
                       defaultValue,
                       directives
                   ));
        }
        /// <summary>
        /// Parses a interface type or object type field definition.
        /// <see cref="FieldDefinitionNode" />:
        /// Description?
        /// Name ArgumentsDefinition? : Type Directives[isConstant=true]?
        /// </summary>
        /// <param name="context">The parser context.</param>
        private FieldDefinitionNode ParseFieldDefinition(
            ParserContext context)
        {
            SyntaxToken     start       = context.Current;
            StringValueNode description = ParseDescription(context);
            NameNode        name        = context.ParseName();
            List <InputValueDefinitionNode> arguments =
                ParseArgumentDefinitions(context);

            context.ExpectColon();
            ITypeNode            type       = ParseTypeReference(context);
            List <DirectiveNode> directives =
                ParseDirectives(context, true);
            Location location = context.CreateLocation(start);

            return(new FieldDefinitionNode
                   (
                       location,
                       name,
                       description,
                       arguments,
                       type,
                       directives
                   ));
        }
        /// <summary>
        /// Parses an object type definition.
        /// <see cref="ObjectTypeDefinitionNode" />:
        /// Description?
        /// type Name ImplementsInterfaces? Directives[isConstant=true]? FieldsDefinition?
        /// </summary>
        /// <param name="context">The parser context.</param>
        private ObjectTypeDefinitionNode ParseObjectTypeDefinition(
            ParserContext context)
        {
            SyntaxToken     start       = context.Current;
            StringValueNode description = ParseDescription(context);

            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);

            return(new ObjectTypeDefinitionNode
                   (
                       location,
                       name,
                       description,
                       directives,
                       interfaces,
                       fields
                   ));
        }
Ejemplo n.º 5
0
        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
                   ));
        }
Ejemplo n.º 6
0
        /// <summary>
        /// Parses an operation definition.
        /// <see cref="OperationDefinitionNode" />:
        /// OperationType? OperationName? ($x : Type = DefaultValue?)? SelectionSet
        /// </summary>
        /// <param name="context">The parser context.</param>
        private static OperationDefinitionNode ParseOperationDefinition(
            ParserContext context)
        {
            SyntaxToken start = context.Current;

            if (start.IsLeftBrace())
            {
                return(ParseOperationDefinitionShortHandForm(context, start));
            }

            OperationType operation = ParseOperationType(context);
            NameNode      name      = context.Current.IsName()
                ? context.ParseName()
                : null;
            List <VariableDefinitionNode> variableDefinitions =
                ParseVariableDefinitions(context);
            List <DirectiveNode> directives =
                ParseDirectives(context, false);
            SelectionSetNode selectionSet = ParseSelectionSet(context);
            Location         location     = context.CreateLocation(start);

            return(new OperationDefinitionNode
                   (
                       location,
                       name,
                       operation,
                       variableDefinitions,
                       directives,
                       selectionSet
                   ));
        }
Ejemplo n.º 7
0
        private DirectiveDefinitionNode ParseDirectiveDefinition(ParserContext context)
        {
            SyntaxToken     start       = context.Current;
            StringValueNode description = ParseDescription(context);

            context.ExpectDirectiveKeyword();
            context.ExpectAt();
            NameNode name = context.ParseName();
            List <InputValueDefinitionNode> arguments =
                ParseArgumentDefinitions(context);

            context.ExpectOnKeyword();
            List <NameNode> locations =
                ParseDirectiveLocations(context);
            Location location = context.CreateLocation(start);

            return(new DirectiveDefinitionNode
                   (
                       location,
                       name,
                       description,
                       arguments,
                       locations
                   ));
        }
Ejemplo n.º 8
0
        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
                   ));
        }
Ejemplo n.º 9
0
        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
                   ));
        }
Ejemplo n.º 10
0
        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
                   ));
        }
Ejemplo n.º 11
0
 /// <summary>
 /// Parse fragment name.
 /// <see cref="NameNode" />:
 /// Name
 /// </summary>
 /// <param name="context">The parser context.</param>
 private NameNode ParseFragmentName(ParserContext context)
 {
     if (context.Current.IsOnKeyword())
     {
         throw context.Unexpected(context.Current);
     }
     return(context.ParseName());
 }
Ejemplo n.º 12
0
        private NameNode ParseDirectiveLocation(ParserContext context)
        {
            SyntaxToken start = context.Current;
            NameNode    name  = context.ParseName();

            if (DirectiveLocation.IsValidName(name.Value))
            {
                return(name);
            }
            throw context.Unexpected(start);
        }
Ejemplo n.º 13
0
        /// <summary>
        /// Parse a variable.
        /// <see cref="VariableNode" />:
        /// $Name
        /// </summary>
        /// <param name="context">The parser context.</param>
        private VariableNode ParseVariable(ParserContext context)
        {
            SyntaxToken start    = context.ExpectDollar();
            NameNode    name     = context.ParseName();
            Location    location = context.CreateLocation(start);

            return(new VariableNode
                   (
                       location,
                       name
                   ));
        }
Ejemplo n.º 14
0
        /// <summary>
        /// Parses a named type.
        /// <see cref="NamedTypeNode" />:
        /// Name
        /// </summary>
        /// <param name="context">The parser context.</param>
        private NamedTypeNode ParseNamedType(ParserContext context)
        {
            SyntaxToken start    = context.Current;
            NameNode    name     = context.ParseName();
            Location    location = context.CreateLocation(start);

            return(new NamedTypeNode
                   (
                       location,
                       name
                   ));
        }
Ejemplo n.º 15
0
        private ObjectFieldNode ParseObjectField(ParserContext context, bool isConstant)
        {
            SyntaxToken start = context.Current;
            NameNode    name  = context.ParseName();

            context.ExpectColon();
            IValueNode value    = ParseValueLiteral(context, isConstant);
            Location   location = context.CreateLocation(start);

            return(new ObjectFieldNode
                   (
                       location,
                       name,
                       value
                   ));
        }
Ejemplo n.º 16
0
        /// <summary>
        /// Parses an argument.
        /// <see cref="ArgumentNode" />:
        /// Name : Value
        /// </summary>
        /// <param name="context">The parser context.</param>
        private ArgumentNode ParseArgument(ParserContext context,
                                           Func <ParserContext, IValueNode> parseValue)
        {
            SyntaxToken start = context.Current;
            NameNode    name  = context.ParseName();

            context.ExpectColon();
            IValueNode value    = parseValue(context);
            Location   location = context.CreateLocation(start);

            return(new ArgumentNode
                   (
                       location,
                       name,
                       value
                   ));
        }
Ejemplo n.º 17
0
        private DirectiveNode ParseDirective(
            ParserContext context, bool isConstant)
        {
            SyntaxToken start = context.Current;

            context.ExpectAt();
            NameNode            name      = context.ParseName();
            List <ArgumentNode> arguments =
                ParseArguments(context, isConstant);
            Location location = context.CreateLocation(start);

            return(new DirectiveNode
                   (
                       location,
                       name,
                       arguments
                   ));
        }
        /// <summary>
        /// Parses an enum value definitions.
        /// <see cref="EnumValueDefinitionNode" />:
        /// Description? EnumValue Directives[isConstant=true]?
        /// </summary>
        /// <param name="context">The parser context.</param>
        private EnumValueDefinitionNode ParseEnumValueDefinition(
            ParserContext context)
        {
            SyntaxToken          start       = context.Current;
            StringValueNode      description = ParseDescription(context);
            NameNode             name        = context.ParseName();
            List <DirectiveNode> directives  =
                ParseDirectives(context, true);
            Location location = context.CreateLocation(start);

            return(new EnumValueDefinitionNode
                   (
                       location,
                       name,
                       description,
                       directives
                   ));
        }
        /// <summary>
        /// Parses an union type definition.
        /// <see cref="UnionTypeDefinitionNode" />:
        /// Description? union Name Directives[isConstant=true]? UnionMemberTypes?
        /// </summary>
        /// <param name="context">The parser context.</param>
        private UnionTypeDefinitionNode ParseUnionTypeDefinition(
            ParserContext context)
        {
            SyntaxToken     start       = context.Current;
            StringValueNode description = ParseDescription(context);

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

            return(new UnionTypeDefinitionNode
                   (
                       location,
                       name,
                       description,
                       directives,
                       types
                   ));
        }
        private InputObjectTypeDefinitionNode ParseInputObjectTypeDefinition(
            ParserContext context)
        {
            SyntaxToken     start       = context.Current;
            StringValueNode description = ParseDescription(context);

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

            return(new InputObjectTypeDefinitionNode
                   (
                       location,
                       name,
                       description,
                       directives,
                       fields
                   ));
        }
Ejemplo n.º 21
0
        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
                   ));
        }