solargraph 0.54.4 → 0.58.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (238) 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 +185 -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 +143 -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 +45 -28
  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/gemfile.rb +15 -15
  33. data/lib/solargraph/convention/gemspec.rb +23 -22
  34. data/lib/solargraph/convention/rakefile.rb +17 -17
  35. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +61 -0
  36. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +102 -0
  37. data/lib/solargraph/convention/struct_definition.rb +164 -0
  38. data/lib/solargraph/convention.rb +78 -47
  39. data/lib/solargraph/converters/dd.rb +17 -17
  40. data/lib/solargraph/converters/dl.rb +15 -15
  41. data/lib/solargraph/converters/dt.rb +15 -15
  42. data/lib/solargraph/converters/misc.rb +1 -1
  43. data/lib/solargraph/diagnostics/require_not_found.rb +53 -53
  44. data/lib/solargraph/diagnostics/rubocop.rb +118 -113
  45. data/lib/solargraph/diagnostics/rubocop_helpers.rb +68 -66
  46. data/lib/solargraph/diagnostics/type_check.rb +55 -55
  47. data/lib/solargraph/diagnostics/update_errors.rb +41 -41
  48. data/lib/solargraph/doc_map.rb +439 -188
  49. data/lib/solargraph/environ.rb +9 -2
  50. data/lib/solargraph/equality.rb +34 -33
  51. data/lib/solargraph/gem_pins.rb +98 -72
  52. data/lib/solargraph/language_server/error_codes.rb +20 -20
  53. data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
  54. data/lib/solargraph/language_server/host/dispatch.rb +130 -128
  55. data/lib/solargraph/language_server/host/message_worker.rb +112 -106
  56. data/lib/solargraph/language_server/host/sources.rb +99 -99
  57. data/lib/solargraph/language_server/host.rb +878 -861
  58. data/lib/solargraph/language_server/message/base.rb +97 -96
  59. data/lib/solargraph/language_server/message/client/register_capability.rb +15 -15
  60. data/lib/solargraph/language_server/message/completion_item/resolve.rb +60 -60
  61. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +114 -112
  62. data/lib/solargraph/language_server/message/extended/document.rb +23 -20
  63. data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -32
  64. data/lib/solargraph/language_server/message/extended/download_core.rb +19 -19
  65. data/lib/solargraph/language_server/message/extended/search.rb +20 -20
  66. data/lib/solargraph/language_server/message/initialize.rb +191 -191
  67. data/lib/solargraph/language_server/message/text_document/completion.rb +56 -56
  68. data/lib/solargraph/language_server/message/text_document/definition.rb +40 -38
  69. data/lib/solargraph/language_server/message/text_document/document_highlight.rb +16 -16
  70. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +26 -26
  71. data/lib/solargraph/language_server/message/text_document/formatting.rb +148 -131
  72. data/lib/solargraph/language_server/message/text_document/hover.rb +58 -58
  73. data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +11 -11
  74. data/lib/solargraph/language_server/message/text_document/references.rb +16 -16
  75. data/lib/solargraph/language_server/message/text_document/rename.rb +19 -19
  76. data/lib/solargraph/language_server/message/text_document/signature_help.rb +24 -24
  77. data/lib/solargraph/language_server/message/text_document/type_definition.rb +25 -24
  78. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +35 -35
  79. data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +40 -40
  80. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +26 -24
  81. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +23 -23
  82. data/lib/solargraph/language_server/message.rb +94 -94
  83. data/lib/solargraph/language_server/progress.rb +8 -0
  84. data/lib/solargraph/language_server/request.rb +27 -24
  85. data/lib/solargraph/language_server/transport/data_reader.rb +74 -74
  86. data/lib/solargraph/language_server/uri_helpers.rb +49 -49
  87. data/lib/solargraph/library.rb +683 -662
  88. data/lib/solargraph/location.rb +82 -58
  89. data/lib/solargraph/logging.rb +37 -27
  90. data/lib/solargraph/page.rb +92 -89
  91. data/lib/solargraph/parser/comment_ripper.rb +69 -56
  92. data/lib/solargraph/parser/flow_sensitive_typing.rb +255 -0
  93. data/lib/solargraph/parser/node_processor/base.rb +92 -87
  94. data/lib/solargraph/parser/node_processor.rb +62 -45
  95. data/lib/solargraph/parser/parser_gem/class_methods.rb +149 -157
  96. data/lib/solargraph/parser/parser_gem/flawed_builder.rb +19 -18
  97. data/lib/solargraph/parser/parser_gem/node_chainer.rb +166 -164
  98. data/lib/solargraph/parser/parser_gem/node_methods.rb +486 -495
  99. data/lib/solargraph/parser/parser_gem/node_processors/alias_node.rb +2 -1
  100. data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +22 -0
  101. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +59 -57
  102. data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +15 -15
  103. data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +46 -43
  104. data/lib/solargraph/parser/parser_gem/node_processors/casgn_node.rb +2 -1
  105. data/lib/solargraph/parser/parser_gem/node_processors/cvasgn_node.rb +2 -1
  106. data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +53 -50
  107. data/lib/solargraph/parser/parser_gem/node_processors/defs_node.rb +37 -36
  108. data/lib/solargraph/parser/parser_gem/node_processors/gvasgn_node.rb +2 -1
  109. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +23 -0
  110. data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +40 -38
  111. data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +29 -28
  112. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +59 -53
  113. data/lib/solargraph/parser/parser_gem/node_processors/namespace_node.rb +8 -7
  114. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +98 -0
  115. data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +17 -16
  116. data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +38 -36
  117. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +52 -42
  118. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +291 -259
  119. data/lib/solargraph/parser/parser_gem/node_processors/sym_node.rb +3 -1
  120. data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +29 -0
  121. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +29 -0
  122. data/lib/solargraph/parser/parser_gem/node_processors.rb +70 -56
  123. data/lib/solargraph/parser/parser_gem.rb +12 -12
  124. data/lib/solargraph/parser/region.rb +69 -66
  125. data/lib/solargraph/parser/snippet.rb +17 -15
  126. data/lib/solargraph/parser.rb +23 -22
  127. data/lib/solargraph/pin/base.rb +729 -378
  128. data/lib/solargraph/pin/base_variable.rb +126 -118
  129. data/lib/solargraph/pin/block.rb +104 -101
  130. data/lib/solargraph/pin/breakable.rb +9 -0
  131. data/lib/solargraph/pin/callable.rb +231 -147
  132. data/lib/solargraph/pin/closure.rb +72 -57
  133. data/lib/solargraph/pin/common.rb +79 -70
  134. data/lib/solargraph/pin/constant.rb +45 -43
  135. data/lib/solargraph/pin/conversions.rb +123 -123
  136. data/lib/solargraph/pin/delegated_method.rb +120 -101
  137. data/lib/solargraph/pin/documenting.rb +114 -98
  138. data/lib/solargraph/pin/instance_variable.rb +34 -34
  139. data/lib/solargraph/pin/keyword.rb +20 -15
  140. data/lib/solargraph/pin/local_variable.rb +75 -67
  141. data/lib/solargraph/pin/method.rb +672 -527
  142. data/lib/solargraph/pin/method_alias.rb +34 -31
  143. data/lib/solargraph/pin/namespace.rb +115 -107
  144. data/lib/solargraph/pin/parameter.rb +275 -212
  145. data/lib/solargraph/pin/proxy_type.rb +39 -29
  146. data/lib/solargraph/pin/reference/override.rb +47 -29
  147. data/lib/solargraph/pin/reference/require.rb +2 -2
  148. data/lib/solargraph/pin/reference/superclass.rb +15 -10
  149. data/lib/solargraph/pin/reference.rb +39 -22
  150. data/lib/solargraph/pin/search.rb +61 -56
  151. data/lib/solargraph/pin/signature.rb +61 -17
  152. data/lib/solargraph/pin/singleton.rb +1 -1
  153. data/lib/solargraph/pin/symbol.rb +53 -47
  154. data/lib/solargraph/pin/until.rb +18 -0
  155. data/lib/solargraph/pin/while.rb +18 -0
  156. data/lib/solargraph/pin.rb +44 -41
  157. data/lib/solargraph/pin_cache.rb +245 -0
  158. data/lib/solargraph/position.rb +132 -107
  159. data/lib/solargraph/range.rb +112 -98
  160. data/lib/solargraph/rbs_map/conversions.rb +823 -646
  161. data/lib/solargraph/rbs_map/core_fills.rb +84 -50
  162. data/lib/solargraph/rbs_map/core_map.rb +58 -28
  163. data/lib/solargraph/rbs_map/stdlib_map.rb +43 -33
  164. data/lib/solargraph/rbs_map.rb +163 -93
  165. data/lib/solargraph/server_methods.rb +16 -16
  166. data/lib/solargraph/shell.rb +363 -269
  167. data/lib/solargraph/source/chain/array.rb +37 -33
  168. data/lib/solargraph/source/chain/block_symbol.rb +1 -1
  169. data/lib/solargraph/source/chain/block_variable.rb +1 -1
  170. data/lib/solargraph/source/chain/call.rb +337 -303
  171. data/lib/solargraph/source/chain/class_variable.rb +13 -13
  172. data/lib/solargraph/source/chain/constant.rb +26 -89
  173. data/lib/solargraph/source/chain/global_variable.rb +13 -13
  174. data/lib/solargraph/source/chain/hash.rb +34 -33
  175. data/lib/solargraph/source/chain/head.rb +1 -1
  176. data/lib/solargraph/source/chain/if.rb +28 -28
  177. data/lib/solargraph/source/chain/instance_variable.rb +13 -13
  178. data/lib/solargraph/source/chain/link.rb +109 -98
  179. data/lib/solargraph/source/chain/literal.rb +48 -28
  180. data/lib/solargraph/source/chain/or.rb +23 -23
  181. data/lib/solargraph/source/chain/q_call.rb +11 -11
  182. data/lib/solargraph/source/chain/variable.rb +13 -13
  183. data/lib/solargraph/source/chain/z_super.rb +30 -30
  184. data/lib/solargraph/source/chain.rb +291 -252
  185. data/lib/solargraph/source/change.rb +82 -82
  186. data/lib/solargraph/source/cursor.rb +166 -167
  187. data/lib/solargraph/source/encoding_fixes.rb +23 -23
  188. data/lib/solargraph/source/source_chainer.rb +194 -194
  189. data/lib/solargraph/source/updater.rb +55 -55
  190. data/lib/solargraph/source.rb +498 -495
  191. data/lib/solargraph/source_map/clip.rb +226 -232
  192. data/lib/solargraph/source_map/data.rb +34 -30
  193. data/lib/solargraph/source_map/mapper.rb +259 -255
  194. data/lib/solargraph/source_map.rb +212 -217
  195. data/lib/solargraph/type_checker/checks.rb +124 -120
  196. data/lib/solargraph/type_checker/param_def.rb +37 -35
  197. data/lib/solargraph/type_checker/problem.rb +32 -32
  198. data/lib/solargraph/type_checker/rules.rb +84 -62
  199. data/lib/solargraph/type_checker.rb +814 -672
  200. data/lib/solargraph/version.rb +5 -5
  201. data/lib/solargraph/views/_method.erb +10 -10
  202. data/lib/solargraph/views/_namespace.erb +3 -3
  203. data/lib/solargraph/views/document.erb +10 -10
  204. data/lib/solargraph/workspace/config.rb +255 -239
  205. data/lib/solargraph/workspace/require_paths.rb +97 -0
  206. data/lib/solargraph/workspace.rb +220 -239
  207. data/lib/solargraph/yard_map/helpers.rb +44 -16
  208. data/lib/solargraph/yard_map/mapper/to_constant.rb +7 -5
  209. data/lib/solargraph/yard_map/mapper/to_method.rb +130 -94
  210. data/lib/solargraph/yard_map/mapper/to_namespace.rb +31 -28
  211. data/lib/solargraph/yard_map/mapper.rb +79 -78
  212. data/lib/solargraph/yard_map/to_method.rb +89 -86
  213. data/lib/solargraph/yard_tags.rb +20 -20
  214. data/lib/solargraph/yardoc.rb +87 -52
  215. data/lib/solargraph.rb +105 -72
  216. data/rbs/fills/bundler/0/bundler.rbs +4271 -0
  217. data/rbs/fills/open3/0/open3.rbs +172 -0
  218. data/rbs/fills/rubygems/0/basic_specification.rbs +326 -0
  219. data/rbs/fills/rubygems/0/errors.rbs +364 -0
  220. data/rbs/fills/rubygems/0/spec_fetcher.rbs +107 -0
  221. data/rbs/fills/rubygems/0/specification.rbs +1753 -0
  222. data/rbs/fills/tuple/tuple.rbs +149 -0
  223. data/rbs/shims/ast/0/node.rbs +5 -0
  224. data/rbs/shims/ast/2.4/.rbs_meta.yaml +9 -0
  225. data/rbs/shims/ast/2.4/ast.rbs +73 -0
  226. data/rbs/shims/parser/3.2.0.1/builders/default.rbs +195 -0
  227. data/rbs/shims/parser/3.2.0.1/manifest.yaml +7 -0
  228. data/rbs/shims/parser/3.2.0.1/parser.rbs +201 -0
  229. data/rbs/shims/parser/3.2.0.1/polyfill.rbs +4 -0
  230. data/rbs/shims/thor/1.2.0.1/.rbs_meta.yaml +9 -0
  231. data/rbs/shims/thor/1.2.0.1/manifest.yaml +7 -0
  232. data/rbs/shims/thor/1.2.0.1/thor.rbs +17 -0
  233. data/rbs_collection.yaml +19 -0
  234. data/solargraph.gemspec +27 -5
  235. metadata +215 -18
  236. data/lib/.rubocop.yml +0 -22
  237. data/lib/solargraph/cache.rb +0 -77
  238. data/lib/solargraph/parser/node_methods.rb +0 -83
@@ -1,50 +1,84 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- class RbsMap
5
- # Override pins to fill gaps in RbsMap::CoreMap coverage
6
- #
7
- module CoreFills
8
- Override = Pin::Reference::Override
9
-
10
- KEYWORDS = [
11
- '__ENCODING__', '__LINE__', '__FILE__', 'BEGIN', 'END', 'alias', 'and',
12
- 'begin', 'break', 'case', 'class', 'def', 'defined?', 'do', 'else',
13
- 'elsif', 'end', 'ensure', 'false', 'for', 'if', 'in', 'module', 'next',
14
- 'nil', 'not', 'or', 'redo', 'rescue', 'retry', 'return', 'self', 'super',
15
- 'then', 'true', 'undef', 'unless', 'until', 'when', 'while', 'yield'
16
- ].map { |k| Pin::Keyword.new(k) }
17
-
18
- MISSING = [
19
- Solargraph::Pin::Method.new(name: 'tap', scope: :instance,
20
- closure: Solargraph::Pin::Namespace.new(name: 'Object')),
21
- Solargraph::Pin::Method.new(name: 'class', scope: :instance,
22
- closure: Solargraph::Pin::Namespace.new(name: 'Object'), comments: '@return [::Class<self>]')
23
- ]
24
-
25
- OVERRIDES = [
26
- Override.from_comment('BasicObject#instance_eval', '@yieldreceiver [self]'),
27
- Override.from_comment('BasicObject#instance_exec', '@yieldreceiver [self]'),
28
- Override.from_comment('Module#define_method', '@yieldreceiver [::Object<self>]'),
29
- Override.from_comment('Module#class_eval', '@yieldreceiver [::Class<self>]'),
30
- Override.from_comment('Module#class_exec', '@yieldreceiver [::Class<self>]'),
31
- Override.from_comment('Module#module_eval', '@yieldreceiver [::Module<self>]'),
32
- Override.from_comment('Module#module_exec', '@yieldreceiver [::Module<self>]'),
33
- # RBS does not define Class with a generic, so all calls to
34
- # generic() return an 'untyped'. We can do better:
35
- Override.method_return('Class#allocate', 'self')
36
- ]
37
-
38
- # HACK: Add Errno exception classes
39
- errno = Solargraph::Pin::Namespace.new(name: 'Errno')
40
- errnos = []
41
- Errno.constants.each do |const|
42
- errnos.push Solargraph::Pin::Namespace.new(type: :class, name: const.to_s, closure: errno)
43
- errnos.push Solargraph::Pin::Reference::Superclass.new(closure: errnos.last, name: 'SystemCallError')
44
- end
45
- ERRNOS = errnos
46
-
47
- ALL = KEYWORDS + MISSING + OVERRIDES + ERRNOS
48
- end
49
- end
50
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ class RbsMap
5
+ # Override pins to fill gaps in RbsMap::CoreMap coverage
6
+ #
7
+ module CoreFills
8
+ Override = Pin::Reference::Override
9
+
10
+ KEYWORDS = [
11
+ '__ENCODING__', '__LINE__', '__FILE__', 'BEGIN', 'END', 'alias', 'and',
12
+ 'begin', 'break', 'case', 'class', 'def', 'defined?', 'do', 'else',
13
+ 'elsif', 'end', 'ensure', 'false', 'for', 'if', 'in', 'module', 'next',
14
+ 'nil', 'not', 'or', 'redo', 'rescue', 'retry', 'return', 'self', 'super',
15
+ 'then', 'true', 'undef', 'unless', 'until', 'when', 'while', 'yield'
16
+ ].map { |k| Pin::Keyword.new(k, source: :core_fill) }
17
+
18
+ MISSING = [
19
+ Solargraph::Pin::Method.new(name: 'class', scope: :instance,
20
+ closure: Solargraph::Pin::Namespace.new(name: 'Object', source: :core_fill), comments: '@return [::Class<self>]',
21
+ source: :core_fill)
22
+ ]
23
+
24
+ OVERRIDES = [
25
+ Override.from_comment('BasicObject#instance_eval', '@yieldreceiver [self]',
26
+ source: :core_fill),
27
+ Override.from_comment('BasicObject#instance_exec', '@yieldreceiver [self]',
28
+ source: :core_fill),
29
+ Override.from_comment('Module#define_method', '@yieldreceiver [::Object<self>]',
30
+ source: :core_fill),
31
+ Override.from_comment('Module#class_eval', '@yieldreceiver [::Class<self>]',
32
+ source: :core_fill),
33
+ Override.from_comment('Module#class_exec', '@yieldreceiver [::Class<self>]',
34
+ source: :core_fill),
35
+ Override.from_comment('Module#module_eval', '@yieldreceiver [::Module<self>]',
36
+ source: :core_fill),
37
+ Override.from_comment('Module#module_exec', '@yieldreceiver [::Module<self>]',
38
+ source: :core_fill),
39
+ # RBS does not define Class with a generic, so all calls to
40
+ # generic() return an 'untyped'. We can do better:
41
+ Override.method_return('Class#allocate', 'self', source: :core_fill),
42
+ ]
43
+
44
+ # @todo I don't see any direct link in RBS to build this from -
45
+ # presumably RBS is using duck typing to match interfaces
46
+ # against concrete classes
47
+ INCLUDES = [
48
+ Solargraph::Pin::Reference::Include.new(name: '_ToAry',
49
+ closure: Solargraph::Pin::Namespace.new(name: 'Array', source: :core_fill),
50
+ generic_values: ['generic<Elem>'],
51
+ source: :core_fill),
52
+ Solargraph::Pin::Reference::Include.new(name: '_ToAry',
53
+ closure: Solargraph::Pin::Namespace.new(name: 'Set', source: :core_fill),
54
+ generic_values: ['generic<Elem>'],
55
+ source: :core_fill),
56
+ Solargraph::Pin::Reference::Include.new(name: '_Each',
57
+ closure: Solargraph::Pin::Namespace.new(name: 'Array', source: :core_fill),
58
+ generic_values: ['generic<Elem>'],
59
+ source: :core_fill),
60
+ Solargraph::Pin::Reference::Include.new(name: '_Each',
61
+ closure: Solargraph::Pin::Namespace.new(name: 'Set', source: :core_fill),
62
+ generic_values: ['generic<Elem>'],
63
+ source: :core_fill),
64
+ Solargraph::Pin::Reference::Include.new(name: '_ToS',
65
+ closure: Solargraph::Pin::Namespace.new(name: 'Object', source: :core_fill),
66
+ source: :core_fill),
67
+ Solargraph::Pin::Reference::Include.new(name: '_ToS',
68
+ closure: Solargraph::Pin::Namespace.new(name: 'String', source: :core_fill),
69
+ source: :core_fill)
70
+ ]
71
+
72
+ # HACK: Add Errno exception classes
73
+ errno = Solargraph::Pin::Namespace.new(name: 'Errno', source: :core_fill)
74
+ errnos = []
75
+ Errno.constants.each do |const|
76
+ errnos.push Solargraph::Pin::Namespace.new(type: :class, name: const.to_s, closure: errno, source: :core_fill)
77
+ errnos.push Solargraph::Pin::Reference::Superclass.new(closure: errnos.last, name: 'SystemCallError', source: :core_fill)
78
+ end
79
+ ERRNOS = errnos
80
+
81
+ ALL = KEYWORDS + MISSING + OVERRIDES + ERRNOS + INCLUDES
82
+ end
83
+ end
84
+ end
@@ -1,28 +1,58 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- class RbsMap
5
- # Ruby core pins
6
- #
7
- class CoreMap
8
- include Conversions
9
-
10
- def initialize
11
- cache = Cache.load('core.ser')
12
- if cache
13
- pins.replace cache
14
- else
15
- loader = RBS::EnvironmentLoader.new(repository: RBS::Repository.new(no_stdlib: false))
16
- RBS::Environment.from_loader(loader).resolve_type_names
17
- load_environment_to_pins(loader)
18
- pins.concat RbsMap::CoreFills::ALL
19
- processed = ApiMap::Store.new(pins).pins.reject { |p| p.is_a?(Solargraph::Pin::Reference::Override) }
20
- processed.each { |pin| pin.source = :rbs }
21
- pins.replace processed
22
-
23
- Cache.save('core.ser', pins)
24
- end
25
- end
26
- end
27
- end
28
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ class RbsMap
5
+ # Ruby core pins
6
+ #
7
+ class CoreMap
8
+ include Logging
9
+
10
+ def resolved?
11
+ true
12
+ end
13
+
14
+ FILLS_DIRECTORY = File.expand_path(File.join(File.dirname(__FILE__), '..', '..', '..', 'rbs', 'fills'))
15
+
16
+ def initialize; end
17
+
18
+ # @return [Enumerable<Pin::Base>]
19
+ def pins
20
+ return @pins if @pins
21
+
22
+ @pins = []
23
+ cache = PinCache.deserialize_core
24
+ if cache
25
+ @pins.replace cache
26
+ else
27
+ @pins.concat conversions.pins
28
+
29
+ # Avoid RBS::DuplicatedDeclarationError by loading in a different EnvironmentLoader
30
+ fill_loader = RBS::EnvironmentLoader.new(core_root: nil, repository: RBS::Repository.new(no_stdlib: false))
31
+ fill_loader.add(path: Pathname(FILLS_DIRECTORY))
32
+ fill_conversions = Conversions.new(loader: fill_loader)
33
+ @pins.concat fill_conversions.pins
34
+
35
+ @pins.concat RbsMap::CoreFills::ALL
36
+
37
+ processed = ApiMap::Store.new(pins).pins.reject { |p| p.is_a?(Solargraph::Pin::Reference::Override) }
38
+ @pins.replace processed
39
+
40
+ PinCache.serialize_core @pins
41
+ end
42
+ @pins
43
+ end
44
+
45
+ private
46
+
47
+ # @return [RBS::EnvironmentLoader]
48
+ def loader
49
+ @loader ||= RBS::EnvironmentLoader.new(repository: RBS::Repository.new(no_stdlib: false))
50
+ end
51
+
52
+ # @return [Conversions]
53
+ def conversions
54
+ @conversions ||= Conversions.new(loader: loader)
55
+ end
56
+ end
57
+ end
58
+ end
@@ -1,33 +1,43 @@
1
- # frozen_string_literal: true
2
-
3
- require 'rbs'
4
-
5
- module Solargraph
6
- class RbsMap
7
- # Ruby stdlib pins
8
- #
9
- class StdlibMap < RbsMap
10
- # @type [Hash{String => RbsMap}]
11
- @stdlib_maps_hash = {}
12
-
13
- # @param library [String]
14
- def initialize library
15
- cache = Cache.load('stdlib', "#{library}.ser")
16
- if cache
17
- pins.replace cache
18
- @resolved = true
19
- else
20
- super
21
- return unless resolved?
22
- Cache.save('stdlib', "#{library}.ser", pins)
23
- end
24
- end
25
-
26
- # @param library [String]
27
- # @return [StdlibMap]
28
- def self.load library
29
- @stdlib_maps_hash[library] ||= StdlibMap.new(library)
30
- end
31
- end
32
- end
33
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'rbs'
4
+
5
+ module Solargraph
6
+ class RbsMap
7
+ # Ruby stdlib pins
8
+ #
9
+ class StdlibMap < RbsMap
10
+ include Logging
11
+
12
+ # @type [Hash{String => RbsMap}]
13
+ @stdlib_maps_hash = {}
14
+
15
+ # @param library [String]
16
+ def initialize library
17
+ cached_pins = PinCache.deserialize_stdlib_require library
18
+ if cached_pins
19
+ @pins = cached_pins
20
+ @resolved = true
21
+ @loaded = true
22
+ logger.debug { "Deserialized #{cached_pins.length} cached pins for stdlib require #{library.inspect}" }
23
+ else
24
+ super
25
+ unless resolved?
26
+ @pins = []
27
+ logger.info { "Could not resolve #{library.inspect}" }
28
+ return
29
+ end
30
+ generated_pins = pins
31
+ logger.debug { "Found #{generated_pins.length} pins for stdlib library #{library}" }
32
+ PinCache.serialize_stdlib_require library, generated_pins
33
+ end
34
+ end
35
+
36
+ # @param library [String]
37
+ # @return [StdlibMap]
38
+ def self.load library
39
+ @stdlib_maps_hash[library] ||= StdlibMap.new(library)
40
+ end
41
+ end
42
+ end
43
+ end
@@ -1,93 +1,163 @@
1
- # frozen_string_literal: true
2
-
3
- require 'pathname'
4
- require 'rbs'
5
-
6
- module Solargraph
7
- class RbsMap
8
- autoload :Conversions, 'solargraph/rbs_map/conversions'
9
- autoload :CoreMap, 'solargraph/rbs_map/core_map'
10
- autoload :CoreFills, 'solargraph/rbs_map/core_fills'
11
- autoload :StdlibMap, 'solargraph/rbs_map/stdlib_map'
12
-
13
- include Conversions
14
-
15
- # @type [Hash{String => RbsMap}]
16
- @@rbs_maps_hash = {}
17
-
18
- attr_reader :library
19
-
20
- # @param library [String]
21
- # @param version [String, nil]
22
- # @param directories [Array<Pathname, String>]
23
- def initialize library, version = nil, directories: []
24
- @library = library
25
- @version = version
26
- @collection = nil
27
- @directories = directories
28
- loader = RBS::EnvironmentLoader.new(core_root: nil, repository: repository)
29
- add_library loader, library, version
30
- return unless resolved?
31
- load_environment_to_pins(loader)
32
- end
33
-
34
- # @generic T
35
- # @param path [String]
36
- # @param klass [Class<generic<T>>]
37
- # @return [generic<T>, nil]
38
- def path_pin path, klass = Pin::Base
39
- pin = pins.find { |p| p.path == path }
40
- pin if pin&.is_a?(klass)
41
- end
42
-
43
- # @param path [String]
44
- # @return [Array<Pin::Base>]
45
- def path_pins path
46
- pins.select { |p| p.path == path }
47
- end
48
-
49
- def resolved?
50
- @resolved
51
- end
52
-
53
- def repository
54
- @repository ||= RBS::Repository.new(no_stdlib: false).tap do |repo|
55
- # @todo Temporarily ignoring external directories due to issues with
56
- # incomplete/broken gem_rbs_collection installations
57
- # @directories.each { |dir| repo.add(Pathname.new(dir)) }
58
- end
59
- end
60
-
61
- # @param library [String]
62
- # @return [RbsMap]
63
- def self.load library
64
- @@rbs_maps_hash[library] ||= RbsMap.new(library)
65
- end
66
-
67
- # @param gemspec [Gem::Specification]
68
- def self.from_gemspec(gemspec)
69
- RbsMap.new(gemspec.name, gemspec.version)
70
- end
71
-
72
- private
73
-
74
- # @param loader [RBS::EnvironmentLoader]
75
- # @param library [String]
76
- # @return [Boolean] true if adding the library succeeded
77
- def add_library loader, library, version
78
- @resolved = if loader.has_library?(library: library, version: version)
79
- loader.add library: library, version: version
80
- Solargraph.logger.info "#{short_name} successfully loaded library #{library}"
81
- true
82
- else
83
- Solargraph.logger.info "#{short_name} failed to load library #{library}"
84
- false
85
- end
86
- end
87
-
88
- # @return [String]
89
- def short_name
90
- self.class.name.split('::').last
91
- end
92
- end
93
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'digest'
4
+ require 'pathname'
5
+ require 'rbs'
6
+
7
+ module Solargraph
8
+ class RbsMap
9
+ autoload :Conversions, 'solargraph/rbs_map/conversions'
10
+ autoload :CoreMap, 'solargraph/rbs_map/core_map'
11
+ autoload :CoreFills, 'solargraph/rbs_map/core_fills'
12
+ autoload :StdlibMap, 'solargraph/rbs_map/stdlib_map'
13
+
14
+ include Logging
15
+
16
+ # @type [Hash{String => RbsMap}]
17
+ @@rbs_maps_hash = {}
18
+
19
+ attr_reader :library
20
+
21
+ attr_reader :rbs_collection_paths
22
+
23
+ attr_reader :rbs_collection_config_path
24
+
25
+ # @param library [String]
26
+ # @param version [String, nil]
27
+ # @param rbs_collection_config_path [String, Pathname, nil]
28
+ # @param rbs_collection_paths [Array<Pathname, String>]
29
+ def initialize library, version = nil, rbs_collection_config_path: nil, rbs_collection_paths: []
30
+ if rbs_collection_config_path.nil? && !rbs_collection_paths.empty?
31
+ raise 'Please provide rbs_collection_config_path if you provide rbs_collection_paths'
32
+ end
33
+ @library = library
34
+ @version = version
35
+ @rbs_collection_config_path = rbs_collection_config_path
36
+ @rbs_collection_paths = rbs_collection_paths
37
+ add_library loader, library, version
38
+ end
39
+
40
+ # @return [RBS::EnvironmentLoader]
41
+ def loader
42
+ @loader ||= RBS::EnvironmentLoader.new(core_root: nil, repository: repository)
43
+ end
44
+
45
+ # @return [String] representing the version of the RBS info fetched
46
+ # for the given library. Must change when the RBS info is
47
+ # updated upstream for the same library and version. May change
48
+ # if the config for where information comes form changes.
49
+ def cache_key
50
+ @hextdigest ||= begin
51
+ # @type [String, nil]
52
+ data = nil
53
+ if rbs_collection_config_path
54
+ lockfile_path = RBS::Collection::Config.to_lockfile_path(Pathname.new(rbs_collection_config_path))
55
+ if lockfile_path.exist?
56
+ collection_config = RBS::Collection::Config.from_path lockfile_path
57
+ gem_config = collection_config.gem(library)
58
+ data = gem_config&.to_s
59
+ end
60
+ end
61
+ if data.nil? || data.empty?
62
+ if resolved?
63
+ # definitely came from the gem itself and not elsewhere -
64
+ # only one version per gem
65
+ 'gem-export'
66
+ else
67
+ 'unresolved'
68
+ end
69
+ else
70
+ Digest::SHA1.hexdigest(data)
71
+ end
72
+ end
73
+ end
74
+
75
+ # @param gemspec [Gem::Specification, Bundler::LazySpecification]
76
+ # @param rbs_collection_path [String, Pathname, nil]
77
+ # @param rbs_collection_config_path [String, Pathname, nil]
78
+ # @return [RbsMap]
79
+ def self.from_gemspec gemspec, rbs_collection_path, rbs_collection_config_path
80
+ rbs_map = RbsMap.new(gemspec.name, gemspec.version,
81
+ rbs_collection_paths: [rbs_collection_path].compact,
82
+ rbs_collection_config_path: rbs_collection_config_path)
83
+ return rbs_map if rbs_map.resolved?
84
+
85
+ # try any version of the gem in the collection
86
+ RbsMap.new(gemspec.name, nil,
87
+ rbs_collection_paths: [rbs_collection_path].compact,
88
+ rbs_collection_config_path: rbs_collection_config_path)
89
+ end
90
+
91
+ # @return [Array<Pin::Base>]
92
+ def pins
93
+ @pins ||= resolved? ? conversions.pins : []
94
+ end
95
+
96
+ # @generic T
97
+ # @param path [String]
98
+ # @param klass [Class<generic<T>>]
99
+ # @return [generic<T>, nil]
100
+ def path_pin path, klass = Pin::Base
101
+ pin = pins.find { |p| p.path == path }
102
+ pin if pin&.is_a?(klass)
103
+ end
104
+
105
+ # @param path [String]
106
+ # @return [Array<Pin::Base>]
107
+ def path_pins path
108
+ pins.select { |p| p.path == path }
109
+ end
110
+
111
+ def resolved?
112
+ @resolved
113
+ end
114
+
115
+ # @return [RBS::Repository]
116
+ def repository
117
+ @repository ||= RBS::Repository.new(no_stdlib: false).tap do |repo|
118
+ @rbs_collection_paths.each do |dir|
119
+ dir_path = Pathname.new(dir)
120
+ repo.add(dir_path) if dir_path.exist? && dir_path.directory?
121
+ end
122
+ end
123
+ end
124
+
125
+ # @param library [String]
126
+ # @return [RbsMap]
127
+ def self.load library
128
+ @@rbs_maps_hash[library] ||= RbsMap.new(library)
129
+ end
130
+
131
+ private
132
+
133
+ # @return [RBS::EnvironmentLoader]
134
+ def loader
135
+ @loader ||= RBS::EnvironmentLoader.new(core_root: nil, repository: repository)
136
+ end
137
+
138
+ # @return [Conversions]
139
+ def conversions
140
+ @conversions ||= Conversions.new(loader: loader)
141
+ end
142
+
143
+ # @param loader [RBS::EnvironmentLoader]
144
+ # @param library [String]
145
+ # @param version [String, nil]
146
+ # @return [Boolean] true if adding the library succeeded
147
+ def add_library loader, library, version
148
+ @resolved = if loader.has_library?(library: library, version: version)
149
+ loader.add library: library, version: version
150
+ logger.debug { "#{short_name} successfully loaded library #{library}:#{version}" }
151
+ true
152
+ else
153
+ logger.info { "#{short_name} did not find data for library #{library}:#{version}" }
154
+ false
155
+ end
156
+ end
157
+
158
+ # @return [String]
159
+ def short_name
160
+ self.class.name.split('::').last
161
+ end
162
+ end
163
+ end
@@ -1,16 +1,16 @@
1
- # frozen_string_literal: true
2
-
3
- require 'socket'
4
-
5
- module Solargraph
6
- module ServerMethods
7
- # @return [Integer]
8
- def available_port
9
- socket = Socket.new(:INET, :STREAM, 0)
10
- socket.bind(Addrinfo.tcp("127.0.0.1", 0))
11
- port = socket.local_address.ip_port
12
- socket.close
13
- port
14
- end
15
- end
16
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'socket'
4
+
5
+ module Solargraph
6
+ module ServerMethods
7
+ # @return [Integer]
8
+ def available_port
9
+ socket = Socket.new(:INET, :STREAM, 0)
10
+ socket.bind(Addrinfo.tcp("127.0.0.1", 0))
11
+ port = socket.local_address.ip_port
12
+ socket.close
13
+ port
14
+ end
15
+ end
16
+ end