少し前にフィードバックをもらっていたイシューとなる。
以下のように、case と最初の when の間にあるソースコードコメントが autocorrect で消えるというフィードバックだった。
def foo case # when bar ... when bar 2 end end
プロダクトコードのパッチは以下で、case から最初の when までの範囲を if に autocorrect 置換していたのを、case を削除して最初の when を if に置換することでコメントを維持するようにした。
private
def correct_case_when(corrector, case_node, when_nodes)
- case_range = case_node.loc.keyword.join(when_nodes.first.loc.keyword)
-
- corrector.replace(case_range, 'if')
+ remove_case_node(corrector, case_node)
+ corrector.replace(when_nodes.first.loc.keyword, 'if')
when_nodes[1..-1].each do |when_node|
corrector.replace(when_node.loc.keyword, 'elsif')
@@ -88,6 +87,14 @@ def correct_when_conditions(corrector, when_nodes)
corrector.replace(range, conditions.map(&:source).join(' || '))
end
end
+
+ def remove_case_node(corrector, case_node)
+ range = range_by_whole_lines(
+ case_node.loc.keyword, include_final_newline: true
+ )
+ corrector.remove(range)
+ end
end
end
end
range_by_whole_lines(case_node.loc.keyword, include_final_newline: true) の range_by_whole_lines メソッドと include_final_newline: true オプションが伝家の宝刀で、case について行末改行までを対象とした範囲を得ることができる。
(余談だが、private メソッドに切り出しているのは諸々の Cop に引っかかる都合上 Extract Method した結果となる。)
以下のようにコメントが維持されるようになっている。
Before
def foo if bar 2 end end
After
def foo # when bar ... if bar 2 end end