New option: LargeNumbers#int_min_digits (default: 5)

This commit is contained in:
Vitalii Elenhaupt 2017-11-17 19:07:39 +02:00
parent b3a9ff2fa0
commit 3c9df13beb
No known key found for this signature in database
GPG key ID: 7558EF3A4056C706
3 changed files with 26 additions and 12 deletions

View file

@ -21,6 +21,7 @@ EmptyExpression:
LargeNumbers: LargeNumbers:
# A rule that disallows usage of large numbers without underscore. # A rule that disallows usage of large numbers without underscore.
Enabled: true Enabled: true
IntMinDigits: 5 # i.e. integers higher than 9999
LineLength: LineLength:
# Disallows lines longer that MaxLength number of symbols. # Disallows lines longer that MaxLength number of symbols.

View file

@ -17,7 +17,11 @@ module Ameba
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
16 17 18 19 20 30 40 50 60 70 80 90 16 17 18 19 20 30 40 50 60 70 80 90
100 100
999
1000
1_000 1_000
9999
9_999
10_000 10_000
100_000 100_000
200_000 200_000
@ -79,15 +83,13 @@ module Ameba
it_transforms "1_00000", "100_000" it_transforms "1_00000", "100_000"
it_transforms "1_23_i8", "123_i8" it_transforms "10000_i16", "10_000_i16"
it_transforms "1000_i16", "1_000_i16" it_transforms "10000_i32", "10_000_i32"
it_transforms "1000_i32", "1_000_i32" it_transforms "10000_i64", "10_000_i64"
it_transforms "1000_i64", "1_000_i64"
it_transforms "1_23_u8", "123_u8" it_transforms "10000_u16", "10_000_u16"
it_transforms "1000_u16", "1_000_u16" it_transforms "10000_u32", "10_000_u32"
it_transforms "1000_u32", "1_000_u32" it_transforms "10000_u64", "10_000_u64"
it_transforms "1000_u64", "1_000_u64"
it_transforms "123456_f32", "123_456_f32" it_transforms "123456_f32", "123_456_f32"
it_transforms "123456_f64", "123_456_f64" it_transforms "123456_f64", "123_456_f64"

View file

@ -24,14 +24,19 @@ module Ameba::Rule
# ``` # ```
# LargeNumbers: # LargeNumbers:
# Enabled: true # Enabled: true
# IntMinDigits: 5 # i.e. integers higher than 9999
# ``` # ```
# #
struct LargeNumbers < Base struct LargeNumbers < Base
prop int_min_digits = 5
def test(source) def test(source)
Tokenizer.new(source).run do |token| Tokenizer.new(source).run do |token|
next unless token.type == :NUMBER && decimal?(token.raw) next unless token.type == :NUMBER && decimal?(token.raw)
if (expected = underscored token.raw) != token.raw parsed = parse_number token.raw
if allowed?(*parsed) && (expected = underscored *parsed) != token.raw
source.error self, token.location, source.error self, token.location,
"Large numbers should be written with underscores: #{expected}" "Large numbers should be written with underscores: #{expected}"
end end
@ -42,8 +47,14 @@ module Ameba::Rule
value !~ /^0(x|b|o)/ value !~ /^0(x|b|o)/
end end
private def underscored(raw_number) private def allowed?(_sign, value, fraction, _suffix)
sign, value, fraction, suffix = parse_number raw_number return true unless fraction.nil?
digits = value.chars.select &.to_s.=~ /[0-9]/
digits.size >= int_min_digits
end
private def underscored(sign, value, fraction, suffix)
value = slice_digits(value.reverse) { |slice| slice }.reverse value = slice_digits(value.reverse) { |slice| slice }.reverse
fraction = "." + slice_digits(fraction) { |slice| slice } if fraction fraction = "." + slice_digits(fraction) { |slice| slice } if fraction
@ -75,7 +86,7 @@ module Ameba::Rule
end end
private def parse_suffix(value) private def parse_suffix(value)
if pos = (value =~ /e/ || value =~ /_(i|u|f)/) if pos = (value =~ /e/ || value =~ /_?(i|u|f)/)
suffix = value[pos..-1] suffix = value[pos..-1]
value = value[0..pos - 1] value = value[0..pos - 1]
end end