From: Tilman Sauerbeck Date: 2005-01-23T20:10:30+09:00 Subject: Re: RDoc enhancement proposal --BXVAT5kNtrzKuDFl Content-Type: text/plain; charset=us-ascii Content-Disposition: inline leon breedt [2005-01-23 19:48]: > 1. Classes and modules defined across multiple files in C extensions > ===================================================== > > A current weakness (while not a problem for .rb files) when parsing C > extensions is that each file is regarded as an island for the purposes > of parsing. This is fine for small extensions, but for more complex > ones, this causes RDoc to not find classes or modules that were > defined in seperate files. > > I propose providing a way to indicate that a set of files belong > together for the purposes of looking up module and class definitions. > This should not be needed for Ruby files, obviously. See the attached patch for one way of how to fix this. It's a bit hackish, though :] -- Regards, Tilman --BXVAT5kNtrzKuDFl Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="rdoc-remember_classes.diff" diff -aur ruby-1.8.2.orig/lib/rdoc/parsers/parse_c.rb ruby-1.8.2/lib/rdoc/parsers/parse_c.rb --- ruby-1.8.2.orig/lib/rdoc/parsers/parse_c.rb 2004-09-09 04:48:32.000000000 +0200 +++ ruby-1.8.2/lib/rdoc/parsers/parse_c.rb 2005-01-23 12:11:51.244356576 +0100 @@ -170,6 +170,7 @@ parse_files_matching(/\.(c|cc|cpp|CC)$/) @@known_bodies = {} + @@classes = {} # prepare to parse a C file def initialize(top_level, file_name, body, options, stats) @@ -178,7 +179,6 @@ @options = options @stats = stats @top_level = top_level - @classes = Hash.new @file_dir = File.dirname(file_name) end @@ -208,7 +208,7 @@ parent_name = @known_classes[parent] || parent if in_module - enclosure = @classes[in_module] + enclosure = @@classes[in_module] unless enclosure $stderr.puts("Enclosing class/module '#{in_module}' for " + "#{class_mod} #{class_name} not known") @@ -228,7 +228,7 @@ cm.record_location(enclosure.toplevel) find_class_comment(cm.full_name, cm) - @classes[var_name] = cm + @@classes[var_name] = cm @known_classes[var_name] = cm.full_name end @@ -483,7 +483,7 @@ # rb_include_module(rb_cArray, rb_mEnumerable); def do_includes @body.scan(/rb_include_module\(\s*(\w+?),\s*(\w+?)\s*\)/) do |c,m| - if cls = @classes[c] + if cls = @@classes[c] m = KNOWN_CLASSES[m] || m cls.add_include(Include.new(m, "")) end @@ -502,14 +502,14 @@ end def find_class(raw_name, name) - unless @classes[raw_name] + unless @@classes[raw_name] if raw_name =~ /^rb_m/ - @classes[raw_name] = @top_level.add_module(NormalModule, name) + @@classes[raw_name] = @top_level.add_module(NormalModule, name) else - @classes[raw_name] = @top_level.add_class(NormalClass, name, nil) + @@classes[raw_name] = @top_level.add_class(NormalClass, name, nil) end end - @classes[raw_name] + @@classes[raw_name] end # Remove #ifdefs that would otherwise confuse us --BXVAT5kNtrzKuDFl--