code: func parseInputObjectTypeDefinition(parser *Parser) (ast.Node, error) {
  	start := parser.Token.Start
  	description, err := parseDescription(parser)
  	if err != nil {
  		return nil, err
  	}
  	_, err = expectKeyWord(parser, lexer.INPUT)
  	if err != nil {
  		return nil, err
  	}
  	name, err := parseName(parser)
  	if err != nil {
  		return nil, err
  	}
  	directives, err := parseDirectives(parser)
  	if err != nil {
  		return nil, err
  	}
  	iInputValueDefinitions, err := reverse(parser,
  		lexer.BRACE_L, parseInputValueDef, lexer.BRACE_R,
  		false,
  	)
  	if err != nil {
  		return nil, err
  	}
  	fields := []*ast.InputValueDefinition{}
  	for _, iInputValueDefinition := range iInputValueDefinitions {
  		if iInputValueDefinition != nil {
  			fields = append(fields, iInputValueDefinition.(*ast.InputValueDefinition))
  		}
  	}
  	return ast.NewInputObjectDefinition(&ast.InputObjectDefinition{
  		Name:        name,
  		Description: description,
  		Directives:  directives,
  		Loc:         loc(parser, start),
  		Fields:      fields,
  	}), nil
  }
docs: /**
   * InputObjectTypeDefinition :
   *   - Description? input Name Directives? { InputValueDefinition+ }
   */