From c4ef4c79aa48c4dd0fb98a5311f666ea54fc1cac Mon Sep 17 00:00:00 2001 From: Marc-Andre Lafortune Date: Sun, 7 Mar 2021 16:28:00 -0500 Subject: [PATCH] + `Source::TreeRewriter#inspect` [#728] --- lib/parser/source/tree_rewriter.rb | 27 +++++++++++++++++++++++++++ test/test_source_tree_rewriter.rb | 11 +++++++++++ 2 files changed, 38 insertions(+) diff --git a/lib/parser/source/tree_rewriter.rb b/lib/parser/source/tree_rewriter.rb index 9e0ec8fef..cef8c2a8a 100644 --- a/lib/parser/source/tree_rewriter.rb +++ b/lib/parser/source/tree_rewriter.rb @@ -330,6 +330,11 @@ def in_transaction? @in_transaction end + # :nodoc: + def inspect + "#<#{self.class} #{source_buffer.name}: #{action_summary}>" + end + ## # @api private # @deprecated Use insert_after or wrap @@ -361,6 +366,28 @@ def insert_after_multi(range, text) private + def action_summary + replacements = as_replacements + case replacements.size + when 0 then return 'empty' + when 1..3 then #ok + else + replacements = replacements.first(3) + suffix = '…' + end + parts = replacements.map do |(range, str)| + if str.empty? + "-#{range.to_range}" + elsif range.size == 0 + "+#{str.inspect}@#{range.begin_pos}" + else + "^#{str.inspect}@#{range.to_range}" + end + end + parts << suffix if suffix + parts.join(', ') + end + ACTIONS = %i[accept warn raise].freeze def check_policy_validity invalid = @policy.values - ACTIONS diff --git a/test/test_source_tree_rewriter.rb b/test/test_source_tree_rewriter.rb index 4fca87be1..c1b470b17 100644 --- a/test/test_source_tree_rewriter.rb +++ b/test/test_source_tree_rewriter.rb @@ -358,4 +358,15 @@ def test_empty_import assert_equal @rewriter, @rewriter.import!(@rewriter2) assert_equal @rewriter, @rewriter.import!(@rewriter, offset: 42) end + + def test_inspect + assert_equal '#', @rewriter.inspect + @rewriter.insert_before(@hello, '[') + @rewriter.replace(@ll, 'xxx') + @rewriter.remove(@comma_space) + assert_equal '#', @rewriter.inspect + @rewriter.insert_before(@hello, '{') + @rewriter.remove(@world) + assert_equal '#', @rewriter.inspect + end end