Do not report unreachable code after loops

closes #251
This commit is contained in:
Vitalii Elenhaupt 2021-11-10 09:11:45 +02:00
parent d843afd962
commit 429f76f8b6
No known key found for this signature in database
GPG key ID: CD0BF17825928BC0
3 changed files with 21 additions and 11 deletions

View file

@ -39,6 +39,22 @@ module Ameba::AST
flow_expression.unreachable_nodes.should eq nodes.assign_nodes
end
it "returns nil if there is no unreachable node after loop" do
nodes = as_nodes %(
def run
idx = items.size - 1
while 0 <= idx
return
end
puts "foo"
end
)
node = nodes.expressions_nodes.first
flow_expression = FlowExpression.new node, false
flow_expression.unreachable_nodes.empty?.should eq true
end
it "returns nil if there is no unreachable node" do
nodes = as_nodes %(
def foobar

View file

@ -420,7 +420,7 @@ module Ameba::Rule::Lint
end
context "while/until" do
it "reports if there is unreachable code after while" do
it "does not report if there is no unreachable code after while" do
s = Source.new %(
def method
while something
@ -434,13 +434,10 @@ module Ameba::Rule::Lint
end
)
subject.catch(s).should_not be_valid
issue = s.issues.first
issue.location.to_s.should eq ":9:3"
subject.catch(s).should be_valid
end
it "reports if there is unreachable code after until" do
it "does not report if there is no unreachable code after until" do
s = Source.new %(
def method
until something
@ -454,10 +451,7 @@ module Ameba::Rule::Lint
end
)
subject.catch(s).should_not be_valid
issue = s.issues.first
issue.location.to_s.should eq ":9:3"
subject.catch(s).should be_valid
end
it "doesn't report if there is reachable code after while with break" do

View file

@ -55,7 +55,7 @@ module Ameba::AST
control_flow_found = false
current_node.expressions.each do |exp|
unreachable_nodes << exp if control_flow_found
control_flow_found ||= flow_expression?(exp, in_loop?)
control_flow_found ||= !loop?(exp) && flow_expression?(exp, in_loop?)
end
when Crystal::BinaryOp
unreachable_nodes << current_node.right if flow_expression?(current_node.left, in_loop?)