diff --git a/spec/ameba/rule/lint/literal_in_condition_spec.cr b/spec/ameba/rule/lint/literal_in_condition_spec.cr index 67d338885..1388d960f 100644 --- a/spec/ameba/rule/lint/literal_in_condition_spec.cr +++ b/spec/ameba/rule/lint/literal_in_condition_spec.cr @@ -60,6 +60,42 @@ module Ameba::Rule::Lint subject.catch(s).should_not be_valid end + it "fails if there is a predicate in `while` conditional" do + s = Source.new %( + while 1 + :ok + end + ) + subject.catch(s).should_not be_valid + end + + it "fails if there is a `false` predicate in `while` conditional" do + s = Source.new %( + while false + :ok + end + ) + subject.catch(s).should_not be_valid + end + + it "passes if there is a `true` predicate in `while` conditional" do + s = Source.new %( + while true + :ok + end + ) + subject.catch(s).should be_valid + end + + it "fails if there is a predicate in `until` conditional" do + s = Source.new %( + until true + :foo + end + ) + subject.catch(s).should_not be_valid + end + describe "range" do it "reports range with literals" do s = Source.new %( diff --git a/src/ameba/rule/lint/literal_in_condition.cr b/src/ameba/rule/lint/literal_in_condition.cr index 150b549ce..80c55abf0 100644 --- a/src/ameba/rule/lint/literal_in_condition.cr +++ b/src/ameba/rule/lint/literal_in_condition.cr @@ -31,7 +31,7 @@ module Ameba::Rule::Lint MSG = "Literal value found in conditional" - def test(source, node : Crystal::If | Crystal::Unless) + def test(source, node : Crystal::If | Crystal::Unless | Crystal::Until) issue_for node.cond, MSG if literal?(node.cond) end @@ -41,5 +41,13 @@ module Ameba::Rule::Lint issue_for cond, MSG end + + def test(source, node : Crystal::While) + return unless literal?(cond = node.cond) + # allow `while true` + return if cond.is_a?(Crystal::BoolLiteral) && cond.value + + issue_for cond, MSG + end end end