solargraph 0.46.0 → 0.54.5

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 (279) hide show
  1. checksums.yaml +4 -4
  2. data/.github/FUNDING.yml +1 -0
  3. data/.github/workflows/plugins.yml +40 -0
  4. data/.github/workflows/rspec.yml +37 -41
  5. data/.github/workflows/typecheck.yml +34 -0
  6. data/.gitignore +9 -9
  7. data/.rspec +2 -2
  8. data/.yardopts +2 -2
  9. data/CHANGELOG.md +1338 -1115
  10. data/Gemfile +0 -0
  11. data/LICENSE +1 -1
  12. data/README.md +131 -128
  13. data/Rakefile +0 -0
  14. data/SPONSORS.md +10 -18
  15. data/bin/solargraph +0 -0
  16. data/lib/solargraph/api_map/cache.rb +109 -70
  17. data/lib/solargraph/api_map/index.rb +167 -0
  18. data/lib/solargraph/api_map/source_to_yard.rb +88 -81
  19. data/lib/solargraph/api_map/store.rb +260 -256
  20. data/lib/solargraph/api_map.rb +870 -686
  21. data/lib/solargraph/bench.rb +44 -27
  22. data/lib/solargraph/cache.rb +77 -0
  23. data/lib/solargraph/complex_type/type_methods.rb +217 -130
  24. data/lib/solargraph/complex_type/unique_type.rb +386 -75
  25. data/lib/solargraph/complex_type.rb +394 -221
  26. data/lib/solargraph/convention/base.rb +33 -33
  27. data/lib/solargraph/convention/gemfile.rb +15 -15
  28. data/lib/solargraph/convention/gemspec.rb +22 -22
  29. data/lib/solargraph/convention/rakefile.rb +17 -0
  30. data/lib/solargraph/convention.rb +47 -47
  31. data/lib/solargraph/converters/dd.rb +17 -12
  32. data/lib/solargraph/converters/dl.rb +15 -12
  33. data/lib/solargraph/converters/dt.rb +15 -12
  34. data/lib/solargraph/converters/misc.rb +1 -1
  35. data/lib/solargraph/diagnostics/base.rb +29 -29
  36. data/lib/solargraph/diagnostics/require_not_found.rb +53 -53
  37. data/lib/solargraph/diagnostics/rubocop.rb +113 -98
  38. data/lib/solargraph/diagnostics/rubocop_helpers.rb +66 -63
  39. data/lib/solargraph/diagnostics/severities.rb +15 -15
  40. data/lib/solargraph/diagnostics/type_check.rb +55 -54
  41. data/lib/solargraph/diagnostics/update_errors.rb +41 -41
  42. data/lib/solargraph/diagnostics.rb +55 -55
  43. data/lib/solargraph/doc_map.rb +188 -0
  44. data/lib/solargraph/environ.rb +45 -45
  45. data/lib/solargraph/equality.rb +33 -0
  46. data/lib/solargraph/gem_pins.rb +72 -0
  47. data/lib/solargraph/language_server/completion_item_kinds.rb +35 -35
  48. data/lib/solargraph/language_server/error_codes.rb +20 -20
  49. data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
  50. data/lib/solargraph/language_server/host/dispatch.rb +128 -111
  51. data/lib/solargraph/language_server/host/message_worker.rb +106 -59
  52. data/lib/solargraph/language_server/host/sources.rb +99 -156
  53. data/lib/solargraph/language_server/host.rb +861 -865
  54. data/lib/solargraph/language_server/message/base.rb +96 -89
  55. data/lib/solargraph/language_server/message/cancel_request.rb +13 -13
  56. data/lib/solargraph/language_server/message/client/register_capability.rb +15 -15
  57. data/lib/solargraph/language_server/message/client.rb +11 -11
  58. data/lib/solargraph/language_server/message/completion_item/resolve.rb +60 -58
  59. data/lib/solargraph/language_server/message/completion_item.rb +11 -11
  60. data/lib/solargraph/language_server/message/exit_notification.rb +13 -13
  61. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +112 -100
  62. data/lib/solargraph/language_server/message/extended/document.rb +20 -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 -23
  65. data/lib/solargraph/language_server/message/extended/environment.rb +25 -25
  66. data/lib/solargraph/language_server/message/extended/search.rb +20 -20
  67. data/lib/solargraph/language_server/message/extended.rb +21 -21
  68. data/lib/solargraph/language_server/message/initialize.rb +191 -162
  69. data/lib/solargraph/language_server/message/initialized.rb +28 -27
  70. data/lib/solargraph/language_server/message/method_not_found.rb +16 -16
  71. data/lib/solargraph/language_server/message/method_not_implemented.rb +14 -14
  72. data/lib/solargraph/language_server/message/shutdown.rb +13 -13
  73. data/lib/solargraph/language_server/message/text_document/base.rb +19 -19
  74. data/lib/solargraph/language_server/message/text_document/code_action.rb +17 -17
  75. data/lib/solargraph/language_server/message/text_document/completion.rb +56 -59
  76. data/lib/solargraph/language_server/message/text_document/definition.rb +38 -38
  77. data/lib/solargraph/language_server/message/text_document/did_change.rb +15 -15
  78. data/lib/solargraph/language_server/message/text_document/did_close.rb +15 -15
  79. data/lib/solargraph/language_server/message/text_document/did_open.rb +15 -15
  80. data/lib/solargraph/language_server/message/text_document/did_save.rb +17 -17
  81. data/lib/solargraph/language_server/message/text_document/document_highlight.rb +16 -16
  82. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +26 -23
  83. data/lib/solargraph/language_server/message/text_document/folding_range.rb +26 -26
  84. data/lib/solargraph/language_server/message/text_document/formatting.rb +131 -126
  85. data/lib/solargraph/language_server/message/text_document/hover.rb +58 -54
  86. data/lib/solargraph/language_server/message/text_document/on_type_formatting.rb +34 -34
  87. data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +11 -11
  88. data/lib/solargraph/language_server/message/text_document/references.rb +16 -16
  89. data/lib/solargraph/language_server/message/text_document/rename.rb +19 -19
  90. data/lib/solargraph/language_server/message/text_document/signature_help.rb +24 -29
  91. data/lib/solargraph/language_server/message/text_document/type_definition.rb +24 -0
  92. data/lib/solargraph/language_server/message/text_document.rb +28 -28
  93. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +35 -30
  94. data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +40 -33
  95. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +24 -24
  96. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +23 -23
  97. data/lib/solargraph/language_server/message/workspace.rb +14 -14
  98. data/lib/solargraph/language_server/message.rb +94 -93
  99. data/lib/solargraph/language_server/message_types.rb +14 -14
  100. data/lib/solargraph/language_server/progress.rb +135 -0
  101. data/lib/solargraph/language_server/request.rb +24 -24
  102. data/lib/solargraph/language_server/symbol_kinds.rb +36 -36
  103. data/lib/solargraph/language_server/transport/adapter.rb +68 -53
  104. data/lib/solargraph/language_server/transport/data_reader.rb +74 -72
  105. data/lib/solargraph/language_server/transport.rb +13 -13
  106. data/lib/solargraph/language_server/uri_helpers.rb +49 -49
  107. data/lib/solargraph/language_server.rb +20 -19
  108. data/lib/solargraph/library.rb +663 -546
  109. data/lib/solargraph/location.rb +58 -37
  110. data/lib/solargraph/logging.rb +27 -27
  111. data/lib/solargraph/page.rb +89 -83
  112. data/lib/solargraph/parser/comment_ripper.rb +56 -52
  113. data/lib/solargraph/parser/node_methods.rb +83 -43
  114. data/lib/solargraph/parser/node_processor/base.rb +87 -77
  115. data/lib/solargraph/parser/node_processor.rb +45 -43
  116. data/lib/solargraph/parser/{legacy → parser_gem}/class_methods.rb +153 -135
  117. data/lib/solargraph/parser/{legacy → parser_gem}/flawed_builder.rb +18 -16
  118. data/lib/solargraph/parser/{legacy → parser_gem}/node_chainer.rb +164 -148
  119. data/lib/solargraph/parser/parser_gem/node_methods.rb +495 -0
  120. data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/alias_node.rb +23 -23
  121. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +57 -0
  122. data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/begin_node.rb +15 -15
  123. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/block_node.rb +43 -42
  124. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/casgn_node.rb +35 -25
  125. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/cvasgn_node.rb +23 -23
  126. data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/def_node.rb +50 -63
  127. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/defs_node.rb +36 -36
  128. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/gvasgn_node.rb +23 -23
  129. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/ivasgn_node.rb +38 -38
  130. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/lvasgn_node.rb +28 -28
  131. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +53 -0
  132. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/namespace_node.rb +39 -39
  133. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/orasgn_node.rb +16 -16
  134. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/resbody_node.rb +36 -36
  135. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +42 -0
  136. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/send_node.rb +259 -257
  137. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/sym_node.rb +18 -18
  138. data/lib/solargraph/parser/parser_gem/node_processors.rb +56 -0
  139. data/lib/solargraph/parser/parser_gem.rb +12 -0
  140. data/lib/solargraph/parser/region.rb +66 -66
  141. data/lib/solargraph/parser/snippet.rb +15 -13
  142. data/lib/solargraph/parser.rb +22 -26
  143. data/lib/solargraph/pin/base.rb +378 -296
  144. data/lib/solargraph/pin/base_variable.rb +118 -84
  145. data/lib/solargraph/pin/block.rb +101 -72
  146. data/lib/solargraph/pin/callable.rb +147 -0
  147. data/lib/solargraph/pin/class_variable.rb +8 -8
  148. data/lib/solargraph/pin/closure.rb +57 -37
  149. data/lib/solargraph/pin/common.rb +70 -70
  150. data/lib/solargraph/pin/constant.rb +43 -43
  151. data/lib/solargraph/pin/conversions.rb +123 -96
  152. data/lib/solargraph/pin/delegated_method.rb +101 -0
  153. data/lib/solargraph/pin/documenting.rb +98 -105
  154. data/lib/solargraph/pin/duck_method.rb +16 -16
  155. data/lib/solargraph/pin/global_variable.rb +8 -8
  156. data/lib/solargraph/pin/instance_variable.rb +34 -30
  157. data/lib/solargraph/pin/keyword.rb +15 -15
  158. data/lib/solargraph/pin/keyword_param.rb +8 -8
  159. data/lib/solargraph/pin/local_variable.rb +67 -55
  160. data/lib/solargraph/pin/method.rb +527 -245
  161. data/lib/solargraph/pin/method_alias.rb +31 -31
  162. data/lib/solargraph/pin/namespace.rb +107 -91
  163. data/lib/solargraph/pin/parameter.rb +212 -201
  164. data/lib/solargraph/pin/proxy_type.rb +29 -29
  165. data/lib/solargraph/pin/reference/extend.rb +10 -10
  166. data/lib/solargraph/pin/reference/include.rb +10 -10
  167. data/lib/solargraph/pin/reference/override.rb +29 -29
  168. data/lib/solargraph/pin/reference/prepend.rb +10 -10
  169. data/lib/solargraph/pin/reference/require.rb +14 -14
  170. data/lib/solargraph/pin/reference/superclass.rb +10 -10
  171. data/lib/solargraph/pin/reference.rb +22 -14
  172. data/lib/solargraph/pin/search.rb +56 -56
  173. data/lib/solargraph/pin/signature.rb +17 -0
  174. data/lib/solargraph/pin/singleton.rb +11 -11
  175. data/lib/solargraph/pin/symbol.rb +47 -47
  176. data/lib/solargraph/pin.rb +41 -37
  177. data/lib/solargraph/position.rb +107 -100
  178. data/lib/solargraph/range.rb +98 -95
  179. data/lib/solargraph/rbs_map/conversions.rb +646 -0
  180. data/lib/solargraph/rbs_map/core_fills.rb +50 -0
  181. data/lib/solargraph/rbs_map/core_map.rb +28 -0
  182. data/lib/solargraph/rbs_map/stdlib_map.rb +33 -0
  183. data/lib/solargraph/rbs_map.rb +93 -0
  184. data/lib/solargraph/server_methods.rb +16 -16
  185. data/lib/solargraph/shell.rb +269 -226
  186. data/lib/solargraph/source/chain/array.rb +33 -0
  187. data/lib/solargraph/source/chain/block_symbol.rb +13 -0
  188. data/lib/solargraph/source/chain/block_variable.rb +13 -13
  189. data/lib/solargraph/source/chain/call.rb +303 -204
  190. data/lib/solargraph/source/chain/class_variable.rb +13 -13
  191. data/lib/solargraph/source/chain/constant.rb +89 -75
  192. data/lib/solargraph/source/chain/global_variable.rb +13 -13
  193. data/lib/solargraph/source/chain/hash.rb +33 -28
  194. data/lib/solargraph/source/chain/head.rb +19 -19
  195. data/lib/solargraph/source/chain/if.rb +28 -0
  196. data/lib/solargraph/source/chain/instance_variable.rb +13 -13
  197. data/lib/solargraph/source/chain/link.rb +98 -71
  198. data/lib/solargraph/source/chain/literal.rb +28 -23
  199. data/lib/solargraph/source/chain/or.rb +23 -23
  200. data/lib/solargraph/source/chain/q_call.rb +11 -11
  201. data/lib/solargraph/source/chain/variable.rb +13 -13
  202. data/lib/solargraph/source/chain/z_super.rb +30 -30
  203. data/lib/solargraph/source/chain.rb +252 -164
  204. data/lib/solargraph/source/change.rb +82 -79
  205. data/lib/solargraph/source/cursor.rb +167 -164
  206. data/lib/solargraph/source/source_chainer.rb +194 -191
  207. data/lib/solargraph/source/updater.rb +55 -54
  208. data/lib/solargraph/source.rb +495 -522
  209. data/lib/solargraph/source_map/clip.rb +232 -224
  210. data/lib/solargraph/source_map/completion.rb +23 -23
  211. data/lib/solargraph/source_map/data.rb +30 -0
  212. data/lib/solargraph/source_map/mapper.rb +255 -212
  213. data/lib/solargraph/source_map.rb +217 -180
  214. data/lib/solargraph/type_checker/checks.rb +120 -99
  215. data/lib/solargraph/type_checker/param_def.rb +35 -35
  216. data/lib/solargraph/type_checker/problem.rb +32 -32
  217. data/lib/solargraph/type_checker/rules.rb +62 -57
  218. data/lib/solargraph/type_checker.rb +672 -543
  219. data/lib/solargraph/version.rb +5 -5
  220. data/lib/solargraph/views/environment.erb +56 -58
  221. data/lib/solargraph/workspace/config.rb +239 -231
  222. data/lib/solargraph/workspace.rb +239 -215
  223. data/lib/solargraph/yard_map/cache.rb +25 -19
  224. data/lib/solargraph/yard_map/helpers.rb +16 -16
  225. data/lib/solargraph/yard_map/mapper/to_constant.rb +26 -25
  226. data/lib/solargraph/yard_map/mapper/to_method.rb +94 -78
  227. data/lib/solargraph/yard_map/mapper/to_namespace.rb +28 -27
  228. data/lib/solargraph/yard_map/mapper.rb +78 -77
  229. data/lib/solargraph/yard_map/to_method.rb +86 -79
  230. data/lib/solargraph/yard_map.rb +18 -460
  231. data/lib/solargraph/yard_tags.rb +20 -0
  232. data/lib/solargraph/yardoc.rb +52 -0
  233. data/lib/solargraph.rb +72 -69
  234. data/solargraph.gemspec +21 -10
  235. metadata +184 -115
  236. data/.travis.yml +0 -19
  237. data/lib/solargraph/api_map/bundler_methods.rb +0 -22
  238. data/lib/solargraph/compat.rb +0 -37
  239. data/lib/solargraph/convention/rspec.rb +0 -30
  240. data/lib/solargraph/documentor.rb +0 -76
  241. data/lib/solargraph/language_server/host/cataloger.rb +0 -56
  242. data/lib/solargraph/parser/legacy/node_methods.rb +0 -325
  243. data/lib/solargraph/parser/legacy/node_processors/alias_node.rb +0 -23
  244. data/lib/solargraph/parser/legacy/node_processors/args_node.rb +0 -35
  245. data/lib/solargraph/parser/legacy/node_processors/begin_node.rb +0 -15
  246. data/lib/solargraph/parser/legacy/node_processors/def_node.rb +0 -63
  247. data/lib/solargraph/parser/legacy/node_processors/sclass_node.rb +0 -21
  248. data/lib/solargraph/parser/legacy/node_processors.rb +0 -54
  249. data/lib/solargraph/parser/legacy.rb +0 -12
  250. data/lib/solargraph/parser/rubyvm/class_methods.rb +0 -144
  251. data/lib/solargraph/parser/rubyvm/node_chainer.rb +0 -160
  252. data/lib/solargraph/parser/rubyvm/node_methods.rb +0 -315
  253. data/lib/solargraph/parser/rubyvm/node_processors/args_node.rb +0 -85
  254. data/lib/solargraph/parser/rubyvm/node_processors/block_node.rb +0 -42
  255. data/lib/solargraph/parser/rubyvm/node_processors/casgn_node.rb +0 -22
  256. data/lib/solargraph/parser/rubyvm/node_processors/cvasgn_node.rb +0 -23
  257. data/lib/solargraph/parser/rubyvm/node_processors/defs_node.rb +0 -57
  258. data/lib/solargraph/parser/rubyvm/node_processors/gvasgn_node.rb +0 -23
  259. data/lib/solargraph/parser/rubyvm/node_processors/ivasgn_node.rb +0 -38
  260. data/lib/solargraph/parser/rubyvm/node_processors/kw_arg_node.rb +0 -39
  261. data/lib/solargraph/parser/rubyvm/node_processors/lit_node.rb +0 -20
  262. data/lib/solargraph/parser/rubyvm/node_processors/lvasgn_node.rb +0 -27
  263. data/lib/solargraph/parser/rubyvm/node_processors/namespace_node.rb +0 -39
  264. data/lib/solargraph/parser/rubyvm/node_processors/opt_arg_node.rb +0 -26
  265. data/lib/solargraph/parser/rubyvm/node_processors/orasgn_node.rb +0 -15
  266. data/lib/solargraph/parser/rubyvm/node_processors/resbody_node.rb +0 -45
  267. data/lib/solargraph/parser/rubyvm/node_processors/sclass_node.rb +0 -21
  268. data/lib/solargraph/parser/rubyvm/node_processors/scope_node.rb +0 -15
  269. data/lib/solargraph/parser/rubyvm/node_processors/send_node.rb +0 -277
  270. data/lib/solargraph/parser/rubyvm/node_processors/sym_node.rb +0 -18
  271. data/lib/solargraph/parser/rubyvm/node_processors.rb +0 -63
  272. data/lib/solargraph/parser/rubyvm.rb +0 -40
  273. data/lib/solargraph/yard_map/core_docs.rb +0 -170
  274. data/lib/solargraph/yard_map/core_fills.rb +0 -208
  275. data/lib/solargraph/yard_map/core_gen.rb +0 -76
  276. data/lib/solargraph/yard_map/rdoc_to_yard.rb +0 -140
  277. data/lib/solargraph/yard_map/stdlib_fills.rb +0 -43
  278. data/lib/yard-solargraph.rb +0 -33
  279. data/yardoc/2.2.2.tar.gz +0 -0
@@ -1,27 +1,44 @@
1
- # frozen_string_literal: true
2
-
3
- require 'set'
4
-
5
- module Solargraph
6
- # A container of source maps and workspace data to be cataloged in an ApiMap.
7
- #
8
- class Bench
9
- # @return [Set<SourceMap>]
10
- attr_reader :source_maps
11
-
12
- # @return [Workspace]
13
- attr_reader :workspace
14
-
15
- # @return [Set<String>]
16
- attr_reader :external_requires
17
-
18
- # @param source_maps [Array<SourceMap>, Set<SourceMap>]
19
- # @param workspace [Workspace]
20
- # @param external_requires [Array<String>, Set<String>]
21
- def initialize source_maps: [], workspace: Workspace.new, external_requires: []
22
- @source_maps = source_maps.to_set
23
- @workspace = workspace
24
- @external_requires = external_requires.to_set
25
- end
26
- end
27
- end
1
+ # frozen_string_literal: true
2
+
3
+
4
+ module Solargraph
5
+ # A container of source maps and workspace data to be cataloged in an ApiMap.
6
+ #
7
+ class Bench
8
+ # @return [Set<SourceMap>]
9
+ attr_reader :source_maps
10
+
11
+ # @return [Workspace]
12
+ attr_reader :workspace
13
+
14
+ # @return [SourceMap]
15
+ attr_reader :live_map
16
+
17
+ # @return [Set<String>]
18
+ attr_reader :external_requires
19
+
20
+ # @param source_maps [Array<SourceMap>, Set<SourceMap>]
21
+ # @param workspace [Workspace]
22
+ # @param live_map [SourceMap, nil]
23
+ # @param external_requires [Array<String>, Set<String>]
24
+ def initialize source_maps: [], workspace: Workspace.new, live_map: nil, external_requires: []
25
+ @source_maps = source_maps.to_set
26
+ @workspace = workspace
27
+ @live_map = live_map
28
+ @external_requires = external_requires.reject { |path| workspace.would_require?(path) }
29
+ .compact
30
+ .to_set
31
+ end
32
+
33
+ # @return [Hash{String => SourceMap}]
34
+ def source_map_hash
35
+ # @todo Work around #to_h bug in current Ruby head (3.5) with #map#to_h
36
+ @source_map_hash ||= source_maps.map { |s| [s.filename, s] }
37
+ .to_h
38
+ end
39
+
40
+ def icebox
41
+ @icebox ||= (source_maps - [live_map])
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,77 @@
1
+ require 'fileutils'
2
+ require 'rbs'
3
+
4
+ module Solargraph
5
+ module Cache
6
+ class << self
7
+ # The base directory where cached documentation is installed.
8
+ #
9
+ # @return [String]
10
+ def base_dir
11
+ # The directory is not stored in a variable so it can be overridden
12
+ # in specs.
13
+ ENV['SOLARGRAPH_CACHE'] ||
14
+ (ENV['XDG_CACHE_HOME'] ? File.join(ENV['XDG_CACHE_HOME'], 'solargraph') : nil) ||
15
+ File.join(Dir.home, '.cache', 'solargraph')
16
+ end
17
+
18
+ # The working directory for the current Ruby, RBS, and Solargraph versions.
19
+ #
20
+ # @return [String]
21
+ def work_dir
22
+ # The directory is not stored in a variable so it can be overridden
23
+ # in specs.
24
+ File.join(base_dir, "ruby-#{RUBY_VERSION}", "rbs-#{RBS::VERSION}", "solargraph-#{Solargraph::VERSION}")
25
+ end
26
+
27
+ # Append the given path to the current cache directory (`work_dir`).
28
+ #
29
+ # @example
30
+ # Cache.join('date-3.4.1.ser')
31
+ #
32
+ # @param path [Array<String>]
33
+ # @return [String]
34
+ def join *path
35
+ File.join(work_dir, *path)
36
+ end
37
+
38
+ # @param path [Array<String>]
39
+ # @return [Array<Solargraph::Pin::Base>, nil]
40
+ def load *path
41
+ file = join(*path)
42
+ return nil unless File.file?(file)
43
+ Marshal.load(File.read(file, mode: 'rb'))
44
+ rescue StandardError => e
45
+ Solargraph.logger.warn "Failed to load cached file #{file}: [#{e.class}] #{e.message}"
46
+ FileUtils.rm_f file
47
+ nil
48
+ end
49
+
50
+ def exist? *path
51
+ File.file? join(*path)
52
+ end
53
+
54
+ # @param path [Array<String>]
55
+ # @param pins [Array<Pin::Base>]
56
+ # @return [void]
57
+ def save *path, pins
58
+ file = File.join(work_dir, *path)
59
+ base = File.dirname(file)
60
+ FileUtils.mkdir_p base unless File.directory?(base)
61
+ ser = Marshal.dump(pins)
62
+ File.write file, ser, mode: 'wb'
63
+ end
64
+
65
+ # @return [void]
66
+ # @param path [Array<String>]
67
+ def uncache *path
68
+ FileUtils.rm_rf File.join(work_dir, *path), secure: true
69
+ end
70
+
71
+ # @return [void]
72
+ def clear
73
+ FileUtils.rm_rf base_dir, secure: true
74
+ end
75
+ end
76
+ end
77
+ end
@@ -1,130 +1,217 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- class ComplexType
5
- # Methods for accessing type data.
6
- #
7
- module TypeMethods
8
- # @return [String]
9
- attr_reader :name
10
-
11
- # @return [String]
12
- attr_reader :substring
13
-
14
- # @return [String]
15
- attr_reader :tag
16
-
17
- # @return [Array<ComplexType>]
18
- attr_reader :subtypes
19
-
20
- # @return [Boolean]
21
- def duck_type?
22
- @duck_type ||= name.start_with?('#')
23
- end
24
-
25
- # @return [Boolean]
26
- def nil_type?
27
- @nil_type = (name.casecmp('nil') == 0) if @nil_type.nil?
28
- @nil_type
29
- end
30
-
31
- # @return [Boolean]
32
- def parameters?
33
- !substring.empty?
34
- end
35
-
36
- def void?
37
- name == 'void'
38
- end
39
-
40
- def defined?
41
- !undefined?
42
- end
43
-
44
- def undefined?
45
- name == 'undefined'
46
- end
47
-
48
- # @return [Boolean]
49
- def list_parameters?
50
- substring.start_with?('<')
51
- end
52
-
53
- # @return [Boolean]
54
- def fixed_parameters?
55
- substring.start_with?('(')
56
- end
57
-
58
- # @return [Boolean]
59
- def hash_parameters?
60
- substring.start_with?('{')
61
- end
62
-
63
- # @return [Array<ComplexType>]
64
- def value_types
65
- @subtypes
66
- end
67
-
68
- # @return [Array<ComplexType>]
69
- def key_types
70
- @key_types
71
- end
72
-
73
- # @return [String]
74
- def namespace
75
- # if priority higher than ||=, old implements cause unnecessary check
76
- @namespace ||= lambda do
77
- return 'Object' if duck_type?
78
- return 'NilClass' if nil_type?
79
- return (name == 'Class' || name == 'Module') && !subtypes.empty? ? subtypes.first.name : name
80
- end.call
81
- end
82
-
83
- # @return [Symbol] :class or :instance
84
- def scope
85
- @scope ||= :instance if duck_type? || nil_type?
86
- @scope ||= (name == 'Class' || name == 'Module') && !subtypes.empty? ? :class : :instance
87
- end
88
-
89
- def == other
90
- return false unless self.class == other.class
91
- tag == other.tag
92
- end
93
-
94
- def rooted?
95
- @rooted
96
- end
97
-
98
- # Generate a ComplexType that fully qualifies this type's namespaces.
99
- #
100
- # @param api_map [ApiMap] The ApiMap that performs qualification
101
- # @param context [String] The namespace from which to resolve names
102
- # @return [ComplexType] The generated ComplexType
103
- def qualify api_map, context = ''
104
- return ComplexType.new([self]) if duck_type? || void? || undefined?
105
- recon = (rooted? ? '' : context)
106
- fqns = api_map.qualify(name, recon)
107
- if fqns.nil?
108
- return UniqueType::BOOLEAN if tag == 'Boolean'
109
- return UniqueType::UNDEFINED
110
- end
111
- fqns = "::#{fqns}" # Ensure the resulting complex type is rooted
112
- ltypes = key_types.map do |t|
113
- t.qualify api_map, context
114
- end
115
- rtypes = value_types.map do |t|
116
- t.qualify api_map, context
117
- end
118
- if list_parameters?
119
- Solargraph::ComplexType.parse("#{fqns}<#{rtypes.map(&:tag).join(', ')}>")
120
- elsif fixed_parameters?
121
- Solargraph::ComplexType.parse("#{fqns}(#{rtypes.map(&:tag).join(', ')})")
122
- elsif hash_parameters?
123
- Solargraph::ComplexType.parse("#{fqns}{#{ltypes.map(&:tag).join(', ')} => #{rtypes.map(&:tag).join(', ')}}")
124
- else
125
- Solargraph::ComplexType.parse(fqns)
126
- end
127
- end
128
- end
129
- end
130
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ class ComplexType
5
+ # Methods for accessing type data available from
6
+ # both ComplexType and UniqueType.
7
+ #
8
+ # @abstract This mixin relies on these -
9
+ # instance variables:
10
+ # @name: String
11
+ # @subtypes: Array<ComplexType>
12
+ # @rooted: boolish
13
+ # methods:
14
+ # transform()
15
+ # all_params()
16
+ # rooted?()
17
+ # can_root_name?()
18
+ module TypeMethods
19
+ # @!method transform(new_name = nil, &transform_type)
20
+ # @param new_name [String, nil]
21
+ # @yieldparam t [UniqueType]
22
+ # @yieldreturn [UniqueType]
23
+ # @return [UniqueType, nil]
24
+ # @!method all_params
25
+ # @return [Array<ComplexType>]
26
+ # @!method rooted?
27
+ # @!method can_root_name?(name_to_check = nil)
28
+ # @param name_to_check [String, nil]
29
+
30
+ # @return [String]
31
+ attr_reader :name
32
+
33
+ # @return [Array<ComplexType>]
34
+ attr_reader :subtypes
35
+
36
+ # @return [String]
37
+ def tag
38
+ @tag ||= "#{name}#{substring}"
39
+ end
40
+
41
+ # @return [String]
42
+ def rooted_tag
43
+ @rooted_tag ||= rooted_name + rooted_substring
44
+ end
45
+
46
+ # @return [Boolean]
47
+ def duck_type?
48
+ @duck_type ||= name.start_with?('#')
49
+ end
50
+
51
+ # @return [Boolean]
52
+ def nil_type?
53
+ @nil_type ||= (name.casecmp('nil') == 0)
54
+ end
55
+
56
+ def tuple?
57
+ @tuple_type ||= (name == 'Tuple') || (name == 'Array' && subtypes.length >= 1 && fixed_parameters?)
58
+ end
59
+
60
+ def void?
61
+ name == 'void'
62
+ end
63
+
64
+ def defined?
65
+ !undefined?
66
+ end
67
+
68
+ def undefined?
69
+ name == 'undefined'
70
+ end
71
+
72
+ # @param generics_to_erase [Enumerable<String>]
73
+ # @return [self]
74
+ def erase_generics(generics_to_erase)
75
+ transform do |type|
76
+ if type.name == ComplexType::GENERIC_TAG_NAME
77
+ if type.all_params.length == 1 && generics_to_erase.include?(type.all_params.first.to_s)
78
+ ComplexType::UNDEFINED
79
+ else
80
+ type
81
+ end
82
+ else
83
+ type
84
+ end
85
+ end
86
+ end
87
+
88
+ # @return [Symbol, nil]
89
+ attr_reader :parameters_type
90
+
91
+ PARAMETERS_TYPE_BY_STARTING_TAG = {
92
+ '{' => :hash,
93
+ '(' => :fixed,
94
+ '<' => :list
95
+ }.freeze
96
+
97
+ # @return [Boolean]
98
+ def list_parameters?
99
+ parameters_type == :list
100
+ end
101
+
102
+ # @return [Boolean]
103
+ def fixed_parameters?
104
+ parameters_type == :fixed
105
+ end
106
+
107
+ # @return [Boolean]
108
+ def hash_parameters?
109
+ parameters_type == :hash
110
+ end
111
+
112
+ # @return [Array<ComplexType>]
113
+ def value_types
114
+ @subtypes
115
+ end
116
+
117
+ # @return [Array<ComplexType>]
118
+ def key_types
119
+ @key_types
120
+ end
121
+
122
+ # @return [String]
123
+ def namespace
124
+ # if priority higher than ||=, old implements cause unnecessary check
125
+ @namespace ||= lambda do
126
+ return 'Object' if duck_type?
127
+ return 'NilClass' if nil_type?
128
+ return (name == 'Class' || name == 'Module') && !subtypes.empty? ? subtypes.first.name : name
129
+ end.call
130
+ end
131
+
132
+ def namespace_type
133
+ return ComplexType.parse('::Object') if duck_type?
134
+ return ComplexType.parse('::NilClass') if nil_type?
135
+ return subtypes.first if (name == 'Class' || name == 'Module') && !subtypes.empty?
136
+ self
137
+ end
138
+
139
+ # @return [String]
140
+ def rooted_namespace
141
+ return namespace unless rooted? && can_root_name?(namespace)
142
+ "::#{namespace}"
143
+ end
144
+
145
+ # @return [String]
146
+ def rooted_name
147
+ return name unless @rooted && can_root_name?
148
+ "::#{name}"
149
+ end
150
+
151
+ # @return [String]
152
+ def substring
153
+ @substring ||= generate_substring_from(&:tags)
154
+ end
155
+
156
+ # @return [String]
157
+ def rooted_substring
158
+ @rooted_substring = generate_substring_from(&:rooted_tags)
159
+ end
160
+
161
+ # @return [String]
162
+ def generate_substring_from(&to_str)
163
+ key_types_str = key_types.map(&to_str).join(', ')
164
+ subtypes_str = subtypes.map(&to_str).join(', ')
165
+ if key_types.none?(&:defined?) && subtypes.none?(&:defined?)
166
+ ''
167
+ elsif key_types.empty? && subtypes.empty?
168
+ ''
169
+ elsif hash_parameters?
170
+ "{#{key_types_str} => #{subtypes_str}}"
171
+ elsif fixed_parameters?
172
+ "(#{subtypes_str})"
173
+ else
174
+ "<#{subtypes_str}>"
175
+ end
176
+ end
177
+
178
+ # @return [::Symbol] :class or :instance
179
+ def scope
180
+ @scope ||= :instance if duck_type? || nil_type?
181
+ @scope ||= (name == 'Class' || name == 'Module') && !subtypes.empty? ? :class : :instance
182
+ end
183
+
184
+ # @param other [Object]
185
+ def == other
186
+ return false unless self.class == other.class
187
+ tag == other.tag
188
+ end
189
+
190
+ # Generate a ComplexType that fully qualifies this type's namespaces.
191
+ #
192
+ # @param api_map [ApiMap] The ApiMap that performs qualification
193
+ # @param context [String] The namespace from which to resolve names
194
+ # @return [self, ComplexType, UniqueType] The generated ComplexType
195
+ def qualify api_map, context = ''
196
+ transform do |t|
197
+ next t if t.name == GENERIC_TAG_NAME
198
+ next t if t.duck_type? || t.void? || t.undefined?
199
+ recon = (t.rooted? ? '' : context)
200
+ fqns = api_map.qualify(t.name, recon)
201
+ if fqns.nil?
202
+ next UniqueType::BOOLEAN if t.tag == 'Boolean'
203
+ next UniqueType::UNDEFINED
204
+ end
205
+ t.recreate(new_name: fqns, make_rooted: true)
206
+ end
207
+ end
208
+
209
+ # @yieldparam [UniqueType]
210
+ # @return [Enumerator<UniqueType>]
211
+ def each_unique_type &block
212
+ return enum_for(__method__) unless block_given?
213
+ yield self
214
+ end
215
+ end
216
+ end
217
+ end