From cd516ebd20a8d2c7b0f912e4d5750f84616463a5 Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Thu, 11 Apr 2024 14:37:11 -0400 Subject: [ruby/prism] Add Location#chop https://github.com/ruby/prism/commit/5dd57f4b84 --- lib/prism/desugar_compiler.rb | 6 ++++-- lib/prism/parse_result.rb | 5 +++++ 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 "#" 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? -- cgit v1.2.3