Commit 65831c92 authored by Rene Saarsoo's avatar Rene Saarsoo
Browse files

Read xtype information from "alias" property.

All widget.* aliases are now recorded as xtype names.

Although currently SDK docs still only display one xtype per component,
because @xtype overrides any xtypes detected from code.  (It's the same
with alternateClassNames and mixins.)
parent d58b74ec
Loading
Loading
Loading
Loading
+18 −4
Original line number Diff line number Diff line
@@ -195,7 +195,7 @@ module JsDuck
      cfg
    end

    # <ext-define-cfg> := "{" ( <extend> | <mixins> | <alternate-class-name> | <?> )*
    # <ext-define-cfg> := "{" ( <extend> | <mixins> | <alternate-class-name> | <alias> | <?> )*
    def ext_define_cfg
      match("{")
      cfg = {}
@@ -209,7 +209,10 @@ module JsDuck
          cfg[:mixins] = ext_define_mixins
          found = true
        elsif look("alternateClassName", ":")
          cfg[:alternateClassNames] = ext_define_alternate_class_name
          cfg[:alternateClassNames] = ext_define_alternate_class_names
          found = true
        elsif look("alias", ":")
          cfg[:alias] = ext_define_alias
          found = true
        elsif look(:ident, ":")
          match(:ident, ":")
@@ -234,9 +237,20 @@ module JsDuck
      match("extend", ":", :string)
    end

    # <ext-define-alternate-class-name> := "alternateClassName" ":" ( <string> | <array-of-strings> )
    def ext_define_alternate_class_name
    # <ext-define-alternate-class-names> := "alternateClassName" ":" <string-or-list>
    def ext_define_alternate_class_names
      match("alternateClassName", ":")
      string_or_list
    end

    # <ext-define-alias> := "alias" ":" <string-or-list>
    def ext_define_alias
      match("alias", ":")
      string_or_list
    end

    # <string-or-list> := ( <string> | <array-of-strings> )
    def string_or_list
      if look(:string)
        [ match(:string) ]
      elsif look("[")
+9 −3
Original line number Diff line number Diff line
@@ -121,7 +121,7 @@ module JsDuck
        :extends => detect_extends(doc_map, code),
        :mixins => detect_list(:mixins, doc_map, code),
        :alternateClassNames => detect_list(:alternateClassNames, doc_map, code),
        :xtypes => detect_xtypes(doc_map),
        :xtypes => detect_xtypes(doc_map, code),
        :author => detect_author(doc_map),
        :docauthor => detect_docauthor(doc_map),
        :singleton => !!doc_map[:singleton],
@@ -273,8 +273,14 @@ module JsDuck
      end
    end

    def detect_xtypes(doc_map)
      doc_map[:xtype] ? doc_map[:xtype].map {|tag| tag[:name] } : []
    def detect_xtypes(doc_map, code)
      if doc_map[:xtype]
        doc_map[:xtype].map {|tag| tag[:name] }
      elsif code[:alias]
        code[:alias].find_all {|a| a =~ /^widget\./ }.map {|a| a.sub(/^widget\./, "") }
      else
        []
      end
    end

    def detect_author(doc_map)
+5 −1
Original line number Diff line number Diff line
@@ -195,6 +195,9 @@ describe JsDuck::Aggregator do
    it "detects implied alternateClassNames" do
      @doc[:alternateClassNames].should == ["JustClass"]
    end
    it "detects implied xtype" do
      @doc[:xtypes].should == ["foo"]
    end
  end

  describe "basic Ext.define() in code" do
@@ -207,6 +210,7 @@ describe JsDuck::Aggregator do
            obs: 'Ext.util.Observable',
            bar: 'Foo.Bar'
          },
          alias: 'widget.foo',
          alternateClassName: 'JustClass'
        });
      EOS
@@ -221,7 +225,7 @@ describe JsDuck::Aggregator do
        Ext.define('MyClass', {
          singleton: true,
          extend: 'Your.Class',
          alias: 'somealias',
          alias: ['widget.foo', 'something.bar'],
          alternateClassName: ['JustClass'],
          requires: ['Hohooo', 'hahaa'],
          mixins: {