Loading lib/jsduck/ast.rb +15 −5 Original line number Diff line number Diff line Loading @@ -200,7 +200,9 @@ module JsDuck elsif ext_define?(ast) detect_ext_define(cls, ast) elsif ast["type"] == "ObjectExpression" detect_class_members(cls, ast) detect_class_members_from_object(cls, ast) elsif ast["type"] == "ArrayExpression" detect_class_members_from_array(cls, ast) end end Loading Loading @@ -256,13 +258,21 @@ module JsDuck end # Detects class members from object literal def detect_class_members(cls, ast) def detect_class_members_from_object(cls, ast) cls[:members] = [] each_pair_in_object_expression(ast) do |key, value, pair| detect_method_or_property(cls, key, value, pair) end end # Detects class members from array literal def detect_class_members_from_array(cls, ast) cls[:members] = [] ast["elements"].each do |el| detect_method_or_property(cls, key_value(el), el, el) end end # Detects item in object literal either as method or property def detect_method_or_property(cls, key, value, pair) if function?(value) Loading Loading @@ -341,8 +351,8 @@ module JsDuck # returns false. # # Otherwise detects the line number of member and returns true. def apply_autodetected(m, pair, inheritable=true) docset = find_docset(pair) def apply_autodetected(m, ast, inheritable=true) docset = find_docset(ast) if !docset || docset[:type] != :doc_comment if inheritable Loading @@ -360,7 +370,7 @@ module JsDuck # Get line number from third place at range array. # This third item exists in forked EsprimaJS at # https://github.com/nene/esprima/tree/linenr-in-range m[:linenr] = pair["range"][2] m[:linenr] = ast["range"][2] return true end end Loading spec/aggregator_enum_spec.rb +51 −1 Original line number Diff line number Diff line Loading @@ -153,7 +153,7 @@ describe JsDuck::Aggregator do end end describe "enum two properties" do describe "enum of two properties" do let(:doc) do parse(<<-EOS)[0] /** @enum */ Loading @@ -174,6 +174,56 @@ describe JsDuck::Aggregator do end end describe "enum with array value" do let(:props) do parse(<<-EOS)[0][:members][:property] /** @enum */ My.enum.Type = [ "foo", "bar" ]; EOS end it "detects all properties" do props.length.should == 2 end it "gets name" do props[0][:name].should == 'foo' end it "gets default value" do props[0][:default].should == '"foo"' end it "gets type" do props[0][:type].should == 'String' end end describe "enum with documented array values" do let(:props) do parse(<<-EOS)[0][:members][:property] /** @enum */ My.enum.Smartness = [ // A wise choice. "wise", // A foolish decision. "fool" ]; EOS end it "detects docs of first property" do props[0][:doc].should == 'A wise choice.' end it "detects docs of second property" do props[1][:doc].should == 'A foolish decision.' end end describe "enum of widget.*" do let(:props) do parse(<<-EOS)[0][:members][:property] Loading Loading
lib/jsduck/ast.rb +15 −5 Original line number Diff line number Diff line Loading @@ -200,7 +200,9 @@ module JsDuck elsif ext_define?(ast) detect_ext_define(cls, ast) elsif ast["type"] == "ObjectExpression" detect_class_members(cls, ast) detect_class_members_from_object(cls, ast) elsif ast["type"] == "ArrayExpression" detect_class_members_from_array(cls, ast) end end Loading Loading @@ -256,13 +258,21 @@ module JsDuck end # Detects class members from object literal def detect_class_members(cls, ast) def detect_class_members_from_object(cls, ast) cls[:members] = [] each_pair_in_object_expression(ast) do |key, value, pair| detect_method_or_property(cls, key, value, pair) end end # Detects class members from array literal def detect_class_members_from_array(cls, ast) cls[:members] = [] ast["elements"].each do |el| detect_method_or_property(cls, key_value(el), el, el) end end # Detects item in object literal either as method or property def detect_method_or_property(cls, key, value, pair) if function?(value) Loading Loading @@ -341,8 +351,8 @@ module JsDuck # returns false. # # Otherwise detects the line number of member and returns true. def apply_autodetected(m, pair, inheritable=true) docset = find_docset(pair) def apply_autodetected(m, ast, inheritable=true) docset = find_docset(ast) if !docset || docset[:type] != :doc_comment if inheritable Loading @@ -360,7 +370,7 @@ module JsDuck # Get line number from third place at range array. # This third item exists in forked EsprimaJS at # https://github.com/nene/esprima/tree/linenr-in-range m[:linenr] = pair["range"][2] m[:linenr] = ast["range"][2] return true end end Loading
spec/aggregator_enum_spec.rb +51 −1 Original line number Diff line number Diff line Loading @@ -153,7 +153,7 @@ describe JsDuck::Aggregator do end end describe "enum two properties" do describe "enum of two properties" do let(:doc) do parse(<<-EOS)[0] /** @enum */ Loading @@ -174,6 +174,56 @@ describe JsDuck::Aggregator do end end describe "enum with array value" do let(:props) do parse(<<-EOS)[0][:members][:property] /** @enum */ My.enum.Type = [ "foo", "bar" ]; EOS end it "detects all properties" do props.length.should == 2 end it "gets name" do props[0][:name].should == 'foo' end it "gets default value" do props[0][:default].should == '"foo"' end it "gets type" do props[0][:type].should == 'String' end end describe "enum with documented array values" do let(:props) do parse(<<-EOS)[0][:members][:property] /** @enum */ My.enum.Smartness = [ // A wise choice. "wise", // A foolish decision. "fool" ]; EOS end it "detects docs of first property" do props[0][:doc].should == 'A wise choice.' end it "detects docs of second property" do props[1][:doc].should == 'A foolish decision.' end end describe "enum of widget.*" do let(:props) do parse(<<-EOS)[0][:members][:property] Loading