Commit 4e5eea6e authored by Rene Saarsoo's avatar Rene Saarsoo
Browse files

Extract Js::Method class from Js::Ast.

Do all the method-data detection inside it.
parent dc3a19c6
Loading
Loading
Loading
Loading
+2 −47
Original line number Diff line number Diff line
require "jsduck/js/returns"
require "jsduck/js/fires"
require "jsduck/js/method_calls"
require "jsduck/js/method"
require "jsduck/js/node"
require "jsduck/tag_registry"

@@ -344,50 +342,7 @@ module JsDuck
      end

      def make_method(name, ast)
        return {
          :tagname => :method,
          :name => name,
          :params => empty_array_to_nil(make_params(ast)),
          :chainable => chainable?(ast) && name != "constructor",
          :fires => empty_array_to_nil(detect_fires(ast)),
          :method_calls => empty_array_to_nil(detect_method_calls(ast)),
        }
      end

      def make_params(ast)
        if ast.function? && !ast.ext_empty_fn?
          ast["params"].map {|p| {:name => p.to_s} }
        else
          []
        end
      end

      def empty_array_to_nil(arr)
        arr.length == 0 ? nil : arr
      end

      def chainable?(ast)
        if ast.function? && !ast.ext_empty_fn?
          Js::Returns.chainable?(ast.raw)
        else
          false
        end
      end

      def detect_fires(ast)
        if ast.function? && !ast.ext_empty_fn?
          Js::Fires.detect(ast)
        else
          []
        end
      end

      def detect_method_calls(ast)
        if ast.function? && !ast.ext_empty_fn?
          Js::MethodCalls.detect(ast)
        else
          []
        end
        Js::Method.detect(name, ast)
      end

      def make_event(name)
+69 −0
Original line number Diff line number Diff line
require "jsduck/util/singleton"
require "jsduck/js/returns"
require "jsduck/js/fires"
require "jsduck/js/method_calls"

module JsDuck
  module Js

    class Method
      include Util::Singleton

      # Detects various properties of a method from AST node and
      # returns a documentation hash with these and method name.
      def detect(name, ast)
        return {
          :tagname => :method,
          :name => name,
          :params => empty_array_to_nil(make_params(ast)),
          :chainable => chainable?(ast) && name != "constructor",
          :fires => empty_array_to_nil(detect_fires(ast)),
          :method_calls => empty_array_to_nil(detect_method_calls(ast)),
        }
      end

      private

      def empty_array_to_nil(arr)
        arr.length == 0 ? nil : arr
      end

      def make_params(ast)
        if proper_function?(ast)
          ast["params"].map {|p| {:name => p.to_s} }
        else
          []
        end
      end

      def chainable?(ast)
        if proper_function?(ast)
          Js::Returns.chainable?(ast.raw)
        else
          false
        end
      end

      def detect_fires(ast)
        if proper_function?(ast)
          Js::Fires.detect(ast)
        else
          []
        end
      end

      def detect_method_calls(ast)
        if proper_function?(ast)
          Js::MethodCalls.detect(ast)
        else
          []
        end
      end

      def proper_function?(ast)
        ast.function? && !ast.ext_empty_fn?
      end

    end
  end
end