Skip to content

Commit d89bcda

Browse files
committed
Support cases where there are multiple missing / wrong kwargs
This commit fixes the case when there are multiple missing or incorrect keywords provided to a method. Without this fix, ErrorHighlight itself will raise an exception
1 parent 5f97626 commit d89bcda

File tree

2 files changed

+44
-2
lines changed

2 files changed

+44
-2
lines changed

lib/error_highlight/core_ext.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
module ErrorHighlight
44
module CoreExt
55
private def generate_snippet
6-
if ArgumentError === self && message =~ /\A(?:wrong number of arguments|missing keyword|unknown keyword|no keywords accepted)\b/
6+
if ArgumentError === self && message =~ /\A(?:wrong number of arguments|missing keyword[s]?|unknown keyword[s]?|no keywords accepted)\b/
77
locs = self.backtrace_locations
88
return "" if locs.size < 2
99
callee_loc, caller_loc = locs

test/test_error_highlight.rb

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ def preprocess(msg)
4444
def assert_error_message(klass, expected_msg, &blk)
4545
omit unless klass < ErrorHighlight::CoreExt
4646
err = assert_raise(klass, &blk)
47-
unless klass == ArgumentError && err.message =~ /\A(?:wrong number of arguments|missing keyword|unknown keyword|no keywords accepted)\b/
47+
unless klass == ArgumentError && err.message =~ /\A(?:wrong number of arguments|missing keyword[s]?|unknown keyword[s]?|no keywords accepted)\b/
4848
spot = ErrorHighlight.spot(err)
4949
if spot
5050
assert_kind_of(Integer, spot[:first_lineno])
@@ -1502,6 +1502,27 @@ def test_missing_keyword
15021502
end
15031503
end
15041504

1505+
def test_missing_keywords # multiple missing keywords
1506+
lineno = __LINE__
1507+
assert_error_message(ArgumentError, <<~END) do
1508+
missing keywords: :kw2, :kw3 (ArgumentError)
1509+
1510+
caller: #{ __FILE__ }:#{ lineno + 16 }
1511+
| keyword_test(kw1: 1)
1512+
^^^^^^^^^^^^
1513+
callee: #{ __FILE__ }:#{ KEYWORD_TEST_LINENO }
1514+
#{
1515+
MethodDefLocationSupported ?
1516+
"| def keyword_test(kw1:, kw2:, kw3:)
1517+
^^^^^^^^^^^^" :
1518+
"(cannot highlight method definition; try Ruby 3.5 or later)"
1519+
}
1520+
END
1521+
1522+
keyword_test(kw1: 1)
1523+
end
1524+
end
1525+
15051526
def test_unknown_keyword
15061527
lineno = __LINE__
15071528
assert_error_message(ArgumentError, <<~END) do
@@ -1523,6 +1544,27 @@ def test_unknown_keyword
15231544
end
15241545
end
15251546

1547+
def test_unknown_keywords
1548+
lineno = __LINE__
1549+
assert_error_message(ArgumentError, <<~END) do
1550+
unknown keywords: :kw4, :kw5 (ArgumentError)
1551+
1552+
caller: #{ __FILE__ }:#{ lineno + 16 }
1553+
| keyword_test(kw1: 1, kw2: 2, kw3: 3, kw4: 4, kw5: 5)
1554+
^^^^^^^^^^^^
1555+
callee: #{ __FILE__ }:#{ KEYWORD_TEST_LINENO }
1556+
#{
1557+
MethodDefLocationSupported ?
1558+
"| def keyword_test(kw1:, kw2:, kw3:)
1559+
^^^^^^^^^^^^" :
1560+
"(cannot highlight method definition; try Ruby 3.5 or later)"
1561+
}
1562+
END
1563+
1564+
keyword_test(kw1: 1, kw2: 2, kw3: 3, kw4: 4, kw5: 5)
1565+
end
1566+
end
1567+
15261568
WRONG_NUBMER_OF_ARGUMENTS_TEST2_LINENO = __LINE__ + 1
15271569
def wrong_number_of_arguments_test2(
15281570
long_argument_name_x,

0 commit comments

Comments
 (0)