Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix ghost method line no #751

Merged
merged 1 commit into from
Nov 27, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions lib/rdoc/comment.rb
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,11 @@ class RDoc::Comment

attr_accessor :location

##
# Line where this Comment was written

attr_accessor :line

##
# For duck-typing when merging classes at load time

Expand Down
14 changes: 10 additions & 4 deletions lib/rdoc/parser/ruby.rb
Original file line number Diff line number Diff line change
Expand Up @@ -244,6 +244,7 @@ def collect_first_comment
comment = RDoc::Encoding.change_encoding comment, @encoding if @encoding
first_line = true
first_comment_tk_kind = nil
line_no = nil

tk = get_tk

Expand All @@ -260,6 +261,7 @@ def collect_first_comment
break if first_comment_tk_kind and not first_comment_tk_kind === tk[:kind]
first_comment_tk_kind = tk[:kind]

line_no = tk[:line_no] if first_line
first_line = false
comment << comment_body
tk = get_tk
Expand All @@ -273,7 +275,7 @@ def collect_first_comment

unget_tk tk

new_comment comment
new_comment comment, line_no
end

##
Expand Down Expand Up @@ -666,8 +668,9 @@ def make_message message
##
# Creates a comment with the correct format

def new_comment comment
def new_comment comment, line_no = nil
c = RDoc::Comment.new comment, @top_level, :ruby
c.line = line_no
c.format = @markup
c
end
Expand Down Expand Up @@ -1058,13 +1061,14 @@ def parse_constant_body container, constant, is_array_or_hash # :nodoc:
def parse_comment container, tk, comment
return parse_comment_tomdoc container, tk, comment if @markup == 'tomdoc'
column = tk[:char_no]
line_no = tk[:line_no]
line_no = comment.line.nil? ? tk[:line_no] : comment.line

comment.text = comment.text.sub(/(^# +:?)(singleton-)(method:)/, '\1\3')
singleton = !!$~

co =
if (comment.text = comment.text.sub(/^# +:?method: *(\S*).*?\n/i, '')) && !!$~ then
line_no += $`.count("\n")
parse_comment_ghost container, comment.text, $1, column, line_no, comment
elsif (comment.text = comment.text.sub(/# +:?(attr(_reader|_writer|_accessor)?): *(\S*).*?\n/i, '')) && !!$~ then
parse_comment_attr container, $1, $3, comment
Expand Down Expand Up @@ -1776,8 +1780,10 @@ def parse_statements(container, single = NORMAL, current_method = nil,
comment = RDoc::Encoding.change_encoding comment, @encoding if @encoding
end

line_no = nil
while tk and (:on_comment == tk[:kind] or :on_embdoc == tk[:kind]) do
comment_body = retrieve_comment_body(tk)
line_no = tk[:line_no] if comment.empty?
comment += comment_body
comment << "\n" unless comment_body =~ /\n\z/

Expand All @@ -1787,7 +1793,7 @@ def parse_statements(container, single = NORMAL, current_method = nil,
tk = get_tk
end

comment = new_comment comment
comment = new_comment comment, line_no

unless comment.empty? then
look_for_directives_in container, comment
Expand Down
8 changes: 5 additions & 3 deletions test/rdoc/test_rdoc_parser_ruby.rb
Original file line number Diff line number Diff line change
Expand Up @@ -776,6 +776,7 @@ class Foo

blah = foo.method_list.first
assert_equal 'Foo#blah', blah.full_name
assert_equal 3, blah.line
assert_equal @top_level, blah.file
end

Expand Down Expand Up @@ -825,6 +826,7 @@ class Foo
blah = foo.method_list.first
assert_equal 'Foo#yields', blah.full_name
assert_equal 'yields(name)', blah.call_seq
assert_equal 3, blah.line
assert_equal @top_level, blah.file
end

Expand Down Expand Up @@ -1323,7 +1325,7 @@ def test_parse_comment_method
assert_equal 'foo', foo.name
assert_equal 'my method', foo.comment.text
assert_equal @top_level, foo.file
assert_equal 1, foo.line
assert_equal 2, foo.line

assert_equal [], foo.aliases
assert_nil foo.block_params
Expand All @@ -1344,8 +1346,8 @@ def test_parse_comment_method

stream = [
{
:line_no => 1, :char_no => 1, :kind => :on_comment,
:text => "# File #{@top_level.relative_name}, line 1"
:line_no => 2, :char_no => 1, :kind => :on_comment,
:text => "# File #{@top_level.relative_name}, line 2"
},
{ :line_no => 0, :char_no => 0, :kind => :on_nl, :text => "\n" },
{ :line_no => 1, :char_no => 1, :kind => :on_sp, :text => '' }
Expand Down