From 1cb53766b6f415b6d7a669af265231bf80d9c4af Mon Sep 17 00:00:00 2001 From: Rene Saarsoo Date: Fri, 13 Sep 2013 09:40:58 +0300 Subject: [PATCH] Turn Object.defineProperty with only getter into readonly. Refs #444 --- lib/jsduck/js/property.rb | 8 +++++--- spec/aggregator_readonly_spec.rb | 20 ++++++++++++++++++-- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/lib/jsduck/js/property.rb b/lib/jsduck/js/property.rb index 3abe0c1d..7609a389 100644 --- a/lib/jsduck/js/property.rb +++ b/lib/jsduck/js/property.rb @@ -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 diff --git a/spec/aggregator_readonly_spec.rb b/spec/aggregator_readonly_spec.rb index 89777ba1..400e2ec7 100644 --- a/spec/aggregator_readonly_spec.rb +++ b/spec/aggregator_readonly_spec.rb @@ -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 -- GitLab