class JsDuck::Process::CircularDeps

Checks for circular dependencies

Public Class Methods

new(classes) click to toggle source
# File lib/jsduck/process/circular_deps.rb, line 8
def initialize(classes)
  @classes = classes
end

Public Instance Methods

check(cls, names = []) click to toggle source

Checks class for circular dependencies.

When all OK, returns false.

When circular dependencies found returns a string describing the problematic dependency chain e.g. “Foo extends Bar mixins Foo”.

# File lib/jsduck/process/circular_deps.rb, line 30
def check(cls, names = [])
  names += [cls[:name]]

  if cls.parent && chain = track_circular(" extends ", cls.parent, names)
    return chain
  end

  cls.mixins.each do |mixin|
    if chain = track_circular(" mixins ", mixin, names)
      return chain
    end
  end

  false
end
process_all!() click to toggle source

Checks all classes for circular dependencies.

When found, exits with a fatal error message.

# File lib/jsduck/process/circular_deps.rb, line 15
def process_all!
  @classes.each do |cls|
    if chain = check(cls)
      Logger.fatal("Class #{cls[:name]} has a circular dependency: #{chain}")
      exit 1
    end
  end
end
track_circular(type, cls, names) click to toggle source
# File lib/jsduck/process/circular_deps.rb, line 46
def track_circular(type, cls, names)
  names += [type]
  if names.include?(cls[:name])
    (names + [cls[:name]]).join("")
  else
    check(cls, names)
  end
end