mirror of
https://gitea.invidious.io/iv-org/shard-ameba.git
synced 2024-08-15 00:53:29 +00:00
RedundantNext params
This commit is contained in:
parent
eb104a04f7
commit
0002c36fae
2 changed files with 103 additions and 14 deletions
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue