[ruby/syntax_suggest] Preserve whitespace in front of comments

When removing comments I previously replaced them with a newline. This loses some context and may affect the order of the indent search which in turn affects the final result. By preserving whitespace in front of the comment, we preserve the "natural" indentation order of the line while also allowing the parser/lexer to see and join naturally consecutive (method chain) lines.

close https://github.com/ruby/syntax_suggest/pull/177
This commit is contained in:
schneems 2023-03-08 08:51:00 -06:00 коммит произвёл Hiroshi SHIBATA
Родитель 33cfd262fc
Коммит e5236471c3
6 изменённых файлов: 58 добавлений и 28 удалений

Просмотреть файл

@ -110,7 +110,7 @@ module SyntaxSuggest
@document.join
end
# Remove comments and whitespace only lines
# Remove comments
#
# replace with empty newlines
#
@ -156,8 +156,9 @@ module SyntaxSuggest
#
def clean_sweep(source:)
source.lines.map do |line|
if line.match?(/^\s*(#[^{].*)?$/) # https://rubular.com/r/LLE10D8HKMkJvs
$/
if line.match?(/^\s*#([^{].*)?$/) # https://rubular.com/r/LLE10D8HKMkJvs
whitespace = /^(?<whitespace>\s*)#([^{].*)?$/.match(line).named_captures["whitespace"] || ""
whitespace + $/
else
line
end

Просмотреть файл

@ -48,11 +48,9 @@ module SyntaxSuggest
strip_line = line.dup
strip_line.lstrip!
if strip_line.empty?
@empty = true
@indent = 0
if (@empty = strip_line.empty?)
@indent = line.length - 1 # Newline removed from strip_line is not "whitespace"
else
@empty = false
@indent = line.length - strip_line.length
end

Просмотреть файл

@ -207,5 +207,32 @@ module SyntaxSuggest
> 4 end
EOM
end
it "comment inside of a method" do
source = <<~'EOM'
class Dog
def bark
# todo
end
def sit
print "sit"
end
end
end # extra end
EOM
io = StringIO.new
SyntaxSuggest.call(
io: io,
source: source
)
out = io.string
expect(out).to include(<<~EOM)
> 1 class Dog
> 9 end
> 10 end # extra end
EOM
end
end
end

Просмотреть файл

@ -72,6 +72,25 @@ module SyntaxSuggest
EOM
end
it "joins multi-line chained methods when separated by comments" do
source = <<~EOM
User.
# comment
where(name: 'schneems').
# another comment
first
EOM
doc = CleanDocument.new(source: source).join_consecutive!
code_lines = doc.lines
expect(code_lines[0].to_s.count($/)).to eq(5)
code_lines[1..-1].each do |line|
expect(line.to_s.strip.length).to eq(0)
end
end
it "helper method: take_while_including" do
source = <<~EOM
User
@ -92,27 +111,10 @@ module SyntaxSuggest
# yolo
EOM
out = CleanDocument.new(source: source).lines.join
expect(out.to_s).to eq(<<~EOM)
puts "what"
EOM
end
it "whitespace: removes whitespace" do
source = " \n" + <<~EOM
puts "what"
EOM
out = CleanDocument.new(source: source).lines.join
expect(out.to_s).to eq(<<~EOM)
puts "what"
EOM
expect(source.lines.first.to_s).to_not eq("\n")
expect(out.lines.first.to_s).to eq("\n")
lines = CleanDocument.new(source: source).lines
expect(lines[0].to_s).to eq($/)
expect(lines[1].to_s).to eq('puts "what"' + $/)
expect(lines[2].to_s).to eq(' ' + $/)
end
it "trailing slash: does not join trailing do" do

Просмотреть файл

@ -48,6 +48,7 @@ module SyntaxSuggest
# Indicates line 1 can join 2, 2 can join 3, but 3 won't join it's next line
expect(code_lines.map(&:ignore_newline_not_beg?)).to eq([true, true, false, false])
end
it "trailing if" do
code_lines = CodeLine.from_source(<<~'EOM')
puts "lol" if foo

Просмотреть файл

@ -338,6 +338,7 @@ module SyntaxSuggest
end
EOM
search.call
puts "done"
expect(search.invalid_blocks.join).to eq(<<~'EOM')
Foo.call do