yoda-language-server 0.7.2 → 0.10.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 (405) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/test.yml +23 -0
  3. data/.gitignore +1 -1
  4. data/.rspec +1 -0
  5. data/CHANGELOG.md +14 -0
  6. data/Gemfile +2 -0
  7. data/README.md +23 -11
  8. data/Rakefile +32 -0
  9. data/bin/bench +12 -0
  10. data/bin/local +7 -0
  11. data/client/atom/.gitignore +1 -0
  12. data/{package.json → client/atom/package.json} +1 -1
  13. data/{yarn.lock → client/atom/yarn.lock} +0 -0
  14. data/client/vscode/.gitignore +1 -1
  15. data/client/vscode/.vscode/launch.json +0 -11
  16. data/client/vscode/.vscode/settings.json +5 -1
  17. data/client/vscode/LICENSE.txt +21 -0
  18. data/client/vscode/README.md +4 -55
  19. data/client/vscode/package-lock.json +4299 -1373
  20. data/client/vscode/package.json +40 -15
  21. data/client/vscode/src/check-versions.ts +49 -0
  22. data/client/vscode/src/config.ts +20 -0
  23. data/client/vscode/src/extension.ts +12 -27
  24. data/client/vscode/src/install-tools.ts +109 -0
  25. data/client/vscode/src/language-server.ts +59 -0
  26. data/client/vscode/src/status.ts +3 -0
  27. data/client/vscode/src/test/runTest.ts +30 -0
  28. data/client/vscode/src/test/{completion.test.ts → suite/completion.test.ts} +2 -1
  29. data/client/vscode/src/test/suite/hover.test.ts +31 -0
  30. data/client/vscode/src/test/suite/index.ts +26 -0
  31. data/client/vscode/src/utils.ts +11 -0
  32. data/client/vscode/tsconfig.json +4 -1
  33. data/exe/yoda +1 -1
  34. data/lib/yoda/ast/array_node.rb +10 -0
  35. data/lib/yoda/ast/assignment_node.rb +15 -0
  36. data/lib/yoda/ast/block_call_node.rb +20 -0
  37. data/lib/yoda/ast/block_node.rb +10 -0
  38. data/lib/yoda/ast/case_node.rb +20 -0
  39. data/lib/yoda/ast/center_operator_node.rb +20 -0
  40. data/lib/yoda/ast/class_node.rb +22 -0
  41. data/lib/yoda/ast/comment_block/base_part.rb +12 -0
  42. data/lib/yoda/ast/comment_block/range_calculation.rb +58 -0
  43. data/lib/yoda/ast/comment_block/tag_part.rb +88 -0
  44. data/lib/yoda/ast/comment_block/tag_text_name_part.rb +35 -0
  45. data/lib/yoda/ast/comment_block/tag_text_type_part.rb +52 -0
  46. data/lib/yoda/ast/comment_block/text_part.rb +28 -0
  47. data/lib/yoda/ast/comment_block/token.rb +44 -0
  48. data/lib/yoda/ast/comment_block.rb +119 -0
  49. data/lib/yoda/ast/conditional_loop_node.rb +15 -0
  50. data/lib/yoda/ast/constant_assignment_node.rb +20 -0
  51. data/lib/yoda/ast/constant_base_node.rb +42 -0
  52. data/lib/yoda/ast/constant_node.rb +53 -0
  53. data/lib/yoda/ast/def_node.rb +27 -0
  54. data/lib/yoda/ast/def_singleton_node.rb +32 -0
  55. data/lib/yoda/ast/empty_vnode.rb +24 -0
  56. data/lib/yoda/ast/ensure_node.rb +15 -0
  57. data/lib/yoda/ast/for_node.rb +20 -0
  58. data/lib/yoda/ast/hash_node.rb +10 -0
  59. data/lib/yoda/ast/if_node.rb +20 -0
  60. data/lib/yoda/ast/interpolation_text_node.rb +10 -0
  61. data/lib/yoda/ast/kwsplat_node.rb +10 -0
  62. data/lib/yoda/ast/left_operator_node.rb +15 -0
  63. data/lib/yoda/ast/literal_node.rb +18 -0
  64. data/lib/yoda/ast/method_traversable.rb +22 -0
  65. data/lib/yoda/ast/module_node.rb +17 -0
  66. data/lib/yoda/ast/multiple_left_hand_side_node.rb +31 -0
  67. data/lib/yoda/ast/name_vnode.rb +28 -0
  68. data/lib/yoda/ast/namespace.rb +36 -0
  69. data/lib/yoda/ast/namespace_traversable.rb +39 -0
  70. data/lib/yoda/ast/node.rb +52 -0
  71. data/lib/yoda/ast/optional_parameter_node.rb +20 -0
  72. data/lib/yoda/ast/pair_node.rb +15 -0
  73. data/lib/yoda/ast/parameter_node.rb +25 -0
  74. data/lib/yoda/ast/parameters_node.rb +62 -0
  75. data/lib/yoda/ast/rescue_clause_node.rb +20 -0
  76. data/lib/yoda/ast/rescue_node.rb +20 -0
  77. data/lib/yoda/ast/root_vnode.rb +48 -0
  78. data/lib/yoda/ast/send_node.rb +100 -0
  79. data/lib/yoda/ast/singleton_class_node.rb +17 -0
  80. data/lib/yoda/ast/special_call_node.rb +10 -0
  81. data/lib/yoda/ast/traversable.rb +34 -0
  82. data/lib/yoda/ast/value_vnode.rb +28 -0
  83. data/lib/yoda/ast/variable_node.rb +15 -0
  84. data/lib/yoda/ast/vnode.rb +170 -0
  85. data/lib/yoda/ast/when_node.rb +15 -0
  86. data/lib/yoda/ast.rb +140 -0
  87. data/lib/yoda/cli/analyze_deps.rb +123 -0
  88. data/lib/yoda/{commands → cli}/base.rb +1 -1
  89. data/lib/yoda/{commands → cli}/complete.rb +12 -9
  90. data/lib/yoda/cli/console.rb +17 -0
  91. data/lib/yoda/{commands → cli}/file_cursor_parsable.rb +1 -1
  92. data/lib/yoda/{commands → cli}/infer.rb +4 -4
  93. data/lib/yoda/cli.rb +117 -0
  94. data/lib/yoda/has_services.rb +40 -0
  95. data/lib/yoda/id_mask.rb +84 -0
  96. data/lib/yoda/instrument.rb +21 -5
  97. data/lib/yoda/logger.rb +4 -2
  98. data/lib/yoda/missing_delegatable.rb +34 -0
  99. data/lib/yoda/model/completion_item.rb +43 -11
  100. data/lib/yoda/model/descriptions/base.rb +11 -0
  101. data/lib/yoda/model/descriptions/comment_token_description.rb +46 -0
  102. data/lib/yoda/model/descriptions/function_description.rb +19 -2
  103. data/lib/yoda/model/descriptions/node_description.rb +19 -8
  104. data/lib/yoda/model/descriptions/require_path_description.rb +45 -0
  105. data/lib/yoda/model/descriptions/variable_description.rb +41 -0
  106. data/lib/yoda/model/descriptions.rb +3 -0
  107. data/lib/yoda/model/environment/accessor_interface.rb +43 -0
  108. data/lib/yoda/model/environment/instance_accessor.rb +121 -0
  109. data/lib/yoda/model/environment/namespace_members.rb +104 -0
  110. data/lib/yoda/model/environment/singleton_accessor.rb +66 -0
  111. data/lib/yoda/model/environment/value_factory.rb +151 -0
  112. data/lib/yoda/model/environment/value_resolve_context.rb +62 -0
  113. data/lib/yoda/model/environment/with_cache.rb +14 -0
  114. data/lib/yoda/model/environment.rb +122 -0
  115. data/lib/yoda/model/function_signatures/base.rb +22 -2
  116. data/lib/yoda/model/function_signatures/constructor.rb +17 -1
  117. data/lib/yoda/model/function_signatures/method.rb +18 -2
  118. data/lib/yoda/model/function_signatures/overload.rb +17 -1
  119. data/lib/yoda/model/function_signatures/parameter_list.rb +17 -0
  120. data/lib/yoda/model/function_signatures/rbs_method.rb +91 -0
  121. data/lib/yoda/model/function_signatures/type_builder.rb +63 -31
  122. data/lib/yoda/model/function_signatures/wrapper.rb +46 -0
  123. data/lib/yoda/model/function_signatures.rb +2 -0
  124. data/lib/yoda/model/lexical_context.rb +40 -0
  125. data/lib/yoda/model/node_signatures/base.rb +42 -0
  126. data/lib/yoda/model/node_signatures/const.rb +20 -0
  127. data/lib/yoda/model/node_signatures/method_definition.rb +20 -0
  128. data/lib/yoda/model/node_signatures/node.rb +19 -0
  129. data/lib/yoda/model/node_signatures/send.rb +20 -0
  130. data/lib/yoda/model/node_signatures.rb +35 -0
  131. data/lib/yoda/model/parameters/base.rb +14 -0
  132. data/lib/yoda/model/parameters/binder.rb +148 -0
  133. data/lib/yoda/model/parameters/multiple.rb +36 -0
  134. data/lib/yoda/model/parameters/named.rb +20 -0
  135. data/lib/yoda/model/parameters/unnamed.rb +12 -0
  136. data/lib/yoda/model/parameters.rb +11 -0
  137. data/lib/yoda/model/path.rb +16 -0
  138. data/lib/yoda/model/primary_source_inferencer.rb +34 -0
  139. data/lib/yoda/model/scoped_path.rb +13 -2
  140. data/lib/yoda/model/{types → type_expressions}/any_type.rb +7 -3
  141. data/lib/yoda/model/{types → type_expressions}/base.rb +10 -3
  142. data/lib/yoda/model/{types → type_expressions}/duck_type.rb +8 -2
  143. data/lib/yoda/model/type_expressions/function_type/parameter.rb +95 -0
  144. data/lib/yoda/model/{types → type_expressions}/function_type.rb +61 -70
  145. data/lib/yoda/model/type_expressions/generator.rb +28 -0
  146. data/lib/yoda/model/{types → type_expressions}/generic_type.rb +17 -2
  147. data/lib/yoda/model/{types → type_expressions}/instance_type.rb +10 -2
  148. data/lib/yoda/model/{types → type_expressions}/module_type.rb +7 -1
  149. data/lib/yoda/model/type_expressions/self_type.rb +38 -0
  150. data/lib/yoda/model/{types → type_expressions}/sequence_type.rb +6 -1
  151. data/lib/yoda/model/{types → type_expressions}/union_type.rb +7 -3
  152. data/lib/yoda/model/{types → type_expressions}/unknown_type.rb +6 -1
  153. data/lib/yoda/model/{types → type_expressions}/value_type.rb +17 -1
  154. data/lib/yoda/model/type_expressions/void_type.rb +37 -0
  155. data/lib/yoda/model/type_expressions.rb +40 -0
  156. data/lib/yoda/model/values/base.rb +23 -8
  157. data/lib/yoda/model/values/empty_value.rb +39 -0
  158. data/lib/yoda/model/values/instance_value.rb +24 -43
  159. data/lib/yoda/model/values/intersection_value.rb +48 -0
  160. data/lib/yoda/model/values/literal_value.rb +26 -0
  161. data/lib/yoda/model/values/union_value.rb +50 -0
  162. data/lib/yoda/model/values.rb +5 -1
  163. data/lib/yoda/model/yard_type_parser.rb +35 -0
  164. data/lib/yoda/model.rb +7 -2
  165. data/lib/yoda/parsing/comment_tokenizer.rb +21 -4
  166. data/lib/yoda/parsing/location.rb +9 -0
  167. data/lib/yoda/parsing/node_objects/args_node.rb +85 -0
  168. data/lib/yoda/parsing/node_objects/const_node.rb +3 -3
  169. data/lib/yoda/parsing/node_objects/mlhs_node.rb +31 -0
  170. data/lib/yoda/parsing/node_objects.rb +2 -0
  171. data/lib/yoda/parsing/parser.rb +44 -5
  172. data/lib/yoda/parsing/query/current_comment_token_query.rb +4 -3
  173. data/lib/yoda/parsing/query/current_commenting_node_query.rb +7 -7
  174. data/lib/yoda/parsing/scopes/base.rb +1 -1
  175. data/lib/yoda/parsing/scopes/builder.rb +1 -1
  176. data/lib/yoda/parsing/source_cutter.rb +6 -2
  177. data/lib/yoda/parsing/traverser/matcher.rb +65 -0
  178. data/lib/yoda/parsing/traverser/query_interface.rb +68 -0
  179. data/lib/yoda/parsing/traverser/result_set.rb +37 -0
  180. data/lib/yoda/parsing/traverser.rb +29 -0
  181. data/lib/yoda/parsing/type_parser.rb +24 -20
  182. data/lib/yoda/parsing.rb +27 -1
  183. data/lib/yoda/presentation/code_completion/constant.rb +27 -0
  184. data/lib/yoda/server/concurrent_writer.rb +1 -1
  185. data/lib/yoda/server/lifecycle_handler.rb +125 -25
  186. data/lib/yoda/server/notifier.rb +79 -1
  187. data/lib/yoda/server/providers/completion.rb +31 -17
  188. data/lib/yoda/server/providers/definition.rb +38 -10
  189. data/lib/yoda/server/providers/hover.rb +26 -10
  190. data/lib/yoda/server/providers/reportable_progress.rb +75 -0
  191. data/lib/yoda/server/providers/signature.rb +20 -7
  192. data/lib/yoda/server/providers/text_document_did_change.rb +1 -1
  193. data/lib/yoda/server/providers/text_document_did_open.rb +1 -1
  194. data/lib/yoda/server/providers/with_timeout.rb +36 -0
  195. data/lib/yoda/server/providers/workspace_did_change_workspace_folders.rb +33 -0
  196. data/lib/yoda/server/providers/workspace_did_create_files.rb +21 -0
  197. data/lib/yoda/server/providers/workspace_did_delete_files.rb +21 -0
  198. data/lib/yoda/server/providers/workspace_did_rename_files.rb +22 -0
  199. data/lib/yoda/server/providers/workspace_symbol.rb +82 -0
  200. data/lib/yoda/server/providers.rb +12 -0
  201. data/lib/yoda/server/root_handler.rb +27 -23
  202. data/lib/yoda/server/rootless_workspace.rb +62 -0
  203. data/lib/yoda/server/scheduler.rb +50 -0
  204. data/lib/yoda/server/session.rb +71 -25
  205. data/lib/yoda/server/uri_decoder.rb +16 -0
  206. data/lib/yoda/server/workspace.rb +117 -0
  207. data/lib/yoda/server.rb +9 -2
  208. data/lib/yoda/services/code_completion/base_provider.rb +52 -0
  209. data/lib/yoda/{evaluation → services}/code_completion/const_provider.rb +35 -25
  210. data/lib/yoda/services/code_completion/keyword_provider.rb +67 -0
  211. data/lib/yoda/services/code_completion/local_variable_provider.rb +51 -0
  212. data/lib/yoda/{evaluation → services}/code_completion/method_provider.rb +14 -32
  213. data/lib/yoda/services/code_completion.rb +74 -0
  214. data/lib/yoda/{evaluation → services}/comment_completion/base_provider.rb +11 -6
  215. data/lib/yoda/{evaluation → services}/comment_completion/param_provider.rb +1 -1
  216. data/lib/yoda/{evaluation → services}/comment_completion/tag_provider.rb +1 -1
  217. data/lib/yoda/{evaluation → services}/comment_completion/type_provider.rb +6 -5
  218. data/lib/yoda/{evaluation → services}/comment_completion.rb +13 -13
  219. data/lib/yoda/services/current_node_explain/comment_signature.rb +77 -0
  220. data/lib/yoda/services/current_node_explain.rb +72 -0
  221. data/lib/yoda/services/evaluator.rb +44 -0
  222. data/lib/yoda/services/loadable_path_resolver.rb +33 -0
  223. data/lib/yoda/services/signature_discovery.rb +74 -0
  224. data/lib/yoda/services.rb +10 -0
  225. data/lib/yoda/store/actions/build_core_index.rb +38 -9
  226. data/lib/yoda/store/actions/import_core_library.rb +14 -19
  227. data/lib/yoda/store/actions/import_gem.rb +65 -33
  228. data/lib/yoda/store/actions/import_project_dependencies.rb +47 -0
  229. data/lib/yoda/store/actions/import_std_library.rb +13 -18
  230. data/lib/yoda/store/actions/read_file.rb +21 -6
  231. data/lib/yoda/store/actions/read_project_files.rb +13 -5
  232. data/lib/yoda/store/actions.rb +1 -0
  233. data/lib/yoda/store/adapters/base.rb +39 -0
  234. data/lib/yoda/store/adapters/gdbm_adapter/namespace_accessor.rb +152 -0
  235. data/lib/yoda/store/adapters/gdbm_adapter.rb +56 -0
  236. data/lib/yoda/store/adapters/lazy_adapter.rb +34 -0
  237. data/lib/yoda/store/adapters/memory_adapter.rb +22 -1
  238. data/lib/yoda/store/adapters.rb +12 -4
  239. data/lib/yoda/store/config.rb +43 -0
  240. data/lib/yoda/store/file_tree.rb +131 -0
  241. data/lib/yoda/store/objects/base.rb +73 -4
  242. data/lib/yoda/store/objects/class_object.rb +10 -1
  243. data/lib/yoda/store/objects/connected_delegation.rb +25 -0
  244. data/lib/yoda/store/objects/libraries_status.rb +67 -0
  245. data/lib/yoda/store/objects/library/core.rb +80 -0
  246. data/lib/yoda/store/objects/library/gem.rb +152 -0
  247. data/lib/yoda/store/objects/library/path_resolvable.rb +29 -0
  248. data/lib/yoda/store/objects/library/std.rb +81 -0
  249. data/lib/yoda/store/objects/library/with_registry.rb +28 -0
  250. data/lib/yoda/store/objects/library.rb +25 -0
  251. data/lib/yoda/store/objects/map.rb +61 -0
  252. data/lib/yoda/store/objects/merger.rb +6 -5
  253. data/lib/yoda/store/objects/meta_class_object.rb +28 -1
  254. data/lib/yoda/store/objects/method_object.rb +39 -6
  255. data/lib/yoda/store/objects/module_object.rb +3 -0
  256. data/lib/yoda/store/objects/namespace_object.rb +38 -1
  257. data/lib/yoda/store/objects/overload.rb +1 -1
  258. data/lib/yoda/store/objects/patch.rb +54 -11
  259. data/lib/yoda/store/objects/patch_set.rb +2 -2
  260. data/lib/yoda/store/objects/serializable.rb +17 -2
  261. data/lib/yoda/store/objects/serializable_set.rb +23 -0
  262. data/lib/yoda/store/objects/tag.rb +1 -1
  263. data/lib/yoda/store/objects/value_object.rb +5 -1
  264. data/lib/yoda/store/objects.rb +5 -1
  265. data/lib/yoda/store/project/dependency.rb +101 -0
  266. data/lib/yoda/store/project/file_finder.rb +121 -0
  267. data/lib/yoda/store/project/rbs_loader.rb +41 -0
  268. data/lib/yoda/store/project/setuper.rb +68 -0
  269. data/lib/yoda/store/project.rb +101 -41
  270. data/lib/yoda/store/query/ancestor_tree.rb +126 -0
  271. data/lib/yoda/store/query/associators/associate_ancestors.rb +2 -83
  272. data/lib/yoda/store/query/associators/associate_methods.rb +2 -2
  273. data/lib/yoda/store/query/constant_member_set.rb +33 -0
  274. data/lib/yoda/store/query/find_constant.rb +22 -4
  275. data/lib/yoda/store/query/find_meta_class.rb +1 -1
  276. data/lib/yoda/store/query/find_method.rb +9 -2
  277. data/lib/yoda/store/query/find_signature.rb +11 -3
  278. data/lib/yoda/store/query/find_workspace_objects.rb +36 -0
  279. data/lib/yoda/store/query/method_member_set.rb +50 -0
  280. data/lib/yoda/store/query.rb +4 -0
  281. data/lib/yoda/store/{registry_cache.rb → registry/cache.rb} +26 -1
  282. data/lib/yoda/store/registry/composer.rb +49 -0
  283. data/lib/yoda/store/registry/index.rb +120 -0
  284. data/lib/yoda/store/registry/library_registry.rb +71 -0
  285. data/lib/yoda/store/registry/library_registry_set.rb +133 -0
  286. data/lib/yoda/store/registry/local_store.rb +38 -0
  287. data/lib/yoda/store/registry/project_registry.rb +72 -0
  288. data/lib/yoda/store/registry.rb +25 -97
  289. data/lib/yoda/store/transformers/core_visibility.rb +61 -0
  290. data/lib/yoda/store/transformers.rb +7 -0
  291. data/lib/yoda/store/version_store.rb +71 -0
  292. data/lib/yoda/store/yard_importer.rb +13 -13
  293. data/lib/yoda/store.rb +15 -2
  294. data/lib/yoda/typing/constant_resolver/cbase_query.rb +14 -0
  295. data/lib/yoda/typing/constant_resolver/code_query.rb +25 -0
  296. data/lib/yoda/typing/constant_resolver/member_query.rb +27 -0
  297. data/lib/yoda/typing/constant_resolver/node_tracer.rb +36 -0
  298. data/lib/yoda/typing/constant_resolver/query.rb +70 -0
  299. data/lib/yoda/typing/constant_resolver/relative_base_query.rb +14 -0
  300. data/lib/yoda/typing/constant_resolver.rb +110 -0
  301. data/lib/yoda/typing/contexts/base_context.rb +83 -0
  302. data/lib/yoda/typing/contexts/block_context.rb +14 -0
  303. data/lib/yoda/typing/contexts/context_derivation.rb +59 -0
  304. data/lib/yoda/typing/contexts/method_context.rb +14 -0
  305. data/lib/yoda/typing/contexts/namespace_block_context.rb +29 -0
  306. data/lib/yoda/typing/contexts/namespace_context.rb +14 -0
  307. data/lib/yoda/typing/contexts.rb +25 -0
  308. data/lib/yoda/typing/environment.rb +1 -1
  309. data/lib/yoda/typing/inferencer/arguments.rb +38 -0
  310. data/lib/yoda/typing/inferencer/arguments_binder.rb +24 -0
  311. data/lib/yoda/typing/inferencer/load_resolver.rb +37 -0
  312. data/lib/yoda/typing/inferencer/method_resolver.rb +81 -0
  313. data/lib/yoda/typing/inferencer/object_resolver.rb +55 -0
  314. data/lib/yoda/typing/inferencer/parameter_binder.rb +176 -0
  315. data/lib/yoda/typing/inferencer/tracer.rb +209 -0
  316. data/lib/yoda/typing/inferencer/type_binding.rb +46 -0
  317. data/lib/yoda/typing/inferencer.rb +53 -0
  318. data/lib/yoda/typing/node_info.rb +83 -0
  319. data/lib/yoda/typing/relation.rb +2 -2
  320. data/lib/yoda/typing/traces/base.rb +2 -2
  321. data/lib/yoda/typing/traces/normal.rb +3 -3
  322. data/lib/yoda/typing/traces/send.rb +4 -4
  323. data/lib/yoda/typing/tree/ask_defined.rb +12 -0
  324. data/lib/yoda/typing/tree/base.rb +91 -0
  325. data/lib/yoda/typing/tree/begin.rb +15 -0
  326. data/lib/yoda/typing/tree/block_call.rb +26 -0
  327. data/lib/yoda/typing/tree/case.rb +18 -0
  328. data/lib/yoda/typing/tree/class_tree.rb +23 -0
  329. data/lib/yoda/typing/tree/conditional_loop.rb +15 -0
  330. data/lib/yoda/typing/tree/constant.rb +19 -0
  331. data/lib/yoda/typing/tree/constant_assignment.rb +12 -0
  332. data/lib/yoda/typing/tree/ensure.rb +17 -0
  333. data/lib/yoda/typing/tree/for.rb +15 -0
  334. data/lib/yoda/typing/tree/hash_tree.rb +32 -0
  335. data/lib/yoda/typing/tree/if.rb +22 -0
  336. data/lib/yoda/typing/tree/interpolation_text.rb +21 -0
  337. data/lib/yoda/typing/tree/literal.rb +18 -0
  338. data/lib/yoda/typing/tree/literal_inferable.rb +48 -0
  339. data/lib/yoda/typing/tree/local_exit.rb +15 -0
  340. data/lib/yoda/typing/tree/logical_assignment.rb +16 -0
  341. data/lib/yoda/typing/tree/logical_operator.rb +16 -0
  342. data/lib/yoda/typing/tree/method_def.rb +41 -0
  343. data/lib/yoda/typing/tree/method_inferable.rb +51 -0
  344. data/lib/yoda/typing/tree/module_tree.rb +18 -0
  345. data/lib/yoda/typing/tree/multiple_assignment.rb +16 -0
  346. data/lib/yoda/typing/tree/namespace_inferable.rb +20 -0
  347. data/lib/yoda/typing/tree/rescue.rb +18 -0
  348. data/lib/yoda/typing/tree/rescue_clause.rb +42 -0
  349. data/lib/yoda/typing/tree/self.rb +12 -0
  350. data/lib/yoda/typing/tree/send.rb +19 -0
  351. data/lib/yoda/typing/tree/send_inferable.rb +89 -0
  352. data/lib/yoda/typing/tree/singleton_class_tree.rb +24 -0
  353. data/lib/yoda/typing/tree/singleton_method_def.rb +41 -0
  354. data/lib/yoda/typing/tree/super.rb +19 -0
  355. data/lib/yoda/typing/tree/variable.rb +15 -0
  356. data/lib/yoda/typing/tree/variable_assignment.rb +23 -0
  357. data/lib/yoda/typing/tree/yield.rb +19 -0
  358. data/lib/yoda/typing/tree.rb +129 -0
  359. data/lib/yoda/typing/types/any.rb +15 -0
  360. data/lib/yoda/typing/types/associative_array.rb +28 -0
  361. data/lib/yoda/typing/types/base.rb +25 -0
  362. data/lib/yoda/typing/types/converter.rb +67 -0
  363. data/lib/yoda/typing/types/function.rb +68 -0
  364. data/lib/yoda/typing/types/generator.rb +306 -0
  365. data/lib/yoda/typing/types/generic.rb +29 -0
  366. data/lib/yoda/typing/types/instance.rb +30 -0
  367. data/lib/yoda/typing/types/instance_type.rb +74 -0
  368. data/lib/yoda/typing/types/method.rb +39 -0
  369. data/lib/yoda/typing/types/rbs_type_wrapper_interface.rb +44 -0
  370. data/lib/yoda/typing/types/singleton_type.rb +75 -0
  371. data/lib/yoda/typing/types/tuple.rb +24 -0
  372. data/lib/yoda/typing/types/type.rb +60 -0
  373. data/lib/yoda/typing/types/union.rb +38 -0
  374. data/lib/yoda/typing/types/var.rb +38 -0
  375. data/lib/yoda/typing/types.rb +24 -0
  376. data/lib/yoda/typing.rb +6 -2
  377. data/lib/yoda/version.rb +1 -1
  378. data/lib/yoda.rb +7 -2
  379. data/scripts/benchmark.rb +1 -1
  380. data/yoda-language-server.gemspec +16 -15
  381. metadata +349 -111
  382. data/.travis.yml +0 -8
  383. data/client/vscode/src/test/index.ts +0 -24
  384. data/lib/yoda/commands/setup.rb +0 -51
  385. data/lib/yoda/commands.rb +0 -69
  386. data/lib/yoda/evaluation/code_completion/base_provider.rb +0 -57
  387. data/lib/yoda/evaluation/code_completion/variable_provider.rb +0 -18
  388. data/lib/yoda/evaluation/code_completion.rb +0 -65
  389. data/lib/yoda/evaluation/current_node_explain.rb +0 -71
  390. data/lib/yoda/evaluation/evaluator.rb +0 -105
  391. data/lib/yoda/evaluation/signature_discovery.rb +0 -85
  392. data/lib/yoda/evaluation.rb +0 -9
  393. data/lib/yoda/model/node_signature.rb +0 -43
  394. data/lib/yoda/model/types.rb +0 -84
  395. data/lib/yoda/model/values/module_value.rb +0 -72
  396. data/lib/yoda/parsing/source_analyzer.rb +0 -59
  397. data/lib/yoda/server/file_store.rb +0 -57
  398. data/lib/yoda/store/adapters/leveldb_adapter.rb +0 -80
  399. data/lib/yoda/store/adapters/lmdb_adapter.rb +0 -113
  400. data/lib/yoda/store/objects/project_status.rb +0 -169
  401. data/lib/yoda/store/project/cache.rb +0 -78
  402. data/lib/yoda/store/project/library_doc_loader.rb +0 -114
  403. data/lib/yoda/typing/context.rb +0 -96
  404. data/lib/yoda/typing/evaluator.rb +0 -259
  405. data/scripts/build_core_index.sh +0 -16
@@ -8,17 +8,94 @@ module Yoda
8
8
 
9
9
  # @param type [Symbol]
10
10
  def busy(type:, id: nil)
11
+ failed = false
11
12
  event(type: type, phase: :begin, id: id)
12
13
  yield
14
+ rescue => e
15
+ Logger.warn(e.full_message)
16
+ failed = true
17
+ event(type: type, phage: :failed, id: id)
18
+ raise e
13
19
  ensure
14
20
  event(type: type, phase: :end, id: id)
15
21
  end
16
22
 
17
23
  # @param params [Hash]
18
- def event(params)
24
+ def event(**params)
19
25
  write(method: 'telemetry/event', params: params)
20
26
  end
21
27
 
28
+ # @param token [Integer, String]
29
+ # @param title [String]
30
+ # @param cancellable [Boolean, nil]
31
+ # @param message [String]
32
+ # @param percentage [Integer]
33
+ # @see https://microsoft.github.io/language-server-protocol/specifications/specification-current/#workDoneProgressBegin
34
+ def work_done_progress_begin(token:, title:, cancellable: nil, message: nil, percentage: nil)
35
+ write(
36
+ method: '$/progress',
37
+ params: LanguageServer::Protocol::Interface::ProgressParams.new(
38
+ token: token,
39
+ value: LanguageServer::Protocol::Interface::WorkDoneProgressBegin.new(
40
+ kind: "begin",
41
+ title: title,
42
+ cancellable: cancellable,
43
+ message: message,
44
+ percentage: percentage,
45
+ )
46
+ ),
47
+ )
48
+ end
49
+
50
+ # @param token [Integer, String]
51
+ # @param cancellable [Boolean, nil]
52
+ # @param message [String]
53
+ # @param percentage [Integer]
54
+ # @see https://microsoft.github.io/language-server-protocol/specifications/specification-current/#workDoneProgressReport
55
+ def work_done_progress_report(token:, cancellable: nil, message: nil, percentage: nil)
56
+ write(
57
+ method: '$/progress',
58
+ params: LanguageServer::Protocol::Interface::ProgressParams.new(
59
+ token: token,
60
+ value: LanguageServer::Protocol::Interface::WorkDoneProgressReport.new(
61
+ kind: "report",
62
+ cancellable: cancellable,
63
+ message: message,
64
+ percentage: percentage,
65
+ )
66
+ ),
67
+ )
68
+ end
69
+
70
+ # @param token [Integer, String]
71
+ # @param message [String]
72
+ # @see https://microsoft.github.io/language-server-protocol/specifications/specification-current/#workDoneProgressEnd
73
+ def work_done_progress_end(token:, message: nil)
74
+ write(
75
+ method: '$/progress',
76
+ params: LanguageServer::Protocol::Interface::ProgressParams.new(
77
+ token: token,
78
+ value: LanguageServer::Protocol::Interface::WorkDoneProgressEnd.new(
79
+ kind: "end",
80
+ message: message,
81
+ )
82
+ ),
83
+ )
84
+ end
85
+
86
+ # @param token [Integer, String]
87
+ # @param value [Object] The partial result to send. In most cases, the type of this becomes the result type of the request.
88
+ # @see https://microsoft.github.io/language-server-protocol/specifications/specification-current/#partialResults
89
+ def partial_result(token:, value:)
90
+ write(
91
+ method: '$/progress',
92
+ params: LanguageServer::Protocol::Interface::ProgressParams.new(
93
+ token: token,
94
+ value: value,
95
+ ),
96
+ )
97
+ end
98
+
22
99
  # @param type [String, Symbol]
23
100
  # @param message [String]
24
101
  def show_message(type:, message:)
@@ -46,6 +123,7 @@ module Yoda
46
123
  private
47
124
 
48
125
  def write(params)
126
+ Logger.trace("Notify: #{params}")
49
127
  @writer.write(params)
50
128
  end
51
129
 
@@ -2,6 +2,8 @@ module Yoda
2
2
  class Server
3
3
  module Providers
4
4
  class Completion < Base
5
+ include WithTimeout
6
+
5
7
  def self.provider_method
6
8
  :'textDocument/completion'
7
9
  end
@@ -13,31 +15,42 @@ module Yoda
13
15
  calculate(uri, position)
14
16
  end
15
17
 
18
+ private
19
+
16
20
  def timeout
17
21
  10
18
22
  end
19
23
 
20
- private
24
+ def timeout_message(params)
25
+ uri = params[:text_document][:uri]
26
+ position = params[:position]
27
+
28
+ "#{self.class.provider_method}: #{uri}:#{position[:line]}:#{position[:character]}"
29
+ end
21
30
 
22
31
  # @param uri [String]
23
32
  # @param position [{Symbol => Integer}]
24
33
  def calculate(uri, position)
25
- source = session.file_store.get(uri)
34
+ workspace = session.workspace_for(uri)
35
+ source = workspace.read_at(uri)
26
36
  location = Parsing::Location.of_language_server_protocol_position(line: position[:line], character: position[:character])
27
37
 
28
- if candidates = comment_complete(source, location)
29
- return candidates
30
- end
31
- complete_from_cut_source(source, location)
38
+ Logger.trace("Trying comment completion for #{uri}, #{position}")
39
+ candidates = comment_complete(workspace, source, location)
40
+ return candidates if candidates
41
+
42
+ Logger.trace("Trying code completion for #{uri}, #{position}")
43
+ complete_from_cut_source(workspace, source, location)
32
44
  end
33
45
 
46
+ # @param workspace [Workspace]
34
47
  # @param source [String]
35
48
  # @param location [Parsing::Location]
36
49
  # @return [LanguageServerProtocol::Interface::CompletionList, nil]
37
- def comment_complete(source, location)
38
- ast, comments = Parsing::Parser.new.parse_with_comments(source)
50
+ def comment_complete(workspace, source, location)
51
+ ast, comments = Parsing.parse_with_comments(source)
39
52
  return nil unless Parsing::Query::CurrentCommentQuery.new(comments, location).current_comment
40
- completion_worker = Evaluation::CommentCompletion.new(session.registry, ast, comments, location)
53
+ completion_worker = Services::CommentCompletion.new(workspace.project.environment, ast, comments, location)
41
54
  return nil unless completion_worker.available?
42
55
 
43
56
  completion_items = completion_worker.candidates
@@ -50,12 +63,13 @@ module Yoda
50
63
  nil
51
64
  end
52
65
 
66
+ # @param workspace [Workspace]
53
67
  # @param source [String]
54
68
  # @param location [Parsing::Location]
55
69
  # @return [LanguageServerProtocol::Interface::CompletionList, nil]
56
- def complete_from_cut_source(source, location)
57
- cut_source = Parsing::SourceCutter.new(source, location).error_recovered_source
58
- method_completion_worker = Evaluation::CodeCompletion.new(session.registry, cut_source, location)
70
+ def complete_from_cut_source(workspace, source, location)
71
+ cut_source = Parsing.fix_parse_error(source: source, location: location)
72
+ method_completion_worker = Services::CodeCompletion.new(workspace.project.environment, cut_source, location)
59
73
  completion_items = method_completion_worker.candidates
60
74
 
61
75
  LanguageServer::Protocol::Interface::CompletionList.new(
@@ -68,13 +82,13 @@ module Yoda
68
82
  # @return [LanguageServer::Protocol::Interface::CompletionItem]
69
83
  def create_completion_item(completion_item)
70
84
  LanguageServer::Protocol::Interface::CompletionItem.new(
71
- label: completion_item.description.is_a?(Model::Descriptions::FunctionDescription) ? completion_item.description.signature : completion_item.description.sort_text,
85
+ label: completion_item.label,
72
86
  kind: completion_item.language_server_kind,
73
- detail: completion_item.description.title,
74
- documentation: completion_item.description.to_markdown,
75
- sort_text: completion_item.description.sort_text,
87
+ detail: completion_item.title,
88
+ documentation: completion_item.to_markdown,
89
+ sort_text: completion_item.sort_text,
76
90
  text_edit: LanguageServer::Protocol::Interface::TextEdit.new(
77
- range: LanguageServer::Protocol::Interface::Range.new(completion_item.range.to_language_server_protocol_range),
91
+ range: LanguageServer::Protocol::Interface::Range.new(**completion_item.language_server_range),
78
92
  new_text: completion_item.edit_text,
79
93
  ),
80
94
  data: {},
@@ -2,6 +2,8 @@ module Yoda
2
2
  class Server
3
3
  module Providers
4
4
  class Definition < Base
5
+ include WithTimeout
6
+
5
7
  def self.provider_method
6
8
  :'textDocument/definition'
7
9
  end
@@ -10,32 +12,58 @@ module Yoda
10
12
  calculate(params[:text_document][:uri], params[:position])
11
13
  end
12
14
 
15
+ private
16
+
13
17
  def timeout
14
18
  10
15
19
  end
16
20
 
17
- private
21
+ def timeout_message(params)
22
+ uri = params[:text_document][:uri]
23
+ position = params[:position]
24
+
25
+ "#{self.class.provider_method}: #{uri}:#{position[:line]}:#{position[:character]}"
26
+ end
18
27
 
19
28
  # @param uri [String]
20
29
  # @param position [{Symbol => Integer}]
21
30
  # @param include_declaration [Boolean]
22
31
  def calculate(uri, position, include_declaration = false)
23
- source = session.file_store.get(uri)
32
+ workspace = session.workspace_for(uri)
33
+ source = workspace.read_at(uri)
24
34
  location = Parsing::Location.of_language_server_protocol_position(line: position[:line], character: position[:character])
25
35
 
26
- node_worker = Evaluation::CurrentNodeExplain.new(session.registry, source, location)
27
- references = node_worker.defined_files
28
- references.map { |(path, line, column)| create_location(path, line, column) }
29
- end
36
+ session.workspaces.each do |workspace|
37
+ next unless workspace.suburi?(uri)
38
+
39
+ node_worker = Services::CurrentNodeExplain.from_source(environment: workspace.project.environment, source: source, location: location)
40
+
41
+ if (current_comment_signature = node_worker.current_comment_signature)&.providable?
42
+ references = current_comment_signature.defined_files
43
+ locations = references.map { |(path, line, column)| create_location(workspace.uri_of_path(path), line, column) }
30
44
 
45
+ return locations unless locations.empty?
46
+ elsif current_node_signature = node_worker.current_node_signature
47
+ references = current_node_signature.defined_files
48
+ locations = references.map { |(path, line, column)| create_location(workspace.uri_of_path(path), line, column) }
49
+
50
+ return locations unless locations.empty?
51
+ else
52
+ nil
53
+ end
54
+ end
55
+
56
+ []
57
+ end
58
+
31
59
  # @param path [String]
32
60
  # @param line [Integer]
33
61
  # @param column [Integer]
34
- def create_location(path, line, column)
35
- location = Parsing::Location.new(row: line - 1, column: column)
62
+ def create_location(uri, line, column)
63
+ location = Parsing::Location.new(row: line, column: column)
36
64
  LanguageServer::Protocol::Interface::Location.new(
37
- uri: session.uri_of_path(path),
38
- range: LanguageServer::Protocol::Interface::Range.new(Parsing::Range.new(location, location).to_language_server_protocol_range),
65
+ uri: uri,
66
+ range: LanguageServer::Protocol::Interface::Range.new(**Parsing::Range.new(location, location).to_language_server_protocol_range),
39
67
  )
40
68
  end
41
69
  end
@@ -2,6 +2,8 @@ module Yoda
2
2
  class Server
3
3
  module Providers
4
4
  class Hover < Base
5
+ include WithTimeout
6
+
5
7
  def self.provider_method
6
8
  :'textDocument/hover'
7
9
  end
@@ -10,36 +12,50 @@ module Yoda
10
12
  calculate(params[:text_document][:uri], params[:position])
11
13
  end
12
14
 
15
+ private
16
+
13
17
  def timeout
14
18
  10
15
19
  end
16
20
 
17
- private
21
+ def timeout_message(params)
22
+ uri = params[:text_document][:uri]
23
+ position = params[:position]
24
+
25
+ "#{self.class.provider_method}: #{uri}:#{position[:line]}:#{position[:character]}"
26
+ end
27
+
18
28
 
19
29
  # @param uri [String]
20
30
  # @param position [{Symbol => Integer}]
21
31
  def calculate(uri, position)
22
- source = session.file_store.get(uri)
32
+ workspace = session.workspace_for(uri)
33
+ source = workspace.read_at(uri)
23
34
  location = Parsing::Location.of_language_server_protocol_position(line: position[:line], character: position[:character])
24
35
 
25
- node_worker = Evaluation::CurrentNodeExplain.new(session.registry, source, location)
36
+ node_worker = Services::CurrentNodeExplain.from_source(environment: workspace.project.environment, source: source, location: location)
26
37
 
27
- current_node_signature = node_worker.current_node_signature
28
- create_hover(current_node_signature) if current_node_signature
38
+ if (current_comment_signature = node_worker.current_comment_signature)&.providable?
39
+ create_hover(current_comment_signature)
40
+ elsif current_node_signature = node_worker.current_node_signature
41
+ create_hover(current_node_signature)
42
+ else
43
+ nil
44
+ end
29
45
  end
30
46
 
31
- # @param signature [Evaluation::NodeSignature]
47
+ # @param signature [Model::NodeSignatures::Base]
32
48
  def create_hover(signature)
33
49
  LanguageServer::Protocol::Interface::Hover.new(
34
50
  contents: signature.descriptions.map { |value| create_hover_text(value) },
35
- range: LanguageServer::Protocol::Interface::Range.new(signature.node_range.to_language_server_protocol_range),
51
+ range: LanguageServer::Protocol::Interface::Range.new(**signature.node_range.to_language_server_protocol_range),
36
52
  )
37
53
  end
38
54
 
39
- # @param description [Evaluation::Descriptions::Base]
40
- # @return [String]
55
+ # @param description [Model::Descriptions::Base]
56
+ # @return [String, Hash]
41
57
  def create_hover_text(description)
42
- description.to_markdown
58
+ description.markup_content
43
59
  end
44
60
  end
45
61
  end
@@ -0,0 +1,75 @@
1
+ module Yoda
2
+ class Server
3
+ module Providers
4
+ module ReportableProgress
5
+ # @param params [Hash] The parameter of the request
6
+ def in_progress(params, title:)
7
+ begin
8
+ reporter = ProgressReporter.new(
9
+ work_done_token: params[:work_done_token],
10
+ partial_result_token: params[:partial_result_token],
11
+ notifier: notifier,
12
+ )
13
+
14
+ reporter.send_begin(title: title)
15
+ yield reporter
16
+
17
+ reporter.results
18
+ ensure
19
+ reporter.send_end
20
+ end
21
+ end
22
+
23
+ class ProgressReporter
24
+ # @param [String, Integer, nil]
25
+ attr_reader :work_done_token
26
+
27
+ # @param [String, Integer, nil]
28
+ attr_reader :partial_result_token
29
+
30
+ # @param [Notifier]
31
+ attr_reader :notifier
32
+
33
+ # @param [Array]
34
+ attr_reader :results
35
+
36
+ # @param work_done_token [String, Integer, nil]
37
+ # @param partial_result_token [String, Integer, nil]
38
+ # @param notifier [Notifier]
39
+ def initialize(work_done_token:, partial_result_token:, notifier:)
40
+ @work_done_token = work_done_token
41
+ @partial_result_token = partial_result_token
42
+ @notifier = notifier
43
+ @results = []
44
+ end
45
+
46
+ def send_begin(**kwargs)
47
+ if work_done_token
48
+ notifier.work_done_progress_begin(token: work_done_token, **kwargs)
49
+ end
50
+ end
51
+
52
+ def send_end(**kwargs)
53
+ if work_done_token
54
+ notifier.work_done_progress_end(token: work_done_token, **kwargs)
55
+ end
56
+ end
57
+
58
+ def report(**kwargs)
59
+ if work_done_token
60
+ notifier.work_done_progress_report(token: work_done_token, **kwargs)
61
+ end
62
+ end
63
+
64
+ def send_result(value)
65
+ if partial_result_token
66
+ notifier.partial_result(token: partial_result_token, value: value)
67
+ else
68
+ results.push(value)
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
@@ -2,6 +2,8 @@ module Yoda
2
2
  class Server
3
3
  module Providers
4
4
  class Signature < Base
5
+ include WithTimeout
6
+
5
7
  def self.provider_method
6
8
  :'textDocument/signatureHelp'
7
9
  end
@@ -11,34 +13,45 @@ module Yoda
11
13
  calculate(params[:text_document][:uri], params[:position])
12
14
  end
13
15
 
16
+ private
17
+
14
18
  def timeout
15
19
  10
16
20
  end
17
21
 
18
- private
22
+ def timeout_message(params)
23
+ uri = params[:text_document][:uri]
24
+ position = params[:position]
25
+
26
+ "#{self.class.provider_method}: #{uri}:#{position[:line]}:#{position[:character]}"
27
+ end
19
28
 
20
29
  # @params uri [String]
21
30
  # @params position [{Symbol => Integer}]
22
31
  def calculate(uri, position)
23
- source = session.file_store.get(uri)
32
+ workspace = session.workspace_for(uri)
33
+ source = workspace.read_at(uri)
24
34
  location = Parsing::Location.of_language_server_protocol_position(line: position[:line], character: position[:character])
25
- cut_source = Parsing::SourceCutter.new(source, location).error_recovered_source
35
+ cut_source = Parsing.fix_parse_error(source: source, location: location)
26
36
 
27
- signature_worker = Evaluation::SignatureDiscovery.new(session.registry, cut_source, location)
37
+ signature_worker = Services::SignatureDiscovery.from_source(environment: workspace.project.environment, source: cut_source, location: location)
28
38
 
29
39
  functions = signature_worker.method_candidates
30
- create_signature_help(functions)
40
+ argument_number = signature_worker.argument_number
41
+ create_signature_help(functions, argument_number)
31
42
  end
32
43
 
33
44
  # @param code_objects [Array<Model::FunctionSignatures::Base>]
34
- def create_signature_help(functions)
45
+ # @param argument_number [Integer, nil]
46
+ def create_signature_help(functions, argument_number)
35
47
  signatures = functions.map { |func| Model::Descriptions::FunctionDescription.new(func) }
36
48
  LanguageServer::Protocol::Interface::SignatureHelp.new(
37
49
  signatures: signatures.map { |signature| create_signature_info(signature) },
50
+ active_parameter: argument_number,
38
51
  )
39
52
  end
40
53
 
41
- # @param signature [Evaluation::Descriptions::FunctionDescription]
54
+ # @param signature [Services::Descriptions::FunctionDescription]
42
55
  def create_signature_info(signature)
43
56
  LanguageServer::Protocol::Interface::SignatureInformation.new(
44
57
  label: signature.title.to_s,
@@ -9,7 +9,7 @@ module Yoda
9
9
  def provide(params)
10
10
  uri = params[:text_document][:uri]
11
11
  text = params[:content_changes].first[:text]
12
- session.file_store.store(uri, text)
12
+ session.store_source(uri: uri, source: text)
13
13
 
14
14
  NO_RESPONSE
15
15
  end
@@ -9,7 +9,7 @@ module Yoda
9
9
  def provide(params)
10
10
  uri = params[:text_document][:uri]
11
11
  text = params[:text_document][:text]
12
- session.file_store.store(uri, text)
12
+ session.store_source(uri: uri, source: text)
13
13
 
14
14
  NO_RESPONSE
15
15
  end
@@ -0,0 +1,36 @@
1
+ require 'timeout'
2
+
3
+ module Yoda
4
+ class Server
5
+ module Providers
6
+ module WithTimeout
7
+ module PrependHook
8
+ def provide(*args)
9
+ begin
10
+ Timeout.timeout(timeout) { super }
11
+ rescue Timeout::Error => err
12
+ if message = timeout_message(*args)
13
+ Logger.error("Request expired: " + message)
14
+ else
15
+ Logger.error("Request expired")
16
+ end
17
+ raise err
18
+ end
19
+ end
20
+ end
21
+
22
+ def included(mod)
23
+ mod.send(:prepend, PrependHook)
24
+ end
25
+
26
+ def timeout
27
+ nil
28
+ end
29
+
30
+ def timeout_message(*args)
31
+ nil
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,33 @@
1
+ module Yoda
2
+ class Server
3
+ module Providers
4
+ class WorkspaceDidChangeWorkspaceFolders < Base
5
+ def self.provider_method
6
+ :'workspace/didChangeWorkspaceFolders'
7
+ end
8
+
9
+ def provide(params)
10
+ added_folders = params[:event][:added].map(&method(:to_folder))
11
+ removed_folders = params[:event][:added].map(&method(:to_folder))
12
+
13
+ added_folders.each do
14
+ workspace = Workspace.from_workspace_folder(folder)
15
+ session.add_workspace(workspace)
16
+ end
17
+
18
+ removed_folders.each do
19
+ session.remove_workspace(id: folder.id)
20
+ end
21
+
22
+ NO_RESPONSE
23
+ end
24
+
25
+ private
26
+
27
+ def to_folder(folder_params)
28
+ LanguageServer::Protocol::Interface::WorkspaceFolder.new(**folder_params)
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,21 @@
1
+ module Yoda
2
+ class Server
3
+ module Providers
4
+ class WorkspaceDidCreateFiles < Base
5
+ def self.provider_method
6
+ :'workspace/didCreateFiles'
7
+ end
8
+
9
+ # @param params [LanguageServer::Protocol::Interface::CreateFilesParams]
10
+ def provide(params)
11
+ files = params[:files]
12
+ files.each do |file|
13
+ session.read_source(file[:uri])
14
+ end
15
+
16
+ NO_RESPONSE
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ module Yoda
2
+ class Server
3
+ module Providers
4
+ class WorkspaceDidDeleteFiles < Base
5
+ def self.provider_method
6
+ :'workspace/didDeleteFiles'
7
+ end
8
+
9
+ # @param params [LanguageServer::Protocol::Interface::DeleteFilesParams]
10
+ def provide(params)
11
+ files = params[:files]
12
+ files.each do |file|
13
+ session.remove_source(uri: file[:uri])
14
+ end
15
+
16
+ NO_RESPONSE
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,22 @@
1
+ module Yoda
2
+ class Server
3
+ module Providers
4
+ class WorkspaceDidRenameFiles < Base
5
+ def self.provider_method
6
+ :'workspace/didRenameFiles'
7
+ end
8
+
9
+ # @param params [LanguageServer::Protocol::Interface::DeleteFilesParams]
10
+ def provide(params)
11
+ files = params[:files]
12
+ files.each do |file|
13
+ session.remove_source(uri: file[:old_uri])
14
+ session.read_source(file[:new_uri])
15
+ end
16
+
17
+ NO_RESPONSE
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end