class RDoc::Parser::C
def find_body(class_name, meth_name, meth_obj, body, quiet = false)
def find_body(class_name, meth_name, meth_obj, body, quiet = false) case body when %r"((?>/\*.*?\*/\s*))((?:(?:static|SWIGINTERN)\s+)?(?:intern\s+)?VALUE\s+#{meth_name} \s*(\([^)]*\))([^;]|$))"xm comment = $1 body_text = $2 params = $3 remove_private_comments comment if comment # see if we can find the whole body re = Regexp.escape(body_text) + '[^(]*^\{.*?^\}' body_text = $& if /#{re}/m =~ body # The comment block may have been overridden with a 'Document-method' # block. This happens in the interpreter when multiple methods are # vectored through to the same C method but those methods are logically # distinct (for example Kernel.hash and Kernel.object_id share the same # implementation override_comment = find_override_comment class_name, meth_obj.name comment = override_comment if override_comment find_modifiers comment, meth_obj if comment #meth_obj.params = params meth_obj.start_collecting_tokens tk = RDoc::RubyToken::Token.new nil, 1, 1 tk.set_text body_text meth_obj.add_token tk meth_obj.comment = strip_stars comment when %r{((?>/\*.*?\*/\s*))^\s*(\#\s*define\s+#{meth_name}\s+(\w+))}m comment = $1 body_text = $2 find_body class_name, $3, meth_obj, body, true find_modifiers comment, meth_obj meth_obj.start_collecting_tokens tk = RDoc::RubyToken::Token.new nil, 1, 1 tk.set_text body_text meth_obj.add_token tk meth_obj.comment = strip_stars(comment) + meth_obj.comment.to_s when %r{^\s*\#\s*define\s+#{meth_name}\s+(\w+)}m unless find_body(class_name, $1, meth_obj, body, true) warn "No definition for #{meth_name}" unless @options.quiet return false end else # No body, but might still have an override comment comment = find_override_comment(class_name, meth_obj.name) if comment find_modifiers(comment, meth_obj) meth_obj.comment = strip_stars comment else warn "No definition for #{meth_name}" unless @options.quiet return false end end true end