diff options
Diffstat (limited to 'lib/rdoc/include.rb')
-rw-r--r-- | lib/rdoc/include.rb | 43 |
1 files changed, 31 insertions, 12 deletions
diff --git a/lib/rdoc/include.rb b/lib/rdoc/include.rb index 9cebd3d8ef..1e9ff5a464 100644 --- a/lib/rdoc/include.rb +++ b/lib/rdoc/include.rb @@ -1,5 +1,3 @@ -require 'rdoc/code_object' - ## # A Module include in a class with \#include @@ -17,7 +15,7 @@ class RDoc::Include < RDoc::CodeObject super() @name = name self.comment = comment - @module = nil # cache for module if found + @module = nil # cache for module if found end ## @@ -30,10 +28,11 @@ class RDoc::Include < RDoc::CodeObject end def == other # :nodoc: - self.class == other.class and - self.name == other.name + self.class === other and @name == other.name end + alias eql? == + ## # Full name based on #module @@ -42,6 +41,10 @@ class RDoc::Include < RDoc::CodeObject RDoc::ClassModule === m ? m.full_name : @name end + def hash # :nodoc: + [@name, self.module].hash + end + def inspect # :nodoc: "#<%s:0x%x %s.include %s>" % [ self.class, @@ -59,6 +62,13 @@ class RDoc::Include < RDoc::CodeObject # - if not found, look into the children of included modules, # in reverse inclusion order; # - if still not found, go up the hierarchy of names. + # + # This method has <code>O(n!)</code> behavior when the module calling + # include is referencing nonexistent modules. Avoid calling #module until + # after all the files are parsed. This behavior is due to ruby's constant + # lookup behavior. + # + # As of the beginning of October, 2011, no gem includes nonexistent modules. def module return @module if @module @@ -66,7 +76,7 @@ class RDoc::Include < RDoc::CodeObject # search the current context return @name unless parent full_name = parent.child_name(@name) - @module = RDoc::TopLevel.modules_hash[full_name] + @module = @store.modules_hash[full_name] return @module if @module return @name if @name =~ /^::/ @@ -76,22 +86,31 @@ class RDoc::Include < RDoc::CodeObject inc = i.module next if String === inc full_name = inc.child_name(@name) - @module = RDoc::TopLevel.modules_hash[full_name] + @module = @store.modules_hash[full_name] return @module if @module end # go up the hierarchy of names - p = parent.parent - while p - full_name = p.child_name(@name) - @module = RDoc::TopLevel.modules_hash[full_name] + up = parent.parent + while up + full_name = up.child_name(@name) + @module = @store.modules_hash[full_name] return @module if @module - p = p.parent + up = up.parent end @name end + ## + # Sets the store for this class or module and its contained code objects. + + def store= store + super + + @file = @store.add_file @file.full_name if @file + end + def to_s # :nodoc: "include #@name in: #{parent}" end |