Commit 6fc9b777 authored by Rene Saarsoo's avatar Rene Saarsoo
Browse files

Added support for name.spaced.ClassNames.

parent 5ba70127
Loading
Loading
Loading
Loading
+19 −9
Original line number Diff line number Diff line
@@ -101,13 +101,18 @@ module JsDuck
    end

    # Sets the name property of the default at-tag.
    # When name begins with uppercase it's considered to be class name,
    # otherwise a function name.
    def set_default_name(name)
    #
    # When name begins with uppercase it's considered to be class
    # name, otherwise a function name.
    #
    # When the name consists of several parts like foo.bar.baz, then
    # the parts should be passed as multiple arguments.
    def set_default_name(*name_chain)
      name = name_chain.last
      tagname = (name[0,1] == name[0,1].upcase) ? :class : :function
      
      if !@tags[:class] && !@tags[:function] then
        @tags[tagname] = {:name => name}
        @tags[tagname] = {:name => (tagname == :function) ? name : name_chain.join(".")}
        @tags[tagname][:doc] = @tags[:default][:doc]
      end
    end
@@ -176,7 +181,7 @@ module JsDuck
      @current_tag = @tags[:class] = {:doc => ""}
      skip_white
      if look(/\w/) then
        @current_tag[:name] = ident
        @current_tag[:name] = ident_chain
      end
      skip_white
    end
@@ -190,7 +195,7 @@ module JsDuck
      @current_tag = @tags[:class]
      skip_white
      if look(/\w/) then
        @current_tag[:extends] = ident
        @current_tag[:extends] = ident_chain
      end
      skip_white
    end
@@ -245,6 +250,11 @@ module JsDuck
      return name
    end

    # matches chained.identifier.name and returns it
    def ident_chain
      @input.scan(/[\w.]+/)
    end

    # matches identifier and returns its name
    def ident
      @input.scan(/\w+/)
@@ -298,12 +308,12 @@ module JsDuck
            doc.set_default_params(parse_anonymous_function_params)
          elsif @lex.look(:ident, ".") then
            # some.long.prototype.chain = function() {
            @lex.next
            name_chain = [@lex.next]
            while @lex.look(".", :ident) do
              @lex.next
              name = @lex.next
              name_chain << @lex.next
              if @lex.look("=", "function") then
                doc.set_default_name(name)
                doc.set_default_name(*name_chain)
                @lex.next # =
                doc.set_default_params(parse_anonymous_function_params)
              end
+15 −4
Original line number Diff line number Diff line
@@ -205,12 +205,12 @@ function f(foo, bar){}
  def test_explicit_class_name
    docs = JsDuck.parse("
/**
 * @class Foo
 * @class my.package.Foo
 * My class
 */
function Bar(){}
")
    assert_equal("Foo", docs[0][:class][:name])
    assert_equal("my.package.Foo", docs[0][:class][:name])
    assert_equal("My class", docs[0][:class][:doc])
  end

@@ -225,16 +225,27 @@ function Foo(){}
    assert_equal("My class", docs[0][:class][:doc])
  end

  def test_uppercase_name_at_chain_end_implies_class_name
    docs = JsDuck.parse("
/**
 * My class
 */
some.namespace.ClassName = function(){}
")
    assert_equal("some.namespace.ClassName", docs[0][:class][:name])
    assert_equal("My class", docs[0][:class][:doc])
  end

  def test_explicit_extends
    docs = JsDuck.parse("
/**
 * @class Foo
 * @extends Bar
 * @extends some.namespace.Bar
 * My class
 */
")
    assert_equal("Foo", docs[0][:class][:name])
    assert_equal("Bar", docs[0][:class][:extends])
    assert_equal("some.namespace.Bar", docs[0][:class][:extends])
    assert_equal("My class", docs[0][:class][:doc])
  end