Class: Shirobai::Cop::Layout::IndentationWidth
- Inherits:
-
RuboCop::Cop::Base
- Object
- RuboCop::Cop::Base
- Shirobai::Cop::Layout::IndentationWidth
- Extended by:
- RuboCop::Cop::AutoCorrector
- Includes:
- RuboCop::Cop::AllowedPattern, RuboCop::Cop::ConfigurableEnforcedStyle
- Defined in:
- lib/shirobai/cop/layout/indentation_width.rb
Overview
Drop-in Rust reimplementation of Layout/IndentationWidth.
Rust walks the AST, decides the base location for every indentable body
(def/class/module/if/case/while/for/block/rescue/ensure/begin), computes
column_offset_between(body, base) and the resulting column_delta, and
returns the offense range, the message, the within? autocorrect flag
and the node range to realign. Ruby supplies the flattened config (and
the AllowedPatterns-matched line numbers, since regex matching stays in
Ruby) and 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) while bundle_eligible?
holds; otherwise the standalone call carries the per-investigation
state (allowed lines / accumulated correction ranges).
Class Method Summary collapse
- .badge ⇒ Object
-
.bundle_args(config) ⇒ Object
Packed args for the bundled run: the 7-element config vector
Shirobai.check_indentation_widthreceives (width / align-with / access-modifier outdent / indented internal methods / end alignment / def-end alignment / tabs). - .cop_name ⇒ Object
Instance Method Summary collapse
Class Method Details
.badge ⇒ Object
25 |
# File 'lib/shirobai/cop/layout/indentation_width.rb', line 25 def self.badge = RuboCop::Cop::Badge.parse("Layout/IndentationWidth") |
.bundle_args(config) ⇒ Object
Packed args for the bundled run: the 7-element config vector
Shirobai.check_indentation_width receives (width / align-with /
access-modifier outdent / indented internal methods / end alignment /
def-end alignment / tabs).
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
# File 'lib/shirobai/cop/layout/indentation_width.rb', line 31 def self.bundle_args(config) cop_config = config.for_badge(badge) end_config = config.for_cop("Layout/EndAlignment") end_align = case end_config["EnforcedStyleAlignWith"] || "keyword" when "variable" then 1 when "start_of_line" then 2 else 0 end def_end_config = config.for_cop("Layout/DefEndAlignment") [ cop_config["Width"] || 2, cop_config["EnforcedStyleAlignWith"] == "relative_to_receiver" ? 1 : 0, config.for_cop("Layout/AccessModifierIndentation")["EnforcedStyle"] == "outdent" ? 1 : 0, config.for_cop("Layout/IndentationConsistency")["EnforcedStyle"] == "indented_internal_methods" ? 1 : 0, end_align, (def_end_config["EnforcedStyleAlignWith"] || "start_of_line") == "def" ? 1 : 0, (config.for_cop("Layout/IndentationStyle")["EnforcedStyle"] || "spaces") == "tabs" ? 1 : 0 ] end |
.cop_name ⇒ Object
24 |
# File 'lib/shirobai/cop/layout/indentation_width.rb', line 24 def self.cop_name = "Layout/IndentationWidth" |
Instance Method Details
#on_new_investigation ⇒ Object
51 52 53 54 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/indentation_width.rb', line 51 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, cs, ce| # Mirror `other_offense_in_same_range?`: the cop instance accumulates # correction ranges across autocorrect iterations so a correction # nested in an already-corrected range is reported but not corrected. # These go BACK to Rust (`check_indentation_width` prior ranges), so # they stay BYTE offsets — only the Ruby-side ranges get converted. @offense_ranges << [cs, ce] if autocorrect 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: ) next end add_offense(range, message: ) do |corrector| node = node_at(off[cs], off[ce]) target = node || Parser::Source::Range.new(buffer, off[cs], off[ce]) RuboCop::Cop::AlignmentCorrector.correct( corrector, processed_source, target, column_delta ) end end end |