diff --git a/lib/jsduck/class.rb b/lib/jsduck/class.rb index 807a374d4da3dcce4347deeeb10e58afbabbcda2..03c8064696cef443a52ca734e3b3ec05e5bda434 100644 --- a/lib/jsduck/class.rb +++ b/lib/jsduck/class.rb @@ -168,6 +168,9 @@ module JsDuck ms.merge!(local_members_hash(type, :statics)) {|k,o,n| store_overrides(k,o,n)} end + # Remove explicitly hidden members (tagged with @hide) + ms.reject! {|k, v| v[:meta] && v[:meta][:hide] } + ms end diff --git a/lib/jsduck/class_formatter.rb b/lib/jsduck/class_formatter.rb index 8c39063141909c2e2ddb8bfa804b326a3e20b703..6b3d8cc55391290194a9f79e87ae894f6bb7e973 100644 --- a/lib/jsduck/class_formatter.rb +++ b/lib/jsduck/class_formatter.rb @@ -27,8 +27,8 @@ module JsDuck cls[:doc] = @formatter.format(cls[:doc]) if cls[:doc] [:members, :statics].each do |group| cls[group].each_pair do |type, members| - # format all members - cls[group][type] = members.map {|m| format_member(m) } + # format all members (except hidden ones) + cls[group][type] = members.map {|m| m[:meta][:hide] ? m : format_member(m) } end end cls[:html_meta] = format_meta_data(cls) diff --git a/lib/jsduck/doc_parser.rb b/lib/jsduck/doc_parser.rb index b3799ae0197d8557a7ffb9f306f52e7b306b1bcc..8a2617c13a72e38b38a59f9d4b0ebd833d337611 100644 --- a/lib/jsduck/doc_parser.rb +++ b/lib/jsduck/doc_parser.rb @@ -134,8 +134,8 @@ module JsDuck at_var elsif look(/@inheritable\b/) boolean_at_tag(/@inheritable/, :inheritable) - elsif look(/@(private|ignore|hide)\b/) - boolean_at_tag(/@(private|ignore|hide)/, :private) + elsif look(/@(private|ignore)\b/) + boolean_at_tag(/@(private|ignore)/, :private) elsif look(/@accessor\b/) boolean_at_tag(/@accessor/, :accessor) elsif look(/@evented\b/) diff --git a/lib/jsduck/tag/hide.rb b/lib/jsduck/tag/hide.rb new file mode 100644 index 0000000000000000000000000000000000000000..a66a31cfdb2b473a8400e49764b67c3fcf7701bf --- /dev/null +++ b/lib/jsduck/tag/hide.rb @@ -0,0 +1,18 @@ +require "jsduck/meta_tag" + +module JsDuck::Tag + # Implementation of @hide tag. + # + # Hides a member in parent class. + # + # The core of the implementation is built into jsduck. + # + class Hide < JsDuck::MetaTag + def initialize + @name = "hide" + @key = :hide + @boolean = true + end + end +end + diff --git a/spec/aggregator_private_spec.rb b/spec/aggregator_private_spec.rb index 6a988a09ed06f77d9d6da132667bc2a36d046f48..ca2b6ce6330474429a9250b659dfd1659373a236 100644 --- a/spec/aggregator_private_spec.rb +++ b/spec/aggregator_private_spec.rb @@ -24,14 +24,23 @@ describe JsDuck::Aggregator do it_should_behave_like "private" end - describe "@hide" do - before { @tagname = "@hide" } - it_should_behave_like "private" - end - describe "@ignore" do before { @tagname = "@ignore" } it_should_behave_like "private" end + describe "@hide" do + before do + @doc = parse("/** @hide */")[0] + end + + it "does not mark item as private" do + @doc[:private].should_not == true + end + + it "marks item as :hide" do + @doc[:meta][:hide].should == true + end + end + end diff --git a/spec/hide_spec.rb b/spec/hide_spec.rb new file mode 100644 index 0000000000000000000000000000000000000000..419b613c558b0e5ed7aa074ba0c5d360f46871bb --- /dev/null +++ b/spec/hide_spec.rb @@ -0,0 +1,61 @@ +require "jsduck/class" + +# Test for the behavior of @hide tag + +describe JsDuck::Class do + + def members_as_hash(cls, type, context=:members) + h = {} + cls.members(type, context).each {|m| h[m[:name]] = m } + h + end + + before do + @classes = {} + @parent = JsDuck::Class.new({ + :name => "ParentClass", + :members => { + :method => [ + {:name => "foo", :owner => "ParentClass"}, + {:name => "bar", :owner => "ParentClass"}, + {:name => "zappa", :owner => "ParentClass"}, + ] + } + }); + @classes["ParentClass"] = @parent + @parent.relations = @classes + + @child = JsDuck::Class.new({ + :name => "ChildClass", + :extends => "ParentClass", + :members => { + :method => [ + {:name => "bar", :owner => "ChildClass"}, + {:name => "baz", :owner => "ChildClass"}, + {:name => "zappa", :owner => "ChildClass", :meta => {:hide => true}}, + ] + } + }); + @classes["ChildClass"] = @child + @child.relations = @classes + + @members = members_as_hash(@child, :method) + end + + it "has member that's inherited from parent" do + @members.should have_key("foo") + end + + it "has member that's overridden in child" do + @members.should have_key("bar") + end + + it "has member that's defined only in child" do + @members.should have_key("baz") + end + + it "doesn't have member that's tagged in child with @hide" do + @members.should_not have_key("zappa") + end + +end