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.



249
250
251
252
253
254
255
256
257
# File 'lib/rubocop/cop/style/arguments_forwarding.rb', line 249

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



277
278
279
280
281
282
283
284
285
# File 'lib/rubocop/cop/style/arguments_forwarding.rb', line 277

def classification
  return nil unless forwarded_rest_arg || forwarded_kwrest_arg

  if can_forward_all?
    :all
  elsif target_ruby_version >= 3.2
    :rest_or_kwrest
  end
end

#extract_forwarded_kwrest_arg(node, kwrest_name) ⇒ Object



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

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

#forwarded_block_argObject



271
272
273
274
275
# File 'lib/rubocop/cop/style/arguments_forwarding.rb', line 271

def forwarded_block_arg
  return nil if referenced_block_arg?

  arguments.find { |arg| forwarded_block_arg?(arg, @block_arg_name) }
end

#forwarded_block_arg?(node, block_name) ⇒ Object



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

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

#forwarded_kwrest_argObject



265
266
267
268
269
# File 'lib/rubocop/cop/style/arguments_forwarding.rb', line 265

def forwarded_kwrest_arg
  return nil if referenced_kwrest_arg?

  arguments.filter_map { |arg| extract_forwarded_kwrest_arg(arg, @kwrest_arg_name) }.first
end

#forwarded_rest_argObject



259
260
261
262
263
# File 'lib/rubocop/cop/style/arguments_forwarding.rb', line 259

def forwarded_rest_arg
  return nil if referenced_rest_arg?

  arguments.find { |arg| forwarded_rest_arg?(arg, @rest_arg_name) }
end

#forwarded_rest_arg?(node, rest_name) ⇒ Object



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

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