mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	 2ef9c50c6e
			
		
	
	
		2ef9c50c6e
		
	
	
	
	
		
			
			git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@30249 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
		
			
				
	
	
		
			100 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			100 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| 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
 | |
| 
 |