Commit 254ffb94 authored by Rene Saarsoo's avatar Rene Saarsoo
Browse files

Class name auto-detection.

parent 59b4ea3a
Loading
Loading
Loading
Loading
+12 −5
Original line number Diff line number Diff line
@@ -13,17 +13,17 @@ module JsDuck
      exp = expression?(ast) ? ast["expression"] : nil
      var = var?(ast) ? ast["declarations"][0] : nil

      if exp && call?(exp) && ext_define?(exp)
        {:type => :class}
      if exp && ext_define?(exp)
        make_class(exp["arguments"][0])

      elsif exp && assignment?(exp) && (ext_extend?(exp["right"]) || class_name?(exp["left"]))
        {:type => :class}
        make_class(exp["left"])

      elsif var && (ext_extend?(var["init"]) || class_name?(var["id"]))
        {:type => :class}
        make_class(var["id"])

      elsif function?(ast) && class_name?(ast["id"])
        {:type => :class}
        make_class(ast["id"])

      elsif function?(ast)
        make_method(ast["id"], ast)
@@ -85,6 +85,13 @@ module JsDuck
      return to_s(ast).split(/\./).last =~ /\A[A-Z]/
    end

    def make_class(name_ast, ast=nil)
      return {
        :type => :class,
        :name => to_s(name_ast)
      }
    end

    def make_method(name_ast, ast=nil)
      return {
        :type => :method,

spec/ast_class_spec.rb

0 → 100644
+44 −0
Original line number Diff line number Diff line
require "jsduck/ast"
require "jsduck/esprima_parser"

describe "JsDuck::Ast detects class with" do
  def detect(string)
    node = JsDuck::EsprimaParser.new(string).parse[0]
    return JsDuck::Ast.new.detect(node[:code])
  end

  describe "name in" do
    it "function declaration" do
      detect("/** */ function MyClass() {}")[:name].should == "MyClass"
    end

    it "function assignment" do
      detect("/** */ MyClass = function() {}")[:name].should == "MyClass"
    end

    it "function assignment to property" do
      detect("/** */ foo.MyClass = function() {}")[:name].should == "foo.MyClass"
    end

    it "var initialization with function" do
      detect("/** */ var MyClass = function() {}")[:name].should == "MyClass"
    end

    it "Ext.extend() assignment" do
      detect("/** */ MyClass = Ext.extend(Your.Class, {  });")[:name].should == "MyClass"
    end

    it "var initialized with Ext.extend()" do
      detect("/** */ var MyClass = Ext.extend(Your.Class, {  });")[:name].should == "MyClass"
    end

    it "Ext.define()" do
      detect(<<-EOS)[:name].should == "MyClass"
        /** */
        Ext.define('MyClass', {
        });
      EOS
    end
  end

end