diff --git a/lib/rdoc/code_object/any_method.rb b/lib/rdoc/code_object/any_method.rb index cda994d369..71e622d1f4 100644 --- a/lib/rdoc/code_object/any_method.rb +++ b/lib/rdoc/code_object/any_method.rb @@ -113,6 +113,17 @@ def call_seq=(call_seq) @call_seq = call_seq end + ## + # Current token stream. + + def token_stream + unless options.store_method_source? + raise RDoc::Error, "method source for #{full_name} was not stored; set store_method_source? to true" + end + + super + end + ## # Whether the method has a call-seq. diff --git a/lib/rdoc/generator/markup.rb b/lib/rdoc/generator/markup.rb index d6a56adf97..0fee0da33a 100644 --- a/lib/rdoc/generator/markup.rb +++ b/lib/rdoc/generator/markup.rb @@ -138,9 +138,9 @@ def add_location_comment(src) # Prepends line numbers if +options.line_numbers+ is true. def markup_code - return '' if !@token_stream + return '' if !(tokens = token_stream) - src = RDoc::TokenStream.to_html @token_stream + src = RDoc::TokenStream.to_html tokens # dedent the source common_indent = src.length diff --git a/lib/rdoc/generator/pot.rb b/lib/rdoc/generator/pot.rb index a20fde077b..960b590dec 100644 --- a/lib/rdoc/generator/pot.rb +++ b/lib/rdoc/generator/pot.rb @@ -81,6 +81,8 @@ def generate end end + def self.store_method_source? = false + private def extract_messages extractor = MessageExtractor.new(@store) diff --git a/lib/rdoc/generator/ri.rb b/lib/rdoc/generator/ri.rb index 32f518ac71..1276592f1b 100644 --- a/lib/rdoc/generator/ri.rb +++ b/lib/rdoc/generator/ri.rb @@ -27,4 +27,5 @@ def generate @store.save end + def self.store_method_source? = false end diff --git a/lib/rdoc/options.rb b/lib/rdoc/options.rb index 4bb074892f..ddcccfb86c 100644 --- a/lib/rdoc/options.rb +++ b/lib/rdoc/options.rb @@ -1324,6 +1324,16 @@ def setup_generator(generator_name = @generator_name) end end + ## + # Returns whether syntax-highlighted method source should be stored. + + #: () -> bool + def store_method_source? + return false if @coverage_report + + !@generator.respond_to?(:store_method_source?) || @generator.store_method_source? + end + ## # Finds the template dir for +template+ diff --git a/lib/rdoc/parser/ruby.rb b/lib/rdoc/parser/ruby.rb index 63bec37426..bebc848908 100644 --- a/lib/rdoc/parser/ruby.rb +++ b/lib/rdoc/parser/ruby.rb @@ -553,9 +553,12 @@ def extract_section_comment(comment_text, prefix_line_count) # :nodoc: comment_text end - # Returns syntax highlighted tokens of the given node + # Returns syntax-highlighted tokens for +node+, or an empty Array when + # method source storage is disabled. def syntax_highlighted_tokens(node) + return [] unless @options.store_method_source? + RDoc::Parser::RubyColorizer.partial_colorize(@content, node, @prism_tokens) end diff --git a/test/rdoc/code_object/any_method_test.rb b/test/rdoc/code_object/any_method_test.rb index 3f3b681407..45671b1fae 100644 --- a/test/rdoc/code_object/any_method_test.rb +++ b/test/rdoc/code_object/any_method_test.rb @@ -152,6 +152,20 @@ def test_markup_code_empty assert_equal '', @c2_a.markup_code end + def test_markup_code_raises_when_method_source_not_stored + @options.generator = RDoc::Generator::RI + + error = assert_raise(RDoc::Error) { @c1_m.markup_code } + assert_equal 'method source for C1#m was not stored; set store_method_source? to true', error.message + end + + def test_token_stream_raises_when_method_source_not_stored + @options.generator = RDoc::Generator::RI + + error = assert_raise(RDoc::Error) { @c1_m.token_stream } + assert_equal 'method source for C1#m was not stored; set store_method_source? to true', error.message + end + def test_param_seq_with_variable_expansion m = RDoc::AnyMethod.new 'method' m.parent = @c1 diff --git a/test/rdoc/parser/ruby_test.rb b/test/rdoc/parser/ruby_test.rb index 3ebfd5891b..8b7d150d22 100644 --- a/test/rdoc/parser/ruby_test.rb +++ b/test/rdoc/parser/ruby_test.rb @@ -2715,6 +2715,26 @@ def foo assert_equal([' ', 'def', ' ', 'bar', "\n", ' ', 'baz', "\n", ' ', 'end'], bar.token_stream.map(&:text)) end + def test_code_object_source_not_stored + generator = Class.new do + def self.store_method_source? = false + end + @options.generator = generator + @store.options.generator = generator + + util_parser <<~RUBY + class Foo + def foo = 42 + end + RUBY + + method = @top_level.classes.first.method_list.first + error = assert_raise(RDoc::Error) { method.token_stream } + assert_equal 'method source for Foo#foo was not stored; set store_method_source? to true', error.message + error = assert_raise(RDoc::Error) { method.markup_code } + assert_equal 'method source for Foo#foo was not stored; set store_method_source? to true', error.message + end + def test_markup_first_comment util_parser <<~RUBY # :markup: rd