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

Support for Object.defineProperty.

Detect property name and type when doc-comment followed by
Object.defineProperty().

Fixes #241
parent f7328c6c
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -139,6 +139,10 @@ module JsDuck
        call_expression? && child("callee").to_s == "this.fireEvent"
      end

      def define_property?
        call_expression? && child("callee").to_s == "Object.defineProperty"
      end

      def string?
        literal? && @node["value"].is_a?(String)
      end
+12 −0
Original line number Diff line number Diff line
@@ -38,6 +38,12 @@ module JsDuck
        elsif exp && exp.string?
          make(exp.to_value)

          # Object.defineProperty(obj, "prop", {value: x})
        elsif exp && exp.define_property?
          name = exp["arguments"][1].to_value
          descriptor = exp["arguments"][2]
          make(name, value_from_descriptor(descriptor))

        else
          nil
        end
@@ -59,6 +65,12 @@ module JsDuck
        ast.to_value != nil ? ast.to_s : nil
      end

      def value_from_descriptor(descriptor)
        descriptor.each_property do |key, value, prop|
          return value if key == "value"
        end
      end

    end
  end
end
+15 −0
Original line number Diff line number Diff line
@@ -155,6 +155,21 @@ describe JsDuck::Aggregator do
    end
  end

  describe "doc-comment before Object.defineProperty" do
    before do
      @doc = parse_member(<<-EOS)
        /**
         * Some documentation.
         */
        Object.defineProperty(this, 'foo', {
            value: "asdf",
            enumerable: true
        });
      EOS
    end
    it_should_behave_like "example property"
  end

  shared_examples_for "auto type" do
    it "should imply correct type" do
      @doc[:type].should == @type