RedundantNext params

This commit is contained in:
Vitalii Elenhaupt 2020-03-24 18:27:49 +02:00
parent eb104a04f7
commit 0002c36fae
No known key found for this signature in database
GPG key ID: CD0BF17825928BC0
2 changed files with 103 additions and 14 deletions

View file

@ -11,16 +11,6 @@ module Ameba::Rule::Style
subject.catch(s).should be_valid subject.catch(s).should be_valid
end end
it "reports if there is redundant next in the block" do
s = Source.new %(
block do |v|
p v + 1
next
end
)
subject.catch(s).should_not be_valid
end
it "reports if there is redundant next with argument in the block" do it "reports if there is redundant next with argument in the block" do
s = Source.new %( s = Source.new %(
block do |v| block do |v|
@ -99,7 +89,7 @@ module Ameba::Rule::Style
s = Source.new %( s = Source.new %(
block do |a| block do |a|
a = 1 a = 1
next next a
end end
) )
subject.catch(s).should_not be_valid subject.catch(s).should_not be_valid
@ -121,7 +111,7 @@ module Ameba::Rule::Style
it "reports if there is redundant next in binary op" do it "reports if there is redundant next in binary op" do
s = Source.new %( s = Source.new %(
block do |a| block do |a|
a && next a && next a
end end
) )
subject.catch(s).should_not be_valid subject.catch(s).should_not be_valid
@ -136,7 +126,7 @@ module Ameba::Rule::Style
block do |v| block do |v|
v + 1 v + 1
rescue e rescue e
next if v > 0 next v if v > 0
end end
) )
subject.catch(s).should be_valid subject.catch(s).should be_valid
@ -150,7 +140,7 @@ module Ameba::Rule::Style
next a + 2 next a + 2
rescue Exception rescue Exception
a + 2 a + 2
next next a
end end
) )
subject.catch(s).should_not be_valid subject.catch(s).should_not be_valid
@ -175,5 +165,55 @@ module Ameba::Rule::Style
issue.end_location.to_s.should eq "source.cr:2:12" issue.end_location.to_s.should eq "source.cr:2:12"
issue.message.should eq "Redundant `next` detected" issue.message.should eq "Redundant `next` detected"
end end
context "properties" do
context "#allow_multi_next=" do
it "allows multi next statements by default" do
s = Source.new %(
block do |a, b|
next a, b
end
)
subject.catch(s).should be_valid
end
it "allows to configure multi next statements" do
s = Source.new %(
block do |a, b|
next a, b
end
)
rule = Rule::Style::RedundantNext.new
rule.allow_multi_next = false
rule.catch(s).should_not be_valid
s.issues.size.should eq 1
s.issues.first.location.to_s.should eq ":2:3"
end
end
context "#allow_empty_next" do
it "allows empty next statements by default" do
s = Source.new %(
block do
next
end
)
subject.catch(s).should be_valid
end
it "allows to configure empty next statements" do
s = Source.new %(
block do
next
end
)
rule = Rule::Style::RedundantNext.new
rule.allow_empty_next = false
rule.catch(s).should_not be_valid
s.issues.size.should eq 1
s.issues.first.location.to_s.should eq ":2:3"
end
end
end
end end
end end

View file

@ -46,15 +46,61 @@ module Ameba::Rule::Style
# end # end
# ``` # ```
# #
# ### Configuration params
#
# 1. *allow_multi_next*, default: true
#
# Allows end-user to configure whether to report or not the next statements
# which yield tuple literals i.e.
#
# ```
# block do
# next a, b
# end
# ```
#
# If this param equals to `false`, the block above will be forced to be written as:
#
# ```
# block do
# {a, b}
# end
# ```
#
# 2. *allow_empty_next*, default: true
#
# Allows end-user to configure whether to report or not the next statements
# without arguments. Sometimes such statements are used to yild the `nil` value explicitly.
#
# ```
# block do
# @foo = :empty
# next
# end
# ```
#
# If this param equals to `false`, the block above will be forced to be written as:
#
# ```
# block do
# @foo = :empty
# nil
# end
# ```
#
# ### YAML config example # ### YAML config example
# #
# ``` # ```
# Style/RedundantNext: # Style/RedundantNext:
# Enabled: true # Enabled: true
# AllowMultiNext: true
# AllowEmptyNext: true
# ``` # ```
struct RedundantNext < Base struct RedundantNext < Base
properties do properties do
description "Reports redundant next expressions" description "Reports redundant next expressions"
allow_multi_next true
allow_empty_next true
end end
MSG = "Redundant `next` detected" MSG = "Redundant `next` detected"
@ -68,6 +114,9 @@ module Ameba::Rule::Style
end end
def test(source, node : Crystal::Next, visitor : AST::RedundantControlExpressionVisitor) def test(source, node : Crystal::Next, visitor : AST::RedundantControlExpressionVisitor)
return if allow_multi_next && node.exp.is_a?(Crystal::TupleLiteral)
return if allow_empty_next && (node.exp.nil? || node.exp.not_nil!.nop?)
source.try &.add_issue self, node, MSG source.try &.add_issue self, node, MSG
end end
end end