solargraph 0.45.0 → 0.47.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 99cf1c663bb1a93324ff9c860b82e60d47988a4c48e9c0e977176cb94852f29c
4
- data.tar.gz: 9b10324bcf7493f9ed5f8a67a8d47e4f0a379b76ed2aeb31514d1fa06b88dbf6
3
+ metadata.gz: 65ba1769be95a6c7c20aa57ed559135063379214439bc7ab168a40f4bba0c698
4
+ data.tar.gz: 37fcbabd10f82493704e38ccb8b849a358b59c8cee568ce53b92a7493ee82dc9
5
5
  SHA512:
6
- metadata.gz: a981e45a500d2469972d0fab1e4bcfdbde99dc46de7ef7b377d486a9a027ce617b8806790ed3565a673fbf3d3fd206d246408b5ce744a0b575e02ee3a3a9b699
7
- data.tar.gz: 0bcb7a9957581cac9c066076938dbbdcbcc596bf7ddc8f4cd4539d71dadabab68cfdbc18f59df8daedd02dcff8f45b671a0a742c6ec1afbd39ede15fb3db381b
6
+ metadata.gz: '04701577441892c4f9c596873dbbdf8c841125a83b642928be5e1e22adf8d8f3293dc1fe5f2b02a468328d3ecf530b27333cbbdf0be1187777a0637004aaae4a'
7
+ data.tar.gz: 943f42ecf94e5c0fa26455d5974a8baa452a7382f23f215d01cd122031b65db78f2bacc90c51ad51df954f6171106377356a8ff30146c48b33f98d3e3abce96d
data/CHANGELOG.md CHANGED
@@ -1,3 +1,17 @@
1
+ ## 0.47.0 - September 25, 2022
2
+ - Completion candidates for union types (#507)
3
+ - Nullify Hover object instead of contents value (#583)
4
+ - Mapping workspace stuck in 0 (#587)
5
+ - Fix parsing of nested subtypes (#589)
6
+ - Update YARD tags on Pin::Block methods (#588)
7
+ - @!visibility directive support (#566)
8
+
9
+ ## 0.46.0 - August 22, 2022
10
+ - Ignore typecheck errors with @sg-ignore tag (#419)
11
+ - Strict checks report undefined method calls on variables (#553)
12
+ - Infer type from method arguments (#554)
13
+ - Return nil value for empty hover contents (#543)
14
+
1
15
  ## 0.45.0 - May 23, 2022
2
16
  - Basic support for RSpec #describe and #it
3
17
  - fix: domain can complete private method (#490)
data/SPONSORS.md CHANGED
@@ -10,8 +10,8 @@ The following people and organizations provide funding or other resources. [Beco
10
10
 
11
11
  ## Named Sponsors
12
12
 
13
- - Emily Strickland
14
13
  - Tom de Grunt
15
14
  - Akira Yamada
16
15
  - Erlend Finvåg
17
16
  - Matt Massicotte
17
+ - Oscar Rivas
@@ -21,6 +21,9 @@ module Solargraph
21
21
  # @return [Array<String>]
22
22
  attr_reader :unresolved_requires
23
23
 
24
+ # @return [Array<String>]
25
+ attr_reader :missing_docs
26
+
24
27
  # @param pins [Array<Solargraph::Pin::Base>]
25
28
  def initialize pins: []
26
29
  @source_map_hash = {}
@@ -68,6 +71,7 @@ module Solargraph
68
71
  yard_map.change(external_requires, bench.workspace.directory, bench.workspace.source_gems)
69
72
  @store = Store.new(yard_map.pins + implicit.pins + pins)
70
73
  @unresolved_requires = yard_map.unresolved_requires
74
+ @missing_docs = yard_map.missing_docs
71
75
  @rebindable_method_names = nil
72
76
  store.block_pins.each { |blk| blk.rebind(self) }
73
77
  self
@@ -281,33 +285,33 @@ module Solargraph
281
285
  # type = Solargraph::ComplexType.parse('String')
282
286
  # api_map.get_complex_type_methods(type)
283
287
  #
284
- # @param type [Solargraph::ComplexType] The complex type of the namespace
288
+ # @param complex_type [Solargraph::ComplexType] The complex type of the namespace
285
289
  # @param context [String] The context from which the type is referenced
286
290
  # @param internal [Boolean] True to include private methods
287
291
  # @return [Array<Solargraph::Pin::Base>]
288
- def get_complex_type_methods type, context = '', internal = false
292
+ def get_complex_type_methods complex_type, context = '', internal = false
289
293
  # This method does not qualify the complex type's namespace because
290
294
  # it can cause conflicts between similar names, e.g., `Foo` vs.
291
295
  # `Other::Foo`. It still takes a context argument to determine whether
292
296
  # protected and private methods are visible.
293
- return [] if type.undefined? || type.void?
294
- result = []
295
- if type.duck_type?
296
- type.select(&:duck_type?).each do |t|
297
- result.push Pin::DuckMethod.new(name: t.tag[1..-1])
298
- end
299
- result.concat get_methods('Object')
300
- else
301
- unless type.nil? || type.name == 'void'
302
- visibility = [:public]
303
- if type.namespace == context || super_and_sub?(type.namespace, context)
304
- visibility.push :protected
305
- visibility.push :private if internal
297
+ return [] if complex_type.undefined? || complex_type.void?
298
+ result = Set.new
299
+ complex_type.each do |type|
300
+ if type.duck_type?
301
+ result.add Pin::DuckMethod.new(name: type.to_s[1..-1])
302
+ result.merge get_methods('Object')
303
+ else
304
+ unless type.nil? || type.name == 'void'
305
+ visibility = [:public]
306
+ if type.namespace == context || super_and_sub?(type.namespace, context)
307
+ visibility.push :protected
308
+ visibility.push :private if internal
309
+ end
310
+ result.merge get_methods(type.namespace, scope: type.scope, visibility: visibility)
306
311
  end
307
- result.concat get_methods(type.namespace, scope: type.scope, visibility: visibility)
308
312
  end
309
313
  end
310
- result
314
+ result.to_a
311
315
  end
312
316
 
313
317
  # Get a stack of method pins for a method name in a namespace. The order
@@ -383,9 +387,10 @@ module Solargraph
383
387
  # @param query [String]
384
388
  # @return [Array<Pin::Base>]
385
389
  def query_symbols query
386
- result = []
387
- source_map_hash.each_value { |s| result.concat s.query_symbols(query) }
388
- result
390
+ Pin::Search.new(
391
+ source_map_hash.values.flat_map(&:document_symbols),
392
+ query
393
+ ).results
389
394
  end
390
395
 
391
396
  # @param location [Solargraph::Location]
@@ -154,9 +154,9 @@ module Solargraph
154
154
  subtype_string.clear
155
155
  next
156
156
  else
157
+ raise ComplexTypeError, "Invalid close in type #{type_string}" if point_stack == 0
157
158
  point_stack -= 1
158
- subtype_string += char if point_stack == 0
159
- raise ComplexTypeError, "Invalid close in type #{type_string}" if point_stack < 0
159
+ subtype_string += char
160
160
  end
161
161
  next
162
162
  elsif char == '{'
@@ -12,6 +12,10 @@ module Solargraph
12
12
  refs = {}
13
13
  map = api_map.source_map(source.filename)
14
14
  map.requires.each { |ref| refs[ref.name] = ref }
15
+ api_map.missing_docs.each do |r|
16
+ next unless refs.key?(r)
17
+ result.push docs_error(r, refs[r].location)
18
+ end
15
19
  api_map.unresolved_requires.each do |r|
16
20
  next unless refs.key?(r)
17
21
  result.push require_error(r, refs[r].location)
@@ -21,6 +25,18 @@ module Solargraph
21
25
 
22
26
  private
23
27
 
28
+ # @param path [String]
29
+ # @param location [Location]
30
+ # @return [Hash]
31
+ def docs_error path, location
32
+ {
33
+ range: location.range.to_hash,
34
+ severity: Diagnostics::Severities::WARNING,
35
+ source: 'RequireNotFound',
36
+ message: "YARD docs not found for #{path}"
37
+ }
38
+ end
39
+
24
40
  # @param path [String]
25
41
  # @param location [Location]
26
42
  # @return [Hash]
@@ -27,16 +27,28 @@ module Solargraph
27
27
  last_link = this_link unless this_link.nil?
28
28
  end
29
29
  set_result(
30
- contents: {
31
- kind: 'markdown',
32
- value: contents.join("\n\n")
33
- }
30
+ contents_or_nil(contents)
34
31
  )
35
32
  rescue FileNotFoundError => e
36
33
  Logging.logger.warn "[#{e.class}] #{e.message}"
37
34
  Logging.logger.warn e.backtrace.join("\n")
38
35
  set_result nil
39
36
  end
37
+
38
+ private
39
+
40
+ def contents_or_nil contents
41
+ stripped = contents
42
+ .map(&:strip)
43
+ .reject { |c| c.empty? }
44
+ return nil if stripped.empty?
45
+ {
46
+ contents: {
47
+ kind: 'markdown',
48
+ value: stripped.join("\n\n")
49
+ }
50
+ }
51
+ end
40
52
  end
41
53
  end
42
54
  end
@@ -8,7 +8,7 @@ class Solargraph::LanguageServer::Message::Workspace::WorkspaceSymbol < Solargra
8
8
  info = pins.map do |pin|
9
9
  uri = file_to_uri(pin.location.filename)
10
10
  {
11
- name: pin.name,
11
+ name: pin.path,
12
12
  containerName: pin.namespace,
13
13
  kind: pin.symbol_kind,
14
14
  location: {
@@ -87,7 +87,7 @@ module Solargraph
87
87
  end
88
88
 
89
89
  def infer_literal_node_type node
90
- # NodeMethods.infer_literal_node_type node
90
+ NodeMethods.infer_literal_node_type node
91
91
  end
92
92
 
93
93
  def version
@@ -6,7 +6,6 @@ module Solargraph
6
6
  module NodeProcessors
7
7
  class DefNode < Parser::NodeProcessor::Base
8
8
  def process
9
- loc = get_node_location(node)
10
9
  methpin = Solargraph::Pin::Method.new(
11
10
  location: get_node_location(node),
12
11
  closure: region.closure,
@@ -11,8 +11,8 @@ module Solargraph
11
11
  closure: region.closure,
12
12
  comments: comments_for(node),
13
13
  name: node.children[0].children[0].to_s,
14
- # assignment: require_keyword?(node) ? nil : node.children[0].children[1],
15
- asgn_code: require_keyword?(node) ? nil: region.code_for(node.children[0].children[1]),
14
+ assignment: require_keyword?(node) ? nil : node.children[0].children[1],
15
+ asgn_code: require_keyword?(node) ? nil : region.code_for(node.children[0].children[1]),
16
16
  presence: region.closure.location.range,
17
17
  decl: require_keyword?(node) ? :kwarg : :kwoptarg
18
18
  )
@@ -8,6 +8,7 @@ module Solargraph
8
8
  # @return [Parser::AST::Node]
9
9
  attr_reader :receiver
10
10
 
11
+ # @param args [Array<Parameter>]
11
12
  def initialize receiver: nil, args: [], context: nil, **splat
12
13
  super(**splat)
13
14
  @receiver = receiver
@@ -25,7 +26,7 @@ module Solargraph
25
26
  @binder || closure.binder
26
27
  end
27
28
 
28
- # @return [Array<String>]
29
+ # @return [Array<Parameter>]
29
30
  def parameters
30
31
  @parameters ||= []
31
32
  end
@@ -3,8 +3,10 @@
3
3
  module Solargraph
4
4
  module Pin
5
5
  class Parameter < LocalVariable
6
+ # @return [Symbol]
6
7
  attr_reader :decl
7
8
 
9
+ # @return [String]
8
10
  attr_reader :asgn_code
9
11
 
10
12
  def initialize decl: :arg, asgn_code: nil, **splat
@@ -91,10 +93,6 @@ module Solargraph
91
93
  true
92
94
  end
93
95
 
94
- def probe api_map
95
- typify api_map
96
- end
97
-
98
96
  private
99
97
 
100
98
  # @return [YARD::Tags::Tag]
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'jaro_winkler'
4
+
5
+ module Solargraph
6
+ module Pin
7
+ class Search
8
+ class Result
9
+ # @return [Float]
10
+ attr_reader :match
11
+
12
+ # @return [Pin::Base]
13
+ attr_reader :pin
14
+
15
+ def initialize match, pin
16
+ @match = match
17
+ @pin = pin
18
+ end
19
+ end
20
+
21
+ # @param pins [Array<Pin::Base>]
22
+ # @param query [String]
23
+ def initialize pins, query
24
+ @pins = pins
25
+ @query = query
26
+ end
27
+
28
+ # @return [Array<Pin::Base>]
29
+ def results
30
+ @results ||= do_query
31
+ end
32
+
33
+ private
34
+
35
+ # @return [Array<Pin::Base>]
36
+ def do_query
37
+ return @pins if @query.nil? || @query.empty?
38
+ @pins.map do |pin|
39
+ match = [fuzzy_string_match(pin.path, @query), fuzzy_string_match(pin.name, @query)].max
40
+ Result.new(match, pin) if match > 0.7
41
+ end
42
+ .compact
43
+ .sort { |a, b| b.match <=> a.match }
44
+ .map(&:pin)
45
+ end
46
+
47
+ # @param str1 [String]
48
+ # @param str2 [String]
49
+ # @return [Float]
50
+ def fuzzy_string_match str1, str2
51
+ return (1.0 + (str2.length.to_f / str1.length.to_f)) if str1.downcase.include?(str2.downcase)
52
+ JaroWinkler.distance(str1, str2, ignore_case: true)
53
+ end
54
+ end
55
+ end
56
+ end
@@ -30,6 +30,7 @@ module Solargraph
30
30
  autoload :DuckMethod, 'solargraph/pin/duck_method'
31
31
  autoload :Singleton, 'solargraph/pin/singleton'
32
32
  autoload :KeywordParam, 'solargraph/pin/keyword_param'
33
+ autoload :Search, 'solargraph/pin/search'
33
34
 
34
35
  ROOT_PIN = Pin::Namespace.new(type: :class, name: '', closure: nil)
35
36
  end
@@ -175,7 +175,11 @@ module Solargraph
175
175
  api_map = nil
176
176
  time = Benchmark.measure {
177
177
  api_map = Solargraph::ApiMap.load(directory)
178
- api_map.pins.each do |pin|
178
+ pins = api_map.pins
179
+ api_map.source_maps.each do |sm|
180
+ pins.concat sm.locals
181
+ end
182
+ pins.each do |pin|
179
183
  begin
180
184
  puts pin_description(pin) if options[:verbose]
181
185
  pin.typify api_map
@@ -45,6 +45,8 @@ module Solargraph
45
45
  @node, @comments = Solargraph::Parser.parse_with_comments(@code, filename)
46
46
  @parsed = true
47
47
  rescue Parser::SyntaxError, EncodingError => e
48
+ puts "[#{e.class}] #{e.message}"
49
+ puts e.backtrace
48
50
  @node = nil
49
51
  @comments = {}
50
52
  @parsed = false
@@ -360,7 +362,7 @@ module Solargraph
360
362
  skip = nil
361
363
  comments.lines.each { |l|
362
364
  # Trim the comment and minimum leading whitespace
363
- p = l.encode('UTF-8', invalid: :replace, replace: '?').gsub(/^#+/, '')
365
+ p = l.force_encoding('UTF-8').encode('UTF-8', invalid: :replace, replace: '?').gsub(/^#+/, '')
364
366
  if p.strip.empty?
365
367
  next unless started
366
368
  ctxt.concat p
@@ -12,7 +12,7 @@ module Solargraph
12
12
 
13
13
  private_class_method :new
14
14
 
15
- MACRO_REGEXP = /(@\!method|@\!attribute|@\!domain|@\!macro|@\!parse|@\!override)/.freeze
15
+ MACRO_REGEXP = /(@\!method|@\!attribute|@\!visibility|@\!domain|@\!macro|@\!parse|@\!override)/.freeze
16
16
 
17
17
  # Generate the data.
18
18
  #
@@ -56,8 +56,10 @@ module Solargraph
56
56
  @pins ||= []
57
57
  end
58
58
 
59
+ # @param position [Solargraph::Position]
60
+ # @return [Solargraph::Pin::Closure]
59
61
  def closure_at(position)
60
- @pins.select{|pin| pin.is_a?(Pin::Closure) and pin.location.range.contain?(position)}.last
62
+ pins.select{|pin| pin.is_a?(Pin::Closure) and pin.location.range.contain?(position)}.last
61
63
  end
62
64
 
63
65
  def process_comment source_position, comment_position, comment
@@ -147,6 +149,27 @@ module Solargraph
147
149
  pins.last.docstring.add_tag YARD::Tags::Tag.new(:param, '', pins.last.return_type.to_s.split(', '), 'value')
148
150
  end
149
151
  end
152
+ when 'visibility'
153
+ begin
154
+ kind = directive.tag.text&.to_sym
155
+ return unless [:private, :protected, :public].include?(kind)
156
+
157
+ name = directive.tag.name
158
+ closure = closure_at(source_position) || @pins.first
159
+ if closure.location.range.start.line < comment_position.line
160
+ closure = closure_at(comment_position)
161
+ end
162
+ if closure.is_a?(Pin::Method) && no_empty_lines?(comment_position.line, source_position.line)
163
+ # @todo Smelly instance variable access
164
+ closure.instance_variable_set(:@visibility, kind)
165
+ else
166
+ matches = pins.select{ |pin| pin.is_a?(Pin::Method) && pin.name == name && pin.namespace == namespace && pin.context.scope == namespace.is_a?(Pin::Singleton) ? :class : :instance }
167
+ matches.each do |pin|
168
+ # @todo Smelly instance variable access
169
+ pin.instance_variable_set(:@visibility, kind)
170
+ end
171
+ end
172
+ end
150
173
  when 'parse'
151
174
  begin
152
175
  ns = closure_at(source_position)
@@ -176,6 +199,10 @@ module Solargraph
176
199
  end
177
200
  end
178
201
 
202
+ def no_empty_lines?(line1, line2)
203
+ @code.lines[line1..line2].none? { |line| line.strip.empty? }
204
+ end
205
+
179
206
  def remove_inline_comment_hashes comment
180
207
  ctxt = ''
181
208
  num = nil
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'jaro_winkler'
4
3
  require 'yard'
5
4
  require 'yard-solargraph'
6
5
  require 'set'
@@ -76,8 +75,7 @@ module Solargraph
76
75
  # @param query [String]
77
76
  # @return [Array<Pin::Base>]
78
77
  def query_symbols query
79
- return document_symbols if query && query.empty?
80
- document_symbols.select{ |pin| fuzzy_string_match(pin.path, query) || fuzzy_string_match(pin.name, query) }
78
+ Pin::Search.new(document_symbols, query).results
81
79
  end
82
80
 
83
81
  # @param position [Position]
@@ -178,12 +176,5 @@ module Solargraph
178
176
  # Assuming the root pin is always valid
179
177
  found || pins.first
180
178
  end
181
-
182
- # @param str1 [String]
183
- # @param str2 [String]
184
- # @return [Boolean]
185
- def fuzzy_string_match str1, str2
186
- JaroWinkler.distance(str1, str2) > 0.6
187
- end
188
179
  end
189
180
  end
@@ -40,10 +40,12 @@ module Solargraph
40
40
  # @return [Array<Problem>]
41
41
  def problems
42
42
  @problems ||= begin
43
- method_tag_problems
44
- .concat variable_type_tag_problems
45
- .concat const_problems
46
- .concat call_problems
43
+ without_ignored(
44
+ method_tag_problems
45
+ .concat variable_type_tag_problems
46
+ .concat const_problems
47
+ .concat call_problems
48
+ )
47
49
  end
48
50
  end
49
51
 
@@ -118,7 +120,12 @@ module Solargraph
118
120
  # @param pin [Pin::Base]
119
121
  # @return [Boolean]
120
122
  def resolved_constant? pin
121
- api_map.get_constants('', pin.binder.tag).any? { |pin| pin.name == pin.return_type.namespace && ['Class', 'Module'].include?(pin.return_type.name) }
123
+ api_map.get_constants('', pin.binder.tag)
124
+ .select { |p| p.name == pin.return_type.namespace }
125
+ .any? do |p|
126
+ inferred = p.infer(api_map)
127
+ ['Class', 'Module'].include?(inferred.name)
128
+ end
122
129
  end
123
130
 
124
131
  def virtual_pin? pin
@@ -235,7 +242,7 @@ module Solargraph
235
242
  base = base.base
236
243
  end
237
244
  closest = found.typify(api_map) if found
238
- if !found || (closest.defined? && internal_or_core?(found))
245
+ if !found || found.is_a?(Pin::BaseVariable) || (closest.defined? && internal_or_core?(found))
239
246
  unless ignored_pins.include?(found)
240
247
  result.push Problem.new(location, "Unresolved call to #{missing.links.last.word}")
241
248
  @marked_ranges.push rng
@@ -525,5 +532,12 @@ module Solargraph
525
532
  args.push Solargraph::Parser.chain_string('&') if with_block
526
533
  args
527
534
  end
535
+
536
+ def without_ignored problems
537
+ problems.reject do |problem|
538
+ node = source_map.source.node_at(problem.location.range.start.line, problem.location.range.start.column)
539
+ source_map.source.comments_for(node)&.include?('@sg-ignore')
540
+ end
541
+ end
528
542
  end
529
543
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Solargraph
4
- VERSION = '0.45.0'
4
+ VERSION = '0.47.0'
5
5
  end
@@ -2,6 +2,7 @@
2
2
 
3
3
  require 'open3'
4
4
  require 'rubygems'
5
+ require 'json'
5
6
 
6
7
  module Solargraph
7
8
  # A workspace consists of the files in a project's directory and the
@@ -107,6 +107,11 @@ module Solargraph
107
107
  @unresolved_requires ||= []
108
108
  end
109
109
 
110
+ # @return [Array<String>]
111
+ def missing_docs
112
+ @missing_docs ||= []
113
+ end
114
+
110
115
  # @param y [String]
111
116
  # @return [YARD::Registry]
112
117
  def load_yardoc y
@@ -196,10 +201,11 @@ module Solargraph
196
201
  required.merge @gemset.keys if required.include?('bundler/require')
197
202
  pins.replace core_pins
198
203
  unresolved_requires.clear
204
+ missing_docs.clear
199
205
  stdlib_pins.clear
200
206
  environ = Convention.for_global(self)
201
207
  done = []
202
- from_std = []
208
+ already_errored = []
203
209
  (required + environ.requires).each do |r|
204
210
  next if r.nil? || r.empty? || done.include?(r)
205
211
  done.push r
@@ -219,24 +225,18 @@ module Solargraph
219
225
  # YARD detects gems for certain libraries that do not have a yardoc
220
226
  # but exist in the stdlib. `fileutils` is an example. Treat those
221
227
  # cases as errors and check the stdlib yardoc.
222
- raise Gem::LoadError if yd.nil?
228
+ if yd.nil?
229
+ process_error(r, result, already_errored, nil)
230
+ next
231
+ end
223
232
  @gem_paths[spec.name] = spec.full_gem_path
224
233
  unless yardocs.include?(yd)
225
234
  yardocs.unshift yd
226
235
  result.concat process_yardoc yd, spec
227
236
  result.concat add_gem_dependencies(spec) if with_dependencies?
228
237
  end
229
- rescue Gem::LoadError, NoYardocError => e
230
- base = r.split('/').first
231
- next if from_std.include?(base)
232
- from_std.push base
233
- stdtmp = load_stdlib_pins(base)
234
- if stdtmp.empty?
235
- unresolved_requires.push r
236
- else
237
- stdlib_pins.concat stdtmp
238
- result.concat stdtmp
239
- end
238
+ rescue Gem::LoadError, NoYardocError
239
+ process_error(r, result, already_errored)
240
240
  end
241
241
  result.delete_if(&:nil?)
242
242
  unless result.empty?
@@ -253,6 +253,21 @@ module Solargraph
253
253
  pins.concat environ.pins
254
254
  end
255
255
 
256
+ def process_error(req, result, already_errored, yd = 1)
257
+ base = req.split('/').first
258
+ return if already_errored.include?(base)
259
+ already_errored.push base
260
+ stdtmp = load_stdlib_pins(base)
261
+ if yd.nil?
262
+ missing_docs.push req
263
+ elsif stdtmp.empty?
264
+ unresolved_requires.push req
265
+ else
266
+ stdlib_pins.concat stdtmp
267
+ result.concat stdtmp
268
+ end
269
+ end
270
+
256
271
  def process_gemsets
257
272
  return {} if directory.empty? || !File.file?(File.join(directory, 'Gemfile'))
258
273
  require_from_bundle(directory)
@@ -270,7 +285,7 @@ module Solargraph
270
285
  @gem_paths[depspec.name] = depspec.full_gem_path
271
286
  gy = yardoc_file_for_spec(depspec)
272
287
  if gy.nil?
273
- unresolved_requires.push dep.name
288
+ missing_docs.push dep.name
274
289
  else
275
290
  next if yardocs.include?(gy)
276
291
  yardocs.unshift gy
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.45.0
4
+ version: 0.47.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Fred Snyder
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-05-23 00:00:00.000000000 Z
11
+ date: 2022-09-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: backport
@@ -492,6 +492,7 @@ files:
492
492
  - lib/solargraph/pin/reference/prepend.rb
493
493
  - lib/solargraph/pin/reference/require.rb
494
494
  - lib/solargraph/pin/reference/superclass.rb
495
+ - lib/solargraph/pin/search.rb
495
496
  - lib/solargraph/pin/singleton.rb
496
497
  - lib/solargraph/pin/symbol.rb
497
498
  - lib/solargraph/position.rb