solargraph 0.20.0 → 0.21.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/lib/solargraph.rb +2 -3
- data/lib/solargraph/api_map.rb +6 -6
- data/lib/solargraph/api_map/source_to_yard.rb +1 -1
- data/lib/solargraph/language_server/host.rb +69 -10
- data/lib/solargraph/language_server/message.rb +1 -2
- data/lib/solargraph/language_server/message/initialize.rb +83 -15
- data/lib/solargraph/language_server/message/initialized.rb +7 -0
- data/lib/solargraph/language_server/message/text_document/formatting.rb +4 -1
- data/lib/solargraph/language_server/message/text_document/on_type_formatting.rb +20 -19
- data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +19 -1
- data/lib/solargraph/language_server/request.rb +1 -1
- data/lib/solargraph/language_server/transport.rb +1 -0
- data/lib/solargraph/language_server/transport/data_reader.rb +66 -0
- data/lib/solargraph/language_server/transport/socket.rb +8 -32
- data/lib/solargraph/library.rb +11 -6
- data/lib/solargraph/page.rb +1 -1
- data/lib/solargraph/pin/base.rb +8 -7
- data/lib/solargraph/pin/method_parameter.rb +2 -15
- data/lib/solargraph/pin/yard_object.rb +1 -1
- data/lib/solargraph/plugin/runtime.rb +0 -2
- data/lib/solargraph/shell.rb +0 -24
- data/lib/solargraph/source.rb +5 -169
- data/lib/solargraph/source/mapper.rb +8 -3
- data/lib/solargraph/version.rb +1 -1
- data/lib/solargraph/workspace.rb +3 -3
- data/lib/solargraph/workspace/config.rb +7 -9
- data/lib/solargraph/yard_map.rb +9 -48
- metadata +17 -74
- data/lib/solargraph/server.rb +0 -212
- data/lib/solargraph/suggestion.rb +0 -178
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 04dd49e264774d545fbdf1a7f52d0b7227ff3f11
|
4
|
+
data.tar.gz: cb617a8800b2eec8688c46fc89cf4ee79445dd50
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: db20a5e3053060171bf9077c1ce572de8428193b4d562c7d939c9a7003074de64f41ffe879100b7f7a31bb42f625a32e69ad7755afc68b8c31d2cc64d15be353
|
7
|
+
data.tar.gz: bb9a311819e91501145c05fc2045178a791933fb6f9598e6265f68efe301664cbb6bfa50170928989d1fd8543a726cd36e0079b2f650c2ded36f9ad3a66c92c6
|
data/lib/solargraph.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'solargraph/version'
|
2
2
|
require 'rubygems/package'
|
3
3
|
require 'yard-solargraph'
|
4
|
-
require 'sinatra'
|
5
4
|
|
6
5
|
module Solargraph
|
7
6
|
class InvalidOffsetError < RangeError; end
|
@@ -11,6 +10,8 @@ module Solargraph
|
|
11
10
|
|
12
11
|
class WorkspaceTooLargeError < RuntimeError
|
13
12
|
attr_reader :size
|
13
|
+
|
14
|
+
# @param size [Integer] The number of files included in the workspace
|
14
15
|
def initialize size
|
15
16
|
@size = size
|
16
17
|
end
|
@@ -20,8 +21,6 @@ module Solargraph
|
|
20
21
|
autoload :Source, 'solargraph/source'
|
21
22
|
autoload :ApiMap, 'solargraph/api_map'
|
22
23
|
autoload :NodeMethods, 'solargraph/node_methods'
|
23
|
-
autoload :Suggestion, 'solargraph/suggestion'
|
24
|
-
autoload :Server, 'solargraph/server'
|
25
24
|
autoload :YardMap, 'solargraph/yard_map'
|
26
25
|
autoload :Pin, 'solargraph/pin'
|
27
26
|
autoload :LiveMap, 'solargraph/live_map'
|
data/lib/solargraph/api_map.rb
CHANGED
@@ -57,6 +57,7 @@ module Solargraph
|
|
57
57
|
@sources.each do |s|
|
58
58
|
result.concat s.required.map(&:name)
|
59
59
|
end
|
60
|
+
result.concat workspace.config.required
|
60
61
|
result.uniq
|
61
62
|
end
|
62
63
|
|
@@ -341,7 +342,9 @@ module Solargraph
|
|
341
342
|
def signify fragment
|
342
343
|
return [] unless fragment.argument?
|
343
344
|
return [] if fragment.recipient.whole_signature.nil? or fragment.recipient.whole_signature.empty?
|
344
|
-
probe.infer_signature_pins
|
345
|
+
probe.infer_signature_pins(
|
346
|
+
fragment.recipient.whole_signature, fragment.named_path, fragment.locals
|
347
|
+
).select{ |pin| pin.kind == Pin::METHOD }
|
345
348
|
end
|
346
349
|
|
347
350
|
# Get an array of all suggestions that match the specified path.
|
@@ -471,11 +474,8 @@ module Solargraph
|
|
471
474
|
end
|
472
475
|
result.concat yard_map.get_methods(fqns, '', visibility: visibility)
|
473
476
|
type = get_namespace_type(fqns)
|
474
|
-
if type == :class
|
475
|
-
|
476
|
-
else
|
477
|
-
result.concat inner_get_methods('Module', :instance, [:public], deep, skip)
|
478
|
-
end
|
477
|
+
result.concat inner_get_methods('Class', :instance, fqns == '' ? [:public] : visibility, deep, skip) if type == :class
|
478
|
+
result.concat inner_get_methods('Module', :instance, fqns == '' ? [:public] : visibility, deep, skip)
|
479
479
|
end
|
480
480
|
end
|
481
481
|
result
|
@@ -19,7 +19,7 @@ module Solargraph
|
|
19
19
|
sources.each do |s|
|
20
20
|
s.namespace_pins.each do |pin|
|
21
21
|
next if pin.path.empty?
|
22
|
-
if pin.
|
22
|
+
if pin.type == :class
|
23
23
|
code_object_map[pin.path] ||= YARD::CodeObjects::ClassObject.new(root_code_object, pin.path)
|
24
24
|
else
|
25
25
|
code_object_map[pin.path] ||= YARD::CodeObjects::ModuleObject.new(root_code_object, pin.path)
|
@@ -33,7 +33,7 @@ module Solargraph
|
|
33
33
|
|
34
34
|
# @return [Hash]
|
35
35
|
def options
|
36
|
-
@options ||=
|
36
|
+
@options ||= default_configuration
|
37
37
|
end
|
38
38
|
|
39
39
|
def cancel id
|
@@ -54,7 +54,7 @@ module Solargraph
|
|
54
54
|
# processed, the transport is responsible for sending the response.
|
55
55
|
#
|
56
56
|
# @param request [Hash] The contents of the message.
|
57
|
-
# @return [Solargraph::LanguageServer::Message] The message handler.
|
57
|
+
# @return [Solargraph::LanguageServer::Message::Base] The message handler.
|
58
58
|
def start request
|
59
59
|
if request['method']
|
60
60
|
message = Message.select(request['method']).new(self, request)
|
@@ -214,10 +214,12 @@ module Solargraph
|
|
214
214
|
end
|
215
215
|
|
216
216
|
# Send a request to the client and execute the provided block to process
|
217
|
-
# the response.
|
217
|
+
# the response. If an ID is not provided, the host will use an auto-
|
218
|
+
# incrementing integer.
|
218
219
|
#
|
219
220
|
# @param method [String] The message method
|
220
221
|
# @param params [Hash] The method parameters
|
222
|
+
# @param id [String] An optional ID
|
221
223
|
# @yieldparam [Hash] The result sent by the client
|
222
224
|
def send_request method, params, &block
|
223
225
|
message = {
|
@@ -233,6 +235,29 @@ module Solargraph
|
|
233
235
|
@next_request_id += 1
|
234
236
|
end
|
235
237
|
|
238
|
+
def register_capabilities methods
|
239
|
+
send_request 'client/registerCapability', {
|
240
|
+
registrations: methods.map { |m|
|
241
|
+
{
|
242
|
+
id: m,
|
243
|
+
method: m,
|
244
|
+
registerOptions: dynamic_capability_options[m]
|
245
|
+
}
|
246
|
+
}
|
247
|
+
}
|
248
|
+
end
|
249
|
+
|
250
|
+
def unregister_capabilities methods
|
251
|
+
send_request 'client/unregisterCapability', {
|
252
|
+
unregisterations: methods.map { |m|
|
253
|
+
{
|
254
|
+
id: m,
|
255
|
+
method: m
|
256
|
+
}
|
257
|
+
}
|
258
|
+
}
|
259
|
+
end
|
260
|
+
|
236
261
|
# True if the specified file is in the process of changing.
|
237
262
|
#
|
238
263
|
# @return [Boolean]
|
@@ -343,6 +368,16 @@ module Solargraph
|
|
343
368
|
requests.keys
|
344
369
|
end
|
345
370
|
|
371
|
+
def default_configuration
|
372
|
+
{
|
373
|
+
'completion' => true,
|
374
|
+
'hover' => true,
|
375
|
+
'autoformat' => false,
|
376
|
+
'diagnostics' => false,
|
377
|
+
'formatting' => false
|
378
|
+
}
|
379
|
+
end
|
380
|
+
|
346
381
|
private
|
347
382
|
|
348
383
|
# @return [Solargraph::Library]
|
@@ -412,13 +447,13 @@ module Solargraph
|
|
412
447
|
diagnoser = Diagnostics::Rubocop.new
|
413
448
|
until stopped?
|
414
449
|
sleep 1
|
415
|
-
if options['diagnostics']
|
450
|
+
if !options['diagnostics']
|
416
451
|
@change_semaphore.synchronize { @diagnostics_queue.clear }
|
417
452
|
next
|
418
453
|
end
|
419
454
|
begin
|
420
|
-
# Diagnosis is broken into two parts to reduce the
|
421
|
-
# a document is changing
|
455
|
+
# Diagnosis is broken into two parts to reduce the number of
|
456
|
+
# times it runs while a document is changing
|
422
457
|
current = nil
|
423
458
|
already_changing = nil
|
424
459
|
@change_semaphore.synchronize do
|
@@ -429,13 +464,9 @@ module Solargraph
|
|
429
464
|
end
|
430
465
|
next if current.nil? or already_changing
|
431
466
|
filename = uri_to_file(current)
|
432
|
-
# text = library.read_text(filename)
|
433
|
-
# results = diagnoser.diagnose text, filename
|
434
|
-
# results.concat library.diagnose(filename)
|
435
467
|
results = library.diagnose(filename)
|
436
468
|
@change_semaphore.synchronize do
|
437
469
|
already_changing = (unsafe_changing?(current) or @diagnostics_queue.include?(current))
|
438
|
-
# publish_diagnostics current, resp unless already_changing
|
439
470
|
unless already_changing
|
440
471
|
send_notification "textDocument/publishDiagnostics", {
|
441
472
|
uri: current,
|
@@ -480,6 +511,34 @@ module Solargraph
|
|
480
511
|
changes
|
481
512
|
)
|
482
513
|
end
|
514
|
+
|
515
|
+
def dynamic_capability_options
|
516
|
+
@dynamic_capability_options ||= {
|
517
|
+
# textDocumentSync: 2, # @todo What should this be?
|
518
|
+
'textDocument/completion' => {
|
519
|
+
resolveProvider: true,
|
520
|
+
triggerCharacters: ['.', ':', '@']
|
521
|
+
},
|
522
|
+
# hoverProvider: true,
|
523
|
+
# definitionProvider: true,
|
524
|
+
'textDocument/signatureHelp' => {
|
525
|
+
triggerCharacters: ['(', ',']
|
526
|
+
},
|
527
|
+
# documentFormattingProvider: true,
|
528
|
+
'textDocument/onTypeFormatting' => {
|
529
|
+
firstTriggerCharacter: '{',
|
530
|
+
moreTriggerCharacter: ['(']
|
531
|
+
},
|
532
|
+
# documentSymbolProvider: true,
|
533
|
+
# workspaceSymbolProvider: true,
|
534
|
+
# workspace: {
|
535
|
+
# workspaceFolders: {
|
536
|
+
# supported: true,
|
537
|
+
# changeNotifications: true
|
538
|
+
# }
|
539
|
+
# }
|
540
|
+
}
|
541
|
+
end
|
483
542
|
end
|
484
543
|
end
|
485
544
|
end
|
@@ -24,14 +24,13 @@ module Solargraph
|
|
24
24
|
end
|
25
25
|
|
26
26
|
# @param path [String]
|
27
|
-
# @return [Solargraph::LanguageServer::Message::Base]
|
27
|
+
# @return [Class<Solargraph::LanguageServer::Message::Base>]
|
28
28
|
def select path
|
29
29
|
if method_map.has_key?(path)
|
30
30
|
method_map[path]
|
31
31
|
elsif path.start_with?('$/')
|
32
32
|
MethodNotImplemented
|
33
33
|
else
|
34
|
-
STDERR.puts "Method not found: #{path}"
|
35
34
|
MethodNotFound
|
36
35
|
end
|
37
36
|
end
|
@@ -5,23 +5,10 @@ module Solargraph
|
|
5
5
|
def process
|
6
6
|
host.configure params['initializationOptions']
|
7
7
|
host.prepare params['rootPath']
|
8
|
-
|
8
|
+
result = {
|
9
9
|
capabilities: {
|
10
10
|
textDocumentSync: 2, # @todo What should this be?
|
11
|
-
completionProvider: {
|
12
|
-
resolveProvider: true,
|
13
|
-
triggerCharacters: ['.', ':', '@']
|
14
|
-
},
|
15
|
-
hoverProvider: true,
|
16
11
|
definitionProvider: true,
|
17
|
-
signatureHelpProvider: {
|
18
|
-
triggerCharacters: ['(', ',']
|
19
|
-
},
|
20
|
-
documentFormattingProvider: true,
|
21
|
-
documentOnTypeFormattingProvider: {
|
22
|
-
firstTriggerCharacter: '{',
|
23
|
-
moreTriggerCharacter: ['(']
|
24
|
-
},
|
25
12
|
documentSymbolProvider: true,
|
26
13
|
workspaceSymbolProvider: true,
|
27
14
|
workspace: {
|
@@ -31,7 +18,88 @@ module Solargraph
|
|
31
18
|
}
|
32
19
|
}
|
33
20
|
}
|
34
|
-
|
21
|
+
}
|
22
|
+
result[:capabilities].merge! static_completion unless dynamic_completion?
|
23
|
+
result[:capabilities].merge! static_signature_help unless dynamic_signature_help?
|
24
|
+
result[:capabilities].merge! static_on_type_formatting unless dynamic_on_type_formatting?
|
25
|
+
result[:capabilities].merge! static_hover unless dynamic_hover?
|
26
|
+
result[:capabilities].merge! static_document_formatting unless dynamic_document_formatting?
|
27
|
+
set_result result
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def static_completion
|
33
|
+
{
|
34
|
+
completionProvider: {
|
35
|
+
resolveProvider: true,
|
36
|
+
triggerCharacters: ['.', ':', '@']
|
37
|
+
}
|
38
|
+
}
|
39
|
+
end
|
40
|
+
|
41
|
+
def dynamic_completion?
|
42
|
+
params['capabilities'] and
|
43
|
+
params['capabilities']['textDocument'] and
|
44
|
+
params['capabilities']['textDocument']['completion'] and
|
45
|
+
params['capabilities']['textDocument']['completion']['dynamicRegistration']
|
46
|
+
end
|
47
|
+
|
48
|
+
def static_signature_help
|
49
|
+
{
|
50
|
+
signatureHelpProvider: {
|
51
|
+
triggerCharacters: ['(', ',']
|
52
|
+
}
|
53
|
+
}
|
54
|
+
end
|
55
|
+
|
56
|
+
def dynamic_signature_help?
|
57
|
+
params['capabilities'] and
|
58
|
+
params['capabilities']['textDocument'] and
|
59
|
+
params['capabilities']['textDocument']['signatureHelp'] and
|
60
|
+
params['capabilities']['textDocument']['signatureHelp']['dynamicRegistration']
|
61
|
+
end
|
62
|
+
|
63
|
+
def static_on_type_formatting
|
64
|
+
{
|
65
|
+
documentOnTypeFormattingProvider: {
|
66
|
+
firstTriggerCharacter: '{',
|
67
|
+
moreTriggerCharacter: ['(']
|
68
|
+
}
|
69
|
+
}
|
70
|
+
end
|
71
|
+
|
72
|
+
def dynamic_on_type_formatting?
|
73
|
+
params['capabilities'] and
|
74
|
+
params['capabilities']['textDocument'] and
|
75
|
+
params['capabilities']['textDocument']['onTypeFormatting'] and
|
76
|
+
params['capabilities']['textDocument']['onTypeFormatting']['dynamicRegistration']
|
77
|
+
end
|
78
|
+
|
79
|
+
def static_hover
|
80
|
+
{
|
81
|
+
hoverProvider: true
|
82
|
+
}
|
83
|
+
end
|
84
|
+
|
85
|
+
def dynamic_hover?
|
86
|
+
params['capabilities'] and
|
87
|
+
params['capabilities']['textDocument'] and
|
88
|
+
params['capabilities']['textDocument']['hover'] and
|
89
|
+
params['capabilities']['textDocument']['hover']['dynamicRegistration']
|
90
|
+
end
|
91
|
+
|
92
|
+
def static_document_formatting
|
93
|
+
{
|
94
|
+
documentFormattingProvider: true
|
95
|
+
}
|
96
|
+
end
|
97
|
+
|
98
|
+
def dynamic_document_formatting?
|
99
|
+
params['capabilities'] and
|
100
|
+
params['capabilities']['textDocument'] and
|
101
|
+
params['capabilities']['textDocument']['hover'] and
|
102
|
+
params['capabilities']['textDocument']['hover']['dynamicRegistration']
|
35
103
|
end
|
36
104
|
end
|
37
105
|
end
|
@@ -3,6 +3,13 @@ module Solargraph
|
|
3
3
|
module Message
|
4
4
|
class Initialized < Base
|
5
5
|
def process
|
6
|
+
meths = []
|
7
|
+
meths.push 'textDocument/completion' if host.options['completion']
|
8
|
+
meths.push 'textDocument/hover' if host.options['hover']
|
9
|
+
meths.push 'textDocument/signatureHelp' if host.options['hover']
|
10
|
+
meths.push 'textDocument/onTypeFormatting' if host.options['autoformat']
|
11
|
+
meths.push 'textDocument/formatting' if host.options['formatting']
|
12
|
+
host.register_capabilities meths unless meths.empty?
|
6
13
|
end
|
7
14
|
end
|
8
15
|
end
|
@@ -7,10 +7,13 @@ module Solargraph
|
|
7
7
|
class Formatting < Base
|
8
8
|
def process
|
9
9
|
filename = uri_to_file(params['textDocument']['uri'])
|
10
|
+
filename = 'tmp.rb' if filename.nil? or filename.empty?
|
10
11
|
original = host.read_text(params['textDocument']['uri'])
|
11
12
|
cmd = "rubocop -a -f fi -s #{Shellwords.escape(filename)}"
|
12
13
|
o, e, s = Open3.capture3(cmd, stdin_data: original)
|
13
|
-
|
14
|
+
lines = o.lines
|
15
|
+
index = lines.index{|l| l.start_with?('====================')}
|
16
|
+
formatted = lines[index+1..-1].join
|
14
17
|
set_result(
|
15
18
|
[
|
16
19
|
{
|
@@ -4,25 +4,26 @@ module Solargraph
|
|
4
4
|
module TextDocument
|
5
5
|
class OnTypeFormatting < Base
|
6
6
|
def process
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
7
|
+
# @todo Temporarily disabled due to conflicts with VSCode formatting on type
|
8
|
+
# src = host.send(:library).checkout(uri_to_file(params['textDocument']['uri']))
|
9
|
+
# fragment = src.fragment_at(params['position']['line'], params['position']['character'] - 1)
|
10
|
+
# offset = fragment.send(:offset)
|
11
|
+
# if fragment.string? and params['ch'] == '{' and src.code[offset - 1, 2] == '#{'
|
12
|
+
# set_result(
|
13
|
+
# [
|
14
|
+
# {
|
15
|
+
# range: {
|
16
|
+
# start: params['position'],
|
17
|
+
# end: params['position']
|
18
|
+
# },
|
19
|
+
# newText: '}'
|
20
|
+
# }
|
21
|
+
# ]
|
22
|
+
# )
|
23
|
+
# else
|
24
|
+
# # @todo Is `nil` or `[]` more appropriate here?
|
25
|
+
# set_result nil
|
26
|
+
# end
|
26
27
|
end
|
27
28
|
end
|
28
29
|
end
|
@@ -3,7 +3,25 @@ require 'uri'
|
|
3
3
|
module Solargraph::LanguageServer::Message::Workspace
|
4
4
|
class DidChangeConfiguration < Solargraph::LanguageServer::Message::Base
|
5
5
|
def process
|
6
|
-
|
6
|
+
update = params['settings']['solargraph']
|
7
|
+
|
8
|
+
meths = []
|
9
|
+
meths.push 'textDocument/completion' if update.has_key?('completion') and update['completion'] and !host.options['completion']
|
10
|
+
meths.push 'textDocument/hover' if update.has_key?('hover') and update['hover'] and !host.options['hover']
|
11
|
+
meths.push 'textDocument/signatureHelp' if update.has_key?('hover') and update['hover'] and !host.options['hover']
|
12
|
+
meths.push 'textDocument/onTypeFormatting' if update.has_key?('autoformat') and update['autoformat'] and !host.options['autoformat']
|
13
|
+
meths.push "textDocument/formatting" if update.has_key?('formatting') and update['formatting'] and !host.options['formatting']
|
14
|
+
host.register_capabilities meths unless meths.empty?
|
15
|
+
|
16
|
+
meths = []
|
17
|
+
meths.push 'textDocument/completion' if update.has_key?('completion') and !update['completion'] and host.options['completion']
|
18
|
+
meths.push 'textDocument/hover' if update.has_key?('hover') and !update['hover'] and host.options['hover']
|
19
|
+
meths.push 'textDocument/signatureHelp' if update.has_key?('hover') and !update['hover'] and host.options['hover']
|
20
|
+
meths.push 'textDocument/onTypeFormatting' if update.has_key?('autoformat') and !update['autoformat'] and host.options['autoformat']
|
21
|
+
meths.push "textDocument/formatting" if update.has_key?('formatting') and !update['formatting'] and host.options['formatting']
|
22
|
+
host.unregister_capabilities meths unless meths.empty?
|
23
|
+
|
24
|
+
host.configure update
|
7
25
|
end
|
8
26
|
end
|
9
27
|
end
|