lib/rubocop/cop/lint/format_parameter_mismatch.rb in rubocop-0.47.1 vs lib/rubocop/cop/lint/format_parameter_mismatch.rb in rubocop-0.48.0

- old
+ new

@@ -27,23 +27,25 @@ NAMED_FIELD_REGEX = /%\{[_a-zA-Z][_a-zA-Z]+\}/ KERNEL = 'Kernel'.freeze SHOVEL = '<<'.freeze PERCENT = '%'.freeze PERCENT_PERCENT = '%%'.freeze - STRING_TYPES = [:str, :dstr].freeze + STRING_TYPES = %i(str dstr).freeze NAMED_INTERPOLATION = /%(?:<\w+>|\{\w+\})/ def on_send(node) - add_offense(node, :selector) if offending_node?(node) + return unless offending_node?(node) + + add_offense(node, :selector) end private def offending_node?(node) return false unless called_on_string?(node) return false unless method_with_format_args?(node) - return false if named_mode?(node) || node_with_splat_args?(node) + return false if named_mode?(node) || splat_args?(node) num_of_format_args, num_of_expected_fields = count_matches(node) return false if num_of_format_args == :unknown matched_arguments_count?(num_of_expected_fields, num_of_format_args) @@ -80,22 +82,18 @@ end !relevant_node.source.scan(NAMED_FIELD_REGEX).empty? end - def node_with_splat_args?(node) + def splat_args?(node) return false if percent?(node) - _receiver_node, _method_name, *args = *node - - args.butfirst.any?(&:splat_type?) + node.arguments.butfirst.any?(&:splat_type?) end def heredoc?(node) - _receiver, _name, args = *node - - args.source[0, 2] == SHOVEL + node.first_argument.source[0, 2] == SHOVEL end def count_matches(node) receiver_node, _method_name, *args = *node @@ -129,11 +127,11 @@ return 1 if node.source =~ NAMED_INTERPOLATION node .source .scan(FIELD_REGEX) - .select { |x| x.first != PERCENT_PERCENT } + .reject { |x| x.first == PERCENT_PERCENT } .reduce(0) { |acc, elem| acc + (elem[2] =~ /\*/ ? 2 : 1) } end def arguments_count(args) if args.empty? @@ -152,27 +150,31 @@ def sprintf?(node) format_method?(:sprintf, node) end def percent?(node) - receiver_node, method_name, *arg_nodes = *node + receiver = node.receiver - percent = method_name == :% && - (STRING_TYPES.include?(receiver_node.type) || - arg_nodes[0].array_type?) + percent = node.method_name == :% && + (STRING_TYPES.include?(receiver.type) || + node.first_argument.array_type?) - if percent && STRING_TYPES.include?(receiver_node.type) + if percent && STRING_TYPES.include?(receiver.type) return false if heredoc?(node) end percent end def message(node) - _receiver, method_name, *_args = *node num_args_for_format, num_expected_fields = count_matches(node) - method_name = 'String#%' if PERCENT == method_name.to_s + method_name = if node.method_name.to_s == PERCENT + 'String#%' + else + node.method_name + end + format(MSG, num_args_for_format, method_name, num_expected_fields) end end end end