Class: Collie::Linter::Rules::CircularReference

Inherits:
Base
  • Object
show all
Defined in:
lib/collie/linter/rules/circular_reference.rb

Overview

Detects circular references that lead to infinite recursion

Constant Summary

Constants inherited from Base

Base::VALID_SEVERITIES

Instance Method Summary collapse

Methods inherited from Base

#autocorrectable?, #initialize

Constructor Details

This class inherits a constructor from Collie::Linter::Base

Instance Method Details

#check(ast, _context = {}) ⇒ Object



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/collie/linter/rules/circular_reference.rb', line 15

def check(ast, _context = {})
  @rules_map = build_rules_map(ast)
  @dependencies = build_dependency_graph
  productive_rules = compute_productive_rules

  strongly_connected_components.each do |component|
    next unless cyclic_component?(component)
    next if component.any? { |rule_name| productive_rules.include?(rule_name) }

    component.each do |rule_name|
      rule = @rules_map[rule_name]
      add_offense(rule, message: "Rule '#{rule_name}' is part of a non-productive circular reference") if rule
    end
  end

  @offenses
end