class RuboCop::Cop::InternalAffairs::NodeTypeMultiplePredicates
Use ‘node.type?(:foo, :bar)` instead of `node.foo_type? || node.bar_type?`, and `!node.type?(:foo, :bar)` instead of `!node.foo_type? && !node.bar_type?`.
@example
# bad node.str_type? || node.sym_type? # good node.type?(:str, :sym) # bad node.type?(:str, :sym) || node.boolean_type? # good node.type?(:str, :sym, :boolean) # bad !node.str_type? && !node.sym_type? # good !node.type?(:str, :sym) # bad !node.type?(:str, :sym) && !node.boolean_type? # good !node.type?(:str, :sym, :boolean)
Constants
- MSG_AND
- MSG_OR
Public Instance Methods
Source
# File lib/rubocop/cop/internal_affairs/node_type_multiple_predicates.rb, line 80 def on_and(node) return unless (send_node = none_of_node_types?(node) || and_not_another_type?(node)) return unless send_node.receiver replacement = "!#{replacement(node, send_node)}" add_offense(node, message: format(MSG_AND, replacement: replacement)) do |corrector| corrector.replace(node, replacement) end end
Source
# File lib/rubocop/cop/internal_affairs/node_type_multiple_predicates.rb, line 70 def on_or(node) return unless (send_node = one_of_node_types?(node) || or_another_type?(node)) return unless send_node.receiver replacement = replacement(node, send_node) add_offense(node, message: format(MSG_OR, replacement: replacement)) do |corrector| corrector.replace(node, replacement) end end
Private Instance Methods
Source
# File lib/rubocop/cop/internal_affairs/node_type_multiple_predicates.rb, line 97 def replacement(node, send_node) send_node = send_node.children.first if send_node.method?(:!) types = types(node) receiver = send_node.receiver.source dot = send_node.loc.dot.source "#{receiver}#{dot}type?(:#{types.join(', :')})" end
Source
# File lib/rubocop/cop/internal_affairs/node_type_multiple_predicates.rb, line 93 def type_predicate?(method_name) method_name.end_with?('_type?') end
Source
# File lib/rubocop/cop/internal_affairs/node_type_multiple_predicates.rb, line 107 def types(node) [types_in_branch(node.lhs), types_in_branch(node.rhs)] end
Source
# File lib/rubocop/cop/internal_affairs/node_type_multiple_predicates.rb, line 111 def types_in_branch(branch) branch = branch.children.first if branch.method?(:!) if branch.method?(:type?) branch.arguments.map(&:value) elsif branch.method?(:defined_type?) # `node.defined_type?` relates to `node.type == :defined?` 'defined?' else branch.method_name.to_s.delete_suffix('_type?') end end