def find_or_create_macro(object_or_docstring)
if object_or_docstring.is_a?(Docstring)
object, docstring = nil, object_or_docstring
else
object, docstring = object_or_docstring, object_or_docstring.docstring
end
return unless macro_tag = docstring.tag(:macro)
unless macro_tag.name
if object
log.warn "Invalid/missing macro name for #{object.path} (#{parser.file}:#{statement.line})"
return nil
else
raise UndocumentableError, 'method/attribute, missing macro name'
end
end
caller_obj = caller_method ? P(namespace, caller_method) : nil
if macro = MacroObject.find_or_create(docstring, caller_obj)
attached_method_name = caller_method
if object && object.is_a?(MethodObject) && object.scope == :class
macro.method_object = object
attached_method_name = object.name.to_s
end
if macro.attached?
globals.__attached_macros ||= {}
globals.__attached_macros[attached_method_name] ||= []
globals.__attached_macros[attached_method_name] |= [macro]
end
end
macro
end