mirror of
https://gitea.invidious.io/iv-org/shard-ameba.git
synced 2024-08-15 00:53:29 +00:00
Add Lint/LiteralAssignmentsInExpressions
rule
This commit is contained in:
parent
28e2871165
commit
5c08b64e72
2 changed files with 90 additions and 0 deletions
|
@ -0,0 +1,47 @@
|
|||
require "../../../spec_helper"
|
||||
|
||||
LITERAL_SAMPLES = {
|
||||
nil, true, 42, 4.2, 'c', "foo", :foo, /foo/,
|
||||
0..42, [1, 2, 3], {1, 2, 3},
|
||||
{foo: :bar}, {:foo => :bar},
|
||||
}
|
||||
|
||||
module Ameba::Rule::Lint
|
||||
subject = LiteralAssignmentsInExpressions.new
|
||||
|
||||
describe LiteralAssignmentsInExpressions do
|
||||
it "passes if the assignment value is not a literal" do
|
||||
expect_no_issues subject, <<-CRYSTAL
|
||||
if a = b
|
||||
:ok
|
||||
end
|
||||
|
||||
unless a = b.presence
|
||||
:ok
|
||||
end
|
||||
|
||||
:ok if a = b
|
||||
:ok unless a = b
|
||||
|
||||
case {a, b}
|
||||
when {0, 1} then :gt
|
||||
when {1, 0} then :lt
|
||||
end
|
||||
CRYSTAL
|
||||
end
|
||||
|
||||
{% for literal in LITERAL_SAMPLES %}
|
||||
it %(reports if the assignment value is a {{ literal }} literal) do
|
||||
expect_issue subject, <<-CRYSTAL, literal: {{ literal.stringify }}
|
||||
raise "boo!" if foo = {{ literal }}
|
||||
# ^{literal}^^^^^^ error: Detected assignment with a literal value in control expression
|
||||
CRYSTAL
|
||||
|
||||
expect_issue subject, <<-CRYSTAL, literal: {{ literal.stringify }}
|
||||
raise "boo!" unless foo = {{ literal }}
|
||||
# ^{literal}^^^^^^ error: Detected assignment with a literal value in control expression
|
||||
CRYSTAL
|
||||
end
|
||||
{% end %}
|
||||
end
|
||||
end
|
43
src/ameba/rule/lint/literal_assignments_in_expressions.cr
Normal file
43
src/ameba/rule/lint/literal_assignments_in_expressions.cr
Normal file
|
@ -0,0 +1,43 @@
|
|||
module Ameba::Rule::Lint
|
||||
# A rule that disallows assignments with literal values
|
||||
# in control expressions.
|
||||
#
|
||||
# For example, this is considered invalid:
|
||||
#
|
||||
# ```
|
||||
# if foo = 42
|
||||
# do_something
|
||||
# end
|
||||
# ```
|
||||
#
|
||||
# And most likely should be replaced by the following:
|
||||
#
|
||||
# ```
|
||||
# if foo == 42
|
||||
# do_something
|
||||
# end
|
||||
# ```
|
||||
#
|
||||
# YAML configuration example:
|
||||
#
|
||||
# ```
|
||||
# Lint/LiteralAssignmentsInExpressions:
|
||||
# Enabled: true
|
||||
# ```
|
||||
class LiteralAssignmentsInExpressions < Base
|
||||
include AST::Util
|
||||
|
||||
properties do
|
||||
description "Disallows assignments with literal values in control expressions"
|
||||
end
|
||||
|
||||
MSG = "Detected assignment with a literal value in control expression"
|
||||
|
||||
def test(source, node : Crystal::If | Crystal::Unless | Crystal::Case | Crystal::While | Crystal::Until)
|
||||
return unless (cond = node.cond).is_a?(Crystal::Assign)
|
||||
return unless literal?(cond.value, include_paths: true)
|
||||
|
||||
issue_for cond, MSG
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Reference in a new issue