Class: WhyClasses::Rule

Inherits:
Object
  • Object
show all
Defined in:
lib/why_classes/rule.rb

Overview

Base class for every detector. A rule walks the parser-style AST, dispatches to on_<type> handlers a subclass defines, and emits Offenses via #add_offense. Rules never mutate source; a correctable offense carries a corrector callable that queues edits on a Parser::Source::TreeRewriter.

Constant Summary collapse

H =
AST::NodeHelpers

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(configuration) ⇒ Rule

Returns a new instance of Rule.



47
48
49
# File 'lib/why_classes/rule.rb', line 47

def initialize(configuration)
  @configuration = configuration
end

Class Method Details

.autocorrectable?Boolean

Whether this rule can ever autocorrect. Advice-only rules return false.

Returns:

  • (Boolean)


27
28
29
# File 'lib/why_classes/rule.rb', line 27

def autocorrectable?
  tier != :none
end

.descriptionObject

Human-readable one-liner shown by --list-rules. Override in subclasses.



22
23
24
# File 'lib/why_classes/rule.rb', line 22

def description
  ""
end

.inherited(subclass) ⇒ Object



40
41
42
43
44
# File 'lib/why_classes/rule.rb', line 40

def inherited(subclass)
  super
  # Anonymous subclasses (in specs) are not registered.
  Registry.register(subclass) unless subclass.name.nil?
end

.rule_nameObject



17
18
19
# File 'lib/why_classes/rule.rb', line 17

def rule_name
  name.split("::").last
end

.tierObject

Autocorrection tier:

:suggested -- mechanical and low-risk; applied by --fix
:unsafe    -- correct in-file but may break cross-file call sites;
            applied only by --fix-unsafe
:none      -- advice only, no corrector


36
37
38
# File 'lib/why_classes/rule.rb', line 36

def tier
  :none
end

Instance Method Details

#call(source_file) ⇒ Object

Run this rule over a SourceFile and return its offenses.



52
53
54
55
56
57
# File 'lib/why_classes/rule.rb', line 52

def call(source_file)
  @source_file = source_file
  @offenses = []
  walk(source_file.ast)
  @offenses
end