Class: RuboCop::Cop::EachToForCorrector
| Relationships & Source Files | |
| Super Chains via Extension / Inclusion / Inheritance | |
|
Class Chain:
self,
Macros
|
|
| Inherits: | Object |
| Defined in: | lib/rubocop/cop/correctors/each_to_for_corrector.rb |
Overview
This class autocorrects #each enumeration to for iteration.
Class Method Summary
- .new(block_node) ⇒ EachToForCorrector constructor
Instance Attribute Summary
- #argument_node readonly private
- #block_node readonly private
- #collection_node readonly private
Instance Method Summary
- #call(corrector)
- #closing_keyword private
- #loop_variable(argument) private
- #loop_variables private
- #offending_range private
- #opening_keyword private
- #padding_needed?(position) ⇒ Boolean private
Constructor Details
.new(block_node) ⇒ EachToForCorrector
# File 'lib/rubocop/cop/correctors/each_to_for_corrector.rb', line 9
def initialize(block_node) @block_node = block_node @collection_node = block_node.receiver @argument_node = block_node.arguments end
Instance Attribute Details
#argument_node (readonly, private)
[ GitHub ]# File 'lib/rubocop/cop/correctors/each_to_for_corrector.rb', line 23
attr_reader :block_node, :collection_node, :argument_node
#block_node (readonly, private)
[ GitHub ]# File 'lib/rubocop/cop/correctors/each_to_for_corrector.rb', line 23
attr_reader :block_node, :collection_node, :argument_node
#collection_node (readonly, private)
[ GitHub ]# File 'lib/rubocop/cop/correctors/each_to_for_corrector.rb', line 23
attr_reader :block_node, :collection_node, :argument_node
Instance Method Details
#call(corrector)
[ GitHub ]# File 'lib/rubocop/cop/correctors/each_to_for_corrector.rb', line 15
def call(corrector) corrector.insert_before(block_node, "for #{loop_variables} in ") corrector.replace(offending_range, opening_keyword) corrector.replace(block_node.loc.end, closing_keyword) if block_node.braces? end
#closing_keyword (private)
[ GitHub ]# File 'lib/rubocop/cop/correctors/each_to_for_corrector.rb', line 46
def closing_keyword padding_needed?(block_node.loc.end.begin_pos - 1) ? ' end' : 'end' end
#loop_variable(argument) (private)
[ GitHub ]# File 'lib/rubocop/cop/correctors/each_to_for_corrector.rb', line 33
def loop_variable(argument) return argument.source unless argument.mlhs_type? variables = argument.children.map { |child| loop_variable(child) }.join(', ') lone_target = argument.children.one? && !argument.children.first.restarg_type? lone_target ? "(#{variables},)" : "(#{variables})" end
#loop_variables (private)
[ GitHub ]# File 'lib/rubocop/cop/correctors/each_to_for_corrector.rb', line 25
def loop_variables return '_' unless block_node.arguments? variables = argument_node.children.map { |argument| loop_variable(argument) }.join(', ') argument_node.source.match?(/,\s*\|\z/) ? "#{variables}," : variables end
#offending_range (private)
[ GitHub ]# File 'lib/rubocop/cop/correctors/each_to_for_corrector.rb', line 56
def offending_range begin_range = collection_node.source_range.end if block_node.arguments? begin_range.join(argument_node.source_range.end) else begin_range.join(block_node.loc.begin.end) end end
#opening_keyword (private)
[ GitHub ]# File 'lib/rubocop/cop/correctors/each_to_for_corrector.rb', line 42
def opening_keyword padding_needed?(offending_range.end_pos) ? ' do ' : ' do' end
#padding_needed?(position) ⇒ Boolean (private)
# File 'lib/rubocop/cop/correctors/each_to_for_corrector.rb', line 50
def padding_needed?(position) character = block_node.source_range.source_buffer.source[position] !character.nil? && !character.match?(/\s/) end