diff options
Diffstat (limited to 'ruby_1_9_3/lib/rdoc/include.rb')
-rw-r--r-- | ruby_1_9_3/lib/rdoc/include.rb | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/ruby_1_9_3/lib/rdoc/include.rb b/ruby_1_9_3/lib/rdoc/include.rb new file mode 100644 index 0000000000..9cebd3d8ef --- /dev/null +++ b/ruby_1_9_3/lib/rdoc/include.rb @@ -0,0 +1,100 @@ +require 'rdoc/code_object' + +## +# A Module include in a class with \#include + +class RDoc::Include < RDoc::CodeObject + + ## + # Name of included module + + attr_accessor :name + + ## + # Creates a new Include for +name+ with +comment+ + + def initialize(name, comment) + super() + @name = name + self.comment = comment + @module = nil # cache for module if found + end + + ## + # Includes are sorted by name + + def <=> other + return unless self.class === other + + name <=> other.name + end + + def == other # :nodoc: + self.class == other.class and + self.name == other.name + end + + ## + # Full name based on #module + + def full_name + m = self.module + RDoc::ClassModule === m ? m.full_name : @name + end + + def inspect # :nodoc: + "#<%s:0x%x %s.include %s>" % [ + self.class, + object_id, + parent_name, @name, + ] + end + + ## + # Attempts to locate the included module object. Returns the name if not + # known. + # + # The scoping rules of Ruby to resolve the name of an included module are: + # - first look into the children of the current context; + # - if not found, look into the children of included modules, + # in reverse inclusion order; + # - if still not found, go up the hierarchy of names. + + def module + return @module if @module + + # search the current context + return @name unless parent + full_name = parent.child_name(@name) + @module = RDoc::TopLevel.modules_hash[full_name] + return @module if @module + return @name if @name =~ /^::/ + + # search the includes before this one, in reverse order + searched = parent.includes.take_while { |i| i != self }.reverse + searched.each do |i| + inc = i.module + next if String === inc + full_name = inc.child_name(@name) + @module = RDoc::TopLevel.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] + return @module if @module + p = p.parent + end + + @name + end + + def to_s # :nodoc: + "include #@name in: #{parent}" + end + +end + |