module YARD::Handlers::Ruby::DecoratorHandlerMethods

def process_decorator(*nodes, &block)

Other tags:
    Example: Setting a method's visibility to private. -
    Example: Basic Usage -

Options Hash: (**opts)
  • :transfer_source (true, false) -- Set false to disable
  • :transfer_docstring (true, false) -- Set false to disable
  • :scope (:instance, :class) -- Scope to use for each

Parameters:
  • nodes (YARD::Parser::Ruby::AstNode) -- AST nodes that refer to decorated

Returns:
  • (Array) - Array of hashes containing :method, :node, :name.

Other tags:
    Yieldparam: name - Name of the decorated method.
    Yieldparam: node - AST node of the decorated method.
    Yieldparam: method - Method being decorated.

Overloads:
  • process_decorator(*nodes, opts = {}, &block)
def process_decorator(*nodes, &block)
  opts = nodes.last.is_a?(Hash) ? nodes.pop : {}
  all_nodes = statement.parameters.select do |p|
    p.is_a? YARD::Parser::Ruby::AstNode
  end
  # Parse decorator parameters (decorator chain).
  all_nodes.each do |param|
    parse_block param if param.call? || param.def?
  end
  selected_nodes =
    if nodes.empty?
      all_nodes
    elsif nodes.count == 1 && nodes.first.nil?
      []
    else
      nodes
    end
  decorated_methods = selected_nodes.map do |param|
    process_decorator_parameter param, opts, &block
  end.flatten
  # Store method nodes in decorator node.
  statement.define_singleton_method :decorators do
    decorated_methods.map {|h| h[:node] }
  end
  decorated_methods
end

def process_decorator_parameter(node, opts = {}, &block)

def process_decorator_parameter(node, opts = {}, &block)
  scope              = opts.fetch :scope, :instance
  transfer_docstring = opts.fetch :transfer_docstring, true
  transfer_source    = opts.fetch :transfer_source, true
  name = nil
  if node.call?
    if node.respond_to? :decorators
      return node.decorators.map do |n|
        process_decorator_parameter n, opts, &block
      end
    end
  elsif node.def?
    name = node.jump(:def).method_name.source
  else
    name = node.jump(:ident, :string_content, :const).source
  end
  if name.nil?
    raise YARD::Parser::UndocumentableError, 'statement, cannot determine method name'
  end
  method = YARD::CodeObjects::Proxy.new(
    namespace,
    (scope == :instance ? '#' : '.') + name.to_s,
    :method
  )
  # Transfer source to methods passed to the helper as parameters.
  method.source = statement.source if transfer_source && node.def?
  # Transfer decorator docstring to methods passed to the helper as parameters.
  if transfer_docstring && node.def? &&
     statement.docstring && method.docstring.empty?
    tags = method.tags if method.respond_to? :tags
    tags ||= []
    method.docstring = statement.docstring
    tags.each {|t| method.add_tag t }
  end
  yield method, node, name.to_sym if block_given?
  [{:method => method, :node => node, :name => name.to_sym}]
end