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