diff --git a/changelog/change_upgrade_regexp_parser_to_20.md b/changelog/change_upgrade_regexp_parser_to_20.md new file mode 100644 index 00000000000..feda3fde7fe --- /dev/null +++ b/changelog/change_upgrade_regexp_parser_to_20.md @@ -0,0 +1 @@ +* [#9102](https://github.com/rubocop-hq/rubocop/pull/9102): Upgrade regexp_parser to 2.0. ([@knu][]) diff --git a/lib/rubocop/cop/style/redundant_regexp_escape.rb b/lib/rubocop/cop/style/redundant_regexp_escape.rb index cabdd14a407..4f13913d6ca 100644 --- a/lib/rubocop/cop/style/redundant_regexp_escape.rb +++ b/lib/rubocop/cop/style/redundant_regexp_escape.rb @@ -82,7 +82,7 @@ def delimiter?(node, char) def each_escape(node) node.parsed_tree&.traverse&.reduce(0) do |char_class_depth, (event, expr)| - yield(expr.text[1], expr.start_index, !char_class_depth.zero?) if expr.type == :escape + yield(expr.text[1], expr.ts, !char_class_depth.zero?) if expr.type == :escape if expr.type == :set char_class_depth + (event == :enter ? 1 : -1) diff --git a/lib/rubocop/ext/regexp_node.rb b/lib/rubocop/ext/regexp_node.rb index 9a2591c0aaf..adbf67437f5 100644 --- a/lib/rubocop/ext/regexp_node.rb +++ b/lib/rubocop/ext/regexp_node.rb @@ -19,18 +19,13 @@ def assign_properties(*) super str = with_interpolations_blanked - begin - @parsed_tree = Regexp::Parser.parse(str, options: options) + @parsed_tree = begin + Regexp::Parser.parse(str, options: options) rescue StandardError - @parsed_tree = nil - else - origin = loc.begin.end - source = @parsed_tree.to_s - @parsed_tree.each_expression(true) do |e| - e.origin = origin - e.source = source - end + nil end + origin = loc.begin.end + @parsed_tree&.each_expression(true) { |e| e.origin = origin } end def each_capture(named: ANY) diff --git a/lib/rubocop/ext/regexp_parser.rb b/lib/rubocop/ext/regexp_parser.rb index 91e8fefe2c0..87df5f1832c 100644 --- a/lib/rubocop/ext/regexp_parser.rb +++ b/lib/rubocop/ext/regexp_parser.rb @@ -20,18 +20,11 @@ def initialize(expression, body:, quantifier: nil, begin_l: nil, end_l: nil) module Expression # Add `expression` and `loc` to all `regexp_parser` nodes module Base - attr_accessor :origin, :source - - def start_index - # ts is a byte index; convert it to a character index - @start_index ||= source.byteslice(0, ts).length - end + attr_accessor :origin # Shortcut to `loc.expression` def expression - @expression ||= begin - origin.adjust(begin_pos: start_index, end_pos: start_index + full_length) - end + @expression ||= origin.adjust(begin_pos: ts, end_pos: ts + full_length) end # @returns a location map like `parser` does, with: diff --git a/rubocop.gemspec b/rubocop.gemspec index 67581939867..114bf03e44a 100644 --- a/rubocop.gemspec +++ b/rubocop.gemspec @@ -33,7 +33,7 @@ Gem::Specification.new do |s| s.add_runtime_dependency('parallel', '~> 1.10') s.add_runtime_dependency('parser', '>= 2.7.1.5') s.add_runtime_dependency('rainbow', '>= 2.2.2', '< 4.0') - s.add_runtime_dependency('regexp_parser', '>= 1.8') + s.add_runtime_dependency('regexp_parser', '>= 2.0') s.add_runtime_dependency('rexml') s.add_runtime_dependency('rubocop-ast', '>= 1.1.1') s.add_runtime_dependency('ruby-progressbar', '~> 1.7')