in lib/rdoc/parser/ruby.rb [1005:1059]
def parse_constant_body container, constant, is_array_or_hash
nest = 0
rhs_name = ''.dup
get_tkread
tk = get_tk
body = nil
loop do
break if tk.nil?
if :on_semicolon == tk[:kind] then
break if nest <= 0
elsif [:on_tlambeg, :on_lparen, :on_lbrace, :on_lbracket].include?(tk[:kind]) then
nest += 1
elsif (:on_kw == tk[:kind] && 'def' == tk[:text]) then
nest += 1
elsif (:on_kw == tk[:kind] && %w{do if unless case begin}.include?(tk[:text])) then
if (tk[:state] & RDoc::Parser::RipperStateLex::EXPR_LABEL) == 0
nest += 1
end
elsif [:on_rparen, :on_rbrace, :on_rbracket].include?(tk[:kind]) ||
(:on_kw == tk[:kind] && 'end' == tk[:text]) then
nest -= 1
elsif (:on_comment == tk[:kind] or :on_embdoc == tk[:kind]) then
unget_tk tk
if nest <= 0 and RDoc::Parser::RipperStateLex.end?(tk) then
body = get_tkread_clean(/^[ \t]+/, '')
read_documentation_modifiers constant, RDoc::CONSTANT_MODIFIERS
break
else
read_documentation_modifiers constant, RDoc::CONSTANT_MODIFIERS
end
elsif :on_const == tk[:kind] then
rhs_name << tk[:text]
next_tk = peek_tk
if nest <= 0 and (next_tk.nil? || :on_nl == next_tk[:kind]) then
create_module_alias container, constant, rhs_name unless is_array_or_hash
break
end
elsif :on_nl == tk[:kind] then
if nest <= 0 and RDoc::Parser::RipperStateLex.end?(tk) then
unget_tk tk
break
end
elsif :on_op == tk[:kind] && '::' == tk[:text]
rhs_name << '::'
end
tk = get_tk
end
body ? body : get_tkread_clean(/^[ \t]+/, '')
end