123456789_123456789_123456789_123456789_123456789_

Module: YARD::Handlers::Ruby::DSLHandlerMethods

Relationships & Source Files
Extension / Inclusion / Inheritance Descendants
Included In:
Super Chains via Extension / Inclusion / Inheritance
Instance Chain:
Defined in: lib/yard/handlers/ruby/dsl_handler_methods.rb

Constant Summary

::YARD::CodeObjects - Included

BUILTIN_ALL, BUILTIN_CLASSES, BUILTIN_EXCEPTIONS, BUILTIN_EXCEPTIONS_HASH, BUILTIN_MODULES, CONSTANTMATCH, CONSTANTSTART, CSEP, CSEPQ, ISEP, ISEPQ, METHODMATCH, METHODNAMEMATCH, NAMESPACEMATCH, NSEP, NSEPQ, PROXY_MATCH

Instance Attribute Summary

Instance Method Summary

Instance Attribute Details

#implicit_docstring?Boolean (readonly, private)

[ GitHub ]

  
# File 'lib/yard/handlers/ruby/dsl_handler_methods.rb', line 54

def implicit_docstring?
  tags = %w(method attribute overload visibility scope return)
  tags.any? {|tag| @docstring =~ /^@!?#{tag}\b/ }
end

Instance Method Details

#find_attached_macro (private)

[ GitHub ]

  
# File 'lib/yard/handlers/ruby/dsl_handler_methods.rb', line 72

def find_attached_macro
  Registry.all(:macro).each do |macro|
    next unless macro.method_object
    next unless macro_name_matches(macro)
    (namespace.inheritance_tree(true) + [P('Object')]).each do |obj|
      return macro if obj == macro.method_object.namespace
    end
  end
  nil
end

#handle_comments

[ GitHub ]

  
# File 'lib/yard/handlers/ruby/dsl_handler_methods.rb', line 14

def handle_comments
  return if IGNORE_METHODS[caller_method]

  @docstring = statement.comments || ""
  @docstring = @docstring.join("\n") if @docstring.is_a?(Array)

  attaching = false
  if @docstring =~ /^@!?macro\s+\[[^\]]*attach/
    register_docstring(nil)
    @docstring = ""
    attaching = true
  end

  macro = find_attached_macro
  if macro
    txt = macro.expand([caller_method, *call_params], statement.source)
    @docstring += "\n" + txt

    # macro may have a directive
    return register_docstring(nil) if !attaching && txt.match(/^\s*@!/)
  elsif !statement.comments_hash_flag && !implicit_docstring?
    return register_docstring(nil)
  end

  # ignore DSL definitions if @method/@attribute directive is used
  if @docstring =~ /^@!?(method|attribute)\b/
    return register_docstring(nil)
  end

  register MethodObject.new(namespace, method_name, scope) do |o|
    o.signature = method_signature
  end
end

#macro_name_matches(macro) ⇒ Boolean (private)

Returns:

  • (Boolean)

    whether caller method matches a macro or its alias names.

[ GitHub ]

  
# File 'lib/yard/handlers/ruby/dsl_handler_methods.rb', line 85

def macro_name_matches(macro)
  objs = [macro.method_object]
  if objs.first.type != :proxy && objs.first.respond_to?(:aliases)
    objs.concat(objs.first.aliases)
  end

  objs.any? {|obj| obj.name.to_s == caller_method.to_s }
end

#method_name (private)

[ GitHub ]

  
# File 'lib/yard/handlers/ruby/dsl_handler_methods.rb', line 59

def method_name
  name = call_params.first || ""
  if name =~ /^#{CodeObjects::METHODNAMEMATCH}$/
    name
  else
    raise UndocumentableError, "method, missing name"
  end
end

#method_signature (private)

[ GitHub ]

  
# File 'lib/yard/handlers/ruby/dsl_handler_methods.rb', line 68

def method_signature
  "def #{method_name}"
end

#register_docstring(object, docstring = @docstring, stmt = statement)

[ GitHub ]

  
# File 'lib/yard/handlers/ruby/dsl_handler_methods.rb', line 48

def register_docstring(object, docstring = @docstring, stmt = statement)
  super
end