lib/solargraph/suggestion.rb



require 'json'

module Solargraph

  class Suggestion
    CLASS = 'Class'
    CONSTANT = 'Constant'
    KEYWORD = 'Keyword'
    MODULE = 'Module'
    METHOD = 'Method'
    VARIABLE = 'Variable'
    PROPERTY = 'Property'
    FIELD = 'Field'
    SNIPPET = 'Snippet'

    attr_reader :label, :kind, :insert, :detail, :documentation, :code_object, :location, :arguments

    def initialize label, kind: KEYWORD, insert: nil, detail: nil, documentation: nil, code_object: nil, location: nil, arguments: [], return_type: nil
      @helper = Server::Helpers.new
      @label = label.to_s
      @kind = kind
      @insert = insert || @label
      @detail = detail
      @code_object = code_object
      @documentation = documentation
      @location = location
      @arguments = arguments
      @return_type = return_type
    end
    
    def path
      code_object.nil? ? label : code_object.path
    end

    def to_s
      label
    end

    def return_type
      if @return_type.nil?
        if code_object.nil?
          unless documentation.nil?
            if documentation.kind_of?(YARD::Docstring)
              t = documentation.tag(:return)
              @return_type = t.types[0] unless t.nil? or t.types.nil?
            else
              match = documentation.match(/@return \[([a-z0-9:_]*)/i)
              @return_type = match[1] unless match.nil?
            end
          end
        else
          o = code_object.tag(:overload)
          if o.nil?
            r = code_object.tag(:return)
          else
            r = o.tag(:return)
          end
          @return_type = r.types[0] unless r.nil? or r.types.nil?
        end
      end
      @return_type
    end

    def documentation
      if @documentation.nil?
        unless @code_object.nil?
          @documentation = @code_object.docstring unless @code_object.docstring.nil?
        end
      end
      @documentation
    end

    def params
      if @params.nil?
        @params = []
        return @params if documentation.nil?
        param_tags = documentation.tags(:param)
        unless param_tags.empty?
          param_tags.each do |t|
            txt = t.name.to_s
            txt += " [#{t.types.join(',')}]" unless t.types.nil? or t.types.empty?
            txt += " #{t.text}" unless t.text.nil? or t.text.empty?
            @params.push txt
          end
        end
      end
      @params
    end

    def to_json args={}
      obj = {
        label: @label,
        kind: @kind,
        insert: @insert,
        detail: @detail,
        path: path,
        location: (@location.nil? ? nil : @location.to_s),
        arguments: @arguments,
        params: params,
        return_type: return_type,
        documentation: @helper.html_markup_rdoc(documentation.to_s)
      }
      obj.to_json(args)
    end
  end

end