Class: RuboCop::Cop::Style::ArgumentsForwarding::SendNodeClassifier

Inherits:
Object
  • Object
show all
Extended by:
Macros
Defined in:
lib/rubocop/cop/style/arguments_forwarding.rb

Overview

Classifies send nodes for possible rest/kwrest/all (including block) forwarding.

Instance Method Summary collapse

Constructor Details

#initialize(def_node, send_node, referenced_lvars, forwardable_args, **config) ⇒ SendNodeClassifier

Returns a new instance of SendNodeClassifier.



416
417
418
419
420
421
422
423
424
# File 'lib/rubocop/cop/style/arguments_forwarding.rb', line 416

def initialize(def_node, send_node, referenced_lvars, forwardable_args, **config)
  @def_node = def_node
  @send_node = send_node
  @referenced_lvars = referenced_lvars
  @rest_arg, @kwrest_arg, @block_arg = *forwardable_args
  @rest_arg_name, @kwrest_arg_name, @block_arg_name =
    *forwardable_args.map { |a| a&.name }
  @config = config
end

Instance Method Details

#classificationObject



462
463
464
465
466
467
468
469
470
471
472
# File 'lib/rubocop/cop/style/arguments_forwarding.rb', line 462

def classification
  return nil unless forwarded_rest_arg || forwarded_kwrest_arg || forwarded_block_arg

  if ruby_32_only_anonymous_forwarding?
    :all_anonymous
  elsif can_forward_all?
    :all
  else
    :rest_or_kwrest
  end
end

#def_all_anonymous_args?(node) ⇒ Object



400
401
402
403
404
405
406
# File 'lib/rubocop/cop/style/arguments_forwarding.rb', line 400

def_node_matcher :def_all_anonymous_args?, <<~PATTERN
  (
    def _
    (args ... (restarg) (kwrestarg) (blockarg nil?))
    _
  )
PATTERN

#extract_forwarded_kwrest_arg(node, kwrest_name) ⇒ Object



394
# File 'lib/rubocop/cop/style/arguments_forwarding.rb', line 394

def_node_matcher :extract_forwarded_kwrest_arg, '(hash <$(kwsplat (lvar %1)) ...>)'

#forwarded_block_argObject



450
451
452
453
454
455
456
457
458
459
460
# File 'lib/rubocop/cop/style/arguments_forwarding.rb', line 450

def forwarded_block_arg
  return @forwarded_block_arg if defined?(@forwarded_block_arg)

  @forwarded_block_arg = if referenced_block_arg?
                           nil
                         else
                           arguments.find do |arg|
                             forwarded_block_arg?(arg, @block_arg_name)
                           end
                         end
end

#forwarded_block_arg?(node, block_name) ⇒ Object



397
# File 'lib/rubocop/cop/style/arguments_forwarding.rb', line 397

def_node_matcher :forwarded_block_arg?, '(block_pass {(lvar %1) nil?})'

#forwarded_kwrest_argObject



438
439
440
441
442
443
444
445
446
447
448
# File 'lib/rubocop/cop/style/arguments_forwarding.rb', line 438

def forwarded_kwrest_arg
  return @forwarded_kwrest_arg if defined?(@forwarded_kwrest_arg)

  @forwarded_kwrest_arg = if referenced_kwrest_arg?
                            nil
                          else
                            arguments.filter_map do |arg|
                              extract_forwarded_kwrest_arg(arg, @kwrest_arg_name)
                            end.first
                          end
end

#forwarded_rest_argObject



426
427
428
429
430
431
432
433
434
435
436
# File 'lib/rubocop/cop/style/arguments_forwarding.rb', line 426

def forwarded_rest_arg
  return @forwarded_rest_arg if defined?(@forwarded_rest_arg)

  @forwarded_rest_arg = if referenced_rest_arg?
                          nil
                        else
                          arguments.find do |arg|
                            forwarded_rest_arg?(arg, @rest_arg_name)
                          end
                        end
end

#forwarded_rest_arg?(node, rest_name) ⇒ Object



391
# File 'lib/rubocop/cop/style/arguments_forwarding.rb', line 391

def_node_matcher :forwarded_rest_arg?, '(splat (lvar %1))'

#send_all_anonymous_args?(node) ⇒ Object



409
410
411
412
413
414
# File 'lib/rubocop/cop/style/arguments_forwarding.rb', line 409

def_node_matcher :send_all_anonymous_args?, <<~PATTERN
  (
    send _ _
    ... (forwarded_restarg) (hash (forwarded_kwrestarg)) (block_pass nil?)
  )
PATTERN