Merge pull request #423 from crystal-ameba/lint-not-nil-after-no-bang-reports-match-calls

Make `Lint/NotNilAfterNoBang` report calls to `#match`
This commit is contained in:
Sijawusz Pur Rahnama 2023-11-14 10:25:44 +01:00 committed by GitHub
commit 52a3e47a3b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 17 additions and 5 deletions

View File

@ -11,6 +11,7 @@ module Ameba::Rule::Lint
(1..3).index { |i| i > 2 }.not_nil!(:foo)
(1..3).rindex { |i| i > 2 }.not_nil!(:foo)
(1..3).find { |i| i > 2 }.not_nil!(:foo)
/(.)(.)(.)/.match("abc", &.itself).not_nil!
CRYSTAL
end
@ -36,6 +37,17 @@ module Ameba::Rule::Lint
CRYSTAL
end
it "reports if there is an `match` call followed by `not_nil!`" do
source = expect_issue subject, <<-CRYSTAL
/(.)(.)(.)/.match("abc").not_nil![2]
# ^^^^^^^^^^^^^^^^^^^^^ error: Use `match! {...}` instead of `match {...}.not_nil!`
CRYSTAL
expect_correction source, <<-CRYSTAL
/(.)(.)(.)/.match!("abc")[2]
CRYSTAL
end
it "reports if there is an `index` call with block followed by `not_nil!`" do
source = expect_issue subject, <<-CRYSTAL
(1..3).index { |i| i > 2 }.not_nil!

View File

@ -1,17 +1,17 @@
module Ameba::Rule::Lint
# This rule is used to identify usage of `index/rindex/find` calls
# This rule is used to identify usage of `index/rindex/find/match` calls
# followed by a call to `not_nil!`.
#
# For example, this is considered a code smell:
#
# ```
# %w[Alice Bob].find(&.match(/^A./)).not_nil!
# %w[Alice Bob].find(&.chars.any?(&.in?('o', 'b'))).not_nil!
# ```
#
# And can be written as this:
#
# ```
# %w[Alice Bob].find!(&.match(/^A./))
# %w[Alice Bob].find!(&.chars.any?(&.in?('o', 'b')))
# ```
#
# YAML configuration example:
@ -24,11 +24,11 @@ module Ameba::Rule::Lint
include AST::Util
properties do
description "Identifies usage of `index/rindex/find` calls followed by `not_nil!`"
description "Identifies usage of `index/rindex/find/match` calls followed by `not_nil!`"
end
BLOCK_CALL_NAMES = %w(index rindex find)
CALL_NAMES = %w(index rindex)
CALL_NAMES = %w(index rindex match)
MSG = "Use `%s! {...}` instead of `%s {...}.not_nil!`"