solargraph 0.58.0 → 0.59.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.
Files changed (219) hide show
  1. checksums.yaml +4 -4
  2. data/.envrc +3 -0
  3. data/.gitattributes +2 -0
  4. data/.github/workflows/linting.yml +6 -5
  5. data/.github/workflows/plugins.yml +48 -35
  6. data/.github/workflows/rspec.yml +15 -28
  7. data/.github/workflows/typecheck.yml +3 -2
  8. data/.gitignore +1 -0
  9. data/.rubocop.yml +38 -6
  10. data/.rubocop_todo.yml +53 -966
  11. data/CHANGELOG.md +24 -0
  12. data/Gemfile +3 -1
  13. data/README.md +3 -3
  14. data/Rakefile +26 -23
  15. data/bin/solargraph +9 -8
  16. data/lib/solargraph/api_map/cache.rb +110 -110
  17. data/lib/solargraph/api_map/constants.rb +288 -279
  18. data/lib/solargraph/api_map/index.rb +204 -193
  19. data/lib/solargraph/api_map/source_to_yard.rb +110 -97
  20. data/lib/solargraph/api_map/store.rb +395 -384
  21. data/lib/solargraph/api_map.rb +1029 -945
  22. data/lib/solargraph/bench.rb +44 -45
  23. data/lib/solargraph/complex_type/conformance.rb +176 -0
  24. data/lib/solargraph/complex_type/type_methods.rb +240 -228
  25. data/lib/solargraph/complex_type/unique_type.rb +641 -482
  26. data/lib/solargraph/complex_type.rb +557 -444
  27. data/lib/solargraph/convention/data_definition/data_assignment_node.rb +61 -61
  28. data/lib/solargraph/convention/data_definition/data_definition_node.rb +93 -91
  29. data/lib/solargraph/convention/data_definition.rb +108 -105
  30. data/lib/solargraph/convention/gemfile.rb +15 -15
  31. data/lib/solargraph/convention/gemspec.rb +23 -23
  32. data/lib/solargraph/convention/rakefile.rb +17 -17
  33. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +62 -61
  34. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +103 -102
  35. data/lib/solargraph/convention/struct_definition.rb +168 -164
  36. data/lib/solargraph/convention.rb +78 -78
  37. data/lib/solargraph/converters/dd.rb +19 -17
  38. data/lib/solargraph/converters/dl.rb +17 -15
  39. data/lib/solargraph/converters/dt.rb +17 -15
  40. data/lib/solargraph/converters/misc.rb +3 -1
  41. data/lib/solargraph/diagnostics/require_not_found.rb +54 -53
  42. data/lib/solargraph/diagnostics/rubocop.rb +119 -118
  43. data/lib/solargraph/diagnostics/rubocop_helpers.rb +70 -68
  44. data/lib/solargraph/diagnostics/type_check.rb +56 -55
  45. data/lib/solargraph/diagnostics/update_errors.rb +37 -41
  46. data/lib/solargraph/doc_map.rb +438 -439
  47. data/lib/solargraph/equality.rb +34 -34
  48. data/lib/solargraph/gem_pins.rb +98 -98
  49. data/lib/solargraph/language_server/error_codes.rb +20 -20
  50. data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
  51. data/lib/solargraph/language_server/host/dispatch.rb +130 -130
  52. data/lib/solargraph/language_server/host/message_worker.rb +113 -112
  53. data/lib/solargraph/language_server/host/sources.rb +100 -99
  54. data/lib/solargraph/language_server/host.rb +886 -878
  55. data/lib/solargraph/language_server/message/base.rb +97 -97
  56. data/lib/solargraph/language_server/message/client/register_capability.rb +13 -15
  57. data/lib/solargraph/language_server/message/completion_item/resolve.rb +58 -60
  58. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +108 -114
  59. data/lib/solargraph/language_server/message/extended/document.rb +24 -23
  60. data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -32
  61. data/lib/solargraph/language_server/message/extended/download_core.rb +20 -19
  62. data/lib/solargraph/language_server/message/extended/search.rb +20 -20
  63. data/lib/solargraph/language_server/message/initialize.rb +197 -191
  64. data/lib/solargraph/language_server/message/text_document/completion.rb +58 -56
  65. data/lib/solargraph/language_server/message/text_document/definition.rb +49 -40
  66. data/lib/solargraph/language_server/message/text_document/document_highlight.rb +23 -16
  67. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +36 -26
  68. data/lib/solargraph/language_server/message/text_document/formatting.rb +150 -148
  69. data/lib/solargraph/language_server/message/text_document/hover.rb +58 -58
  70. data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +18 -11
  71. data/lib/solargraph/language_server/message/text_document/references.rb +23 -16
  72. data/lib/solargraph/language_server/message/text_document/rename.rb +26 -19
  73. data/lib/solargraph/language_server/message/text_document/signature_help.rb +25 -24
  74. data/lib/solargraph/language_server/message/text_document/type_definition.rb +33 -25
  75. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +41 -35
  76. data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +48 -40
  77. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +32 -26
  78. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +33 -23
  79. data/lib/solargraph/language_server/message.rb +94 -94
  80. data/lib/solargraph/language_server/request.rb +29 -27
  81. data/lib/solargraph/language_server/transport/data_reader.rb +72 -74
  82. data/lib/solargraph/language_server/uri_helpers.rb +49 -49
  83. data/lib/solargraph/library.rb +702 -683
  84. data/lib/solargraph/location.rb +85 -82
  85. data/lib/solargraph/logging.rb +55 -37
  86. data/lib/solargraph/page.rb +92 -92
  87. data/lib/solargraph/parser/comment_ripper.rb +84 -69
  88. data/lib/solargraph/parser/flow_sensitive_typing.rb +471 -255
  89. data/lib/solargraph/parser/node_processor/base.rb +122 -92
  90. data/lib/solargraph/parser/node_processor.rb +63 -62
  91. data/lib/solargraph/parser/parser_gem/class_methods.rb +165 -149
  92. data/lib/solargraph/parser/parser_gem/flawed_builder.rb +19 -19
  93. data/lib/solargraph/parser/parser_gem/node_chainer.rb +191 -166
  94. data/lib/solargraph/parser/parser_gem/node_methods.rb +507 -486
  95. data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +22 -22
  96. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +61 -59
  97. data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +24 -15
  98. data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +45 -46
  99. data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +60 -53
  100. data/lib/solargraph/parser/parser_gem/node_processors/defs_node.rb +38 -37
  101. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +53 -23
  102. data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +42 -40
  103. data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +30 -29
  104. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +61 -59
  105. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +98 -98
  106. data/lib/solargraph/parser/parser_gem/node_processors/or_node.rb +22 -0
  107. data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +17 -17
  108. data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +39 -38
  109. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +51 -52
  110. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +302 -291
  111. data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +29 -29
  112. data/lib/solargraph/parser/parser_gem/node_processors/when_node.rb +23 -0
  113. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +33 -29
  114. data/lib/solargraph/parser/parser_gem/node_processors.rb +74 -70
  115. data/lib/solargraph/parser/parser_gem.rb +14 -12
  116. data/lib/solargraph/parser/region.rb +75 -69
  117. data/lib/solargraph/parser/snippet.rb +19 -17
  118. data/lib/solargraph/parser.rb +25 -23
  119. data/lib/solargraph/pin/base.rb +773 -729
  120. data/lib/solargraph/pin/base_variable.rb +375 -126
  121. data/lib/solargraph/pin/block.rb +127 -104
  122. data/lib/solargraph/pin/breakable.rb +15 -9
  123. data/lib/solargraph/pin/callable.rb +275 -231
  124. data/lib/solargraph/pin/closure.rb +69 -72
  125. data/lib/solargraph/pin/common.rb +97 -79
  126. data/lib/solargraph/pin/compound_statement.rb +55 -0
  127. data/lib/solargraph/pin/constant.rb +43 -45
  128. data/lib/solargraph/pin/conversions.rb +129 -123
  129. data/lib/solargraph/pin/delegated_method.rb +131 -120
  130. data/lib/solargraph/pin/documenting.rb +116 -114
  131. data/lib/solargraph/pin/instance_variable.rb +38 -34
  132. data/lib/solargraph/pin/keyword.rb +16 -20
  133. data/lib/solargraph/pin/local_variable.rb +31 -75
  134. data/lib/solargraph/pin/method.rb +724 -672
  135. data/lib/solargraph/pin/method_alias.rb +42 -34
  136. data/lib/solargraph/pin/namespace.rb +122 -115
  137. data/lib/solargraph/pin/parameter.rb +339 -275
  138. data/lib/solargraph/pin/proxy_type.rb +42 -39
  139. data/lib/solargraph/pin/reference/override.rb +47 -47
  140. data/lib/solargraph/pin/reference/superclass.rb +17 -15
  141. data/lib/solargraph/pin/reference/type_alias.rb +16 -0
  142. data/lib/solargraph/pin/reference.rb +59 -39
  143. data/lib/solargraph/pin/search.rb +62 -61
  144. data/lib/solargraph/pin/signature.rb +64 -61
  145. data/lib/solargraph/pin/symbol.rb +54 -53
  146. data/lib/solargraph/pin/until.rb +16 -18
  147. data/lib/solargraph/pin/while.rb +16 -18
  148. data/lib/solargraph/pin.rb +46 -44
  149. data/lib/solargraph/pin_cache.rb +248 -245
  150. data/lib/solargraph/position.rb +139 -119
  151. data/lib/solargraph/range.rb +113 -112
  152. data/lib/solargraph/rbs_map/conversions.rb +952 -823
  153. data/lib/solargraph/rbs_map/core_fills.rb +91 -84
  154. data/lib/solargraph/rbs_map/core_map.rb +65 -58
  155. data/lib/solargraph/rbs_map/stdlib_map.rb +71 -43
  156. data/lib/solargraph/rbs_map.rb +207 -163
  157. data/lib/solargraph/server_methods.rb +16 -16
  158. data/lib/solargraph/shell.rb +555 -352
  159. data/lib/solargraph/source/chain/array.rb +39 -37
  160. data/lib/solargraph/source/chain/call.rb +377 -337
  161. data/lib/solargraph/source/chain/class_variable.rb +13 -13
  162. data/lib/solargraph/source/chain/constant.rb +30 -26
  163. data/lib/solargraph/source/chain/global_variable.rb +13 -13
  164. data/lib/solargraph/source/chain/hash.rb +37 -34
  165. data/lib/solargraph/source/chain/if.rb +30 -28
  166. data/lib/solargraph/source/chain/instance_variable.rb +36 -13
  167. data/lib/solargraph/source/chain/link.rb +99 -109
  168. data/lib/solargraph/source/chain/literal.rb +51 -48
  169. data/lib/solargraph/source/chain/or.rb +29 -23
  170. data/lib/solargraph/source/chain/q_call.rb +13 -11
  171. data/lib/solargraph/source/chain/variable.rb +15 -13
  172. data/lib/solargraph/source/chain/z_super.rb +28 -30
  173. data/lib/solargraph/source/chain.rb +304 -291
  174. data/lib/solargraph/source/change.rb +89 -82
  175. data/lib/solargraph/source/cursor.rb +172 -166
  176. data/lib/solargraph/source/encoding_fixes.rb +22 -23
  177. data/lib/solargraph/source/source_chainer.rb +218 -194
  178. data/lib/solargraph/source/updater.rb +59 -55
  179. data/lib/solargraph/source.rb +522 -498
  180. data/lib/solargraph/source_map/clip.rb +245 -226
  181. data/lib/solargraph/source_map/data.rb +37 -34
  182. data/lib/solargraph/source_map/mapper.rb +286 -259
  183. data/lib/solargraph/source_map.rb +224 -212
  184. data/lib/solargraph/type_checker/problem.rb +34 -32
  185. data/lib/solargraph/type_checker/rules.rb +157 -84
  186. data/lib/solargraph/type_checker.rb +888 -814
  187. data/lib/solargraph/version.rb +5 -5
  188. data/lib/solargraph/workspace/config.rb +258 -255
  189. data/lib/solargraph/workspace/gemspecs.rb +367 -0
  190. data/lib/solargraph/workspace/require_paths.rb +98 -97
  191. data/lib/solargraph/workspace.rb +242 -220
  192. data/lib/solargraph/yard_map/helpers.rb +49 -44
  193. data/lib/solargraph/yard_map/mapper/to_method.rb +136 -130
  194. data/lib/solargraph/yard_map/mapper/to_namespace.rb +32 -31
  195. data/lib/solargraph/yard_map/mapper.rb +84 -79
  196. data/lib/solargraph/yard_map.rb +17 -18
  197. data/lib/solargraph/yard_tags.rb +20 -20
  198. data/lib/solargraph/yardoc.rb +90 -87
  199. data/lib/solargraph.rb +128 -105
  200. data/rbs/fills/rubygems/0/dependency.rbs +193 -0
  201. data/rbs/fills/tuple/tuple.rbs +28 -0
  202. data/rbs/shims/ast/0/node.rbs +5 -0
  203. data/rbs/shims/diff-lcs/1.5/diff-lcs.rbs +11 -0
  204. data/rbs_collection.yaml +1 -1
  205. data/solargraph.gemspec +37 -35
  206. metadata +52 -51
  207. data/lib/solargraph/type_checker/checks.rb +0 -124
  208. data/lib/solargraph/type_checker/param_def.rb +0 -37
  209. data/lib/solargraph/yard_map/to_method.rb +0 -89
  210. data/sig/shims/ast/0/node.rbs +0 -5
  211. /data/{sig → rbs}/shims/ast/2.4/.rbs_meta.yaml +0 -0
  212. /data/{sig → rbs}/shims/ast/2.4/ast.rbs +0 -0
  213. /data/{sig → rbs}/shims/parser/3.2.0.1/builders/default.rbs +0 -0
  214. /data/{sig → rbs}/shims/parser/3.2.0.1/manifest.yaml +0 -0
  215. /data/{sig → rbs}/shims/parser/3.2.0.1/parser.rbs +0 -0
  216. /data/{sig → rbs}/shims/parser/3.2.0.1/polyfill.rbs +0 -0
  217. /data/{sig → rbs}/shims/thor/1.2.0.1/.rbs_meta.yaml +0 -0
  218. /data/{sig → rbs}/shims/thor/1.2.0.1/manifest.yaml +0 -0
  219. /data/{sig → rbs}/shims/thor/1.2.0.1/thor.rbs +0 -0
@@ -1,32 +1,32 @@
1
- # frozen_string_literal: true
2
-
3
- require 'open3'
4
-
5
- module Solargraph
6
- module LanguageServer
7
- module Message
8
- module Extended
9
- # Update YARD documentation for installed gems. If the `rebuild`
10
- # parameter is true, rebuild existing yardocs.
11
- #
12
- class DocumentGems < Base
13
- def process
14
- cmd = [host.command_path, 'gems']
15
- cmd.push '--rebuild' if params['rebuild']
16
- o, s = Open3.capture2(*cmd)
17
- if s != 0
18
- host.show_message "An error occurred while building gem documentation.", LanguageServer::MessageTypes::ERROR
19
- set_result({
20
- status: 'err'
21
- })
22
- else
23
- set_result({
24
- status: 'ok'
25
- })
26
- end
27
- end
28
- end
29
- end
30
- end
31
- end
32
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'open3'
4
+
5
+ module Solargraph
6
+ module LanguageServer
7
+ module Message
8
+ module Extended
9
+ # Update YARD documentation for installed gems. If the `rebuild`
10
+ # parameter is true, rebuild existing yardocs.
11
+ #
12
+ class DocumentGems < Base
13
+ def process
14
+ cmd = [host.command_path, 'gems']
15
+ cmd.push '--rebuild' if params['rebuild']
16
+ _, s = Open3.capture2(*cmd)
17
+ if s == 0
18
+ set_result({
19
+ status: 'ok'
20
+ })
21
+ else
22
+ host.show_message 'An error occurred while building gem documentation.', LanguageServer::MessageTypes::ERROR
23
+ set_result({
24
+ status: 'err'
25
+ })
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -1,19 +1,20 @@
1
- # frozen_string_literal: true
2
-
3
- require 'open3'
4
-
5
- module Solargraph
6
- module LanguageServer
7
- module Message
8
- module Extended
9
- # Update core Ruby documentation.
10
- #
11
- class DownloadCore < Base
12
- def process
13
- host.show_message "Downloading cores is deprecated. Solargraph currently uses RBS for core and stdlib documentation", LanguageServer::MessageTypes::INFO
14
- end
15
- end
16
- end
17
- end
18
- end
19
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'open3'
4
+
5
+ module Solargraph
6
+ module LanguageServer
7
+ module Message
8
+ module Extended
9
+ # Update core Ruby documentation.
10
+ #
11
+ class DownloadCore < Base
12
+ def process
13
+ host.show_message 'Downloading cores is deprecated. Solargraph currently uses RBS for core and stdlib documentation',
14
+ LanguageServer::MessageTypes::INFO
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -1,20 +1,20 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module LanguageServer
5
- module Message
6
- module Extended
7
- class Search < Base
8
- def process
9
- results = host.search(params['query'])
10
- page = Solargraph::Page.new(host.options['viewsPath'])
11
- content = page.render('search', layout: true, locals: {query: params['query'], results: results})
12
- set_result(
13
- content: content
14
- )
15
- end
16
- end
17
- end
18
- end
19
- end
20
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module LanguageServer
5
+ module Message
6
+ module Extended
7
+ class Search < Base
8
+ def process
9
+ results = host.search(params['query'])
10
+ page = Solargraph::Page.new(host.options['viewsPath'])
11
+ content = page.render('search', layout: true, locals: { query: params['query'], results: results })
12
+ set_result(
13
+ content: content
14
+ )
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -1,191 +1,197 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module LanguageServer
5
- module Message
6
- class Initialize < Base
7
- def process
8
- host.configure params['initializationOptions']
9
- host.client_capabilities = params['capabilities']
10
- if support_workspace_folders?
11
- host.prepare_folders params['workspaceFolders']
12
- elsif params['rootUri']
13
- host.prepare UriHelpers.uri_to_file(params['rootUri'])
14
- else
15
- host.prepare params['rootPath']
16
- end
17
- result = {
18
- capabilities: {
19
- textDocumentSync: 2, # @todo What should this be?
20
- workspace: {
21
- workspaceFolders: {
22
- supported: true,
23
- changeNotifications: true
24
- }
25
- }
26
- }
27
- }
28
- # FIXME: lsp default is utf-16, may have different position
29
- result[:capabilities][:positionEncoding] = "utf-32" if params.dig("capabilities", "general", "positionEncodings")&.include?("utf-32")
30
- result[:capabilities].merge! static_completion unless dynamic_registration_for?('textDocument', 'completion')
31
- result[:capabilities].merge! static_signature_help unless dynamic_registration_for?('textDocument', 'signatureHelp')
32
- # result[:capabilities].merge! static_on_type_formatting unless dynamic_registration_for?('textDocument', 'onTypeFormatting')
33
- result[:capabilities].merge! static_hover unless dynamic_registration_for?('textDocument', 'hover')
34
- result[:capabilities].merge! static_document_formatting unless dynamic_registration_for?('textDocument', 'formatting')
35
- result[:capabilities].merge! static_document_symbols unless dynamic_registration_for?('textDocument', 'documentSymbol')
36
- result[:capabilities].merge! static_definitions unless dynamic_registration_for?('textDocument', 'definition')
37
- result[:capabilities].merge! static_type_definitions unless dynamic_registration_for?('textDocument', 'typeDefinition')
38
- result[:capabilities].merge! static_rename unless dynamic_registration_for?('textDocument', 'rename')
39
- result[:capabilities].merge! static_references unless dynamic_registration_for?('textDocument', 'references')
40
- result[:capabilities].merge! static_workspace_symbols unless dynamic_registration_for?('workspace', 'symbol')
41
- result[:capabilities].merge! static_folding_range unless dynamic_registration_for?('textDocument', 'foldingRange')
42
- result[:capabilities].merge! static_highlights unless dynamic_registration_for?('textDocument', 'documentHighlight')
43
- # @todo Temporarily disabled
44
- # result[:capabilities].merge! static_code_action unless dynamic_registration_for?('textDocument', 'codeAction')
45
- set_result result
46
- end
47
-
48
- private
49
-
50
- # @todo '?' methods should type like RBS 'boolish' rather than a strict true or false
51
- # @sg-ignore
52
- def support_workspace_folders?
53
- params['capabilities'] &&
54
- params['capabilities']['workspace'] &&
55
- params['capabilities']['workspace']['workspaceFolders'] &&
56
- params['workspaceFolders']
57
- end
58
-
59
- # @return [Hash{Symbol => undefined}]
60
- def static_completion
61
- return {} unless host.options['completion']
62
- {
63
- completionProvider: {
64
- resolveProvider: true,
65
- triggerCharacters: ['.', ':', '@']
66
- }
67
- }
68
- end
69
-
70
- # @return [Hash{Symbol => BasicObject}]
71
- def static_code_action
72
- {
73
- codeActionProvider: true,
74
- codeActionKinds: ["quickfix"]
75
- }
76
- end
77
-
78
- # @return [Hash{Symbol => BasicObject}]
79
- def static_signature_help
80
- {
81
- signatureHelpProvider: {
82
- triggerCharacters: ['(', ',']
83
- }
84
- }
85
- end
86
-
87
- # @return [Hash{Symbol => Hash{Symbol => String, Array<String>}}]
88
- def static_on_type_formatting
89
- {
90
- documentOnTypeFormattingProvider: {
91
- firstTriggerCharacter: '{',
92
- moreTriggerCharacter: ['(']
93
- }
94
- }
95
- end
96
-
97
- # @return [Hash{Symbol => Boolean}]
98
- def static_hover
99
- return {} unless host.options['hover']
100
- {
101
- hoverProvider: true
102
- }
103
- end
104
-
105
- # @return [Hash{Symbol => Boolean}]
106
- def static_document_formatting
107
- return {} unless host.options['formatting']
108
- {
109
- documentFormattingProvider: true
110
- }
111
- end
112
-
113
- # @return [Hash{Symbol => Boolean}]
114
- def static_document_symbols
115
- return {} unless host.options['symbols']
116
- {
117
- documentSymbolProvider: true
118
- }
119
- end
120
-
121
- # @return [Hash{Symbol => Boolean}]
122
- def static_workspace_symbols
123
- {
124
- workspaceSymbolProvider: true
125
- }
126
- end
127
-
128
- # @return [Hash{Symbol => Boolean}]
129
- def static_definitions
130
- return {} unless host.options['definitions']
131
- {
132
- definitionProvider: true
133
- }
134
- end
135
-
136
- # @return [Hash{Symbol => Boolean}]
137
- def static_type_definitions
138
- return {} unless host.options['typeDefinitions']
139
- {
140
- typeDefinitionProvider: true
141
- }
142
- end
143
-
144
- # @return [Hash{Symbol => Hash{Symbol => Boolean}}]
145
- def static_rename
146
- {
147
- renameProvider: {prepareProvider: true}
148
- }
149
- end
150
-
151
-
152
- # @return [Hash{Symbol => Boolean}]
153
- def static_references
154
- return {} unless host.options['references']
155
- {
156
- referencesProvider: true
157
- }
158
- end
159
-
160
- # @return [Hash{Symbol => Boolean}]
161
- def static_folding_range
162
- return {} unless host.options['folding']
163
- {
164
- foldingRangeProvider: true
165
- }
166
- end
167
-
168
- # @return [Hash{Symbol => Boolean}]
169
- def static_highlights
170
- {
171
- documentHighlightProvider: true
172
- }
173
- end
174
-
175
- # @param section [String]
176
- # @param capability [String]
177
- # @todo Need support for RBS' boolish "type", which doesn't
178
- # enforce strict true/false-ness
179
- # @sg-ignore
180
- def dynamic_registration_for? section, capability
181
- result = (params['capabilities'] &&
182
- params['capabilities'][section] &&
183
- params['capabilities'][section][capability] &&
184
- params['capabilities'][section][capability]['dynamicRegistration'])
185
- host.allow_registration("#{section}/#{capability}") if result
186
- result
187
- end
188
- end
189
- end
190
- end
191
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module LanguageServer
5
+ module Message
6
+ class Initialize < Base
7
+ def process
8
+ host.configure params['initializationOptions']
9
+ host.client_capabilities = params['capabilities']
10
+ if support_workspace_folders?
11
+ host.prepare_folders params['workspaceFolders']
12
+ elsif params['rootUri']
13
+ host.prepare UriHelpers.uri_to_file(params['rootUri'])
14
+ else
15
+ host.prepare params['rootPath']
16
+ end
17
+ result = {
18
+ capabilities: {
19
+ textDocumentSync: 2, # @todo What should this be?
20
+ workspace: {
21
+ workspaceFolders: {
22
+ supported: true,
23
+ changeNotifications: true
24
+ }
25
+ }
26
+ }
27
+ }
28
+ # FIXME: lsp default is utf-16, may have different position
29
+ result[:capabilities][:positionEncoding] = 'utf-32' if params.dig('capabilities', 'general',
30
+ 'positionEncodings')&.include?('utf-32')
31
+ result[:capabilities].merge! static_completion unless dynamic_registration_for?('textDocument', 'completion')
32
+ result[:capabilities].merge! static_signature_help unless dynamic_registration_for?('textDocument',
33
+ 'signatureHelp')
34
+ # result[:capabilities].merge! static_on_type_formatting unless dynamic_registration_for?('textDocument', 'onTypeFormatting')
35
+ result[:capabilities].merge! static_hover unless dynamic_registration_for?('textDocument', 'hover')
36
+ result[:capabilities].merge! static_document_formatting unless dynamic_registration_for?('textDocument',
37
+ 'formatting')
38
+ result[:capabilities].merge! static_document_symbols unless dynamic_registration_for?('textDocument',
39
+ 'documentSymbol')
40
+ result[:capabilities].merge! static_definitions unless dynamic_registration_for?('textDocument', 'definition')
41
+ result[:capabilities].merge! static_type_definitions unless dynamic_registration_for?('textDocument',
42
+ 'typeDefinition')
43
+ result[:capabilities].merge! static_rename unless dynamic_registration_for?('textDocument', 'rename')
44
+ result[:capabilities].merge! static_references unless dynamic_registration_for?('textDocument', 'references')
45
+ result[:capabilities].merge! static_workspace_symbols unless dynamic_registration_for?('workspace', 'symbol')
46
+ result[:capabilities].merge! static_folding_range unless dynamic_registration_for?('textDocument',
47
+ 'foldingRange')
48
+ result[:capabilities].merge! static_highlights unless dynamic_registration_for?('textDocument',
49
+ 'documentHighlight')
50
+ # @todo Temporarily disabled
51
+ # result[:capabilities].merge! static_code_action unless dynamic_registration_for?('textDocument', 'codeAction')
52
+ set_result result
53
+ end
54
+
55
+ private
56
+
57
+ # @todo '?' methods should type like RBS 'boolish' rather than a strict true or false
58
+ # @sg-ignore
59
+ def support_workspace_folders?
60
+ params['capabilities'] &&
61
+ params['capabilities']['workspace'] &&
62
+ params['capabilities']['workspace']['workspaceFolders'] &&
63
+ params['workspaceFolders']
64
+ end
65
+
66
+ # @return [Hash{Symbol => undefined}]
67
+ def static_completion
68
+ return {} unless host.options['completion']
69
+ {
70
+ completionProvider: {
71
+ resolveProvider: true,
72
+ triggerCharacters: ['.', ':', '@']
73
+ }
74
+ }
75
+ end
76
+
77
+ # @return [Hash{Symbol => BasicObject}]
78
+ def static_code_action
79
+ {
80
+ codeActionProvider: true,
81
+ codeActionKinds: ['quickfix']
82
+ }
83
+ end
84
+
85
+ # @return [Hash{Symbol => BasicObject}]
86
+ def static_signature_help
87
+ {
88
+ signatureHelpProvider: {
89
+ triggerCharacters: ['(', ',']
90
+ }
91
+ }
92
+ end
93
+
94
+ # @return [Hash{Symbol => Hash{Symbol => String, Array<String>}}]
95
+ def static_on_type_formatting
96
+ {
97
+ documentOnTypeFormattingProvider: {
98
+ firstTriggerCharacter: '{',
99
+ moreTriggerCharacter: ['(']
100
+ }
101
+ }
102
+ end
103
+
104
+ # @return [Hash{Symbol => Boolean}]
105
+ def static_hover
106
+ return {} unless host.options['hover']
107
+ {
108
+ hoverProvider: true
109
+ }
110
+ end
111
+
112
+ # @return [Hash{Symbol => Boolean}]
113
+ def static_document_formatting
114
+ return {} unless host.options['formatting']
115
+ {
116
+ documentFormattingProvider: true
117
+ }
118
+ end
119
+
120
+ # @return [Hash{Symbol => Boolean}]
121
+ def static_document_symbols
122
+ return {} unless host.options['symbols']
123
+ {
124
+ documentSymbolProvider: true
125
+ }
126
+ end
127
+
128
+ # @return [Hash{Symbol => Boolean}]
129
+ def static_workspace_symbols
130
+ {
131
+ workspaceSymbolProvider: true
132
+ }
133
+ end
134
+
135
+ # @return [Hash{Symbol => Boolean}]
136
+ def static_definitions
137
+ return {} unless host.options['definitions']
138
+ {
139
+ definitionProvider: true
140
+ }
141
+ end
142
+
143
+ # @return [Hash{Symbol => Boolean}]
144
+ def static_type_definitions
145
+ return {} unless host.options['typeDefinitions']
146
+ {
147
+ typeDefinitionProvider: true
148
+ }
149
+ end
150
+
151
+ # @return [Hash{Symbol => Hash{Symbol => Boolean}}]
152
+ def static_rename
153
+ {
154
+ renameProvider: { prepareProvider: true }
155
+ }
156
+ end
157
+
158
+ # @return [Hash{Symbol => Boolean}]
159
+ def static_references
160
+ return {} unless host.options['references']
161
+ {
162
+ referencesProvider: true
163
+ }
164
+ end
165
+
166
+ # @return [Hash{Symbol => Boolean}]
167
+ def static_folding_range
168
+ return {} unless host.options['folding']
169
+ {
170
+ foldingRangeProvider: true
171
+ }
172
+ end
173
+
174
+ # @return [Hash{Symbol => Boolean}]
175
+ def static_highlights
176
+ {
177
+ documentHighlightProvider: true
178
+ }
179
+ end
180
+
181
+ # @param section [String]
182
+ # @param capability [String]
183
+ # @todo Need support for RBS' boolish "type", which doesn't
184
+ # enforce strict true/false-ness
185
+ # @sg-ignore
186
+ def dynamic_registration_for? section, capability
187
+ result = params['capabilities'] &&
188
+ params['capabilities'][section] &&
189
+ params['capabilities'][section][capability] &&
190
+ params['capabilities'][section][capability]['dynamicRegistration']
191
+ host.allow_registration("#{section}/#{capability}") if result
192
+ result
193
+ end
194
+ end
195
+ end
196
+ end
197
+ end
@@ -1,56 +1,58 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module LanguageServer
5
- module Message
6
- module TextDocument
7
- class Completion < Base
8
- def process
9
- return set_error(ErrorCodes::REQUEST_CANCELLED, "cancelled by so many request") if host.has_pending_completions?
10
-
11
- line = params['position']['line']
12
- col = params['position']['character']
13
- begin
14
- completion = host.completions_at(params['textDocument']['uri'], line, col)
15
- items = []
16
- last_context = nil
17
- idx = -1
18
- completion.pins.each do |pin|
19
- idx += 1 if last_context != pin.context
20
- items.push pin.completion_item.merge({
21
- textEdit: {
22
- range: completion.range.to_hash,
23
- newText: pin.name.sub(/=$/, ' = ').sub(/:$/, ': ')
24
- },
25
- sortText: "#{idx.to_s.rjust(4, '0')}#{pin.name}"
26
- })
27
- items.last[:data][:uri] = params['textDocument']['uri']
28
- last_context = pin.context
29
- end
30
- set_result(
31
- isIncomplete: false,
32
- items: items
33
- )
34
- rescue InvalidOffsetError => e
35
- Logging.logger.info "Completion ignored invalid offset: #{params['textDocument']['uri']}, line #{line}, character #{col}"
36
- set_result empty_result
37
- end
38
- rescue FileNotFoundError => e
39
- Logging.logger.warn "[#{e.class}] #{e.message}"
40
- Logging.logger.warn e.backtrace.join("\n")
41
- set_result empty_result
42
- end
43
-
44
- # @param incomplete [Boolean]
45
- # @return [Hash]
46
- def empty_result incomplete = false
47
- {
48
- isIncomplete: incomplete,
49
- items: []
50
- }
51
- end
52
- end
53
- end
54
- end
55
- end
56
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module LanguageServer
5
+ module Message
6
+ module TextDocument
7
+ class Completion < Base
8
+ def process
9
+ return set_error(ErrorCodes::REQUEST_CANCELLED, 'cancelled by so many request') if host.pending_completions?
10
+
11
+ line = params['position']['line']
12
+ col = params['position']['character']
13
+ begin
14
+ completion = host.completions_at(params['textDocument']['uri'], line, col)
15
+ items = []
16
+ last_context = nil
17
+ idx = -1
18
+ # @sg-ignore Need to add nil check here
19
+ completion.pins.each do |pin|
20
+ idx += 1 if last_context != pin.context
21
+ items.push pin.completion_item.merge({
22
+ textEdit: {
23
+ range: completion.range.to_hash,
24
+ newText: pin.name.sub(/=$/, ' = ').sub(/:$/, ': ')
25
+ },
26
+ sortText: "#{idx.to_s.rjust(4, '0')}#{pin.name}"
27
+ })
28
+ items.last[:data][:uri] = params['textDocument']['uri']
29
+ last_context = pin.context
30
+ end
31
+ set_result(
32
+ isIncomplete: false,
33
+ items: items
34
+ )
35
+ rescue InvalidOffsetError
36
+ Logging.logger.info "Completion ignored invalid offset: #{params['textDocument']['uri']}, line #{line}, character #{col}"
37
+ set_result empty_result
38
+ end
39
+ rescue FileNotFoundError => e
40
+ Logging.logger.warn "[#{e.class}] #{e.message}"
41
+ # @sg-ignore Need to add nil check here
42
+ Logging.logger.warn e.backtrace.join("\n")
43
+ set_result empty_result
44
+ end
45
+
46
+ # @param incomplete [Boolean]
47
+ # @return [Hash]
48
+ def empty_result incomplete = false
49
+ {
50
+ isIncomplete: incomplete,
51
+ items: []
52
+ }
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end