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.
Files changed (201) hide show
  1. checksums.yaml +4 -4
  2. data/.envrc +3 -0
  3. data/.github/workflows/linting.yml +4 -5
  4. data/.github/workflows/plugins.yml +41 -38
  5. data/.github/workflows/rspec.yml +45 -13
  6. data/.github/workflows/typecheck.yml +2 -2
  7. data/.gitignore +0 -1
  8. data/.rubocop_todo.yml +27 -49
  9. data/CHANGELOG.md +1 -10
  10. data/README.md +3 -3
  11. data/Rakefile +1 -0
  12. data/lib/solargraph/api_map/cache.rb +3 -3
  13. data/lib/solargraph/api_map/constants.rb +13 -3
  14. data/lib/solargraph/api_map/index.rb +22 -11
  15. data/lib/solargraph/api_map/source_to_yard.rb +13 -1
  16. data/lib/solargraph/api_map/store.rb +11 -8
  17. data/lib/solargraph/api_map.rb +105 -50
  18. data/lib/solargraph/bench.rb +45 -45
  19. data/lib/solargraph/complex_type/conformance.rb +176 -0
  20. data/lib/solargraph/complex_type/type_methods.rb +16 -2
  21. data/lib/solargraph/complex_type/unique_type.rb +170 -20
  22. data/lib/solargraph/complex_type.rb +119 -14
  23. data/lib/solargraph/convention/data_definition/data_assignment_node.rb +61 -61
  24. data/lib/solargraph/convention/data_definition/data_definition_node.rb +3 -1
  25. data/lib/solargraph/convention/data_definition.rb +4 -1
  26. data/lib/solargraph/convention/gemfile.rb +15 -15
  27. data/lib/solargraph/convention/gemspec.rb +23 -23
  28. data/lib/solargraph/convention/rakefile.rb +17 -17
  29. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +1 -0
  30. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +1 -0
  31. data/lib/solargraph/convention/struct_definition.rb +5 -1
  32. data/lib/solargraph/convention.rb +78 -78
  33. data/lib/solargraph/converters/dd.rb +17 -17
  34. data/lib/solargraph/converters/dl.rb +15 -15
  35. data/lib/solargraph/converters/dt.rb +15 -15
  36. data/lib/solargraph/converters/misc.rb +1 -1
  37. data/lib/solargraph/diagnostics/require_not_found.rb +1 -0
  38. data/lib/solargraph/diagnostics/rubocop.rb +1 -0
  39. data/lib/solargraph/diagnostics/rubocop_helpers.rb +2 -0
  40. data/lib/solargraph/diagnostics/type_check.rb +1 -0
  41. data/lib/solargraph/diagnostics/update_errors.rb +41 -41
  42. data/lib/solargraph/doc_map.rb +134 -373
  43. data/lib/solargraph/equality.rb +1 -1
  44. data/lib/solargraph/gem_pins.rb +14 -15
  45. data/lib/solargraph/language_server/error_codes.rb +20 -20
  46. data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
  47. data/lib/solargraph/language_server/host/dispatch.rb +1 -0
  48. data/lib/solargraph/language_server/host/message_worker.rb +2 -1
  49. data/lib/solargraph/language_server/host/sources.rb +1 -0
  50. data/lib/solargraph/language_server/host.rb +6 -1
  51. data/lib/solargraph/language_server/message/base.rb +97 -97
  52. data/lib/solargraph/language_server/message/client/register_capability.rb +15 -15
  53. data/lib/solargraph/language_server/message/completion_item/resolve.rb +60 -60
  54. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +2 -7
  55. data/lib/solargraph/language_server/message/extended/document.rb +1 -0
  56. data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -32
  57. data/lib/solargraph/language_server/message/extended/download_core.rb +19 -19
  58. data/lib/solargraph/language_server/message/extended/search.rb +20 -20
  59. data/lib/solargraph/language_server/message/initialize.rb +191 -191
  60. data/lib/solargraph/language_server/message/text_document/completion.rb +2 -0
  61. data/lib/solargraph/language_server/message/text_document/definition.rb +2 -0
  62. data/lib/solargraph/language_server/message/text_document/document_highlight.rb +16 -16
  63. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +2 -0
  64. data/lib/solargraph/language_server/message/text_document/formatting.rb +2 -0
  65. data/lib/solargraph/language_server/message/text_document/hover.rb +2 -0
  66. data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +11 -11
  67. data/lib/solargraph/language_server/message/text_document/references.rb +16 -16
  68. data/lib/solargraph/language_server/message/text_document/rename.rb +19 -19
  69. data/lib/solargraph/language_server/message/text_document/signature_help.rb +1 -0
  70. data/lib/solargraph/language_server/message/text_document/type_definition.rb +2 -0
  71. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +35 -35
  72. data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +40 -40
  73. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +26 -26
  74. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +2 -0
  75. data/lib/solargraph/language_server/message.rb +94 -94
  76. data/lib/solargraph/language_server/request.rb +27 -27
  77. data/lib/solargraph/language_server/transport/data_reader.rb +74 -74
  78. data/lib/solargraph/language_server/uri_helpers.rb +49 -49
  79. data/lib/solargraph/library.rb +59 -13
  80. data/lib/solargraph/location.rb +9 -4
  81. data/lib/solargraph/logging.rb +21 -1
  82. data/lib/solargraph/page.rb +92 -92
  83. data/lib/solargraph/parser/comment_ripper.rb +7 -0
  84. data/lib/solargraph/parser/flow_sensitive_typing.rb +330 -102
  85. data/lib/solargraph/parser/node_processor/base.rb +32 -2
  86. data/lib/solargraph/parser/node_processor.rb +7 -6
  87. data/lib/solargraph/parser/parser_gem/class_methods.rb +28 -10
  88. data/lib/solargraph/parser/parser_gem/flawed_builder.rb +19 -19
  89. data/lib/solargraph/parser/parser_gem/node_chainer.rb +31 -6
  90. data/lib/solargraph/parser/parser_gem/node_methods.rb +27 -7
  91. data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +4 -4
  92. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +2 -0
  93. data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +9 -0
  94. data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +11 -11
  95. data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +7 -0
  96. data/lib/solargraph/parser/parser_gem/node_processors/defs_node.rb +37 -37
  97. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +36 -6
  98. data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +3 -2
  99. data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +1 -0
  100. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +3 -1
  101. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +2 -2
  102. data/lib/solargraph/parser/parser_gem/node_processors/or_node.rb +22 -0
  103. data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +1 -1
  104. data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +2 -1
  105. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +1 -0
  106. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +12 -7
  107. data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +29 -29
  108. data/lib/solargraph/parser/parser_gem/node_processors/when_node.rb +23 -0
  109. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +5 -1
  110. data/lib/solargraph/parser/parser_gem/node_processors.rb +4 -0
  111. data/lib/solargraph/parser/parser_gem.rb +12 -12
  112. data/lib/solargraph/parser/region.rb +9 -3
  113. data/lib/solargraph/parser/snippet.rb +1 -1
  114. data/lib/solargraph/parser.rb +23 -23
  115. data/lib/solargraph/pin/base.rb +53 -21
  116. data/lib/solargraph/pin/base_variable.rb +312 -20
  117. data/lib/solargraph/pin/block.rb +26 -4
  118. data/lib/solargraph/pin/breakable.rb +5 -1
  119. data/lib/solargraph/pin/callable.rb +50 -3
  120. data/lib/solargraph/pin/closure.rb +2 -6
  121. data/lib/solargraph/pin/common.rb +20 -5
  122. data/lib/solargraph/pin/compound_statement.rb +55 -0
  123. data/lib/solargraph/pin/constant.rb +45 -45
  124. data/lib/solargraph/pin/conversions.rb +2 -1
  125. data/lib/solargraph/pin/delegated_method.rb +15 -4
  126. data/lib/solargraph/pin/documenting.rb +1 -0
  127. data/lib/solargraph/pin/instance_variable.rb +5 -1
  128. data/lib/solargraph/pin/keyword.rb +0 -4
  129. data/lib/solargraph/pin/local_variable.rb +13 -57
  130. data/lib/solargraph/pin/method.rb +90 -42
  131. data/lib/solargraph/pin/method_alias.rb +8 -0
  132. data/lib/solargraph/pin/namespace.rb +7 -1
  133. data/lib/solargraph/pin/parameter.rb +76 -13
  134. data/lib/solargraph/pin/proxy_type.rb +2 -1
  135. data/lib/solargraph/pin/reference/override.rb +1 -1
  136. data/lib/solargraph/pin/reference/superclass.rb +2 -0
  137. data/lib/solargraph/pin/reference.rb +2 -0
  138. data/lib/solargraph/pin/search.rb +1 -0
  139. data/lib/solargraph/pin/signature.rb +8 -0
  140. data/lib/solargraph/pin/symbol.rb +1 -1
  141. data/lib/solargraph/pin/until.rb +1 -1
  142. data/lib/solargraph/pin/while.rb +1 -1
  143. data/lib/solargraph/pin.rb +2 -0
  144. data/lib/solargraph/pin_cache.rb +477 -57
  145. data/lib/solargraph/position.rb +12 -26
  146. data/lib/solargraph/range.rb +6 -6
  147. data/lib/solargraph/rbs_map/conversions.rb +33 -10
  148. data/lib/solargraph/rbs_map/core_fills.rb +84 -84
  149. data/lib/solargraph/rbs_map/core_map.rb +24 -17
  150. data/lib/solargraph/rbs_map/stdlib_map.rb +34 -5
  151. data/lib/solargraph/rbs_map.rb +74 -20
  152. data/lib/solargraph/server_methods.rb +16 -16
  153. data/lib/solargraph/shell.rb +73 -39
  154. data/lib/solargraph/source/chain/array.rb +37 -37
  155. data/lib/solargraph/source/chain/call.rb +52 -17
  156. data/lib/solargraph/source/chain/class_variable.rb +13 -13
  157. data/lib/solargraph/source/chain/constant.rb +2 -0
  158. data/lib/solargraph/source/chain/global_variable.rb +13 -13
  159. data/lib/solargraph/source/chain/hash.rb +1 -0
  160. data/lib/solargraph/source/chain/if.rb +1 -0
  161. data/lib/solargraph/source/chain/instance_variable.rb +22 -1
  162. data/lib/solargraph/source/chain/link.rb +109 -109
  163. data/lib/solargraph/source/chain/literal.rb +5 -0
  164. data/lib/solargraph/source/chain/or.rb +9 -1
  165. data/lib/solargraph/source/chain/q_call.rb +11 -11
  166. data/lib/solargraph/source/chain/variable.rb +13 -13
  167. data/lib/solargraph/source/chain/z_super.rb +30 -30
  168. data/lib/solargraph/source/chain.rb +25 -22
  169. data/lib/solargraph/source/change.rb +9 -2
  170. data/lib/solargraph/source/cursor.rb +7 -1
  171. data/lib/solargraph/source/source_chainer.rb +13 -3
  172. data/lib/solargraph/source/updater.rb +4 -0
  173. data/lib/solargraph/source.rb +33 -7
  174. data/lib/solargraph/source_map/clip.rb +13 -2
  175. data/lib/solargraph/source_map/data.rb +4 -1
  176. data/lib/solargraph/source_map/mapper.rb +24 -1
  177. data/lib/solargraph/source_map.rb +14 -6
  178. data/lib/solargraph/type_checker/problem.rb +3 -1
  179. data/lib/solargraph/type_checker/rules.rb +75 -2
  180. data/lib/solargraph/type_checker.rb +111 -30
  181. data/lib/solargraph/version.rb +1 -1
  182. data/lib/solargraph/workspace/config.rb +3 -1
  183. data/lib/solargraph/workspace/gemspecs.rb +367 -0
  184. data/lib/solargraph/workspace/require_paths.rb +1 -0
  185. data/lib/solargraph/workspace.rb +158 -16
  186. data/lib/solargraph/yard_map/helpers.rb +2 -1
  187. data/lib/solargraph/yard_map/mapper/to_method.rb +5 -1
  188. data/lib/solargraph/yard_map/mapper/to_namespace.rb +1 -0
  189. data/lib/solargraph/yard_map/mapper.rb +5 -0
  190. data/lib/solargraph/yard_tags.rb +20 -20
  191. data/lib/solargraph/yardoc.rb +33 -23
  192. data/lib/solargraph.rb +24 -3
  193. data/rbs/fills/rubygems/0/dependency.rbs +193 -0
  194. data/rbs/fills/tuple/tuple.rbs +28 -0
  195. data/rbs/shims/ast/0/node.rbs +1 -1
  196. data/rbs/shims/diff-lcs/1.5/diff-lcs.rbs +11 -0
  197. data/solargraph.gemspec +2 -1
  198. metadata +12 -7
  199. data/lib/solargraph/type_checker/checks.rb +0 -124
  200. data/lib/solargraph/type_checker/param_def.rb +0 -37
  201. 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?
@@ -14,6 +14,7 @@ module Solargraph
14
14
  )
15
15
  rescue StandardError => e
16
16
  Solargraph.logger.warn "Error processing document: [#{e.class}] #{e.message}"
17
+ # @sg-ignore Need to add nil check here
17
18
  Solargraph.logger.debug e.backtrace.join("\n")
18
19
  end
19
20
  end