Commit ddfd09da authored by Rene Saarsoo's avatar Rene Saarsoo
Browse files

Add eOpts param to events when in Ext4 context.

A regression. This worked in JSDuck 3.x but the behavior was lost
during parser updates.  Now additionally covered with unit tests.
parent 7ee72183
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -217,6 +217,7 @@ module JsDuck
      cls[:aliases] = []
      cls[:members] = []
      cls[:statics] = []
      cls[:code_type] = :ext_define

      each_pair_in_object_expression(ast["arguments"][1]) do |key, value, pair|
        case key
+3 −1
Original line number Diff line number Diff line
@@ -44,8 +44,10 @@ module JsDuck
      h[:extends] = nil if h[:extends] == "Object"

      h[:aliases] = build_aliases_hash(h[:aliases] || [])

      # Used by Aggregator to determine if we're dealing with Ext4 code
      h[:code_type] = code[:tagname]
      h[:code_type] = code[:code_type] if code[:code_type]

      h[:members] = Class.default_members_hash
      h[:statics] = Class.default_members_hash

+87 −0
Original line number Diff line number Diff line
require "jsduck/aggregator"
require "jsduck/source_file"

describe JsDuck::Aggregator do
  def parse(string)
    agr = JsDuck::Aggregator.new
    agr.aggregate(JsDuck::SourceFile.new(string))
    agr.append_ext4_event_options
    agr.result
  end

  describe "event inside Ext.define get extra parameter" do
    let(:event) do
      parse(<<-EOF)[0][:members][:event][0]
        /** */
        Ext.define("Blah", {
            /**
             * @event click
             * @param {Number} foo
             * @param {String} bar
             */
        });
      EOF
    end

    it "added to end" do
      event[:params].length.should == 3
    end

    it "named eOpts" do
      event[:params][2][:name].should == "eOpts"
    end

    it "of type Object" do
      event[:params][2][:type].should == "Object"
    end

    it "with standard description" do
      event[:params][2][:doc].should =~ /The options object passed to.*addListener/
    end
  end

  describe "When some class defined with Ext.define" do
    let(:events) do
      parse(<<-EOF)[0][:members][:event]
        /** @class Foo */
            /**
             * @event click
             * @param {Number} foo
             */
            /**
             * @event touch
             */

        /** */
        Ext.define("Bar", {});
      EOF
    end

    it "events get extra parameter" do
      events[0][:params].length.should == 2
      events[1][:params].length.should == 1
    end
  end

  describe "Without Ext.define-d class" do
    let(:events) do
      parse(<<-EOF)[0][:members][:event]
        /** @class Foo */
            /**
             * @event click
             * @param {Number} foo
             */
            /**
             * @event touch
             */
      EOF
    end

    it "no extra param gets added" do
      events[0][:params].length.should == 1
      events[1][:params].length.should == 0
    end
  end

end