diff options
author | Kevin Newton <kddnewton@gmail.com> | 2024-04-11 14:37:11 -0400 |
---|---|---|
committer | git <svn-admin@ruby-lang.org> | 2024-04-11 18:53:30 +0000 |
commit | cd516ebd20a8d2c7b0f912e4d5750f84616463a5 (patch) | |
tree | ed677fdbc2de6d64f847ef9768b9281d1cb97cba | |
parent | 58f93eec188df0a77b61b4781a7baf7b2c608097 (diff) |
[ruby/prism] Add Location#chop
https://github.com/ruby/prism/commit/5dd57f4b84
-rw-r--r-- | lib/prism/desugar_compiler.rb | 6 | ||||
-rw-r--r-- | lib/prism/parse_result.rb | 5 | ||||
-rw-r--r-- | test/prism/ruby_api_test.rb | 11 |
3 files changed, 20 insertions, 2 deletions
diff --git a/lib/prism/desugar_compiler.rb b/lib/prism/desugar_compiler.rb index 8d059b0c98..9b62c00df3 100644 --- a/lib/prism/desugar_compiler.rb +++ b/lib/prism/desugar_compiler.rb @@ -73,6 +73,8 @@ module Prism # Desugar `x += y` to `x = x + y` def compile + operator_loc = node.operator_loc.chop + write_class.new( source, *arguments, @@ -82,8 +84,8 @@ module Prism 0, read_class.new(source, *arguments, node.name_loc), nil, - node.operator_loc.slice.chomp("=").to_sym, - node.operator_loc.copy(length: node.operator_loc.length - 1), + operator_loc.slice.to_sym, + operator_loc, nil, ArgumentsNode.new(source, 0, [node.value], node.value.location), nil, diff --git a/lib/prism/parse_result.rb b/lib/prism/parse_result.rb index b6109b0993..39e15f6027 100644 --- a/lib/prism/parse_result.rb +++ b/lib/prism/parse_result.rb @@ -161,6 +161,11 @@ module Prism Location.new(source, start_offset, length) end + # Returns a new location that is the result of chopping off the last byte. + def chop + copy(length: length == 0 ? length : length - 1) + end + # Returns a string representation of this location. def inspect "#<Prism::Location @start_offset=#{@start_offset} @length=#{@length} start_line=#{start_line}>" diff --git a/test/prism/ruby_api_test.rb b/test/prism/ruby_api_test.rb index 49296117bf..6418887147 100644 --- a/test/prism/ruby_api_test.rb +++ b/test/prism/ruby_api_test.rb @@ -198,6 +198,17 @@ module Prism assert_equal 7, location.end_code_units_column(Encoding::UTF_32LE) end + def test_location_chop + location = Prism.parse("foo").value.location + + assert_equal "fo", location.chop.slice + assert_equal "", location.chop.chop.chop.slice + + # Check that we don't go negative. + 10.times { location = location.chop } + assert_equal "", location.slice + end + def test_heredoc? refute parse_expression("\"foo\"").heredoc? refute parse_expression("\"foo \#{1}\"").heredoc? |