Commit bfd82170 authored by Rene Saarsoo's avatar Rene Saarsoo
Browse files

Extract the merging of :name field to Tag::Name.

Because :name applies to all members, introduce a special merge_context
called :member, which expands to list of all known member types.
parent c217c8bd
Loading
Loading
Loading
Loading
+0 −15
Original line number Diff line number Diff line
@@ -18,7 +18,6 @@ module JsDuck

      h = {
        :tagname => docset[:tagname],
        :name => merge_name(docs, code),
        :linenr => docset[:linenr],
      }

@@ -54,20 +53,6 @@ module JsDuck
      end
    end

    def merge_name(docs, code)
      if docs[:name]
        docs[:name]
      elsif code[:name]
        if docs[:tagname] == :class
          code[:name]
        else
          code[:name].split(/\./).last
        end
      else
        ""
      end
    end

  end

end

lib/jsduck/tag/name.rb

0 → 100644
+36 −0
Original line number Diff line number Diff line
require "jsduck/tag/tag"

module JsDuck::Tag
  # There is no @name tag.
  #
  # The :name field is generated by several tags like @class, @method,
  # @cfg, ...
  #
  # This class exists to take care of the merging of :name field.
  class Name < Tag
    def initialize
      @merge_context = [:class, :member]
    end

    # When docs contains :name, it's taken from there.
    #
    # When code contains :name, we only take the full name when
    # dealing with a class, otherwise we just take the last part of
    # the dot.separate.name.
    #
    # :name defaults to empty string.
    def merge(h, docs, code)
      if docs[:name]
        h[:name] = docs[:name]
      elsif code[:name]
        if h[:tagname] == :class
          h[:name] = code[:name]
        else
          h[:name] = code[:name].split(/\./).last
        end
      else
        h[:name] = ""
      end
    end
  end
end
+4 −0
Original line number Diff line number Diff line
@@ -72,6 +72,10 @@ module JsDuck::Tag
    # In the context of which members or classes invoke the #merge
    # method.  This can be either a single tagname like :class,
    # :method, :cfg or an array of these.
    #
    # Additionally a special :member symbol can be used to register a
    # merger for all the member types.  So to register a merger for
    # everyting you would set @merge_context = [:class, :member]
    attr_reader :merge_context

    # Merges documentation and code hashes into the result hash.
+18 −0
Original line number Diff line number Diff line
@@ -86,6 +86,9 @@ module JsDuck
    # Returns tags for doing the merging in a particular context.
    # See Tag::Tag#merge_context for details.
    def mergers(context)
      if @mergers.has_key?(:member)
        expand_member_context
      end
      @mergers[context] || []
    end

@@ -119,6 +122,21 @@ module JsDuck
    def get_by_key(key)
      @keys[key]
    end

    private

    # Takes mergers registered under :member context and add them to
    # the contexts all of the detected member types.
    def expand_member_context
      @mergers[:member].each do |tag|
        @member_types.each do |tagname|
          @mergers[tagname] = [] unless @mergers[tagname]
          @mergers[tagname] << tag
        end
      end
      @mergers.delete(:member)
    end

  end

end