Class: Shirobai::Cop::Layout::AccessModifierIndentation
- Inherits:
-
RuboCop::Cop::Base
- Object
- RuboCop::Cop::Base
- Shirobai::Cop::Layout::AccessModifierIndentation
- Extended by:
- RuboCop::Cop::AutoCorrector
- Includes:
- RuboCop::Cop::ConfigurableEnforcedStyle
- Defined in:
- lib/shirobai/cop/layout/access_modifier_indentation.rb
Overview
Drop-in Rust reimplementation of ‘Layout/AccessModifierIndentation`.
Rust walks the AST once, reproducing stock’s ‘on_class` / `on_sclass` / `on_module` / `on_block` alias chain: for every class-like / block node, look at the body and — when it is a parser-`(begin …)` (>= 2 statements; prism’s single-statement ‘StatementsNode` mirrors stock’s bare body so we skip it) — inspect each direct child ‘send` that is a `bare_access_modifier?` (no receiver / no arguments / no block, name in `protected, private, module_function`). Same-line modifiers (`same_line?(node, modifier)`) are skipped, exactly like stock. For each kept modifier Rust returns `column_delta = expected - actual` (matching stock’s ‘@column_delta` in `column_offset_between(modifier.source_range, node.loc.end)`); the wrapper either fires `correct_style_detected` (delta zero) or registers the offense and shifts the modifier’s line by ‘column_delta` (mirroring stock’s ‘AlignmentCorrector.correct(corrector, processed_source, node, column_delta)` for a one-line node, which simply inserts or removes leading whitespace).
Stock’s ‘AlignmentCorrector.correct` reads `processed_source.config` (for `using_tabs?`); a faithful drop-in does the same — autocorrect is skipped entirely under `Layout/IndentationStyle: tabs`, just like stock.
Offenses come from the per-file bundled run (‘Shirobai::Dispatch`); the behaviour is purely config-driven (`EnforcedStyle` + a per-cop or global `IndentationWidth`), so this cop is always bundle eligible.
Constant Summary collapse
- STYLE_TO_U8 =
{ indent: 0, outdent: 1 }.freeze
Class Method Summary collapse
- .badge ⇒ Object
-
.bundle_args(config) ⇒ Object
Packed args for the bundled run: ‘[style, indentation_width]`.
- .cop_name ⇒ Object
Instance Method Summary collapse
Class Method Details
.badge ⇒ Object
40 |
# File 'lib/shirobai/cop/layout/access_modifier_indentation.rb', line 40 def self.badge = RuboCop::Cop::Badge.parse(cop_name) |
.bundle_args(config) ⇒ Object
Packed args for the bundled run: ‘[style, indentation_width]`. `indentation_width` mirrors `Alignment#configured_indentation_width` — the cop’s own ‘IndentationWidth` if set, else `Layout/IndentationWidth`’s ‘Width`, else 2.
46 47 48 49 50 51 52 53 |
# File 'lib/shirobai/cop/layout/access_modifier_indentation.rb', line 46 def self.bundle_args(config) own = config.for_badge(badge) style = STYLE_TO_U8.fetch((own["EnforcedStyle"] || "indent").to_sym, 0) width = own["IndentationWidth"] || config.for_cop("Layout/IndentationWidth")["Width"] || 2 [style, width] end |
.cop_name ⇒ Object
39 |
# File 'lib/shirobai/cop/layout/access_modifier_indentation.rb', line 39 def self.cop_name = "Layout/AccessModifierIndentation" |
Instance Method Details
#on_new_investigation ⇒ Object
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
# File 'lib/shirobai/cop/layout/access_modifier_indentation.rb', line 55 def on_new_investigation buffer = processed_source.buffer off = SourceOffsets.for(processed_source.raw_source) records_for_source.each do |start, fin, , column_delta| send_range = Parser::Source::Range.new(buffer, off[start], off[fin]) if column_delta.zero? correct_style_detected next end add_offense(send_range, message: ) do |corrector| # Delegate to stock's `AlignmentCorrector.correct`. It reads # `processed_source.config` for tab-style detection and string / # block-comment range avoidance; for a single-line modifier # those checks fall through to a single `each_line` iteration # that just inserts or removes leading whitespace. Passing the # `Parser::Source::Range` directly avoids needing the actual # AST node — stock's implementation accepts either (`node # .respond_to?(:loc) ? node.source_range : node`). RuboCop::Cop::AlignmentCorrector.correct( corrector, processed_source, send_range, column_delta ) opposite_or_unrecognized_style(column_delta) end end end |