Commit 93b806e5 authored by Rene Saarsoo's avatar Rene Saarsoo
Browse files

Parse several Ext.define() configs inside tag classes.

Builtin tags can now define @ext_define_pattern - which causes
the #parse_ext_define method to be invoked when such an item is
encountered within Ext.define config.
parent bd17b45c
Loading
Loading
Loading
Loading
+17 −50
Original line number Diff line number Diff line
@@ -2,6 +2,7 @@ require "jsduck/serializer"
require "jsduck/evaluator"
require "jsduck/function_ast"
require "jsduck/ast_node"
require "jsduck/builtins_registry"

module JsDuck

@@ -205,25 +206,10 @@ module JsDuck
      cls[:code_type] = :ext_define

      ast["arguments"][1].each_property do |key, value, pair|
        if tag = BuiltinsRegistry.get_ext_define(key)
          tag.parse_ext_define(cls, value)
        else
          case key
        when "extend"
          cls[:extends] = make_string(value)
        when "override"
          cls[:override] = make_string(value)
        when "requires"
          cls[:requires] = make_string_list(value)
        when "uses"
          cls[:uses] = make_string_list(value)
        when "alternateClassName"
          cls[:alternateClassNames] = make_string_list(value)
        when "mixins"
          cls[:mixins] = make_mixins(value)
        when "singleton"
          cls[:singleton] = make_singleton(value)
        when "alias"
          cls[:aliases] += make_string_list(value)
        when "xtype"
          cls[:aliases] += make_string_list(value).map {|xtype| "widget."+xtype }
          when "config"
            cls[:members] += make_configs(value.raw, {:accessor => true})
          when "cachedConfig"
@@ -239,6 +225,7 @@ module JsDuck
          end
        end
      end
    end

    # Detects class members from object literal
    def detect_class_members_from_object(cls, ast)
@@ -272,26 +259,6 @@ module JsDuck
      end
    end

    def make_string(ast)
      str = ast.to_value
      str.is_a?(String) ? str : nil
    end

    def make_string_list(ast)
      strings = Array(ast.to_value)
      strings.all? {|s| s.is_a?(String) } ? strings : []
    end

    def make_mixins(ast)
      v = ast.to_value
      mixins = v.is_a?(Hash) ? v.values : Array(v)
      mixins.all? {|mx| mx.is_a? String } ? mixins : []
    end

    def make_singleton(ast)
      ast.to_value == true
    end

    def make_configs(ast, defaults={})
      configs = []

+19 −0
Original line number Diff line number Diff line
module JsDuck

  # Helpers for handling the parsing of Ext.define definitions
  class AstUtils
    # When the value is string, returns the string, otherwise nil
    def self.make_string(ast)
      str = ast.to_value
      str.is_a?(String) ? str : nil
    end

    # When the value is string or array of strings, returns array of
    # strings. In any other case, returns empty array.
    def self.make_string_list(ast)
      strings = Array(ast.to_value)
      strings.all? {|s| s.is_a?(String) } ? strings : []
    end
  end

end
+6 −0
Original line number Diff line number Diff line
require "jsduck/builtins/inheritdoc"
require "jsduck/ast_utils"

module JsDuck::Builtins
  class Alias < Inheritdoc
    def initialize
      @pattern = "alias"
      @ext_define_pattern = "alias"
    end

    # For backwards compatibility decide whether the @alias was used
@@ -22,5 +24,9 @@ module JsDuck::Builtins
      p.add_tag(:alias)
      p.maybe_ident_chain(:name)
    end

    def parse_ext_define(cls, ast)
      cls[:aliases] += JsDuck::AstUtils.make_string_list(ast)
    end
  end
end
+6 −0
Original line number Diff line number Diff line
require "jsduck/builtins/tag"
require "jsduck/ast_utils"

module JsDuck::Builtins
  class AlternateClassNames < Tag
    def initialize
      @pattern = ["alternateClassName", "alternateClassNames"]
      @ext_define_pattern = "alternateClassName"
    end

    # @alternateClassNames classname1 classname2 ...
@@ -11,5 +13,9 @@ module JsDuck::Builtins
      p.add_tag(:alternateClassNames)
      p.classname_list(:alternateClassNames)
    end

    def parse_ext_define(cls, ast)
      cls[:alternateClassNames] = JsDuck::AstUtils.make_string_list(ast)
    end
  end
end
+6 −0
Original line number Diff line number Diff line
require "jsduck/builtins/tag"
require "jsduck/ast_utils"

module JsDuck::Builtins
  class Extends < Tag
    def initialize
      @pattern = ["extend", "extends"]
      @ext_define_pattern = "extend"
    end

    # @extends classname
@@ -11,5 +13,9 @@ module JsDuck::Builtins
      p.add_tag(:extends)
      p.maybe_ident_chain(:extends)
    end

    def parse_ext_define(cls, ast)
      cls[:extends] = JsDuck::AstUtils.make_string(ast)
    end
  end
end
Loading