Commit 3ab0fa87 authored by Rene Saarsoo's avatar Rene Saarsoo
Browse files

Refactored parse() into whole Parser class.

parent 260ec07d
Loading
Loading
Loading
Loading
+66 −56
Original line number Diff line number Diff line
@@ -235,65 +235,69 @@ module JsDuck
  end


  def JsDuck.parse(input)
    lex = Lexer.new(input)
    docs = []
    while !lex.empty? do
      if lex.look(:doc_comment) then
        doc = lex.next
        if lex.look("function", :ident) then
          lex.next
  class Parser
    def initialize(input)
      @lex = Lexer.new(input)
      @docs = []
    end

    def parse
      while !@lex.empty? do
        if @lex.look(:doc_comment) then
          doc = @lex.next
          if @lex.look("function", :ident) then
            @lex.next
            # function name(){
          doc.set_default(:function, {:name => lex.next})
          doc.set_default_params(parse_params(lex))
        elsif lex.look("var", :ident, "=", "function") then
          lex.next
            doc.set_default(:function, {:name => @lex.next})
            doc.set_default_params(parse_params)
          elsif @lex.look("var", :ident, "=", "function") then
            @lex.next
            # var name = function(){
          doc.set_default(:function, {:name => lex.next})
          lex.next # =
          lex.next # function
          lex.next if lex.look(:ident) # optional anonymous function name
          doc.set_default_params(parse_params(lex))
        elsif lex.look(:ident, "=", "function") ||
            lex.look(:ident, ":", "function") ||
            lex.look(:string, ":", "function") then
            doc.set_default(:function, {:name => @lex.next})
            @lex.next # =
            @lex.next # function
            @lex.next if @lex.look(:ident) # optional anonymous function name
            doc.set_default_params(parse_params)
          elsif @lex.look(:ident, "=", "function") ||
              @lex.look(:ident, ":", "function") ||
              @lex.look(:string, ":", "function") then
            # name: function(){
          doc.set_default(:function, {:name => lex.next})
          lex.next # : or =
          lex.next # function
          lex.next if lex.look(:ident) # optional anonymous function name
          doc.set_default_params(parse_params(lex))
        elsif lex.look(:ident, ".") then
            doc.set_default(:function, {:name => @lex.next})
            @lex.next # : or =
            @lex.next # function
            @lex.next if @lex.look(:ident) # optional anonymous function name
            doc.set_default_params(parse_params)
          elsif @lex.look(:ident, ".") then
            # some.long.prototype.chain = function() {
          lex.next
          while lex.look(".", :ident) do
            lex.next
            name = lex.next
            if lex.look("=", "function") then
            @lex.next
            while @lex.look(".", :ident) do
              @lex.next
              name = @lex.next
              if @lex.look("=", "function") then
                doc.set_default(:function, {:name => name})
              lex.next # =
              lex.next # function
              lex.next if lex.look(:ident) # optional anonymous function name
              doc.set_default_params(parse_params(lex))
                @lex.next # =
                @lex.next # function
                @lex.next if @lex.look(:ident) # optional anonymous function name
                doc.set_default_params(parse_params)
              end
            end
          end
        docs << doc
          @docs << doc
        else
        lex.next
          @lex.next
        end
      end
    return docs
      @docs
    end

  def JsDuck.parse_params(lex)
    def parse_params
      params = []
    if lex.look("(") then
      lex.next
      while lex.look(:ident) do
        params << {:name => lex.next}
        if lex.look(",") then
          lex.next
      if @lex.look("(") then
        @lex.next
        while @lex.look(:ident) do
          params << {:name => @lex.next}
          if @lex.look(",") then
            @lex.next
          else
            break
          end
@@ -301,6 +305,12 @@ module JsDuck
      end
      params
    end
  end


  def JsDuck.parse(input)
    Parser.new(input).parse
  end

end