Commit 94f26c46 authored by Rene Saarsoo's avatar Rene Saarsoo
Browse files

Auto-detection of properties inside Ext.define().

parent 9623307a
Loading
Loading
Loading
Loading
+21 −0
Original line number Diff line number Diff line
@@ -237,6 +237,8 @@ module JsDuck
        else
          if value["type"] == "FunctionExpression"
            cls[:members] += make_auto_method(key, value, pair)
          else
            cls[:members] += make_auto_property(key, value, pair)
          end
        end
      end
@@ -355,6 +357,25 @@ module JsDuck
      end
    end

    def make_auto_property(name, ast, pair)
      m = make_property(name, ast)

      docset = find_docset(pair)

      if !docset || docset[:type] != :doc_comment
        m[:inheritdoc] = {}
        m[:autodetected] = true
      end

      if docset
        docset[:code] = m
        return []
      else
        m[:linenr] = pair["range"][2]
        return [m]
      end
    end

    # Looks up docset associated with given AST node.
    # A dead-stupid and -slow implementation, but works.
    def find_docset(ast)
+53 −0
Original line number Diff line number Diff line
@@ -208,4 +208,57 @@ describe JsDuck::Aggregator do
    it_should_behave_like "auto type"
  end

  shared_examples_for "auto detected property" do
    it "detects a property" do
      property[:tagname].should == :property
    end

    it "detects property name" do
      property[:name].should == 'foo'
    end

    it "flags property with :inheritdoc" do
      property[:inheritdoc].should == {}
    end

    it "flags property as :autodetected" do
      property[:autodetected].should == true
    end
  end

  describe "property without comment inside Ext.define" do
    let(:property) do
      parse(<<-EOS)[0][:members][:property][0]
        /**
         * Some documentation.
         */
        Ext.define("MyClass", {
            foo: 15
        });
      EOS
    end

    it_should_behave_like "auto detected property"
  end

  describe "property with line comment inside Ext.define" do
    let(:property) do
      parse(<<-EOS)[0][:members][:property][0]
        /**
         * Some documentation.
         */
        Ext.define("MyClass", {
            // My docs
            foo: "bar"
        });
      EOS
    end

    it_should_behave_like "auto detected property"

    it "detects property documentation" do
      property[:doc].should == 'My docs'
    end
  end

end