Class: RuboCop::Cop::Layout::FirstHashElementIndentation
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_hash_element_indentation.rb |
Overview
Checks the indentation of the first key in a hash literal where the opening brace and the first key are on separate lines. The other keys' indentations are handled by the HashAlignment cop.
By default, Hash literals that are arguments in a method call with parentheses, and where the opening curly brace of the hash is on the same line as the opening parenthesis of the method call, shall have their first key indented one step (two spaces) more than the position inside the opening parenthesis.
Other hash literals shall have their first key indented one step more than the start of the line where the opening curly brace is.
This default style is called 'special_inside_parentheses'. Alternative styles are 'consistent' and 'align_braces'. Here are examples:
Constant Summary
-
MSG =
# File 'lib/rubocop/cop/layout/first_hash_element_indentation.rb', line 119'Use %<configured_indentation_width>d spaces for indentation ' \ 'in a hash, relative to %<base_description>s.'
::RuboCop::Cop::Base
- Inherited
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 |
::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
::RuboCop::Cop::AutocorrectLogic
- Included
Instance Method Summary
-
#on_csend(node)
Alias for #on_send.
- #on_hash(node)
- #on_send(node) (also: #on_csend)
- #autocorrect(corrector, node) private
-
#base_description(indent_base_type)
private
Returns the description of what the correct indentation is based on.
- #brace_alignment_style private
- #check(hash_node, left_parenthesis) private
- #check_based_on_longest_key(hash_node, left_brace, left_parenthesis) private
- #check_right_brace(right_brace, first_pair, left_brace, left_parenthesis) private
- #message(base_description) private
- #message_for_right_brace(indent_base_type) private
- #separator_style?(first_pair) ⇒ Boolean 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, | |
#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, #current_corrector, | |
#current_offense_locations | Reserved for Commissioner: |
#current_offenses, #currently_disabled_lines, #custom_severity, #default_severity, #disable_uncorrectable, #enabled_line?, #file_name_matches_any?, #find_message, #find_severity, #range_for_original, #range_from_node_or_range, | |
#reset_investigation | Actually private methods. |
#use_corrector |
::RuboCop::Cop::AutocorrectLogic
- Included
#disable_offense, #disable_offense_at_end_of_line, #disable_offense_before_and_after, #disable_offense_with_eol_or_surround_comment, #heredoc_range, #max_line_length, #multiline_ranges, #multiline_string?, | |
#range_by_lines | Expand the given range to include all of any lines it covers. |
#range_of_first_line, #range_overlaps_offense?, #string_continuation?, #surrounding_heredoc?, #surrounding_percent_array? |
::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_hash_element_indentation.rb', line 227
def enforce_first_argument_with_fixed_indentation? argument_alignment_config = config.for_enabled_cop('Layout/ArgumentAlignment') argument_alignment_config['EnforcedStyle'] == 'with_fixed_indentation' end
Instance Method Details
#autocorrect(corrector, node) (private)
[ GitHub ]# File 'lib/rubocop/cop/layout/first_hash_element_indentation.rb', line 137
def autocorrect(corrector, node) AlignmentCorrector.correct(corrector, processed_source, node, @column_delta) end
#base_description(indent_base_type) (private)
Returns the description of what the correct indentation is based on.
# File 'lib/rubocop/cop/layout/first_hash_element_indentation.rb', line 191
def base_description(indent_base_type) case indent_base_type when :left_brace_or_bracket 'the position of the opening brace' 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 curly brace is' end end
#brace_alignment_style (private)
[ GitHub ]# File 'lib/rubocop/cop/layout/first_hash_element_indentation.rb', line 141
def brace_alignment_style :align_braces end
#check(hash_node, left_parenthesis) (private)
[ GitHub ]# File 'lib/rubocop/cop/layout/first_hash_element_indentation.rb', line 145
def check(hash_node, left_parenthesis) return if ignored_node?(hash_node) left_brace = hash_node.loc.begin first_pair = hash_node.pairs.first if first_pair return if same_line?(first_pair, left_brace) if separator_style?(first_pair) check_based_on_longest_key(hash_node, left_brace, left_parenthesis) else check_first(first_pair, left_brace, left_parenthesis, 0) end end check_right_brace(hash_node.loc.end, first_pair, left_brace, left_parenthesis) end
#check_based_on_longest_key(hash_node, left_brace, left_parenthesis) (private)
[ GitHub ]# File 'lib/rubocop/cop/layout/first_hash_element_indentation.rb', line 184
def check_based_on_longest_key(hash_node, left_brace, left_parenthesis) key_lengths = hash_node.keys.map { |key| key.source_range.length } check_first(hash_node.pairs.first, left_brace, left_parenthesis, key_lengths.max - key_lengths.first) end
#check_right_brace(right_brace, first_pair, left_brace, left_parenthesis) (private)
[ GitHub ]# File 'lib/rubocop/cop/layout/first_hash_element_indentation.rb', line 164
def check_right_brace(right_brace, first_pair, left_brace, left_parenthesis) # if the right brace is on the same line as the last value, accept return if /\S/.match?(right_brace.source_line[0...right_brace.column]) expected_column, indent_base_type = indent_base(left_brace, first_pair, left_parenthesis) @column_delta = expected_column - right_brace.column return if @column_delta.zero? = (indent_base_type) add_offense(right_brace, message: ) do |corrector| autocorrect(corrector, right_brace) end end
#message(base_description) (private)
[ GitHub ]# File 'lib/rubocop/cop/layout/first_hash_element_indentation.rb', line 204
def (base_description) format( MSG, configured_indentation_width: configured_indentation_width, base_description: base_description ) end
#message_for_right_brace(indent_base_type) (private)
[ GitHub ]# File 'lib/rubocop/cop/layout/first_hash_element_indentation.rb', line 212
def (indent_base_type) case indent_base_type when :left_brace_or_bracket 'Indent the right brace the same as the left brace.' when :first_column_after_left_parenthesis 'Indent the right brace the same as the first position ' \ 'after the preceding left parenthesis.' when :parent_hash_key 'Indent the right brace the same as the parent hash key.' else 'Indent the right brace the same as the start of the line ' \ 'where the left brace is.' end end
#on_csend(node)
Alias for #on_send.
# File 'lib/rubocop/cop/layout/first_hash_element_indentation.rb', line 133
alias on_csend on_send
#on_hash(node)
[ GitHub ]# File 'lib/rubocop/cop/layout/first_hash_element_indentation.rb', line 122
def on_hash(node) check(node, nil) if node.loc.begin end
#on_send(node) Also known as: #on_csend
[ GitHub ]# File 'lib/rubocop/cop/layout/first_hash_element_indentation.rb', line 126
def on_send(node) return if enforce_first_argument_with_fixed_indentation? each_argument_node(node, :hash) do |hash_node, left_parenthesis| check(hash_node, left_parenthesis) end end
#separator_style?(first_pair) ⇒ Boolean
(private)
# File 'lib/rubocop/cop/layout/first_hash_element_indentation.rb', line 178
def separator_style?(first_pair) separator = first_pair.loc.operator key = "Enforced#{separator.is?(':') ? 'Colon' : 'HashRocket'}Style" config.for_cop('Layout/HashAlignment')[key] == 'separator' end