mirror of
https://gitea.invidious.io/iv-org/shard-ameba.git
synced 2024-08-15 00:53:29 +00:00
New rule: percent arrays
This commit is contained in:
parent
52411dadc5
commit
791bfdabb8
3 changed files with 140 additions and 0 deletions
|
@ -46,6 +46,12 @@ NegatedConditionsInUnless:
|
|||
# Disallows negated conditions in unless.
|
||||
Enabled: true
|
||||
|
||||
PercentArrays:
|
||||
# Disallows unwanted symbols in percent array literals.
|
||||
Enabled: true
|
||||
StringArrayUnwantedSymbols: ',"'
|
||||
SymbolArrayUnwantedSymbols: ',:'
|
||||
|
||||
PredicateName:
|
||||
# Disallows tautological predicate names, meaning those that start with
|
||||
# the prefix `has_` or the prefix `is_`.
|
||||
|
|
69
spec/ameba/rule/percent_arrays_spec.cr
Normal file
69
spec/ameba/rule/percent_arrays_spec.cr
Normal file
|
@ -0,0 +1,69 @@
|
|||
require "../../spec_helper"
|
||||
|
||||
module Ameba::Rule
|
||||
describe PercentArrays do
|
||||
subject = PercentArrays.new
|
||||
|
||||
it "passes if percent arrays are written correctly" do
|
||||
s = Source.new %q(
|
||||
%i(one two three)
|
||||
%w(one two three)
|
||||
|
||||
%i(1 2 3)
|
||||
%w(1 2 3)
|
||||
|
||||
%i()
|
||||
%w()
|
||||
)
|
||||
subject.catch(s).should be_valid
|
||||
end
|
||||
|
||||
it "fails if string percent array has commas" do
|
||||
s = Source.new %( %w(one, two) )
|
||||
subject.catch(s).should_not be_valid
|
||||
end
|
||||
|
||||
it "fails if string percent array has quotes" do
|
||||
s = Source.new %( %w("one" "two") )
|
||||
subject.catch(s).should_not be_valid
|
||||
end
|
||||
|
||||
it "fails if symbols percent array has commas" do
|
||||
s = Source.new %( %i(one, two) )
|
||||
subject.catch(s).should_not be_valid
|
||||
end
|
||||
|
||||
it "fails if symbols percent array has a colon" do
|
||||
s = Source.new %( %i(:one :two) )
|
||||
subject.catch(s).should_not be_valid
|
||||
end
|
||||
|
||||
it "reports rule, location and message for %i" do
|
||||
s = Source.new %(
|
||||
%i(:one)
|
||||
), "source.cr"
|
||||
|
||||
subject.catch(s).should_not be_valid
|
||||
error = s.errors.first
|
||||
error.rule.should_not be_nil
|
||||
error.location.to_s.should eq "source.cr:2:9"
|
||||
error.message.should eq(
|
||||
"Symbols `,:` may be unwanted in %i array literals"
|
||||
)
|
||||
end
|
||||
|
||||
it "reports rule, location and message for %w" do
|
||||
s = Source.new %(
|
||||
%w("one")
|
||||
), "source.cr"
|
||||
|
||||
subject.catch(s).should_not be_valid
|
||||
error = s.errors.first
|
||||
error.rule.should_not be_nil
|
||||
error.location.to_s.should eq "source.cr:2:9"
|
||||
error.message.should eq(
|
||||
"Symbols `,\"` may be unwanted in %w array literals"
|
||||
)
|
||||
end
|
||||
end
|
||||
end
|
65
src/ameba/rule/percent_arrays.cr
Normal file
65
src/ameba/rule/percent_arrays.cr
Normal file
|
@ -0,0 +1,65 @@
|
|||
module Ameba::Rule
|
||||
# A rule that disallows some unwanted symbols in percent array literals.
|
||||
#
|
||||
# For example, this is usually written by mistake:
|
||||
#
|
||||
# ```
|
||||
# %i(:one, :two)
|
||||
# %w("one", "two")
|
||||
# ```
|
||||
#
|
||||
# And the expected example is:
|
||||
#
|
||||
# ```
|
||||
# %i(one two)
|
||||
# %w(one two)
|
||||
# ```
|
||||
#
|
||||
# YAML configuration example:
|
||||
#
|
||||
# ```
|
||||
# PercentArrays:
|
||||
# Enabled: true
|
||||
# StringArrayUnwantedSymbols: ',"'
|
||||
# SymbolArrayUnwantedSymbols: ',:'
|
||||
# ```
|
||||
#
|
||||
struct PercentArrays < Base
|
||||
prop string_array_unwanted_symbols = ",\""
|
||||
prop symbol_array_unwanted_symbols = ",:"
|
||||
|
||||
def test(source)
|
||||
error = start_token = nil
|
||||
|
||||
Tokenizer.new(source).run do |token|
|
||||
case token.type
|
||||
when :STRING_ARRAY_START, :SYMBOL_ARRAY_START
|
||||
start_token = token.dup
|
||||
when :STRING
|
||||
if start_token && error.nil?
|
||||
error = array_entry_invalid?(token.value, start_token.not_nil!.raw)
|
||||
end
|
||||
when :STRING_ARRAY_END, :SYMBOL_ARRAY_END
|
||||
if error
|
||||
source.error(self, start_token.try &.location, error.not_nil!)
|
||||
end
|
||||
error = start_token = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
private def array_entry_invalid?(entry, array_type)
|
||||
case array_type
|
||||
when .starts_with? "%w"
|
||||
check_array_entry entry, string_array_unwanted_symbols, "%w"
|
||||
when .starts_with? "%i"
|
||||
check_array_entry entry, symbol_array_unwanted_symbols, "%i"
|
||||
end
|
||||
end
|
||||
|
||||
private def check_array_entry(entry, symbols, literal)
|
||||
return unless entry =~ /[#{symbols}]/
|
||||
"Symbols `#{symbols}` may be unwanted in #{literal} array literals"
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Reference in a new issue