Commit 1cb53766 authored by Rene Saarsoo's avatar Rene Saarsoo
Browse files

Turn Object.defineProperty with only getter into readonly.

Refs #444
parent b172d7ba
Loading
Loading
Loading
Loading
+5 −3
Original line number Diff line number Diff line
@@ -42,10 +42,12 @@ module JsDuck
        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.
          if exp.object_descriptor("set")
            # Object with a setter is not readonly
            make(name)
          elsif exp.object_descriptor("get")
            # Object with a getter and no setter is readonly
            make(name, nil, true)
          else
            writable = exp.object_descriptor("writable")
            readonly = writable ? !writable.to_value : true
+18 −2
Original line number Diff line number Diff line
@@ -66,7 +66,7 @@ describe JsDuck::Aggregator do
    end
  end

  describe "Object.defineProperty with getter" do
  describe "Object.defineProperty with only getter" do
    let(:doc) do
      parse_member(<<-EOS)
        /**  */
@@ -76,16 +76,32 @@ describe JsDuck::Aggregator do
      EOS
    end

    it "gets a readonly attribute" do
      doc[:readonly].should == true
    end
  end

  describe "Object.defineProperty with only 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

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