Class: RuboCop::Cop::Layout::FirstArrayElementIndentation
| 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/first_array_element_indentation.rb |
Overview
Checks the indentation of the first element in an array literal
where the opening bracket and the first element are on separate lines.
The other elements' indentations are handled by Layout/ArrayAlignment cop.
This cop will respect Layout/ArrayAlignment and will not work when
EnforcedStyle: with_fixed_indentation is specified for Layout/ArrayAlignment.
By default, array literals that are arguments in a method call with parentheses, and where the opening square bracket of the array is on the same line as the opening parenthesis of the method call, shall have their first element indented one step (two spaces) more than the position inside the opening parenthesis.
Other array literals shall have their first element indented one step more than the start of the line where the opening square bracket is.
This default style is called 'special_inside_parentheses'. Alternative styles are 'consistent' and 'align_brackets'. Here are examples:
Constant Summary
-
MSG =
# File 'lib/rubocop/cop/layout/first_array_element_indentation.rb', line 88'Use %<configured_indentation_width>d spaces for indentation ' \ 'in an array, relative to %<base_description>s.'
::RuboCop::Cop::Base - Inherited
DEPARTMENT_SEVERITIES, EMPTY_OFFENSES, RESTRICT_ON_SEND
::RuboCop::Cop::Alignment - Included
::RuboCop::Cop::ConfigurableEnforcedStyle - 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
- #enforce_first_argument_with_fixed_indentation? ⇒ Boolean readonly private
::RuboCop::Cop::ConfigurableEnforcedStyle - 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?, | |
| #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 |
Instance Method Summary
- #on_array(node)
-
#on_csend(node)
Alias for #on_send.
- #on_send(node) (also: #on_csend)
- #autocorrect(corrector, node) private
- #autocorrect_incompatible_with_other_cops?(array_node, left_parenthesis) ⇒ Boolean private
-
#base_description(indent_base_type)
private
Returns the description of what the correct indentation is based on.
- #brace_alignment_style private
- #check(array_node, left_parenthesis) private
- #check_right_bracket(right_bracket, first_elem, left_bracket, left_parenthesis) private
- #message(base_description) private
- #message_for_right_bracket(indent_base_type) private
::RuboCop::Cop::MultilineElementIndentation - Included
::RuboCop::Cop::ConfigurableEnforcedStyle - 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 a gems locked versions (i.e. |
| #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?, #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
#enforce_first_argument_with_fixed_indentation? ⇒ Boolean (readonly, private)
[ GitHub ]
# File 'lib/rubocop/cop/layout/first_array_element_indentation.rb', line 195
def enforce_first_argument_with_fixed_indentation? argument_alignment_config = config.for_enabled_cop('Layout/ArrayAlignment') argument_alignment_config['EnforcedStyle'] == 'with_fixed_indentation' end
Instance Method Details
#autocorrect(corrector, node) (private)
[ GitHub ]# File 'lib/rubocop/cop/layout/first_array_element_indentation.rb', line 121
def autocorrect(corrector, node) AlignmentCorrector.correct(corrector, processed_source, node, @column_delta) end
#autocorrect_incompatible_with_other_cops?(array_node, left_parenthesis) ⇒ Boolean (private)
# File 'lib/rubocop/cop/layout/first_array_element_indentation.rb', line 109
def autocorrect_incompatible_with_other_cops?(array_node, left_parenthesis) return false unless enforce_first_argument_with_fixed_indentation? return true if style != :consistent # `Layout/ArrayAlignment` does not align single-element arrays. return false if array_node.children.size < 2 _base_column, indent_base_type = indent_base(array_node.loc.begin, array_node.values.first, left_parenthesis) indent_base_type != :start_of_line end
#base_description(indent_base_type) (private)
Returns the description of what the correct indentation is based on.
# File 'lib/rubocop/cop/layout/first_array_element_indentation.rb', line 159
def base_description(indent_base_type) case indent_base_type when :left_brace_or_bracket 'the position of the opening bracket' when :first_column_after_left_parenthesis 'the first position after the preceding left parenthesis' when :parent_hash_key 'the parent hash key' else 'the start of the line where the left square bracket is' end end
#brace_alignment_style (private)
[ GitHub ]# File 'lib/rubocop/cop/layout/first_array_element_indentation.rb', line 125
def brace_alignment_style :align_brackets end
#check(array_node, left_parenthesis) (private)
[ GitHub ]# File 'lib/rubocop/cop/layout/first_array_element_indentation.rb', line 129
def check(array_node, left_parenthesis) return if ignored_node?(array_node) left_bracket = array_node.loc.begin first_elem = array_node.values.first if first_elem return if same_line?(first_elem, left_bracket) check_first(first_elem, left_bracket, left_parenthesis, 0) end check_right_bracket(array_node.loc.end, first_elem, left_bracket, left_parenthesis) end
#check_right_bracket(right_bracket, first_elem, left_bracket, left_parenthesis) (private)
[ GitHub ]# File 'lib/rubocop/cop/layout/first_array_element_indentation.rb', line 143
def check_right_bracket(right_bracket, first_elem, left_bracket, left_parenthesis) # if the right bracket is on the same line as the last value, accept return if /\S/.match?(right_bracket.source_line[0...right_bracket.column]) expected_column, indent_base_type = indent_base(left_bracket, first_elem, left_parenthesis) @column_delta = expected_column - right_bracket.column return if @column_delta.zero? msg = (indent_base_type) add_offense(right_bracket, message: msg) do |corrector| autocorrect(corrector, right_bracket) end end
#message(base_description) (private)
[ GitHub ]# File 'lib/rubocop/cop/layout/first_array_element_indentation.rb', line 172
def (base_description) format( MSG, configured_indentation_width: configured_indentation_width, base_description: base_description ) end
#message_for_right_bracket(indent_base_type) (private)
[ GitHub ]# File 'lib/rubocop/cop/layout/first_array_element_indentation.rb', line 180
def (indent_base_type) case indent_base_type when :left_brace_or_bracket 'Indent the right bracket the same as the left bracket.' when :first_column_after_left_parenthesis 'Indent the right bracket the same as the first position ' \ 'after the preceding left parenthesis.' when :parent_hash_key 'Indent the right bracket the same as the parent hash key.' else 'Indent the right bracket the same as the start of the line ' \ 'where the left bracket is.' end end
#on_array(node)
[ GitHub ]# File 'lib/rubocop/cop/layout/first_array_element_indentation.rb', line 91
def on_array(node) return unless node.loc.begin return if autocorrect_incompatible_with_other_cops?(node, nil) check(node, nil) end
#on_csend(node)
Alias for #on_send.
# File 'lib/rubocop/cop/layout/first_array_element_indentation.rb', line 105
alias on_csend on_send
#on_send(node) Also known as: #on_csend
[ GitHub ]# File 'lib/rubocop/cop/layout/first_array_element_indentation.rb', line 98
def on_send(node) each_argument_node(node, :array) do |array_node, left_parenthesis| next if autocorrect_incompatible_with_other_cops?(array_node, left_parenthesis) check(array_node, left_parenthesis) end end