Class: RuboCop::Cop::Style::IndentationWidth
- Includes:
- AccessModifierNode, AutocorrectAlignment, CheckAssignment, EndKeywordAlignment, IfNode, OnMethodDef
- Defined in:
- lib/rubocop/cop/style/indentation_width.rb
Overview
This cops checks for indentation that doesn’t use two spaces.
Constant Summary
Constants included from AccessModifierNode
AccessModifierNode::MODULE_FUNCTION_NODE, AccessModifierNode::PRIVATE_NODE, AccessModifierNode::PROTECTED_NODE, AccessModifierNode::PUBLIC_NODE
Constants included from AutocorrectAlignment
Constants included from EndKeywordAlignment
Constants included from Util
Util::ASGN_NODES, Util::BYTE_ORDER_MARK, Util::EQUALS_ASGN_NODES, Util::LITERAL_REGEX, Util::OPERATOR_METHODS, Util::SHORTHAND_ASGN_NODES
Instance Attribute Summary
Attributes inherited from Cop
#config, #corrections, #offenses, #processed_source
Instance Method Summary collapse
- #check_members(node, members) ⇒ Object
- #on_block(node) ⇒ Object
- #on_case(node) ⇒ Object
- #on_class(node) ⇒ Object
- #on_ensure(node) ⇒ Object
- #on_for(node) ⇒ Object
- #on_if(node, base = node) ⇒ Object
- #on_kwbegin(node) ⇒ Object
- #on_method_def(node, _method_name, _args, body) ⇒ Object
- #on_module(node) ⇒ Object
- #on_rescue(node) ⇒ Object
- #on_send(node) ⇒ Object
- #on_while(node, base = node) ⇒ Object (also: #on_until)
Methods included from AccessModifierNode
#class_or_module_parent?, #modifier_node?, #modifier_structure?
Methods included from Sexp
Methods included from IfNode
#elsif?, #if_else?, #if_node_parts, #modifier_if?, #ternary?
Methods included from CheckAssignment
Methods included from OnMethodDef
Methods included from AutocorrectAlignment
#autocorrect, #check_alignment, #display_column, #indentation, #offset
Methods included from ConfigurableEnforcedStyle
#alternative_style, #ambiguous_style_detected, #correct_style_detected, #detected_style, #detected_style=, #no_acceptable_style!, #no_acceptable_style?, #opposite_style_detected, #parameter_name, #style, #style_detected, #supported_styles, #unexpected_style_detected
Methods inherited from Cop
#add_offense, all, #config_to_allow_offenses, #config_to_allow_offenses=, #cop_config, #cop_name, cop_name, cop_type, #correct, #debug?, #details, #display_cop_names?, #display_style_guide?, #excluded_file?, #extra_details?, #highlights, inherited, #initialize, #join_force?, lint?, match?, #message, #messages, non_rails, #parse, qualified_cop_name, #reference_url, #relevant_file?, #style_guide_url, #target_ruby_version
Methods included from NodePattern::Macros
#def_node_matcher, #def_node_search, #node_search_body
Methods included from AutocorrectLogic
#autocorrect?, #autocorrect_enabled?, #autocorrect_requested?, #support_autocorrect?
Methods included from IgnoredNode
#ignore_node, #ignored_node?, #part_of_ignored_node?
Methods included from Util
begins_its_line?, block_length, comment_line?, directions, double_quotes_acceptable?, double_quotes_required?, effective_column, ends_its_line?, escape_string, first_part_of_call_chain, interpret_string_escapes, line_range, move_pos, needs_escaping?, numeric_range_size, on_node, operator?, parentheses?, parenthesized_call?, range_with_surrounding_comma, range_with_surrounding_space, source_range, strip_quotes, to_string_literal, to_symbol_literal, within_node?
Methods included from PathUtil
absolute?, match_path?, relative_path
Constructor Details
This class inherits a constructor from RuboCop::Cop::Cop
Instance Method Details
#check_members(node, members) ⇒ Object
64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
# File 'lib/rubocop/cop/style/indentation_width.rb', line 64 def check_members(node, members) check_indentation(node.loc.keyword, members.first) return unless members.any? && members.first.begin_type? style = config.for_cop('Style/IndentationConsistency')['EnforcedStyle'] return unless style == 'rails' special = %w(protected private) # Extra indentation step after these. previous_modifier = nil members.first.children.each do |m| if modifier_node?(m) && special.include?(m.source) previous_modifier = m elsif previous_modifier check_indentation(previous_modifier.source_range, m, style) previous_modifier = nil end end end |
#on_block(node) ⇒ Object
45 46 47 48 49 50 51 52 |
# File 'lib/rubocop/cop/style/indentation_width.rb', line 45 def on_block(node) _method, _args, body = *node # Check body against end/} indentation. Checking against variable # assignments, etc, would be more difficult. The end/} must be at the # beginning of its line. loc = node.loc check_indentation(loc.end, body) if begins_its_line?(loc.end) end |
#on_case(node) ⇒ Object
120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 |
# File 'lib/rubocop/cop/style/indentation_width.rb', line 120 def on_case(node) _condition, *branches = *node latest_when = nil branches.compact.each do |b| if b.type == :when # TODO: Revert to the original expression once the fix in Rubinius # is released. # # Originally this expression was: # # *_conditions, body = *b # # However it fails on Rubinius 2.2.9 due to its bug: # # RuntimeError: # can't modify frozen instance of Array # # kernel/common/array.rb:988:in `pop' # # ./lib/rubocop/cop/style/indentation_width.rb:99:in `on_case' # # It seems to be fixed on the current master (0a92c3c). body = b.children.last # Check "when" body against "when" keyword indentation. check_indentation(b.loc.keyword, body) latest_when = b else # Since it's not easy to get the position of the "else" keyword, # we check "else" body against latest "when" keyword indentation. check_indentation(latest_when.loc.keyword, b) end end end |
#on_class(node) ⇒ Object
59 60 61 62 |
# File 'lib/rubocop/cop/style/indentation_width.rb', line 59 def on_class(node) _class_name, _base_class, *members = *node check_members(node, members) end |
#on_ensure(node) ⇒ Object
33 34 35 36 |
# File 'lib/rubocop/cop/style/indentation_width.rb', line 33 def on_ensure(node) _body, ensure_body = *node check_indentation(node.loc.keyword, ensure_body) end |
#on_for(node) ⇒ Object
103 104 105 106 |
# File 'lib/rubocop/cop/style/indentation_width.rb', line 103 def on_for(node) _variable, _collection, body = *node check_indentation(node.loc.keyword, body) end |
#on_if(node, base = node) ⇒ Object
153 154 155 156 157 158 159 160 161 |
# File 'lib/rubocop/cop/style/indentation_width.rb', line 153 def on_if(node, base = node) return if ignored_node?(node) return if ternary?(node) return if modifier_if?(node) _condition, body, else_clause = if_node_parts(node) check_if(node, body, else_clause, base.loc) if body end |
#on_kwbegin(node) ⇒ Object
38 39 40 41 42 43 |
# File 'lib/rubocop/cop/style/indentation_width.rb', line 38 def on_kwbegin(node) # Check indentation against end keyword but only if it's first on its # line. return unless begins_its_line?(node.loc.end) check_indentation(node.loc.end, node.children.first) end |
#on_method_def(node, _method_name, _args, body) ⇒ Object
99 100 101 |
# File 'lib/rubocop/cop/style/indentation_width.rb', line 99 def on_method_def(node, _method_name, _args, body) check_indentation(node.loc.keyword, body) unless ignored_node?(node) end |
#on_module(node) ⇒ Object
54 55 56 57 |
# File 'lib/rubocop/cop/style/indentation_width.rb', line 54 def on_module(node) _module_name, *members = *node check_members(node, members) end |
#on_rescue(node) ⇒ Object
24 25 26 27 28 29 30 31 |
# File 'lib/rubocop/cop/style/indentation_width.rb', line 24 def on_rescue(node) _begin_node, *rescue_nodes, else_node = *node rescue_nodes.each do |rescue_node| _, _, body = *rescue_node check_indentation(rescue_node.loc.keyword, body) end check_indentation(node.loc.else, else_node) end |
#on_send(node) ⇒ Object
84 85 86 87 88 89 90 91 92 93 94 95 96 97 |
# File 'lib/rubocop/cop/style/indentation_width.rb', line 84 def on_send(node) super return unless modifier_and_def_on_same_line?(node) _, _, *args = *node *_, body = *args.first def_end_config = config.for_cop('Lint/DefEndAlignment') style = def_end_config['AlignWith'] || 'start_of_line' base = style == 'def' ? args.first : node check_indentation(base.source_range, body) ignore_node(args.first) end |
#on_while(node, base = node) ⇒ Object Also known as: on_until
108 109 110 111 112 113 114 115 116 |
# File 'lib/rubocop/cop/style/indentation_width.rb', line 108 def on_while(node, base = node) return if ignored_node?(node) _condition, body = *node return unless node.loc.keyword.begin_pos == node.source_range.begin_pos check_indentation(base.loc, body) end |