solargraph 0.30.2 → 0.31.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/solargraph.rb +7 -0
- data/lib/solargraph/api_map.rb +31 -38
- data/lib/solargraph/api_map/store.rb +7 -1
- data/lib/solargraph/diagnostics/require_not_found.rb +2 -1
- data/lib/solargraph/language_server/host.rb +34 -83
- data/lib/solargraph/language_server/host/cataloger.rb +17 -7
- data/lib/solargraph/language_server/host/diagnoser.rb +19 -10
- data/lib/solargraph/language_server/host/dispatch.rb +110 -0
- data/lib/solargraph/language_server/host/sources.rb +100 -1
- data/lib/solargraph/language_server/message/base.rb +15 -11
- data/lib/solargraph/language_server/message/extended/check_gem_version.rb +1 -1
- data/lib/solargraph/language_server/message/initialize.rb +32 -27
- data/lib/solargraph/language_server/message/text_document/completion.rb +1 -8
- data/lib/solargraph/language_server/transport/adapter.rb +26 -15
- data/lib/solargraph/language_server/transport/data_reader.rb +2 -2
- data/lib/solargraph/library.rb +30 -58
- data/lib/solargraph/live_map.rb +1 -1
- data/lib/solargraph/pin.rb +1 -0
- data/lib/solargraph/pin/base.rb +1 -1
- data/lib/solargraph/pin/base_method.rb +1 -1
- data/lib/solargraph/pin/method.rb +1 -1
- data/lib/solargraph/pin/method_alias.rb +15 -4
- data/lib/solargraph/plugin/process.rb +1 -1
- data/lib/solargraph/position.rb +1 -2
- data/lib/solargraph/server_methods.rb +1 -0
- data/lib/solargraph/shell.rb +0 -28
- data/lib/solargraph/source.rb +116 -20
- data/lib/solargraph/source/encoding_fixes.rb +1 -1
- data/lib/solargraph/source/source_chainer.rb +16 -8
- data/lib/solargraph/source_map.rb +11 -2
- data/lib/solargraph/source_map/clip.rb +1 -1
- data/lib/solargraph/source_map/mapper.rb +8 -5
- data/lib/solargraph/version.rb +1 -1
- data/lib/solargraph/views/environment.erb +3 -0
- data/lib/solargraph/workspace.rb +17 -14
- data/lib/solargraph/workspace/config.rb +1 -1
- data/lib/solargraph/yard_map.rb +6 -5
- data/lib/solargraph/yard_map/core_docs.rb +68 -18
- data/lib/solargraph/yard_map/core_gen.rb +47 -0
- data/lib/yard-coregen.rb +16 -0
- data/lib/yard-solargraph.rb +10 -1
- metadata +21 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7e808b8b4e3550a64f5737991858a16cfb43c1d4d839fa0be4c7018d9740783f
|
4
|
+
data.tar.gz: 7a90449ea2b30e07234f89bfb468eaf0e33e28711799b15064a9ae9dbcf83bc3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d87b8b907a0c33376f138381ad1b70c8c49be1ce504aec7e098bcac84030f53c9c469ea87b3b0e2fdaebe04bc51cf0b338ac3074fa1064be47f87e60c82499c4
|
7
|
+
data.tar.gz: 5888e2114dfea0da7dd3681d800400f7393cb63804f8d4f043aac2f74b0bf9bce1f986f34ae9d85bcc9753e49f5c773ad7ec3791257fbe372f632f3deb81ee04
|
data/lib/solargraph.rb
CHANGED
@@ -40,6 +40,13 @@ module Solargraph
|
|
40
40
|
YARDOC_PATH = File.realpath(File.join(dir, '..', 'yardoc'))
|
41
41
|
YARD_EXTENSION_FILE = File.join(dir, 'yard-solargraph.rb')
|
42
42
|
VIEWS_PATH = File.join(dir, 'solargraph', 'views')
|
43
|
+
|
44
|
+
# A convenience method for Solargraph::Logging.logger.
|
45
|
+
#
|
46
|
+
# @return [Logger]
|
47
|
+
def self.logger
|
48
|
+
Solargraph::Logging.logger
|
49
|
+
end
|
43
50
|
end
|
44
51
|
|
45
52
|
Solargraph::YardMap::CoreDocs.require_minimum
|
data/lib/solargraph/api_map.rb
CHANGED
@@ -11,7 +11,7 @@ module Solargraph
|
|
11
11
|
autoload :SourceToYard, 'solargraph/api_map/source_to_yard'
|
12
12
|
autoload :Store, 'solargraph/api_map/store'
|
13
13
|
|
14
|
-
include
|
14
|
+
include SourceToYard
|
15
15
|
|
16
16
|
# Get a LiveMap associated with the current workspace.
|
17
17
|
#
|
@@ -40,7 +40,7 @@ module Solargraph
|
|
40
40
|
@store = Store.new(pins + YardMap.new.pins)
|
41
41
|
@unresolved_requires = []
|
42
42
|
}
|
43
|
-
resolve_method_aliases
|
43
|
+
# resolve_method_aliases
|
44
44
|
self
|
45
45
|
end
|
46
46
|
|
@@ -66,9 +66,13 @@ module Solargraph
|
|
66
66
|
# Bundle always needs to be merged if it adds or removes sources
|
67
67
|
merged = (bundle.sources.length == source_map_hash.values.length)
|
68
68
|
bundle.sources.each do |source|
|
69
|
-
if source_map_hash.
|
70
|
-
if source_map_hash[source.filename].code == source.code
|
69
|
+
if source_map_hash.key?(source.filename)
|
70
|
+
if source_map_hash[source.filename].code == source.code && source_map_hash[source.filename].source.synchronized? && source.synchronized?
|
71
71
|
new_map_hash[source.filename] = source_map_hash[source.filename]
|
72
|
+
elsif !source.synchronized?
|
73
|
+
new_map_hash[source.filename] = source_map_hash[source.filename]
|
74
|
+
# @todo Smelly instance variable access
|
75
|
+
new_map_hash[source.filename].instance_variable_set(:@source, source)
|
72
76
|
else
|
73
77
|
map = Solargraph::SourceMap.map(source)
|
74
78
|
if source_map_hash[source.filename].try_merge!(map)
|
@@ -114,7 +118,7 @@ module Solargraph
|
|
114
118
|
@store = new_store
|
115
119
|
@unresolved_requires = yard_map.unresolved_requires
|
116
120
|
}
|
117
|
-
resolve_method_aliases
|
121
|
+
# resolve_method_aliases
|
118
122
|
self
|
119
123
|
end
|
120
124
|
|
@@ -142,8 +146,7 @@ module Solargraph
|
|
142
146
|
# @param directory [String]
|
143
147
|
# @return [ApiMap]
|
144
148
|
def self.load directory
|
145
|
-
|
146
|
-
api_map = self.new #(Solargraph::Workspace.new(directory))
|
149
|
+
api_map = self.new
|
147
150
|
workspace = Solargraph::Workspace.new(directory)
|
148
151
|
api_map.catalog Bundle.new(workspace: workspace)
|
149
152
|
api_map
|
@@ -220,13 +223,11 @@ module Solargraph
|
|
220
223
|
return qualify(context) if namespace == 'self'
|
221
224
|
cached = cache.get_qualified_namespace(namespace, context)
|
222
225
|
return cached.clone unless cached.nil?
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
result = inner_qualify(namespace, context, [])
|
229
|
-
end
|
226
|
+
result = if namespace.start_with?('::')
|
227
|
+
inner_qualify(namespace[2..-1], '', [])
|
228
|
+
else
|
229
|
+
inner_qualify(namespace, context, [])
|
230
|
+
end
|
230
231
|
cache.set_qualified_namespace(namespace, context, result)
|
231
232
|
result
|
232
233
|
end
|
@@ -296,8 +297,9 @@ module Solargraph
|
|
296
297
|
# exist = result.map(&:name)
|
297
298
|
# result.concat live.reject{|p| exist.include?(p.name)}
|
298
299
|
# end
|
299
|
-
|
300
|
-
|
300
|
+
resolved = resolve_method_aliases(result)
|
301
|
+
cache.set_methods(fqns, scope, visibility, deep, resolved)
|
302
|
+
resolved
|
301
303
|
end
|
302
304
|
|
303
305
|
# Get an array of method pins for a complex type.
|
@@ -371,7 +373,7 @@ module Solargraph
|
|
371
373
|
# lp = live_map.get_path_pin(path)
|
372
374
|
# result.push lp unless lp.nil?
|
373
375
|
# end
|
374
|
-
result
|
376
|
+
resolve_method_aliases(result)
|
375
377
|
end
|
376
378
|
|
377
379
|
# Get an array of pins that match the specified path.
|
@@ -461,6 +463,7 @@ module Solargraph
|
|
461
463
|
|
462
464
|
private
|
463
465
|
|
466
|
+
# @return [YardMap]
|
464
467
|
def yard_map
|
465
468
|
@yard_map ||= YardMap.new
|
466
469
|
end
|
@@ -469,23 +472,17 @@ module Solargraph
|
|
469
472
|
#
|
470
473
|
# @return [Hash{String => SourceMap}]
|
471
474
|
def source_map_hash
|
472
|
-
@mutex.synchronize {
|
473
|
-
@source_map_hash
|
474
|
-
}
|
475
|
+
@mutex.synchronize { @source_map_hash }
|
475
476
|
end
|
476
477
|
|
477
478
|
# @return [ApiMap::Store]
|
478
479
|
def store
|
479
|
-
@mutex.synchronize {
|
480
|
-
@store
|
481
|
-
}
|
480
|
+
@mutex.synchronize { @store }
|
482
481
|
end
|
483
482
|
|
484
483
|
# @return [Solargraph::ApiMap::Cache]
|
485
484
|
def cache
|
486
|
-
@mutex.synchronize {
|
487
|
-
@cache
|
488
|
-
}
|
485
|
+
@mutex.synchronize { @cache }
|
489
486
|
end
|
490
487
|
|
491
488
|
# @param fqns [String] A fully qualified namespace
|
@@ -558,7 +555,7 @@ module Solargraph
|
|
558
555
|
# @return [void]
|
559
556
|
def require_extensions
|
560
557
|
Gem::Specification.all_names.select{|n| n.match(/^solargraph\-[a-z0-9_\-]*?\-ext\-[0-9\.]*$/)}.each do |n|
|
561
|
-
|
558
|
+
Solargraph::Logging.logger.info "Loading extension #{n}"
|
562
559
|
require n.match(/^(solargraph\-[a-z0-9_\-]*?\-ext)\-[0-9\.]*$/)[1]
|
563
560
|
end
|
564
561
|
end
|
@@ -583,9 +580,8 @@ module Solargraph
|
|
583
580
|
return inner_qualify(root, '', skip)
|
584
581
|
end
|
585
582
|
else
|
586
|
-
if
|
583
|
+
if root == ''
|
587
584
|
return name if store.namespace_exists?(name)
|
588
|
-
# @todo What to do about the @namespace_includes stuff above?
|
589
585
|
else
|
590
586
|
roots = root.to_s.split('::')
|
591
587
|
while roots.length > 0
|
@@ -642,18 +638,15 @@ module Solargraph
|
|
642
638
|
false
|
643
639
|
end
|
644
640
|
|
645
|
-
# @
|
646
|
-
|
647
|
-
|
648
|
-
|
649
|
-
next pin unless pin.
|
650
|
-
origin = get_method_stack(pin.namespace, pin.original, scope: pin.scope).select{|pin| pin.
|
641
|
+
# @param pins [Array<Pin::Base>]
|
642
|
+
# @return [Array<Pin::Base>]
|
643
|
+
def resolve_method_aliases pins
|
644
|
+
pins.map do |pin|
|
645
|
+
next pin unless pin.kind == Pin::METHOD_ALIAS
|
646
|
+
origin = get_method_stack(pin.namespace, pin.original, scope: pin.scope).select{|pin| pin.is_a?(Pin::BaseMethod)}.first
|
651
647
|
next pin if origin.nil?
|
652
|
-
aliased = true
|
653
648
|
Pin::Method.new(pin.location, pin.namespace, pin.name, origin.comments, origin.scope, origin.visibility, origin.parameters)
|
654
649
|
end
|
655
|
-
return nil unless aliased
|
656
|
-
@mutex.synchronize { @store = Store.new(result) }
|
657
650
|
end
|
658
651
|
end
|
659
652
|
end
|
@@ -26,8 +26,9 @@ module Solargraph
|
|
26
26
|
# @param visibility [Array<Symbol>]
|
27
27
|
# @return [Array<Solargraph::Pin::Base>]
|
28
28
|
def get_methods fqns, scope: :instance, visibility: [:public]
|
29
|
+
kinds = [Pin::METHOD, Pin::ATTRIBUTE]
|
29
30
|
namespace_children(fqns).select{ |pin|
|
30
|
-
|
31
|
+
kinds.include?(pin.kind) && pin.scope == scope && visibility.include?(pin.visibility)
|
31
32
|
}
|
32
33
|
end
|
33
34
|
|
@@ -120,6 +121,11 @@ module Solargraph
|
|
120
121
|
end
|
121
122
|
end
|
122
123
|
|
124
|
+
def inspect
|
125
|
+
# Avoid insane dumps in specs
|
126
|
+
to_s
|
127
|
+
end
|
128
|
+
|
123
129
|
private
|
124
130
|
|
125
131
|
# @param fqns [String]
|
@@ -5,9 +5,10 @@ module Solargraph
|
|
5
5
|
#
|
6
6
|
class RequireNotFound < Base
|
7
7
|
def diagnose source, api_map
|
8
|
+
return [] unless source.parsed? && source.synchronized?
|
8
9
|
result = []
|
9
10
|
refs = {}
|
10
|
-
map =
|
11
|
+
map = api_map.source_map(source.filename)
|
11
12
|
map.requires.each do |ref|
|
12
13
|
refs[ref.name] = ref
|
13
14
|
end
|
@@ -11,9 +11,11 @@ module Solargraph
|
|
11
11
|
autoload :Diagnoser, 'solargraph/language_server/host/diagnoser'
|
12
12
|
autoload :Cataloger, 'solargraph/language_server/host/cataloger'
|
13
13
|
autoload :Sources, 'solargraph/language_server/host/sources'
|
14
|
+
autoload :Dispatch, 'solargraph/language_server/host/dispatch'
|
14
15
|
|
15
|
-
include
|
16
|
+
include UriHelpers
|
16
17
|
include Logging
|
18
|
+
include Dispatch
|
17
19
|
|
18
20
|
def initialize
|
19
21
|
@cancel_semaphore = Mutex.new
|
@@ -21,12 +23,23 @@ module Solargraph
|
|
21
23
|
@register_semaphore = Mutex.new
|
22
24
|
@cancel = []
|
23
25
|
@buffer = ''
|
24
|
-
@stopped =
|
26
|
+
@stopped = true
|
25
27
|
@next_request_id = 0
|
26
28
|
@dynamic_capabilities = Set.new
|
27
29
|
@registered_capabilities = Set.new
|
28
30
|
end
|
29
31
|
|
32
|
+
# Start asynchronous process handling.
|
33
|
+
#
|
34
|
+
# @return [void]
|
35
|
+
def start
|
36
|
+
return unless stopped?
|
37
|
+
@stopped = false
|
38
|
+
diagnoser.start
|
39
|
+
cataloger.start
|
40
|
+
sources.start
|
41
|
+
end
|
42
|
+
|
30
43
|
# Update the configuration options with the provided hash.
|
31
44
|
#
|
32
45
|
# @param update [Hash]
|
@@ -62,6 +75,7 @@ module Solargraph
|
|
62
75
|
# Delete the specified ID from the list of cancelled IDs if it exists.
|
63
76
|
#
|
64
77
|
# @param id [Integer]
|
78
|
+
# @return [void]
|
65
79
|
def clear id
|
66
80
|
@cancel_semaphore.synchronize { @cancel.delete id }
|
67
81
|
end
|
@@ -71,7 +85,7 @@ module Solargraph
|
|
71
85
|
#
|
72
86
|
# @param request [Hash] The contents of the message.
|
73
87
|
# @return [Solargraph::LanguageServer::Message::Base] The message handler.
|
74
|
-
def
|
88
|
+
def receive request
|
75
89
|
if request['method']
|
76
90
|
logger.info "Server received #{request['method']}"
|
77
91
|
logger.debug request
|
@@ -79,8 +93,8 @@ module Solargraph
|
|
79
93
|
begin
|
80
94
|
message.process
|
81
95
|
rescue Exception => e
|
82
|
-
|
83
|
-
|
96
|
+
logger.warn "Error processing request: [#{e.class}] #{e.message}"
|
97
|
+
logger.warn e.backtrace
|
84
98
|
message.set_error Solargraph::LanguageServer::ErrorCodes::INTERNAL_ERROR, "[#{e.class}] #{e.message}"
|
85
99
|
end
|
86
100
|
message
|
@@ -89,7 +103,8 @@ module Solargraph
|
|
89
103
|
requests[request['id']].process(request['result'])
|
90
104
|
requests.delete request['id']
|
91
105
|
else
|
92
|
-
|
106
|
+
logger.warn "Invalid message received."
|
107
|
+
logger.debug request
|
93
108
|
end
|
94
109
|
end
|
95
110
|
|
@@ -112,11 +127,13 @@ module Solargraph
|
|
112
127
|
# Delete the specified file from the library.
|
113
128
|
#
|
114
129
|
# @param uri [String] The file uri.
|
130
|
+
# @return [void]
|
115
131
|
def delete uri
|
116
132
|
sources.close uri
|
117
133
|
filename = uri_to_file(uri)
|
118
134
|
libraries.each do |lib|
|
119
|
-
lib.delete filename
|
135
|
+
# lib.delete filename
|
136
|
+
lib.detach filename
|
120
137
|
end
|
121
138
|
send_notification "textDocument/publishDiagnostics", {
|
122
139
|
uri: uri,
|
@@ -129,6 +146,7 @@ module Solargraph
|
|
129
146
|
# @param uri [String] The file uri.
|
130
147
|
# @param text [String] The contents of the file.
|
131
148
|
# @param version [Integer] A version number.
|
149
|
+
# @return [void]
|
132
150
|
def open uri, text, version
|
133
151
|
src = sources.open(uri, text, version)
|
134
152
|
libraries.each do |lib|
|
@@ -167,6 +185,7 @@ module Solargraph
|
|
167
185
|
if sources.include?(uri)
|
168
186
|
logger.info "Diagnosing #{uri}"
|
169
187
|
library = library_for(uri)
|
188
|
+
library.catalog
|
170
189
|
begin
|
171
190
|
results = library.diagnose uri_to_file(uri)
|
172
191
|
send_notification "textDocument/publishDiagnostics", {
|
@@ -196,11 +215,7 @@ module Solargraph
|
|
196
215
|
# @return [void]
|
197
216
|
def change params
|
198
217
|
updater = generate_updater(params)
|
199
|
-
|
200
|
-
libraries.each do |lib|
|
201
|
-
lib.merge src
|
202
|
-
end
|
203
|
-
diagnoser.schedule params['textDocument']['uri']
|
218
|
+
sources.async_update params['textDocument']['uri'], updater
|
204
219
|
end
|
205
220
|
|
206
221
|
# Queue a message to be sent to the client.
|
@@ -238,16 +253,13 @@ module Solargraph
|
|
238
253
|
path = normalize_separators(directory) unless directory.nil?
|
239
254
|
begin
|
240
255
|
lib = Solargraph::Library.load(path, name)
|
256
|
+
libraries.push lib
|
241
257
|
rescue WorkspaceTooLargeError => e
|
242
258
|
send_notification 'window/showMessage', {
|
243
259
|
'type' => Solargraph::LanguageServer::MessageTypes::WARNING,
|
244
260
|
'message' => e.message
|
245
261
|
}
|
246
|
-
lib = Solargraph::Library.new('', name)
|
247
262
|
end
|
248
|
-
libraries.push lib
|
249
|
-
diagnoser.start
|
250
|
-
cataloger.start
|
251
263
|
end
|
252
264
|
|
253
265
|
# Prepare multiple folders.
|
@@ -400,9 +412,11 @@ module Solargraph
|
|
400
412
|
|
401
413
|
# @return [void]
|
402
414
|
def stop
|
415
|
+
return if @stopped
|
403
416
|
@stopped = true
|
404
417
|
cataloger.stop
|
405
418
|
diagnoser.stop
|
419
|
+
sources.stop
|
406
420
|
end
|
407
421
|
|
408
422
|
def stopped?
|
@@ -576,80 +590,17 @@ module Solargraph
|
|
576
590
|
}
|
577
591
|
end
|
578
592
|
|
579
|
-
# Catalog the library.
|
580
|
-
#
|
581
|
-
# @return [void]
|
582
|
-
def catalog lib
|
583
|
-
lib.catalog
|
584
|
-
end
|
585
|
-
|
586
593
|
# @param uri [String]
|
587
594
|
# @return [Array<Range>]
|
588
595
|
def folding_ranges uri
|
589
|
-
library = library_for(uri)
|
590
|
-
file = uri_to_file(uri)
|
591
|
-
library.folding_ranges(file)
|
596
|
+
# library = library_for(uri)
|
597
|
+
# file = uri_to_file(uri)
|
598
|
+
# library.folding_ranges(file)
|
599
|
+
sources.find(uri).folding_ranges
|
592
600
|
end
|
593
601
|
|
594
602
|
private
|
595
603
|
|
596
|
-
# @return [Array<Library>]
|
597
|
-
def libraries
|
598
|
-
@libraries ||= []
|
599
|
-
end
|
600
|
-
|
601
|
-
# @return [Sources]
|
602
|
-
def sources
|
603
|
-
@sources ||= Sources.new
|
604
|
-
end
|
605
|
-
|
606
|
-
# @param uri [String]
|
607
|
-
# @return [Library]
|
608
|
-
def library_for uri
|
609
|
-
explicit_library_for(uri) ||
|
610
|
-
implicit_library_for(uri) ||
|
611
|
-
generic_library_for(uri)
|
612
|
-
end
|
613
|
-
|
614
|
-
# @param uri [String]
|
615
|
-
# @return [Library, nil]
|
616
|
-
def explicit_library_for uri
|
617
|
-
filename = uri_to_file(uri)
|
618
|
-
libraries.each do |lib|
|
619
|
-
if lib.contain?(filename) #|| lib.open?(filename)
|
620
|
-
lib.attach sources.find(uri) if sources.include?(uri)
|
621
|
-
return lib
|
622
|
-
end
|
623
|
-
end
|
624
|
-
nil
|
625
|
-
end
|
626
|
-
|
627
|
-
# @param uri [String]
|
628
|
-
# @return [Library, nil]
|
629
|
-
def implicit_library_for uri
|
630
|
-
filename = uri_to_file(uri)
|
631
|
-
libraries.each do |lib|
|
632
|
-
# return lib if filename.start_with?(lib.workspace.directory)
|
633
|
-
if lib.open?(filename) || filename.start_with?(lib.workspace.directory)
|
634
|
-
lib.attach sources.find(uri)
|
635
|
-
return lib
|
636
|
-
end
|
637
|
-
end
|
638
|
-
nil
|
639
|
-
end
|
640
|
-
|
641
|
-
# @param uri [String]
|
642
|
-
# @return [Library]
|
643
|
-
def generic_library_for uri
|
644
|
-
generic_library.attach sources.find(uri)
|
645
|
-
generic_library
|
646
|
-
end
|
647
|
-
|
648
|
-
# @return [Library]
|
649
|
-
def generic_library
|
650
|
-
@generic_library ||= Solargraph::Library.new
|
651
|
-
end
|
652
|
-
|
653
604
|
# @return [Diagnoser]
|
654
605
|
def diagnoser
|
655
606
|
@diagnoser ||= Diagnoser.new(self)
|