Class: RuboCop::Cop::Layout::LineEndStringConcatenationIndentation
| 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/layout/line_end_string_concatenation_indentation.rb |
Overview
Checks the indentation of the next line after a line that ends with a string literal and a backslash.
If EnforcedStyle: aligned is set, the concatenated string parts shall be aligned with the
first part. There are some exceptions, such as implicit return values, where the
concatenated string parts shall be indented regardless of EnforcedStyle configuration.
If EnforcedStyle: indented is set, it’s the second line that shall be indented one step
more than the first line. Lines 3 and forward shall be aligned with line 2.
Constant Summary
-
MSG_ALIGN =
# File 'lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb', line 79'Align parts of a string concatenated with backslash.' -
MSG_INDENT =
# File 'lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb', line 80'Indent the first part of a string concatenated with backslash.' -
PARENT_TYPES_FOR_INDENTED =
# File 'lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb', line 81[nil, :block, :begin, :def, :defs, :if].freeze
::RuboCop::Cop::Base - Inherited
DEPARTMENT_SEVERITIES, EMPTY_OFFENSES, RESTRICT_ON_SEND
::RuboCop::Cop::ConfigurableEnforcedStyle - Included
::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
::RuboCop::Cop::Alignment - Included
::RuboCop::Cop::ConfigurableEnforcedStyle - 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
- #autocorrect(corrector, node)
- #on_dstr(node)
- #add_offense_and_correction(node, message) private
- #always_indented?(dstr_node) ⇒ Boolean private
- #base_column(child) private
- #check_aligned(children, start_index, target_column) private
- #check_indented(children) private
- #indented_column(children) private
- #register_misaligned_run(run, column_delta) private
- #same_column_runs(parts) private
- #strings_concatenated_with_backslash?(dstr_node) ⇒ Boolean private
::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::ConfigurableEnforcedStyle - Included
::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 Method Details
#add_offense_and_correction(node, message) (private)
[ GitHub ]# File 'lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb', line 153
def add_offense_and_correction(node, ) add_offense(node, message: ) { |corrector| autocorrect(corrector, node) } end
#always_indented?(dstr_node) ⇒ Boolean (private)
# File 'lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb', line 109
def always_indented?(dstr_node) PARENT_TYPES_FOR_INDENTED.include?(dstr_node.parent&.type) end
#autocorrect(corrector, node)
[ GitHub ]# File 'lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb', line 97
def autocorrect(corrector, node) AlignmentCorrector.correct(corrector, processed_source, node, @column_delta) end
#base_column(child) (private)
[ GitHub ]# File 'lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb', line 144
def base_column(child) grandparent = child.parent.parent if grandparent&.pair_type? grandparent.loc.column else child.source_range.source_line =~ /\S/ end end
#check_aligned(children, start_index, target_column) (private)
[ GitHub ]# File 'lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb', line 113
def check_aligned(children, start_index, target_column) base_column = children[start_index - 1].loc.column same_column_runs(children[start_index..]).each do |run| column = run.first.loc.column if column != base_column && column != target_column register_misaligned_run(run, target_column - column) end base_column = column end end
#check_indented(children) (private)
[ GitHub ]# File 'lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb', line 135
def check_indented(children) @column_delta = indented_column(children) - children[1].loc.column add_offense_and_correction(children[1], MSG_INDENT) if @column_delta != 0 end
#indented_column(children) (private)
[ GitHub ]# File 'lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb', line 140
def indented_column(children) base_column(children[0]) + configured_indentation_width end
#on_dstr(node)
[ GitHub ]# File 'lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb', line 83
def on_dstr(node) return unless strings_concatenated_with_backslash?(node) children = node.children return if children.empty? if style == :aligned && !always_indented?(node) check_aligned(children, 1, children[0].loc.column) else check_indented(children) check_aligned(children, 2, indented_column(children)) end end
#register_misaligned_run(run, column_delta) (private)
[ GitHub ]# File 'lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb', line 128
def register_misaligned_run(run, column_delta) @column_delta = column_delta add_offense(run.first, message: MSG_ALIGN) do |corrector| run.each { |child| autocorrect(corrector, child) } end end
#same_column_runs(parts) (private)
[ GitHub ]# File 'lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb', line 124
def same_column_runs(parts) parts.chunk_while { |a, b| a.loc.column == b.loc.column } end
#strings_concatenated_with_backslash?(dstr_node) ⇒ Boolean (private)
# File 'lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb', line 103
def strings_concatenated_with_backslash?(dstr_node) dstr_node.multiline? && dstr_node.children.all? { |c| c.type?(:str, :dstr) } && dstr_node.children.none?(&:multiline?) end