summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin Newton <kddnewton@gmail.com>2024-04-11 14:37:11 -0400
committergit <svn-admin@ruby-lang.org>2024-04-11 18:53:30 +0000
commitcd516ebd20a8d2c7b0f912e4d5750f84616463a5 (patch)
treeed677fdbc2de6d64f847ef9768b9281d1cb97cba
parent58f93eec188df0a77b61b4781a7baf7b2c608097 (diff)
[ruby/prism] Add Location#chop
https://github.com/ruby/prism/commit/5dd57f4b84
-rw-r--r--lib/prism/desugar_compiler.rb6
-rw-r--r--lib/prism/parse_result.rb5
-rw-r--r--test/prism/ruby_api_test.rb11
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?