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,30 +1,30 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- class Source
5
- class Chain
6
- class ZSuper < Call
7
- # @return [String]
8
- attr_reader :word
9
-
10
- # @return [Array<Chain>]
11
- attr_reader :arguments
12
-
13
- # @param word [String]
14
- # @param arguments [Array<Chain>]
15
- # @param with_block [Boolean] True if the chain is inside a block
16
- # @param head [Boolean] True if the call is the start of its chain
17
- def initialize word, with_block = false
18
- super(word, [], with_block)
19
- end
20
-
21
- # @param api_map [ApiMap]
22
- # @param name_pin [Pin::Base]
23
- # @param locals [Array<Pin::Base>]
24
- def resolve api_map, name_pin, locals
25
- return super_pins(api_map, name_pin)
26
- end
27
- end
28
- end
29
- end
30
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ class Source
5
+ class Chain
6
+ class ZSuper < Call
7
+ # @return [String]
8
+ attr_reader :word
9
+
10
+ # @return [::Array<Chain>]
11
+ attr_reader :arguments
12
+
13
+ # @param word [String]
14
+ # @param arguments [::Array<Chain>]
15
+ # @param with_block [Boolean] True if the chain is inside a block
16
+ # @param head [Boolean] True if the call is the start of its chain
17
+ def initialize word, with_block = false
18
+ super(word, [], with_block)
19
+ end
20
+
21
+ # @param api_map [ApiMap]
22
+ # @param name_pin [Pin::Base]
23
+ # @param locals [::Array<Pin::Base>]
24
+ def resolve api_map, name_pin, locals
25
+ return super_pins(api_map, name_pin)
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -1,164 +1,252 @@
1
- # frozen_string_literal: true
2
-
3
- # HACK: Fix autoload issue
4
- require 'solargraph/source/chain/link'
5
-
6
- module Solargraph
7
- class Source
8
- # A chain of constants, variables, and method calls for inferring types of
9
- # values.
10
- #
11
- class Chain
12
- autoload :Link, 'solargraph/source/chain/link'
13
- autoload :Call, 'solargraph/source/chain/call'
14
- autoload :QCall, 'solargraph/source/chain/q_call'
15
- autoload :Variable, 'solargraph/source/chain/variable'
16
- autoload :ClassVariable, 'solargraph/source/chain/class_variable'
17
- autoload :Constant, 'solargraph/source/chain/constant'
18
- autoload :InstanceVariable, 'solargraph/source/chain/instance_variable'
19
- autoload :GlobalVariable, 'solargraph/source/chain/global_variable'
20
- autoload :Literal, 'solargraph/source/chain/literal'
21
- autoload :Head, 'solargraph/source/chain/head'
22
- autoload :Or, 'solargraph/source/chain/or'
23
- autoload :BlockVariable, 'solargraph/source/chain/block_variable'
24
- autoload :ZSuper, 'solargraph/source/chain/z_super'
25
- autoload :Hash, 'solargraph/source/chain/hash'
26
-
27
- @@inference_stack = []
28
- @@inference_depth = 0
29
-
30
- UNDEFINED_CALL = Chain::Call.new('<undefined>')
31
- UNDEFINED_CONSTANT = Chain::Constant.new('<undefined>')
32
-
33
- # @return [Array<Source::Chain::Link>]
34
- attr_reader :links
35
-
36
- attr_reader :node
37
-
38
- # @param links [Array<Chain::Link>]
39
- def initialize links, node = nil, splat = false
40
- @links = links.clone
41
- @links.push UNDEFINED_CALL if @links.empty?
42
- head = true
43
- @links.map! do |link|
44
- result = (head ? link.clone_head : link.clone_body)
45
- head = false
46
- result
47
- end
48
- @node = node
49
- @splat = splat
50
- end
51
-
52
- # @return [Chain]
53
- def base
54
- @base ||= Chain.new(links[0..-2])
55
- end
56
-
57
- # @param api_map [ApiMap]
58
- # @param name_pin [Pin::Base]
59
- # @param locals [Array<Pin::Base>]
60
- # @return [Array<Pin::Base>]
61
- def define api_map, name_pin, locals
62
- return [] if undefined?
63
- working_pin = name_pin
64
- links[0..-2].each do |link|
65
- pins = link.resolve(api_map, working_pin, locals)
66
- type = infer_first_defined(pins, working_pin, api_map)
67
- return [] if type.undefined?
68
- working_pin = Pin::ProxyType.anonymous(type)
69
- end
70
- links.last.last_context = working_pin
71
- links.last.resolve(api_map, working_pin, locals)
72
- end
73
-
74
- # @param api_map [ApiMap]
75
- # @param name_pin [Pin::Base]
76
- # @param locals [Array<Pin::Base>]
77
- # @return [ComplexType]
78
- def infer api_map, name_pin, locals
79
- pins = define(api_map, name_pin, locals)
80
- type = infer_first_defined(pins, links.last.last_context, api_map)
81
- maybe_nil(type)
82
- end
83
-
84
- # @return [Boolean]
85
- def literal?
86
- links.last.is_a?(Chain::Literal)
87
- end
88
-
89
- def undefined?
90
- links.any?(&:undefined?)
91
- end
92
-
93
- def defined?
94
- !undefined?
95
- end
96
-
97
- # @return [Boolean]
98
- def constant?
99
- links.last.is_a?(Chain::Constant)
100
- end
101
-
102
- def splat?
103
- @splat
104
- end
105
-
106
- def nullable?
107
- links.any?(&:nullable?)
108
- end
109
-
110
- private
111
-
112
- # @param pins [Array<Pin::Base>]
113
- # @param api_map [ApiMap]
114
- # @return [ComplexType]
115
- def infer_first_defined pins, context, api_map
116
- possibles = []
117
- pins.each do |pin|
118
- # Avoid infinite recursion
119
- next if @@inference_stack.include?(pin.identity)
120
- @@inference_stack.push pin.identity
121
- type = pin.typify(api_map)
122
- @@inference_stack.pop
123
- if type.defined?
124
- possibles.push type
125
- break if pin.is_a?(Pin::Method)
126
- end
127
- end
128
- if possibles.empty?
129
- # Limit method inference recursion
130
- return ComplexType::UNDEFINED if @@inference_depth >= 10 && pins.first.is_a?(Pin::Method)
131
- @@inference_depth += 1
132
- pins.each do |pin|
133
- # Avoid infinite recursion
134
- next if @@inference_stack.include?(pin.identity)
135
- @@inference_stack.push pin.identity
136
- type = pin.probe(api_map)
137
- @@inference_stack.pop
138
- if type.defined?
139
- possibles.push type
140
- break if pin.is_a?(Pin::Method)
141
- end
142
- end
143
- @@inference_depth -= 1
144
- end
145
- return ComplexType::UNDEFINED if possibles.empty?
146
- type = if possibles.length > 1
147
- sorted = possibles.map { |t| t.rooted? ? "::#{t}" : t.to_s }.sort { |a, _| a == 'nil' ? 1 : 0 }
148
- ComplexType.parse(*sorted)
149
- else
150
- possibles.first
151
- end
152
- return type if context.nil? || context.return_type.undefined?
153
- type.self_to(context.return_type.namespace)
154
- end
155
-
156
- # @param type [ComplexType]
157
- def maybe_nil type
158
- return type if type.undefined? || type.void? || type.nullable?
159
- return type unless nullable?
160
- ComplexType.try_parse("#{type}, nil")
161
- end
162
- end
163
- end
164
- end
1
+ # frozen_string_literal: true
2
+
3
+ # HACK: Fix autoload issue
4
+ require 'solargraph/source/chain/link'
5
+
6
+ module Solargraph
7
+ class Source
8
+ #
9
+ # Represents an expression as a single call chain at the parse
10
+ # tree level, made up of constants, variables, and method calls,
11
+ # each represented as a Link object.
12
+ #
13
+ # Computes Pins and/or ComplexTypes representing the interpreted
14
+ # expression.
15
+ #
16
+ class Chain
17
+ include Equality
18
+
19
+ autoload :Link, 'solargraph/source/chain/link'
20
+ autoload :Call, 'solargraph/source/chain/call'
21
+ autoload :QCall, 'solargraph/source/chain/q_call'
22
+ autoload :Variable, 'solargraph/source/chain/variable'
23
+ autoload :ClassVariable, 'solargraph/source/chain/class_variable'
24
+ autoload :Constant, 'solargraph/source/chain/constant'
25
+ autoload :InstanceVariable, 'solargraph/source/chain/instance_variable'
26
+ autoload :GlobalVariable, 'solargraph/source/chain/global_variable'
27
+ autoload :Literal, 'solargraph/source/chain/literal'
28
+ autoload :Head, 'solargraph/source/chain/head'
29
+ autoload :If, 'solargraph/source/chain/if'
30
+ autoload :Or, 'solargraph/source/chain/or'
31
+ autoload :BlockVariable, 'solargraph/source/chain/block_variable'
32
+ autoload :BlockSymbol, 'solargraph/source/chain/block_symbol'
33
+ autoload :ZSuper, 'solargraph/source/chain/z_super'
34
+ autoload :Hash, 'solargraph/source/chain/hash'
35
+ autoload :Array, 'solargraph/source/chain/array'
36
+
37
+ @@inference_stack = []
38
+ @@inference_depth = 0
39
+ @@inference_invalidation_key = nil
40
+ @@inference_cache = {}
41
+
42
+ UNDEFINED_CALL = Chain::Call.new('<undefined>')
43
+ UNDEFINED_CONSTANT = Chain::Constant.new('<undefined>')
44
+
45
+ # @return [::Array<Source::Chain::Link>]
46
+ attr_reader :links
47
+
48
+ attr_reader :node
49
+
50
+ # @sg-ignore Fix "Not enough arguments to Module#protected"
51
+ protected def equality_fields
52
+ [links, node]
53
+ end
54
+
55
+ # @param node [Parser::AST::Node, nil]
56
+ # @param links [::Array<Chain::Link>]
57
+ # @param splat [Boolean]
58
+ def initialize links, node = nil, splat = false
59
+ @links = links.clone
60
+ @links.push UNDEFINED_CALL if @links.empty?
61
+ head = true
62
+ @links.map! do |link|
63
+ result = (head ? link.clone_head : link.clone_body)
64
+ head = false
65
+ result
66
+ end
67
+ @node = node
68
+ @splat = splat
69
+ end
70
+
71
+ # @return [Chain]
72
+ def base
73
+ @base ||= Chain.new(links[0..-2])
74
+ end
75
+
76
+ # Determine potential Pins returned by this chain of words
77
+ #
78
+ # @param api_map [ApiMap]
79
+ # @param name_pin [Pin::Closure] the surrounding closure pin for
80
+ # the statement represented by this chain for type resolution
81
+ # and method pin lookup.
82
+ #
83
+ # For method calls (Chain::Call objects) as the first element
84
+ # in the chain, 'name_pin.binder' should return the
85
+ # ComplexType representing the LHS / "self type" of the call.
86
+ #
87
+ # @param locals [::Enumerable<Pin::LocalVariable>] Any local
88
+ # variables / method parameters etc visible by the statement
89
+ #
90
+ # @return [::Array<Pin::Base>] Pins representing possible return
91
+ # types of this method.
92
+ def define api_map, name_pin, locals
93
+ return [] if undefined?
94
+
95
+ # working_pin is the surrounding closure pin for the link
96
+ # being processed, whose #binder method will provide the LHS /
97
+ # 'self type' of the next link (same as the #return_type method
98
+ # --the type of the result so far).
99
+ #
100
+ # @todo ProxyType uses 'type' for the binder, but '
101
+ working_pin = name_pin
102
+ links[0..-2].each do |link|
103
+ pins = link.resolve(api_map, working_pin, locals)
104
+ type = infer_first_defined(pins, working_pin, api_map, locals)
105
+ return [] if type.undefined?
106
+ working_pin = Pin::ProxyType.anonymous(type)
107
+ end
108
+ links.last.last_context = working_pin
109
+ links.last.resolve(api_map, working_pin, locals)
110
+ end
111
+
112
+ # @param api_map [ApiMap]
113
+ # @param name_pin [Pin::Base]
114
+ # @param locals [::Array<Pin::LocalVariable>]
115
+ # @return [ComplexType]
116
+ # @sg-ignore
117
+ def infer api_map, name_pin, locals
118
+ cache_key = [node, node&.location, links, name_pin&.return_type, locals]
119
+ if @@inference_invalidation_key == api_map.hash
120
+ cached = @@inference_cache[cache_key]
121
+ return cached if cached
122
+ else
123
+ @@inference_invalidation_key = api_map.hash
124
+ @@inference_cache = {}
125
+ end
126
+ out = infer_uncached api_map, name_pin, locals
127
+ logger.debug { "Chain#infer() - caching result - cache_key_hash=#{cache_key.hash}, links.map(&:hash)=#{links.map(&:hash)}, links=#{links}, cache_key.map(&:hash) = #{cache_key.map(&:hash)}, cache_key=#{cache_key}" }
128
+ @@inference_cache[cache_key] = out
129
+ end
130
+
131
+ # @param api_map [ApiMap]
132
+ # @param name_pin [Pin::Base]
133
+ # @param locals [::Array<Pin::LocalVariable>]
134
+ # @return [ComplexType]
135
+ def infer_uncached api_map, name_pin, locals
136
+ pins = define(api_map, name_pin, locals)
137
+ type = infer_first_defined(pins, links.last.last_context, api_map, locals)
138
+ maybe_nil(type)
139
+ end
140
+
141
+ # @return [Boolean]
142
+ def literal?
143
+ links.last.is_a?(Chain::Literal)
144
+ end
145
+
146
+ def undefined?
147
+ links.any?(&:undefined?)
148
+ end
149
+
150
+ def defined?
151
+ !undefined?
152
+ end
153
+
154
+ # @return [Boolean]
155
+ def constant?
156
+ links.last.is_a?(Chain::Constant)
157
+ end
158
+
159
+ def splat?
160
+ @splat
161
+ end
162
+
163
+ def nullable?
164
+ links.any?(&:nullable?)
165
+ end
166
+
167
+ include Logging
168
+
169
+ def desc
170
+ links.map(&:desc).to_s
171
+ end
172
+
173
+ def to_s
174
+ desc
175
+ end
176
+
177
+ private
178
+
179
+ # @param pins [::Array<Pin::Base>]
180
+ # @param context [Pin::Base]
181
+ # @param api_map [ApiMap]
182
+ # @param locals [::Enumerable<Pin::LocalVariable>]
183
+ # @return [ComplexType]
184
+ def infer_first_defined pins, context, api_map, locals
185
+ possibles = []
186
+ # @todo this param tag shouldn't be needed to probe the type
187
+ # @todo ...but given it is needed, typecheck should complain that it is needed
188
+ # @param pin [Pin::Base]
189
+ pins.each do |pin|
190
+ # Avoid infinite recursion
191
+ next if @@inference_stack.include?(pin)
192
+
193
+ @@inference_stack.push pin
194
+ type = pin.typify(api_map)
195
+ @@inference_stack.pop
196
+ if type.defined?
197
+ if type.generic?
198
+ # @todo even at strong, no typechecking complaint
199
+ # happens when a [Pin::Base,nil] is passed into a method
200
+ # that accepts only [Pin::Namespace] as an argument
201
+ type = type.resolve_generics(pin.closure, context.binder)
202
+ end
203
+ if type.defined?
204
+ possibles.push type
205
+ break if pin.is_a?(Pin::Method)
206
+ end
207
+ end
208
+ end
209
+ if possibles.empty?
210
+ # Limit method inference recursion
211
+ return ComplexType::UNDEFINED if @@inference_depth >= 10 && pins.first.is_a?(Pin::Method)
212
+
213
+ @@inference_depth += 1
214
+ # @param pin [Pin::Base]
215
+ pins.each do |pin|
216
+ # Avoid infinite recursion
217
+ next if @@inference_stack.include?(pin)
218
+
219
+ @@inference_stack.push pin
220
+ type = pin.probe(api_map)
221
+ @@inference_stack.pop
222
+ if type.defined?
223
+ possibles.push type
224
+ break if pin.is_a?(Pin::Method)
225
+ end
226
+ end
227
+ @@inference_depth -= 1
228
+ end
229
+ return ComplexType::UNDEFINED if possibles.empty?
230
+
231
+ type = if possibles.length > 1
232
+ # Move nil to the end by convention
233
+ sorted = possibles.sort { |a, _| a.tag == 'nil' ? 1 : 0 }
234
+ ComplexType.new(sorted.uniq)
235
+ else
236
+ ComplexType.new(possibles)
237
+ end
238
+ return type if context.nil? || context.return_type.undefined?
239
+
240
+ type.self_to_type(context.return_type)
241
+ end
242
+
243
+ # @param type [ComplexType]
244
+ # @return [ComplexType]
245
+ def maybe_nil type
246
+ return type if type.undefined? || type.void? || type.nullable?
247
+ return type unless nullable?
248
+ ComplexType.new(type.items + [ComplexType::NIL])
249
+ end
250
+ end
251
+ end
252
+ end
@@ -1,79 +1,82 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- class Source
5
- # A change to be applied to text.
6
- #
7
- class Change
8
- include EncodingFixes
9
-
10
- # @return [Range]
11
- attr_reader :range
12
-
13
- # @return [String]
14
- attr_reader :new_text
15
-
16
- # @param range [Range] The starting and ending positions of the change.
17
- # If nil, the original text will be overwritten.
18
- # @param new_text [String] The text to be changed.
19
- def initialize range, new_text
20
- @range = range
21
- @new_text = new_text
22
- end
23
-
24
- # Write the change to the specified text.
25
- #
26
- # @param text [String] The text to be changed.
27
- # @param nullable [Boolean] If true, minor changes that could generate
28
- # syntax errors will be repaired.
29
- # @return [String] The updated text.
30
- def write text, nullable = false
31
- if nullable and !range.nil? and new_text.match(/[\.\[\{\(@\$:]$/)
32
- [':', '@'].each do |dupable|
33
- next unless new_text == dupable
34
- offset = Position.to_offset(text, range.start)
35
- if text[offset - 1] == dupable
36
- p = Position.from_offset(text, offset - 1)
37
- r = Change.new(Range.new(p, range.start), ' ')
38
- text = r.write(text)
39
- end
40
- break
41
- end
42
- commit text, "#{new_text[0..-2]} "
43
- elsif range.nil?
44
- new_text
45
- else
46
- commit text, new_text
47
- end
48
- end
49
-
50
- # Repair an update by replacing the new text with similarly formatted
51
- # whitespace.
52
- #
53
- # @param text [String] The text to be changed.
54
- # @return [String] The updated text.
55
- def repair text
56
- fixed = new_text.gsub(/[^\s]/, ' ')
57
- if range.nil?
58
- fixed
59
- else
60
- result = commit text, fixed
61
- off = Position.to_offset(text, range.start)
62
- match = result[0, off].match(/[\.:]+\z/)
63
- if match
64
- result = result[0, off].sub(/#{match[0]}\z/, ' ' * match[0].length) + result[off..-1]
65
- end
66
- result
67
- end
68
- end
69
-
70
- private
71
-
72
- def commit text, insert
73
- start_offset = Position.to_offset(text, range.start)
74
- end_offset = Position.to_offset(text, range.ending)
75
- (start_offset == 0 ? '' : text[0..start_offset-1].to_s) + normalize(insert) + text[end_offset..-1].to_s
76
- end
77
- end
78
- end
79
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ class Source
5
+ # A change to be applied to text.
6
+ #
7
+ class Change
8
+ include EncodingFixes
9
+
10
+ # @return [Range]
11
+ attr_reader :range
12
+
13
+ # @return [String]
14
+ attr_reader :new_text
15
+
16
+ # @param range [Range] The starting and ending positions of the change.
17
+ # If nil, the original text will be overwritten.
18
+ # @param new_text [String] The text to be changed.
19
+ def initialize range, new_text
20
+ @range = range
21
+ @new_text = new_text
22
+ end
23
+
24
+ # Write the change to the specified text.
25
+ #
26
+ # @param text [String] The text to be changed.
27
+ # @param nullable [Boolean] If true, minor changes that could generate
28
+ # syntax errors will be repaired.
29
+ # @return [String] The updated text.
30
+ def write text, nullable = false
31
+ if nullable and !range.nil? and new_text.match(/[\.\[\{\(@\$:]$/)
32
+ [':', '@'].each do |dupable|
33
+ next unless new_text == dupable
34
+ offset = Position.to_offset(text, range.start)
35
+ if text[offset - 1] == dupable
36
+ p = Position.from_offset(text, offset - 1)
37
+ r = Change.new(Range.new(p, range.start), ' ')
38
+ text = r.write(text)
39
+ end
40
+ break
41
+ end
42
+ commit text, "#{new_text[0..-2]} "
43
+ elsif range.nil?
44
+ new_text
45
+ else
46
+ commit text, new_text
47
+ end
48
+ end
49
+
50
+ # Repair an update by replacing the new text with similarly formatted
51
+ # whitespace.
52
+ #
53
+ # @param text [String] The text to be changed.
54
+ # @return [String] The updated text.
55
+ def repair text
56
+ fixed = new_text.gsub(/[^\s]/, ' ')
57
+ if range.nil?
58
+ fixed
59
+ else
60
+ result = commit text, fixed
61
+ off = Position.to_offset(text, range.start)
62
+ match = result[0, off].match(/[\.:]+\z/)
63
+ if match
64
+ result = result[0, off].sub(/#{match[0]}\z/, ' ' * match[0].length) + result[off..-1]
65
+ end
66
+ result
67
+ end
68
+ end
69
+
70
+ private
71
+
72
+ # @param text [String]
73
+ # @param insert [String]
74
+ # @return [String]
75
+ def commit text, insert
76
+ start_offset = Position.to_offset(text, range.start)
77
+ end_offset = Position.to_offset(text, range.ending)
78
+ (start_offset == 0 ? '' : text[0..start_offset-1].to_s) + normalize(insert) + text[end_offset..-1].to_s
79
+ end
80
+ end
81
+ end
82
+ end