Class: Shirobai::Cop::Naming::PredicatePrefix
- Inherits:
-
RuboCop::Cop::Base
- Object
- RuboCop::Cop::Base
- Shirobai::Cop::Naming::PredicatePrefix
- Includes:
- RuboCop::Cop::AllowedMethods
- Defined in:
- lib/shirobai/cop/naming/predicate_prefix.rb
Overview
Drop-in Rust reimplementation of Naming/PredicatePrefix.
Rust walks the definition sites (def/defs and the configured
MethodDefinitionMacros calls with a symbol first argument), keeps the
rare sites whose name literally starts with a configured NamePrefix
entry (the same cheap gate the stock cop applies before its regex
check) and reports them together with whether a
sig { returns(T::Boolean) } block immediately precedes the
definition. Ruby then replays the stock per-prefix filtering verbatim
on those candidates — the /^#{prefix}[^0-9]/ interpolation,
expected_name equality, assignment names, AllowedMethods and
UseSorbetSigs — so every config option keeps its stock semantics
(including regex-interpolated prefixes). With every filter applied
after the ext call, this cop is always bundle-eligible.
Class Method Summary collapse
- .badge ⇒ Object
-
.bundle_args(config) ⇒ Object
Packed args for the bundled run:
[name_prefixes, macros](two of the bundle's string lists). - .cop_name ⇒ Object
Instance Method Summary collapse
Class Method Details
.badge ⇒ Object
24 |
# File 'lib/shirobai/cop/naming/predicate_prefix.rb', line 24 def self.badge = RuboCop::Cop::Badge.parse("Naming/PredicatePrefix") |
.bundle_args(config) ⇒ Object
Packed args for the bundled run: [name_prefixes, macros] (two of
the bundle's string lists). Both may be absent when the config does
not mention this cop (the slice is then discarded); default to empty
lists (no candidates).
30 31 32 33 34 35 36 |
# File 'lib/shirobai/cop/naming/predicate_prefix.rb', line 30 def self.bundle_args(config) cop_config = config.for_badge(badge) [ Array(cop_config["NamePrefix"]).map(&:to_s), Array(cop_config["MethodDefinitionMacros"]).map(&:to_s) ] end |
.cop_name ⇒ Object
23 |
# File 'lib/shirobai/cop/naming/predicate_prefix.rb', line 23 def self.cop_name = "Naming/PredicatePrefix" |
Instance Method Details
#on_new_investigation ⇒ Object
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
# File 'lib/shirobai/cop/naming/predicate_prefix.rb', line 38 def on_new_investigation candidates = Dispatch.offenses_for(processed_source, config, :predicate_prefix) off = SourceOffsets.for(processed_source.raw_source) candidates.each do |start, fin, method_name, is_def, sorbet_boolean_sig| predicate_prefixes.each do |prefix| next if allowed_method_name?(method_name, prefix) # The Sorbet exemption only applies to `def`/`defs` sites; the # stock `on_send` (macro) path never consults the sig. next if is_def && use_sorbet_sigs? && !sorbet_boolean_sig range = Parser::Source::Range.new(processed_source.buffer, off[start], off[fin]) add_offense(range, message: (method_name, expected_name(method_name, prefix))) end end end |
#validate_config ⇒ Object
55 56 57 58 59 60 61 62 63 |
# File 'lib/shirobai/cop/naming/predicate_prefix.rb', line 55 def validate_config forbidden_prefixes.each do |forbidden_prefix| next if predicate_prefixes.include?(forbidden_prefix) raise RuboCop::ValidationError, <<~MSG.chomp The `Naming/PredicatePrefix` cop is misconfigured. Prefix #{forbidden_prefix} must be included in NamePrefix because it is included in ForbiddenPrefixes. MSG end end |