Class: Shirobai::Cop::Layout::IndentationConsistency

Inherits:
RuboCop::Cop::Base
  • Object
show all
Extended by:
RuboCop::Cop::AutoCorrector
Includes:
RuboCop::Cop::Alignment, RuboCop::Cop::ConfigurableEnforcedStyle
Defined in:
lib/shirobai/cop/layout/indentation_consistency.rb

Overview

Drop-in Rust reimplementation of Layout/IndentationConsistency.

Rust walks the AST, reproduces the stock cop's on_begin / on_kwbegin over every multi-statement group (a parser-gem begin / kwbegin), runs check_alignment (base column from the first child or base_column_for_normal_style, sections split by private / protected in indented_internal_methods style) and returns, per offending child, its range, the column_delta and whether it is autocorrectable (false when the child's range is within? an already-registered offense in the same pass — @current_offenses). Ruby applies the realignment via AlignmentCorrector, the same division of labour as the other indentation cops. Offenses come from the per-file bundled run (Shirobai::Dispatch); the autocorrect re-passes go through the standalone entry point.

Constant Summary collapse

MSG =
"Inconsistent indentation detected."

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.badgeObject



28
# File 'lib/shirobai/cop/layout/indentation_consistency.rb', line 28

def self.badge = RuboCop::Cop::Badge.parse("Layout/IndentationConsistency")

.bundle_args(config) ⇒ Object

Packed args for the bundled run: [indented_internal_methods].



31
32
33
34
# File 'lib/shirobai/cop/layout/indentation_consistency.rb', line 31

def self.bundle_args(config)
  cop_config = config.for_badge(badge)
  [(cop_config["EnforcedStyle"] || "normal") == "indented_internal_methods" ? 1 : 0]
end

.cop_nameObject



27
# File 'lib/shirobai/cop/layout/indentation_consistency.rb', line 27

def self.cop_name = "Layout/IndentationConsistency"

Instance Method Details

#on_new_investigationObject



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/shirobai/cop/layout/indentation_consistency.rb', line 36

def on_new_investigation
  buffer = processed_source.buffer
  off = SourceOffsets.for(processed_source.raw_source)

  offenses_for_source.each do |start, fin, column_delta, autocorrect|
    range = Parser::Source::Range.new(buffer, off[start], off[fin])
    # Always pass a block so the offense is correctable, matching stock:
    # the Alignment mixin's `register_offense` always hands `add_offense`
    # a block, even for the `within?` case (`autocorrect: false`). A
    # blockless `add_offense` would mark the offense uncorrectable. When
    # `autocorrect` is false (the offense is nested in an already-corrected
    # range) the block returns early, leaving an empty (no-op) corrector,
    # so the offense stays correctable but is not rewritten this pass.
    add_offense(range, message: MSG) do |corrector|
      next unless autocorrect

      node = node_at(off[start], off[fin])
      target = node || range
      RuboCop::Cop::AlignmentCorrector.correct(
        corrector, processed_source, target, column_delta
      )
    end
  end
end