Class: RuboCop::Cop::Style::SingleLineDoEndBlock
| Relationships & Source Files | |
| Super Chains via Extension / Inclusion / Inheritance | |
|
Class Chain:
self,
::RuboCop::Cop::AutoCorrector,
::RuboCop::Cop::Base,
::RuboCop::ExcludeLimit,
NodePattern::Macros,
RuboCop::AST::Sexp
|
|
|
Instance Chain:
|
|
| Inherits: |
RuboCop::Cop::Base
|
| Defined in: | lib/rubocop/cop/style/single_line_do_end_block.rb |
Overview
Checks for single-line do…end block.
In practice a single line do…end is autocorrected when EnforcedStyle: semantic
is configured for Style/BlockDelimiters. The autocorrection maintains the
do … end syntax to preserve semantics and does not change it to {…} block.
|
Note
|
If InspectBlocks is set to true for Layout/RedundantLineBreak, blocks will
be autocorrected to be on a single line if possible. This cop respects that configuration
by not registering an offense if it would subsequently cause a
Layout/RedundantLineBreak offense.
|
Constant Summary
-
MSG =
# File 'lib/rubocop/cop/style/single_line_do_end_block.rb', line 37'Prefer multiline `do`...`end` block.'
::RuboCop::Cop::Base - Inherited
DEPARTMENT_SEVERITIES, EMPTY_OFFENSES, RESTRICT_ON_SEND
::RuboCop::Cop::Alignment - Included
Class Attribute Summary
::RuboCop::Cop::AutoCorrector - Extended
::RuboCop::Cop::Base - Inherited
| .gem_requirements, .lint?, | |
| .support_autocorrect? | Returns if class supports autocorrect. |
| .support_multiple_source? | Override if your cop should be called repeatedly for multiple investigations Between calls to |
Class Method Summary
::RuboCop::Cop::Base - Inherited
| .autocorrect_incompatible_with | List of cops that should not try to autocorrect at the same time as this cop. |
| .badge | Naming. |
| .callbacks_needed, .cop_name, .department, | |
| .documentation_url | Returns a url to view this cops documentation online. |
| .exclude_from_registry | Call for abstract Cop classes. |
| .inherited, | |
| .joining_forces | Override and return the Force class(es) you need to join. |
| .match? | Returns true if the cop name or the cop namespace matches any of the given names. |
| .new, | |
| .requires_gem | Register a version requirement for the given gem name. |
| .restrict_on_send | Reserved for Commissioner. |
::RuboCop::ExcludeLimit - Extended
| exclude_limit | Sets up a configuration option to have an exclude limit tracked. |
| transform | |
Instance Attribute Summary
- #single_line_blocks_preferred? ⇒ Boolean readonly private
::RuboCop::Cop::LineLengthHelp - Included
::RuboCop::Cop::Alignment - Included
::RuboCop::Cop::Base - Inherited
| #active_support_extensions_enabled?, #always_autocorrect?, #config, #config_to_allow_offenses, #config_to_allow_offenses=, #contextual_autocorrect?, #disabled_autocorrect?, | |
| #preview? | Whether the user opted in to unstable behavior, with |
| #processed_source, #project_index, #string_literals_frozen_by_default?, #target_satisfies_all_gem_version_requirements? | |
::RuboCop::Cop::AutocorrectLogic - Included
| #autocorrect?, #autocorrect_enabled?, #autocorrect_requested?, #autocorrect_with_disable_uncorrectable?, #correctable?, #disable_uncorrectable?, #safe_autocorrect?, | |
| #skipped_unsafe_correction_with_disable_uncorrectable? | Whether a correction exists but is skipped because it is unsafe in a safe autocorrect run, while |
| #contextual_autocorrect_held_back? | When LSP is enabled or the |
Instance Method Summary
- #on_block(node) (also: #on_numblock, #on_itblock)
-
#on_itblock(node)
Alias for #on_block.
-
#on_numblock(node)
Alias for #on_block.
- #break_block_body(corrector, node) private
- #code_after_end?(end_keyword) ⇒ Boolean private
- #do_line(node) private
-
#heredoc_opened_before_do(node)
private
Returns the heredoc opened before the
doon the block’s line whose body extends the furthest down. - #heredoc_opened_on_line_before?(str_node, line, pos) ⇒ Boolean private
- #move_body_after_heredoc(corrector, node, heredoc) private
- #trailing_heredoc(root) private
::RuboCop::Cop::CheckSingleLineSuitability - Included
| #suitable_as_single_line?, #comment_within?, #safe_to_split?, #to_single_line, #too_long?, #too_long_as_single_line? |
::RuboCop::Cop::LineLengthHelp - Included
::RuboCop::Cop::Alignment - Included
| #check_alignment, #configured_indentation_width, #display_column, #each_bad_alignment, #end_of_line_comment, #indentation, #offset, #register_offense, #within? |
::RuboCop::Cop::Base - Inherited
| #add_global_offense | Adds an offense that has no particular location. |
| #add_offense | Adds an offense on the specified range (or node with an expression) Unless that offense is disabled for this range, a corrector will be yielded to provide the cop the opportunity to autocorrect the offense. |
| #begin_investigation | Called before any investigation. |
| #callbacks_needed | — grouped under the Commissioner heading above. |
| #cop_config | Configuration Helpers. |
| #cop_name, #excluded_file?, | |
| #external_dependency_checksum | This method should be overridden when a cop’s behavior depends on state that lives outside of these locations: |
| #inspect, | |
| #message | Gets called if no message is specified when calling |
| #name | Alias for Base#cop_name. |
| #offenses, | |
| #on_investigation_end | Called after all on_… |
| #on_new_investigation | Called before all on_… |
| #on_other_file | Called instead of all on_… |
| #parse | There should be very limited reasons for a Cop to do it’s own parsing. |
| #parser_engine, | |
| #ready | Called between investigations. |
| #relevant_file?, | |
| #target_gem_version | Returns the version of a gem in the target, by default its locked version (i.e. from Gemfile.lock or gems.locked). |
| #target_rails_version, #target_ruby_version, #annotate, #apply_correction, #attempt_correction, | |
| #callback_argument | Reserved for Cop::Cop. |
| #complete_investigation | Called to complete an investigation. |
| #correct, #covering_disabled_range, #current_corrector, | |
| #current_offense_locations | Reserved for Commissioner: |
| #current_offenses, #currently_disabled_lines, #custom_severity, #default_severity, #disable_uncorrectable, #enabled_line?, | |
| #enabled_lines? | A multi-line offense is suppressed by a directive on any line of its range, not only its first line, matching the intuition that the directive is attached to the offending code. |
| #file_name_matches_any?, #find_message, #find_severity, #matches_absolute_include_pattern?, #new_offense, #range_for_original, #range_from_node_or_range, | |
| #reset_investigation | Actually private methods. |
| #suppression_reason | The |
| #use_corrector | |
::RuboCop::Cop::AutocorrectLogic - Included
::RuboCop::Cop::IgnoredNode - Included
Constructor Details
This class inherits a constructor from RuboCop::Cop::Base
Instance Attribute Details
#single_line_blocks_preferred? ⇒ Boolean (readonly, private)
[ GitHub ]
# File 'lib/rubocop/cop/style/single_line_do_end_block.rb', line 59
def single_line_blocks_preferred? @config.for_enabled_cop('Layout/RedundantLineBreak')['InspectBlocks'] end
Instance Method Details
#break_block_body(corrector, node) (private)
[ GitHub ]# File 'lib/rubocop/cop/style/single_line_do_end_block.rb', line 79
def break_block_body(corrector, node) corrector.insert_after(do_line(node), "\n") if (heredoc = trailing_heredoc(node.body)) corrector.remove(node.loc.end) corrector.insert_after(heredoc.loc.heredoc_end, "\nend") else corrector.insert_before(node.loc.end, "\n") end end
#code_after_end?(end_keyword) ⇒ Boolean (private)
# File 'lib/rubocop/cop/style/single_line_do_end_block.rb', line 63
def code_after_end?(end_keyword) rest = end_keyword.source_line[end_keyword.last_column..].strip !rest.empty? && !rest.start_with?('#') end
#do_line(node) (private)
[ GitHub ]# File 'lib/rubocop/cop/style/single_line_do_end_block.rb', line 108
def do_line(node) if node.type?(:numblock, :itblock) || node.arguments.children.empty? || node.send_node.lambda_literal? node.loc.begin else node.arguments.source_range end end
#heredoc_opened_before_do(node) (private)
Returns the heredoc opened before the do on the block’s line whose body extends
the furthest down. It can be opened outside the block, such as in a preceding argument.
# File 'lib/rubocop/cop/style/single_line_do_end_block.rb', line 92
def heredoc_opened_before_do(node) do_begin_pos = node.loc.begin.begin_pos heredocs = processed_source.ast.each_node(:any_str).select do |str_node| heredoc_opened_on_line_before?(str_node, node.first_line, do_begin_pos) end heredocs.max_by { |heredoc| heredoc.loc.heredoc_end.line } end
#heredoc_opened_on_line_before?(str_node, line, pos) ⇒ Boolean (private)
# File 'lib/rubocop/cop/style/single_line_do_end_block.rb', line 102
def heredoc_opened_on_line_before?(str_node, line, pos) return false unless str_node.heredoc? str_node.first_line == line && str_node.source_range.end_pos <= pos end
#move_body_after_heredoc(corrector, node, heredoc) (private)
[ GitHub ]# File 'lib/rubocop/cop/style/single_line_do_end_block.rb', line 69
def move_body_after_heredoc(corrector, node, heredoc) body = node.body corrector.remove(do_line(node).end.join(node.loc.end.end)) corrector.insert_after(heredoc.loc.heredoc_end, "\n#{body.source}") if body last_heredoc = trailing_heredoc(body) || heredoc corrector.insert_after(last_heredoc.loc.heredoc_end, "\nend") end
#on_block(node) Also known as: #on_numblock, #on_itblock
[ GitHub ]# File 'lib/rubocop/cop/style/single_line_do_end_block.rb', line 39
def on_block(node) return if node.multiline? || node.braces? return if single_line_blocks_preferred? && suitable_as_single_line?(node) add_offense(node) do |corrector| if (heredoc = heredoc_opened_before_do(node)) # Code after the `end`, such as a method chain, would be left behind after the `do`. next if code_after_end?(node.loc.end) move_body_after_heredoc(corrector, node, heredoc) else break_block_body(corrector, node) end end end
#on_itblock(node)
Alias for #on_block.
# File 'lib/rubocop/cop/style/single_line_do_end_block.rb', line 55
alias on_itblock on_block
#on_numblock(node)
Alias for #on_block.
# File 'lib/rubocop/cop/style/single_line_do_end_block.rb', line 54
alias on_numblock on_block