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

Don't make Object.defineProperty with get/set into readonly.

Only data properties can have the writable flag, accessor properties
can't.

Fixes #444
parent 8e4f6a7a
Loading
Loading
Loading
Loading
+10 −3
Original line number Diff line number Diff line
@@ -41,9 +41,16 @@ module JsDuck
          # Object.defineProperty(obj, "prop", {value: x})
        elsif exp && exp.define_property?
          name = exp["arguments"][1].to_value

          if exp.object_descriptor("get") || exp.object_descriptor("set")
            # Objects with getters/setters don't have a value and also
            # aren't readonly.
            make(name)
          else
            writable = exp.object_descriptor("writable")
            readonly = writable ? !writable.to_value : true
            make(name, exp.object_descriptor("value"), readonly)
          end

        else
          nil
+30 −0
Original line number Diff line number Diff line
@@ -66,4 +66,34 @@ describe JsDuck::Aggregator do
    end
  end

  describe "Object.defineProperty with getter" do
    let(:doc) do
      parse_member(<<-EOS)
        /**  */
        Object.defineProperty(this, 'myCfg', {
            get: function() { return 1; }
        });
      EOS
    end

    it "gets no readonly attribute" do
      doc[:readonly].should_not == true
    end
  end

  describe "Object.defineProperty with setter" do
    let(:doc) do
      parse_member(<<-EOS)
        /**  */
        Object.defineProperty(this, 'myCfg', {
            set: function(x) { this.x = x; }
        });
      EOS
    end

    it "gets no readonly attribute" do
      doc[:readonly].should_not == true
    end
  end

end