Class: Shirobai::Cop::Style::HashSyntax
- Inherits:
-
RuboCop::Cop::Base
- Object
- RuboCop::Cop::Base
- Shirobai::Cop::Style::HashSyntax
- Extended by:
- RuboCop::Cop::AutoCorrector
- Includes:
- RuboCop::Cop::ConfigurableEnforcedStyle
- Defined in:
- lib/shirobai/cop/style/hash_syntax.rb
Overview
Drop-in Rust reimplementation of Style/HashSyntax.
Rust walks every hash literal once, replicating stock's on_hash
(the EnforcedStyle check machinery for ruby19 / hash_rockets /
no_mixed_keys / ruby19_no_mixed_keys) and HashShorthandSyntax's
on_hash_for_mixed_shorthand (consistent / either_consistent) plus
on_pair (always / never). It returns, in walk order, one record per
offending pair (with the message selector and the exact corrector op
sequence) and one per non-offending pair under an EnforcedStyle check
(a correct_style_detected marker). The wrapper applies the ops verbatim
and replays the detection side effects through the genuine
ConfigurableEnforcedStyle methods so config_to_allow_offenses
matches stock exactly.
Symbol acceptability (acceptable_19_syntax_symbol?) is decided in Rust
by an ASCII byte port of stock's regexes (the gem's \w is ASCII-only
here, so non-ASCII symbol names never convert) — no Ruby-side regex.
Always bundle-eligible: the result is purely config-driven.
Constant Summary collapse
- MESSAGES =
[ "Use the new Ruby 1.9 hash syntax.", "Use hash rockets syntax.", "Don't mix styles in the same hash.", "Omit the hash value.", "Include the hash value.", "Do not mix explicit and implicit hash values. Omit the hash value.", "Do not mix explicit and implicit hash values. Include the hash value." ].freeze
- STYLES =
{ "ruby19" => 0, "hash_rockets" => 1, "no_mixed_keys" => 2, "ruby19_no_mixed_keys" => 3 }.freeze
- SHORTHAND =
{ "always" => 0, "never" => 1, "either" => 2, "consistent" => 3, "either_consistent" => 4 }.freeze
Class Method Summary collapse
- .badge ⇒ Object
-
.bundle_args(config) ⇒ Object
Packed config nums:
[style, shorthand, UseHashRocketsWithSymbolValues, PreferHashRocketsForNonAlnumEndingSymbols, ruby31_plus, ruby22_plus]. - .cop_name ⇒ Object
Instance Method Summary collapse
-
#alternative_style ⇒ Object
Style/SpaceAroundOperators-style autocorrect interferes within the same range; the autocorrect loop resolves clobbering. - #on_new_investigation ⇒ Object
Class Method Details
.badge ⇒ Object
54 |
# File 'lib/shirobai/cop/style/hash_syntax.rb', line 54 def self.badge = RuboCop::Cop::Badge.parse("Style/HashSyntax") |
.bundle_args(config) ⇒ Object
Packed config nums: [style, shorthand, UseHashRocketsWithSymbolValues, PreferHashRocketsForNonAlnumEndingSymbols, ruby31_plus, ruby22_plus]. The two ruby-version flags come from
AllCops/TargetRubyVersion (the cop's target_ruby_version), gating
the shorthand checks (> 3.0) and quoted-symbol ruby19 keys (> 2.1).
61 62 63 64 65 66 67 68 69 70 71 72 |
# File 'lib/shirobai/cop/style/hash_syntax.rb', line 61 def self.bundle_args(config) cop_config = config.for_badge(badge) target = config.target_ruby_version [[ STYLES.fetch(cop_config["EnforcedStyle"] || "ruby19"), SHORTHAND.fetch(cop_config.fetch("EnforcedShorthandSyntax", "always")), cop_config["UseHashRocketsWithSymbolValues"] ? 1 : 0, cop_config["PreferHashRocketsForNonAlnumEndingSymbols"] ? 1 : 0, target > 3.0 ? 1 : 0, target > 2.1 ? 1 : 0 ]] end |
.cop_name ⇒ Object
53 |
# File 'lib/shirobai/cop/style/hash_syntax.rb', line 53 def self.cop_name = "Style/HashSyntax" |
Instance Method Details
#alternative_style ⇒ Object
Style/SpaceAroundOperators-style autocorrect interferes within the
same range; the autocorrect loop resolves clobbering. Declared like
stock (no special incompatibility).
98 99 100 101 102 103 104 105 |
# File 'lib/shirobai/cop/style/hash_syntax.rb', line 98 def alternative_style case style when :hash_rockets :ruby19 when :ruby19, :ruby19_no_mixed_keys :hash_rockets end end |
#on_new_investigation ⇒ Object
74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
# File 'lib/shirobai/cop/style/hash_syntax.rb', line 74 def on_new_investigation buffer = processed_source.buffer off = SourceOffsets.for(processed_source.raw_source) records = resolved_result records.each do |is_offense, start, fin, , detect, ops| unless is_offense # `correct_style_detected` marker (a non-offending pair). correct_style_detected next end range = Parser::Source::Range.new(buffer, off[start], off[fin]) add_offense(range, message: MESSAGES[]) do |corrector| apply_ops(corrector, buffer, off, ops) replay_detection(detect) end end end |