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

Detect methods defined with Object.defineProperty.

parent f5e1ce76
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -37,6 +37,11 @@ module JsDuck
        elsif ast.property? && ast["value"].function?
          make(ast["key"].key_value, ast["value"])

          # Object.defineProperty(obj, "prop", {value: function() {} })
        elsif exp && (value = exp.value_of_define_property) && detect(value)
          name = exp["arguments"][1].to_value
          make(name, value)

        else
          nil
        end
+11 −0
Original line number Diff line number Diff line
@@ -120,6 +120,17 @@ module JsDuck
        end
      end

      # Returns the value field from Object.defineProperty call
      # descriptor object.
      def value_of_define_property
        return unless define_property?

        descriptor = child("arguments")[2]
        descriptor.each_property do |key, value, prop|
          return value if key == "value"
        end
      end

      # Returns line number in parsed source where the Node resides.
      def linenr
        # Get line number from third place at range array.
+1 −2
Original line number Diff line number Diff line
@@ -41,8 +41,7 @@ module JsDuck
          # 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))
          make(name, exp.value_of_define_property)

        else
          nil
+13 −0
Original line number Diff line number Diff line
@@ -119,6 +119,19 @@ describe JsDuck::Aggregator do
    it_should_behave_like "method"
  end

  describe "Object.defineProperty with function value" do
    before do
      @doc = parse_method(<<-EOS)
        /** Some function */
        Object.defineProperty(this, 'foo', {
          writable: false,
          value: function() { return true; }
        });
      EOS
    end
    it_should_behave_like "method"
  end

  describe "doc-comment followed by 'function'" do
    before do
      @doc = parse_method("/** Some function */ 'function';")