solargraph 0.31.1 → 0.31.2

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: a170a254c51b9119d68f9542bb621eee41831b814e94d5f987eb2c7d78f412ba
4
- data.tar.gz: 9beff1ee445b21b89dbbcee0d2a68bed60911940a8587a58c6c361aa0ca7ffad
3
+ metadata.gz: ad024bb9d47484f46c548f061033e61bae31c8108f8c22a1910d6ec9daebc172
4
+ data.tar.gz: 18235c0ac8d50fcf1cbce67e8545d9f92e5c7363c9b7a9b22ce6894afbc0b4ee
5
5
  SHA512:
6
- metadata.gz: 79d0c51c0b65bf9f10f816b3821aa463d4f767a6ef926a948574e7c33b6f24eb8be5eda8a93bb41ad8d8e56bd73800b57fcc1e79cf85cf05efcf5279bff34319
7
- data.tar.gz: a6ddfcd658534c8f6c01d1b5f9ab25d13c9bc0abb2f437e783e6a89a280048d8886b8b105afc37f428ac25ecf403f9ad9e1a26dff5a7903c1eac28d04f10f953
6
+ metadata.gz: d3479bfd3f3ac8e55ac40f9edbd304e7ade94618c316327cdca6bc3f06dcded61e6cec6d8f4388052e436aa96abe95c46db3572bd09bf9296ea3821a4f0192fc
7
+ data.tar.gz: 3c49842db66464930b789325e10dac77b9fa35131a44b587a32ac8d3293b99ce89a498d716693663dd2c511be254dffe8316168bd824a301b5b4fd0bea7d5bf5
@@ -429,10 +429,10 @@ module Solargraph
429
429
  end
430
430
 
431
431
  # @param location [Solargraph::Location]
432
- # @return [Solargraph::Pin::Base]
433
- def locate_pin location
434
- return nil if location.nil? || !source_map_hash.has_key?(location.filename)
435
- source_map_hash[location.filename].locate_pin(location)
432
+ # @return [Array<Solargraph::Pin::Base>]
433
+ def locate_pins location
434
+ return [] if location.nil? || !source_map_hash.has_key?(location.filename)
435
+ source_map_hash[location.filename].locate_pins(location)
436
436
  end
437
437
 
438
438
  # @raise [FileNotFoundError] if the cursor's file is not in the ApiMap
@@ -587,6 +587,11 @@ module Solargraph
587
587
  while roots.length > 0
588
588
  fqns = roots.join('::') + '::' + name
589
589
  return fqns if store.namespace_exists?(fqns)
590
+ incs = store.get_includes(roots.join('::'))
591
+ incs.each do |inc|
592
+ foundinc = inner_qualify(name, inc, skip)
593
+ return foundinc unless foundinc.nil?
594
+ end
590
595
  roots.pop
591
596
  end
592
597
  return name if store.namespace_exists?(name)
@@ -85,19 +85,24 @@ module Solargraph
85
85
  tag == other.tag
86
86
  end
87
87
 
88
+ def rooted?
89
+ @rooted
90
+ end
91
+
88
92
  # Generate a ComplexType that fully qualifies this type's namespaces.
89
93
  #
90
94
  # @param api_map [ApiMap] The ApiMap that performs qualification
91
95
  # @param context [String] The namespace from which to resolve names
92
96
  # @return [ComplexType] The generated ComplexType
93
97
  def qualify api_map, context = ''
94
- return ComplexType.parse(tag) if duck_type? or void? or undefined?
95
- fqns = api_map.qualify(name, context)
96
- # return ComplexType::UNDEFINED if fqns.nil?
98
+ return ComplexType.new([self]) if duck_type? || void? || undefined?
99
+ recon = (rooted? ? '' : context)
100
+ fqns = api_map.qualify(name, recon)
97
101
  if fqns.nil?
98
102
  return ComplexType.parse('Boolean') if tag == 'Boolean'
99
103
  return ComplexType::UNDEFINED
100
104
  end
105
+ fqns = "::#{fqns}" # Ensure the resulting complex type is rooted
101
106
  ltypes = key_types.map do |t|
102
107
  t.qualify api_map, context
103
108
  end
@@ -14,9 +14,15 @@ module Solargraph
14
14
  # @param name [String] The name of the type
15
15
  # @param substring [String] The substring of the type
16
16
  def initialize name, substring = ''
17
- @name = name
17
+ if name.start_with?('::')
18
+ @name = name[2..-1]
19
+ @rooted = true
20
+ else
21
+ @name = name
22
+ @rooted = false
23
+ end
18
24
  @substring = substring
19
- @tag = name + substring
25
+ @tag = @name + substring
20
26
  @key_types = []
21
27
  @subtypes = []
22
28
  return unless parameters?
@@ -423,42 +423,32 @@ module Solargraph
423
423
  @stopped
424
424
  end
425
425
 
426
- # Locate a pin based on the location of a completion item, or nil if the
427
- # library does not have a source at that location.
428
- #
429
- # @param params [Hash] A hash representation of a completion item
430
- # @return [Pin::Base, nil]
431
- def locate_pin params
432
- return nil unless params['data'] && params['data']['uri'] && params['data']['location']
433
- library = library_for(params['data']['uri'])
434
- location = Location.new(
435
- params['data']['location']['filename'],
436
- Range.from_to(
437
- params['data']['location']['range']['start']['line'],
438
- params['data']['location']['range']['start']['character'],
439
- params['data']['location']['range']['end']['line'],
440
- params['data']['location']['range']['end']['character']
441
- )
442
- )
443
- library.locate_pin(location)
444
- end
445
-
446
426
  # Locate multiple pins that match a completion item. The first match is
447
- # based on the corresponding location in a library source if available
448
- # (see #locate_pin). Subsequent matches are based on path.
427
+ # based on the corresponding location in a library source if available.
428
+ # Subsequent matches are based on path.
449
429
  #
450
430
  # @param params [Hash] A hash representation of a completion item
451
431
  # @return [Array<Pin::Base>]
452
432
  def locate_pins params
453
433
  return [] unless params['data'] && params['data']['uri']
454
- exact = locate_pin(params)
455
434
  library = library_for(params['data']['uri'])
456
435
  result = []
457
- unless params['data']['path'].nil?
458
- result.concat library.path_pins(params['data']['path']).reject{|pin| pin == exact}
436
+ if params['data']['location']
437
+ location = Location.new(
438
+ params['data']['location']['filename'],
439
+ Range.from_to(
440
+ params['data']['location']['range']['start']['line'],
441
+ params['data']['location']['range']['start']['character'],
442
+ params['data']['location']['range']['end']['line'],
443
+ params['data']['location']['range']['end']['character']
444
+ )
445
+ )
446
+ result.concat library.locate_pins(location).select{ |pin| pin.name == params['label'] }
459
447
  end
460
- result.unshift exact unless exact.nil?
461
- result
448
+ if params['data']['path']
449
+ result.concat library.path_pins(params['data']['path'])
450
+ end
451
+ result.uniq
462
452
  end
463
453
 
464
454
  # @param uri [String]
@@ -26,8 +26,10 @@ module Solargraph
26
26
  def update_libraries src
27
27
  # @todo This module should not call cataloger and diagnoser
28
28
  libraries.each do |lib|
29
- lib.merge src
30
- cataloger.ping(lib) if lib.contain?(src.filename) || lib.open?(src.filename)
29
+ if lib.contain?(src.filename) || lib.open?(src.filename)
30
+ lib.merge src
31
+ cataloger.ping(lib)
32
+ end
31
33
  end
32
34
  diagnoser.schedule file_to_uri(src.filename) if src.synchronized?
33
35
  end
@@ -229,8 +229,8 @@ module Solargraph
229
229
  #
230
230
  # @param location [Location]
231
231
  # @return [Solargraph::Pin::Base]
232
- def locate_pin location
233
- api_map.locate_pin location
232
+ def locate_pins location
233
+ api_map.locate_pins location
234
234
  end
235
235
 
236
236
  # Get an array of pins that match a path.
@@ -192,6 +192,31 @@ module Solargraph
192
192
  true
193
193
  end
194
194
 
195
+ def proxied?
196
+ @proxied ||= false
197
+ end
198
+
199
+ # Return a proxy for this pin with the specified return type. Other than
200
+ # the return type and the #proxied? setting, the proxy should be a clone
201
+ # of the original.
202
+ #
203
+ # @param return_type [ComplexType]
204
+ # @return [self]
205
+ def proxy return_type
206
+ result = dup
207
+ result.return_complex_type = return_type
208
+ result.proxied = true
209
+ result
210
+ end
211
+
212
+ protected
213
+
214
+ # @return [Boolean]
215
+ attr_writer :proxied
216
+
217
+ # @return [ComplexType]
218
+ attr_writer :return_complex_type
219
+
195
220
  private
196
221
 
197
222
  # @return [void]
@@ -71,6 +71,7 @@ module Solargraph
71
71
  block
72
72
  end
73
73
 
74
+ # @param api_map [ApiMap]
74
75
  def typify api_map
75
76
  # @todo Does anything need to be eliminated because it's more accurately a probe?
76
77
  type = super
@@ -87,7 +88,7 @@ module Solargraph
87
88
  else
88
89
  yps = meth.docstring.tags(:yieldparam)
89
90
  unless yps[index].nil? or yps[index].types.nil? or yps[index].types.empty?
90
- return ComplexType.parse(yps[index].types[0]).first
91
+ return ComplexType.parse(yps[index].types.first).qualify(api_map, meth.context.namespace)
91
92
  end
92
93
  end
93
94
  end
@@ -281,6 +281,22 @@ module Solargraph
281
281
  @synchronized
282
282
  end
283
283
 
284
+ # Get a hash of comments grouped by the line numbers of the associated code.
285
+ #
286
+ # @return [Hash{Integer => Array<Parser::Source::Comment>}]
287
+ def associated_comments
288
+ @associated_comments ||= begin
289
+ result = {}
290
+ Parser::Source::Comment.associate_locations(node, comments).each_pair do |loc, all|
291
+ block = all #.select{ |l| l.document? || code.lines[l.loc.line].strip.start_with?('#')}
292
+ next if block.empty?
293
+ result[loc.line] ||= []
294
+ result[loc.line].concat block
295
+ end
296
+ result
297
+ end
298
+ end
299
+
284
300
  private
285
301
 
286
302
  # @param top [Parser::AST::Node]
@@ -299,22 +315,6 @@ module Solargraph
299
315
  end
300
316
  end
301
317
 
302
- # Get a hash of comments grouped by the line numbers of the associated code.
303
- #
304
- # @return [Hash{Integer => Array<Parser::Source::Comment>}]
305
- def associated_comments
306
- @associated_comments ||= begin
307
- result = {}
308
- Parser::Source::Comment.associate_locations(node, comments).each_pair do |loc, all|
309
- block = all #.select{ |l| l.document? || code.lines[l.loc.line].strip.start_with?('#')}
310
- next if block.empty?
311
- result[loc.line] ||= []
312
- result[loc.line].concat block
313
- end
314
- result
315
- end
316
- end
317
-
318
318
  # Get a string representation of an array of comments.
319
319
  #
320
320
  # @param comments [Array<Parser::Source::Comment>]
@@ -59,7 +59,7 @@ module Solargraph
59
59
  type = p.typify(api_map)
60
60
  type = p.probe(api_map) if type.undefined?
61
61
  next p if p.return_complex_type == type
62
- Pin::ProxyType.new(p.location, nil, p.name, type)
62
+ p.proxy type
63
63
  end
64
64
  result
65
65
  end
@@ -84,10 +84,10 @@ module Solargraph
84
84
  end
85
85
 
86
86
  # @param location [Solargraph::Location]
87
- # @return [Solargraph::Pin::Base]
88
- def locate_pin location
87
+ # @return [Array<Solargraph::Pin::Base>]
88
+ def locate_pins location
89
89
  # return nil unless location.start_with?("#{filename}:")
90
- pins.select { |pin| pin.location == location }.first
90
+ pins.select { |pin| pin.location == location }
91
91
  end
92
92
 
93
93
  def locate_named_path_pin line, character
@@ -54,6 +54,7 @@ module Solargraph
54
54
  result.concat api_map.get_methods(context_pin.context.namespace, scope: context_pin.context.scope, visibility: [:public, :private, :protected])
55
55
  result.concat api_map.get_methods('Kernel')
56
56
  result.concat ApiMap.keywords
57
+ result.concat yielded_self_pins
57
58
  end
58
59
  end
59
60
  package_completions(result)
@@ -107,6 +108,26 @@ module Solargraph
107
108
  @context_pin ||= source_map.locate_named_path_pin(cursor.node_position.line, cursor.node_position.character)
108
109
  end
109
110
 
111
+ # @return [Array<Pin::Base>]
112
+ def yielded_self_pins
113
+ return [] unless block.is_a?(Pin::Block) && block.receiver
114
+ chain = Solargraph::Source::NodeChainer.chain(block.receiver, source_map.source.filename)
115
+ receiver_pin = chain.define(api_map, context_pin, locals).first
116
+ return [] if receiver_pin.nil?
117
+ result = []
118
+ ys = receiver_pin.docstring.tag(:yieldself)
119
+ unless ys.nil? || ys.types.empty?
120
+ ysct = ComplexType.parse(*ys.types).qualify(api_map, receiver_pin.context.namespace)
121
+ result.concat api_map.get_complex_type_methods(ysct, ysct.namespace, true)
122
+ end
123
+ ys = receiver_pin.docstring.tag(:yieldpublic)
124
+ unless ys.nil? || ys.types.empty?
125
+ ysct = ComplexType.parse(*ys.types).qualify(api_map, receiver_pin.context.namespace)
126
+ result.concat api_map.get_complex_type_methods(ysct, '', false)
127
+ end
128
+ result
129
+ end
130
+
110
131
  # @param result [Array<Pin::Base>]
111
132
  # @return [Completion]
112
133
  def package_completions result
@@ -10,6 +10,8 @@ module Solargraph
10
10
 
11
11
  private_class_method :new
12
12
 
13
+ MACRO_REGEXP = /(@\!method|@\!attribute|@\!domain|@\!macro|@\!parse)/.freeze
14
+
13
15
  # Generate the data.
14
16
  #
15
17
  # @param source [Source]
@@ -58,7 +60,7 @@ module Solargraph
58
60
  end
59
61
 
60
62
  def process_comment position, comment
61
- return unless comment =~ /(@\!method|@\!attribute|@\!domain|@\!macro|@\!parse)/
63
+ return unless comment =~ MACRO_REGEXP
62
64
  cmnt = remove_inline_comment_hashes(comment)
63
65
  parse = YARD::Docstring.parser.parse(cmnt)
64
66
  parse.directives.each { |d| process_directive(position, d) }
@@ -121,30 +123,13 @@ module Solargraph
121
123
  ctxt
122
124
  end
123
125
 
126
+ # @return [void]
124
127
  def process_comment_directives
125
- return unless @code =~ /(@\!method|@\!attribute|@\!domain|@\!macro|@\!parse)/
126
- current = []
127
- last_line = nil
128
- @comments.each do |cmnt|
129
- if cmnt.inline?
130
- if last_line.nil? || cmnt.loc.expression.line == last_line + 1
131
- if cmnt.loc.expression.column.zero? || @code.lines[cmnt.loc.expression.line][0..cmnt.loc.expression.column-1].strip.empty?
132
- current.push cmnt
133
- else
134
- # @todo Connected to a line of code. Handle separately
135
- end
136
- elsif !current.empty?
137
- process_comment Position.new(current.last.loc.expression.line, current.last.loc.expression.column), current.map(&:text).join("\n")
138
- current.clear
139
- current.push cmnt
140
- end
141
- else
142
- # @todo Handle block comments
143
- end
144
- last_line = cmnt.loc.expression.line
145
- end
146
- unless current.empty?
147
- process_comment Position.new(current.last.loc.expression.line, current.last.loc.expression.column), current.map(&:text).join("\n")
128
+ return unless @code =~ MACRO_REGEXP
129
+ @source.associated_comments.each do |line, comments|
130
+ pos = Position.new(line, @code.lines[line].chomp.length)
131
+ txt = comments.map(&:text).join("\n")
132
+ process_comment(pos, txt)
148
133
  end
149
134
  end
150
135
  end
@@ -1,3 +1,3 @@
1
1
  module Solargraph
2
- VERSION = '0.31.1'
2
+ VERSION = '0.31.2'
3
3
  end
@@ -12,5 +12,7 @@ end
12
12
  YARD::Tags::Library.define_tag("Type", :type, :with_types_and_name)
13
13
  # Define a @yieldself tag for documenting block contexts
14
14
  YARD::Tags::Library.define_tag("Yieldself", :yieldself, :with_types)
15
+ # Define a @yieldpublic tag for documenting block domains
16
+ YARD::Tags::Library.define_tag("Yieldpublic", :yieldpublic, :with_types)
15
17
  # Define a @!domain directive for documenting DSLs
16
18
  YARD::Tags::Library.define_directive("domain", :with_types, Solargraph::DomainDirective)
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.31.1
4
+ version: 0.31.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Fred Snyder
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-01-22 00:00:00.000000000 Z
11
+ date: 2019-01-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: backport