Commit 170ad842 authored by Rene Saarsoo's avatar Rene Saarsoo
Browse files

Support string array as source for enum properties.

parent 58828fe4
Loading
Loading
Loading
Loading
+15 −5
Original line number Diff line number Diff line
@@ -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

@@ -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)
@@ -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
@@ -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
+51 −1
Original line number Diff line number Diff line
@@ -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 */
@@ -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]