solargraph 0.57.0 → 0.58.3

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 (216) hide show
  1. checksums.yaml +4 -4
  2. data/.gitattributes +2 -0
  3. data/.github/workflows/linting.yml +4 -2
  4. data/.github/workflows/plugins.yml +63 -28
  5. data/.github/workflows/rspec.yml +19 -4
  6. data/.github/workflows/typecheck.yml +2 -2
  7. data/.gitignore +1 -0
  8. data/.rubocop.yml +1 -1
  9. data/.rubocop_todo.yml +90 -1438
  10. data/CHANGELOG.md +39 -0
  11. data/Rakefile +1 -1
  12. data/bin/solargraph +3 -0
  13. data/lib/solargraph/api_map/cache.rb +110 -110
  14. data/lib/solargraph/api_map/constants.rb +279 -218
  15. data/lib/solargraph/api_map/index.rb +193 -169
  16. data/lib/solargraph/api_map/source_to_yard.rb +97 -94
  17. data/lib/solargraph/api_map/store.rb +384 -374
  18. data/lib/solargraph/api_map.rb +945 -951
  19. data/lib/solargraph/bench.rb +45 -45
  20. data/lib/solargraph/complex_type/type_methods.rb +228 -223
  21. data/lib/solargraph/complex_type/unique_type.rb +482 -475
  22. data/lib/solargraph/complex_type.rb +444 -427
  23. data/lib/solargraph/convention/active_support_concern.rb +1 -1
  24. data/lib/solargraph/convention/data_definition/data_assignment_node.rb +61 -61
  25. data/lib/solargraph/convention/data_definition/data_definition_node.rb +91 -91
  26. data/lib/solargraph/convention/data_definition.rb +105 -105
  27. data/lib/solargraph/convention/gemfile.rb +15 -15
  28. data/lib/solargraph/convention/gemspec.rb +23 -23
  29. data/lib/solargraph/convention/rakefile.rb +17 -17
  30. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +61 -61
  31. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +102 -102
  32. data/lib/solargraph/convention/struct_definition.rb +164 -164
  33. data/lib/solargraph/convention.rb +78 -78
  34. data/lib/solargraph/converters/dd.rb +17 -17
  35. data/lib/solargraph/converters/dl.rb +15 -15
  36. data/lib/solargraph/converters/dt.rb +15 -15
  37. data/lib/solargraph/converters/misc.rb +1 -1
  38. data/lib/solargraph/diagnostics/require_not_found.rb +53 -53
  39. data/lib/solargraph/diagnostics/rubocop.rb +118 -118
  40. data/lib/solargraph/diagnostics/rubocop_helpers.rb +68 -66
  41. data/lib/solargraph/diagnostics/type_check.rb +55 -55
  42. data/lib/solargraph/diagnostics/update_errors.rb +41 -41
  43. data/lib/solargraph/doc_map.rb +439 -436
  44. data/lib/solargraph/environ.rb +1 -1
  45. data/lib/solargraph/equality.rb +34 -33
  46. data/lib/solargraph/gem_pins.rb +98 -94
  47. data/lib/solargraph/language_server/error_codes.rb +20 -20
  48. data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
  49. data/lib/solargraph/language_server/host/dispatch.rb +130 -130
  50. data/lib/solargraph/language_server/host/message_worker.rb +112 -112
  51. data/lib/solargraph/language_server/host/sources.rb +99 -99
  52. data/lib/solargraph/language_server/host.rb +878 -872
  53. data/lib/solargraph/language_server/message/base.rb +97 -97
  54. data/lib/solargraph/language_server/message/client/register_capability.rb +15 -15
  55. data/lib/solargraph/language_server/message/completion_item/resolve.rb +60 -60
  56. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +114 -114
  57. data/lib/solargraph/language_server/message/extended/document.rb +23 -23
  58. data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -32
  59. data/lib/solargraph/language_server/message/extended/download_core.rb +19 -19
  60. data/lib/solargraph/language_server/message/extended/search.rb +20 -20
  61. data/lib/solargraph/language_server/message/initialize.rb +191 -191
  62. data/lib/solargraph/language_server/message/text_document/completion.rb +56 -56
  63. data/lib/solargraph/language_server/message/text_document/definition.rb +40 -40
  64. data/lib/solargraph/language_server/message/text_document/document_highlight.rb +16 -16
  65. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +26 -26
  66. data/lib/solargraph/language_server/message/text_document/formatting.rb +148 -145
  67. data/lib/solargraph/language_server/message/text_document/hover.rb +58 -58
  68. data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +11 -11
  69. data/lib/solargraph/language_server/message/text_document/references.rb +16 -16
  70. data/lib/solargraph/language_server/message/text_document/rename.rb +19 -19
  71. data/lib/solargraph/language_server/message/text_document/signature_help.rb +24 -24
  72. data/lib/solargraph/language_server/message/text_document/type_definition.rb +25 -25
  73. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +35 -35
  74. data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +40 -40
  75. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +26 -26
  76. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +23 -23
  77. data/lib/solargraph/language_server/message.rb +94 -94
  78. data/lib/solargraph/language_server/progress.rb +1 -1
  79. data/lib/solargraph/language_server/request.rb +27 -25
  80. data/lib/solargraph/language_server/transport/data_reader.rb +74 -74
  81. data/lib/solargraph/language_server/uri_helpers.rb +49 -49
  82. data/lib/solargraph/library.rb +683 -683
  83. data/lib/solargraph/location.rb +82 -81
  84. data/lib/solargraph/logging.rb +37 -37
  85. data/lib/solargraph/page.rb +92 -93
  86. data/lib/solargraph/parser/comment_ripper.rb +69 -69
  87. data/lib/solargraph/parser/flow_sensitive_typing.rb +255 -255
  88. data/lib/solargraph/parser/node_processor/base.rb +92 -92
  89. data/lib/solargraph/parser/node_processor.rb +62 -62
  90. data/lib/solargraph/parser/parser_gem/class_methods.rb +149 -159
  91. data/lib/solargraph/parser/parser_gem/flawed_builder.rb +19 -19
  92. data/lib/solargraph/parser/parser_gem/node_chainer.rb +166 -166
  93. data/lib/solargraph/parser/parser_gem/node_methods.rb +486 -499
  94. data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +22 -21
  95. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +59 -59
  96. data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +15 -15
  97. data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +46 -46
  98. data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +53 -53
  99. data/lib/solargraph/parser/parser_gem/node_processors/defs_node.rb +37 -37
  100. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +23 -23
  101. data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +40 -40
  102. data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +29 -29
  103. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +59 -59
  104. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +98 -42
  105. data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +17 -17
  106. data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +38 -38
  107. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +52 -43
  108. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +291 -292
  109. data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +29 -29
  110. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +29 -29
  111. data/lib/solargraph/parser/parser_gem/node_processors.rb +70 -70
  112. data/lib/solargraph/parser/parser_gem.rb +12 -12
  113. data/lib/solargraph/parser/region.rb +69 -69
  114. data/lib/solargraph/parser/snippet.rb +17 -17
  115. data/lib/solargraph/parser.rb +23 -23
  116. data/lib/solargraph/pin/base.rb +729 -708
  117. data/lib/solargraph/pin/base_variable.rb +126 -124
  118. data/lib/solargraph/pin/block.rb +104 -103
  119. data/lib/solargraph/pin/breakable.rb +9 -9
  120. data/lib/solargraph/pin/callable.rb +231 -227
  121. data/lib/solargraph/pin/closure.rb +72 -76
  122. data/lib/solargraph/pin/common.rb +79 -79
  123. data/lib/solargraph/pin/constant.rb +45 -45
  124. data/lib/solargraph/pin/conversions.rb +123 -123
  125. data/lib/solargraph/pin/delegated_method.rb +120 -121
  126. data/lib/solargraph/pin/documenting.rb +114 -114
  127. data/lib/solargraph/pin/instance_variable.rb +34 -34
  128. data/lib/solargraph/pin/keyword.rb +20 -20
  129. data/lib/solargraph/pin/local_variable.rb +75 -79
  130. data/lib/solargraph/pin/method.rb +672 -656
  131. data/lib/solargraph/pin/method_alias.rb +34 -34
  132. data/lib/solargraph/pin/namespace.rb +115 -115
  133. data/lib/solargraph/pin/parameter.rb +275 -271
  134. data/lib/solargraph/pin/proxy_type.rb +39 -36
  135. data/lib/solargraph/pin/reference/override.rb +47 -47
  136. data/lib/solargraph/pin/reference/superclass.rb +15 -15
  137. data/lib/solargraph/pin/reference.rb +39 -48
  138. data/lib/solargraph/pin/search.rb +61 -58
  139. data/lib/solargraph/pin/signature.rb +61 -61
  140. data/lib/solargraph/pin/symbol.rb +53 -53
  141. data/lib/solargraph/pin/until.rb +18 -18
  142. data/lib/solargraph/pin/while.rb +18 -18
  143. data/lib/solargraph/pin.rb +44 -44
  144. data/lib/solargraph/pin_cache.rb +245 -245
  145. data/lib/solargraph/position.rb +132 -118
  146. data/lib/solargraph/range.rb +112 -108
  147. data/lib/solargraph/rbs_map/conversions.rb +823 -802
  148. data/lib/solargraph/rbs_map/core_fills.rb +84 -66
  149. data/lib/solargraph/rbs_map/core_map.rb +58 -54
  150. data/lib/solargraph/rbs_map/stdlib_map.rb +43 -43
  151. data/lib/solargraph/rbs_map.rb +163 -163
  152. data/lib/solargraph/server_methods.rb +16 -16
  153. data/lib/solargraph/shell.rb +363 -271
  154. data/lib/solargraph/source/chain/array.rb +37 -37
  155. data/lib/solargraph/source/chain/call.rb +337 -333
  156. data/lib/solargraph/source/chain/class_variable.rb +13 -13
  157. data/lib/solargraph/source/chain/constant.rb +26 -89
  158. data/lib/solargraph/source/chain/global_variable.rb +13 -13
  159. data/lib/solargraph/source/chain/hash.rb +34 -34
  160. data/lib/solargraph/source/chain/if.rb +28 -28
  161. data/lib/solargraph/source/chain/instance_variable.rb +13 -13
  162. data/lib/solargraph/source/chain/link.rb +109 -109
  163. data/lib/solargraph/source/chain/literal.rb +48 -48
  164. data/lib/solargraph/source/chain/or.rb +23 -23
  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 +291 -289
  169. data/lib/solargraph/source/change.rb +82 -82
  170. data/lib/solargraph/source/cursor.rb +166 -166
  171. data/lib/solargraph/source/encoding_fixes.rb +23 -23
  172. data/lib/solargraph/source/source_chainer.rb +194 -194
  173. data/lib/solargraph/source/updater.rb +55 -55
  174. data/lib/solargraph/source.rb +498 -498
  175. data/lib/solargraph/source_map/clip.rb +226 -234
  176. data/lib/solargraph/source_map/data.rb +34 -34
  177. data/lib/solargraph/source_map/mapper.rb +259 -261
  178. data/lib/solargraph/source_map.rb +212 -207
  179. data/lib/solargraph/type_checker/checks.rb +124 -124
  180. data/lib/solargraph/type_checker/param_def.rb +37 -37
  181. data/lib/solargraph/type_checker/problem.rb +32 -32
  182. data/lib/solargraph/type_checker/rules.rb +84 -70
  183. data/lib/solargraph/type_checker.rb +814 -752
  184. data/lib/solargraph/version.rb +5 -5
  185. data/lib/solargraph/workspace/config.rb +255 -237
  186. data/lib/solargraph/workspace/require_paths.rb +97 -98
  187. data/lib/solargraph/workspace.rb +220 -225
  188. data/lib/solargraph/yard_map/helpers.rb +44 -44
  189. data/lib/solargraph/yard_map/mapper/to_method.rb +130 -129
  190. data/lib/solargraph/yard_map/mapper/to_namespace.rb +31 -30
  191. data/lib/solargraph/yard_map/mapper.rb +79 -79
  192. data/lib/solargraph/yard_map/to_method.rb +89 -88
  193. data/lib/solargraph/yard_tags.rb +20 -20
  194. data/lib/solargraph/yardoc.rb +87 -64
  195. data/lib/solargraph.rb +105 -105
  196. data/rbs/fills/bundler/0/bundler.rbs +4271 -0
  197. data/rbs/fills/open3/0/open3.rbs +172 -0
  198. data/rbs/fills/rubygems/0/basic_specification.rbs +326 -0
  199. data/rbs/fills/rubygems/0/errors.rbs +364 -0
  200. data/rbs/fills/rubygems/0/spec_fetcher.rbs +107 -0
  201. data/rbs/fills/rubygems/0/specification.rbs +1753 -0
  202. data/rbs/shims/ast/0/node.rbs +5 -0
  203. data/rbs/shims/ast/2.4/.rbs_meta.yaml +9 -0
  204. data/rbs/shims/ast/2.4/ast.rbs +73 -0
  205. data/rbs/shims/parser/3.2.0.1/manifest.yaml +7 -0
  206. data/rbs/shims/parser/3.2.0.1/parser.rbs +201 -0
  207. data/rbs/shims/parser/3.2.0.1/polyfill.rbs +4 -0
  208. data/rbs_collection.yaml +4 -4
  209. data/solargraph.gemspec +15 -4
  210. metadata +71 -16
  211. data/lib/solargraph/parser/node_methods.rb +0 -97
  212. /data/rbs/fills/{tuple.rbs → tuple/tuple.rbs} +0 -0
  213. /data/{sig → rbs}/shims/parser/3.2.0.1/builders/default.rbs +0 -0
  214. /data/{sig → rbs}/shims/thor/1.2.0.1/.rbs_meta.yaml +0 -0
  215. /data/{sig → rbs}/shims/thor/1.2.0.1/manifest.yaml +0 -0
  216. /data/{sig → rbs}/shims/thor/1.2.0.1/thor.rbs +0 -0
@@ -1,130 +1,130 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module LanguageServer
5
- class Host
6
- # Methods for associating sources with libraries via URIs.
7
- #
8
- module Dispatch
9
- # @abstract
10
- # @return [Host::Diagnoser]
11
- def diagnoser
12
- raise NotImplementedError, 'Host::Dispatch requires a diagnoser method'
13
- end
14
-
15
- # @return [Sources]
16
- def sources
17
- @sources ||= begin
18
- src = Sources.new
19
- src.add_observer self, :update_libraries
20
- src
21
- end
22
- end
23
-
24
- # @return [::Array<Library>]
25
- def libraries
26
- @libraries ||= []
27
- end
28
-
29
- # The Sources observer callback that merges a source into the host's
30
- # libraries when it gets updated.
31
- #
32
- # @param uri [String]
33
- # @return [void]
34
- def update_libraries uri
35
- src = sources.find(uri)
36
- using = libraries.select { |lib| lib.contain?(src.filename) }
37
- using.push library_for(uri) if using.empty?
38
- using.each { |lib| lib.merge src }
39
- diagnoser.schedule uri
40
- end
41
-
42
- # Find the best libary match for the given URI.
43
- #
44
- # @param uri [String]
45
- # @return [Library]
46
- def library_for uri
47
- result = explicit_library_for(uri) ||
48
- implicit_library_for(uri) ||
49
- generic_library_for(uri)
50
- # previous library for already call attach. avoid call twice
51
- # result.attach sources.find(uri) if sources.include?(uri)
52
- result
53
- end
54
-
55
- # Find an explicit library match for the given URI. An explicit match
56
- # means the libary's workspace includes the file.
57
- #
58
- # If a matching library is found, the source corresponding to the URI
59
- # gets attached to it.
60
- #
61
- # @raise [FileNotFoundError] if the source could not be attached.
62
- #
63
- # @param uri [String]
64
- # @return [Library, nil]
65
- def explicit_library_for uri
66
- filename = UriHelpers.uri_to_file(uri)
67
- libraries.each do |lib|
68
- if lib.contain?(filename)
69
- lib.attach sources.find(uri) if sources.include?(uri)
70
- return lib
71
- end
72
- end
73
- nil
74
- end
75
-
76
- # Find an implicit library match for the given URI. An implicit match
77
- # means the file is located inside the library's workspace directory,
78
- # regardless of whether the workspace is configured to include it.
79
- #
80
- # If a matching library is found, the source corresponding to the URI
81
- # gets attached to it.
82
- #
83
- # @raise [FileNotFoundError] if the source could not be attached.
84
- #
85
- # @param uri [String]
86
- # @return [Library, nil]
87
- def implicit_library_for uri
88
- filename = UriHelpers.uri_to_file(uri)
89
- libraries.each do |lib|
90
- if filename.start_with?(lib.workspace.directory)
91
- lib.attach sources.find(uri)
92
- return lib
93
- end
94
- end
95
- nil
96
- end
97
-
98
- # @return [Hash{String => undefined}]
99
- def options
100
- @options ||= {}.freeze
101
- end
102
-
103
- # Get a generic library for the given URI and attach the corresponding
104
- # source.
105
- #
106
- # @raise [FileNotFoundError] if the source could not be attached.
107
- #
108
- # @param uri [String]
109
- # @return [Library]
110
- def generic_library_for uri
111
- generic_library.attach sources.find(uri)
112
- generic_library
113
- end
114
-
115
- # @return [Library]
116
- def generic_library
117
- @generic_library ||= Solargraph::Library.new(Solargraph::Workspace.new('', nil, options), nil)
118
- .tap { |lib| lib.add_observer self }
119
- end
120
-
121
- # @param library [Solargraph::Library]
122
- # @param progress [Solargraph::LanguageServer::Progress, nil]
123
- # @return [void]
124
- def update progress
125
- progress&.send(self)
126
- end
127
- end
128
- end
129
- end
130
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module LanguageServer
5
+ class Host
6
+ # Methods for associating sources with libraries via URIs.
7
+ #
8
+ module Dispatch
9
+ # @abstract
10
+ # @return [Host::Diagnoser]
11
+ def diagnoser
12
+ raise NotImplementedError, 'Host::Dispatch requires a diagnoser method'
13
+ end
14
+
15
+ # @return [Sources]
16
+ def sources
17
+ @sources ||= begin
18
+ src = Sources.new
19
+ src.add_observer self, :update_libraries
20
+ src
21
+ end
22
+ end
23
+
24
+ # @return [::Array<Library>]
25
+ def libraries
26
+ @libraries ||= []
27
+ end
28
+
29
+ # The Sources observer callback that merges a source into the host's
30
+ # libraries when it gets updated.
31
+ #
32
+ # @param uri [String]
33
+ # @return [void]
34
+ def update_libraries uri
35
+ src = sources.find(uri)
36
+ using = libraries.select { |lib| lib.contain?(src.filename) }
37
+ using.push library_for(uri) if using.empty?
38
+ using.each { |lib| lib.merge src }
39
+ diagnoser.schedule uri
40
+ end
41
+
42
+ # Find the best libary match for the given URI.
43
+ #
44
+ # @param uri [String]
45
+ # @return [Library]
46
+ def library_for uri
47
+ result = explicit_library_for(uri) ||
48
+ implicit_library_for(uri) ||
49
+ generic_library_for(uri)
50
+ # previous library for already call attach. avoid call twice
51
+ # result.attach sources.find(uri) if sources.include?(uri)
52
+ result
53
+ end
54
+
55
+ # Find an explicit library match for the given URI. An explicit match
56
+ # means the libary's workspace includes the file.
57
+ #
58
+ # If a matching library is found, the source corresponding to the URI
59
+ # gets attached to it.
60
+ #
61
+ # @raise [FileNotFoundError] if the source could not be attached.
62
+ #
63
+ # @param uri [String]
64
+ # @return [Library, nil]
65
+ def explicit_library_for uri
66
+ filename = UriHelpers.uri_to_file(uri)
67
+ libraries.each do |lib|
68
+ if lib.contain?(filename)
69
+ lib.attach sources.find(uri) if sources.include?(uri)
70
+ return lib
71
+ end
72
+ end
73
+ nil
74
+ end
75
+
76
+ # Find an implicit library match for the given URI. An implicit match
77
+ # means the file is located inside the library's workspace directory,
78
+ # regardless of whether the workspace is configured to include it.
79
+ #
80
+ # If a matching library is found, the source corresponding to the URI
81
+ # gets attached to it.
82
+ #
83
+ # @raise [FileNotFoundError] if the source could not be attached.
84
+ #
85
+ # @param uri [String]
86
+ # @return [Library, nil]
87
+ def implicit_library_for uri
88
+ filename = UriHelpers.uri_to_file(uri)
89
+ libraries.each do |lib|
90
+ if filename.start_with?(lib.workspace.directory)
91
+ lib.attach sources.find(uri)
92
+ return lib
93
+ end
94
+ end
95
+ nil
96
+ end
97
+
98
+ # @return [Hash{String => undefined}]
99
+ def options
100
+ @options ||= {}.freeze
101
+ end
102
+
103
+ # Get a generic library for the given URI and attach the corresponding
104
+ # source.
105
+ #
106
+ # @raise [FileNotFoundError] if the source could not be attached.
107
+ #
108
+ # @param uri [String]
109
+ # @return [Library]
110
+ def generic_library_for uri
111
+ generic_library.attach sources.find(uri)
112
+ generic_library
113
+ end
114
+
115
+ # @return [Library]
116
+ def generic_library
117
+ @generic_library ||= Solargraph::Library.new(Solargraph::Workspace.new('', nil, options), nil)
118
+ .tap { |lib| lib.add_observer self }
119
+ end
120
+
121
+ # @param library [Solargraph::Library]
122
+ # @param progress [Solargraph::LanguageServer::Progress, nil]
123
+ # @return [void]
124
+ def update progress
125
+ progress&.send(self)
126
+ end
127
+ end
128
+ end
129
+ end
130
+ end
@@ -1,112 +1,112 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module LanguageServer
5
- class Host
6
- # A serial worker Thread to handle incoming messages.
7
- #
8
- class MessageWorker
9
- UPDATE_METHODS = [
10
- 'textDocument/didChange',
11
- 'textDocument/didClose',
12
- 'textDocument/didOpen',
13
- 'textDocument/didSave',
14
- 'workspace/didChangeConfiguration',
15
- 'workspace/didChangeWatchedFiles',
16
- 'workspace/didCreateFiles',
17
- 'workspace/didChangeWorkspaceFolders',
18
- 'workspace/didDeleteFiles',
19
- 'workspace/didRenameFiles'
20
- ].freeze
21
-
22
- # @param host [Host]
23
- def initialize(host)
24
- @host = host
25
- @mutex = Mutex.new
26
- @resource = ConditionVariable.new
27
- @stopped = true
28
- end
29
-
30
- # pending handle messages
31
- # @return [Array<Hash>]
32
- def messages
33
- @messages ||= []
34
- end
35
-
36
- def stopped?
37
- @stopped
38
- end
39
-
40
- # @return [void]
41
- def stop
42
- @stopped = true
43
- end
44
-
45
- # @param message [Hash] The message to handle. Will be forwarded to Host#receive
46
- # @return [void]
47
- def queue(message)
48
- @mutex.synchronize do
49
- messages.push(message)
50
- @resource.signal
51
- end
52
- end
53
-
54
- # @return [void]
55
- def start
56
- return unless @stopped
57
- @stopped = false
58
- Thread.new do
59
- tick until stopped?
60
- end
61
- end
62
-
63
- # @return [void]
64
- def tick
65
- message = @mutex.synchronize do
66
- @resource.wait(@mutex) if messages.empty?
67
- next_message
68
- end
69
- handler = @host.receive(message)
70
- handler&.send_response
71
- end
72
-
73
- private
74
-
75
- # @return [Hash, nil]
76
- def next_message
77
- cancel_message || next_priority
78
- end
79
-
80
- # @return [Hash, nil]
81
- def cancel_message
82
- # Handle cancellations first
83
- idx = messages.find_index { |msg| msg['method'] == '$/cancelRequest' }
84
- return unless idx
85
-
86
- msg = messages[idx]
87
- messages.delete_at idx
88
- msg
89
- end
90
-
91
- # @return [Hash, nil]
92
- def next_priority
93
- # Prioritize updates and version-dependent messages for performance
94
- idx = messages.find_index do |msg|
95
- UPDATE_METHODS.include?(msg['method']) || version_dependent?(msg)
96
- end
97
- idx ? messages.delete_at(idx) : messages.shift
98
- end
99
-
100
- # True if the message requires a previous update to have executed in
101
- # order to work correctly.
102
- #
103
- # @param msg [Hash{String => Object}]
104
- # @todo need boolish type from RBS
105
- # @return [Object]
106
- def version_dependent? msg
107
- msg['textDocument'] && msg['position']
108
- end
109
- end
110
- end
111
- end
112
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module LanguageServer
5
+ class Host
6
+ # A serial worker Thread to handle incoming messages.
7
+ #
8
+ class MessageWorker
9
+ UPDATE_METHODS = [
10
+ 'textDocument/didChange',
11
+ 'textDocument/didClose',
12
+ 'textDocument/didOpen',
13
+ 'textDocument/didSave',
14
+ 'workspace/didChangeConfiguration',
15
+ 'workspace/didChangeWatchedFiles',
16
+ 'workspace/didCreateFiles',
17
+ 'workspace/didChangeWorkspaceFolders',
18
+ 'workspace/didDeleteFiles',
19
+ 'workspace/didRenameFiles'
20
+ ].freeze
21
+
22
+ # @param host [Host]
23
+ def initialize(host)
24
+ @host = host
25
+ @mutex = Mutex.new
26
+ @resource = ConditionVariable.new
27
+ @stopped = true
28
+ end
29
+
30
+ # pending handle messages
31
+ # @return [Array<Hash>]
32
+ def messages
33
+ @messages ||= []
34
+ end
35
+
36
+ def stopped?
37
+ @stopped
38
+ end
39
+
40
+ # @return [void]
41
+ def stop
42
+ @stopped = true
43
+ end
44
+
45
+ # @param message [Hash] The message to handle. Will be forwarded to Host#receive
46
+ # @return [void]
47
+ def queue(message)
48
+ @mutex.synchronize do
49
+ messages.push(message)
50
+ @resource.signal
51
+ end
52
+ end
53
+
54
+ # @return [void]
55
+ def start
56
+ return unless @stopped
57
+ @stopped = false
58
+ Thread.new do
59
+ tick until stopped?
60
+ end
61
+ end
62
+
63
+ # @return [void]
64
+ def tick
65
+ message = @mutex.synchronize do
66
+ @resource.wait(@mutex) if messages.empty?
67
+ next_message
68
+ end
69
+ handler = @host.receive(message)
70
+ handler&.send_response
71
+ end
72
+
73
+ private
74
+
75
+ # @return [Hash, nil]
76
+ def next_message
77
+ cancel_message || next_priority
78
+ end
79
+
80
+ # @return [Hash, nil]
81
+ def cancel_message
82
+ # Handle cancellations first
83
+ idx = messages.find_index { |msg| msg['method'] == '$/cancelRequest' }
84
+ return unless idx
85
+
86
+ msg = messages[idx]
87
+ messages.delete_at idx
88
+ msg
89
+ end
90
+
91
+ # @return [Hash, nil]
92
+ def next_priority
93
+ # Prioritize updates and version-dependent messages for performance
94
+ idx = messages.find_index do |msg|
95
+ UPDATE_METHODS.include?(msg['method']) || version_dependent?(msg)
96
+ end
97
+ idx ? messages.delete_at(idx) : messages.shift
98
+ end
99
+
100
+ # True if the message requires a previous update to have executed in
101
+ # order to work correctly.
102
+ #
103
+ # @param msg [Hash{String => Object}]
104
+ # @todo need boolish type from RBS
105
+ # @return [Object]
106
+ def version_dependent? msg
107
+ msg['textDocument'] && msg['position']
108
+ end
109
+ end
110
+ end
111
+ end
112
+ end
@@ -1,99 +1,99 @@
1
- # frozen_string_literal: true
2
-
3
- require 'observer'
4
-
5
- module Solargraph
6
- module LanguageServer
7
- class Host
8
- # A Host class for managing sources.
9
- #
10
- class Sources
11
- include Observable
12
- include UriHelpers
13
-
14
- # @param uri [String]
15
- # @return [void]
16
- def add_uri(uri)
17
- queue.push(uri)
18
- end
19
-
20
- # Open a source.
21
- #
22
- # @param uri [String]
23
- # @param text [String]
24
- # @param version [Integer]
25
- # @return [Source]
26
- def open uri, text, version
27
- filename = uri_to_file(uri)
28
- source = Solargraph::Source.new(text, filename, version)
29
- open_source_hash[uri] = source
30
- end
31
-
32
- # @param uri [String]
33
- # @return [void]
34
- def open_from_disk uri
35
- source = Solargraph::Source.load(UriHelpers.uri_to_file(uri))
36
- open_source_hash[uri] = source
37
- end
38
-
39
- # Update an existing source.
40
- #
41
- # @raise [FileNotFoundError] if the URI does not match an open source.
42
- #
43
- # @param uri [String]
44
- # @param updater [Source::Updater]
45
- # @return [void]
46
- def update uri, updater
47
- src = find(uri)
48
- open_source_hash[uri] = src.synchronize(updater)
49
- changed
50
- notify_observers uri
51
- end
52
-
53
- # Find the source with the given URI.
54
- #
55
- # @raise [FileNotFoundError] if the URI does not match an open source.
56
- #
57
- # @param uri [String]
58
- # @return [Solargraph::Source]
59
- def find uri
60
- open_source_hash[uri] || raise(Solargraph::FileNotFoundError, "Host could not find #{uri}")
61
- end
62
-
63
- # Close the source with the given URI.
64
- #
65
- # @param uri [String]
66
- # @return [void]
67
- def close uri
68
- open_source_hash.delete uri
69
- end
70
-
71
- # True if a source with given URI is currently open.
72
- # @param uri [String]
73
- # @return [Boolean]
74
- def include? uri
75
- open_source_hash.key? uri
76
- end
77
-
78
- # @return [void]
79
- def clear
80
- open_source_hash.clear
81
- end
82
-
83
- private
84
-
85
- # @return [Hash{String => Solargraph::Source}]
86
- def open_source_hash
87
- @open_source_hash ||= {}
88
- end
89
-
90
- # An array of source URIs that are waiting to finish synchronizing.
91
- #
92
- # @return [::Array<String>]
93
- def queue
94
- @queue ||= []
95
- end
96
- end
97
- end
98
- end
99
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'observer'
4
+
5
+ module Solargraph
6
+ module LanguageServer
7
+ class Host
8
+ # A Host class for managing sources.
9
+ #
10
+ class Sources
11
+ include Observable
12
+ include UriHelpers
13
+
14
+ # @param uri [String]
15
+ # @return [void]
16
+ def add_uri(uri)
17
+ queue.push(uri)
18
+ end
19
+
20
+ # Open a source.
21
+ #
22
+ # @param uri [String]
23
+ # @param text [String]
24
+ # @param version [Integer]
25
+ # @return [Source]
26
+ def open uri, text, version
27
+ filename = uri_to_file(uri)
28
+ source = Solargraph::Source.new(text, filename, version)
29
+ open_source_hash[uri] = source
30
+ end
31
+
32
+ # @param uri [String]
33
+ # @return [void]
34
+ def open_from_disk uri
35
+ source = Solargraph::Source.load(UriHelpers.uri_to_file(uri))
36
+ open_source_hash[uri] = source
37
+ end
38
+
39
+ # Update an existing source.
40
+ #
41
+ # @raise [FileNotFoundError] if the URI does not match an open source.
42
+ #
43
+ # @param uri [String]
44
+ # @param updater [Source::Updater]
45
+ # @return [void]
46
+ def update uri, updater
47
+ src = find(uri)
48
+ open_source_hash[uri] = src.synchronize(updater)
49
+ changed
50
+ notify_observers uri
51
+ end
52
+
53
+ # Find the source with the given URI.
54
+ #
55
+ # @raise [FileNotFoundError] if the URI does not match an open source.
56
+ #
57
+ # @param uri [String]
58
+ # @return [Solargraph::Source]
59
+ def find uri
60
+ open_source_hash[uri] || raise(Solargraph::FileNotFoundError, "Host could not find #{uri}")
61
+ end
62
+
63
+ # Close the source with the given URI.
64
+ #
65
+ # @param uri [String]
66
+ # @return [void]
67
+ def close uri
68
+ open_source_hash.delete uri
69
+ end
70
+
71
+ # True if a source with given URI is currently open.
72
+ # @param uri [String]
73
+ # @return [Boolean]
74
+ def include? uri
75
+ open_source_hash.key? uri
76
+ end
77
+
78
+ # @return [void]
79
+ def clear
80
+ open_source_hash.clear
81
+ end
82
+
83
+ private
84
+
85
+ # @return [Hash{String => Solargraph::Source}]
86
+ def open_source_hash
87
+ @open_source_hash ||= {}
88
+ end
89
+
90
+ # An array of source URIs that are waiting to finish synchronizing.
91
+ #
92
+ # @return [::Array<String>]
93
+ def queue
94
+ @queue ||= []
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end