Sha256: b93a80bdf71258c3b4435e99b902f76e2abf191a0fe49bc066be87091e6a4cfb

Contents?: true

Size: 1.9 KB

Versions: 8

Compression:

Stored size: 1.9 KB

Contents

module JsDuck

  class Override
    def initialize(classes_hash)
      @classes_hash = classes_hash
    end

    # Applies all override classes to target classes
    # Returns all the processed override classes.
    def process_all!
      overrides = []

      @classes_hash.each_value do |cls|
        if cls[:override]
          process(cls)
          overrides << cls
        end
      end

      overrides
    end

    private

    # Applies override class to target class
    def process(override)
      target = @classes_hash[override[:override]]
      unless target
        ctx = override[:files][0]
        return Logger.warn(:extend, "Class #{override[:override]} not found", ctx[:filename], ctx[:linenr])
      end

      # Combine comments of classes
      if override[:doc].length > 0
        add_doc(target, "**From override #{override[:name]}:** " + override[:doc])
      end
      target[:files] += override[:files]

      # Build lookup table of existing members
      existing = {}
      each_member(target) do |m|
        existing[m[:id]] = m
      end

      # When the same member exists in overridden class, just append
      # the docs.  Otherwise add the member as a whole to the class.
      each_member(override) do |m|
        ex = existing[m[:id]]
        if ex
          if m[:doc].length > 0
            add_doc(ex, "**From override #{override[:name]}:** " + m[:doc])
          else
            add_doc(ex, "**Overridden in #{override[:name]}.**")
          end
          ex[:files] += m[:files]
        else
          add_member(target, m)
          add_doc(m, "**Defined in override #{override[:name]}.**")
          m[:owner] = target[:name]
        end
      end
    end

    # helpers

    def each_member(cls)
      cls[:members].each {|m| yield m }
    end

    def add_member(cls, m)
      cls[:members] << m
    end

    def add_doc(m, doc)
      m[:doc] = (m[:doc] + "\n\n" + doc).strip
    end
  end

end

Version data entries

8 entries across 8 versions & 1 rubygems

Version Path
jsduck-4.4.1 lib/jsduck/override.rb
jsduck-4.4.0 lib/jsduck/override.rb
jsduck-4.3.2 lib/jsduck/override.rb
jsduck-4.3.1 lib/jsduck/override.rb
jsduck-4.3.0 lib/jsduck/override.rb
jsduck-4.2.1 lib/jsduck/override.rb
jsduck-4.2.0 lib/jsduck/override.rb
jsduck-4.1.1 lib/jsduck/override.rb