Ejemplo n.º 1
0
        /// <summary>
        /// Parses a type reference.
        /// <see cref="ITypeNode" />:
        /// - NamedType
        /// - ListType
        /// - NonNullType
        /// </summary>
        /// <param name="context">The parser context.</param>
        private ITypeNode ParseTypeReference(ParserContext context)
        {
            SyntaxToken start = context.Current;
            ITypeNode   type;
            Location    location;

            if (context.Skip(TokenKind.LeftBracket))
            {
                type = ParseTypeReference(context);
                context.ExpectRightBracket();
                location = context.CreateLocation(start);

                type = new ListTypeNode(location, type);
            }
            else
            {
                type = ParseNamedType(context);
            }

            if (context.Skip(TokenKind.Bang))
            {
                if (type is INullableType nt)
                {
                    return(new NonNullTypeNode
                           (
                               context.CreateLocation(start),
                               nt
                           ));
                }
                context.Unexpected(context.Current.Previous);
            }

            return(type);
        }
Ejemplo n.º 2
0
        private List <NameNode> ParseDirectiveLocations(ParserContext context)
        {
            List <NameNode> list = new List <NameNode>();

            // skip optional leading pipe.
            context.Skip(TokenKind.Pipe);

            do
            {
                list.Add(ParseDirectiveLocation(context));
            }while (context.Skip(TokenKind.Pipe));

            return(list);
        }
 public static void SkipWhile(this ParserContext context, TokenKind kind)
 {
     while (context.Skip(kind))
     {
         ;
     }
 }
Ejemplo n.º 4
0
        /// <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        = ParseName(context);

            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
                   ));
        }
Ejemplo n.º 5
0
        /// <summary>
        /// Parses the union member types.
        /// <see cref="List{NamedTypeNode}" />:
        /// = `|`? NamedType
        /// </summary>
        /// <param name="context">The parser context.</param>
        private List <NamedTypeNode> ParseUnionMemberTypes(
            ParserContext context)
        {
            List <NamedTypeNode> list = new List <NamedTypeNode>();

            if (context.Skip(TokenKind.Equal))
            {
                // skip optional leading pipe
                context.Skip(TokenKind.Pipe);

                do
                {
                    list.Add(ParseNamedType(context));
                }while (context.Skip(TokenKind.Pipe));
            }

            return(list);
        }
Ejemplo n.º 6
0
        /// <summary>
        /// Parses implementing interfaces.
        /// <see cref="List{NamedTypeNode}" />:
        /// implements &amp;? NamedType
        /// </summary>
        /// <param name="context">The parser context.</param>
        private List <NamedTypeNode> ParseImplementsInterfaces(
            ParserContext context)
        {
            List <NamedTypeNode> list = new List <NamedTypeNode>();

            if (context.SkipKeyword(Keywords.Implements))
            {
                // skip optional leading amperdand.
                context.Skip(TokenKind.Ampersand);

                do
                {
                    list.Add(ParseNamedType(context));
                }while (context.Skip(TokenKind.Ampersand));
            }

            return(list);
        }
Ejemplo n.º 7
0
        /// <summary>
        /// Parses a variable definition.
        /// <see cref="VariableDefinitionNode" />:
        /// $variable : Type = DefaultValue?
        /// </summary>
        /// <param name="context">The parser context.</param>
        private VariableDefinitionNode ParseVariableDefinition(ParserContext context)
        {
            SyntaxToken  start    = context.Current;
            VariableNode variable = ParseVariable(context);

            context.ExpectColon();
            ITypeNode  type         = ParseTypeReference(context);
            IValueNode defaultValue = context.Skip(TokenKind.Equal)
                ? ParseValueLiteral(context, true)
                : null;
            Location location = context.CreateLocation(start);

            return(new VariableDefinitionNode
                   (
                       location,
                       variable,
                       type,
                       defaultValue
                   ));
        }