Class: Shirobai::Cop::Layout::DefEndAlignment
- Inherits:
-
RuboCop::Cop::Base
- Object
- RuboCop::Cop::Base
- Shirobai::Cop::Layout::DefEndAlignment
- Extended by:
- RuboCop::Cop::AutoCorrector
- Includes:
- RuboCop::Cop::ConfigurableEnforcedStyle, RuboCop::Cop::RangeHelp
- Defined in:
- lib/shirobai/cop/layout/def_end_alignment.rb
Overview
Drop-in Rust reimplementation of Layout/DefEndAlignment.
Rust walks the AST once, reproducing stock's callback dispatch: on_def
/ on_defs check a bare definition's end against the configured style
(the def keyword), while on_send handles a def_modifier? send
(private def foo) — there both styles are available (def = the def
keyword, start_of_line = the private def prefix) and the inner def is
ignore_noded so its own callback is a no-op. Per checked end it
returns the matched styles (for config_to_allow_offenses parity) and,
when the configured style is not matched, the offense message and the
autocorrect target column.
This wrapper replays stock's check_end_kw_alignment decisions in walk
order: correct_style_detected when the configured style already
matches, otherwise add_offense plus style_detected(matched styles).
The autocorrect mirrors AlignmentCorrector#align_end: replace the
whitespace before end with the target indentation, or (when something
non-space precedes end) insert a newline + indentation after it. The
alignment column comes from Rust (it already encodes the node vs
node.parent anchor choice for start_of_line).
Offenses come from the per-file bundled run (Shirobai::Dispatch); the
style is purely config-driven, so this cop is always bundle eligible.
Constant Summary collapse
- STYLE_TO_U8 =
{ start_of_line: 0, def: 1 }.freeze
- U8_TO_STYLE =
STYLE_TO_U8.invert.freeze
Class Method Summary collapse
- .badge ⇒ Object
-
.bundle_args(config) ⇒ Object
Packed args for the bundled run:
[style]. - .cop_name ⇒ Object
Instance Method Summary collapse
- #on_new_investigation ⇒ Object
-
#style_parameter_name ⇒ Object
EndKeywordAlignmentkeys its style offEnforcedStyleAlignWith.
Class Method Details
.badge ⇒ Object
38 |
# File 'lib/shirobai/cop/layout/def_end_alignment.rb', line 38 def self.badge = RuboCop::Cop::Badge.parse(cop_name) |
.bundle_args(config) ⇒ Object
Packed args for the bundled run: [style]. EnforcedStyleAlignWith
defaults to start_of_line (0) when the config does not mention it.
42 43 44 45 |
# File 'lib/shirobai/cop/layout/def_end_alignment.rb', line 42 def self.bundle_args(config) align = config.for_badge(badge)["EnforcedStyleAlignWith"] [STYLE_TO_U8.fetch((align || "start_of_line").to_sym, 0)] end |
.cop_name ⇒ Object
37 |
# File 'lib/shirobai/cop/layout/def_end_alignment.rb', line 37 def self.cop_name = "Layout/DefEndAlignment" |
Instance Method Details
#on_new_investigation ⇒ Object
47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
# File 'lib/shirobai/cop/layout/def_end_alignment.rb', line 47 def on_new_investigation buffer = processed_source.buffer off = SourceOffsets.for(processed_source.raw_source) style_bit = STYLE_TO_U8.fetch(style) records_for_source.each do |end_start, end_end, matching, , align_column| if matching.include?(style_bit) correct_style_detected next end end_range = Parser::Source::Range.new(buffer, off[end_start], off[end_end]) add_offense(end_range, message: ) do |corrector| align_end(corrector, buffer, off, end_range, align_column) end style_detected(matching.map { |bit| U8_TO_STYLE.fetch(bit) }) end end |
#style_parameter_name ⇒ Object
EndKeywordAlignment keys its style off EnforcedStyleAlignWith.
67 68 69 |
# File 'lib/shirobai/cop/layout/def_end_alignment.rb', line 67 def style_parameter_name "EnforcedStyleAlignWith" end |