Sha256: 4570fa103a8398e2fbdaeeda661df107de8ab3e88aac4d17dc5c1a4fb5c17729

Contents?: true

Size: 1.33 KB

Versions: 30

Compression:

Stored size: 1.33 KB

Contents

require 'jsduck/logger'

module JsDuck
  module Process

    # Checks for circular dependencies
    class CircularDeps
      def initialize(classes)
        @classes = classes
      end

      # Checks all classes for circular dependencies.
      #
      # When found, exits with a fatal error message.
      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

      # 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".
      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

      def track_circular(type, cls, names)
        names += [type]
        if names.include?(cls[:name])
          (names + [cls[:name]]).join("")
        else
          check(cls, names)
        end
      end

    end

  end
end

Version data entries

30 entries across 30 versions & 3 rubygems

Version Path
solvas-jsduck-6.0.0.30539 lib/jsduck/process/circular_deps.rb
solvas-jsduck-6.0.0.9571 lib/jsduck/process/circular_deps.rb
solvas-jsduck-6.0.0.6154 lib/jsduck/process/circular_deps.rb
solvas-jsduck-6.0.0.4021 lib/jsduck/process/circular_deps.rb
solvas-jsduck-6.0.0.2554 lib/jsduck/process/circular_deps.rb
solvas-jsduck-6.0.0.1891 lib/jsduck/process/circular_deps.rb
solvas-jsduck-6.0.0.beta.1888 lib/jsduck/process/circular_deps.rb
jsduck-troopjs-0.0.10 lib/jsduck/process/circular_deps.rb
jsduck-troopjs-0.0.9 lib/jsduck/process/circular_deps.rb
jsduck-troopjs-0.0.8 lib/jsduck/process/circular_deps.rb
jsduck-troopjs-0.0.7 lib/jsduck/process/circular_deps.rb
jsduck-troopjs-0.0.5 lib/jsduck/process/circular_deps.rb
jsduck-troopjs-0.0.4 lib/jsduck/process/circular_deps.rb
jsduck-troopjs-0.0.3 lib/jsduck/process/circular_deps.rb
jsduck-troopjs-0.0.1 lib/jsduck/process/circular_deps.rb
jsduck-6.0.0beta lib/jsduck/process/circular_deps.rb
jsduck-5.3.4 lib/jsduck/process/circular_deps.rb
jsduck-5.3.3 lib/jsduck/process/circular_deps.rb
jsduck-5.3.2 lib/jsduck/process/circular_deps.rb
jsduck-5.3.1 lib/jsduck/process/circular_deps.rb