From 429f76f8b6b3c88618c6e0bac797f8cebba3adcc Mon Sep 17 00:00:00 2001 From: Vitalii Elenhaupt Date: Wed, 10 Nov 2021 09:11:45 +0200 Subject: [PATCH] Do not report unreachable code after loops closes #251 --- spec/ameba/ast/flow_expression_spec.cr | 16 ++++++++++++++++ spec/ameba/rule/lint/unreachable_code_spec.cr | 14 ++++---------- src/ameba/ast/flow_expression.cr | 2 +- 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/spec/ameba/ast/flow_expression_spec.cr b/spec/ameba/ast/flow_expression_spec.cr index a71e251f..d2d697ed 100644 --- a/spec/ameba/ast/flow_expression_spec.cr +++ b/spec/ameba/ast/flow_expression_spec.cr @@ -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 diff --git a/spec/ameba/rule/lint/unreachable_code_spec.cr b/spec/ameba/rule/lint/unreachable_code_spec.cr index 5e50d05f..15aa93ac 100644 --- a/spec/ameba/rule/lint/unreachable_code_spec.cr +++ b/spec/ameba/rule/lint/unreachable_code_spec.cr @@ -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 diff --git a/src/ameba/ast/flow_expression.cr b/src/ameba/ast/flow_expression.cr index 8c80eb53..e20edc94 100644 --- a/src/ameba/ast/flow_expression.cr +++ b/src/ameba/ast/flow_expression.cr @@ -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?)