solargraph 0.17.0 → 0.17.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/solargraph/api_map.rb +22 -11
- data/lib/solargraph/api_map/source_to_yard.rb +13 -11
- data/lib/solargraph/code_map.rb +46 -3
- data/lib/solargraph/version.rb +1 -1
- data/lib/solargraph/yard_map.rb +46 -6
- metadata +2 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 9e75af30aa57a99e118082d7c337d889f7aa6151
         | 
| 4 | 
            +
              data.tar.gz: 2937ed78501b758858b304127987eb822540163f
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 110b41dcd353afc575f30a096e9e83d311ff8d664e37847097d4618ab8bfe76f7d4825ff730838f971ba3af503015cde7b156e7a1d8afef504dfa3b1515dc13e
         | 
| 7 | 
            +
              data.tar.gz: 5e0bc35e2d8c06a73e452451ddb3167f06f00fc8e52add97f9ea4152387e14ea366d4e2b715491697f65194d601feb0d04d23c2b09d5bef31ec5136d29dc3b50
         | 
    
        data/lib/solargraph/api_map.rb
    CHANGED
    
    | @@ -104,7 +104,7 @@ module Solargraph | |
| 104 104 | 
             
                      true
         | 
| 105 105 | 
             
                    end
         | 
| 106 106 | 
             
                  end
         | 
| 107 | 
            -
                  if filename.nil? or filename.end_with?('.rb')
         | 
| 107 | 
            +
                  if filename.nil? or filename.end_with?('.rb') or filename.end_with?('.erb')
         | 
| 108 108 | 
             
                    eliminate @virtual_filename unless @virtual_source.nil? or @virtual_filename == filename or workspace_files.include?(@virtual_filename)
         | 
| 109 109 | 
             
                    @virtual_filename = filename
         | 
| 110 110 | 
             
                    @virtual_source = Source.fix(code, filename, cursor)
         | 
| @@ -208,16 +208,22 @@ module Solargraph | |
| 208 208 | 
             
                  result = []
         | 
| 209 209 | 
             
                  skip = []
         | 
| 210 210 | 
             
                  fqns = find_fully_qualified_namespace(namespace, root)
         | 
| 211 | 
            +
                  return [] if fqns.nil?
         | 
| 211 212 | 
             
                  if fqns.empty?
         | 
| 212 | 
            -
                    result.concat inner_get_constants('', skip, false, :public)
         | 
| 213 | 
            +
                    result.concat inner_get_constants('', skip, false, [:public])
         | 
| 213 214 | 
             
                  else
         | 
| 214 215 | 
             
                    parts = fqns.split('::')
         | 
| 215 | 
            -
                     | 
| 216 | 
            -
             | 
| 217 | 
            -
                       | 
| 218 | 
            -
             | 
| 219 | 
            -
             | 
| 216 | 
            +
                    while parts.length > 0
         | 
| 217 | 
            +
                      resolved = find_namespace_pins(parts.join('::'))
         | 
| 218 | 
            +
                      resolved.each do |pin|
         | 
| 219 | 
            +
                        visi = :public
         | 
| 220 | 
            +
                        visi = :private if namespace == '' and root != '' and pin.path == fqns
         | 
| 221 | 
            +
                        result.concat inner_get_constants(pin.path, skip, true, visi)
         | 
| 222 | 
            +
                      end
         | 
| 223 | 
            +
                      parts.pop
         | 
| 224 | 
            +
                      break unless namespace.empty?
         | 
| 220 225 | 
             
                    end
         | 
| 226 | 
            +
                    result.concat inner_get_constants('', [], false) if namespace.empty?
         | 
| 221 227 | 
             
                  end
         | 
| 222 228 | 
             
                  result.concat yard_map.get_constants(fqns)
         | 
| 223 229 | 
             
                  result
         | 
| @@ -832,7 +838,9 @@ module Solargraph | |
| 832 838 | 
             
                    unless sc.nil?
         | 
| 833 839 | 
             
                      sc_visi = [:public]
         | 
| 834 840 | 
             
                      sc_visi.push :protected if root == fqns
         | 
| 835 | 
            -
                       | 
| 841 | 
            +
                      nfqns = find_fully_qualified_namespace(sc, fqns)
         | 
| 842 | 
            +
                      meths.concat inner_get_methods('', nfqns, skip, sc_visi)
         | 
| 843 | 
            +
                      meths.concat yard_map.get_methods(nfqns, '', visibility: sc_visi)
         | 
| 836 844 | 
             
                    end
         | 
| 837 845 | 
             
                  end
         | 
| 838 846 | 
             
                  em = @namespace_extends[fqns]
         | 
| @@ -866,13 +874,16 @@ module Solargraph | |
| 866 874 | 
             
                    unless sc.nil?
         | 
| 867 875 | 
             
                      sc_visi = [:public]
         | 
| 868 876 | 
             
                      sc_visi.push :protected if sc == fqns
         | 
| 869 | 
            -
                       | 
| 877 | 
            +
                      nfqns = find_fully_qualified_namespace(sc, fqns)
         | 
| 878 | 
            +
                      meths.concat inner_get_instance_methods('', nfqns, skip, sc_visi)
         | 
| 879 | 
            +
                      meths.concat yard_map.get_instance_methods(nfqns, '', visibility: sc_visi)
         | 
| 870 880 | 
             
                    end
         | 
| 871 881 | 
             
                  end
         | 
| 872 882 | 
             
                  im = @namespace_includes[fqns]
         | 
| 873 883 | 
             
                  unless im.nil?
         | 
| 874 884 | 
             
                    im.each do |i|
         | 
| 875 | 
            -
                       | 
| 885 | 
            +
                      nfqns = find_fully_qualified_namespace(i, fqns)
         | 
| 886 | 
            +
                      meths.concat inner_get_instance_methods('', nfqns, skip, visibility)
         | 
| 876 887 | 
             
                    end
         | 
| 877 888 | 
             
                  end
         | 
| 878 889 | 
             
                  meths.uniq
         | 
| @@ -949,7 +960,7 @@ module Solargraph | |
| 949 960 | 
             
                  type
         | 
| 950 961 | 
             
                end
         | 
| 951 962 |  | 
| 952 | 
            -
                def inner_get_constants here, skip = [], deep = true, visibility
         | 
| 963 | 
            +
                def inner_get_constants here, skip = [], deep = true, visibility = [:public]
         | 
| 953 964 | 
             
                  return [] if skip.include?(here)
         | 
| 954 965 | 
             
                  skip.push here
         | 
| 955 966 | 
             
                  result = []
         | 
| @@ -2,8 +2,6 @@ module Solargraph | |
| 2 2 | 
             
              class ApiMap
         | 
| 3 3 | 
             
                module SourceToYard
         | 
| 4 4 |  | 
| 5 | 
            -
                  private
         | 
| 6 | 
            -
             | 
| 7 5 | 
             
                  # Get the YARD CodeObject at the specified path.
         | 
| 8 6 | 
             
                  #
         | 
| 9 7 | 
             
                  # @return [YARD::CodeObjects::Base]
         | 
| @@ -15,14 +13,6 @@ module Solargraph | |
| 15 13 | 
             
                    code_object_map.keys
         | 
| 16 14 | 
             
                  end
         | 
| 17 15 |  | 
| 18 | 
            -
                  def code_object_map
         | 
| 19 | 
            -
                    @code_object_map ||= {}
         | 
| 20 | 
            -
                  end
         | 
| 21 | 
            -
             | 
| 22 | 
            -
                  def root_code_object
         | 
| 23 | 
            -
                    @root_code_object ||= YARD::CodeObjects::RootObject.new(nil, 'root')
         | 
| 24 | 
            -
                  end
         | 
| 25 | 
            -
             | 
| 26 16 | 
             
                  # @param sources [Array<Solargraph::ApiMap::Source>] Sources for code objects
         | 
| 27 17 | 
             
                  def rake_yard sources
         | 
| 28 18 | 
             
                    code_object_map.clear
         | 
| @@ -37,7 +27,9 @@ module Solargraph | |
| 37 27 | 
             
                        code_object_map[pin.path].files.push pin.source.filename
         | 
| 38 28 | 
             
                      end
         | 
| 39 29 | 
             
                      s.namespace_includes.each_pair do |n, i|
         | 
| 40 | 
            -
                         | 
| 30 | 
            +
                        i.each do |inc|
         | 
| 31 | 
            +
                          code_object_map[n].instance_mixins.push code_object_map[inc] unless code_object_map[inc].nil?
         | 
| 32 | 
            +
                        end
         | 
| 41 33 | 
             
                      end
         | 
| 42 34 | 
             
                      s.attribute_pins.each do |pin|
         | 
| 43 35 | 
             
                        code_object_map[pin.path] ||= YARD::CodeObjects::MethodObject.new(code_object_at(pin.namespace), pin.name, :instance)
         | 
| @@ -60,6 +52,16 @@ module Solargraph | |
| 60 52 | 
             
                      end
         | 
| 61 53 | 
             
                    end
         | 
| 62 54 | 
             
                  end
         | 
| 55 | 
            +
             | 
| 56 | 
            +
                  private
         | 
| 57 | 
            +
             | 
| 58 | 
            +
                  def code_object_map
         | 
| 59 | 
            +
                    @code_object_map ||= {}
         | 
| 60 | 
            +
                  end
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                  def root_code_object
         | 
| 63 | 
            +
                    @root_code_object ||= YARD::CodeObjects::RootObject.new(nil, 'root')
         | 
| 64 | 
            +
                  end
         | 
| 63 65 | 
             
                end
         | 
| 64 66 | 
             
              end
         | 
| 65 67 | 
             
            end
         | 
    
        data/lib/solargraph/code_map.rb
    CHANGED
    
    | @@ -2,8 +2,6 @@ require 'parser/current' | |
| 2 2 |  | 
| 3 3 | 
             
            module Solargraph
         | 
| 4 4 | 
             
              class CodeMap
         | 
| 5 | 
            -
                autoload :Statement, 'solargraph/code_map/statement'
         | 
| 6 | 
            -
             | 
| 7 5 | 
             
                # The root node of the parsed code.
         | 
| 8 6 | 
             
                #
         | 
| 9 7 | 
             
                # @return [Parser::AST::Node]
         | 
| @@ -32,7 +30,11 @@ module Solargraph | |
| 32 30 | 
             
                  filename = filename.gsub(File::ALT_SEPARATOR, File::SEPARATOR) unless filename.nil? or File::ALT_SEPARATOR.nil?
         | 
| 33 31 | 
             
                  @filename = filename
         | 
| 34 32 | 
             
                  @api_map = api_map
         | 
| 35 | 
            -
                   | 
| 33 | 
            +
                  if !filename.nil? and filename.end_with?('.erb')
         | 
| 34 | 
            +
                    @source = self.api_map.virtualize(convert_erb(code), filename, cursor)
         | 
| 35 | 
            +
                  else
         | 
| 36 | 
            +
                    @source = self.api_map.virtualize(code, filename, cursor)
         | 
| 37 | 
            +
                  end
         | 
| 36 38 | 
             
                  @node = @source.node
         | 
| 37 39 | 
             
                  @code = @source.code
         | 
| 38 40 | 
             
                  @comments = @source.comments
         | 
| @@ -813,5 +815,46 @@ module Solargraph | |
| 813 815 | 
             
                  return [] if match.nil?
         | 
| 814 816 | 
             
                  match[1].split(',').map(&:strip)
         | 
| 815 817 | 
             
                end
         | 
| 818 | 
            +
             | 
| 819 | 
            +
                # @param template [String]
         | 
| 820 | 
            +
                def convert_erb template
         | 
| 821 | 
            +
                  result = ''
         | 
| 822 | 
            +
                  i = 0
         | 
| 823 | 
            +
                  in_code = false
         | 
| 824 | 
            +
                  if template.start_with?('<%=')
         | 
| 825 | 
            +
                    i += 3
         | 
| 826 | 
            +
                    result += ';;;'
         | 
| 827 | 
            +
                    in_code = true
         | 
| 828 | 
            +
                  elsif template.start_with? '<%'
         | 
| 829 | 
            +
                    i += 2
         | 
| 830 | 
            +
                    result += ';;'
         | 
| 831 | 
            +
                    in_code = true
         | 
| 832 | 
            +
                  end
         | 
| 833 | 
            +
                  while i < template.length
         | 
| 834 | 
            +
                    if in_code
         | 
| 835 | 
            +
                      if template[i, 2] == '%>'
         | 
| 836 | 
            +
                        i += 2
         | 
| 837 | 
            +
                        result += ';;'
         | 
| 838 | 
            +
                        in_code = false
         | 
| 839 | 
            +
                      else
         | 
| 840 | 
            +
                        result += template[i]
         | 
| 841 | 
            +
                      end
         | 
| 842 | 
            +
                    else
         | 
| 843 | 
            +
                      if template[i, 3] == '<%='
         | 
| 844 | 
            +
                        i += 2
         | 
| 845 | 
            +
                        result += ';;;'
         | 
| 846 | 
            +
                        in_code = true
         | 
| 847 | 
            +
                      elsif template[i, 2] == '<%'
         | 
| 848 | 
            +
                        i += 1
         | 
| 849 | 
            +
                        result += ';;'
         | 
| 850 | 
            +
                        in_code = true
         | 
| 851 | 
            +
                      else
         | 
| 852 | 
            +
                        result += template[i].sub(/[^\s]/, ' ')
         | 
| 853 | 
            +
                      end
         | 
| 854 | 
            +
                    end
         | 
| 855 | 
            +
                    i += 1
         | 
| 856 | 
            +
                  end
         | 
| 857 | 
            +
                  result
         | 
| 858 | 
            +
                end
         | 
| 816 859 | 
             
              end
         | 
| 817 860 | 
             
            end
         | 
    
        data/lib/solargraph/version.rb
    CHANGED
    
    
    
        data/lib/solargraph/yard_map.rb
    CHANGED
    
    | @@ -22,6 +22,8 @@ module Solargraph | |
| 22 22 | 
             
                  # HACK: YardMap needs its own copy of this array
         | 
| 23 23 | 
             
                  @required = required.clone
         | 
| 24 24 | 
             
                  @namespace_yardocs = {}
         | 
| 25 | 
            +
                  @gem_paths = {}
         | 
| 26 | 
            +
                  process_gem_paths
         | 
| 25 27 | 
             
                  if !workspace.nil? and File.exist?(File.join workspace, 'Gemfile')
         | 
| 26 28 | 
             
                    Bundler.with_clean_env do
         | 
| 27 29 | 
             
                      Bundler.environment.chdir(workspace) do
         | 
| @@ -246,7 +248,7 @@ module Solargraph | |
| 246 248 | 
             
                          meths = obj.meths(scope: [:instance]).keep_if{|m| m.name.to_s == parts[1]}
         | 
| 247 249 | 
             
                          meths.each do |m|
         | 
| 248 250 | 
             
                            args = get_method_args(m)
         | 
| 249 | 
            -
                            result.push Solargraph::Suggestion.new(m.name, kind: 'Method', detail: m.path, code_object: m, arguments: args)
         | 
| 251 | 
            +
                            result.push Solargraph::Suggestion.new(m.name, kind: 'Method', detail: m.path, code_object: m, arguments: args, location: object_location(m))
         | 
| 250 252 | 
             
                          end
         | 
| 251 253 | 
             
                        end
         | 
| 252 254 | 
             
                      else
         | 
| @@ -254,7 +256,7 @@ module Solargraph | |
| 254 256 | 
             
                          args = []
         | 
| 255 257 | 
             
                          args = get_method_args(obj) if obj.kind_of?(YARD::CodeObjects::MethodObject)
         | 
| 256 258 | 
             
                          kind = kind_of_object(obj)
         | 
| 257 | 
            -
                          result.push Solargraph::Suggestion.new(obj.name, kind: kind, detail: obj.path, code_object: obj, arguments: args)
         | 
| 259 | 
            +
                          result.push Solargraph::Suggestion.new(obj.name, kind: kind, detail: obj.path, code_object: obj, arguments: args, location: object_location(obj))
         | 
| 258 260 | 
             
                        end
         | 
| 259 261 | 
             
                      end
         | 
| 260 262 | 
             
                    end
         | 
| @@ -374,6 +376,37 @@ module Solargraph | |
| 374 376 | 
             
                  end
         | 
| 375 377 | 
             
                end
         | 
| 376 378 |  | 
| 379 | 
            +
                def process_gem_paths
         | 
| 380 | 
            +
                  if !has_bundle?
         | 
| 381 | 
            +
                    required.each do |r|
         | 
| 382 | 
            +
                      spec = Gem::Specification.find_by_path(r)
         | 
| 383 | 
            +
                      if spec.nil?
         | 
| 384 | 
            +
                        STDERR.puts "Required path not found: #{r}"
         | 
| 385 | 
            +
                      else
         | 
| 386 | 
            +
                        @gem_paths[spec.name] = spec.full_gem_path
         | 
| 387 | 
            +
                      end
         | 
| 388 | 
            +
                    end
         | 
| 389 | 
            +
                  else
         | 
| 390 | 
            +
                    Bundler.with_clean_env do
         | 
| 391 | 
            +
                      Bundler.environment.chdir(workspace) do
         | 
| 392 | 
            +
                        Bundler.environment.gems.to_a.each do |g|
         | 
| 393 | 
            +
                          @gem_paths[g.name] = g.full_gem_path
         | 
| 394 | 
            +
                        end
         | 
| 395 | 
            +
                      end
         | 
| 396 | 
            +
                      #Bundler.environment.chdir(workspace) do
         | 
| 397 | 
            +
                      #  required.each do |r|
         | 
| 398 | 
            +
                      #    spec = Bundler.rubygems.gem_from_path(r)
         | 
| 399 | 
            +
                      #    if spec.nil?
         | 
| 400 | 
            +
                      #      STDERR.puts "Required path not found: #{r}"
         | 
| 401 | 
            +
                      #    else
         | 
| 402 | 
            +
                      #      @gem_paths[spec.name] = spec.full_gem_path
         | 
| 403 | 
            +
                      #    end
         | 
| 404 | 
            +
                      #  end
         | 
| 405 | 
            +
                      #end
         | 
| 406 | 
            +
                    end
         | 
| 407 | 
            +
                  end
         | 
| 408 | 
            +
                end
         | 
| 409 | 
            +
             | 
| 377 410 | 
             
                def find_yardoc path
         | 
| 378 411 | 
             
                  result = nil
         | 
| 379 412 | 
             
                  spec = Gem::Specification.find_by_path(path)
         | 
| @@ -441,11 +474,18 @@ module Solargraph | |
| 441 474 |  | 
| 442 475 | 
             
                # @param obj [YARD::CodeObjects::Base]
         | 
| 443 476 | 
             
                def object_location obj
         | 
| 444 | 
            -
                  # @todo Locations from YardMaps are temporarily disabled pending a
         | 
| 445 | 
            -
                  # method for resolving the source file's absolute path.
         | 
| 446 | 
            -
                  return nil
         | 
| 447 477 | 
             
                  return nil if obj.file.nil? or obj.line.nil?
         | 
| 448 | 
            -
                   | 
| 478 | 
            +
                  @gem_paths.values.each do |path|
         | 
| 479 | 
            +
                    file = File.join(path, obj.file)
         | 
| 480 | 
            +
                    if File.exist?(file)
         | 
| 481 | 
            +
                      return "#{file}:#{obj.line - 1}:0"
         | 
| 482 | 
            +
                    end
         | 
| 483 | 
            +
                  end
         | 
| 484 | 
            +
                  nil
         | 
| 485 | 
            +
                end
         | 
| 486 | 
            +
             | 
| 487 | 
            +
                def has_bundle?
         | 
| 488 | 
            +
                  !workspace.nil? and File.exist?(File.join workspace, 'Gemfile')
         | 
| 449 489 | 
             
                end
         | 
| 450 490 | 
             
              end
         | 
| 451 491 | 
             
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: solargraph
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.17. | 
| 4 | 
            +
              version: 0.17.1
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Fred Snyder
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2018-02- | 
| 11 | 
            +
            date: 2018-02-05 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: parser
         |