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

Handle classname matching an alternate classname.

When we see @class Foo, but Foo is also defined as alternateClassName,
then merge Foo into the class that defined Foo as its alternate name.
parent d7e0d885
Loading
Loading
Loading
Loading
+20 −1
Original line number Diff line number Diff line
@@ -9,6 +9,7 @@ module JsDuck
    def initialize
      @documentation = []
      @classes = {}
      @alt_names = {}
      @orphans = []
      @current_class = nil
    end
@@ -37,7 +38,7 @@ module JsDuck
    # When class exists, merge it with class node.
    # Otherwise add as new class.
    def add_class(cls)
      old_cls = @classes[cls[:name]]
      old_cls = @classes[cls[:name]] || @alt_names[cls[:name]]
      if old_cls
        merge_classes(old_cls, cls)
        @current_class = old_cls
@@ -45,6 +46,24 @@ module JsDuck
        @current_class = cls
        @documentation << cls
        @classes[cls[:name]] = cls

        # Register all alternate names of class for lookup too
        cls[:alternateClassNames].each do |altname|
          if cls[:name] == altname
            # A buggy documentation, ignore.
          else
            @alt_names[altname] = cls
            # When an alternate name has been used as a class name before,
            # then this is one crappy documentation, but attempt to handle
            # it by merging the class with alt-name into this class.
            if @classes[altname]
              merge_classes(cls, @classes[altname])
              @documentation.delete(@classes[altname])
              @classes.delete(altname)
            end
          end
        end

        insert_orphans(cls)
      end
    end
+50 −0
Original line number Diff line number Diff line
@@ -474,4 +474,54 @@ describe JsDuck::Aggregator do
    end
  end

  describe "class Foo following class with Foo as alternateClassName" do
    before do
      @classes = parse(<<-EOS)
        /**
         * @class Person
         * @alternateClassName Foo
         */
        /**
         * @class Foo
         */
      EOS
    end

    it "results in only one class" do
      @classes.length.should == 1
    end
  end

  describe "class Foo preceding class with Foo as alternateClassName" do
    before do
      @classes = parse(<<-EOS)
        /**
         * @class Foo
         */
        /**
         * @class Person
         * @alternateClassName Foo
         */
      EOS
    end

    it "results in only one class" do
      @classes.length.should == 1
    end
  end

  describe "Class with itself as alternateClassName" do
    before do
      @classes = parse(<<-EOS)
        /**
         * @class Foo
         * @alternateClassName Foo
         */
      EOS
    end

    it "results still in one class" do
      @classes.length.should == 1
    end
  end
end