Skip to content

Commit aee4b24

Browse files
committed
[ruby/error_highlight] Show no message when failing to get caller/callee snippets
Even with Ruby 4.0, snippets is not always available, such as in irb by default. It would be better to just say nothing than to show a confusing message. ruby/error_highlight@ef80ce73a1
1 parent c99670d commit aee4b24

File tree

2 files changed

+53
-91
lines changed

2 files changed

+53
-91
lines changed

lib/error_highlight/core_ext.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ module CoreExt
2424
_, _, snippet, highlight = ErrorHighlight.formatter.message_for(spot).lines
2525
out += "\n | #{ snippet } #{ highlight }"
2626
else
27-
out += "\n (cannot highlight method definition; try Ruby 4.0 or later)"
27+
# do nothing
2828
end
2929
end
3030
ret << "\n" + out if out

test/error_highlight/test_error_highlight.rb

Lines changed: 52 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -1450,26 +1450,28 @@ def exc.backtrace_locations = []
14501450
RubyVM::AbstractSyntaxTree.node_id_for_backtrace_location(exc.backtrace_locations.first)
14511451
end
14521452

1453-
WRONG_NUMBER_OF_ARGUMENTS_LIENO = __LINE__ + 1
1453+
def process_callee_snippet(str)
1454+
return str if MethodDefLocationSupported
1455+
1456+
str.sub(/\n +\|.*\n +\^+\n\z/, "")
1457+
end
1458+
1459+
WRONG_NUMBER_OF_ARGUMENTS_LINENO = __LINE__ + 1
14541460
def wrong_number_of_arguments_test(x, y)
14551461
x + y
14561462
end
14571463

14581464
def test_wrong_number_of_arguments_for_method
14591465
lineno = __LINE__
1460-
assert_error_message(ArgumentError, <<~END) do
1466+
assert_error_message(ArgumentError, process_callee_snippet(<<~END)) do
14611467
wrong number of arguments (given 1, expected 2) (ArgumentError)
14621468
1463-
caller: #{ __FILE__ }:#{ lineno + 16 }
1469+
caller: #{ __FILE__ }:#{ lineno + 12 }
14641470
| wrong_number_of_arguments_test(1)
14651471
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1466-
callee: #{ __FILE__ }:#{ WRONG_NUMBER_OF_ARGUMENTS_LIENO }
1467-
#{
1468-
MethodDefLocationSupported ?
1469-
"| def wrong_number_of_arguments_test(x, y)
1470-
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" :
1471-
"(cannot highlight method definition; try Ruby 4.0 or later)"
1472-
}
1472+
callee: #{ __FILE__ }:#{ WRONG_NUMBER_OF_ARGUMENTS_LINENO }
1473+
| def wrong_number_of_arguments_test(x, y)
1474+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
14731475
END
14741476

14751477
wrong_number_of_arguments_test(1)
@@ -1483,19 +1485,15 @@ def keyword_test(kw1:, kw2:, kw3:)
14831485

14841486
def test_missing_keyword
14851487
lineno = __LINE__
1486-
assert_error_message(ArgumentError, <<~END) do
1488+
assert_error_message(ArgumentError, process_callee_snippet(<<~END)) do
14871489
missing keyword: :kw3 (ArgumentError)
14881490
1489-
caller: #{ __FILE__ }:#{ lineno + 16 }
1491+
caller: #{ __FILE__ }:#{ lineno + 12 }
14901492
| keyword_test(kw1: 1, kw2: 2)
14911493
^^^^^^^^^^^^
14921494
callee: #{ __FILE__ }:#{ KEYWORD_TEST_LINENO }
1493-
#{
1494-
MethodDefLocationSupported ?
1495-
"| def keyword_test(kw1:, kw2:, kw3:)
1496-
^^^^^^^^^^^^" :
1497-
"(cannot highlight method definition; try Ruby 4.0 or later)"
1498-
}
1495+
| def keyword_test(kw1:, kw2:, kw3:)
1496+
^^^^^^^^^^^^
14991497
END
15001498

15011499
keyword_test(kw1: 1, kw2: 2)
@@ -1504,19 +1502,15 @@ def test_missing_keyword
15041502

15051503
def test_missing_keywords # multiple missing keywords
15061504
lineno = __LINE__
1507-
assert_error_message(ArgumentError, <<~END) do
1505+
assert_error_message(ArgumentError, process_callee_snippet(<<~END)) do
15081506
missing keywords: :kw2, :kw3 (ArgumentError)
15091507
1510-
caller: #{ __FILE__ }:#{ lineno + 16 }
1508+
caller: #{ __FILE__ }:#{ lineno + 12 }
15111509
| keyword_test(kw1: 1)
15121510
^^^^^^^^^^^^
15131511
callee: #{ __FILE__ }:#{ KEYWORD_TEST_LINENO }
1514-
#{
1515-
MethodDefLocationSupported ?
1516-
"| def keyword_test(kw1:, kw2:, kw3:)
1517-
^^^^^^^^^^^^" :
1518-
"(cannot highlight method definition; try Ruby 4.0 or later)"
1519-
}
1512+
| def keyword_test(kw1:, kw2:, kw3:)
1513+
^^^^^^^^^^^^
15201514
END
15211515

15221516
keyword_test(kw1: 1)
@@ -1525,19 +1519,15 @@ def test_missing_keywords # multiple missing keywords
15251519

15261520
def test_unknown_keyword
15271521
lineno = __LINE__
1528-
assert_error_message(ArgumentError, <<~END) do
1522+
assert_error_message(ArgumentError, process_callee_snippet(<<~END)) do
15291523
unknown keyword: :kw4 (ArgumentError)
15301524
1531-
caller: #{ __FILE__ }:#{ lineno + 16 }
1525+
caller: #{ __FILE__ }:#{ lineno + 12 }
15321526
| keyword_test(kw1: 1, kw2: 2, kw3: 3, kw4: 4)
15331527
^^^^^^^^^^^^
15341528
callee: #{ __FILE__ }:#{ KEYWORD_TEST_LINENO }
1535-
#{
1536-
MethodDefLocationSupported ?
1537-
"| def keyword_test(kw1:, kw2:, kw3:)
1538-
^^^^^^^^^^^^" :
1539-
"(cannot highlight method definition; try Ruby 4.0 or later)"
1540-
}
1529+
| def keyword_test(kw1:, kw2:, kw3:)
1530+
^^^^^^^^^^^^
15411531
END
15421532

15431533
keyword_test(kw1: 1, kw2: 2, kw3: 3, kw4: 4)
@@ -1546,19 +1536,15 @@ def test_unknown_keyword
15461536

15471537
def test_unknown_keywords
15481538
lineno = __LINE__
1549-
assert_error_message(ArgumentError, <<~END) do
1539+
assert_error_message(ArgumentError, process_callee_snippet(<<~END)) do
15501540
unknown keywords: :kw4, :kw5 (ArgumentError)
15511541
1552-
caller: #{ __FILE__ }:#{ lineno + 16 }
1542+
caller: #{ __FILE__ }:#{ lineno + 12 }
15531543
| keyword_test(kw1: 1, kw2: 2, kw3: 3, kw4: 4, kw5: 5)
15541544
^^^^^^^^^^^^
15551545
callee: #{ __FILE__ }:#{ KEYWORD_TEST_LINENO }
1556-
#{
1557-
MethodDefLocationSupported ?
1558-
"| def keyword_test(kw1:, kw2:, kw3:)
1559-
^^^^^^^^^^^^" :
1560-
"(cannot highlight method definition; try Ruby 4.0 or later)"
1561-
}
1546+
| def keyword_test(kw1:, kw2:, kw3:)
1547+
^^^^^^^^^^^^
15621548
END
15631549

15641550
keyword_test(kw1: 1, kw2: 2, kw3: 3, kw4: 4, kw5: 5)
@@ -1576,19 +1562,15 @@ def wrong_number_of_arguments_test2(
15761562

15771563
def test_wrong_number_of_arguments_for_method2
15781564
lineno = __LINE__
1579-
assert_error_message(ArgumentError, <<~END) do
1565+
assert_error_message(ArgumentError, process_callee_snippet(<<~END)) do
15801566
wrong number of arguments (given 1, expected 3) (ArgumentError)
15811567
1582-
caller: #{ __FILE__ }:#{ lineno + 16 }
1568+
caller: #{ __FILE__ }:#{ lineno + 12 }
15831569
| wrong_number_of_arguments_test2(1)
15841570
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
15851571
callee: #{ __FILE__ }:#{ WRONG_NUBMER_OF_ARGUMENTS_TEST2_LINENO }
1586-
#{
1587-
MethodDefLocationSupported ?
1588-
"| def wrong_number_of_arguments_test2(
1589-
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" :
1590-
"(cannot highlight method definition; try Ruby 4.0 or later)"
1591-
}
1572+
| def wrong_number_of_arguments_test2(
1573+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
15921574
END
15931575

15941576
wrong_number_of_arguments_test2(1)
@@ -1598,19 +1580,15 @@ def test_wrong_number_of_arguments_for_method2
15981580
def test_wrong_number_of_arguments_for_lambda_literal
15991581
v = -> {}
16001582
lineno = __LINE__
1601-
assert_error_message(ArgumentError, <<~END) do
1583+
assert_error_message(ArgumentError, process_callee_snippet(<<~END)) do
16021584
wrong number of arguments (given 1, expected 0) (ArgumentError)
16031585
1604-
caller: #{ __FILE__ }:#{ lineno + 16 }
1586+
caller: #{ __FILE__ }:#{ lineno + 12 }
16051587
| v.call(1)
16061588
^^^^^
16071589
callee: #{ __FILE__ }:#{ lineno - 1 }
1608-
#{
1609-
MethodDefLocationSupported ?
1610-
"| v = -> {}
1611-
^^" :
1612-
"(cannot highlight method definition; try Ruby 4.0 or later)"
1613-
}
1590+
| v = -> {}
1591+
^^
16141592
END
16151593

16161594
v.call(1)
@@ -1620,19 +1598,15 @@ def test_wrong_number_of_arguments_for_lambda_literal
16201598
def test_wrong_number_of_arguments_for_lambda_method
16211599
v = lambda { }
16221600
lineno = __LINE__
1623-
assert_error_message(ArgumentError, <<~END) do
1601+
assert_error_message(ArgumentError, process_callee_snippet(<<~END)) do
16241602
wrong number of arguments (given 1, expected 0) (ArgumentError)
16251603
1626-
caller: #{ __FILE__ }:#{ lineno + 16 }
1604+
caller: #{ __FILE__ }:#{ lineno + 12 }
16271605
| v.call(1)
16281606
^^^^^
16291607
callee: #{ __FILE__ }:#{ lineno - 1 }
1630-
#{
1631-
MethodDefLocationSupported ?
1632-
"| v = lambda { }
1633-
^" :
1634-
"(cannot highlight method definition; try Ruby 4.0 or later)"
1635-
}
1608+
| v = lambda { }
1609+
^
16361610
END
16371611

16381612
v.call(1)
@@ -1646,19 +1620,15 @@ def test_wrong_number_of_arguments_for_lambda_method
16461620

16471621
def test_wrong_number_of_arguments_for_define_method
16481622
lineno = __LINE__
1649-
assert_error_message(ArgumentError, <<~END) do
1623+
assert_error_message(ArgumentError, process_callee_snippet(<<~END)) do
16501624
wrong number of arguments (given 1, expected 2) (ArgumentError)
16511625
1652-
caller: #{ __FILE__ }:#{ lineno + 16 }
1626+
caller: #{ __FILE__ }:#{ lineno + 12 }
16531627
| define_method_test(1)
16541628
^^^^^^^^^^^^^^^^^^
16551629
callee: #{ __FILE__ }:#{ DEFINE_METHOD_TEST_LINENO }
1656-
#{
1657-
MethodDefLocationSupported ?
1658-
"| define_method :define_method_test do |x, y|
1659-
^^" :
1660-
"(cannot highlight method definition; try Ruby 4.0 or later)"
1661-
}
1630+
| define_method :define_method_test do |x, y|
1631+
^^
16621632
END
16631633

16641634
define_method_test(1)
@@ -1742,19 +1712,15 @@ def self . baz(x:)
17421712

17431713
def test_singleton_method_with_spacing_missing_keyword
17441714
lineno = __LINE__
1745-
assert_error_message(ArgumentError, <<~END) do
1715+
assert_error_message(ArgumentError, process_callee_snippet(<<~END)) do
17461716
missing keyword: :x (ArgumentError)
17471717
1748-
caller: #{ __FILE__ }:#{ lineno + 16 }
1718+
caller: #{ __FILE__ }:#{ lineno + 12 }
17491719
| SingletonMethodWithSpacing.baz
17501720
^^^^
17511721
callee: #{ __FILE__ }:#{ SingletonMethodWithSpacing::LINENO }
1752-
#{
1753-
MethodDefLocationSupported ?
1754-
"| def self . baz(x:)
1755-
^^^^^" :
1756-
"(cannot highlight method definition; try Ruby 4.0 or later)"
1757-
}
1722+
| def self . baz(x:)
1723+
^^^^^
17581724
END
17591725

17601726
SingletonMethodWithSpacing.baz
@@ -1770,19 +1736,15 @@ def self.run(shop_id:, param1:)
17701736

17711737
def test_singleton_method_multiple_missing_keywords
17721738
lineno = __LINE__
1773-
assert_error_message(ArgumentError, <<~END) do
1739+
assert_error_message(ArgumentError, process_callee_snippet(<<~END)) do
17741740
missing keywords: :shop_id, :param1 (ArgumentError)
17751741
1776-
caller: #{ __FILE__ }:#{ lineno + 16 }
1742+
caller: #{ __FILE__ }:#{ lineno + 12 }
17771743
| SingletonMethodMultipleKwargs.run
17781744
^^^^
17791745
callee: #{ __FILE__ }:#{ SingletonMethodMultipleKwargs::LINENO }
1780-
#{
1781-
MethodDefLocationSupported ?
1782-
"| def self.run(shop_id:, param1:)
1783-
^^^^" :
1784-
"(cannot highlight method definition; try Ruby 4.0 or later)"
1785-
}
1746+
| def self.run(shop_id:, param1:)
1747+
^^^^
17861748
END
17871749

17881750
SingletonMethodMultipleKwargs.run

0 commit comments

Comments
 (0)