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
@@ -0,0 +1,209 @@
1
+ module Yoda
2
+ module Typing
3
+ class Inferencer
4
+ class Tracer
5
+ # @return [Model::Environment]
6
+ attr_reader :environment
7
+
8
+ # @return [Types::Generator]
9
+ attr_reader :generator
10
+
11
+ # @return [Hash{ AST::Node => Symbol }]
12
+ attr_reader :node_to_kind
13
+
14
+ # @return [Hash{ AST::Node => Tree::Base }]
15
+ attr_reader :node_to_tree
16
+
17
+ # @return [Hash{ AST::Node => Types::Base }]
18
+ attr_reader :node_to_type
19
+
20
+ # @return [Hash{ AST::Node => Context }]
21
+ attr_reader :node_to_context
22
+
23
+ # @return [Hash{ AST::Node => Types::Type }]
24
+ attr_reader :node_to_receiver_type
25
+
26
+ # @return [Hash{ AST::Node => Array<FunctionSignatures::Base> }]
27
+ attr_reader :node_to_method_candidates
28
+
29
+ # @return [Hash{ AST::Node => Array<Store::Objects::Base> }]
30
+ attr_reader :node_to_constants
31
+
32
+ # @return [Hash{ AST::Node => Array<String> }]
33
+ attr_reader :node_to_require_paths
34
+
35
+ class MaskedMap
36
+ def initialize
37
+ @content = {}
38
+ end
39
+
40
+ def [](key)
41
+ @content[key]
42
+ end
43
+
44
+ def []=(key, value)
45
+ @content[key] = value
46
+ end
47
+
48
+ def to_s
49
+ inspect
50
+ end
51
+
52
+ def to_h
53
+ @content
54
+ end
55
+
56
+ def inspect
57
+ "(#{@content.length} items)"
58
+ end
59
+ end
60
+
61
+ # @param environment [Model::Environment]
62
+ # @param generator [Types::Generator]
63
+ def initialize(environment:, generator:)
64
+ @environment = environment
65
+ @generator = generator
66
+
67
+ @node_to_kind = MaskedMap.new
68
+ @node_to_tree = MaskedMap.new
69
+ @node_to_type = MaskedMap.new
70
+ @node_to_context = MaskedMap.new
71
+ @node_to_method_candidates = MaskedMap.new
72
+ @node_to_receiver_type = MaskedMap.new
73
+ @node_to_constants = MaskedMap.new
74
+ @node_to_require_paths = MaskedMap.new
75
+ end
76
+
77
+ # @param node [AST::Node]
78
+ # @param tree [Tree::Base]
79
+ def bind_tree(node:, tree:)
80
+ node_to_tree[node.identifier] = tree
81
+ end
82
+
83
+ # @param node [AST::Node]
84
+ # @param type [Types::Base]
85
+ # @param context [Contexts::BaseContext]
86
+ def bind_type(node:, type:, context:)
87
+ node_to_type[node.identifier] = type
88
+ end
89
+
90
+ # @param node [AST::Node]
91
+ # @param context [Contexts::BaseContext]
92
+ def bind_context(node:, context:)
93
+ node_to_context[node.identifier] = context
94
+ end
95
+
96
+ # @param variable [Symbol]
97
+ # @param type [Types::Base]
98
+ # @param context [Contexts::BaseContext]
99
+ def bind_local_variable(variable:, type:, context:)
100
+ # nop
101
+ end
102
+
103
+ # @param node [AST::Node]
104
+ # @param receiver_candidates [Array<Store::Objects::NamespaceObject>]
105
+ # @param method_candidates [Array<Model::FunctionSignatures::Base>]
106
+ def bind_send(node:, receiver_type:, method_candidates:)
107
+ fail TypeError, method_candidates unless method_candidates.all? { |candidate| candidate.is_a?(Model::FunctionSignatures::Wrapper) }
108
+
109
+ node_to_kind[node.identifier] = :send
110
+ node_to_receiver_type[node.identifier] = receiver_type
111
+ node_to_method_candidates[node.identifier] = method_candidates
112
+ end
113
+
114
+ # @param node [AST::Node]
115
+ # @param method_candidates [Array<Model::FunctionSignatures::Base>]
116
+ def bind_method_definition(node:, method_candidates:)
117
+ fail TypeError, method_candidates unless method_candidates.all? { |candidate| candidate.is_a?(Model::FunctionSignatures::Wrapper) }
118
+
119
+ node_to_kind[node.identifier] = :send
120
+ node_to_method_candidates[node.identifier] = method_candidates
121
+ end
122
+
123
+ # @param node [AST::Node]
124
+ # @param constants [Array<Store::Objects::Base>]
125
+ def bind_constants(node:, constants:)
126
+ node_to_constants[node.identifier] = constants
127
+ end
128
+
129
+ # @param node [AST::Node]
130
+ # @param require_paths [Array<String>]
131
+ def bind_require_paths(node:, require_paths:)
132
+ node_to_require_paths[node.identifier] = require_paths
133
+ end
134
+
135
+ # @param node [AST::Node]
136
+ # @return [Symbol, nil]
137
+ def kind(node)
138
+ node_to_kind[node.identifier]
139
+ end
140
+
141
+ # @param node [AST::Node]
142
+ # @return [Tree::Base, nil]
143
+ def tree(node)
144
+ node_to_tree[node.identifier]
145
+ end
146
+
147
+ # @param node [AST::Node]
148
+ # @return [Types::Type]
149
+ def type(node)
150
+ node_to_type[node.identifier] || generator.unknown_type(reason: "not traced")
151
+ end
152
+
153
+ # @param node [AST::Node]
154
+ # @return [NodeInfo]
155
+ def node_info(node)
156
+ NodeInfo.new(node: node, tracer: self)
157
+ end
158
+
159
+ # @param node [AST::Node]
160
+ # @return [Array<Store::Objects::Base>]
161
+ def objects(node)
162
+ type(node).value.referred_objects
163
+ end
164
+
165
+ # @param node [AST::Node]
166
+ # @return [Types::Type]
167
+ def receiver_type(node)
168
+ node_to_receiver_type[node.identifier] || generator.unknown_type(reason: "not traced")
169
+ end
170
+
171
+ # @param node [AST::Node]
172
+ # @return [Array<FunctionSignatures::Wrapper>]
173
+ def method_candidates(node)
174
+ node_to_method_candidates[node.identifier] || []
175
+ end
176
+
177
+ # @param node [AST::Node]
178
+ # @return [Array<Store::Objects::Base>]
179
+ def constants(node)
180
+ node_to_constants[node.identifier] || []
181
+ end
182
+
183
+ # @param node [AST::Node]
184
+ # @return [Array<String>]
185
+ def require_paths(node)
186
+ node_to_require_paths[node.identifier] || []
187
+ end
188
+
189
+ # @param node [AST::Node]
190
+ # @return [Contexts::BaseContext, nil]
191
+ def context(node)
192
+ node_to_context[node.identifier]
193
+ end
194
+
195
+ # @param node [AST::Node]
196
+ # @return [Hash{ Symbol => Types::Base }]
197
+ def context_variable_types(node)
198
+ context(node)&.type_binding&.all_variables || {}
199
+ end
200
+
201
+ # @param node [AST::Node]
202
+ # @return [Hash{ Symbol => Store::Objects::Base }]
203
+ def context_variable_objects(node)
204
+ context(node)&.type_binding&.all_variables&.transform_values { |type| type.value.referred_objects } || {}
205
+ end
206
+ end
207
+ end
208
+ end
209
+ end
@@ -0,0 +1,46 @@
1
+ module Yoda
2
+ module Typing
3
+ class Inferencer
4
+ # Bindings of local variables
5
+ class TypeBinding
6
+ # @return [TypeBinding, nil]
7
+ attr_reader :parent
8
+
9
+ # @return [Hash{ Symbol => Types::Type}]
10
+ attr_reader :binds
11
+
12
+ # @param parent [Environment, nil]
13
+ # @param binds [Hash{ Symbol => Types::Type}, nil]
14
+ def initialize(parent: nil, binds: nil)
15
+ @parent = parent
16
+ @binds = (binds || {}).to_h
17
+ end
18
+
19
+ # @param key [String, Symbol]
20
+ def resolve(key)
21
+ all_variables[key.to_sym]
22
+ end
23
+
24
+ # @param key [String, Symbol]
25
+ # @param type [Symbol, Types::Type]
26
+ def bind(key, type)
27
+ key = key.to_sym
28
+ type = (type.is_a?(Symbol) && resolve(type)) || type
29
+ @binds.transform_values! { |value| value == key ? type : value }
30
+ @binds[key] = type
31
+ self
32
+ end
33
+
34
+ # @return [Hash{ Symbol => Types::Type }]
35
+ def to_h
36
+ all_variables
37
+ end
38
+
39
+ # @return [Hash{ Symbol => Types::Type }]
40
+ def all_variables
41
+ (parent&.all_variables || {}).merge(binds)
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,53 @@
1
+ module Yoda
2
+ module Typing
3
+ class Inferencer
4
+ require 'yoda/typing/inferencer/arguments_binder'
5
+ require 'yoda/typing/inferencer/arguments'
6
+ require 'yoda/typing/inferencer/load_resolver'
7
+ require 'yoda/typing/inferencer/method_resolver'
8
+ require 'yoda/typing/inferencer/object_resolver'
9
+ require 'yoda/typing/inferencer/parameter_binder'
10
+ require 'yoda/typing/inferencer/tracer'
11
+ require 'yoda/typing/inferencer/type_binding'
12
+
13
+ # @return [Contexts::BaseContext]
14
+ attr_reader :context
15
+
16
+ # @return [Tracer]
17
+ attr_reader :tracer
18
+
19
+ # @param environment [Model::Environment]
20
+ # @return [Inferencer]
21
+ def self.create_for_root(environment:)
22
+ context = Contexts.root_scope(environment: environment)
23
+ new(context: context)
24
+ end
25
+
26
+ # @param context [Contexts::BaseContext]
27
+ # @param tracer [Tracer, nil]
28
+ def initialize(context:, tracer: nil)
29
+ @context = context
30
+ @tracer = tracer || Tracer.new(environment: context.environment, generator: context.generator)
31
+ end
32
+
33
+ # @param node [AST::Vnode]
34
+ # @return [Store::Types::Base]
35
+ def infer(node)
36
+ # AstTraverser.new(tracer: tracer, context: context).traverse(node)
37
+ Tree.build(node, context: context, tracer: tracer).type
38
+ end
39
+
40
+ # @param pp [PP]
41
+ def pretty_print(pp)
42
+ pp.object_group(self) do
43
+ pp.breakable
44
+ pp.text "@context="
45
+ pp.pp context
46
+ pp.comma_breakable
47
+ pp.text "@tracer="
48
+ pp.pp tracer
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,83 @@
1
+ require 'forwardable'
2
+
3
+ module Yoda
4
+ module Typing
5
+ # Facade for information of the specified node traced on inference
6
+ class NodeInfo
7
+ extend Forwardable
8
+
9
+ # @return [AST::Node]
10
+ attr_reader :node
11
+
12
+ # @return [Inferencer::Tracer]
13
+ attr_reader :tracer
14
+
15
+ delegate %i(location range) => :node
16
+
17
+ # @param node [AST::Node]
18
+ # @param tracer [Inferencer::Tracer]
19
+ def initialize(node:, tracer:)
20
+ @node = node
21
+ @tracer = tracer
22
+ end
23
+
24
+ # @return [Symbol]
25
+ def kind
26
+ tracer.kind(node) || node.type
27
+ end
28
+
29
+ # @return [Types::Type]
30
+ def receiver_type
31
+ tracer.receiver_type(node)
32
+ end
33
+
34
+ # @return [Array<FunctionSignatures::Base>]
35
+ def method_candidates
36
+ tracer.method_candidates(node)
37
+ end
38
+
39
+ # @return [Array<Store::Objects::Base>]
40
+ def constants
41
+ tracer.constants(node)
42
+ end
43
+
44
+ # @return [Array<String>]
45
+ def require_paths
46
+ tracer.require_paths(node)
47
+ end
48
+
49
+ # @return [Types::Type]
50
+ def type
51
+ tracer.type(node)
52
+ end
53
+
54
+ # @return [Array<Store::Objects::Base>]
55
+ def objects
56
+ tracer.objects(node)
57
+ end
58
+
59
+ # @return [Array<Store::Objects::Base>]
60
+ def scope_objects
61
+ tracer.objects(node)
62
+ end
63
+
64
+ # @return [Array<Store::Objects::NamespaceObject>]
65
+ def lexical_scope_types
66
+ context&.lexical_scope_types || []
67
+ end
68
+
69
+ # @param path_expr [String]
70
+ # @return [Types::Type, nil]
71
+ def resolve_constant(path_expr)
72
+ context&.constant_resolver&.resolve_path(path_expr.to_s)
73
+ end
74
+
75
+ private
76
+
77
+ # @return [Contexts::BaseContext]
78
+ def context
79
+ tracer.context(node)
80
+ end
81
+ end
82
+ end
83
+ end
@@ -2,8 +2,8 @@ module Yoda
2
2
  module Typing
3
3
  class Relation
4
4
  attr_reader :left, :right, :op
5
- # @param left [Symbol, Model::Types::Base]
6
- # @param right [Symbol, Model::Types::Base]
5
+ # @param left [Symbol, Model::TypeExpressions::Base]
6
+ # @param right [Symbol, Model::TypeExpressions::Base]
7
7
  # @param op [Symbol]
8
8
  def initialize(left, right, op = :eq)
9
9
  @left = left
@@ -10,13 +10,13 @@ module Yoda
10
10
  end
11
11
 
12
12
  # @abstract
13
- # @return [Model::Types::Base]
13
+ # @return [Model::TypeExpressions::Base]
14
14
  def type
15
15
  fail NotImplementedError
16
16
  end
17
17
 
18
18
  # @abstract
19
- # @return [Context]
19
+ # @return [Contexts::BaseContext]
20
20
  def context
21
21
  fail NotImplementedError
22
22
  end
@@ -5,10 +5,10 @@ module Yoda
5
5
  class Normal < Base
6
6
  attr_reader :context, :type
7
7
 
8
- # @param context [Context]
9
- # @param type [Model::Types::Base]
8
+ # @param context [Contexts::BaseContext]
9
+ # @param type [Model::TypeExpressions::Base]
10
10
  def initialize(context, type)
11
- fail ArgumentError, type unless type.is_a?(Model::Types::Base)
11
+ fail ArgumentError, type unless type.is_a?(Model::TypeExpressions::Base)
12
12
  @context = context
13
13
  @type = type
14
14
  end
@@ -3,18 +3,18 @@ module Yoda
3
3
  module Traces
4
4
  # Store evaluation result for each ast node.
5
5
  class Send < Base
6
- # @return [Context]
6
+ # @return [Contexts::BaseContext]
7
7
  attr_reader :context
8
8
 
9
9
  # @return [Array<Model::FunctionSignatures::Base>]
10
10
  attr_reader :functions
11
11
 
12
- # @return [Model::Types::Base]
12
+ # @return [Model::TypeExpressions::Base]
13
13
  attr_reader :type
14
14
 
15
- # @param context [Context]
15
+ # @param context [Contexts::BaseContext]
16
16
  # @param functions [Array<Model::FunctionSignatures::Base>]
17
- # @param type [Array<Model::Types::Base>]
17
+ # @param type [Array<Model::TypeExpressions::Base>]
18
18
  def initialize(context, functions, type)
19
19
  @context = context
20
20
  @functions = functions
@@ -0,0 +1,12 @@
1
+ module Yoda
2
+ module Typing
3
+ module Tree
4
+ class AskDefined < Base
5
+ # @return [Types::Type]
6
+ def infer_type
7
+ generator.boolean_type
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,91 @@
1
+ require 'forwardable'
2
+ require 'pp'
3
+
4
+ module Yoda
5
+ module Typing
6
+ module Tree
7
+ # @abstract
8
+ class Base
9
+ extend Forwardable
10
+
11
+ # @return [AST::Vnode]
12
+ attr_reader :node
13
+
14
+ # @return [Inferencer::Tracer]
15
+ attr_reader :tracer
16
+
17
+ # @return [Contexts::BaseContext]
18
+ attr_reader :context
19
+
20
+ delegate [:bind_tree, :bind_context, :bind_type, :bind_send, :bind_method_definition, :bind_require_paths] => :tracer
21
+
22
+ # @return [Types::Generator]
23
+ delegate [:generator] => :context
24
+
25
+ # @param node [AST::Vnode]
26
+ # @param tracer [Inferencer::Tracer]
27
+ # @param context [Contexts::BaseContext]
28
+ # @param parent [Base, nil]
29
+ def initialize(node:, tracer:, context:, parent: nil)
30
+ @node = node
31
+ @tracer = tracer
32
+ @context = context
33
+ @parent = parent
34
+ end
35
+
36
+ # @return [Types::Type]
37
+ def type
38
+ @type ||= begin
39
+ bind_tree(node: node, tree: self)
40
+ bind_context(node: node, context: context)
41
+ Logger.trace("Traversing #{node}")
42
+ type = infer_type
43
+ Logger.trace("Traversed #{node} -> #{type.to_s}")
44
+ bind_type(node: node, type: type, context: context)
45
+
46
+ type
47
+ end
48
+ end
49
+
50
+ # @param node [AST::Vnode]
51
+ # @return [Base]
52
+ def build_child(node, context: self.context)
53
+ Tree.build(node, context: context, tracer: tracer, parent: self)
54
+ end
55
+
56
+ # @param node [AST::Vnode]
57
+ # @param (see #build_child)
58
+ # @return [Types::Type]
59
+ def infer_child(node, **kwargs)
60
+ build_child(node, **kwargs).type
61
+ end
62
+
63
+ # @param pp [PP]
64
+ def pretty_print(pp)
65
+ pp.object_group(self) do
66
+ pp.breakable
67
+ pp.text "@node="
68
+ pp.pp node
69
+ pp.text "@context="
70
+ pp.pp context
71
+ pp.comma_breakable
72
+ pp.text "@tracer="
73
+ pp.pp tracer
74
+ end
75
+ end
76
+
77
+ def inspect
78
+ pretty_print_inspect
79
+ end
80
+
81
+ private
82
+
83
+ # @abstract
84
+ # @return [Types::Type]
85
+ def infer_type
86
+ fail NotImplementedError
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,15 @@
1
+ module Yoda
2
+ module Typing
3
+ module Tree
4
+ class Begin < Base
5
+ # @!method node
6
+ # @return [AST::BlockNode]
7
+
8
+ # @return [Types::Type]
9
+ def infer_type
10
+ node.children.map { |node| infer_child(node) }.last
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,26 @@
1
+ require 'yoda/typing/tree/send_inferable'
2
+
3
+ module Yoda
4
+ module Typing
5
+ module Tree
6
+ class BlockCall < Base
7
+ include SendInferable
8
+
9
+ # @!method node
10
+ # @return [AST::BlockCallNode]
11
+
12
+ # @return [Types::Type]
13
+ def infer_type
14
+ if node.send_clause.type == :send
15
+ infer_send(node.send_clause, node.parameters, node.body)
16
+ else
17
+ # super or zsuper
18
+ child_type = infer_child(node.send_clause)
19
+ infer_child(node.body)
20
+ child_type
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,18 @@
1
+ module Yoda
2
+ module Typing
3
+ module Tree
4
+ class Case < Base
5
+ # @!method node
6
+ # @return [AST::CaseNode]
7
+
8
+ # @return [Type::Type]
9
+ def infer_type
10
+ subject_node, *when_nodes, else_node = node.children
11
+ infer_child(subject_node)
12
+ when_body_nodes = when_nodes.map { |node| node.children.last }
13
+ generator.union_type(*[*when_body_nodes, else_node].compact.map { |node| infer_child(node) })
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,23 @@
1
+ require 'yoda/typing/tree/namespace_inferable'
2
+
3
+ module Yoda
4
+ module Typing
5
+ module Tree
6
+ class ClassTree < Base
7
+ include NamespaceInferable
8
+
9
+ # @!method node
10
+ # @return [AST::ClassNode]
11
+
12
+ # @return [Types::Base]
13
+ def infer_type
14
+ if super_class_node = node.super_class
15
+ infer_child(super_class_node)
16
+ end
17
+
18
+ infer_namespace
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,15 @@
1
+ module Yoda
2
+ module Typing
3
+ module Tree
4
+ class ConditionalLoop < Base
5
+ # @!method node
6
+ # @return [AST::ConditionalLoopNode]
7
+
8
+ def infer_type
9
+ # TODO
10
+ infer_child(node.body)
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,19 @@
1
+ module Yoda
2
+ module Typing
3
+ module Tree
4
+ class Constant < Base
5
+ # @!method node
6
+ # @return [AST::ConstantNode]
7
+
8
+ def infer_type
9
+ query = context.constant_resolver.build_query_for_node(node, tracer: tracer)
10
+ if (base_query = query.base).is_a?(ConstantResolver::CodeQuery)
11
+ base_query.result_type = infer_child(base_query.node)
12
+ end
13
+
14
+ context.constant_resolver.resolve(query)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end