aboutsummaryrefslogtreecommitdiffstats
path: root/lib/rdoc/include.rb
diff options
context:
space:
mode:
authordrbrain <drbrain@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-12-20 03:22:49 +0000
committerdrbrain <drbrain@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-12-20 03:22:49 +0000
commit2ef9c50c6e405717d06362787c4549ca4f1c6485 (patch)
treeee99486567461dd5796f3d6edcc9e204187f2666 /lib/rdoc/include.rb
parentd7effd506f5b91a636f2e6452ef1946b923007c7 (diff)
downloadruby-2ef9c50c6e405717d06362787c4549ca4f1c6485.tar.gz
Import RDoc 3
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@30249 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/rdoc/include.rb')
-rw-r--r--lib/rdoc/include.rb41
1 files changed, 40 insertions, 1 deletions
diff --git a/lib/rdoc/include.rb b/lib/rdoc/include.rb
index 11a9bdc7ef..9cebd3d8ef 100644
--- a/lib/rdoc/include.rb
+++ b/lib/rdoc/include.rb
@@ -17,6 +17,7 @@ class RDoc::Include < RDoc::CodeObject
super()
@name = name
self.comment = comment
+ @module = nil # cache for module if found
end
##
@@ -52,9 +53,47 @@ class RDoc::Include < RDoc::CodeObject
##
# 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
- RDoc::TopLevel.find_module_named(@name) || @name
+ 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