aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--lib/rdoc/context.rb13
-rw-r--r--test/rdoc/test_rdoc_context.rb32
-rw-r--r--test/rdoc/test_rdoc_ri_store.rb10
4 files changed, 58 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 1791e90c6d..2ec77cc2a9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Sat May 14 12:06:49 2011 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rdoc/context.rb (class RDoc): Fix infinite loop caused by
+ re-encountering BasicObject.
+
Sat May 14 10:32:36 2011 Martin Bosslet <Martin.Bosslet@googlemail.com>
* test/openssl/test_pkey_rsa.rb: Add tests that ensure new public key
diff --git a/lib/rdoc/context.rb b/lib/rdoc/context.rb
index 0d7fc41529..f0168585ec 100644
--- a/lib/rdoc/context.rb
+++ b/lib/rdoc/context.rb
@@ -373,6 +373,12 @@ class RDoc::Context < RDoc::CodeObject
end
end
+ # fix up superclass
+ superclass = nil if full_name == 'BasicObject'
+ superclass = nil if full_name == 'Object' and defined?(::BasicObject)
+ superclass = '::BasicObject' if
+ defined?(::BasicObject) and full_name == 'Object'
+
# find the superclass full name
if superclass then
if superclass =~ /^:+/ then
@@ -658,6 +664,13 @@ class RDoc::Context < RDoc::CodeObject
end
##
+ # Iterator for ancestors for duck-typing. Does nothing. See
+ # RDoc::ClassModule#each_ancestor.
+
+ def each_ancestor # :nodoc:
+ end
+
+ ##
# Iterator for attributes
def each_attribute # :yields: attribute
diff --git a/test/rdoc/test_rdoc_context.rb b/test/rdoc/test_rdoc_context.rb
index 02f7311d01..55c6c6e6e3 100644
--- a/test/rdoc/test_rdoc_context.rb
+++ b/test/rdoc/test_rdoc_context.rb
@@ -105,6 +105,38 @@ class TestRDocContext < XrefTestCase
assert_includes RDoc::TopLevel.classes.map { |k| k.full_name }, 'C1::Klass'
end
+ def test_add_class_basic_object
+ skip 'BasicObject is 1.9 only' unless defined?(BasicObject)
+
+ @xref_data.add_class RDoc::NormalClass, 'BasicObject'
+
+ basic = @xref_data.find_module_named 'BasicObject'
+
+ assert_nil basic.superclass
+
+ @c1.add_class RDoc::NormalClass, 'BasicObject'
+
+ basic = @c1.find_module_named 'BasicObject'
+
+ assert_equal 'Object', basic.superclass
+ end
+
+ def test_add_class_object
+ root_class = defined?(BasicObject) ? 'BasicObject' : nil
+
+ @xref_data.add_class RDoc::NormalClass, 'Object'
+
+ object = @xref_data.find_module_named 'Object'
+
+ assert_equal root_class, object.superclass
+
+ @c1.add_class RDoc::NormalClass, 'Object'
+
+ object = @c1.find_module_named 'Object'
+
+ assert_equal 'Object', object.superclass.full_name
+ end
+
def test_add_class_superclass
@c1.add_class RDoc::NormalClass, 'Klass', 'Object'
@c1.add_class RDoc::NormalClass, 'Klass', 'Other'
diff --git a/test/rdoc/test_rdoc_ri_store.rb b/test/rdoc/test_rdoc_ri_store.rb
index 7c9f4ec80b..83aebf009b 100644
--- a/test/rdoc/test_rdoc_ri_store.rb
+++ b/test/rdoc/test_rdoc_ri_store.rb
@@ -215,6 +215,8 @@ class TestRDocRIStore < MiniTest::Unit::TestCase
},
}
+ expected[:ancestors]['Object'] = %w[BasicObject] if defined?(::BasicObject)
+
open File.join(@tmpdir, 'cache.ri'), 'rb' do |io|
cache = Marshal.load io.read
@@ -250,8 +252,10 @@ class TestRDocRIStore < MiniTest::Unit::TestCase
assert_directory File.join(@tmpdir, 'Object')
assert_file File.join(@tmpdir, 'Object', 'cdesc-Object.ri')
+ object_ancestors = defined?(::BasicObject) ? %w[BasicObject] : []
+
assert_cache({}, {}, { 'Object' => ['attr_accessor attr'] }, %w[Object],
- 'Object' => %w[])
+ 'Object' => object_ancestors)
assert_equal @klass, @s.load_class('Object')
end
@@ -303,8 +307,10 @@ class TestRDocRIStore < MiniTest::Unit::TestCase
assert_directory File.join(@tmpdir, 'Object')
assert_file File.join(@tmpdir, 'Object', 'cdesc-Object.ri')
+ object_ancestors = defined?(::BasicObject) ? %w[BasicObject] : []
+
assert_cache({}, {}, { 'Object' => ['attr_accessor attr'] }, %w[Object],
- 'Object' => %w[])
+ 'Object' => object_ancestors)
assert_equal @klass, @s.load_class('Object')
end