Class: Shirobai::Cop::Layout::FirstArgumentIndentation

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/first_argument_indentation.rb

Overview

Drop-in Rust reimplementation of Layout/FirstArgumentIndentation.

Rust parses the source, walks every method call with arguments, decides the alignment base for the configured EnforcedStyle, and returns the first argument as an offense range plus its column_delta, the message, the within? autocorrect flag and the range to realign (which for special_for_inner_method_call_in_parentheses may be the whole receiver chain). Ruby supplies the flattened config and applies the realignment via AlignmentCorrector (the same division of labour as the other alignment cops). Offenses come from the per-file bundled run (Shirobai::Dispatch); the config derivation is purely config-driven, so this cop is always bundle-eligible.

Constant Summary collapse

STYLES =
{
  "special_for_inner_method_call_in_parentheses" => 0,
  "consistent" => 1,
  "consistent_relative_to_receiver" => 2,
  "special_for_inner_method_call" => 3
}.freeze

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.badgeObject



31
# File 'lib/shirobai/cop/layout/first_argument_indentation.rb', line 31

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

.bundle_args(config) ⇒ Object

Packed args for the bundled run: [style, indentation_width, enforce_fixed_with_no_line_break]. The enforce flag replicates the instance derivation: Layout/ArgumentAlignment enforcing with_fixed_indentation while Layout/FirstMethodArgumentLineBreak is disabled.



38
39
40
41
42
43
44
45
46
47
48
# File 'lib/shirobai/cop/layout/first_argument_indentation.rb', line 38

def self.bundle_args(config)
  cop_config = config.for_badge(badge)
  argument_alignment_config = config.for_enabled_cop("Layout/ArgumentAlignment")
  enforce = argument_alignment_config["EnforcedStyle"] == "with_fixed_indentation" &&
            !config.cop_enabled?("Layout/FirstMethodArgumentLineBreak")
  [
    STYLES.fetch(cop_config["EnforcedStyle"], 0),
    cop_config["IndentationWidth"] || config.for_cop("Layout/IndentationWidth")["Width"] || 2,
    enforce
  ]
end

.cop_nameObject



30
# File 'lib/shirobai/cop/layout/first_argument_indentation.rb', line 30

def self.cop_name = "Layout/FirstArgumentIndentation"

Instance Method Details

#on_new_investigationObject



50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/shirobai/cop/layout/first_argument_indentation.rb', line 50

def on_new_investigation
  buffer = processed_source.buffer

  offenses = Dispatch.offenses_for(processed_source, config, :first_argument_indentation)
  off = SourceOffsets.for(processed_source.raw_source)
  offenses.each do |start, fin, column_delta, message, autocorrect, cs, ce|
    range = Parser::Source::Range.new(buffer, off[start], off[fin])
    # Key the split on the per-offense flag, not `autocorrect?` mode: the
    # block runs in lint mode too and the non-empty corrector is what
    # keeps the offense correctable to match stock (see argument_alignment).
    unless autocorrect
      add_offense(range, message: message)
      next
    end

    add_offense(range, message: message) do |corrector|
      correct_range = Parser::Source::Range.new(buffer, off[cs], off[ce])
      RuboCop::Cop::AlignmentCorrector.correct(
        corrector, processed_source, correct_range, column_delta
      )
    end
  end
end