diff --git a/lib/rdoc/any_method.rb b/lib/rdoc/any_method.rb index f3f8336..3a2367f 100644 --- a/lib/rdoc/any_method.rb +++ b/lib/rdoc/any_method.rb @@ -1,6 +1,8 @@ require 'rdoc/code_object' require 'rdoc/tokenstream' +require 'cgi' + ## # AnyMethod is the base class for objects representing methods @@ -48,7 +50,9 @@ class RDoc::AnyMethod < RDoc::CodeObject ## # Fragment reference for this method - attr_reader :aref + def aref + "#{CGI::escape(name)}-#{singleton ? 'class_method' : 'instance_method'}" + end ## # The method we're aliasing @@ -69,9 +73,9 @@ class RDoc::AnyMethod < RDoc::CodeObject ## # Resets method fragment reference counter + # (obsolete) def self.reset - @@aref = 'M000000' end reset @@ -92,9 +96,6 @@ class RDoc::AnyMethod < RDoc::CodeObject @singleton = nil @token_stream = nil @visibility = :public - - @aref = @@aref - @@aref = @@aref.succ end ## @@ -248,7 +249,7 @@ class RDoc::AnyMethod < RDoc::CodeObject # Path to this method def path - "#{@parent.path}##{@aref}" + "#{@parent.path}##{aref}" end ## diff --git a/lib/rdoc/rdoc.rb b/lib/rdoc/rdoc.rb index bdc4fa0..9c39354 100644 --- a/lib/rdoc/rdoc.rb +++ b/lib/rdoc/rdoc.rb @@ -353,7 +353,6 @@ The internal error was: def document(argv) RDoc::TopLevel.reset RDoc::Parser::C.reset - RDoc::AnyMethod.reset @options = RDoc::Options.new @options.parse argv diff --git a/test/rdoc/test_rdoc_markup_to_html_crossref.rb b/test/rdoc/test_rdoc_markup_to_html_crossref.rb index a0c8466..d22f2b4 100644 --- a/test/rdoc/test_rdoc_markup_to_html_crossref.rb +++ b/test/rdoc/test_rdoc_markup_to_html_crossref.rb @@ -28,7 +28,7 @@ class TestRDocMarkupToHtmlCrossref < XrefTestCase refute_ref '#m', '#m' assert_ref '../C2/C3.html', 'C2::C3' - assert_ref '../C2/C3.html#M000002', 'C2::C3#m' + assert_ref '../C2/C3.html#m-instance_method', 'C2::C3#m' assert_ref '../C2/C3/H1.html', 'C3::H1' assert_ref '../C4.html', 'C4' @@ -41,10 +41,10 @@ class TestRDocMarkupToHtmlCrossref < XrefTestCase def test_handle_special_CROSSREF_C2_C3 @xref = RDoc::Markup::ToHtmlCrossref.new 'classes/C2/C3.html', @c2_c3, true - assert_ref '../../C2/C3.html#M000002', '#m' + assert_ref '../../C2/C3.html#m-instance_method', '#m' assert_ref '../../C2/C3.html', 'C3' - assert_ref '../../C2/C3.html#M000002', 'C3#m' + assert_ref '../../C2/C3.html#m-instance_method', 'C3#m' assert_ref '../../C2/C3/H1.html', 'H1' assert_ref '../../C2/C3/H1.html', 'C3::H1' @@ -105,30 +105,32 @@ class TestRDocMarkupToHtmlCrossref < XrefTestCase def test_handle_special_CROSSREF_method refute_ref 'm', 'm' - assert_ref 'C1.html#M000000', '#m' + # Bug: cross ref doesn't distinguish instance methods from class methods currently. + # Ideally, the lines marked with "BUG" below should be modified whenever this is fixed + assert_ref 'C1.html#m-class_method', '#m' # BUG - assert_ref 'C1.html#M000000', 'C1#m' - assert_ref 'C1.html#M000000', 'C1#m()' - assert_ref 'C1.html#M000000', 'C1#m(*)' + assert_ref 'C1.html#m-class_method', 'C1#m' # BUG + assert_ref 'C1.html#m-class_method', 'C1#m()' # BUG + assert_ref 'C1.html#m-class_method', 'C1#m(*)' # BUG - assert_ref 'C1.html#M000000', 'C1.m' - assert_ref 'C1.html#M000000', 'C1.m()' - assert_ref 'C1.html#M000000', 'C1.m(*)' + assert_ref 'C1.html#m-class_method', 'C1.m' + assert_ref 'C1.html#m-class_method', 'C1.m()' + assert_ref 'C1.html#m-class_method', 'C1.m(*)' # HACK should this work #assert_ref 'classes/C1.html#M000001', 'C1::m' #assert_ref 'classes/C1.html#M000001', 'C1::m()' #assert_ref 'classes/C1.html#M000001', 'C1::m(*)' - assert_ref 'C2/C3.html#M000002', 'C2::C3#m' + assert_ref 'C2/C3.html#m-instance_method', 'C2::C3#m' - assert_ref 'C2/C3.html#M000002', 'C2::C3.m' + assert_ref 'C2/C3.html#m-instance_method', 'C2::C3.m' # BUG - assert_ref 'C2/C3/H1.html#M000003', 'C2::C3::H1#m?' + assert_ref 'C2/C3/H1.html#m%3F-instance_method', 'C2::C3::H1#m?' - assert_ref 'C2/C3.html#M000002', '::C2::C3#m' - assert_ref 'C2/C3.html#M000002', '::C2::C3#m()' - assert_ref 'C2/C3.html#M000002', '::C2::C3#m(*)' + assert_ref 'C2/C3.html#m-instance_method', '::C2::C3#m' + assert_ref 'C2/C3.html#m-instance_method', '::C2::C3#m()' + assert_ref 'C2/C3.html#m-instance_method', '::C2::C3#m(*)' end def test_handle_special_CROSSREF_no_ref