[前][次][番号順一覧][スレッド一覧]

ruby-changes:67011

From: Masataka <ko1@a...>
Date: Sat, 31 Jul 2021 22:15:28 +0900 (JST)
Subject: [ruby-changes:67011] 242f024bcb (master): [ruby/error_highlight] Keep it work if paren exists after receiver

https://git.ruby-lang.org/ruby.git/commit/?id=242f024bcb

From 242f024bcbff6c46edd84a03365fa99ebd8eb524 Mon Sep 17 00:00:00 2001
From: Masataka Pocke Kuwabara <kuwabara@p...>
Date: Thu, 8 Jul 2021 20:13:42 +0900
Subject: [ruby/error_highlight] Keep it work if paren exists after receiver

https://github.com/ruby/error_highlight/commit/b79d679bbd
---
 lib/error_highlight/base.rb                  |  20 ++--
 test/error_highlight/test_error_highlight.rb | 162 ++++++++++++++++++++++++++-
 2 files changed, 171 insertions(+), 11 deletions(-)

diff --git a/lib/error_highlight/base.rb b/lib/error_highlight/base.rb
index 696df76..8392979 100644
--- a/lib/error_highlight/base.rb
+++ b/lib/error_highlight/base.rb
@@ -148,7 +148,7 @@ module ErrorHighlight https://github.com/ruby/ruby/blob/trunk/lib/error_highlight/base.rb#L148
       nd_recv, mid, nd_args = @node.children
       lineno = nd_recv.last_lineno
       lines = @fetch[lineno, @node.last_lineno]
-      if mid == :[] && lines.match(/\G\s*(\[(?:\s*\])?)/, nd_recv.last_column)
+      if mid == :[] && lines.match(/\G[\s)]*(\[(?:\s*\])?)/, nd_recv.last_column)
         @beg_column = $~.begin(1)
         @snippet = lines[/.*\n/]
         @beg_lineno = @end_lineno = lineno
@@ -157,11 +157,11 @@ module ErrorHighlight https://github.com/ruby/ruby/blob/trunk/lib/error_highlight/base.rb#L157
             @end_column = $~.end(0)
           end
         else
-          if lines.match(/\G\s*?\[\s*\]/, nd_recv.last_column)
+          if lines.match(/\G[\s)]*?\[\s*\]/, nd_recv.last_column)
             @end_column = $~.end(0)
           end
         end
-      elsif lines.match(/\G\s*?(\&?\.)(\s*?)(#{ Regexp.quote(mid) }).*\n/, nd_recv.last_column)
+      elsif lines.match(/\G[\s)]*?(\&?\.)(\s*?)(#{ Regexp.quote(mid) }).*\n/, nd_recv.last_column)
         lines = $` + $&
         @beg_column = $~.begin($2.include?("\n") ? 3 : 1)
         @end_column = $~.end(3)
@@ -207,16 +207,16 @@ module ErrorHighlight https://github.com/ruby/ruby/blob/trunk/lib/error_highlight/base.rb#L207
       nd_recv, mid, nd_args = @node.children
       *nd_args, _nd_last_arg, _nil = nd_args.children
       fetch_line(nd_recv.last_lineno)
-      if mid == :[]= && @snippet.match(/\G\s*(\[)/, nd_recv.last_column)
+      if mid == :[]= && @snippet.match(/\G[\s)]*(\[)/, nd_recv.last_column)
         @beg_column = $~.begin(1)
         args_last_column = $~.end(0)
         if nd_args.last && nd_recv.last_lineno == nd_args.last.last_lineno
           args_last_column = nd_args.last.last_column
         end
-        if @snippet.match(/\s*\]\s*=/, args_last_column)
+        if @snippet.match(/[\s)]*\]\s*=/, args_last_column)
           @end_column = $~.end(0)
         end
-      elsif @snippet.match(/\G\s*(\.\s*#{ Regexp.quote(mid.to_s.sub(/=\z/, "")) }\s*=)/, nd_recv.last_column)
+      elsif @snippet.match(/\G[\s)]*(\.\s*#{ Regexp.quote(mid.to_s.sub(/=\z/, "")) }\s*=)/, nd_recv.last_column)
         @beg_column = $~.begin(1)
         @end_column = $~.end(1)
       end
@@ -232,7 +232,7 @@ module ErrorHighlight https://github.com/ruby/ruby/blob/trunk/lib/error_highlight/base.rb#L232
     def spot_attrasgn_for_args
       nd_recv, mid, nd_args = @node.children
       fetch_line(nd_recv.last_lineno)
-      if mid == :[]= && @snippet.match(/\G\s*\[/, nd_recv.last_column)
+      if mid == :[]= && @snippet.match(/\G[\s)]*\[/, nd_recv.last_column)
         @beg_column = $~.end(0)
         if nd_recv.last_lineno == nd_args.last_lineno
           @end_column = nd_args.last_column
@@ -254,7 +254,7 @@ module ErrorHighlight https://github.com/ruby/ruby/blob/trunk/lib/error_highlight/base.rb#L254
       fetch_line(nd_recv.last_lineno)
       if nd_arg
         # binary operator
-        if @snippet.match(/\G\s*(#{ Regexp.quote(op) })/, nd_recv.last_column)
+        if @snippet.match(/\G[\s)]*(#{ Regexp.quote(op) })/, nd_recv.last_column)
           @beg_column = $~.begin(1)
           @end_column = $~.end(1)
         end
@@ -330,7 +330,7 @@ module ErrorHighlight https://github.com/ruby/ruby/blob/trunk/lib/error_highlight/base.rb#L330
     def spot_op_asgn1_for_name
       nd_recv, op, nd_args, _nd_rhs = @node.children
       fetch_line(nd_recv.last_lineno)
-      if @snippet.match(/\G\s*(\[)/, nd_recv.last_column)
+      if @snippet.match(/\G[\s)]*(\[)/, nd_recv.last_column)
         bracket_beg_column = $~.begin(1)
         args_last_column = $~.end(0)
         if nd_args && nd_recv.last_lineno == nd_args.last_lineno
@@ -377,7 +377,7 @@ module ErrorHighlight https://github.com/ruby/ruby/blob/trunk/lib/error_highlight/base.rb#L377
     def spot_op_asgn2_for_name
       nd_recv, _qcall, attr, op, _nd_rhs = @node.children
       fetch_line(nd_recv.last_lineno)
-      if @snippet.match(/\G\s*(\.)\s*#{ Regexp.quote(attr) }()\s*(#{ Regexp.quote(op) })(=)/, nd_recv.last_column)
+      if @snippet.match(/\G[\s)]*(\.)\s*#{ Regexp.quote(attr) }()\s*(#{ Regexp.quote(op) })(=)/, nd_recv.last_column)
         case @name
         when attr
           @beg_column = $~.begin(1)
diff --git a/test/error_highlight/test_error_highlight.rb b/test/error_highlight/test_error_highlight.rb
index 49bfee8..5d90f75 100644
--- a/test/error_highlight/test_error_highlight.rb
+++ b/test/error_highlight/test_error_highlight.rb
@@ -66,6 +66,18 @@ undefined method `foo' for nil:NilClass https://github.com/ruby/ruby/blob/trunk/test/error_highlight/test_error_highlight.rb#L66
     end
   end
 
+  def test_CALL_noarg_4
+    assert_error_message(NoMethodError, <<~END) do
+undefined method `foo' for nil:NilClass
+
+      (nil).foo + 1
+           ^^^^
+    END
+
+      (nil).foo + 1
+    end
+  end
+
   def test_CALL_arg_1
     assert_error_message(NoMethodError, <<~END) do
 undefined method `foo' for nil:NilClass
@@ -222,6 +234,18 @@ undefined method `[]' for #{ v.inspect } https://github.com/ruby/ruby/blob/trunk/test/error_highlight/test_error_highlight.rb#L234
     end
   end
 
+  def test_CALL_aref_5
+    assert_error_message(NoMethodError, <<~END) do
+undefined method `[]' for nil:NilClass
+
+      (nil)[ ]
+           ^^^
+    END
+
+      (nil)[ ]
+    end
+  end
+
   def test_CALL_aset
     assert_error_message(NoMethodError, <<~END) do
 undefined method `[]=' for nil:NilClass
@@ -313,6 +337,30 @@ undefined method `foo=' for nil:NilClass https://github.com/ruby/ruby/blob/trunk/test/error_highlight/test_error_highlight.rb#L337
     end
   end
 
+  def test_ATTRASGN_4
+    assert_error_message(NoMethodError, <<~END) do
+undefined method `[]=' for nil:NilClass
+
+      (nil)[0] = 42
+           ^^^^^
+    END
+
+      (nil)[0] = 42
+    end
+  end
+
+  def test_ATTRASGN_5
+    assert_error_message(NoMethodError, <<~END) do
+undefined method `foo=' for nil:NilClass
+
+      (nil).foo = 42
+           ^^^^^^
+    END
+
+      (nil).foo = 42
+    end
+  end
+
   def test_OPCALL_binary_1
     assert_error_message(NoMethodError, <<~END) do
 undefined method `+' for nil:NilClass
@@ -338,7 +386,19 @@ undefined method `+' for nil:NilClass https://github.com/ruby/ruby/blob/trunk/test/error_highlight/test_error_highlight.rb#L386
     end
   end
 
-  def test_OPCALL_unary
+  def test_OPCALL_binary_3
+    assert_error_message(NoMethodError, <<~END) do
+undefined method `+' for nil:NilClass
+
+      (nil) + 42
+            ^
+    END
+
+      (nil) + 42
+    end
+  end
+
+  def test_OPCALL_unary_1
     assert_error_message(NoMethodError, <<~END) do
 undefined method `+@' for nil:NilClass
 
@@ -350,6 +410,18 @@ undefined method `+@' for nil:NilClass https://github.com/ruby/ruby/blob/trunk/test/error_highlight/test_error_highlight.rb#L410
     end
   end
 
+  def test_OPCALL_unary_2
+    assert_error_message(NoMethodError, <<~END) do
+undefined method `+@' for nil:NilClass
+
+      +(nil)
+      ^
+    END
+
+      +(nil)
+    end
+  end
+
   def test_FCALL_1
     assert_error_message(NoMethodError, <<~END) do
 undefined method `foo' for nil:NilClass
@@ -429,6 +501,20 @@ undefined method `[]' for nil:NilClass https://github.com/ruby/ruby/blob/trunk/test/error_highlight/test_error_highlight.rb#L501
     end
   end
 
+  def test_OP_ASGN1_aref_4
+    v = nil
+
+    assert_error_message(NoMethodError, <<~END) do
+undefined method `[]' for nil:NilClass
+
+      (v)[0] += 42
+         ^^^
+    END
+
+      (v)[0] += 42
+    end
+  end
+
   def test_OP_ASGN1_op_1
     v = Object.new
     def v.[](x); nil; end
@@ -475,6 +561,21 @@ undefined method `+' for nil:NilClass https://github.com/ruby/ruby/blob/trunk/test/error_highlight/test_error_highlight.rb#L561
     end
   end
 
+  def test_OP_ASGN1_op_4
+    v = Object.new
+    def v.[](x); nil; end
+
+    assert_error_message(NoMethodError, <<~END) do
+undefined method `+' for nil:NilClass
+
+      (v)[0] += 42
+             ^
+    END
+
+      (v)[0] += 42
+    end
+  end
+
   def test_OP_ASGN1_aset_1
     v = Object.new
     def v.[](x); 1; end
@@ -521,6 +622,21 @@ undefined method `[]=' for #{ v.inspect } https://github.com/ruby/ruby/blob/trunk/test/error_highlight/test_error_highlight.rb#L622
     end
   end
 
+  def test_OP_ASGN1_aset_4
+    v = Object.new
+    def v.[](x); 1; end
+
+    assert_error_message(NoMethodError, <<~END) do
+undefined method `[]=' for #{ v.inspect }
+
+      (v)[0] += 42
+         ^^^^^^
+    END
+
+      (v)[0] += 42
+    end
+  end
+
   def test_OP_ASGN2_read_1
     v = nil
 
@@ -550,6 +666,20 @@ undefined method `foo' for nil:NilClass https://github.com/ruby/ruby/blob/trunk/test/error_highlight/test_error_highlight.rb#L666
     end
   end
 
+  def test_OP_ASGN2_read_3
+    v = nil
+
+    assert_error_message(NoMethodError, <<~END) do
+undefined method `foo' for nil:NilClass
+
+      (v).foo += 42
+         ^^^^
+    END
+
+      (v).foo += 42
+    end
+  end
+
   def test_OP_ASGN2_op_1
     v = Object.new
     def v.foo; nil; end
@@ -581,6 +711,21 @@ undefined method `+' for nil:NilClass https://github.com/ruby/ruby/blob/trunk/test/error_highlight/test_error_highlight.rb#L711
     end
   end
 
+  def test_OP_ASGN2_op_3
+    v = Object.new
+    def v.f (... truncated)

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]