solargraph 0.58.3 → 0.59.0.dev.1
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/.envrc +3 -0
- data/.github/workflows/linting.yml +4 -5
- data/.github/workflows/plugins.yml +41 -38
- data/.github/workflows/rspec.yml +45 -13
- data/.github/workflows/typecheck.yml +2 -2
- data/.gitignore +0 -1
- data/.rubocop_todo.yml +27 -49
- data/CHANGELOG.md +1 -10
- data/README.md +3 -3
- data/Rakefile +1 -0
- data/lib/solargraph/api_map/cache.rb +3 -3
- data/lib/solargraph/api_map/constants.rb +13 -3
- data/lib/solargraph/api_map/index.rb +22 -11
- data/lib/solargraph/api_map/source_to_yard.rb +13 -1
- data/lib/solargraph/api_map/store.rb +11 -8
- data/lib/solargraph/api_map.rb +105 -50
- data/lib/solargraph/bench.rb +45 -45
- data/lib/solargraph/complex_type/conformance.rb +176 -0
- data/lib/solargraph/complex_type/type_methods.rb +16 -2
- data/lib/solargraph/complex_type/unique_type.rb +170 -20
- data/lib/solargraph/complex_type.rb +119 -14
- data/lib/solargraph/convention/data_definition/data_assignment_node.rb +61 -61
- data/lib/solargraph/convention/data_definition/data_definition_node.rb +3 -1
- data/lib/solargraph/convention/data_definition.rb +4 -1
- data/lib/solargraph/convention/gemfile.rb +15 -15
- data/lib/solargraph/convention/gemspec.rb +23 -23
- data/lib/solargraph/convention/rakefile.rb +17 -17
- data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +1 -0
- data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +1 -0
- data/lib/solargraph/convention/struct_definition.rb +5 -1
- data/lib/solargraph/convention.rb +78 -78
- data/lib/solargraph/converters/dd.rb +17 -17
- data/lib/solargraph/converters/dl.rb +15 -15
- data/lib/solargraph/converters/dt.rb +15 -15
- data/lib/solargraph/converters/misc.rb +1 -1
- data/lib/solargraph/diagnostics/require_not_found.rb +1 -0
- data/lib/solargraph/diagnostics/rubocop.rb +1 -0
- data/lib/solargraph/diagnostics/rubocop_helpers.rb +2 -0
- data/lib/solargraph/diagnostics/type_check.rb +1 -0
- data/lib/solargraph/diagnostics/update_errors.rb +41 -41
- data/lib/solargraph/doc_map.rb +134 -373
- data/lib/solargraph/equality.rb +1 -1
- data/lib/solargraph/gem_pins.rb +14 -15
- data/lib/solargraph/language_server/error_codes.rb +20 -20
- data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
- data/lib/solargraph/language_server/host/dispatch.rb +1 -0
- data/lib/solargraph/language_server/host/message_worker.rb +2 -1
- data/lib/solargraph/language_server/host/sources.rb +1 -0
- data/lib/solargraph/language_server/host.rb +6 -1
- data/lib/solargraph/language_server/message/base.rb +97 -97
- data/lib/solargraph/language_server/message/client/register_capability.rb +15 -15
- data/lib/solargraph/language_server/message/completion_item/resolve.rb +60 -60
- data/lib/solargraph/language_server/message/extended/check_gem_version.rb +2 -7
- data/lib/solargraph/language_server/message/extended/document.rb +1 -0
- data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -32
- data/lib/solargraph/language_server/message/extended/download_core.rb +19 -19
- data/lib/solargraph/language_server/message/extended/search.rb +20 -20
- data/lib/solargraph/language_server/message/initialize.rb +191 -191
- data/lib/solargraph/language_server/message/text_document/completion.rb +2 -0
- data/lib/solargraph/language_server/message/text_document/definition.rb +2 -0
- data/lib/solargraph/language_server/message/text_document/document_highlight.rb +16 -16
- data/lib/solargraph/language_server/message/text_document/document_symbol.rb +2 -0
- data/lib/solargraph/language_server/message/text_document/formatting.rb +2 -0
- data/lib/solargraph/language_server/message/text_document/hover.rb +2 -0
- data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +11 -11
- data/lib/solargraph/language_server/message/text_document/references.rb +16 -16
- data/lib/solargraph/language_server/message/text_document/rename.rb +19 -19
- data/lib/solargraph/language_server/message/text_document/signature_help.rb +1 -0
- data/lib/solargraph/language_server/message/text_document/type_definition.rb +2 -0
- data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +35 -35
- data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +40 -40
- data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +26 -26
- data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +2 -0
- data/lib/solargraph/language_server/message.rb +94 -94
- data/lib/solargraph/language_server/request.rb +27 -27
- data/lib/solargraph/language_server/transport/data_reader.rb +74 -74
- data/lib/solargraph/language_server/uri_helpers.rb +49 -49
- data/lib/solargraph/library.rb +59 -13
- data/lib/solargraph/location.rb +9 -4
- data/lib/solargraph/logging.rb +21 -1
- data/lib/solargraph/page.rb +92 -92
- data/lib/solargraph/parser/comment_ripper.rb +7 -0
- data/lib/solargraph/parser/flow_sensitive_typing.rb +330 -102
- data/lib/solargraph/parser/node_processor/base.rb +32 -2
- data/lib/solargraph/parser/node_processor.rb +7 -6
- data/lib/solargraph/parser/parser_gem/class_methods.rb +28 -10
- data/lib/solargraph/parser/parser_gem/flawed_builder.rb +19 -19
- data/lib/solargraph/parser/parser_gem/node_chainer.rb +31 -6
- data/lib/solargraph/parser/parser_gem/node_methods.rb +27 -7
- data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +4 -4
- data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +2 -0
- data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +9 -0
- data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +11 -11
- data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +7 -0
- data/lib/solargraph/parser/parser_gem/node_processors/defs_node.rb +37 -37
- data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +36 -6
- data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +3 -2
- data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +1 -0
- data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +3 -1
- data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +2 -2
- data/lib/solargraph/parser/parser_gem/node_processors/or_node.rb +22 -0
- data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +1 -1
- data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +2 -1
- data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +1 -0
- data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +12 -7
- data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +29 -29
- data/lib/solargraph/parser/parser_gem/node_processors/when_node.rb +23 -0
- data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +5 -1
- data/lib/solargraph/parser/parser_gem/node_processors.rb +4 -0
- data/lib/solargraph/parser/parser_gem.rb +12 -12
- data/lib/solargraph/parser/region.rb +9 -3
- data/lib/solargraph/parser/snippet.rb +1 -1
- data/lib/solargraph/parser.rb +23 -23
- data/lib/solargraph/pin/base.rb +53 -21
- data/lib/solargraph/pin/base_variable.rb +312 -20
- data/lib/solargraph/pin/block.rb +26 -4
- data/lib/solargraph/pin/breakable.rb +5 -1
- data/lib/solargraph/pin/callable.rb +50 -3
- data/lib/solargraph/pin/closure.rb +2 -6
- data/lib/solargraph/pin/common.rb +20 -5
- data/lib/solargraph/pin/compound_statement.rb +55 -0
- data/lib/solargraph/pin/constant.rb +45 -45
- data/lib/solargraph/pin/conversions.rb +2 -1
- data/lib/solargraph/pin/delegated_method.rb +15 -4
- data/lib/solargraph/pin/documenting.rb +1 -0
- data/lib/solargraph/pin/instance_variable.rb +5 -1
- data/lib/solargraph/pin/keyword.rb +0 -4
- data/lib/solargraph/pin/local_variable.rb +13 -57
- data/lib/solargraph/pin/method.rb +90 -42
- data/lib/solargraph/pin/method_alias.rb +8 -0
- data/lib/solargraph/pin/namespace.rb +7 -1
- data/lib/solargraph/pin/parameter.rb +76 -13
- data/lib/solargraph/pin/proxy_type.rb +2 -1
- data/lib/solargraph/pin/reference/override.rb +1 -1
- data/lib/solargraph/pin/reference/superclass.rb +2 -0
- data/lib/solargraph/pin/reference.rb +2 -0
- data/lib/solargraph/pin/search.rb +1 -0
- data/lib/solargraph/pin/signature.rb +8 -0
- data/lib/solargraph/pin/symbol.rb +1 -1
- data/lib/solargraph/pin/until.rb +1 -1
- data/lib/solargraph/pin/while.rb +1 -1
- data/lib/solargraph/pin.rb +2 -0
- data/lib/solargraph/pin_cache.rb +477 -57
- data/lib/solargraph/position.rb +12 -26
- data/lib/solargraph/range.rb +6 -6
- data/lib/solargraph/rbs_map/conversions.rb +33 -10
- data/lib/solargraph/rbs_map/core_fills.rb +84 -84
- data/lib/solargraph/rbs_map/core_map.rb +24 -17
- data/lib/solargraph/rbs_map/stdlib_map.rb +34 -5
- data/lib/solargraph/rbs_map.rb +74 -20
- data/lib/solargraph/server_methods.rb +16 -16
- data/lib/solargraph/shell.rb +73 -39
- data/lib/solargraph/source/chain/array.rb +37 -37
- data/lib/solargraph/source/chain/call.rb +52 -17
- data/lib/solargraph/source/chain/class_variable.rb +13 -13
- data/lib/solargraph/source/chain/constant.rb +2 -0
- data/lib/solargraph/source/chain/global_variable.rb +13 -13
- data/lib/solargraph/source/chain/hash.rb +1 -0
- data/lib/solargraph/source/chain/if.rb +1 -0
- data/lib/solargraph/source/chain/instance_variable.rb +22 -1
- data/lib/solargraph/source/chain/link.rb +109 -109
- data/lib/solargraph/source/chain/literal.rb +5 -0
- data/lib/solargraph/source/chain/or.rb +9 -1
- data/lib/solargraph/source/chain/q_call.rb +11 -11
- data/lib/solargraph/source/chain/variable.rb +13 -13
- data/lib/solargraph/source/chain/z_super.rb +30 -30
- data/lib/solargraph/source/chain.rb +25 -22
- data/lib/solargraph/source/change.rb +9 -2
- data/lib/solargraph/source/cursor.rb +7 -1
- data/lib/solargraph/source/source_chainer.rb +13 -3
- data/lib/solargraph/source/updater.rb +4 -0
- data/lib/solargraph/source.rb +33 -7
- data/lib/solargraph/source_map/clip.rb +13 -2
- data/lib/solargraph/source_map/data.rb +4 -1
- data/lib/solargraph/source_map/mapper.rb +24 -1
- data/lib/solargraph/source_map.rb +14 -6
- data/lib/solargraph/type_checker/problem.rb +3 -1
- data/lib/solargraph/type_checker/rules.rb +75 -2
- data/lib/solargraph/type_checker.rb +111 -30
- data/lib/solargraph/version.rb +1 -1
- data/lib/solargraph/workspace/config.rb +3 -1
- data/lib/solargraph/workspace/gemspecs.rb +367 -0
- data/lib/solargraph/workspace/require_paths.rb +1 -0
- data/lib/solargraph/workspace.rb +158 -16
- data/lib/solargraph/yard_map/helpers.rb +2 -1
- data/lib/solargraph/yard_map/mapper/to_method.rb +5 -1
- data/lib/solargraph/yard_map/mapper/to_namespace.rb +1 -0
- data/lib/solargraph/yard_map/mapper.rb +5 -0
- data/lib/solargraph/yard_tags.rb +20 -20
- data/lib/solargraph/yardoc.rb +33 -23
- data/lib/solargraph.rb +24 -3
- data/rbs/fills/rubygems/0/dependency.rbs +193 -0
- data/rbs/fills/tuple/tuple.rbs +28 -0
- data/rbs/shims/ast/0/node.rbs +1 -1
- data/rbs/shims/diff-lcs/1.5/diff-lcs.rbs +11 -0
- data/solargraph.gemspec +2 -1
- metadata +12 -7
- data/lib/solargraph/type_checker/checks.rb +0 -124
- data/lib/solargraph/type_checker/param_def.rb +0 -37
- data/lib/solargraph/yard_map/to_method.rb +0 -89
|
@@ -1,89 +1,89 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Solargraph
|
|
4
|
-
module LanguageServer
|
|
5
|
-
class Host
|
|
6
|
-
# An asynchronous diagnosis reporter.
|
|
7
|
-
#
|
|
8
|
-
class Diagnoser
|
|
9
|
-
# @param host [Host]
|
|
10
|
-
def initialize host
|
|
11
|
-
@host = host
|
|
12
|
-
@mutex = Mutex.new
|
|
13
|
-
@queue = []
|
|
14
|
-
@stopped = true
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
# Schedule a file to be diagnosed.
|
|
18
|
-
#
|
|
19
|
-
# @param uri [String]
|
|
20
|
-
# @return [void]
|
|
21
|
-
def schedule uri
|
|
22
|
-
mutex.synchronize { queue.push uri }
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
# Stop the diagnosis thread.
|
|
26
|
-
#
|
|
27
|
-
# @return [void]
|
|
28
|
-
def stop
|
|
29
|
-
@stopped = true
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
# True is the diagnoser is stopped.
|
|
33
|
-
#
|
|
34
|
-
# @return [Boolean]
|
|
35
|
-
def stopped?
|
|
36
|
-
@stopped
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
# Start the diagnosis thread.
|
|
40
|
-
#
|
|
41
|
-
# @return [self, nil]
|
|
42
|
-
def start
|
|
43
|
-
return unless @stopped
|
|
44
|
-
@stopped = false
|
|
45
|
-
Thread.new do
|
|
46
|
-
until stopped?
|
|
47
|
-
tick
|
|
48
|
-
sleep 0.1
|
|
49
|
-
end
|
|
50
|
-
end
|
|
51
|
-
self
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
# Perform diagnoses.
|
|
55
|
-
#
|
|
56
|
-
# @return [void]
|
|
57
|
-
def tick
|
|
58
|
-
return if queue.empty? || host.synchronizing?
|
|
59
|
-
if !host.options['diagnostics']
|
|
60
|
-
mutex.synchronize { queue.clear }
|
|
61
|
-
return
|
|
62
|
-
end
|
|
63
|
-
current = mutex.synchronize { queue.shift }
|
|
64
|
-
return if queue.include?(current)
|
|
65
|
-
begin
|
|
66
|
-
host.diagnose current
|
|
67
|
-
rescue InvalidOffsetError
|
|
68
|
-
# @todo This error can occur when the Source is out of sync with
|
|
69
|
-
# with the ApiMap. It's probably not the best way to handle it,
|
|
70
|
-
# but it's quick and easy.
|
|
71
|
-
Logging.logger.warn "Deferring diagnosis due to invalid offset: #{current}"
|
|
72
|
-
mutex.synchronize { queue.push current }
|
|
73
|
-
end
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
private
|
|
77
|
-
|
|
78
|
-
# @return [Host]
|
|
79
|
-
attr_reader :host
|
|
80
|
-
|
|
81
|
-
# @return [Mutex]
|
|
82
|
-
attr_reader :mutex
|
|
83
|
-
|
|
84
|
-
# @return [::Array]
|
|
85
|
-
attr_reader :queue
|
|
86
|
-
end
|
|
87
|
-
end
|
|
88
|
-
end
|
|
89
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
module LanguageServer
|
|
5
|
+
class Host
|
|
6
|
+
# An asynchronous diagnosis reporter.
|
|
7
|
+
#
|
|
8
|
+
class Diagnoser
|
|
9
|
+
# @param host [Host]
|
|
10
|
+
def initialize host
|
|
11
|
+
@host = host
|
|
12
|
+
@mutex = Mutex.new
|
|
13
|
+
@queue = []
|
|
14
|
+
@stopped = true
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# Schedule a file to be diagnosed.
|
|
18
|
+
#
|
|
19
|
+
# @param uri [String]
|
|
20
|
+
# @return [void]
|
|
21
|
+
def schedule uri
|
|
22
|
+
mutex.synchronize { queue.push uri }
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# Stop the diagnosis thread.
|
|
26
|
+
#
|
|
27
|
+
# @return [void]
|
|
28
|
+
def stop
|
|
29
|
+
@stopped = true
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# True is the diagnoser is stopped.
|
|
33
|
+
#
|
|
34
|
+
# @return [Boolean]
|
|
35
|
+
def stopped?
|
|
36
|
+
@stopped
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Start the diagnosis thread.
|
|
40
|
+
#
|
|
41
|
+
# @return [self, nil]
|
|
42
|
+
def start
|
|
43
|
+
return unless @stopped
|
|
44
|
+
@stopped = false
|
|
45
|
+
Thread.new do
|
|
46
|
+
until stopped?
|
|
47
|
+
tick
|
|
48
|
+
sleep 0.1
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
self
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# Perform diagnoses.
|
|
55
|
+
#
|
|
56
|
+
# @return [void]
|
|
57
|
+
def tick
|
|
58
|
+
return if queue.empty? || host.synchronizing?
|
|
59
|
+
if !host.options['diagnostics']
|
|
60
|
+
mutex.synchronize { queue.clear }
|
|
61
|
+
return
|
|
62
|
+
end
|
|
63
|
+
current = mutex.synchronize { queue.shift }
|
|
64
|
+
return if queue.include?(current)
|
|
65
|
+
begin
|
|
66
|
+
host.diagnose current
|
|
67
|
+
rescue InvalidOffsetError
|
|
68
|
+
# @todo This error can occur when the Source is out of sync with
|
|
69
|
+
# with the ApiMap. It's probably not the best way to handle it,
|
|
70
|
+
# but it's quick and easy.
|
|
71
|
+
Logging.logger.warn "Deferring diagnosis due to invalid offset: #{current}"
|
|
72
|
+
mutex.synchronize { queue.push current }
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
private
|
|
77
|
+
|
|
78
|
+
# @return [Host]
|
|
79
|
+
attr_reader :host
|
|
80
|
+
|
|
81
|
+
# @return [Mutex]
|
|
82
|
+
attr_reader :mutex
|
|
83
|
+
|
|
84
|
+
# @return [::Array]
|
|
85
|
+
attr_reader :queue
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
@@ -33,6 +33,7 @@ module Solargraph
|
|
|
33
33
|
# @return [void]
|
|
34
34
|
def update_libraries uri
|
|
35
35
|
src = sources.find(uri)
|
|
36
|
+
# @sg-ignore Need to add nil check here
|
|
36
37
|
using = libraries.select { |lib| lib.contain?(src.filename) }
|
|
37
38
|
using.push library_for(uri) if using.empty?
|
|
38
39
|
using.each { |lib| lib.merge src }
|
|
@@ -28,7 +28,7 @@ module Solargraph
|
|
|
28
28
|
end
|
|
29
29
|
|
|
30
30
|
# pending handle messages
|
|
31
|
-
# @return [Array<Hash>]
|
|
31
|
+
# @return [Array<Hash{String => undefined}>]
|
|
32
32
|
def messages
|
|
33
33
|
@messages ||= []
|
|
34
34
|
end
|
|
@@ -66,6 +66,7 @@ module Solargraph
|
|
|
66
66
|
@resource.wait(@mutex) if messages.empty?
|
|
67
67
|
next_message
|
|
68
68
|
end
|
|
69
|
+
# @sg-ignore Need to add nil check here
|
|
69
70
|
handler = @host.receive(message)
|
|
70
71
|
handler&.send_response
|
|
71
72
|
end
|
|
@@ -55,6 +55,7 @@ module Solargraph
|
|
|
55
55
|
# @raise [FileNotFoundError] if the URI does not match an open source.
|
|
56
56
|
#
|
|
57
57
|
# @param uri [String]
|
|
58
|
+
# @sg-ignore flow ensitive typing should understand raise
|
|
58
59
|
# @return [Solargraph::Source]
|
|
59
60
|
def find uri
|
|
60
61
|
open_source_hash[uri] || raise(Solargraph::FileNotFoundError, "Host could not find #{uri}")
|
|
@@ -105,6 +105,7 @@ module Solargraph
|
|
|
105
105
|
message.process unless cancel?(request['id'])
|
|
106
106
|
rescue StandardError => e
|
|
107
107
|
logger.warn "Error processing request: [#{e.class}] #{e.message}"
|
|
108
|
+
# @sg-ignore Need to add nil check here
|
|
108
109
|
logger.warn e.backtrace.join("\n")
|
|
109
110
|
message.set_error Solargraph::LanguageServer::ErrorCodes::INTERNAL_ERROR, "[#{e.class}] #{e.message}"
|
|
110
111
|
end
|
|
@@ -300,8 +301,11 @@ module Solargraph
|
|
|
300
301
|
end
|
|
301
302
|
end
|
|
302
303
|
|
|
304
|
+
# @sg-ignore Need to validate config
|
|
303
305
|
# @return [String]
|
|
306
|
+
# @sg-ignore Need to validate config
|
|
304
307
|
def command_path
|
|
308
|
+
# @type [String]
|
|
305
309
|
options['commandPath'] || 'solargraph'
|
|
306
310
|
end
|
|
307
311
|
|
|
@@ -729,9 +733,11 @@ module Solargraph
|
|
|
729
733
|
end
|
|
730
734
|
|
|
731
735
|
# @param path [String]
|
|
736
|
+
# @sg-ignore Need to be able to choose signature on String#gsub
|
|
732
737
|
# @return [String]
|
|
733
738
|
def normalize_separators path
|
|
734
739
|
return path if File::ALT_SEPARATOR.nil?
|
|
740
|
+
# @sg-ignore flow sensitive typing needs to handle constants
|
|
735
741
|
path.gsub(File::ALT_SEPARATOR, File::SEPARATOR)
|
|
736
742
|
end
|
|
737
743
|
|
|
@@ -765,7 +771,6 @@ module Solargraph
|
|
|
765
771
|
return change if source.code.length + 1 != change['text'].length
|
|
766
772
|
diffs = Diff::LCS.diff(source.code, change['text'])
|
|
767
773
|
return change if diffs.length.zero? || diffs.length > 1 || diffs.first.length > 1
|
|
768
|
-
# @sg-ignore push this upstream
|
|
769
774
|
# @type [Diff::LCS::Change]
|
|
770
775
|
diff = diffs.first.first
|
|
771
776
|
return change unless diff.adding? && ['.', ':', '(', ',', ' '].include?(diff.element)
|
|
@@ -1,97 +1,97 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Solargraph
|
|
4
|
-
module LanguageServer
|
|
5
|
-
module Message
|
|
6
|
-
class Base
|
|
7
|
-
# @return [Solargraph::LanguageServer::Host]
|
|
8
|
-
attr_reader :host
|
|
9
|
-
|
|
10
|
-
# @return [Integer]
|
|
11
|
-
attr_reader :id
|
|
12
|
-
|
|
13
|
-
# @return [Hash]
|
|
14
|
-
attr_reader :request
|
|
15
|
-
|
|
16
|
-
# @return [String]
|
|
17
|
-
attr_reader :method
|
|
18
|
-
|
|
19
|
-
# @return [Hash{String => undefined}]
|
|
20
|
-
attr_reader :params
|
|
21
|
-
|
|
22
|
-
# @return [Hash, Array, nil]
|
|
23
|
-
attr_reader :result
|
|
24
|
-
|
|
25
|
-
# @return [Hash, nil]
|
|
26
|
-
attr_reader :error
|
|
27
|
-
|
|
28
|
-
# @param host [Solargraph::LanguageServer::Host]
|
|
29
|
-
# @param request [Hash]
|
|
30
|
-
def initialize host, request
|
|
31
|
-
@host = host
|
|
32
|
-
@id = request['id'].freeze
|
|
33
|
-
@request = request.freeze
|
|
34
|
-
@method = request['method'].freeze
|
|
35
|
-
@params = (request['params'] || {}).freeze
|
|
36
|
-
post_initialize
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
# @return [void]
|
|
40
|
-
def post_initialize; end
|
|
41
|
-
|
|
42
|
-
# @return [void]
|
|
43
|
-
def process; end
|
|
44
|
-
|
|
45
|
-
# @param data [Hash, Array, nil]
|
|
46
|
-
# @return [void]
|
|
47
|
-
def set_result data
|
|
48
|
-
@result = data
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
# @param code [Integer] See Solargraph::LanguageServer::ErrorCodes
|
|
52
|
-
# @param message [String]
|
|
53
|
-
# @return [void]
|
|
54
|
-
def set_error code, message
|
|
55
|
-
@error = {
|
|
56
|
-
code: code,
|
|
57
|
-
message: message
|
|
58
|
-
}
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
# @return [void]
|
|
62
|
-
def send_response
|
|
63
|
-
return if id.nil?
|
|
64
|
-
|
|
65
|
-
accept_or_cancel
|
|
66
|
-
response = {
|
|
67
|
-
jsonrpc: '2.0',
|
|
68
|
-
id: id
|
|
69
|
-
}
|
|
70
|
-
response[:result] = result unless result.nil?
|
|
71
|
-
response[:error] = error unless error.nil?
|
|
72
|
-
response[:result] = nil if result.nil? and error.nil?
|
|
73
|
-
json = response.to_json
|
|
74
|
-
envelope = "Content-Length: #{json.bytesize}\r\n\r\n#{json}"
|
|
75
|
-
Solargraph.logger.debug envelope
|
|
76
|
-
host.queue envelope
|
|
77
|
-
host.clear id
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
private
|
|
81
|
-
|
|
82
|
-
# @return [void]
|
|
83
|
-
def accept_or_cancel
|
|
84
|
-
if host.cancel?(id)
|
|
85
|
-
# https://microsoft.github.io/language-server-protocol/specifications/specification-current/#cancelRequest
|
|
86
|
-
# cancel should send response RequestCancelled
|
|
87
|
-
Solargraph::Logging.logger.info "Cancelled response to ##{id} #{method}"
|
|
88
|
-
set_result nil
|
|
89
|
-
set_error ErrorCodes::REQUEST_CANCELLED, 'Cancelled by client'
|
|
90
|
-
else
|
|
91
|
-
Solargraph::Logging.logger.info "Sending response to ##{id} #{method}"
|
|
92
|
-
end
|
|
93
|
-
end
|
|
94
|
-
end
|
|
95
|
-
end
|
|
96
|
-
end
|
|
97
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
module LanguageServer
|
|
5
|
+
module Message
|
|
6
|
+
class Base
|
|
7
|
+
# @return [Solargraph::LanguageServer::Host]
|
|
8
|
+
attr_reader :host
|
|
9
|
+
|
|
10
|
+
# @return [Integer]
|
|
11
|
+
attr_reader :id
|
|
12
|
+
|
|
13
|
+
# @return [Hash]
|
|
14
|
+
attr_reader :request
|
|
15
|
+
|
|
16
|
+
# @return [String]
|
|
17
|
+
attr_reader :method
|
|
18
|
+
|
|
19
|
+
# @return [Hash{String => undefined}]
|
|
20
|
+
attr_reader :params
|
|
21
|
+
|
|
22
|
+
# @return [Hash, Array, nil]
|
|
23
|
+
attr_reader :result
|
|
24
|
+
|
|
25
|
+
# @return [Hash, nil]
|
|
26
|
+
attr_reader :error
|
|
27
|
+
|
|
28
|
+
# @param host [Solargraph::LanguageServer::Host]
|
|
29
|
+
# @param request [Hash]
|
|
30
|
+
def initialize host, request
|
|
31
|
+
@host = host
|
|
32
|
+
@id = request['id'].freeze
|
|
33
|
+
@request = request.freeze
|
|
34
|
+
@method = request['method'].freeze
|
|
35
|
+
@params = (request['params'] || {}).freeze
|
|
36
|
+
post_initialize
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# @return [void]
|
|
40
|
+
def post_initialize; end
|
|
41
|
+
|
|
42
|
+
# @return [void]
|
|
43
|
+
def process; end
|
|
44
|
+
|
|
45
|
+
# @param data [Hash, Array, nil]
|
|
46
|
+
# @return [void]
|
|
47
|
+
def set_result data
|
|
48
|
+
@result = data
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# @param code [Integer] See Solargraph::LanguageServer::ErrorCodes
|
|
52
|
+
# @param message [String]
|
|
53
|
+
# @return [void]
|
|
54
|
+
def set_error code, message
|
|
55
|
+
@error = {
|
|
56
|
+
code: code,
|
|
57
|
+
message: message
|
|
58
|
+
}
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# @return [void]
|
|
62
|
+
def send_response
|
|
63
|
+
return if id.nil?
|
|
64
|
+
|
|
65
|
+
accept_or_cancel
|
|
66
|
+
response = {
|
|
67
|
+
jsonrpc: '2.0',
|
|
68
|
+
id: id
|
|
69
|
+
}
|
|
70
|
+
response[:result] = result unless result.nil?
|
|
71
|
+
response[:error] = error unless error.nil?
|
|
72
|
+
response[:result] = nil if result.nil? and error.nil?
|
|
73
|
+
json = response.to_json
|
|
74
|
+
envelope = "Content-Length: #{json.bytesize}\r\n\r\n#{json}"
|
|
75
|
+
Solargraph.logger.debug envelope
|
|
76
|
+
host.queue envelope
|
|
77
|
+
host.clear id
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
private
|
|
81
|
+
|
|
82
|
+
# @return [void]
|
|
83
|
+
def accept_or_cancel
|
|
84
|
+
if host.cancel?(id)
|
|
85
|
+
# https://microsoft.github.io/language-server-protocol/specifications/specification-current/#cancelRequest
|
|
86
|
+
# cancel should send response RequestCancelled
|
|
87
|
+
Solargraph::Logging.logger.info "Cancelled response to ##{id} #{method}"
|
|
88
|
+
set_result nil
|
|
89
|
+
set_error ErrorCodes::REQUEST_CANCELLED, 'Cancelled by client'
|
|
90
|
+
else
|
|
91
|
+
Solargraph::Logging.logger.info "Sending response to ##{id} #{method}"
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Solargraph
|
|
4
|
-
module LanguageServer
|
|
5
|
-
module Message
|
|
6
|
-
module Client
|
|
7
|
-
class RegisterCapability < Solargraph::LanguageServer::Message::Base
|
|
8
|
-
def process
|
|
9
|
-
|
|
10
|
-
end
|
|
11
|
-
end
|
|
12
|
-
end
|
|
13
|
-
end
|
|
14
|
-
end
|
|
15
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
module LanguageServer
|
|
5
|
+
module Message
|
|
6
|
+
module Client
|
|
7
|
+
class RegisterCapability < Solargraph::LanguageServer::Message::Base
|
|
8
|
+
def process
|
|
9
|
+
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -1,60 +1,60 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Solargraph
|
|
4
|
-
module LanguageServer
|
|
5
|
-
module Message
|
|
6
|
-
module CompletionItem
|
|
7
|
-
# completionItem/resolve message handler
|
|
8
|
-
#
|
|
9
|
-
class Resolve < Base
|
|
10
|
-
def process
|
|
11
|
-
pins = host.locate_pins(params)
|
|
12
|
-
set_result merge(pins)
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
private
|
|
16
|
-
|
|
17
|
-
# @param pins [Array<Pin::Base>]
|
|
18
|
-
# @return [Hash]
|
|
19
|
-
def merge pins
|
|
20
|
-
return params if pins.empty?
|
|
21
|
-
docs = pins
|
|
22
|
-
.reject { |pin| pin.documentation.empty? && pin.return_type.undefined? }
|
|
23
|
-
result = params
|
|
24
|
-
.transform_keys(&:to_sym)
|
|
25
|
-
.merge(pins.first.resolve_completion_item)
|
|
26
|
-
.merge(documentation: markup_content(join_docs(docs)))
|
|
27
|
-
result[:detail] = pins.first.detail
|
|
28
|
-
result
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
# @param text [String]
|
|
32
|
-
# @return [Hash{Symbol => String}, nil]
|
|
33
|
-
def markup_content text
|
|
34
|
-
return nil if text.strip.empty?
|
|
35
|
-
{
|
|
36
|
-
kind: 'markdown',
|
|
37
|
-
value: text
|
|
38
|
-
}
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
# @param pins [Array<Pin::Base>]
|
|
42
|
-
# @return [String]
|
|
43
|
-
def join_docs pins
|
|
44
|
-
result = []
|
|
45
|
-
last_link = nil
|
|
46
|
-
pins.each_with_index do |pin|
|
|
47
|
-
this_link = host.options['enablePages'] ? pin.link_documentation : pin.text_documentation
|
|
48
|
-
if this_link && this_link != last_link && this_link != 'undefined'
|
|
49
|
-
result.push this_link
|
|
50
|
-
end
|
|
51
|
-
result.push pin.documentation unless result.last && result.last.end_with?(pin.documentation)
|
|
52
|
-
last_link = this_link
|
|
53
|
-
end
|
|
54
|
-
result.join("\n\n")
|
|
55
|
-
end
|
|
56
|
-
end
|
|
57
|
-
end
|
|
58
|
-
end
|
|
59
|
-
end
|
|
60
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
module LanguageServer
|
|
5
|
+
module Message
|
|
6
|
+
module CompletionItem
|
|
7
|
+
# completionItem/resolve message handler
|
|
8
|
+
#
|
|
9
|
+
class Resolve < Base
|
|
10
|
+
def process
|
|
11
|
+
pins = host.locate_pins(params)
|
|
12
|
+
set_result merge(pins)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
private
|
|
16
|
+
|
|
17
|
+
# @param pins [Array<Pin::Base>]
|
|
18
|
+
# @return [Hash]
|
|
19
|
+
def merge pins
|
|
20
|
+
return params if pins.empty?
|
|
21
|
+
docs = pins
|
|
22
|
+
.reject { |pin| pin.documentation.empty? && pin.return_type.undefined? }
|
|
23
|
+
result = params
|
|
24
|
+
.transform_keys(&:to_sym)
|
|
25
|
+
.merge(pins.first.resolve_completion_item)
|
|
26
|
+
.merge(documentation: markup_content(join_docs(docs)))
|
|
27
|
+
result[:detail] = pins.first.detail
|
|
28
|
+
result
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# @param text [String]
|
|
32
|
+
# @return [Hash{Symbol => String}, nil]
|
|
33
|
+
def markup_content text
|
|
34
|
+
return nil if text.strip.empty?
|
|
35
|
+
{
|
|
36
|
+
kind: 'markdown',
|
|
37
|
+
value: text
|
|
38
|
+
}
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# @param pins [Array<Pin::Base>]
|
|
42
|
+
# @return [String]
|
|
43
|
+
def join_docs pins
|
|
44
|
+
result = []
|
|
45
|
+
last_link = nil
|
|
46
|
+
pins.each_with_index do |pin|
|
|
47
|
+
this_link = host.options['enablePages'] ? pin.link_documentation : pin.text_documentation
|
|
48
|
+
if this_link && this_link != last_link && this_link != 'undefined'
|
|
49
|
+
result.push this_link
|
|
50
|
+
end
|
|
51
|
+
result.push pin.documentation unless result.last && result.last.end_with?(pin.documentation)
|
|
52
|
+
last_link = this_link
|
|
53
|
+
end
|
|
54
|
+
result.join("\n\n")
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
@@ -1,12 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
# @todo PR the RBS gem to add this
|
|
5
|
-
# @!parse
|
|
6
|
-
# module ::Gem
|
|
7
|
-
# class SpecFetcher; end
|
|
8
|
-
# end
|
|
9
|
-
|
|
10
4
|
module Solargraph
|
|
11
5
|
module LanguageServer
|
|
12
6
|
module Message
|
|
@@ -64,6 +58,7 @@ module Solargraph
|
|
|
64
58
|
end
|
|
65
59
|
elsif fetched?
|
|
66
60
|
Solargraph::Logging.logger.warn error
|
|
61
|
+
# @sg-ignore Need to add nil check here
|
|
67
62
|
host.show_message(error, MessageTypes::ERROR) if params['verbose']
|
|
68
63
|
end
|
|
69
64
|
set_result({
|
|
@@ -78,12 +73,12 @@ module Solargraph
|
|
|
78
73
|
attr_reader :current
|
|
79
74
|
|
|
80
75
|
# @return [Gem::Version]
|
|
76
|
+
# @sg-ignore Need to add nil check here
|
|
81
77
|
def available
|
|
82
78
|
if !@available && !@fetched
|
|
83
79
|
@fetched = true
|
|
84
80
|
begin
|
|
85
81
|
@available ||= begin
|
|
86
|
-
# @sg-ignore Variable type could not be inferred for tuple
|
|
87
82
|
# @type [Gem::Dependency, nil]
|
|
88
83
|
tuple = CheckGemVersion.fetcher.search_for_dependency(Gem::Dependency.new('solargraph')).flatten.first
|
|
89
84
|
if tuple.nil?
|