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

Refactor Class#get_members.

Instead of adding two different sets of keys to one hash, build the
hash just by member name.  Look member name up from hash and filter
by type if needed.

Doing things in this more correct way brought up some bugs in other
places. Like {@link #foo-bar} being detected as link to member foo
of type bar, which happened to work. Now we only detect correct types.

Similarly the @inheritdoc happened to work because string interpolation
handles both symbols and strings equally well. Now it needs to be
converted to symbol explicitly.

All-in-all we now have more correct implementation.
parent 6f02f128
Loading
Loading
Loading
Loading
+4 −10
Original line number Diff line number Diff line
@@ -166,21 +166,15 @@ module JsDuck
        [:members, :statics].each do |group|
          @doc[group].each_key do |type|
            members_hash(type, group).each_pair do |key, member|
              members_map_add_key!("#{type}-#{key}", member)
              members_map_add_key!(key, member)
              @members_map[key] = (@members_map[key] || []) + [member]
            end
          end
        end
      end

      @members_map[type_name ? "#{type_name}-#{name}" : name] || []
    end

    # Adds member to @members_map so that each key corresponse to one
    # or more actual members.
    def members_map_add_key!(key, value)
      old = @members_map[key]
      @members_map[key] = old ? old + [value] : [value]
      ms = @members_map[name] || []
      ms = ms.find_all {|m| m[:tagname] == type_name } if type_name
      return ms
    end

    # Returns all public members of class, including the inherited and mixed in ones
+1 −1
Original line number Diff line number Diff line
@@ -108,7 +108,7 @@ module JsDuck
      input.sub(@link_re) do
        target = $1
        text = $2
        if target =~ /^(.*)#(?:(.*)-)?(.*)$/
        if target =~ /^(.*)#(?:(cfg|property|method|event|css_var|css_mixin)-)?(.*)$/
          cls = $1.empty? ? @class_context : $1
          type = $2 ? $2.intern : nil
          member = $3
+1 −1
Original line number Diff line number Diff line
@@ -343,7 +343,7 @@ module JsDuck
        if look(/#\w/)
          @input.scan(/#/)
          if look(/\w+-\w+/)
            @current_tag[:type] = ident
            @current_tag[:type] = ident.to_sym
            @input.scan(/-/)
          end
          @current_tag[:member] = ident
+1 −0
Original line number Diff line number Diff line
require 'jsduck/logger'
require 'pp'

module JsDuck

+8 −8
Original line number Diff line number Diff line
@@ -10,10 +10,10 @@ describe JsDuck::DocFormatter do
      JsDuck::Class.new({
        :name => "Context",
        :members => {
          :method => [{:name => "bar", :id => "method-bar"}]
          :method => [{:tagname => :method, :name => "bar", :id => "method-bar"}]
        },
        :statics => {
          :method => [{:name => "id", :id => "static-method-id"}],
          :method => [{:tagname => :method, :name => "id", :id => "static-method-id"}],
        },
      }),
      JsDuck::Class.new({
@@ -22,10 +22,10 @@ describe JsDuck::DocFormatter do
      JsDuck::Class.new({
        :name => "Foo",
        :members => {
          :cfg => [{:name => "bar", :id => "cfg-bar"}],
          :cfg => [{:tagname => :cfg, :name => "bar", :id => "cfg-bar"}],
        },
        :statics => {
          :method => [{:name => "id", :id => "static-method-id"}],
          :method => [{:tagname => :method, :name => "id", :id => "static-method-id"}],
        },
        :alternateClassNames => ["FooBar"]
      }),
@@ -122,7 +122,7 @@ describe JsDuck::DocFormatter do
          JsDuck::Class.new({
            :name => 'Ext.form.Field',
            :members => {
              :method => [{:name => "getValues", :id => "method-getValues"}]
              :method => [{:tagname => :method, :name => "getValues", :id => "method-getValues"}]
            }
          }),
          JsDuck::Class.new({
@@ -132,7 +132,7 @@ describe JsDuck::DocFormatter do
          JsDuck::Class.new({
            :name => 'Ext',
            :members => {
              :method => [{:name => "encode", :id => "method-encode"}]
              :method => [{:tagname => :method, :name => "encode", :id => "method-encode"}]
            }
          }),
        ])
@@ -215,8 +215,8 @@ describe JsDuck::DocFormatter do
          JsDuck::Class.new({
            :name => 'Foo',
            :members => {
              :method => [{:name => "select", :id => "method-select"}],
              :event => [{:name => "select", :id => "event-select"}],
              :method => [{:tagname => :method, :name => "select", :id => "method-select"}],
              :event => [{:tagname => :event, :name => "select", :id => "event-select"}],
            }
          })
        ])