class RuboCop::Cop::InternalAffairs::NodeTypeGroup
Checks that node types are checked against their group when all types of a group are checked.
@example
# bad node.type?(:irange, :erange) # good node.range_type? # bad node.type?(:irange, :erange, :send, :csend) # good node.type?(:range, :call)
Constants
- MSG
- RESTRICT_ON_SEND
Public Instance Methods
Source
# File lib/rubocop/cop/internal_affairs/node_type_group.rb, line 30 def on_send(node) return unless node.receiver symbol_args = node.arguments.select(&:sym_type?) return if symbol_args.none? NodePatternGroups::NODE_GROUPS.each do |group_name, group_types| next unless group_satisfied?(group_types, symbol_args) offense_range = arguments_range(node) add_offense(offense_range, message: format(MSG, group: group_name)) do |corrector| autocorrect(corrector, node, symbol_args, group_name, group_types) end end end
Also aliased as: on_csend
Private Instance Methods
Source
# File lib/rubocop/cop/internal_affairs/node_type_group.rb, line 49 def arguments_range(node) range_between( node.first_argument.source_range.begin_pos, node.last_argument.source_range.end_pos ) end
Source
# File lib/rubocop/cop/internal_affairs/node_type_group.rb, line 60 def autocorrect(corrector, node, symbol_args, group_name, group_types) if node.method?(:type?) && node.arguments.count == group_types.count autocorrect_to_explicit_predicate(corrector, node, group_name) else autocorrect_keep_method(corrector, symbol_args, group_name, group_types) end end
Source
# File lib/rubocop/cop/internal_affairs/node_type_group.rb, line 73 def autocorrect_keep_method(corrector, symbol_args, group_name, group_types) first_replaced = false symbol_args.each do |arg| next unless group_types.include?(arg.value) if first_replaced range = range_with_surrounding_space(arg.source_range) range = range_with_surrounding_comma(range, :left) corrector.remove(range) else first_replaced = true corrector.replace(arg, ":#{group_name}") end end end
Source
# File lib/rubocop/cop/internal_affairs/node_type_group.rb, line 68 def autocorrect_to_explicit_predicate(corrector, node, group_name) corrector.replace(node.selector, "#{group_name}_type?") corrector.remove(arguments_range(node)) end
Source
# File lib/rubocop/cop/internal_affairs/node_type_group.rb, line 56 def group_satisfied?(group_types, symbol_args) group_types.all? { |type| symbol_args.any? { |arg| arg.value == type } } end