code: func parseDirectiveDefinition(parser *Parser) (ast.Node, error) {
  	var (
  		err         error
  		description *ast.StringValue
  		name        *ast.Name
  		args        []*ast.InputValueDefinition
  		locations   []*ast.Name
  	)
  	start := parser.Token.Start
  	if description, err = parseDescription(parser); err != nil {
  		return nil, err
  	}
  	if _, err = expectKeyWord(parser, lexer.DIRECTIVE); err != nil {
  		return nil, err
  	}
  	if _, err = expect(parser, lexer.AT); err != nil {
  		return nil, err
  	}
  	if name, err = parseName(parser); err != nil {
  		return nil, err
  	}
  	if args, err = parseArgumentDefs(parser); err != nil {
  		return nil, err
  	}
  	if _, err = expectKeyWord(parser, "on"); err != nil {
  		return nil, err
  	}
  	if locations, err = parseDirectiveLocations(parser); err != nil {
  		return nil, err
  	}
  
  	return ast.NewDirectiveDefinition(&ast.DirectiveDefinition{
  		Loc:         loc(parser, start),
  		Name:        name,
  		Description: description,
  		Arguments:   args,
  		Locations:   locations,
  	}), nil
  }
docs: /**
   * DirectiveDefinition :
   *   - directive @ Name ArgumentsDefinition? on DirectiveLocations
   */