code: func parseType(parser *Parser) (ttype ast.Type, err error) {
  	token := parser.Token
  	// [ String! ]!
  	switch token.Kind {
  	case lexer.BRACKET_L:
  		if err = advance(parser); err != nil {
  			return nil, err
  		}
  		if ttype, err = parseType(parser); err != nil {
  			return nil, err
  		}
  		fallthrough
  	case lexer.BRACKET_R:
  		if err = advance(parser); err != nil {
  			return nil, err
  		}
  		ttype = ast.NewList(&ast.List{
  			Type: ttype,
  			Loc:  loc(parser, token.Start),
  		})
  	case lexer.NAME:
  		if ttype, err = parseNamed(parser); err != nil {
  			return nil, err
  		}
  	}
  
  	// BANG must be executed
  	if skp, err := skip(parser, lexer.BANG); err != nil {
  		return nil, err
  	} else if skp {
  		ttype = ast.NewNonNull(&ast.NonNull{
  			Type: ttype,
  			Loc:  loc(parser, token.Start),
  		})
  	}
  	return ttype, nil
  }
docs: /* Implements the parsing rules in the Types section. */
  /**
   * Type :
   *   - NamedType
   *   - ListType
   *   - NonNullType
   */