class RuboCop::Cop::Style::NumericLiteralPrefix
num = 01234
# good
num = 0O1234
num = 0o1234
# bad
@example EnforcedOctalStyle: zero_only
num = 1234
num = 0b10101
num = 0x12AB
num = 0o1234
# good
num = 0d1234
num = 0D1234
# bad - redundant decimal prefix
num = 0B10101
num = 0X12AB
num = 0O1234
# bad - uppercase prefix
num = 01234
# bad - missing octal prefix
@example EnforcedOctalStyle: zero_with_o (default)
or no prefix (in case of decimals).
uppercase prefixes and corrects them to lowercase prefix
This cop checks for octal, hex, binary, and decimal literals using
def autocorrect(node)
def autocorrect(node) lambda do |corrector| type = literal_type(node) corrector.replace(node.source_range, send(:"format_#{type}", node.source)) end end
def format_binary(source)
def format_binary(source) source.sub(/^0B/, '0b') end
def format_decimal(source)
def format_decimal(source) source.sub(/^0[dD]/, '') end
def format_hex(source)
def format_hex(source) source.sub(/^0X/, '0x') end
def format_octal(source)
def format_octal(source) source.sub(/^0O?/, '0o') end
def format_octal_zero_only(source)
def format_octal_zero_only(source) source.sub(/^0[Oo]?/, '0') end
def hex_bin_dec_literal_type(literal)
def hex_bin_dec_literal_type(literal) case literal when HEX_REGEX :hex when BINARY_REGEX :binary when DECIMAL_REGEX :decimal end end
def literal_type(node)
def literal_type(node) literal = integer_part(node) octal_literal_type(literal) || hex_bin_dec_literal_type(literal) end
def message(node)
def message(node) self.class.const_get("#{literal_type(node).upcase}_MSG") end
def octal_literal_type(literal)
def octal_literal_type(literal) if literal =~ OCTAL_ZERO_ONLY_REGEX && octal_zero_only? :octal_zero_only elsif literal =~ OCTAL_REGEX && !octal_zero_only? :octal end end
def octal_zero_only?
def octal_zero_only? cop_config['EnforcedOctalStyle'] == 'zero_only' end
def on_int(node)
def on_int(node) type = literal_type(node) return unless type add_offense(node) end