solargraph 0.50.0 → 0.58.2

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 (264) 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 +218 -0
  5. data/.github/workflows/rspec.yml +58 -12
  6. data/.github/workflows/typecheck.yml +39 -0
  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 +3 -2
  13. data/CHANGELOG.md +306 -3
  14. data/README.md +29 -18
  15. data/Rakefile +125 -13
  16. data/SPONSORS.md +2 -9
  17. data/bin/solargraph +3 -0
  18. data/lib/solargraph/api_map/cache.rb +110 -70
  19. data/lib/solargraph/api_map/constants.rb +279 -0
  20. data/lib/solargraph/api_map/index.rb +193 -0
  21. data/lib/solargraph/api_map/source_to_yard.rb +97 -81
  22. data/lib/solargraph/api_map/store.rb +384 -268
  23. data/lib/solargraph/api_map.rb +945 -704
  24. data/lib/solargraph/bench.rb +21 -3
  25. data/lib/solargraph/complex_type/type_methods.rb +228 -134
  26. data/lib/solargraph/complex_type/unique_type.rb +482 -132
  27. data/lib/solargraph/complex_type.rb +444 -254
  28. data/lib/solargraph/convention/active_support_concern.rb +111 -0
  29. data/lib/solargraph/convention/base.rb +20 -3
  30. data/lib/solargraph/convention/data_definition/data_assignment_node.rb +61 -0
  31. data/lib/solargraph/convention/data_definition/data_definition_node.rb +91 -0
  32. data/lib/solargraph/convention/data_definition.rb +105 -0
  33. data/lib/solargraph/convention/gemspec.rb +3 -2
  34. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +61 -0
  35. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +102 -0
  36. data/lib/solargraph/convention/struct_definition.rb +164 -0
  37. data/lib/solargraph/convention.rb +36 -7
  38. data/lib/solargraph/converters/dd.rb +5 -0
  39. data/lib/solargraph/converters/dl.rb +3 -0
  40. data/lib/solargraph/converters/dt.rb +3 -0
  41. data/lib/solargraph/diagnostics/require_not_found.rb +53 -53
  42. data/lib/solargraph/diagnostics/rubocop.rb +118 -112
  43. data/lib/solargraph/diagnostics/rubocop_helpers.rb +68 -65
  44. data/lib/solargraph/diagnostics/type_check.rb +55 -54
  45. data/lib/solargraph/diagnostics.rb +2 -2
  46. data/lib/solargraph/doc_map.rb +439 -0
  47. data/lib/solargraph/environ.rb +9 -2
  48. data/lib/solargraph/equality.rb +34 -0
  49. data/lib/solargraph/gem_pins.rb +98 -0
  50. data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
  51. data/lib/solargraph/language_server/host/dispatch.rb +130 -111
  52. data/lib/solargraph/language_server/host/message_worker.rb +112 -59
  53. data/lib/solargraph/language_server/host/sources.rb +99 -156
  54. data/lib/solargraph/language_server/host.rb +878 -869
  55. data/lib/solargraph/language_server/message/base.rb +20 -12
  56. data/lib/solargraph/language_server/message/completion_item/resolve.rb +3 -1
  57. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +114 -100
  58. data/lib/solargraph/language_server/message/extended/document.rb +23 -20
  59. data/lib/solargraph/language_server/message/extended/document_gems.rb +3 -3
  60. data/lib/solargraph/language_server/message/initialize.rb +28 -1
  61. data/lib/solargraph/language_server/message/initialized.rb +1 -0
  62. data/lib/solargraph/language_server/message/text_document/completion.rb +56 -59
  63. data/lib/solargraph/language_server/message/text_document/definition.rb +40 -38
  64. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +26 -23
  65. data/lib/solargraph/language_server/message/text_document/formatting.rb +148 -126
  66. data/lib/solargraph/language_server/message/text_document/hover.rb +58 -56
  67. data/lib/solargraph/language_server/message/text_document/signature_help.rb +24 -24
  68. data/lib/solargraph/language_server/message/text_document/type_definition.rb +25 -0
  69. data/lib/solargraph/language_server/message/text_document.rb +1 -1
  70. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +5 -0
  71. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +2 -0
  72. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +23 -23
  73. data/lib/solargraph/language_server/message.rb +1 -0
  74. data/lib/solargraph/language_server/progress.rb +143 -0
  75. data/lib/solargraph/language_server/request.rb +4 -1
  76. data/lib/solargraph/language_server/transport/adapter.rb +16 -1
  77. data/lib/solargraph/language_server/transport/data_reader.rb +2 -0
  78. data/lib/solargraph/language_server.rb +1 -0
  79. data/lib/solargraph/library.rb +683 -551
  80. data/lib/solargraph/location.rb +82 -37
  81. data/lib/solargraph/logging.rb +37 -27
  82. data/lib/solargraph/page.rb +9 -0
  83. data/lib/solargraph/parser/comment_ripper.rb +69 -52
  84. data/lib/solargraph/parser/flow_sensitive_typing.rb +255 -0
  85. data/lib/solargraph/parser/node_processor/base.rb +92 -77
  86. data/lib/solargraph/parser/node_processor.rb +62 -43
  87. data/lib/solargraph/parser/{legacy → parser_gem}/class_methods.rb +149 -135
  88. data/lib/solargraph/parser/{legacy → parser_gem}/flawed_builder.rb +4 -1
  89. data/lib/solargraph/parser/{legacy → parser_gem}/node_chainer.rb +166 -148
  90. data/lib/solargraph/parser/{legacy → parser_gem}/node_methods.rb +486 -325
  91. data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/alias_node.rb +3 -2
  92. data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +22 -0
  93. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +59 -0
  94. data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/begin_node.rb +15 -15
  95. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/block_node.rb +46 -42
  96. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/casgn_node.rb +4 -3
  97. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/cvasgn_node.rb +3 -2
  98. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/def_node.rb +53 -63
  99. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/defs_node.rb +4 -3
  100. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/gvasgn_node.rb +3 -2
  101. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +23 -0
  102. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/ivasgn_node.rb +40 -38
  103. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/lvasgn_node.rb +29 -28
  104. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +59 -0
  105. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/namespace_node.rb +10 -9
  106. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +98 -0
  107. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/orasgn_node.rb +17 -16
  108. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/resbody_node.rb +38 -36
  109. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/sclass_node.rb +52 -42
  110. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/send_node.rb +291 -257
  111. data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/sym_node.rb +4 -2
  112. data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +29 -0
  113. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +29 -0
  114. data/lib/solargraph/parser/parser_gem/node_processors.rb +70 -0
  115. data/lib/solargraph/parser/parser_gem.rb +12 -0
  116. data/lib/solargraph/parser/region.rb +69 -66
  117. data/lib/solargraph/parser/snippet.rb +17 -13
  118. data/lib/solargraph/parser.rb +9 -12
  119. data/lib/solargraph/pin/base.rb +729 -299
  120. data/lib/solargraph/pin/base_variable.rb +126 -84
  121. data/lib/solargraph/pin/block.rb +104 -73
  122. data/lib/solargraph/pin/breakable.rb +9 -0
  123. data/lib/solargraph/pin/callable.rb +231 -0
  124. data/lib/solargraph/pin/closure.rb +72 -37
  125. data/lib/solargraph/pin/common.rb +79 -70
  126. data/lib/solargraph/pin/constant.rb +2 -0
  127. data/lib/solargraph/pin/conversions.rb +123 -92
  128. data/lib/solargraph/pin/delegated_method.rb +120 -0
  129. data/lib/solargraph/pin/documenting.rb +114 -105
  130. data/lib/solargraph/pin/instance_variable.rb +34 -30
  131. data/lib/solargraph/pin/keyword.rb +20 -15
  132. data/lib/solargraph/pin/local_variable.rb +75 -55
  133. data/lib/solargraph/pin/method.rb +672 -335
  134. data/lib/solargraph/pin/method_alias.rb +34 -31
  135. data/lib/solargraph/pin/namespace.rb +115 -94
  136. data/lib/solargraph/pin/parameter.rb +275 -206
  137. data/lib/solargraph/pin/proxy_type.rb +39 -29
  138. data/lib/solargraph/pin/reference/override.rb +47 -29
  139. data/lib/solargraph/pin/reference/require.rb +2 -2
  140. data/lib/solargraph/pin/reference/superclass.rb +15 -10
  141. data/lib/solargraph/pin/reference.rb +39 -14
  142. data/lib/solargraph/pin/search.rb +61 -56
  143. data/lib/solargraph/pin/signature.rb +61 -23
  144. data/lib/solargraph/pin/singleton.rb +1 -1
  145. data/lib/solargraph/pin/symbol.rb +53 -47
  146. data/lib/solargraph/pin/until.rb +18 -0
  147. data/lib/solargraph/pin/while.rb +18 -0
  148. data/lib/solargraph/pin.rb +44 -38
  149. data/lib/solargraph/pin_cache.rb +245 -0
  150. data/lib/solargraph/position.rb +132 -100
  151. data/lib/solargraph/range.rb +112 -95
  152. data/lib/solargraph/rbs_map/conversions.rb +823 -394
  153. data/lib/solargraph/rbs_map/core_fills.rb +53 -30
  154. data/lib/solargraph/rbs_map/core_map.rb +58 -38
  155. data/lib/solargraph/rbs_map/stdlib_map.rb +43 -36
  156. data/lib/solargraph/rbs_map.rb +163 -73
  157. data/lib/solargraph/shell.rb +352 -244
  158. data/lib/solargraph/source/chain/array.rb +37 -0
  159. data/lib/solargraph/source/chain/block_symbol.rb +13 -0
  160. data/lib/solargraph/source/chain/block_variable.rb +1 -1
  161. data/lib/solargraph/source/chain/call.rb +337 -215
  162. data/lib/solargraph/source/chain/constant.rb +26 -75
  163. data/lib/solargraph/source/chain/hash.rb +34 -28
  164. data/lib/solargraph/source/chain/head.rb +1 -1
  165. data/lib/solargraph/source/chain/if.rb +28 -0
  166. data/lib/solargraph/source/chain/instance_variable.rb +13 -13
  167. data/lib/solargraph/source/chain/link.rb +44 -6
  168. data/lib/solargraph/source/chain/literal.rb +48 -23
  169. data/lib/solargraph/source/chain/or.rb +23 -23
  170. data/lib/solargraph/source/chain/z_super.rb +4 -4
  171. data/lib/solargraph/source/chain.rb +291 -179
  172. data/lib/solargraph/source/change.rb +82 -79
  173. data/lib/solargraph/source/cursor.rb +166 -164
  174. data/lib/solargraph/source/encoding_fixes.rb +23 -23
  175. data/lib/solargraph/source/source_chainer.rb +194 -191
  176. data/lib/solargraph/source/updater.rb +55 -54
  177. data/lib/solargraph/source.rb +498 -522
  178. data/lib/solargraph/source_map/clip.rb +226 -229
  179. data/lib/solargraph/source_map/data.rb +34 -0
  180. data/lib/solargraph/source_map/mapper.rb +259 -243
  181. data/lib/solargraph/source_map.rb +212 -180
  182. data/lib/solargraph/type_checker/checks.rb +124 -112
  183. data/lib/solargraph/type_checker/param_def.rb +37 -35
  184. data/lib/solargraph/type_checker/problem.rb +32 -32
  185. data/lib/solargraph/type_checker/rules.rb +84 -57
  186. data/lib/solargraph/type_checker.rb +814 -549
  187. data/lib/solargraph/version.rb +5 -5
  188. data/lib/solargraph/views/_method.erb +10 -10
  189. data/lib/solargraph/views/_namespace.erb +3 -3
  190. data/lib/solargraph/views/document.erb +10 -10
  191. data/lib/solargraph/views/environment.erb +3 -5
  192. data/lib/solargraph/workspace/config.rb +255 -231
  193. data/lib/solargraph/workspace/require_paths.rb +97 -0
  194. data/lib/solargraph/workspace.rb +220 -212
  195. data/lib/solargraph/yard_map/cache.rb +6 -0
  196. data/lib/solargraph/yard_map/helpers.rb +44 -16
  197. data/lib/solargraph/yard_map/mapper/to_constant.rb +8 -5
  198. data/lib/solargraph/yard_map/mapper/to_method.rb +130 -81
  199. data/lib/solargraph/yard_map/mapper/to_namespace.rb +31 -27
  200. data/lib/solargraph/yard_map/mapper.rb +79 -77
  201. data/lib/solargraph/yard_map/to_method.rb +89 -79
  202. data/lib/solargraph/yard_map.rb +1 -284
  203. data/lib/solargraph/yard_tags.rb +20 -0
  204. data/lib/solargraph/yardoc.rb +87 -0
  205. data/lib/solargraph.rb +105 -69
  206. data/rbs/fills/bundler/0/bundler.rbs +4271 -0
  207. data/rbs/fills/open3/0/open3.rbs +172 -0
  208. data/rbs/fills/rubygems/0/basic_specification.rbs +326 -0
  209. data/rbs/fills/rubygems/0/errors.rbs +364 -0
  210. data/rbs/fills/rubygems/0/spec_fetcher.rbs +107 -0
  211. data/rbs/fills/rubygems/0/specification.rbs +1753 -0
  212. data/rbs/fills/tuple/tuple.rbs +149 -0
  213. data/rbs/shims/ast/0/node.rbs +5 -0
  214. data/rbs/shims/ast/2.4/.rbs_meta.yaml +9 -0
  215. data/rbs/shims/ast/2.4/ast.rbs +73 -0
  216. data/rbs/shims/parser/3.2.0.1/builders/default.rbs +195 -0
  217. data/rbs/shims/parser/3.2.0.1/manifest.yaml +7 -0
  218. data/rbs/shims/parser/3.2.0.1/parser.rbs +201 -0
  219. data/rbs/shims/parser/3.2.0.1/polyfill.rbs +4 -0
  220. data/rbs/shims/thor/1.2.0.1/.rbs_meta.yaml +9 -0
  221. data/rbs/shims/thor/1.2.0.1/manifest.yaml +7 -0
  222. data/rbs/shims/thor/1.2.0.1/thor.rbs +17 -0
  223. data/rbs_collection.yaml +19 -0
  224. data/solargraph.gemspec +39 -11
  225. metadata +354 -97
  226. data/lib/.rubocop.yml +0 -22
  227. data/lib/solargraph/api_map/bundler_methods.rb +0 -22
  228. data/lib/solargraph/cache.rb +0 -53
  229. data/lib/solargraph/convention/rspec.rb +0 -30
  230. data/lib/solargraph/documentor.rb +0 -76
  231. data/lib/solargraph/language_server/host/cataloger.rb +0 -56
  232. data/lib/solargraph/parser/legacy/node_processors/alias_node.rb +0 -23
  233. data/lib/solargraph/parser/legacy/node_processors/args_node.rb +0 -35
  234. data/lib/solargraph/parser/legacy/node_processors/begin_node.rb +0 -15
  235. data/lib/solargraph/parser/legacy/node_processors/sym_node.rb +0 -18
  236. data/lib/solargraph/parser/legacy/node_processors.rb +0 -54
  237. data/lib/solargraph/parser/legacy.rb +0 -12
  238. data/lib/solargraph/parser/node_methods.rb +0 -43
  239. data/lib/solargraph/parser/rubyvm/class_methods.rb +0 -149
  240. data/lib/solargraph/parser/rubyvm/node_chainer.rb +0 -160
  241. data/lib/solargraph/parser/rubyvm/node_methods.rb +0 -315
  242. data/lib/solargraph/parser/rubyvm/node_processors/args_node.rb +0 -85
  243. data/lib/solargraph/parser/rubyvm/node_processors/block_node.rb +0 -42
  244. data/lib/solargraph/parser/rubyvm/node_processors/casgn_node.rb +0 -33
  245. data/lib/solargraph/parser/rubyvm/node_processors/cvasgn_node.rb +0 -23
  246. data/lib/solargraph/parser/rubyvm/node_processors/def_node.rb +0 -75
  247. data/lib/solargraph/parser/rubyvm/node_processors/defs_node.rb +0 -68
  248. data/lib/solargraph/parser/rubyvm/node_processors/gvasgn_node.rb +0 -23
  249. data/lib/solargraph/parser/rubyvm/node_processors/ivasgn_node.rb +0 -38
  250. data/lib/solargraph/parser/rubyvm/node_processors/kw_arg_node.rb +0 -39
  251. data/lib/solargraph/parser/rubyvm/node_processors/lit_node.rb +0 -20
  252. data/lib/solargraph/parser/rubyvm/node_processors/lvasgn_node.rb +0 -27
  253. data/lib/solargraph/parser/rubyvm/node_processors/namespace_node.rb +0 -39
  254. data/lib/solargraph/parser/rubyvm/node_processors/opt_arg_node.rb +0 -26
  255. data/lib/solargraph/parser/rubyvm/node_processors/orasgn_node.rb +0 -15
  256. data/lib/solargraph/parser/rubyvm/node_processors/resbody_node.rb +0 -45
  257. data/lib/solargraph/parser/rubyvm/node_processors/sclass_node.rb +0 -32
  258. data/lib/solargraph/parser/rubyvm/node_processors/scope_node.rb +0 -15
  259. data/lib/solargraph/parser/rubyvm/node_processors/send_node.rb +0 -279
  260. data/lib/solargraph/parser/rubyvm/node_processors.rb +0 -63
  261. data/lib/solargraph/parser/rubyvm/node_wrapper.rb +0 -47
  262. data/lib/solargraph/parser/rubyvm.rb +0 -40
  263. data/lib/solargraph/rbs_map/core_signs.rb +0 -33
  264. data/lib/yard-solargraph.rb +0 -33
data/lib/.rubocop.yml DELETED
@@ -1,22 +0,0 @@
1
- AllCops:
2
- NewCops: enable
3
- Style/MethodDefParentheses:
4
- Enabled: false
5
- Layout/EmptyLineAfterGuardClause:
6
- Enabled: false
7
- Layout/SpaceAroundMethodCallOperator:
8
- Enabled: true
9
- Lint/RaiseException:
10
- Enabled: true
11
- Lint/StructNewOverride:
12
- Enabled: true
13
- Metrics/MethodLength:
14
- Max: 25
15
- Style/ExponentialNotation:
16
- Enabled: true
17
- Style/HashEachMethods:
18
- Enabled: true
19
- Style/HashTransformKeys:
20
- Enabled: true
21
- Style/HashTransformValues:
22
- Enabled: true
@@ -1,22 +0,0 @@
1
- require 'bundler'
2
- require 'shellwords'
3
-
4
- module Solargraph
5
- class ApiMap
6
- module BundlerMethods
7
- module_function
8
-
9
- # @param directory [String]
10
- # @return [Hash]
11
- def require_from_bundle directory
12
- begin
13
- Solargraph.logger.info "Loading gems for bundler/require"
14
- Documentor.specs_from_bundle(directory)
15
- rescue BundleNotFoundError => e
16
- Solargraph.logger.warn e.message
17
- {}
18
- end
19
- end
20
- end
21
- end
22
- end
@@ -1,53 +0,0 @@
1
- require 'fileutils'
2
-
3
- module Solargraph
4
- module Cache
5
- class << self
6
- # The base directory where cached documentation is installed.
7
- #
8
- # @return [String]
9
- def base_dir
10
- # The directory is not stored in a variable so it can be overridden
11
- # in specs.
12
- ENV['SOLARGRAPH_CACHE'] ||
13
- ENV['XDG_CACHE_HOME'] ? File.join(ENV['XDG_CACHE_HOME'], 'solargraph') :
14
- File.join(Dir.home, '.cache', 'solargraph')
15
- end
16
-
17
- # The working directory for the current Ruby and Solargraph versions.
18
- #
19
- # @return [String]
20
- def work_dir
21
- # The directory is not stored in a variable so it can be overridden
22
- # in specs.
23
- File.join(base_dir, "ruby-#{RUBY_VERSION}", "rbs-#{RBS::VERSION}", "solargraph-#{Solargraph::VERSION}")
24
- end
25
-
26
- # @return [Array<Solargraph::Pin::Base>, nil]
27
- def load *path
28
- file = File.join(work_dir, *path)
29
- return nil unless File.file?(file)
30
- Marshal.load(File.read(file, mode: 'rb'))
31
- rescue StandardError => e
32
- Solargraph.logger.warn "Failed to load cached file #{file}: [#{e.class}] #{e.message}"
33
- FileUtils.rm_f file
34
- nil
35
- end
36
-
37
- # @return [Boolean]
38
- def save *path, pins
39
- return false if pins.empty?
40
- file = File.join(work_dir, *path)
41
- base = File.dirname(file)
42
- FileUtils.mkdir_p base unless File.directory?(base)
43
- ser = Marshal.dump(pins)
44
- File.write file, ser, mode: 'wb'
45
- true
46
- end
47
-
48
- def clear
49
- FileUtils.rm_rf base_dir, secure: true
50
- end
51
- end
52
- end
53
- end
@@ -1,30 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module Convention
5
- class Rspec < Base
6
- def local source_map
7
- return EMPTY_ENVIRON unless File.basename(source_map.filename) =~ /_spec\.rb$/
8
- @environ ||= Environ.new(
9
- requires: ['rspec'],
10
- domains: ['RSpec::Matchers', 'RSpec::ExpectationGroups'],
11
- pins: [
12
- # This override is necessary due to an erroneous @return tag in
13
- # rspec's YARD documentation.
14
- # @todo The return types have been fixed (https://github.com/rspec/rspec-expectations/pull/1121)
15
- Solargraph::Pin::Reference::Override.method_return('RSpec::Matchers#expect', 'RSpec::Expectations::ExpectationTarget')
16
- ].concat(extras)
17
- )
18
- end
19
-
20
- private
21
-
22
- def extras
23
- @@extras ||= SourceMap.load_string(%(
24
- def describe(*args); end
25
- def it(*args); end
26
- )).pins
27
- end
28
- end
29
- end
30
- end
@@ -1,76 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'bundler'
4
- require 'json'
5
- require 'open3'
6
- require 'shellwords'
7
- require 'yard'
8
- require 'fileutils'
9
-
10
- module Solargraph
11
- class Documentor
12
- RDOC_GEMS = %w[
13
- actioncable actionmailbox actionmailer actionpack actiontext actionview
14
- activejob activemodel activerecord activestorage activesupport railties
15
- ]
16
-
17
- def initialize directory, rebuild: false, out: File.new(File::NULL, 'w')
18
- @directory = directory
19
- @rebuild = rebuild
20
- @out = out
21
- end
22
-
23
- # @return [Boolean] True if all specs were found and documented.
24
- def document
25
- failures = 0
26
- Documentor.specs_from_bundle(@directory).each_pair do |name, version|
27
- yd = YARD::Registry.yardoc_file_for_gem(name, "= #{version}")
28
- if !yd || @rebuild
29
- FileUtils.safe_unlink File.join(YardMap::CoreDocs.cache_dir, 'gems', "#{name}-#{version}.ser")
30
- @out.puts "Documenting #{name} #{version}"
31
- `yard gems #{name} #{version} #{@rebuild ? '--rebuild' : ''}`
32
- yd = YARD::Registry.yardoc_file_for_gem(name, "= #{version}")
33
- # HACK: Ignore errors documenting bundler
34
- if !yd && name != 'bundler'
35
- @out.puts "#{name} #{version} YARD documentation failed"
36
- failures += 1
37
- end
38
- end
39
- if yd && RDOC_GEMS.include?(name)
40
- cache = File.join(Solargraph::YardMap::CoreDocs.cache_dir, 'gems', "#{name}-#{version}", 'yardoc')
41
- if !File.exist?(cache) || @rebuild
42
- @out.puts "Caching custom documentation for #{name} #{version}"
43
- spec = Gem::Specification.find_by_name(name, "= #{version}")
44
- Solargraph::YardMap::RdocToYard.run(spec)
45
- end
46
- end
47
- end
48
- if failures > 0
49
- @out.puts "#{failures} gem#{failures == 1 ? '' : 's'} could not be documented. You might need to run `bundle install`."
50
- end
51
- failures == 0
52
- rescue Solargraph::BundleNotFoundError => e
53
- @out.puts "[#{e.class}] #{e.message}"
54
- @out.puts "No bundled gems are available in #{@directory}"
55
- false
56
- end
57
-
58
- # @param directory [String]
59
- # @return [Hash]
60
- def self.specs_from_bundle directory
61
- Solargraph.with_clean_env do
62
- cmd = [
63
- 'ruby', '-e',
64
- "require 'bundler'; require 'json'; Dir.chdir('#{directory}') { puts Bundler.definition.specs_for([:default]).map { |spec| [spec.name, spec.version] }.to_h.to_json }"
65
- ]
66
- o, e, s = Open3.capture3(*cmd)
67
- if s.success?
68
- o && !o.empty? ? JSON.parse(o.split("\n").last) : {}
69
- else
70
- Solargraph.logger.warn e
71
- raise BundleNotFoundError, "Failed to load gems from bundle at #{directory}"
72
- end
73
- end
74
- end
75
- end
76
- end
@@ -1,56 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module LanguageServer
5
- class Host
6
- # An asynchronous library cataloging handler.
7
- #
8
- class Cataloger
9
- def initialize host
10
- @host = host
11
- @stopped = true
12
- end
13
-
14
- # Stop the catalog thread.
15
- #
16
- # @return [void]
17
- def stop
18
- @stopped = true
19
- end
20
-
21
- # True if the cataloger is stopped.
22
- #
23
- # @return [Boolean]
24
- def stopped?
25
- @stopped
26
- end
27
-
28
- # Start the catalog thread.
29
- #
30
- # @return [void]
31
- def start
32
- return unless stopped?
33
- @stopped = false
34
- Thread.new do
35
- until stopped?
36
- tick
37
- sleep 0.1
38
- end
39
- end
40
- end
41
-
42
- # Perform cataloging.
43
- #
44
- # @return [void]
45
- def tick
46
- host.catalog
47
- end
48
-
49
- private
50
-
51
- # @return [Host]
52
- attr_reader :host
53
- end
54
- end
55
- end
56
- end
@@ -1,23 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module Parser
5
- module Legacy
6
- module NodeProcessors
7
- class AliasNode < Parser::NodeProcessor::Base
8
- def process
9
- loc = get_node_location(node)
10
- pins.push Solargraph::Pin::MethodAlias.new(
11
- location: loc,
12
- closure: region.closure,
13
- name: node.children[0].children[0].to_s,
14
- original: node.children[1].children[0].to_s,
15
- scope: region.scope || :instance
16
- )
17
- process_children
18
- end
19
- end
20
- end
21
- end
22
- end
23
- end
@@ -1,35 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module Parser
5
- module Legacy
6
- module NodeProcessors
7
- class ArgsNode < Parser::NodeProcessor::Base
8
- def process
9
- node.children.each do |u|
10
- loc = get_node_location(u)
11
- locals.push Solargraph::Pin::Parameter.new(
12
- location: loc,
13
- closure: region.closure,
14
- comments: comments_for(node),
15
- name: u.children[0].to_s,
16
- assignment: u.children[1],
17
- asgn_code: u.children[1] ? region.code_for(u.children[1]) : nil,
18
- presence: region.closure.location.range,
19
- decl: get_decl(u)
20
- )
21
- region.closure.parameters.push locals.last
22
- end
23
- process_children
24
- end
25
-
26
- private
27
-
28
- def get_decl node
29
- node.type
30
- end
31
- end
32
- end
33
- end
34
- end
35
- end
@@ -1,15 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module Parser
5
- module Legacy
6
- module NodeProcessors
7
- class BeginNode < Parser::NodeProcessor::Base
8
- def process
9
- process_children
10
- end
11
- end
12
- end
13
- end
14
- end
15
- end
@@ -1,18 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module Parser
5
- module Legacy
6
- module NodeProcessors
7
- class SymNode < Parser::NodeProcessor::Base
8
- def process
9
- pins.push Solargraph::Pin::Symbol.new(
10
- get_node_location(node),
11
- ":#{node.children[0]}"
12
- )
13
- end
14
- end
15
- end
16
- end
17
- end
18
- end
@@ -1,54 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'solargraph/parser/node_processor'
4
-
5
- module Solargraph
6
- module Parser
7
- module Legacy
8
- module NodeProcessors
9
- autoload :BeginNode, 'solargraph/parser/legacy/node_processors/begin_node'
10
- autoload :DefNode, 'solargraph/parser/legacy/node_processors/def_node'
11
- autoload :DefsNode, 'solargraph/parser/legacy/node_processors/defs_node'
12
- autoload :SendNode, 'solargraph/parser/legacy/node_processors/send_node'
13
- autoload :NamespaceNode, 'solargraph/parser/legacy/node_processors/namespace_node'
14
- autoload :SclassNode, 'solargraph/parser/legacy/node_processors/sclass_node'
15
- autoload :ModuleNode, 'solargraph/parser/legacy/node_processors/module_node'
16
- autoload :IvasgnNode, 'solargraph/parser/legacy/node_processors/ivasgn_node'
17
- autoload :CvasgnNode, 'solargraph/parser/legacy/node_processors/cvasgn_node'
18
- autoload :LvasgnNode, 'solargraph/parser/legacy/node_processors/lvasgn_node'
19
- autoload :GvasgnNode, 'solargraph/parser/legacy/node_processors/gvasgn_node'
20
- autoload :CasgnNode, 'solargraph/parser/legacy/node_processors/casgn_node'
21
- autoload :AliasNode, 'solargraph/parser/legacy/node_processors/alias_node'
22
- autoload :ArgsNode, 'solargraph/parser/legacy/node_processors/args_node'
23
- autoload :BlockNode, 'solargraph/parser/legacy/node_processors/block_node'
24
- autoload :OrasgnNode, 'solargraph/parser/legacy/node_processors/orasgn_node'
25
- autoload :SymNode, 'solargraph/parser/legacy/node_processors/sym_node'
26
- autoload :ResbodyNode, 'solargraph/parser/legacy/node_processors/resbody_node'
27
- end
28
- end
29
-
30
- module NodeProcessor
31
- register :source, Legacy::NodeProcessors::BeginNode
32
- register :begin, Legacy::NodeProcessors::BeginNode
33
- register :kwbegin, Legacy::NodeProcessors::BeginNode
34
- register :rescue, Legacy::NodeProcessors::BeginNode
35
- register :resbody, Legacy::NodeProcessors::ResbodyNode
36
- register :def, Legacy::NodeProcessors::DefNode
37
- register :defs, Legacy::NodeProcessors::DefsNode
38
- register :send, Legacy::NodeProcessors::SendNode
39
- register :class, Legacy::NodeProcessors::NamespaceNode
40
- register :module, Legacy::NodeProcessors::NamespaceNode
41
- register :sclass, Legacy::NodeProcessors::SclassNode
42
- register :ivasgn, Legacy::NodeProcessors::IvasgnNode
43
- register :cvasgn, Legacy::NodeProcessors::CvasgnNode
44
- register :lvasgn, Legacy::NodeProcessors::LvasgnNode
45
- register :gvasgn, Legacy::NodeProcessors::GvasgnNode
46
- register :casgn, Legacy::NodeProcessors::CasgnNode
47
- register :alias, Legacy::NodeProcessors::AliasNode
48
- register :args, Legacy::NodeProcessors::ArgsNode
49
- register :block, Legacy::NodeProcessors::BlockNode
50
- register :or_asgn, Legacy::NodeProcessors::OrasgnNode
51
- register :sym, Legacy::NodeProcessors::SymNode
52
- end
53
- end
54
- end
@@ -1,12 +0,0 @@
1
- module Solargraph
2
- module Parser
3
- module Legacy
4
- autoload :FlawedBuilder, 'solargraph/parser/legacy/flawed_builder'
5
- autoload :ClassMethods, 'solargraph/parser/legacy/class_methods'
6
- autoload :NodeMethods, 'solargraph/parser/legacy/node_methods'
7
- autoload :NodeChainer, 'solargraph/parser/legacy/node_chainer'
8
- end
9
- end
10
- end
11
-
12
- require 'solargraph/parser/legacy/node_processors'
@@ -1,43 +0,0 @@
1
- module Solargraph
2
- module Parser
3
- class NodeMethods
4
- module_function
5
-
6
- def unpack_name node
7
- raise NotImplementedError
8
- end
9
-
10
- def infer_literal_type node
11
- raise NotImplementedError
12
- end
13
-
14
- def calls_from node
15
- raise NotImplementedError
16
- end
17
-
18
- def returns_from node
19
- raise NotImplementedError
20
- end
21
-
22
- def process node
23
- raise NotImplementedError
24
- end
25
-
26
- def references node
27
- raise NotImplementedError
28
- end
29
-
30
- def chain node, filename = nil, in_block = false
31
- raise NotImplementedError
32
- end
33
-
34
- def node? node
35
- raise NotImplementedError
36
- end
37
-
38
- def convert_hash node
39
- raise NotImplementedError
40
- end
41
- end
42
- end
43
- end
@@ -1,149 +0,0 @@
1
- require 'solargraph/parser/rubyvm/node_processors'
2
- require 'solargraph/parser/rubyvm/node_wrapper'
3
-
4
- module Solargraph
5
- module Parser
6
- module Rubyvm
7
- module ClassMethods
8
- # @param code [String]
9
- # @param filename [String]
10
- # @return [Array(Parser::AST::Node, Array<Parser::Source::Comment>)]
11
- # @sg-ignore
12
- def parse_with_comments code, filename = nil
13
- node = RubyVM::AbstractSyntaxTree.parse(code).children[2]
14
- node &&= RubyVM::AbstractSyntaxTree::NodeWrapper.from(node, code.lines)
15
- comments = CommentRipper.new(code).parse
16
- [node, comments]
17
- rescue ::SyntaxError => e
18
- raise Parser::SyntaxError, e.message
19
- end
20
-
21
- # @param code [String]
22
- # @param filename [String, nil]
23
- # @param line [Integer]
24
- # @return [Parser::AST::Node]
25
- # @sg-ignore
26
- def parse code, filename = nil, line = 0
27
- node = RubyVM::AbstractSyntaxTree.parse(code).children[2]
28
- node and RubyVM::AbstractSyntaxTree::NodeWrapper.from(node, code.lines)
29
- rescue ::SyntaxError => e
30
- raise Parser::SyntaxError, e.message
31
- end
32
-
33
- def map source
34
- NodeProcessor.process(source.node, Region.new(source: source))
35
- end
36
-
37
- def references source, name
38
- if name.end_with?("=")
39
- reg = /#{Regexp.escape name[0..-2]}\s*=/
40
- extract_offset = ->(code, offset) { reg.match(code, offset).offset(0) }
41
- else
42
- extract_offset = ->(code, offset) { [soff = code.index(name, offset), soff + name.length] }
43
- end
44
- inner_node_references(name, source.node).map do |n|
45
- rng = Range.from_node(n)
46
- offset = Position.to_offset(source.code, rng.start)
47
- soff, eoff = extract_offset[source.code, offset]
48
- Location.new(
49
- source.filename,
50
- Range.new(
51
- Position.from_offset(source.code, soff),
52
- Position.from_offset(source.code, eoff)
53
- )
54
- )
55
- end
56
- end
57
-
58
- # @param name [String]
59
- # @param top [AST::Node]
60
- # @return [Array<AST::Node>]
61
- def inner_node_references name, top
62
- result = []
63
- if Parser.rubyvm?
64
- if Parser.is_ast_node?(top)
65
- result.push top if match_rubyvm_node_to_ref(top, name)
66
- top.children.each { |c| result.concat inner_node_references(name, c) }
67
- end
68
- else
69
- if Parser.is_ast_node?(top) && top.to_s.include?(":#{name}")
70
- result.push top if top.children.any? { |c| c.to_s == name }
71
- top.children.each { |c| result.concat inner_node_references(name, c) }
72
- end
73
- end
74
- result
75
- end
76
-
77
- def match_rubyvm_node_to_ref(top, name)
78
- top.children.select { |c| c.is_a?(Symbol) }.any? { |c| c.to_s == name } ||
79
- top.children.select { |c| c.is_a?(Array) }.any? { |c| c.include?(name.to_sym) }
80
- end
81
-
82
- def chain *args
83
- NodeChainer.chain *args
84
- end
85
-
86
- def chain_string *args
87
- NodeChainer.load_string *args
88
- end
89
-
90
- def process_node *args
91
- Solargraph::Parser::NodeProcessor.process *args
92
- end
93
-
94
- def infer_literal_node_type node
95
- NodeMethods.infer_literal_node_type node
96
- end
97
-
98
- def version
99
- Ruby::VERSION
100
- end
101
-
102
- def is_ast_node? node
103
- if Parser.rubyvm?
104
- node.is_a?(RubyVM::AbstractSyntaxTree::Node)
105
- else
106
- node.is_a?(::Parser::AST::Node)
107
- end
108
- end
109
-
110
- def node_range node
111
- st = Position.new(node.first_lineno - 1, node.first_column)
112
- en = Position.new(node.last_lineno - 1, node.last_column)
113
- Range.new(st, en)
114
- end
115
-
116
- def recipient_node tree
117
- tree.each_with_index do |node, idx|
118
- return tree[idx + 1] if [:ARRAY, :ZARRAY, :LIST].include?(node.type) && tree[idx + 1] && [:FCALL, :VCALL, :CALL].include?(tree[idx + 1].type)
119
- end
120
- nil
121
- end
122
-
123
- def string_ranges node
124
- return [] unless is_ast_node?(node)
125
- result = []
126
- if node.type == :STR
127
- result.push Range.from_node(node)
128
- elsif node.type == :DSTR
129
- here = Range.from_node(node)
130
- there = Range.from_node(node.children[1])
131
- result.push Range.new(here.start, there&.start || here.ending)
132
- end
133
- node.children.each do |child|
134
- result.concat string_ranges(child)
135
- end
136
- if node.type == :DSTR && node.children.last.nil?
137
- last = node.children[-2]
138
- unless last.nil?
139
- rng = Range.from_node(last)
140
- pos = Position.new(rng.ending.line, rng.ending.column - 1)
141
- result.push Range.new(pos, pos)
142
- end
143
- end
144
- result
145
- end
146
- end
147
- end
148
- end
149
- end