/// <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); }
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)) { ; } }
/// <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 )); }
/// <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); }
/// <summary> /// Parses implementing interfaces. /// <see cref="List{NamedTypeNode}" />: /// implements &? 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); }
/// <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 )); }