Commit 89ea5d1b authored by Rene Saarsoo's avatar Rene Saarsoo
Browse files

Support explicit @links to static members.

One can now use {@link #static-foo} to link to static member #foo
in case there's instance member with the same name. This wasn't
previously possible.
parent 76888540
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -159,7 +159,7 @@ module JsDuck
    #
    # Optionally one can also specify type name to differenciate
    # between different types of members.
    def get_members(name, type_name=nil)
    def get_members(name, type_name=nil, static=false)
      # build hash of all members
      unless @members_map
        @members_map = {}
@@ -174,6 +174,7 @@ module JsDuck

      ms = @members_map[name] || []
      ms = ms.find_all {|m| m[:tagname] == type_name } if type_name
      ms = ms.find_all {|m| m[:attributes][:static] } if static
      return ms
    end

+14 −12
Original line number Diff line number Diff line
@@ -108,12 +108,14 @@ module JsDuck
      input.sub(@link_re) do
        target = $1
        text = $2
        if target =~ /^(.*)#(?:(cfg|property|method|event|css_var|css_mixin)-)?(.*)$/
        if target =~ /^(.*)#(static-)?(?:(cfg|property|method|event|css_var|css_mixin)-)?(.*)$/
          cls = $1.empty? ? @class_context : $1
          type = $2 ? $2.intern : nil
          member = $3
          static = !!$2
          type = $3 ? $3.intern : nil
          member = $4
        else
          cls = target
          static = false
          type = false
          member = false
        end
@@ -133,7 +135,7 @@ module JsDuck
          Logger.instance.warn(:link, "#{input} links to non-existing class", file, line)
          return text
        elsif member
          ms = get_members(cls, member, type)
          ms = get_members(cls, member, type, static)
          if ms.length == 0
            Logger.instance.warn(:link, "#{input} links to non-existing member", file, line)
            return text
@@ -161,9 +163,9 @@ module JsDuck
            end
          end

          return link(cls, member, text, type)
          return link(cls, member, text, type, static)
        else
          return link(cls, false, text, false)
          return link(cls, false, text)
        end
      end
    end
@@ -205,11 +207,11 @@ module JsDuck
    end

    # applies the link template
    def link(cls, member, anchor_text, type=nil)
    def link(cls, member, anchor_text, type=nil, static=false)
      # Use the canonical class name for link (not some alternateClassName)
      cls = @relations[cls].full_name
      # prepend type name to member name
      member = member && get_matching_member(cls, member, type)
      member = member && get_matching_member(cls, member, type, static)

      @link_tpl.gsub(/(%[\w#-])/) do
        case $1
@@ -229,8 +231,8 @@ module JsDuck
      end
    end

    def get_matching_member(cls, member, type=nil)
      ms = get_members(cls, member, type).find_all {|m| !m[:private] }
    def get_matching_member(cls, member, type=nil, static=false)
      ms = get_members(cls, member, type, static).find_all {|m| !m[:private] }
      if ms.length > 1
        instance_ms = ms.find_all {|m| !m[:attributes][:static] }
        instance_ms.length > 0 ? instance_ms[0] : ms.find_all {|m| m[:attributes][:static] }[0]
@@ -239,8 +241,8 @@ module JsDuck
      end
    end

    def get_members(cls, member, type=nil)
      @relations[cls] ? @relations[cls].get_members(member, type) : []
    def get_members(cls, member, type=nil, static=false)
      @relations[cls] ? @relations[cls].get_members(member, type, static) : []
    end

    # Formats doc-comment for placement into HTML.
+31 −0
Original line number Diff line number Diff line
@@ -232,6 +232,37 @@ describe JsDuck::DocFormatter do
          'Look at <a href="Foo#event-select">Foo.select</a>'
      end
    end

    describe "with staticality information" do
      before do
        @formatter.relations = JsDuck::Relations.new([
          JsDuck::Class.new({
            :name => 'Foo',
            :members => {
              :method => [{:tagname => :method, :name => "select", :id => "method-select", :attributes => {}}],
            },
            :statics => {
              :method => [{:tagname => :method, :name => "select", :id => "static-method-select", :attributes => {:static => true}}],
            }
          })
        ])
      end

      it "replaces {@link Foo#select} with link to instance method" do
        @formatter.replace("Look at {@link Foo#select}").should ==
          'Look at <a href="Foo#method-select">Foo.select</a>'
      end

      it "replaces {@link Foo#static-select} with link to static method" do
        @formatter.replace("Look at {@link Foo#static-select}").should ==
          'Look at <a href="Foo#static-method-select">Foo.select</a>'
      end

      it "replaces {@link Foo#static-method-select} with link to static method" do
        @formatter.replace("Look at {@link Foo#static-method-select}").should ==
          'Look at <a href="Foo#static-method-select">Foo.select</a>'
      end
    end
  end

  describe "#format" do