# Class: YARD::Tags::ParseDirective

Inherits:
  Directive
  - Object
  - Directive
  - YARD::Tags::ParseDirective
  show all

Defined in:
  lib/yard/tags/directives.rb

## Overview

Parses a block of code as if it were present in the source file at that location. This directive is useful if a class has dynamic meta-programmed behaviour that cannot be recognized by YARD.

You can specify the language of the code block using the types specification list. By default, the code language is “ruby”.

#### Examples:

#####

Documenting dynamic module inclusion

    class User
      # includes "UserMixin" and extends "UserMixin::ClassMethods"
      # using the UserMixin.included callback.
      # @!parse include UserMixin
      # @!parse extend UserMixin::ClassMethods
    end

#####

Declaring a method as an attribute

    # This should really be an attribute
    # @!parse attr_reader :foo
    def object; @parent.object end

#####

Parsing C code

    # @!parse [c]
    #   void Init_Foo() {
    #     rb_define_method(rb_cFoo, "method", method, 0);
    #   }

Since:

- 0.8.0

## Parser callbacks collapse

- #call ⇒ Object

## Constructor Details

This class inherits a constructor from YARD::Tags::Directive

## Instance Method Details

### #call ⇒ `Object`

Since:

- 0.8.0

    545
    546
    547
    548
    549
    550
    551
    552
    553
    554
    555
    556
    557
    558

    # File 'lib/yard/tags/directives.rb', line 545

    def call
      lang = tag.types ? tag.types.first.to_sym :
        (handler ? handler.parser.parser_type : :ruby)
      if handler && lang == handler.parser.parser_type
        pclass = Parser::SourceParser.parser_types[handler.parser.parser_type]
        pobj = pclass.new(tag.text, handler.parser.file)
        pobj.parse
        handler.parser.process(pobj.enumerator)
      else # initialize a new parse chain
        src_parser = Parser::SourceParser.new(lang, handler ? handler.globals : nil)
        src_parser.file = handler.parser.file if handler
        src_parser.parse(StringIO.new(tag.text))
      end
    end