solargraph 0.39.17 → 0.40.0

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.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +2 -7
  3. data/CHANGELOG.md +984 -0
  4. data/SPONSORS.md +1 -0
  5. data/lib/solargraph.rb +2 -4
  6. data/lib/solargraph/api_map.rb +61 -64
  7. data/lib/solargraph/api_map/cache.rb +2 -2
  8. data/lib/solargraph/api_map/store.rb +3 -7
  9. data/lib/solargraph/{bundle.rb → bench.rb} +6 -2
  10. data/lib/solargraph/compat.rb +14 -0
  11. data/lib/solargraph/convention.rb +13 -4
  12. data/lib/solargraph/convention/base.rb +16 -8
  13. data/lib/solargraph/convention/gemfile.rb +2 -5
  14. data/lib/solargraph/convention/gemspec.rb +3 -6
  15. data/lib/solargraph/convention/rspec.rb +3 -6
  16. data/lib/solargraph/environ.rb +11 -6
  17. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +6 -1
  18. data/lib/solargraph/language_server/message/text_document/definition.rb +1 -1
  19. data/lib/solargraph/library.rb +5 -5
  20. data/lib/solargraph/parser/legacy/node_processors/ivasgn_node.rb +1 -1
  21. data/lib/solargraph/parser/legacy/node_processors/send_node.rb +34 -22
  22. data/lib/solargraph/parser/node_processor/base.rb +3 -0
  23. data/lib/solargraph/parser/rubyvm/node_processors/args_node.rb +1 -1
  24. data/lib/solargraph/parser/rubyvm/node_processors/ivasgn_node.rb +1 -1
  25. data/lib/solargraph/parser/rubyvm/node_processors/send_node.rb +38 -28
  26. data/lib/solargraph/pin.rb +0 -3
  27. data/lib/solargraph/pin/common.rb +1 -1
  28. data/lib/solargraph/pin/conversions.rb +1 -1
  29. data/lib/solargraph/pin/documenting.rb +3 -9
  30. data/lib/solargraph/pin/method.rb +141 -7
  31. data/lib/solargraph/pin/method_alias.rb +1 -1
  32. data/lib/solargraph/position.rb +2 -14
  33. data/lib/solargraph/source.rb +10 -6
  34. data/lib/solargraph/source/chain.rb +3 -3
  35. data/lib/solargraph/source_map.rb +4 -1
  36. data/lib/solargraph/source_map/clip.rb +3 -2
  37. data/lib/solargraph/source_map/mapper.rb +10 -6
  38. data/lib/solargraph/type_checker.rb +35 -39
  39. data/lib/solargraph/type_checker/param_def.rb +1 -1
  40. data/lib/solargraph/version.rb +1 -1
  41. data/lib/solargraph/yard_map.rb +38 -47
  42. data/lib/solargraph/yard_map/core_fills.rb +185 -0
  43. data/lib/solargraph/yard_map/helpers.rb +16 -0
  44. data/lib/solargraph/yard_map/mapper.rb +11 -5
  45. data/lib/solargraph/{pin/yard_pin/constant.rb → yard_map/mapper/to_constant.rb} +6 -6
  46. data/lib/solargraph/yard_map/mapper/to_method.rb +78 -0
  47. data/lib/solargraph/{pin/yard_pin/namespace.rb → yard_map/mapper/to_namespace.rb} +6 -6
  48. data/lib/solargraph/yard_map/rdoc_to_yard.rb +1 -1
  49. data/lib/solargraph/yard_map/stdlib_fills.rb +43 -0
  50. data/lib/solargraph/{pin/yard_pin/method.rb → yard_map/to_method.rb} +29 -30
  51. data/solargraph.gemspec +4 -4
  52. metadata +20 -34
  53. data/lib/solargraph/core_fills.rb +0 -164
  54. data/lib/solargraph/pin/attribute.rb +0 -49
  55. data/lib/solargraph/pin/base_method.rb +0 -149
  56. data/lib/solargraph/pin/yard_pin.rb +0 -12
  57. data/lib/solargraph/pin/yard_pin/yard_mixin.rb +0 -20
  58. data/lib/solargraph/stdlib_fills.rb +0 -40
  59. data/travis-bundler.rb +0 -11
@@ -1,49 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module Pin
5
- class Attribute < BaseMethod
6
- # @return [::Symbol] :reader or :writer
7
- attr_reader :access
8
-
9
- # @param access [::Symbol] :reader or :writer
10
- def initialize access: :reader, **splat
11
- super(**splat)
12
- @access = access
13
- if access == :writer
14
- parameters.push(
15
- Pin::Parameter.new(name: 'value', decl: :arg, closure: self)
16
- )
17
- if return_type.defined?
18
- docstring.add_tag YARD::Tags::Tag.new(:param, '', return_type.to_s.split(', '), 'value')
19
- end
20
- end
21
- end
22
-
23
- def completion_item_kind
24
- Solargraph::LanguageServer::CompletionItemKinds::PROPERTY
25
- end
26
-
27
- def symbol_kind
28
- Solargraph::LanguageServer::SymbolKinds::PROPERTY
29
- end
30
-
31
- def path
32
- @path ||= namespace + (scope == :instance ? '#' : '.') + name
33
- end
34
-
35
- def probe api_map
36
- types = []
37
- varname = "@#{name.gsub(/=$/, '')}"
38
- pins = api_map.get_instance_variable_pins(binder.namespace, binder.scope).select { |iv| iv.name == varname }
39
- pins.each do |pin|
40
- type = pin.typify(api_map)
41
- type = pin.probe(api_map) if type.undefined?
42
- types.push type if type.defined?
43
- end
44
- return ComplexType::UNDEFINED if types.empty?
45
- ComplexType.try_parse(*types.map(&:tag).uniq)
46
- end
47
- end
48
- end
49
- end
@@ -1,149 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module Pin
5
- # The base class for method and attribute pins.
6
- #
7
- class BaseMethod < Closure
8
- # @return [::Symbol] :public, :private, or :protected
9
- attr_reader :visibility
10
-
11
- # @return [Parser::AST::Node]
12
- attr_reader :node
13
-
14
- # @param visibility [::Symbol] :public, :protected, or :private
15
- # @param explicit [Boolean]
16
- def initialize visibility: :public, explicit: true, **splat
17
- super(**splat)
18
- @visibility = visibility
19
- @explicit = explicit
20
- end
21
-
22
- def return_type
23
- @return_type ||= generate_complex_type
24
- end
25
-
26
- def path
27
- @path ||= "#{namespace}#{(scope == :instance ? '#' : '.')}#{name}"
28
- end
29
-
30
- def typify api_map
31
- decl = super
32
- return decl unless decl.undefined?
33
- type = see_reference(api_map) || typify_from_super(api_map)
34
- return type.qualify(api_map, namespace) unless type.nil?
35
- name.end_with?('?') ? ComplexType::BOOLEAN : ComplexType::UNDEFINED
36
- end
37
-
38
- # @return [Array<Pin::Parameter>]
39
- def parameters
40
- @parameters ||= []
41
- end
42
-
43
- # @return [Array<String>]
44
- def parameter_names
45
- parameters.map(&:name)
46
- end
47
-
48
- def documentation
49
- if @documentation.nil?
50
- @documentation ||= super || ''
51
- param_tags = docstring.tags(:param)
52
- unless param_tags.nil? or param_tags.empty?
53
- @documentation += "\n\n" unless @documentation.empty?
54
- @documentation += "Params:\n"
55
- lines = []
56
- param_tags.each do |p|
57
- l = "* #{p.name}"
58
- l += " [#{escape_brackets(p.types.join(', '))}]" unless p.types.nil? or p.types.empty?
59
- l += " #{p.text}"
60
- lines.push l
61
- end
62
- @documentation += lines.join("\n")
63
- end
64
- return_tags = docstring.tags(:return)
65
- unless return_tags.empty?
66
- @documentation += "\n\n" unless @documentation.empty?
67
- @documentation += "Returns:\n"
68
- lines = []
69
- return_tags.each do |r|
70
- l = "*"
71
- l += " [#{escape_brackets(r.types.join(', '))}]" unless r.types.nil? or r.types.empty?
72
- l += " #{r.text}"
73
- lines.push l
74
- end
75
- @documentation += lines.join("\n")
76
- end
77
- @documentation += "\n\n" unless @documentation.empty?
78
- @documentation += "Visibility: #{visibility}"
79
- end
80
- @documentation.to_s
81
- end
82
-
83
- def explicit?
84
- @explicit
85
- end
86
-
87
- def completion_item_kind
88
- Solargraph::LanguageServer::CompletionItemKinds::METHOD
89
- end
90
-
91
- def symbol_kind
92
- Solargraph::LanguageServer::SymbolKinds::METHOD
93
- end
94
-
95
- private
96
-
97
- # @return [ComplexType]
98
- def generate_complex_type
99
- tags = docstring.tags(:return).map(&:types).flatten.reject(&:nil?)
100
- return ComplexType::UNDEFINED if tags.empty?
101
- ComplexType.try_parse *tags
102
- end
103
-
104
- # @param api_map [ApiMap]
105
- # @return [ComplexType, nil]
106
- def see_reference api_map
107
- docstring.ref_tags.each do |ref|
108
- next unless ref.tag_name == 'return' && ref.owner
109
- result = resolve_reference(ref.owner.to_s, api_map)
110
- return result unless result.nil?
111
- end
112
- match = comments.match(/^[ \t]*\(see (.*)\)/m)
113
- return nil if match.nil?
114
- resolve_reference match[1], api_map
115
- end
116
-
117
- # @param api_map [ApiMap]
118
- # @return [ComplexType, nil]
119
- def typify_from_super api_map
120
- stack = api_map.get_method_stack(namespace, name, scope: scope).reject { |pin| pin.path == path }
121
- return nil if stack.empty?
122
- stack.each do |pin|
123
- return pin.return_type unless pin.return_type.undefined?
124
- end
125
- nil
126
- end
127
-
128
- # @param ref [String]
129
- # @param api_map [ApiMap]
130
- # @return [ComplexType]
131
- def resolve_reference ref, api_map
132
- parts = ref.split(/[\.#]/)
133
- if parts.first.empty? || parts.one?
134
- path = "#{namespace}#{ref}"
135
- else
136
- fqns = api_map.qualify(parts.first, namespace)
137
- return ComplexType::UNDEFINED if fqns.nil?
138
- path = fqns + ref[parts.first.length] + parts.last
139
- end
140
- pins = api_map.get_path_pins(path)
141
- pins.each do |pin|
142
- type = pin.typify(api_map)
143
- return type unless type.undefined?
144
- end
145
- nil
146
- end
147
- end
148
- end
149
- end
@@ -1,12 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module Pin
5
- module YardPin
6
- autoload :YardMixin, 'solargraph/pin/yard_pin/yard_mixin'
7
- autoload :Constant, 'solargraph/pin/yard_pin/constant'
8
- autoload :Method, 'solargraph/pin/yard_pin/method'
9
- autoload :Namespace, 'solargraph/pin/yard_pin/namespace'
10
- end
11
- end
12
- end
@@ -1,20 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module Pin
5
- module YardPin
6
- module YardMixin
7
- private
8
-
9
- # @param code_object [YARD::CodeObjects::Base]
10
- # @param spec [Gem::Specification]
11
- # @return [Solargraph::Location, nil]
12
- def object_location code_object, spec
13
- return nil if spec.nil? || code_object.nil? || code_object.file.nil? || code_object.line.nil?
14
- file = File.join(spec.full_gem_path, code_object.file)
15
- Solargraph::Location.new(file, Solargraph::Range.from_to(code_object.line - 1, 0, code_object.line - 1, 0))
16
- end
17
- end
18
- end
19
- end
20
- end
@@ -1,40 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- # Overrides for the Ruby stdlib.
5
- #
6
- # The YardMap uses this module to add type information to stdlib methods.
7
- #
8
- module StdlibFills
9
- Override = Pin::Reference::Override
10
-
11
- LIBS = {
12
- 'benchmark' => [
13
- Override.method_return('Benchmark.measure', 'Benchmark::Tms')
14
- ],
15
-
16
- 'pathname' => [
17
- Override.method_return('Pathname#join', 'Pathname'),
18
- Override.method_return('Pathname#basename', 'Pathname'),
19
- Override.method_return('Pathname#dirname', 'Pathname'),
20
- Override.method_return('Pathname#cleanpath', 'Pathname'),
21
- Override.method_return('Pathname#children', 'Array<Pathname>'),
22
- Override.method_return('Pathname#entries', 'Array<Pathname>')
23
- ],
24
-
25
- 'set' => [
26
- Override.method_return('Enumerable#to_set', 'Set'),
27
- Override.method_return('Set#add', 'self'),
28
- Override.method_return('Set#add?', 'self, nil'),
29
- Override.method_return('Set#classify', 'Hash'),
30
- Override.from_comment('Set#each', '@yieldparam_single_parameter')
31
- ]
32
- }
33
-
34
- # @param path [String]
35
- # @return [Array<Pin::Reference::Override>]
36
- def self.get path
37
- LIBS[path] || []
38
- end
39
- end
40
- end
@@ -1,11 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- # Travis uses this script to select which version of bundler to install for
4
- # each job.
5
-
6
- if RUBY_VERSION =~ /^2\.(1|2)\./
7
- `gem install bundler -v '< 2'`
8
- else
9
- `gem update --system`
10
- `gem install bundler`
11
- end