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