solargraph 0.32.1 → 0.32.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (177) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +9 -0
  3. data/.rspec +2 -0
  4. data/.rubocop.yml +6 -0
  5. data/.travis.yml +25 -0
  6. data/EXAMPLES.md +76 -0
  7. data/Gemfile +3 -0
  8. data/LANGUAGE_SERVER.md +51 -0
  9. data/LICENSE +21 -0
  10. data/OVERVIEW.md +37 -0
  11. data/README.md +106 -0
  12. data/Rakefile +14 -0
  13. data/SERVER.md +95 -0
  14. data/bin/solargraph +0 -0
  15. data/bin/solargraph-runtime +5 -5
  16. data/lib/solargraph.rb +54 -54
  17. data/lib/solargraph/api_map.rb +659 -659
  18. data/lib/solargraph/api_map/cache.rb +49 -49
  19. data/lib/solargraph/api_map/source_to_yard.rb +67 -67
  20. data/lib/solargraph/api_map/store.rb +201 -201
  21. data/lib/solargraph/bundle.rb +24 -24
  22. data/lib/solargraph/complex_type.rb +150 -150
  23. data/lib/solargraph/complex_type/type_methods.rb +124 -124
  24. data/lib/solargraph/complex_type/unique_type.rb +44 -44
  25. data/lib/solargraph/core_fills.rb +37 -37
  26. data/lib/solargraph/diagnostics.rb +52 -52
  27. data/lib/solargraph/diagnostics/base.rb +20 -20
  28. data/lib/solargraph/diagnostics/require_not_found.rb +28 -28
  29. data/lib/solargraph/diagnostics/rubocop.rb +98 -98
  30. data/lib/solargraph/diagnostics/rubocop_helpers.rb +46 -46
  31. data/lib/solargraph/diagnostics/type_not_defined.rb +108 -108
  32. data/lib/solargraph/diagnostics/update_errors.rb +38 -38
  33. data/lib/solargraph/language_server/completion_item_kinds.rb +33 -33
  34. data/lib/solargraph/language_server/error_codes.rb +18 -18
  35. data/lib/solargraph/language_server/host.rb +684 -681
  36. data/lib/solargraph/language_server/host/cataloger.rb +54 -79
  37. data/lib/solargraph/language_server/host/diagnoser.rb +80 -80
  38. data/lib/solargraph/language_server/host/dispatch.rb +112 -113
  39. data/lib/solargraph/language_server/host/sources.rb +138 -138
  40. data/lib/solargraph/language_server/message.rb +90 -90
  41. data/lib/solargraph/language_server/message/base.rb +83 -83
  42. data/lib/solargraph/language_server/message/completion_item/resolve.rb +40 -40
  43. data/lib/solargraph/language_server/message/exit_notification.rb +11 -11
  44. data/lib/solargraph/language_server/message/extended.rb +19 -19
  45. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +86 -86
  46. data/lib/solargraph/language_server/message/extended/document.rb +18 -18
  47. data/lib/solargraph/language_server/message/extended/document_gems.rb +30 -30
  48. data/lib/solargraph/language_server/message/extended/environment.rb +20 -20
  49. data/lib/solargraph/language_server/message/extended/search.rb +18 -18
  50. data/lib/solargraph/language_server/message/initialize.rb +141 -141
  51. data/lib/solargraph/language_server/message/initialized.rb +23 -23
  52. data/lib/solargraph/language_server/message/shutdown.rb +11 -11
  53. data/lib/solargraph/language_server/message/text_document.rb +25 -25
  54. data/lib/solargraph/language_server/message/text_document/completion.rb +51 -51
  55. data/lib/solargraph/language_server/message/text_document/definition.rb +18 -18
  56. data/lib/solargraph/language_server/message/text_document/did_change.rb +13 -13
  57. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +21 -21
  58. data/lib/solargraph/language_server/message/text_document/folding_range.rb +24 -24
  59. data/lib/solargraph/language_server/message/text_document/formatting.rb +50 -50
  60. data/lib/solargraph/language_server/message/text_document/hover.rb +31 -31
  61. data/lib/solargraph/language_server/message/text_document/on_type_formatting.rb +32 -32
  62. data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +9 -9
  63. data/lib/solargraph/language_server/message/text_document/references.rb +14 -14
  64. data/lib/solargraph/language_server/message/text_document/rename.rb +17 -17
  65. data/lib/solargraph/language_server/message/text_document/signature_help.rb +19 -19
  66. data/lib/solargraph/language_server/message/workspace.rb +12 -12
  67. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +29 -29
  68. data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +29 -27
  69. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +24 -24
  70. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +21 -21
  71. data/lib/solargraph/language_server/request.rb +22 -22
  72. data/lib/solargraph/language_server/symbol_kinds.rb +34 -34
  73. data/lib/solargraph/language_server/transport.rb +11 -11
  74. data/lib/solargraph/language_server/transport/adapter.rb +60 -60
  75. data/lib/solargraph/language_server/transport/data_reader.rb +66 -66
  76. data/lib/solargraph/language_server/uri_helpers.rb +25 -25
  77. data/lib/solargraph/library.rb +421 -419
  78. data/lib/solargraph/live_map.rb +126 -126
  79. data/lib/solargraph/live_map/cache.rb +38 -38
  80. data/lib/solargraph/location.rb +31 -31
  81. data/lib/solargraph/logging.rb +25 -25
  82. data/lib/solargraph/page.rb +68 -68
  83. data/lib/solargraph/pin.rb +50 -50
  84. data/lib/solargraph/pin/attribute.rb +41 -41
  85. data/lib/solargraph/pin/base.rb +280 -280
  86. data/lib/solargraph/pin/base_method.rb +76 -76
  87. data/lib/solargraph/pin/base_variable.rb +72 -72
  88. data/lib/solargraph/pin/block.rb +32 -32
  89. data/lib/solargraph/pin/block_parameter.rb +103 -103
  90. data/lib/solargraph/pin/class_variable.rb +9 -9
  91. data/lib/solargraph/pin/constant.rb +30 -30
  92. data/lib/solargraph/pin/conversions.rb +79 -79
  93. data/lib/solargraph/pin/documenting.rb +41 -41
  94. data/lib/solargraph/pin/duck_method.rb +14 -14
  95. data/lib/solargraph/pin/global_variable.rb +9 -9
  96. data/lib/solargraph/pin/instance_variable.rb +9 -9
  97. data/lib/solargraph/pin/keyword.rb +17 -17
  98. data/lib/solargraph/pin/local_variable.rb +23 -23
  99. data/lib/solargraph/pin/localized.rb +22 -22
  100. data/lib/solargraph/pin/method.rb +126 -126
  101. data/lib/solargraph/pin/method_alias.rb +30 -30
  102. data/lib/solargraph/pin/method_parameter.rb +40 -40
  103. data/lib/solargraph/pin/namespace.rb +54 -54
  104. data/lib/solargraph/pin/plugin/method.rb +25 -25
  105. data/lib/solargraph/pin/proxy_type.rb +35 -35
  106. data/lib/solargraph/pin/reference.rb +22 -22
  107. data/lib/solargraph/pin/reference/extend.rb +11 -11
  108. data/lib/solargraph/pin/reference/include.rb +11 -11
  109. data/lib/solargraph/pin/reference/require.rb +15 -15
  110. data/lib/solargraph/pin/reference/superclass.rb +11 -11
  111. data/lib/solargraph/pin/symbol.rb +44 -44
  112. data/lib/solargraph/pin/yard_pin.rb +10 -10
  113. data/lib/solargraph/pin/yard_pin/constant.rb +14 -14
  114. data/lib/solargraph/pin/yard_pin/method.rb +35 -35
  115. data/lib/solargraph/pin/yard_pin/namespace.rb +19 -19
  116. data/lib/solargraph/pin/yard_pin/yard_mixin.rb +14 -14
  117. data/lib/solargraph/plugin.rb +8 -8
  118. data/lib/solargraph/plugin/base.rb +41 -41
  119. data/lib/solargraph/plugin/canceler.rb +11 -11
  120. data/lib/solargraph/plugin/process.rb +172 -172
  121. data/lib/solargraph/plugin/runtime.rb +134 -134
  122. data/lib/solargraph/position.rb +110 -110
  123. data/lib/solargraph/range.rb +83 -83
  124. data/lib/solargraph/server_methods.rb +14 -14
  125. data/lib/solargraph/shell.rb +102 -102
  126. data/lib/solargraph/source.rb +521 -521
  127. data/lib/solargraph/source/chain.rb +120 -120
  128. data/lib/solargraph/source/chain/call.rb +107 -107
  129. data/lib/solargraph/source/chain/class_variable.rb +11 -11
  130. data/lib/solargraph/source/chain/constant.rb +30 -30
  131. data/lib/solargraph/source/chain/global_variable.rb +11 -11
  132. data/lib/solargraph/source/chain/head.rb +33 -33
  133. data/lib/solargraph/source/chain/instance_variable.rb +11 -11
  134. data/lib/solargraph/source/chain/link.rb +33 -33
  135. data/lib/solargraph/source/chain/literal.rb +21 -21
  136. data/lib/solargraph/source/chain/variable.rb +11 -11
  137. data/lib/solargraph/source/change.rb +77 -77
  138. data/lib/solargraph/source/cursor.rb +157 -157
  139. data/lib/solargraph/source/node_chainer.rb +96 -96
  140. data/lib/solargraph/source/node_methods.rb +225 -225
  141. data/lib/solargraph/source/source_chainer.rb +183 -183
  142. data/lib/solargraph/source_map.rb +169 -169
  143. data/lib/solargraph/source_map/clip.rb +145 -145
  144. data/lib/solargraph/source_map/completion.rb +21 -21
  145. data/lib/solargraph/source_map/mapper.rb +149 -149
  146. data/lib/solargraph/source_map/node_processor.rb +78 -78
  147. data/lib/solargraph/source_map/node_processor/alias_node.rb +19 -19
  148. data/lib/solargraph/source_map/node_processor/args_node.rb +28 -28
  149. data/lib/solargraph/source_map/node_processor/base.rb +68 -68
  150. data/lib/solargraph/source_map/node_processor/begin_node.rb +11 -11
  151. data/lib/solargraph/source_map/node_processor/block_node.rb +14 -14
  152. data/lib/solargraph/source_map/node_processor/casgn_node.rb +14 -14
  153. data/lib/solargraph/source_map/node_processor/cvasgn_node.rb +14 -14
  154. data/lib/solargraph/source_map/node_processor/def_node.rb +54 -54
  155. data/lib/solargraph/source_map/node_processor/defs_node.rb +21 -21
  156. data/lib/solargraph/source_map/node_processor/gvasgn_node.rb +12 -12
  157. data/lib/solargraph/source_map/node_processor/ivasgn_node.rb +18 -18
  158. data/lib/solargraph/source_map/node_processor/lvasgn_node.rb +16 -16
  159. data/lib/solargraph/source_map/node_processor/namespace_node.rb +26 -26
  160. data/lib/solargraph/source_map/node_processor/orasgn_node.rb +12 -12
  161. data/lib/solargraph/source_map/node_processor/sclass_node.rb +11 -11
  162. data/lib/solargraph/source_map/node_processor/send_node.rb +162 -162
  163. data/lib/solargraph/source_map/node_processor/sym_node.rb +11 -11
  164. data/lib/solargraph/source_map/region.rb +58 -58
  165. data/lib/solargraph/version.rb +3 -3
  166. data/lib/solargraph/views/environment.erb +53 -53
  167. data/lib/solargraph/workspace.rb +183 -183
  168. data/lib/solargraph/workspace/config.rb +170 -170
  169. data/lib/solargraph/yard_map.rb +298 -298
  170. data/lib/solargraph/yard_map/cache.rb +17 -17
  171. data/lib/solargraph/yard_map/core_docs.rb +163 -163
  172. data/lib/solargraph/yard_map/core_gen.rb +76 -76
  173. data/lib/yard-coregen.rb +16 -16
  174. data/lib/yard-solargraph.rb +18 -18
  175. data/solargraph.gemspec +37 -0
  176. data/travis-bundler.rb +10 -0
  177. metadata +19 -6
@@ -1,83 +1,83 @@
1
- module Solargraph
2
- module LanguageServer
3
- module Message
4
- class Base
5
- # @return [Solargraph::LanguageServer::Host]
6
- attr_reader :host
7
-
8
- # @return [Integer]
9
- attr_reader :id
10
-
11
- # @return [Hash]
12
- attr_reader :request
13
-
14
- # @return [String]
15
- attr_reader :method
16
-
17
- # @return [Hash]
18
- attr_reader :params
19
-
20
- # @return [Hash, Array, nil]
21
- attr_reader :result
22
-
23
- # @return [Hash, nil]
24
- attr_reader :error
25
-
26
- # @param host [Solargraph::LanguageServer::Host]
27
- # @param request [Hash]
28
- def initialize host, request
29
- @host = host
30
- @id = request['id'].freeze
31
- @request = request.freeze
32
- @method = request['method'].freeze
33
- @params = (request['params'] || {}).freeze
34
- post_initialize
35
- end
36
-
37
- # @return [void]
38
- def post_initialize; end
39
-
40
- # @return [void]
41
- def process; end
42
-
43
- # @param data [Hash, Array, nil]
44
- # @return [void]
45
- def set_result data
46
- @result = data
47
- end
48
-
49
- # @param code [Integer] See Solargraph::LanguageServer::ErrorCodes
50
- # @param message [String]
51
- # @return [void]
52
- def set_error code, message
53
- @error = {
54
- code: code,
55
- message: message
56
- }
57
- end
58
-
59
- # @return [void]
60
- def send_response
61
- return if id.nil?
62
- if host.cancel?(id)
63
- Solargraph::Logging.logger.info "Cancelled response to #{method}"
64
- return
65
- end
66
- Solargraph::Logging.logger.info "Sending response to #{method}"
67
- response = {
68
- jsonrpc: "2.0",
69
- id: id,
70
- }
71
- response[:result] = result unless result.nil?
72
- response[:error] = error unless error.nil?
73
- response[:result] = nil if result.nil? and error.nil?
74
- json = response.to_json
75
- envelope = "Content-Length: #{json.bytesize}\r\n\r\n#{json}"
76
- Solargraph.logger.debug envelope
77
- host.queue envelope
78
- host.clear id
79
- end
80
- end
81
- end
82
- end
83
- end
1
+ module Solargraph
2
+ module LanguageServer
3
+ module Message
4
+ class Base
5
+ # @return [Solargraph::LanguageServer::Host]
6
+ attr_reader :host
7
+
8
+ # @return [Integer]
9
+ attr_reader :id
10
+
11
+ # @return [Hash]
12
+ attr_reader :request
13
+
14
+ # @return [String]
15
+ attr_reader :method
16
+
17
+ # @return [Hash]
18
+ attr_reader :params
19
+
20
+ # @return [Hash, Array, nil]
21
+ attr_reader :result
22
+
23
+ # @return [Hash, nil]
24
+ attr_reader :error
25
+
26
+ # @param host [Solargraph::LanguageServer::Host]
27
+ # @param request [Hash]
28
+ def initialize host, request
29
+ @host = host
30
+ @id = request['id'].freeze
31
+ @request = request.freeze
32
+ @method = request['method'].freeze
33
+ @params = (request['params'] || {}).freeze
34
+ post_initialize
35
+ end
36
+
37
+ # @return [void]
38
+ def post_initialize; end
39
+
40
+ # @return [void]
41
+ def process; end
42
+
43
+ # @param data [Hash, Array, nil]
44
+ # @return [void]
45
+ def set_result data
46
+ @result = data
47
+ end
48
+
49
+ # @param code [Integer] See Solargraph::LanguageServer::ErrorCodes
50
+ # @param message [String]
51
+ # @return [void]
52
+ def set_error code, message
53
+ @error = {
54
+ code: code,
55
+ message: message
56
+ }
57
+ end
58
+
59
+ # @return [void]
60
+ def send_response
61
+ return if id.nil?
62
+ if host.cancel?(id)
63
+ Solargraph::Logging.logger.info "Cancelled response to #{method}"
64
+ return
65
+ end
66
+ Solargraph::Logging.logger.info "Sending response to #{method}"
67
+ response = {
68
+ jsonrpc: "2.0",
69
+ id: id,
70
+ }
71
+ response[:result] = result unless result.nil?
72
+ response[:error] = error unless error.nil?
73
+ response[:result] = nil if result.nil? and error.nil?
74
+ json = response.to_json
75
+ envelope = "Content-Length: #{json.bytesize}\r\n\r\n#{json}"
76
+ Solargraph.logger.debug envelope
77
+ host.queue envelope
78
+ host.clear id
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end
@@ -1,40 +1,40 @@
1
- module Solargraph
2
- module LanguageServer
3
- module Message
4
- module CompletionItem
5
- # completionItem/resolve message handler
6
- #
7
- class Resolve < Base
8
- def process
9
- pins = host.locate_pins(params)
10
- set_result merge(pins)
11
- end
12
-
13
- private
14
-
15
- # @param pins [Array<Pin::Base>]
16
- # @return [Hash]
17
- def merge pins
18
- return params if pins.empty?
19
- docs = pins
20
- .reject { |pin| pin.documentation.empty? }
21
- .map { |pin| pin.resolve_completion_item[:documentation] }
22
- params
23
- .merge(pins.first.resolve_completion_item)
24
- .merge(documentation: markup_content(docs.join("\n\n")))
25
- end
26
-
27
- # @param text [String]
28
- # @return [Hash{Symbol => String}]
29
- def markup_content text
30
- return nil if text.strip.empty?
31
- {
32
- kind: 'markdown',
33
- value: text
34
- }
35
- end
36
- end
37
- end
38
- end
39
- end
40
- end
1
+ module Solargraph
2
+ module LanguageServer
3
+ module Message
4
+ module CompletionItem
5
+ # completionItem/resolve message handler
6
+ #
7
+ class Resolve < Base
8
+ def process
9
+ pins = host.locate_pins(params)
10
+ set_result merge(pins)
11
+ end
12
+
13
+ private
14
+
15
+ # @param pins [Array<Pin::Base>]
16
+ # @return [Hash]
17
+ def merge pins
18
+ return params if pins.empty?
19
+ docs = pins
20
+ .reject { |pin| pin.documentation.empty? }
21
+ .map { |pin| pin.resolve_completion_item[:documentation] }
22
+ params
23
+ .merge(pins.first.resolve_completion_item)
24
+ .merge(documentation: markup_content(docs.join("\n\n")))
25
+ end
26
+
27
+ # @param text [String]
28
+ # @return [Hash{Symbol => String}]
29
+ def markup_content text
30
+ return nil if text.strip.empty?
31
+ {
32
+ kind: 'markdown',
33
+ value: text
34
+ }
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -1,11 +1,11 @@
1
- module Solargraph
2
- module LanguageServer
3
- module Message
4
- class ExitNotification < Base
5
- def process
6
- host.stop
7
- end
8
- end
9
- end
10
- end
11
- end
1
+ module Solargraph
2
+ module LanguageServer
3
+ module Message
4
+ class ExitNotification < Base
5
+ def process
6
+ host.stop
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -1,19 +1,19 @@
1
- module Solargraph
2
- module LanguageServer
3
- module Message
4
- # Messages in the Extended module are custom to the Solargraph
5
- # implementation of the language server. In the protocol, the method
6
- # names should start with "$/" so clients that don't recognize them can
7
- # ignore them, as per the LSP specification.
8
- #
9
- module Extended
10
- autoload :Document, 'solargraph/language_server/message/extended/document'
11
- autoload :Search, 'solargraph/language_server/message/extended/search'
12
- autoload :CheckGemVersion, 'solargraph/language_server/message/extended/check_gem_version'
13
- autoload :DocumentGems, 'solargraph/language_server/message/extended/document_gems'
14
- autoload :DownloadCore, 'solargraph/language_server/message/extended/download_core'
15
- autoload :Environment, 'solargraph/language_server/message/extended/environment'
16
- end
17
- end
18
- end
19
- end
1
+ module Solargraph
2
+ module LanguageServer
3
+ module Message
4
+ # Messages in the Extended module are custom to the Solargraph
5
+ # implementation of the language server. In the protocol, the method
6
+ # names should start with "$/" so clients that don't recognize them can
7
+ # ignore them, as per the LSP specification.
8
+ #
9
+ module Extended
10
+ autoload :Document, 'solargraph/language_server/message/extended/document'
11
+ autoload :Search, 'solargraph/language_server/message/extended/search'
12
+ autoload :CheckGemVersion, 'solargraph/language_server/message/extended/check_gem_version'
13
+ autoload :DocumentGems, 'solargraph/language_server/message/extended/document_gems'
14
+ autoload :DownloadCore, 'solargraph/language_server/message/extended/download_core'
15
+ autoload :Environment, 'solargraph/language_server/message/extended/environment'
16
+ end
17
+ end
18
+ end
19
+ end
@@ -1,86 +1,86 @@
1
- require 'rubygems'
2
-
3
- module Solargraph
4
- module LanguageServer
5
- module Message
6
- module Extended
7
- # Check if a more recent version of the Solargraph gem is available.
8
- # Notify the client when an update exists. If the `verbose` parameter
9
- # is true, notify the client when the gem is up to date.
10
- #
11
- class CheckGemVersion < Base
12
- GEM_ZERO = Gem::Version.new('0.0.0')
13
-
14
- def initialize host, request, current: Gem::Version.new(Solargraph::VERSION), available: nil
15
- super(host, request)
16
- @current = current
17
- @available = available
18
- end
19
-
20
- def process
21
- if available > GEM_ZERO
22
- if available > current
23
- host.show_message_request "Solargraph gem version #{available} is available. (Current version: #{current})",
24
- LanguageServer::MessageTypes::INFO,
25
- ['Update now'] do |result|
26
- next unless result == 'Update now'
27
- o, s = Open3.capture2("gem update solargraph")
28
- if s == 0
29
- host.show_message 'Successfully updated the Solargraph gem.', LanguageServer::MessageTypes::INFO
30
- host.send_notification '$/solargraph/restart', {}
31
- else
32
- host.show_message 'An error occurred while updating the gem.', LanguageServer::MessageTypes::ERROR
33
- end
34
- end
35
- elsif params['verbose']
36
- host.show_message "The Solargraph gem is up to date (version #{Solargraph::VERSION})."
37
- end
38
- elsif fetched?
39
- Solargraph::Logging.logger.warn error
40
- host.show_message(error, MessageTypes::ERROR) if params['verbose']
41
- end
42
- set_result({
43
- installed: current,
44
- available: available
45
- })
46
- end
47
-
48
- private
49
-
50
- # @return [Gem::Version]
51
- attr_reader :current
52
-
53
- # @return [Gem::Version]
54
- def available
55
- if !@available && !@fetched
56
- @fetched = true
57
- begin
58
- @available ||= begin
59
- fetcher = Gem::SpecFetcher.new
60
- tuple = fetcher.search_for_dependency(Gem::Dependency.new('solargraph')).flatten.first
61
- if tuple.nil?
62
- @error = 'An error occurred fetching the gem data'
63
- GEM_ZERO
64
- else
65
- tuple.version
66
- end
67
- end
68
- rescue Errno::EADDRNOTAVAIL => e
69
- @error = "Unable to connect to gem source: #{e.message}"
70
- GEM_ZERO
71
- end
72
- end
73
- @available
74
- end
75
-
76
- def fetched?
77
- @fetched ||= false
78
- end
79
-
80
- # @return [String, nil]
81
- attr_reader :error
82
- end
83
- end
84
- end
85
- end
86
- end
1
+ require 'rubygems'
2
+
3
+ module Solargraph
4
+ module LanguageServer
5
+ module Message
6
+ module Extended
7
+ # Check if a more recent version of the Solargraph gem is available.
8
+ # Notify the client when an update exists. If the `verbose` parameter
9
+ # is true, notify the client when the gem is up to date.
10
+ #
11
+ class CheckGemVersion < Base
12
+ GEM_ZERO = Gem::Version.new('0.0.0')
13
+
14
+ def initialize host, request, current: Gem::Version.new(Solargraph::VERSION), available: nil
15
+ super(host, request)
16
+ @current = current
17
+ @available = available
18
+ end
19
+
20
+ def process
21
+ if available > GEM_ZERO
22
+ if available > current
23
+ host.show_message_request "Solargraph gem version #{available} is available. (Current version: #{current})",
24
+ LanguageServer::MessageTypes::INFO,
25
+ ['Update now'] do |result|
26
+ next unless result == 'Update now'
27
+ o, s = Open3.capture2("gem update solargraph")
28
+ if s == 0
29
+ host.show_message 'Successfully updated the Solargraph gem.', LanguageServer::MessageTypes::INFO
30
+ host.send_notification '$/solargraph/restart', {}
31
+ else
32
+ host.show_message 'An error occurred while updating the gem.', LanguageServer::MessageTypes::ERROR
33
+ end
34
+ end
35
+ elsif params['verbose']
36
+ host.show_message "The Solargraph gem is up to date (version #{Solargraph::VERSION})."
37
+ end
38
+ elsif fetched?
39
+ Solargraph::Logging.logger.warn error
40
+ host.show_message(error, MessageTypes::ERROR) if params['verbose']
41
+ end
42
+ set_result({
43
+ installed: current,
44
+ available: available
45
+ })
46
+ end
47
+
48
+ private
49
+
50
+ # @return [Gem::Version]
51
+ attr_reader :current
52
+
53
+ # @return [Gem::Version]
54
+ def available
55
+ if !@available && !@fetched
56
+ @fetched = true
57
+ begin
58
+ @available ||= begin
59
+ fetcher = Gem::SpecFetcher.new
60
+ tuple = fetcher.search_for_dependency(Gem::Dependency.new('solargraph')).flatten.first
61
+ if tuple.nil?
62
+ @error = 'An error occurred fetching the gem data'
63
+ GEM_ZERO
64
+ else
65
+ tuple.version
66
+ end
67
+ end
68
+ rescue Errno::EADDRNOTAVAIL => e
69
+ @error = "Unable to connect to gem source: #{e.message}"
70
+ GEM_ZERO
71
+ end
72
+ end
73
+ @available
74
+ end
75
+
76
+ def fetched?
77
+ @fetched ||= false
78
+ end
79
+
80
+ # @return [String, nil]
81
+ attr_reader :error
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end