solargraph 0.32.5 → 0.33.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 +4 -4
- data/.gitignore +1 -0
- data/README.md +2 -11
- data/lib/solargraph.rb +1 -2
- data/lib/solargraph/api_map.rb +93 -63
- data/lib/solargraph/api_map/cache.rb +16 -1
- data/lib/solargraph/api_map/source_to_yard.rb +16 -7
- data/lib/solargraph/api_map/store.rb +55 -12
- data/lib/solargraph/complex_type.rb +58 -14
- data/lib/solargraph/complex_type/type_methods.rb +2 -2
- data/lib/solargraph/complex_type/unique_type.rb +33 -4
- data/lib/solargraph/core_fills.rb +40 -12
- data/lib/solargraph/diagnostics.rb +4 -3
- data/lib/solargraph/diagnostics/base.rb +6 -0
- data/lib/solargraph/diagnostics/require_not_found.rb +17 -10
- data/lib/solargraph/diagnostics/rubocop_helpers.rb +2 -0
- data/lib/solargraph/diagnostics/type_check.rb +51 -0
- data/lib/solargraph/diagnostics/update_errors.rb +1 -0
- data/lib/solargraph/language_server/host.rb +55 -25
- data/lib/solargraph/language_server/host/diagnoser.rb +1 -2
- data/lib/solargraph/language_server/host/dispatch.rb +4 -8
- data/lib/solargraph/language_server/host/sources.rb +1 -1
- data/lib/solargraph/language_server/message.rb +1 -0
- data/lib/solargraph/language_server/message/completion_item/resolve.rb +4 -2
- data/lib/solargraph/language_server/message/initialize.rb +9 -0
- data/lib/solargraph/language_server/message/initialized.rb +1 -0
- data/lib/solargraph/language_server/message/text_document.rb +1 -0
- data/lib/solargraph/language_server/message/text_document/code_action.rb +15 -0
- data/lib/solargraph/language_server/message/text_document/completion.rb +1 -1
- data/lib/solargraph/language_server/message/text_document/definition.rb +25 -5
- data/lib/solargraph/language_server/message/text_document/hover.rb +1 -1
- data/lib/solargraph/language_server/message/text_document/signature_help.rb +4 -0
- data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +8 -4
- data/lib/solargraph/language_server/transport/adapter.rb +12 -15
- data/lib/solargraph/library.rb +23 -6
- data/lib/solargraph/location.rb +4 -0
- data/lib/solargraph/pin.rb +7 -3
- data/lib/solargraph/pin/attribute.rb +14 -13
- data/lib/solargraph/pin/base.rb +56 -43
- data/lib/solargraph/pin/base_method.rb +41 -18
- data/lib/solargraph/pin/base_variable.rb +17 -15
- data/lib/solargraph/pin/block.rb +22 -4
- data/lib/solargraph/pin/closure.rb +28 -0
- data/lib/solargraph/pin/common.rb +59 -0
- data/lib/solargraph/pin/constant.rb +4 -4
- data/lib/solargraph/pin/conversions.rb +8 -8
- data/lib/solargraph/pin/duck_method.rb +3 -3
- data/lib/solargraph/pin/instance_variable.rb +30 -0
- data/lib/solargraph/pin/keyword.rb +1 -1
- data/lib/solargraph/pin/local_variable.rb +3 -3
- data/lib/solargraph/pin/localized.rb +9 -5
- data/lib/solargraph/pin/method.rb +26 -40
- data/lib/solargraph/pin/method_alias.rb +9 -6
- data/lib/solargraph/pin/namespace.rb +33 -10
- data/lib/solargraph/pin/parameter.rb +150 -0
- data/lib/solargraph/pin/proxy_type.rb +8 -8
- data/lib/solargraph/pin/reference.rb +1 -12
- data/lib/solargraph/pin/reference/override.rb +18 -0
- data/lib/solargraph/pin/reference/require.rb +2 -1
- data/lib/solargraph/pin/singleton.rb +9 -0
- data/lib/solargraph/pin/symbol.rb +9 -4
- data/lib/solargraph/pin/yard_pin/constant.rb +12 -3
- data/lib/solargraph/pin/yard_pin/method.rb +18 -6
- data/lib/solargraph/pin/yard_pin/namespace.rb +13 -1
- data/lib/solargraph/position.rb +1 -1
- data/lib/solargraph/range.rb +4 -0
- data/lib/solargraph/shell.rb +83 -4
- data/lib/solargraph/source.rb +32 -12
- data/lib/solargraph/source/chain.rb +48 -28
- data/lib/solargraph/source/chain/call.rb +37 -38
- data/lib/solargraph/source/chain/constant.rb +1 -1
- data/lib/solargraph/source/chain/head.rb +2 -8
- data/lib/solargraph/source/chain/instance_variable.rb +1 -1
- data/lib/solargraph/source/chain/link.rb +2 -0
- data/lib/solargraph/source/cursor.rb +59 -24
- data/lib/solargraph/source/node_chainer.rb +0 -2
- data/lib/solargraph/source/node_methods.rb +12 -6
- data/lib/solargraph/source/source_chainer.rb +38 -44
- data/lib/solargraph/source_map.rb +11 -18
- data/lib/solargraph/source_map/clip.rb +13 -15
- data/lib/solargraph/source_map/mapper.rb +37 -26
- data/lib/solargraph/source_map/node_processor.rb +13 -8
- data/lib/solargraph/source_map/node_processor/alias_node.rb +8 -8
- data/lib/solargraph/source_map/node_processor/args_node.rb +10 -16
- data/lib/solargraph/source_map/node_processor/base.rb +47 -4
- data/lib/solargraph/source_map/node_processor/block_node.rb +9 -4
- data/lib/solargraph/source_map/node_processor/casgn_node.rb +7 -2
- data/lib/solargraph/source_map/node_processor/cvasgn_node.rb +8 -3
- data/lib/solargraph/source_map/node_processor/def_node.rb +45 -38
- data/lib/solargraph/source_map/node_processor/defs_node.rb +16 -6
- data/lib/solargraph/source_map/node_processor/gvasgn_node.rb +8 -1
- data/lib/solargraph/source_map/node_processor/ivasgn_node.rb +20 -6
- data/lib/solargraph/source_map/node_processor/lvasgn_node.rb +10 -4
- data/lib/solargraph/source_map/node_processor/namespace_node.rb +18 -12
- data/lib/solargraph/source_map/node_processor/orasgn_node.rb +1 -1
- data/lib/solargraph/source_map/node_processor/resbody_node.rb +30 -0
- data/lib/solargraph/source_map/node_processor/sclass_node.rb +7 -1
- data/lib/solargraph/source_map/node_processor/send_node.rb +102 -52
- data/lib/solargraph/source_map/node_processor/sym_node.rb +4 -1
- data/lib/solargraph/source_map/region.rb +9 -8
- data/lib/solargraph/type_checker.rb +282 -0
- data/lib/solargraph/type_checker/param_def.rb +47 -0
- data/lib/solargraph/type_checker/problem.rb +25 -0
- data/lib/solargraph/version.rb +1 -1
- data/lib/solargraph/views/environment.erb +1 -1
- data/lib/solargraph/workspace.rb +2 -2
- data/lib/solargraph/workspace/config.rb +0 -8
- data/lib/solargraph/yard_map.rb +25 -69
- data/lib/solargraph/yard_map/core_docs.rb +8 -3
- data/lib/solargraph/yard_map/core_gen.rb +1 -3
- data/lib/solargraph/yard_map/mapper.rb +85 -0
- data/lib/yard-solargraph.rb +2 -0
- metadata +14 -14
- data/lib/solargraph/diagnostics/type_not_defined.rb +0 -108
- data/lib/solargraph/live_map.rb +0 -126
- data/lib/solargraph/live_map/cache.rb +0 -38
- data/lib/solargraph/pin/block_parameter.rb +0 -103
- data/lib/solargraph/pin/method_parameter.rb +0 -40
- data/lib/solargraph/pin/plugin/method.rb +0 -25
- data/lib/solargraph/plugin.rb +0 -8
- data/lib/solargraph/plugin/base.rb +0 -41
- data/lib/solargraph/plugin/canceler.rb +0 -11
- data/lib/solargraph/plugin/process.rb +0 -172
- data/lib/solargraph/plugin/runtime.rb +0 -134
- data/lib/yard-coregen.rb +0 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 158c70ae0a463e58b036390de759450ff08ef9021338fac799b572c2ca31c705
|
4
|
+
data.tar.gz: 5ff363662d8bca00cd0e66dc34845532d9d19e9812d5a04c6f9c8c18319ee609
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dddd44984f04c8307e590cd96344dad5bf25e5765ca0a03d8de03028820ca7e58abc248d5dd9430ee9e6841de491f5a46a68a63f6b4db8b0508347fa2b3fd7b2
|
7
|
+
data.tar.gz: 9e394ad6f0558f8c194dd8efb667c58a3bc512ff65f98b11342e07270ed96f854a50904740b01bd23d0a4c31d4f944a82a8369a65802b1857425ea881a4d0058
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -59,6 +59,8 @@ The gem includes an executable that provides access to the library's features. F
|
|
59
59
|
The language server protocol is the recommended way for integrating Solargraph into editors and IDEs. Clients can connect using either stdio or TCP.
|
60
60
|
See [LANGUAGE_SERVER.md](LANGUAGE_SERVER.md) for more information.
|
61
61
|
|
62
|
+
## Updating Core Documentation
|
63
|
+
|
62
64
|
The Solargraph gem ships with documentation for Ruby 2.2.2. As of gem version 0.15.0, there's an option to download additional documentation for other Ruby versions from the command line.
|
63
65
|
|
64
66
|
$ solargraph list-cores # List the installed documentation versions
|
@@ -78,17 +80,6 @@ Run `bundle install` and use `bundle exec yard gems` to generate the documentati
|
|
78
80
|
|
79
81
|
In order to access the gems in your project, you'll need to start the language server with Bundler. In VS Code, there's a `solargraph.useBundler` option. Other clients will vary, but the command you probably want to run is `bundle exec solargraph socket` or `bundle exec solargraph stdio`.
|
80
82
|
|
81
|
-
## Runtime Suggestions (EXPERIMENTAL)
|
82
|
-
|
83
|
-
As of gem version 0.15.0, Solargraph includes experimental support for plugins.
|
84
|
-
|
85
|
-
The Runtime plugin enhances code completion by querying namespaces for method names in a subprocess. If it finds any undocumented or "magic" methods, they get added to the suggestions.
|
86
|
-
|
87
|
-
This feature is currently disabled by default. If you'd like to try it, you can enable it by setting the `plugins` section in your project's .solargraph.yml file:
|
88
|
-
|
89
|
-
plugins:
|
90
|
-
- runtime
|
91
|
-
|
92
83
|
## Contributing to Solargraph
|
93
84
|
|
94
85
|
### Bug Reports and Feature Requests
|
data/lib/solargraph.rb
CHANGED
@@ -23,9 +23,7 @@ module Solargraph
|
|
23
23
|
autoload :ApiMap, 'solargraph/api_map'
|
24
24
|
autoload :YardMap, 'solargraph/yard_map'
|
25
25
|
autoload :Pin, 'solargraph/pin'
|
26
|
-
autoload :LiveMap, 'solargraph/live_map'
|
27
26
|
autoload :ServerMethods, 'solargraph/server_methods'
|
28
|
-
autoload :Plugin, 'solargraph/plugin'
|
29
27
|
autoload :CoreFills, 'solargraph/core_fills'
|
30
28
|
autoload :LanguageServer, 'solargraph/language_server'
|
31
29
|
autoload :Workspace, 'solargraph/workspace'
|
@@ -35,6 +33,7 @@ module Solargraph
|
|
35
33
|
autoload :ComplexType, 'solargraph/complex_type'
|
36
34
|
autoload :Bundle, 'solargraph/bundle'
|
37
35
|
autoload :Logging, 'solargraph/logging'
|
36
|
+
autoload :TypeChecker, 'solargraph/type_checker'
|
38
37
|
|
39
38
|
dir = File.dirname(__FILE__)
|
40
39
|
YARDOC_PATH = File.realpath(File.join(dir, '..', 'yardoc'))
|
data/lib/solargraph/api_map.rb
CHANGED
@@ -13,21 +13,15 @@ module Solargraph
|
|
13
13
|
|
14
14
|
include SourceToYard
|
15
15
|
|
16
|
-
# Get a LiveMap associated with the current workspace.
|
17
|
-
#
|
18
|
-
# @return [Solargraph::LiveMap]
|
19
|
-
attr_reader :live_map
|
20
|
-
|
21
16
|
# @return [Array<String>]
|
22
17
|
attr_reader :unresolved_requires
|
23
18
|
|
24
19
|
# @param pins [Array<Solargraph::Pin::Base>]
|
25
20
|
def initialize pins: []
|
26
|
-
# @todo Extensions don't work yet
|
27
|
-
# require_extensions
|
28
21
|
@source_map_hash = {}
|
29
22
|
@cache = Cache.new
|
30
23
|
@mutex = Mutex.new
|
24
|
+
@method_alias_stack = []
|
31
25
|
index pins
|
32
26
|
end
|
33
27
|
|
@@ -40,7 +34,6 @@ module Solargraph
|
|
40
34
|
@store = Store.new(pins + YardMap.new.pins)
|
41
35
|
@unresolved_requires = []
|
42
36
|
}
|
43
|
-
# resolve_method_aliases
|
44
37
|
self
|
45
38
|
end
|
46
39
|
|
@@ -97,12 +90,14 @@ module Solargraph
|
|
97
90
|
reqs.concat map.requires.map(&:name)
|
98
91
|
end
|
99
92
|
reqs.concat bundle.workspace.config.required
|
93
|
+
local_path_hash.clear
|
100
94
|
unless bundle.workspace.require_paths.empty?
|
101
95
|
reqs.delete_if do |r|
|
102
96
|
result = false
|
103
97
|
bundle.workspace.require_paths.each do |l|
|
104
98
|
pn = Pathname.new(bundle.workspace.directory).join(l, "#{r}.rb")
|
105
99
|
if new_map_hash.keys.include?(pn.to_s)
|
100
|
+
local_path_hash[r] = pn.to_s
|
106
101
|
result = true
|
107
102
|
break
|
108
103
|
end
|
@@ -118,10 +113,13 @@ module Solargraph
|
|
118
113
|
@store = new_store
|
119
114
|
@unresolved_requires = yard_map.unresolved_requires
|
120
115
|
}
|
121
|
-
# resolve_method_aliases
|
122
116
|
self
|
123
117
|
end
|
124
118
|
|
119
|
+
def local_path_hash
|
120
|
+
@local_paths ||= {}
|
121
|
+
end
|
122
|
+
|
125
123
|
# @param filename [String]
|
126
124
|
# @param position [Position, Array(Integer, Integer)]
|
127
125
|
# @return [Source::Cursor]
|
@@ -218,9 +216,7 @@ module Solargraph
|
|
218
216
|
# @param context [String] The context to search
|
219
217
|
# @return [String]
|
220
218
|
def qualify namespace, context = ''
|
221
|
-
|
222
|
-
return nil if namespace.nil?
|
223
|
-
return qualify(context) if namespace == 'self'
|
219
|
+
return namespace if ['self', nil].include?(namespace)
|
224
220
|
cached = cache.get_qualified_namespace(namespace, context)
|
225
221
|
return cached.clone unless cached.nil?
|
226
222
|
result = if namespace.start_with?('::')
|
@@ -240,11 +236,13 @@ module Solargraph
|
|
240
236
|
# @return [Array<Solargraph::Pin::InstanceVariable>]
|
241
237
|
def get_instance_variable_pins(namespace, scope = :instance)
|
242
238
|
result = []
|
239
|
+
used = [namespace]
|
243
240
|
result.concat store.get_instance_variables(namespace, scope)
|
244
|
-
sc =
|
245
|
-
until sc.nil?
|
241
|
+
sc = qualify_lower(store.get_superclass(namespace), namespace)
|
242
|
+
until sc.nil? || used.include?(sc)
|
243
|
+
used.push sc
|
246
244
|
result.concat store.get_instance_variables(sc, scope)
|
247
|
-
sc =
|
245
|
+
sc = qualify_lower(store.get_superclass(sc), sc)
|
248
246
|
end
|
249
247
|
result
|
250
248
|
end
|
@@ -274,7 +272,7 @@ module Solargraph
|
|
274
272
|
# @param scope [Symbol] :class or :instance
|
275
273
|
# @param visibility [Array<Symbol>] :public, :protected, and/or :private
|
276
274
|
# @param deep [Boolean] True to include superclasses, mixins, etc.
|
277
|
-
# @return [Array<Solargraph::Pin::
|
275
|
+
# @return [Array<Solargraph::Pin::BaseMethod>]
|
278
276
|
def get_methods fqns, scope: :instance, visibility: [:public], deep: true
|
279
277
|
cached = cache.get_methods(fqns, scope, visibility, deep)
|
280
278
|
return cached.clone unless cached.nil?
|
@@ -292,12 +290,7 @@ module Solargraph
|
|
292
290
|
else
|
293
291
|
result.concat inner_get_methods(fqns, scope, visibility, deep, skip)
|
294
292
|
end
|
295
|
-
|
296
|
-
# unless live.empty?
|
297
|
-
# exist = result.map(&:name)
|
298
|
-
# result.concat live.reject{|p| exist.include?(p.name)}
|
299
|
-
# end
|
300
|
-
resolved = resolve_method_aliases(result)
|
293
|
+
resolved = resolve_method_aliases(result, visibility)
|
301
294
|
cache.set_methods(fqns, scope, visibility, deep, resolved)
|
302
295
|
resolved
|
303
296
|
end
|
@@ -327,7 +320,7 @@ module Solargraph
|
|
327
320
|
result = []
|
328
321
|
if type.duck_type?
|
329
322
|
type.select(&:duck_type?).each do |t|
|
330
|
-
result.push Pin::DuckMethod.new(
|
323
|
+
result.push Pin::DuckMethod.new(name: t.tag[1..-1])
|
331
324
|
end
|
332
325
|
result.concat get_methods('Object')
|
333
326
|
else
|
@@ -354,7 +347,7 @@ module Solargraph
|
|
354
347
|
# @param fqns [String]
|
355
348
|
# @param name [String]
|
356
349
|
# @param scope [Symbol] :instance or :class
|
357
|
-
# @return [Array<Solargraph::Pin::
|
350
|
+
# @return [Array<Solargraph::Pin::BaseMethod>]
|
358
351
|
def get_method_stack fqns, name, scope: :instance
|
359
352
|
get_methods(fqns, scope: scope, visibility: [:private, :protected, :public]).select{|p| p.name == name}
|
360
353
|
end
|
@@ -369,10 +362,6 @@ module Solargraph
|
|
369
362
|
return [] if path.nil?
|
370
363
|
result = []
|
371
364
|
result.concat store.get_path_pins(path)
|
372
|
-
# if result.empty?
|
373
|
-
# lp = live_map.get_path_pin(path)
|
374
|
-
# result.push lp unless lp.nil?
|
375
|
-
# end
|
376
365
|
resolve_method_aliases(result)
|
377
366
|
end
|
378
367
|
|
@@ -452,6 +441,11 @@ module Solargraph
|
|
452
441
|
source_map_hash[filename].document_symbols
|
453
442
|
end
|
454
443
|
|
444
|
+
# @return [Array<SourceMap>]
|
445
|
+
def source_maps
|
446
|
+
source_map_hash.values
|
447
|
+
end
|
448
|
+
|
455
449
|
# Get a source map by filename.
|
456
450
|
#
|
457
451
|
# @param filename [String]
|
@@ -461,6 +455,42 @@ module Solargraph
|
|
461
455
|
source_map_hash[filename]
|
462
456
|
end
|
463
457
|
|
458
|
+
# True if the specified file was included in a bundle, i.e., it's either
|
459
|
+
# included in a workspace or open in a library.
|
460
|
+
#
|
461
|
+
# @param filename [String]
|
462
|
+
def bundled? filename
|
463
|
+
source_map_hash.keys.include?(filename)
|
464
|
+
end
|
465
|
+
|
466
|
+
# @param location [Location]
|
467
|
+
def require_reference_at location
|
468
|
+
map = source_map(location.filename)
|
469
|
+
pin = map.requires.select { |pin| pin.location.range.contain?(location.range.start) }.first
|
470
|
+
return nil if pin.nil?
|
471
|
+
if local_path_hash.key?(pin.name)
|
472
|
+
return Location.new(local_path_hash[pin.name], Solargraph::Range.from_to(0, 0, 0, 0))
|
473
|
+
end
|
474
|
+
yard_map.require_reference(pin.name)
|
475
|
+
rescue FileNotFoundError
|
476
|
+
nil
|
477
|
+
end
|
478
|
+
|
479
|
+
# Check if a class is a superclass of another class.
|
480
|
+
#
|
481
|
+
# @param sup [String] The superclass
|
482
|
+
# @param sub [String] The subclass
|
483
|
+
# @return [Boolean]
|
484
|
+
def super_and_sub?(sup, sub)
|
485
|
+
fqsup = qualify(sup)
|
486
|
+
cls = qualify(store.get_superclass(sub), sub)
|
487
|
+
until cls.nil?
|
488
|
+
return true if cls == fqsup
|
489
|
+
cls = qualify(store.get_superclass(cls), cls)
|
490
|
+
end
|
491
|
+
false
|
492
|
+
end
|
493
|
+
|
464
494
|
private
|
465
495
|
|
466
496
|
# @return [YardMap]
|
@@ -544,27 +574,21 @@ module Solargraph
|
|
544
574
|
fqis = qualify(is, fqns)
|
545
575
|
result.concat inner_get_constants(fqis, [:public], skip) unless fqis.nil?
|
546
576
|
end
|
547
|
-
# result.concat live_map.get_constants(fqns)
|
548
577
|
result
|
549
578
|
end
|
550
579
|
|
551
|
-
# Require extensions for the experimental plugin architecture. Any
|
552
|
-
# installed gem with a name that starts with "solargraph-" is considered
|
553
|
-
# an extension.
|
554
|
-
#
|
555
|
-
# @return [void]
|
556
|
-
def require_extensions
|
557
|
-
Gem::Specification.all_names.select{|n| n.match(/^solargraph\-[a-z0-9_\-]*?\-ext\-[0-9\.]*$/)}.each do |n|
|
558
|
-
Solargraph::Logging.logger.info "Loading extension #{n}"
|
559
|
-
require n.match(/^(solargraph\-[a-z0-9_\-]*?\-ext)\-[0-9\.]*$/)[1]
|
560
|
-
end
|
561
|
-
end
|
562
|
-
|
563
580
|
# @return [Hash]
|
564
581
|
def path_macros
|
565
582
|
@path_macros ||= {}
|
566
583
|
end
|
567
584
|
|
585
|
+
# @param namespace [String]
|
586
|
+
# @param context [String]
|
587
|
+
# @return [String]
|
588
|
+
def qualify_lower namespace, context
|
589
|
+
qualify namespace, context.split('::')[0..-2].join('::')
|
590
|
+
end
|
591
|
+
|
568
592
|
# @param name [String]
|
569
593
|
# @param root [String]
|
570
594
|
# @param skip [Array<String>]
|
@@ -599,7 +623,6 @@ module Solargraph
|
|
599
623
|
end
|
600
624
|
return name if store.namespace_exists?(name)
|
601
625
|
end
|
602
|
-
# live_map.get_fqns(name, root)
|
603
626
|
end
|
604
627
|
|
605
628
|
# Get the namespace's type (Class or Module).
|
@@ -608,6 +631,7 @@ module Solargraph
|
|
608
631
|
# @return [Symbol] :class, :module, or nil
|
609
632
|
def get_namespace_type fqns
|
610
633
|
return nil if fqns.nil?
|
634
|
+
# @type [Pin::Namespace, nil]
|
611
635
|
pin = store.get_path_pins(fqns).select{|p| p.is_a?(Pin::Namespace)}.first
|
612
636
|
return nil if pin.nil?
|
613
637
|
pin.type
|
@@ -630,30 +654,36 @@ module Solargraph
|
|
630
654
|
result + nil_pins
|
631
655
|
end
|
632
656
|
|
633
|
-
# Check if a class is a superclass of another class.
|
634
|
-
#
|
635
|
-
# @param sup [String] The superclass
|
636
|
-
# @param sub [String] The subclass
|
637
|
-
# @return [Boolean]
|
638
|
-
def super_and_sub?(sup, sub)
|
639
|
-
fqsup = qualify(sup)
|
640
|
-
cls = qualify(store.get_superclass(sub), sub)
|
641
|
-
until cls.nil?
|
642
|
-
return true if cls == fqsup
|
643
|
-
cls = qualify(store.get_superclass(cls), cls)
|
644
|
-
end
|
645
|
-
false
|
646
|
-
end
|
647
|
-
|
648
657
|
# @param pins [Array<Pin::Base>]
|
658
|
+
# @param visibility [Array<Symbol>]
|
649
659
|
# @return [Array<Pin::Base>]
|
650
|
-
def resolve_method_aliases pins
|
651
|
-
|
652
|
-
|
653
|
-
|
654
|
-
next
|
655
|
-
|
660
|
+
def resolve_method_aliases pins, visibility = [:public, :private, :protected]
|
661
|
+
result = []
|
662
|
+
pins.each do |pin|
|
663
|
+
resolved = resolve_method_alias(pin)
|
664
|
+
next unless visibility.include?(resolved.visibility)
|
665
|
+
result.push resolved
|
656
666
|
end
|
667
|
+
result
|
668
|
+
end
|
669
|
+
|
670
|
+
# @param pin [Pin::MethodAlias, Pin::Base]
|
671
|
+
# @return [Pin::BaseMethod]
|
672
|
+
def resolve_method_alias pin
|
673
|
+
return pin if !pin.is_a?(Pin::MethodAlias) || @method_alias_stack.include?(pin.path)
|
674
|
+
@method_alias_stack.push pin.path
|
675
|
+
origin = get_method_stack(pin.full_context.namespace, pin.original, scope: pin.scope).first
|
676
|
+
@method_alias_stack.pop
|
677
|
+
return pin if origin.nil?
|
678
|
+
Pin::Method.new(
|
679
|
+
location: pin.location,
|
680
|
+
closure: pin.closure,
|
681
|
+
name: pin.name,
|
682
|
+
comments: origin.comments,
|
683
|
+
scope: origin.scope,
|
684
|
+
visibility: origin.visibility,
|
685
|
+
args: origin.parameters
|
686
|
+
)
|
657
687
|
end
|
658
688
|
end
|
659
689
|
end
|
@@ -5,6 +5,7 @@ module Solargraph
|
|
5
5
|
@methods = {}
|
6
6
|
@constants = {}
|
7
7
|
@qualified_namespaces = {}
|
8
|
+
@receiver_definitions = {}
|
8
9
|
end
|
9
10
|
|
10
11
|
def get_methods fqns, scope, visibility, deep
|
@@ -31,18 +32,32 @@ module Solargraph
|
|
31
32
|
@qualified_namespaces[[name, context]] = value
|
32
33
|
end
|
33
34
|
|
35
|
+
def receiver_defined? path
|
36
|
+
@receiver_definitions.key? path
|
37
|
+
end
|
38
|
+
|
39
|
+
def get_receiver_definition path
|
40
|
+
@receiver_definitions[path]
|
41
|
+
end
|
42
|
+
|
43
|
+
def set_receiver_definition path, pin
|
44
|
+
@receiver_definitions[path] = pin
|
45
|
+
end
|
46
|
+
|
34
47
|
# @return [void]
|
35
48
|
def clear
|
36
49
|
@methods.clear
|
37
50
|
@constants.clear
|
38
51
|
@qualified_namespaces.clear
|
52
|
+
@receiver_definitions.clear
|
39
53
|
end
|
40
54
|
|
41
55
|
# @return [Boolean]
|
42
56
|
def empty?
|
43
57
|
@methods.empty? &&
|
44
58
|
@constants.empty? &&
|
45
|
-
@qualified_namespaces.empty?
|
59
|
+
@qualified_namespaces.empty? &&
|
60
|
+
@receiver_definitions.empty?
|
46
61
|
end
|
47
62
|
end
|
48
63
|
end
|
@@ -15,31 +15,40 @@ module Solargraph
|
|
15
15
|
code_object_map.keys
|
16
16
|
end
|
17
17
|
|
18
|
-
# @param store [
|
18
|
+
# @param store [ApiMap::Store] ApiMap pin store
|
19
19
|
# @return [void]
|
20
20
|
def rake_yard store
|
21
21
|
code_object_map.clear
|
22
22
|
store.namespace_pins.each do |pin|
|
23
23
|
next if pin.path.nil? or pin.path.empty?
|
24
|
+
if pin.code_object
|
25
|
+
code_object_map[pin.path] ||= pin.code_object
|
26
|
+
next
|
27
|
+
end
|
24
28
|
if pin.type == :class
|
25
29
|
code_object_map[pin.path] ||= YARD::CodeObjects::ClassObject.new(root_code_object, pin.path)
|
26
30
|
else
|
27
31
|
code_object_map[pin.path] ||= YARD::CodeObjects::ModuleObject.new(root_code_object, pin.path)
|
28
32
|
end
|
29
33
|
code_object_map[pin.path].docstring = pin.docstring
|
30
|
-
code_object_map[pin.path].files.push pin.location.filename unless pin.location.nil?
|
31
|
-
end
|
32
|
-
store.namespace_pins.each do |pin|
|
33
|
-
# pin.include_references.each do |ref|
|
34
|
+
code_object_map[pin.path].files.push pin.location.filename unless pin.location.nil? || code_object_map[pin.path].files.include?(pin.location.filename)
|
34
35
|
store.get_includes(pin.path).each do |ref|
|
35
36
|
code_object_map[pin.path].instance_mixins.push code_object_map[ref] unless code_object_map[ref].nil? or code_object_map[pin.path].nil?
|
36
37
|
end
|
38
|
+
store.get_extends(pin.path).each do |ref|
|
39
|
+
code_object_map[pin.path].instance_mixins.push code_object_map[ref] unless code_object_map[ref].nil? or code_object_map[pin.path].nil?
|
40
|
+
code_object_map[pin.path].class_mixins.push code_object_map[ref] unless code_object_map[ref].nil? or code_object_map[pin.path].nil?
|
41
|
+
end
|
37
42
|
end
|
38
43
|
store.method_pins.each do |pin|
|
44
|
+
if pin.code_object
|
45
|
+
code_object_map[pin.path] ||= pin.code_object
|
46
|
+
next
|
47
|
+
end
|
39
48
|
code_object_map[pin.path] ||= YARD::CodeObjects::MethodObject.new(code_object_at(pin.namespace), pin.name, pin.scope)
|
40
49
|
code_object_map[pin.path].docstring = pin.docstring
|
41
50
|
code_object_map[pin.path].visibility = pin.visibility || :public
|
42
|
-
code_object_map[pin.path].files.push pin.location.filename unless pin.location.nil?
|
51
|
+
code_object_map[pin.path].files.push pin.location.filename unless pin.location.nil? || code_object_map[pin.path].files.include?(pin.location.filename)
|
43
52
|
code_object_map[pin.path].parameters = pin.parameters.map do |p|
|
44
53
|
n = p.match(/^[a-z0-9_]*:?/i)[0]
|
45
54
|
v = nil
|
@@ -53,7 +62,7 @@ module Solargraph
|
|
53
62
|
|
54
63
|
private
|
55
64
|
|
56
|
-
# @return [Hash]
|
65
|
+
# @return [Hash{String => YARD::CodeObjects::Base}]
|
57
66
|
def code_object_map
|
58
67
|
@code_object_map ||= {}
|
59
68
|
end
|