Class: Shirobai::Cop::Style::StringLiterals
- Inherits:
-
RuboCop::Cop::Base
- Object
- RuboCop::Cop::Base
- Shirobai::Cop::Style::StringLiterals
- Extended by:
- RuboCop::Cop::AutoCorrector
- Includes:
- RuboCop::Cop::ConfigurableEnforcedStyle, RuboCop::Cop::Util
- Defined in:
- lib/shirobai/cop/style/string_literals.rb
Overview
Drop-in Rust reimplementation of Style/StringLiterals.
Rust walks every string literal once, replicating stock's two callbacks:
StringHelp#on_str (the per-:str quote check, with the begin-loc /
heredoc / ignored-node / interpolation guards and the
correct_style_detected markers) and StringLiterals#on_dstr (the
ConsistentQuotesInMultiline multi-line continued-string handling, whose
autocorrect is a stock no-op). For each record it returns, in walk order,
whether it offends, the caret range, the message selector, the detection
marker to replay, and — for an on_str offense — which autocorrect to
apply (single / double) plus the decoded string content.
The replacement text is computed here with stock's genuine
RuboCop::Cop::Util helpers (to_string_literal / String#inspect),
because the quote conversion and escape handling are Ruby string
semantics; the detection markers are replayed through the genuine
ConfigurableEnforcedStyle methods so config_to_allow_offenses matches
stock exactly.
Always bundle-eligible: the result is purely config-driven.
Constant Summary collapse
- MSG_SINGLE =
"Prefer single-quoted strings when you don't need string " \ "interpolation or special symbols."
- MSG_DOUBLE =
"Prefer double-quoted strings unless you need single quotes to " \ "avoid extra backslashes for escaping."
- MSG_INCONSISTENT =
"Inconsistent quote style."- MESSAGES =
[MSG_SINGLE, MSG_DOUBLE, MSG_INCONSISTENT].freeze
- STYLES =
{ "single_quotes" => 0, "double_quotes" => 1 }.freeze
- FIX_SINGLE =
Fix kinds (mirror
string_literals.rs). 0- FIX_DOUBLE =
1- FIX_NONE =
2
Class Method Summary collapse
- .badge ⇒ Object
-
.bundle_args(config) ⇒ Object
Packed config nums:
[style, consistent_multiline]. - .cop_name ⇒ Object
Instance Method Summary collapse
Class Method Details
.badge ⇒ Object
49 |
# File 'lib/shirobai/cop/style/string_literals.rb', line 49 def self.badge = RuboCop::Cop::Badge.parse("Style/StringLiterals") |
.bundle_args(config) ⇒ Object
Packed config nums: [style, consistent_multiline].
52 53 54 55 56 57 58 59 60 |
# File 'lib/shirobai/cop/style/string_literals.rb', line 52 def self.bundle_args(config) cop_config = config.for_badge(badge) # An unrecognized `EnforcedStyle` defaults to single here; the genuine # error is raised by the `style` accessor in `on_new_investigation`. [[ STYLES.fetch(cop_config["EnforcedStyle"] || "single_quotes", 0), cop_config["ConsistentQuotesInMultiline"] ? 1 : 0 ]] end |
.cop_name ⇒ Object
48 |
# File 'lib/shirobai/cop/style/string_literals.rb', line 48 def self.cop_name = "Style/StringLiterals" |
Instance Method Details
#alternative_style ⇒ Object
86 87 88 89 90 91 92 93 |
# File 'lib/shirobai/cop/style/string_literals.rb', line 86 def alternative_style case style when :single_quotes :double_quotes else :single_quotes end end |
#on_new_investigation ⇒ Object
62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
# File 'lib/shirobai/cop/style/string_literals.rb', line 62 def on_new_investigation # Validate `EnforcedStyle` through the genuine accessor first: stock # raises `RuntimeError` for an unrecognized style, and this must fire # before we derive the bundle config (which would otherwise raise a # `KeyError` for the unknown key). style buffer = processed_source.buffer off = SourceOffsets.for(processed_source.raw_source) resolved_result.each do |is_offense, start, fin, , detect, fix, content| unless is_offense replay_detection(detect) next end range = Parser::Source::Range.new(buffer, off[start], off[fin]) add_offense(range, message: MESSAGES[]) do |corrector| apply_fix(corrector, range, fix, content) replay_detection(detect) end end end |