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,215 +1,239 @@
1
- # frozen_string_literal: true
2
-
3
- require 'open3'
4
- require 'rubygems'
5
- require 'json'
6
-
7
- module Solargraph
8
- # A workspace consists of the files in a project's directory and the
9
- # project's configuration. It provides a Source for each file to be used
10
- # in an associated Library or ApiMap.
11
- #
12
- class Workspace
13
- autoload :Config, 'solargraph/workspace/config'
14
-
15
- # @return [String]
16
- attr_reader :directory
17
-
18
- # The require paths associated with the workspace.
19
- #
20
- # @return [Array<String>]
21
- attr_reader :require_paths
22
-
23
- # @return [Array<String>]
24
- attr_reader :gemnames
25
- alias source_gems gemnames
26
-
27
- # @param directory [String]
28
- # @param config [Config, nil]
29
- def initialize directory = '', config = nil
30
- @directory = directory
31
- @config = config
32
- load_sources
33
- @gemnames = []
34
- @require_paths = generate_require_paths
35
- require_plugins
36
- end
37
-
38
- # @return [Solargraph::Workspace::Config]
39
- def config
40
- @config ||= Solargraph::Workspace::Config.new(directory)
41
- end
42
-
43
- # Merge the source. A merge will update the existing source for the file
44
- # or add it to the sources if the workspace is configured to include it.
45
- # The source is ignored if the configuration excludes it.
46
- #
47
- # @param source [Solargraph::Source]
48
- # @return [Boolean] True if the source was added to the workspace
49
- def merge source
50
- unless directory == '*' || source_hash.key?(source.filename)
51
- # Reload the config to determine if a new source should be included
52
- @config = Solargraph::Workspace::Config.new(directory)
53
- return false unless config.calculated.include?(source.filename)
54
- end
55
- source_hash[source.filename] = source
56
- true
57
- end
58
-
59
- # Determine whether a file would be merged into the workspace.
60
- #
61
- # @param filename [String]
62
- # @return [Boolean]
63
- def would_merge? filename
64
- return true if directory == '*' || source_hash.include?(filename)
65
- @config = Solargraph::Workspace::Config.new(directory)
66
- config.calculated.include?(filename)
67
- end
68
-
69
- # Remove a source from the workspace. The source will not be removed if
70
- # its file exists and the workspace is configured to include it.
71
- #
72
- # @param filename [String]
73
- # @return [Boolean] True if the source was removed from the workspace
74
- def remove filename
75
- return false unless source_hash.key?(filename)
76
- source_hash.delete filename
77
- true
78
- end
79
-
80
- # @return [Array<String>]
81
- def filenames
82
- source_hash.keys
83
- end
84
-
85
- # @return [Array<Solargraph::Source>]
86
- def sources
87
- source_hash.values
88
- end
89
-
90
- # @param filename [String]
91
- # @return [Boolean]
92
- def has_file? filename
93
- source_hash.key?(filename)
94
- end
95
-
96
- # Get a source by its filename.
97
- #
98
- # @param filename [String]
99
- # @return [Solargraph::Source]
100
- def source filename
101
- source_hash[filename]
102
- end
103
-
104
- # True if the path resolves to a file in the workspace's require paths.
105
- #
106
- # @param path [String]
107
- # @return [Boolean]
108
- def would_require? path
109
- require_paths.each do |rp|
110
- return true if File.exist?(File.join(rp, "#{path}.rb"))
111
- end
112
- false
113
- end
114
-
115
- # True if the workspace contains at least one gemspec file.
116
- #
117
- # @return [Boolean]
118
- def gemspec?
119
- !gemspecs.empty?
120
- end
121
-
122
- # Get an array of all gemspec files in the workspace.
123
- #
124
- # @return [Array<String>]
125
- def gemspecs
126
- return [] if directory.empty? || directory == '*'
127
- @gemspecs ||= Dir[File.join(directory, '**/*.gemspec')].select do |gs|
128
- config.allow? gs
129
- end
130
- end
131
-
132
- # Synchronize the workspace from the provided updater.
133
- #
134
- # @param updater [Source::Updater]
135
- # @return [void]
136
- def synchronize! updater
137
- source_hash[updater.filename] = source_hash[updater.filename].synchronize(updater)
138
- end
139
-
140
- private
141
-
142
- # @return [Hash{String => Solargraph::Source}]
143
- def source_hash
144
- @source_hash ||= {}
145
- end
146
-
147
- # @return [void]
148
- def load_sources
149
- source_hash.clear
150
- unless directory.empty? || directory == '*'
151
- size = config.calculated.length
152
- raise WorkspaceTooLargeError, "The workspace is too large to index (#{size} files, #{config.max_files} max)" if config.max_files > 0 and size > config.max_files
153
- config.calculated.each do |filename|
154
- begin
155
- source_hash[filename] = Solargraph::Source.load(filename)
156
- rescue Errno::ENOENT => e
157
- Solargraph.logger.warn("Error loading #{filename}: [#{e.class}] #{e.message}")
158
- end
159
- end
160
- end
161
- end
162
-
163
- # Generate require paths from gemspecs if they exist or assume the default
164
- # lib directory.
165
- #
166
- # @return [Array<String>]
167
- def generate_require_paths
168
- return configured_require_paths unless gemspec?
169
- result = []
170
- gemspecs.each do |file|
171
- base = File.dirname(file)
172
- # HACK: Evaluating gemspec files violates the goal of not running
173
- # workspace code, but this is how Gem::Specification.load does it
174
- # anyway.
175
- cmd = ['ruby', '-e', "require 'rubygems'; require 'json'; spec = eval(File.read('#{file}'), TOPLEVEL_BINDING, '#{file}'); return unless Gem::Specification === spec; puts({name: spec.name, paths: spec.require_paths}.to_json)"]
176
- o, e, s = Open3.capture3(*cmd)
177
- if s.success?
178
- begin
179
- hash = o && !o.empty? ? JSON.parse(o.split("\n").last) : {}
180
- next if hash.empty?
181
- @gemnames.push hash['name']
182
- result.concat(hash['paths'].map { |path| File.join(base, path) })
183
- rescue StandardError => e
184
- Solargraph.logger.warn "Error reading #{file}: [#{e.class}] #{e.message}"
185
- end
186
- else
187
- Solargraph.logger.warn "Error reading #{file}"
188
- Solargraph.logger.warn e
189
- end
190
- end
191
- result.concat(config.require_paths.map { |p| File.join(directory, p) })
192
- result.push File.join(directory, 'lib') if result.empty?
193
- result
194
- end
195
-
196
- # Get additional require paths defined in the configuration.
197
- #
198
- # @return [Array<String>]
199
- def configured_require_paths
200
- return ['lib'] if directory.empty?
201
- return [File.join(directory, 'lib')] if config.require_paths.empty?
202
- config.require_paths.map{|p| File.join(directory, p)}
203
- end
204
-
205
- def require_plugins
206
- config.plugins.each do |plugin|
207
- begin
208
- require plugin
209
- rescue LoadError
210
- Solargraph.logger.warn "Failed to load plugin '#{plugin}'"
211
- end
212
- end
213
- end
214
- end
215
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'open3'
4
+ require 'json'
5
+
6
+ module Solargraph
7
+ # A workspace consists of the files in a project's directory and the
8
+ # project's configuration. It provides a Source for each file to be used
9
+ # in an associated Library or ApiMap.
10
+ #
11
+ class Workspace
12
+ autoload :Config, 'solargraph/workspace/config'
13
+
14
+ # @return [String]
15
+ attr_reader :directory
16
+
17
+ # The require paths associated with the workspace.
18
+ #
19
+ # @return [Array<String>]
20
+ attr_reader :require_paths
21
+
22
+ # @return [Array<String>]
23
+ attr_reader :gemnames
24
+ alias source_gems gemnames
25
+
26
+ # @param directory [String]
27
+ # @param config [Config, nil]
28
+ # @param server [Hash]
29
+ def initialize directory = '', config = nil, server = {}
30
+ @directory = directory
31
+ @config = config
32
+ @server = server
33
+ load_sources
34
+ @gemnames = []
35
+ @require_paths = generate_require_paths
36
+ require_plugins
37
+ end
38
+
39
+ # @return [Solargraph::Workspace::Config]
40
+ def config
41
+ @config ||= Solargraph::Workspace::Config.new(directory)
42
+ end
43
+
44
+ # Merge the source. A merge will update the existing source for the file
45
+ # or add it to the sources if the workspace is configured to include it.
46
+ # The source is ignored if the configuration excludes it.
47
+ #
48
+ # @param sources [Array<Solargraph::Source>]
49
+ # @return [Boolean] True if the source was added to the workspace
50
+ def merge *sources
51
+ unless directory == '*' || sources.all? { |source| source_hash.key?(source.filename) }
52
+ # Reload the config to determine if a new source should be included
53
+ @config = Solargraph::Workspace::Config.new(directory)
54
+ end
55
+
56
+ includes_any = false
57
+ sources.each do |source|
58
+ if directory == "*" || config.calculated.include?(source.filename)
59
+ source_hash[source.filename] = source
60
+ includes_any = true
61
+ end
62
+ end
63
+
64
+ includes_any
65
+ end
66
+
67
+ # Remove a source from the workspace. The source will not be removed if
68
+ # its file exists and the workspace is configured to include it.
69
+ #
70
+ # @param filename [String]
71
+ # @return [Boolean] True if the source was removed from the workspace
72
+ def remove filename
73
+ return false unless source_hash.key?(filename)
74
+ source_hash.delete filename
75
+ true
76
+ end
77
+
78
+ # @return [Array<String>]
79
+ def filenames
80
+ source_hash.keys
81
+ end
82
+
83
+ # @return [Array<Solargraph::Source>]
84
+ def sources
85
+ source_hash.values
86
+ end
87
+
88
+ # @param filename [String]
89
+ # @return [Boolean]
90
+ def has_file? filename
91
+ source_hash.key?(filename)
92
+ end
93
+
94
+ # Get a source by its filename.
95
+ #
96
+ # @param filename [String]
97
+ # @return [Solargraph::Source]
98
+ def source filename
99
+ source_hash[filename]
100
+ end
101
+
102
+ # True if the path resolves to a file in the workspace's require paths.
103
+ #
104
+ # @param path [String]
105
+ # @return [Boolean]
106
+ def would_require? path
107
+ require_paths.each do |rp|
108
+ full = File.join rp, path
109
+ return true if File.exist?(full) or File.exist?(full << ".rb")
110
+ end
111
+ false
112
+ end
113
+
114
+ # True if the workspace contains at least one gemspec file.
115
+ #
116
+ # @return [Boolean]
117
+ def gemspec?
118
+ !gemspecs.empty?
119
+ end
120
+
121
+ # Get an array of all gemspec files in the workspace.
122
+ #
123
+ # @return [Array<String>]
124
+ def gemspecs
125
+ return [] if directory.empty? || directory == '*'
126
+ @gemspecs ||= Dir[File.join(directory, '**/*.gemspec')].select do |gs|
127
+ config.allow? gs
128
+ end
129
+ end
130
+
131
+ # @return [String, nil]
132
+ def rbs_collection_path
133
+ @gem_rbs_collection ||= read_rbs_collection_path
134
+ end
135
+
136
+ # Synchronize the workspace from the provided updater.
137
+ #
138
+ # @param updater [Source::Updater]
139
+ # @return [void]
140
+ def synchronize! updater
141
+ source_hash[updater.filename] = source_hash[updater.filename].synchronize(updater)
142
+ end
143
+
144
+ # @return [String]
145
+ def command_path
146
+ server['commandPath'] || 'solargraph'
147
+ end
148
+
149
+ private
150
+
151
+ # The language server configuration (or an empty hash if the workspace was
152
+ # not initialized from a server).
153
+ #
154
+ # @return [Hash]
155
+ attr_reader :server
156
+
157
+ # @return [Hash{String => Solargraph::Source}]
158
+ def source_hash
159
+ @source_hash ||= {}
160
+ end
161
+
162
+ # @return [void]
163
+ def load_sources
164
+ source_hash.clear
165
+ unless directory.empty? || directory == '*'
166
+ size = config.calculated.length
167
+ raise WorkspaceTooLargeError, "The workspace is too large to index (#{size} files, #{config.max_files} max)" if config.max_files > 0 and size > config.max_files
168
+ config.calculated.each do |filename|
169
+ begin
170
+ source_hash[filename] = Solargraph::Source.load(filename)
171
+ rescue Errno::ENOENT => e
172
+ Solargraph.logger.warn("Error loading #{filename}: [#{e.class}] #{e.message}")
173
+ end
174
+ end
175
+ end
176
+ end
177
+
178
+ # Generate require paths from gemspecs if they exist or assume the default
179
+ # lib directory.
180
+ #
181
+ # @return [Array<String>]
182
+ def generate_require_paths
183
+ return configured_require_paths unless gemspec?
184
+ result = []
185
+ gemspecs.each do |file|
186
+ base = File.dirname(file)
187
+ # HACK: Evaluating gemspec files violates the goal of not running
188
+ # workspace code, but this is how Gem::Specification.load does it
189
+ # anyway.
190
+ cmd = ['ruby', '-e', "require 'rubygems'; require 'json'; spec = eval(File.read('#{file}'), TOPLEVEL_BINDING, '#{file}'); return unless Gem::Specification === spec; puts({name: spec.name, paths: spec.require_paths}.to_json)"]
191
+ o, e, s = Open3.capture3(*cmd)
192
+ if s.success?
193
+ begin
194
+ hash = o && !o.empty? ? JSON.parse(o.split("\n").last) : {}
195
+ next if hash.empty?
196
+ @gemnames.push hash['name']
197
+ result.concat(hash['paths'].map { |path| File.join(base, path) })
198
+ rescue StandardError => e
199
+ Solargraph.logger.warn "Error reading #{file}: [#{e.class}] #{e.message}"
200
+ end
201
+ else
202
+ Solargraph.logger.warn "Error reading #{file}"
203
+ Solargraph.logger.warn e
204
+ end
205
+ end
206
+ result.concat(config.require_paths.map { |p| File.join(directory, p) })
207
+ result.push File.join(directory, 'lib') if result.empty?
208
+ result
209
+ end
210
+
211
+ # Get additional require paths defined in the configuration.
212
+ #
213
+ # @return [Array<String>]
214
+ def configured_require_paths
215
+ return ['lib'] if directory.empty?
216
+ return [File.join(directory, 'lib')] if config.require_paths.empty?
217
+ config.require_paths.map{|p| File.join(directory, p)}
218
+ end
219
+
220
+ # @return [void]
221
+ def require_plugins
222
+ config.plugins.each do |plugin|
223
+ begin
224
+ require plugin
225
+ rescue LoadError
226
+ Solargraph.logger.warn "Failed to load plugin '#{plugin}'"
227
+ end
228
+ end
229
+ end
230
+
231
+ # @return [String, nil]
232
+ def read_rbs_collection_path
233
+ yaml_file = File.join(directory, 'rbs_collection.yaml')
234
+ return unless File.file?(yaml_file)
235
+
236
+ YAML.load_file(yaml_file)&.fetch('path')
237
+ end
238
+ end
239
+ end
@@ -1,19 +1,25 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- class YardMap
5
- class Cache
6
- def initialize
7
- @path_pins = {}
8
- end
9
-
10
- def set_path_pins path, pins
11
- @path_pins[path] = pins
12
- end
13
-
14
- def get_path_pins path
15
- @path_pins[path]
16
- end
17
- end
18
- end
19
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ class YardMap
5
+ class Cache
6
+ def initialize
7
+ # @type [Hash{String => Array<Solargraph::Pin::Base>}]
8
+ @path_pins = {}
9
+ end
10
+
11
+ # @param path [String]
12
+ # @param pins [Array<Solargraph::Pin::Base>]
13
+ # @return [Array<Solargraph::Pin::Base>]
14
+ def set_path_pins path, pins
15
+ @path_pins[path] = pins
16
+ end
17
+
18
+ # @param path [String]
19
+ # @return [Array<Solargraph::Pin::Base>]
20
+ def get_path_pins path
21
+ @path_pins[path]
22
+ end
23
+ end
24
+ end
25
+ end
@@ -1,16 +1,16 @@
1
- module Solargraph
2
- class YardMap
3
- module Helpers
4
- module_function
5
-
6
- # @param code_object [YARD::CodeObjects::Base]
7
- # @param spec [Gem::Specification]
8
- # @return [Solargraph::Location, nil]
9
- def object_location code_object, spec
10
- return nil if spec.nil? || code_object.nil? || code_object.file.nil? || code_object.line.nil?
11
- file = File.join(spec.full_gem_path, code_object.file)
12
- Solargraph::Location.new(file, Solargraph::Range.from_to(code_object.line - 1, 0, code_object.line - 1, 0))
13
- end
14
- end
15
- end
16
- end
1
+ module Solargraph
2
+ class YardMap
3
+ module Helpers
4
+ module_function
5
+
6
+ # @param code_object [YARD::CodeObjects::Base]
7
+ # @param spec [Gem::Specification, nil]
8
+ # @return [Solargraph::Location, nil]
9
+ def object_location code_object, spec
10
+ return nil if spec.nil? || code_object.nil? || code_object.file.nil? || code_object.line.nil?
11
+ file = File.join(spec.full_gem_path, code_object.file)
12
+ Solargraph::Location.new(file, Solargraph::Range.from_to(code_object.line - 1, 0, code_object.line - 1, 0))
13
+ end
14
+ end
15
+ end
16
+ end
@@ -1,25 +1,26 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- class YardMap
5
- class Mapper
6
- module ToConstant
7
- extend YardMap::Helpers
8
-
9
- def self.make code_object, closure = nil, spec = nil
10
- closure ||= Solargraph::Pin::Namespace.new(
11
- name: code_object.namespace.to_s,
12
- gates: [code_object.namespace.to_s]
13
- )
14
- Pin::Constant.new(
15
- location: object_location(code_object, spec),
16
- closure: closure,
17
- name: code_object.name.to_s,
18
- comments: code_object.docstring ? code_object.docstring.all.to_s : '',
19
- visibility: code_object.visibility
20
- )
21
- end
22
- end
23
- end
24
- end
25
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ class YardMap
5
+ class Mapper
6
+ module ToConstant
7
+ extend YardMap::Helpers
8
+
9
+ # @param code_object [YARD::CodeObjects::Base]
10
+ def self.make code_object, closure = nil, spec = nil
11
+ closure ||= Solargraph::Pin::Namespace.new(
12
+ name: code_object.namespace.to_s,
13
+ gates: [code_object.namespace.to_s]
14
+ )
15
+ Pin::Constant.new(
16
+ location: object_location(code_object, spec),
17
+ closure: closure,
18
+ name: code_object.name.to_s,
19
+ comments: code_object.docstring ? code_object.docstring.all.to_s : '',
20
+ visibility: code_object.visibility
21
+ )
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end