From 21a406e56d564aaf65b017b1d80c477f8cbae238 Mon Sep 17 00:00:00 2001 From: Sijawusz Pur Rahnama Date: Tue, 14 Nov 2023 03:50:58 +0100 Subject: [PATCH] Make `Lint/NotNilAfterNoBang` report calls to `#match` --- spec/ameba/rule/lint/not_nil_after_no_bang_spec.cr | 12 ++++++++++++ src/ameba/rule/lint/not_nil_after_no_bang.cr | 10 +++++----- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/spec/ameba/rule/lint/not_nil_after_no_bang_spec.cr b/spec/ameba/rule/lint/not_nil_after_no_bang_spec.cr index 89bf97ae..7fe3a1fa 100644 --- a/spec/ameba/rule/lint/not_nil_after_no_bang_spec.cr +++ b/spec/ameba/rule/lint/not_nil_after_no_bang_spec.cr @@ -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! diff --git a/src/ameba/rule/lint/not_nil_after_no_bang.cr b/src/ameba/rule/lint/not_nil_after_no_bang.cr index c215d6da..ff50454d 100644 --- a/src/ameba/rule/lint/not_nil_after_no_bang.cr +++ b/src/ameba/rule/lint/not_nil_after_no_bang.cr @@ -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!`"