solargraph 0.54.4 → 0.58.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (209) hide show
  1. checksums.yaml +4 -4
  2. data/.gitattributes +2 -0
  3. data/.github/workflows/linting.yml +127 -0
  4. data/.github/workflows/plugins.yml +184 -6
  5. data/.github/workflows/rspec.yml +55 -5
  6. data/.github/workflows/typecheck.yml +8 -3
  7. data/.gitignore +8 -0
  8. data/.overcommit.yml +72 -0
  9. data/.rspec +1 -0
  10. data/.rubocop.yml +66 -0
  11. data/.rubocop_todo.yml +1279 -0
  12. data/.yardopts +1 -0
  13. data/CHANGELOG.md +140 -0
  14. data/README.md +20 -6
  15. data/Rakefile +125 -13
  16. data/bin/solargraph +3 -0
  17. data/lib/solargraph/api_map/cache.rb +110 -109
  18. data/lib/solargraph/api_map/constants.rb +279 -0
  19. data/lib/solargraph/api_map/index.rb +193 -167
  20. data/lib/solargraph/api_map/source_to_yard.rb +97 -88
  21. data/lib/solargraph/api_map/store.rb +384 -241
  22. data/lib/solargraph/api_map.rb +945 -875
  23. data/lib/solargraph/bench.rb +18 -1
  24. data/lib/solargraph/complex_type/type_methods.rb +228 -217
  25. data/lib/solargraph/complex_type/unique_type.rb +482 -386
  26. data/lib/solargraph/complex_type.rb +444 -394
  27. data/lib/solargraph/convention/active_support_concern.rb +111 -0
  28. data/lib/solargraph/convention/base.rb +20 -3
  29. data/lib/solargraph/convention/data_definition/data_assignment_node.rb +61 -0
  30. data/lib/solargraph/convention/data_definition/data_definition_node.rb +91 -0
  31. data/lib/solargraph/convention/data_definition.rb +105 -0
  32. data/lib/solargraph/convention/gemspec.rb +3 -2
  33. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +61 -0
  34. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +102 -0
  35. data/lib/solargraph/convention/struct_definition.rb +164 -0
  36. data/lib/solargraph/convention.rb +35 -4
  37. data/lib/solargraph/diagnostics/require_not_found.rb +53 -53
  38. data/lib/solargraph/diagnostics/rubocop.rb +118 -113
  39. data/lib/solargraph/diagnostics/rubocop_helpers.rb +68 -66
  40. data/lib/solargraph/diagnostics/type_check.rb +55 -55
  41. data/lib/solargraph/doc_map.rb +439 -188
  42. data/lib/solargraph/environ.rb +9 -2
  43. data/lib/solargraph/equality.rb +34 -33
  44. data/lib/solargraph/gem_pins.rb +98 -72
  45. data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
  46. data/lib/solargraph/language_server/host/dispatch.rb +130 -128
  47. data/lib/solargraph/language_server/host/message_worker.rb +112 -106
  48. data/lib/solargraph/language_server/host/sources.rb +99 -99
  49. data/lib/solargraph/language_server/host.rb +878 -861
  50. data/lib/solargraph/language_server/message/base.rb +2 -1
  51. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +114 -112
  52. data/lib/solargraph/language_server/message/extended/document.rb +23 -20
  53. data/lib/solargraph/language_server/message/extended/document_gems.rb +3 -3
  54. data/lib/solargraph/language_server/message/text_document/completion.rb +56 -56
  55. data/lib/solargraph/language_server/message/text_document/definition.rb +40 -38
  56. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +26 -26
  57. data/lib/solargraph/language_server/message/text_document/formatting.rb +148 -131
  58. data/lib/solargraph/language_server/message/text_document/hover.rb +58 -58
  59. data/lib/solargraph/language_server/message/text_document/signature_help.rb +24 -24
  60. data/lib/solargraph/language_server/message/text_document/type_definition.rb +25 -24
  61. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +2 -0
  62. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +23 -23
  63. data/lib/solargraph/language_server/progress.rb +8 -0
  64. data/lib/solargraph/language_server/request.rb +4 -1
  65. data/lib/solargraph/library.rb +683 -662
  66. data/lib/solargraph/location.rb +82 -58
  67. data/lib/solargraph/logging.rb +37 -27
  68. data/lib/solargraph/page.rb +3 -0
  69. data/lib/solargraph/parser/comment_ripper.rb +69 -56
  70. data/lib/solargraph/parser/flow_sensitive_typing.rb +255 -0
  71. data/lib/solargraph/parser/node_processor/base.rb +92 -87
  72. data/lib/solargraph/parser/node_processor.rb +62 -45
  73. data/lib/solargraph/parser/parser_gem/class_methods.rb +149 -157
  74. data/lib/solargraph/parser/parser_gem/flawed_builder.rb +1 -0
  75. data/lib/solargraph/parser/parser_gem/node_chainer.rb +166 -164
  76. data/lib/solargraph/parser/parser_gem/node_methods.rb +486 -495
  77. data/lib/solargraph/parser/parser_gem/node_processors/alias_node.rb +2 -1
  78. data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +22 -0
  79. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +59 -57
  80. data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +15 -15
  81. data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +46 -43
  82. data/lib/solargraph/parser/parser_gem/node_processors/casgn_node.rb +2 -1
  83. data/lib/solargraph/parser/parser_gem/node_processors/cvasgn_node.rb +2 -1
  84. data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +53 -50
  85. data/lib/solargraph/parser/parser_gem/node_processors/defs_node.rb +2 -1
  86. data/lib/solargraph/parser/parser_gem/node_processors/gvasgn_node.rb +2 -1
  87. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +23 -0
  88. data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +40 -38
  89. data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +29 -28
  90. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +59 -53
  91. data/lib/solargraph/parser/parser_gem/node_processors/namespace_node.rb +8 -7
  92. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +98 -0
  93. data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +17 -16
  94. data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +38 -36
  95. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +52 -42
  96. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +291 -259
  97. data/lib/solargraph/parser/parser_gem/node_processors/sym_node.rb +3 -1
  98. data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +29 -0
  99. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +29 -0
  100. data/lib/solargraph/parser/parser_gem/node_processors.rb +70 -56
  101. data/lib/solargraph/parser/region.rb +69 -66
  102. data/lib/solargraph/parser/snippet.rb +17 -15
  103. data/lib/solargraph/parser.rb +1 -0
  104. data/lib/solargraph/pin/base.rb +729 -378
  105. data/lib/solargraph/pin/base_variable.rb +126 -118
  106. data/lib/solargraph/pin/block.rb +104 -101
  107. data/lib/solargraph/pin/breakable.rb +9 -0
  108. data/lib/solargraph/pin/callable.rb +231 -147
  109. data/lib/solargraph/pin/closure.rb +72 -57
  110. data/lib/solargraph/pin/common.rb +79 -70
  111. data/lib/solargraph/pin/constant.rb +2 -0
  112. data/lib/solargraph/pin/conversions.rb +123 -123
  113. data/lib/solargraph/pin/delegated_method.rb +120 -101
  114. data/lib/solargraph/pin/documenting.rb +114 -98
  115. data/lib/solargraph/pin/instance_variable.rb +34 -34
  116. data/lib/solargraph/pin/keyword.rb +20 -15
  117. data/lib/solargraph/pin/local_variable.rb +75 -67
  118. data/lib/solargraph/pin/method.rb +672 -527
  119. data/lib/solargraph/pin/method_alias.rb +34 -31
  120. data/lib/solargraph/pin/namespace.rb +115 -107
  121. data/lib/solargraph/pin/parameter.rb +275 -212
  122. data/lib/solargraph/pin/proxy_type.rb +39 -29
  123. data/lib/solargraph/pin/reference/override.rb +47 -29
  124. data/lib/solargraph/pin/reference/require.rb +2 -2
  125. data/lib/solargraph/pin/reference/superclass.rb +15 -10
  126. data/lib/solargraph/pin/reference.rb +39 -22
  127. data/lib/solargraph/pin/search.rb +61 -56
  128. data/lib/solargraph/pin/signature.rb +61 -17
  129. data/lib/solargraph/pin/singleton.rb +1 -1
  130. data/lib/solargraph/pin/symbol.rb +53 -47
  131. data/lib/solargraph/pin/until.rb +18 -0
  132. data/lib/solargraph/pin/while.rb +18 -0
  133. data/lib/solargraph/pin.rb +44 -41
  134. data/lib/solargraph/pin_cache.rb +245 -0
  135. data/lib/solargraph/position.rb +132 -107
  136. data/lib/solargraph/range.rb +112 -98
  137. data/lib/solargraph/rbs_map/conversions.rb +823 -646
  138. data/lib/solargraph/rbs_map/core_fills.rb +50 -16
  139. data/lib/solargraph/rbs_map/core_map.rb +58 -28
  140. data/lib/solargraph/rbs_map/stdlib_map.rb +43 -33
  141. data/lib/solargraph/rbs_map.rb +163 -93
  142. data/lib/solargraph/shell.rb +352 -269
  143. data/lib/solargraph/source/chain/array.rb +11 -7
  144. data/lib/solargraph/source/chain/block_symbol.rb +1 -1
  145. data/lib/solargraph/source/chain/block_variable.rb +1 -1
  146. data/lib/solargraph/source/chain/call.rb +337 -303
  147. data/lib/solargraph/source/chain/constant.rb +26 -89
  148. data/lib/solargraph/source/chain/hash.rb +34 -33
  149. data/lib/solargraph/source/chain/head.rb +1 -1
  150. data/lib/solargraph/source/chain/if.rb +28 -28
  151. data/lib/solargraph/source/chain/instance_variable.rb +13 -13
  152. data/lib/solargraph/source/chain/link.rb +13 -2
  153. data/lib/solargraph/source/chain/literal.rb +48 -28
  154. data/lib/solargraph/source/chain/or.rb +23 -23
  155. data/lib/solargraph/source/chain/z_super.rb +1 -1
  156. data/lib/solargraph/source/chain.rb +291 -252
  157. data/lib/solargraph/source/change.rb +82 -82
  158. data/lib/solargraph/source/cursor.rb +166 -167
  159. data/lib/solargraph/source/encoding_fixes.rb +23 -23
  160. data/lib/solargraph/source/source_chainer.rb +194 -194
  161. data/lib/solargraph/source/updater.rb +55 -55
  162. data/lib/solargraph/source.rb +498 -495
  163. data/lib/solargraph/source_map/clip.rb +226 -232
  164. data/lib/solargraph/source_map/data.rb +34 -30
  165. data/lib/solargraph/source_map/mapper.rb +259 -255
  166. data/lib/solargraph/source_map.rb +212 -217
  167. data/lib/solargraph/type_checker/checks.rb +124 -120
  168. data/lib/solargraph/type_checker/param_def.rb +37 -35
  169. data/lib/solargraph/type_checker/problem.rb +32 -32
  170. data/lib/solargraph/type_checker/rules.rb +84 -62
  171. data/lib/solargraph/type_checker.rb +814 -672
  172. data/lib/solargraph/version.rb +5 -5
  173. data/lib/solargraph/views/_method.erb +10 -10
  174. data/lib/solargraph/views/_namespace.erb +3 -3
  175. data/lib/solargraph/views/document.erb +10 -10
  176. data/lib/solargraph/workspace/config.rb +255 -239
  177. data/lib/solargraph/workspace/require_paths.rb +97 -0
  178. data/lib/solargraph/workspace.rb +220 -239
  179. data/lib/solargraph/yard_map/helpers.rb +44 -16
  180. data/lib/solargraph/yard_map/mapper/to_constant.rb +7 -5
  181. data/lib/solargraph/yard_map/mapper/to_method.rb +130 -94
  182. data/lib/solargraph/yard_map/mapper/to_namespace.rb +31 -28
  183. data/lib/solargraph/yard_map/mapper.rb +79 -78
  184. data/lib/solargraph/yard_map/to_method.rb +89 -86
  185. data/lib/solargraph/yardoc.rb +87 -52
  186. data/lib/solargraph.rb +105 -72
  187. data/rbs/fills/bundler/0/bundler.rbs +4271 -0
  188. data/rbs/fills/open3/0/open3.rbs +172 -0
  189. data/rbs/fills/rubygems/0/basic_specification.rbs +326 -0
  190. data/rbs/fills/rubygems/0/errors.rbs +364 -0
  191. data/rbs/fills/rubygems/0/spec_fetcher.rbs +107 -0
  192. data/rbs/fills/rubygems/0/specification.rbs +1753 -0
  193. data/rbs/fills/tuple/tuple.rbs +149 -0
  194. data/rbs/shims/ast/0/node.rbs +5 -0
  195. data/rbs/shims/ast/2.4/.rbs_meta.yaml +9 -0
  196. data/rbs/shims/ast/2.4/ast.rbs +73 -0
  197. data/rbs/shims/parser/3.2.0.1/builders/default.rbs +195 -0
  198. data/rbs/shims/parser/3.2.0.1/manifest.yaml +7 -0
  199. data/rbs/shims/parser/3.2.0.1/parser.rbs +201 -0
  200. data/rbs/shims/parser/3.2.0.1/polyfill.rbs +4 -0
  201. data/rbs/shims/thor/1.2.0.1/.rbs_meta.yaml +9 -0
  202. data/rbs/shims/thor/1.2.0.1/manifest.yaml +7 -0
  203. data/rbs/shims/thor/1.2.0.1/thor.rbs +17 -0
  204. data/rbs_collection.yaml +19 -0
  205. data/solargraph.gemspec +27 -5
  206. metadata +215 -18
  207. data/lib/.rubocop.yml +0 -22
  208. data/lib/solargraph/cache.rb +0 -77
  209. data/lib/solargraph/parser/node_methods.rb +0 -83
@@ -1,106 +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/didOpen',
11
- 'textDocument/didChange',
12
- 'workspace/didChangeWatchedFiles'
13
- ].freeze
14
-
15
- # @param host [Host]
16
- def initialize(host)
17
- @host = host
18
- @mutex = Mutex.new
19
- @resource = ConditionVariable.new
20
- @stopped = true
21
- end
22
-
23
- # pending handle messages
24
- # @return [Array<Hash>]
25
- def messages
26
- @messages ||= []
27
- end
28
-
29
- def stopped?
30
- @stopped
31
- end
32
-
33
- # @return [void]
34
- def stop
35
- @stopped = true
36
- end
37
-
38
- # @param message [Hash] The message to handle. Will be forwarded to Host#receive
39
- # @return [void]
40
- def queue(message)
41
- @mutex.synchronize do
42
- messages.push(message)
43
- @resource.signal
44
- end
45
- end
46
-
47
- # @return [void]
48
- def start
49
- return unless @stopped
50
- @stopped = false
51
- Thread.new do
52
- tick until stopped?
53
- end
54
- end
55
-
56
- # @return [void]
57
- def tick
58
- message = @mutex.synchronize do
59
- @resource.wait(@mutex) if messages.empty?
60
- next_message
61
- end
62
- handler = @host.receive(message)
63
- handler&.send_response
64
- end
65
-
66
- private
67
-
68
- def next_message
69
- cancel_message || next_priority
70
- end
71
-
72
- def cancel_message
73
- # Handle cancellations first
74
- idx = messages.find_index { |msg| msg['method'] == '$/cancelRequest' }
75
- return unless idx
76
-
77
- msg = messages[idx]
78
- messages.delete_at idx
79
- msg
80
- end
81
-
82
- def next_priority
83
- # Prioritize updates and version-dependent messages for performance
84
- idx = messages.find_index do |msg|
85
- UPDATE_METHODS.include?(msg['method']) || version_dependent?(msg)
86
- end
87
- return messages.shift unless idx
88
-
89
- msg = messages[idx]
90
- messages.delete_at idx
91
- msg
92
- end
93
-
94
- # True if the message requires a previous update to have executed in
95
- # order to work correctly.
96
- #
97
- # @param msg [Hash{String => Object}]
98
- # @todo need boolish type from RBS
99
- # @return [Object]
100
- def version_dependent? msg
101
- msg['textDocument'] && msg['position']
102
- end
103
- end
104
- end
105
- end
106
- 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