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,70 +1,70 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module Pin
5
- module Common
6
- # @return [Location]
7
- attr_reader :location
8
-
9
- # @return [Pin::Base, nil]
10
- attr_reader :closure
11
-
12
- # @return [String]
13
- def name
14
- @name ||= ''
15
- end
16
-
17
- # @return [ComplexType]
18
- def return_type
19
- @return_type ||= ComplexType::UNDEFINED
20
- end
21
-
22
- # @return [ComplexType]
23
- def context
24
- # Get the static context from the nearest namespace
25
- @context ||= find_context
26
- end
27
- alias full_context context
28
-
29
- # @return [String]
30
- def namespace
31
- context.namespace.to_s
32
- end
33
-
34
- # @return [ComplexType]
35
- def binder
36
- @binder || context
37
- end
38
-
39
- # @return [String]
40
- def comments
41
- @comments ||= ''
42
- end
43
-
44
- # @return [String]
45
- def path
46
- @path ||= name.empty? ? context.namespace : "#{context.namespace}::#{name}"
47
- end
48
-
49
- private
50
-
51
- # @return [ComplexType]
52
- def find_context
53
- here = closure
54
- until here.nil?
55
- if here.is_a?(Pin::Namespace)
56
- return here.return_type
57
- elsif here.is_a?(Pin::Method)
58
- if here.scope == :instance
59
- return ComplexType.try_parse(here.context.namespace)
60
- else
61
- return here.context
62
- end
63
- end
64
- here = here.closure
65
- end
66
- ComplexType::ROOT
67
- end
68
- end
69
- end
70
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Pin
5
+ module Common
6
+ # @return [Location]
7
+ attr_reader :location
8
+
9
+ # @return [Pin::Closure, nil]
10
+ attr_reader :closure
11
+
12
+ # @return [String]
13
+ def name
14
+ @name ||= ''
15
+ end
16
+
17
+ # @return [ComplexType]
18
+ def return_type
19
+ @return_type ||= ComplexType::UNDEFINED
20
+ end
21
+
22
+ # @return [ComplexType]
23
+ def context
24
+ # Get the static context from the nearest namespace
25
+ @context ||= find_context
26
+ end
27
+ alias full_context context
28
+
29
+ # @return [String]
30
+ def namespace
31
+ context.namespace.to_s
32
+ end
33
+
34
+ # @return [ComplexType]
35
+ def binder
36
+ @binder || context
37
+ end
38
+
39
+ # @return [String]
40
+ def comments
41
+ @comments ||= ''
42
+ end
43
+
44
+ # @return [String]
45
+ def path
46
+ @path ||= name.empty? ? context.namespace : "#{context.namespace}::#{name}"
47
+ end
48
+
49
+ protected
50
+
51
+ attr_writer :context
52
+
53
+ private
54
+
55
+ # @return [ComplexType]
56
+ def find_context
57
+ here = closure
58
+ until here.nil?
59
+ if here.is_a?(Pin::Namespace)
60
+ return here.return_type
61
+ elsif here.is_a?(Pin::Method)
62
+ return here.context
63
+ end
64
+ here = here.closure
65
+ end
66
+ ComplexType::ROOT
67
+ end
68
+ end
69
+ end
70
+ end
@@ -1,43 +1,43 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module Pin
5
- class Constant < BaseVariable
6
- attr_reader :visibility
7
-
8
- def initialize visibility: :public, **splat
9
- super(**splat)
10
- @visibility = visibility
11
- end
12
-
13
- def return_type
14
- @return_type ||= generate_complex_type
15
- end
16
-
17
- def completion_item_kind
18
- Solargraph::LanguageServer::CompletionItemKinds::CONSTANT
19
- end
20
-
21
- # @return [Integer]
22
- def symbol_kind
23
- LanguageServer::SymbolKinds::CONSTANT
24
- end
25
-
26
- def path
27
- @path ||= context.namespace.to_s.empty? ? name : "#{context.namespace}::#{name}"
28
- end
29
-
30
- private
31
-
32
- # @return [ComplexType]
33
- def generate_complex_type
34
- tags = docstring.tags(:return).map(&:types).flatten.reject(&:nil?)
35
- if tags.empty?
36
- tags = docstring.tags(:type).map(&:types).flatten.reject(&:nil?)
37
- end
38
- return ComplexType::UNDEFINED if tags.empty?
39
- ComplexType.try_parse *tags
40
- end
41
- end
42
- end
43
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Pin
5
+ class Constant < BaseVariable
6
+ attr_reader :visibility
7
+
8
+ def initialize visibility: :public, **splat
9
+ super(**splat)
10
+ @visibility = visibility
11
+ end
12
+
13
+ def return_type
14
+ @return_type ||= generate_complex_type
15
+ end
16
+
17
+ def completion_item_kind
18
+ Solargraph::LanguageServer::CompletionItemKinds::CONSTANT
19
+ end
20
+
21
+ # @return [Integer]
22
+ def symbol_kind
23
+ LanguageServer::SymbolKinds::CONSTANT
24
+ end
25
+
26
+ def path
27
+ @path ||= context.namespace.to_s.empty? ? name : "#{context.namespace}::#{name}"
28
+ end
29
+
30
+ private
31
+
32
+ # @return [ComplexType]
33
+ def generate_complex_type
34
+ tags = docstring.tags(:return).map(&:types).flatten.reject(&:nil?)
35
+ if tags.empty?
36
+ tags = docstring.tags(:type).map(&:types).flatten.reject(&:nil?)
37
+ end
38
+ return ComplexType::UNDEFINED if tags.empty?
39
+ ComplexType.try_parse *tags
40
+ end
41
+ end
42
+ end
43
+ end
@@ -1,96 +1,123 @@
1
- # frozen_string_literal: true
2
-
3
- require 'cgi'
4
-
5
- module Solargraph
6
- module Pin
7
- # @todo Move this stuff. It should be the responsibility of the language server.
8
- module Conversions
9
- # @return [Hash]
10
- def completion_item
11
- @completion_item ||= {
12
- label: name,
13
- kind: completion_item_kind,
14
- detail: detail,
15
- data: {
16
- path: path,
17
- return_type: return_type.tag,
18
- location: (location ? location.to_hash : nil),
19
- deprecated: deprecated?
20
- }
21
- }
22
- end
23
-
24
- # @return [Hash]
25
- def resolve_completion_item
26
- @resolve_completion_item ||= begin
27
- extra = {}
28
- alldoc = ''
29
- # alldoc += link_documentation unless link_documentation.nil?
30
- # alldoc += "\n\n" unless alldoc.empty?
31
- alldoc += documentation unless documentation.nil?
32
- extra[:documentation] = alldoc unless alldoc.empty?
33
- completion_item.merge(extra)
34
- end
35
- end
36
-
37
- # @return [Hash]
38
- def signature_help
39
- @signature_help ||= {
40
- label: name + '(' + parameters.map(&:full).join(', ') + ')',
41
- documentation: documentation
42
- }
43
- end
44
-
45
- # @return [String]
46
- def detail
47
- # This property is not cached in an instance variable because it can
48
- # change when pins get proxied.
49
- detail = String.new
50
- detail += "(#{parameters.map(&:full).join(', ')}) " unless !is_a?(Pin::Method) || parameters.empty?
51
- detail += "=#{probed? ? '~' : (proxied? ? '^' : '>')} #{return_type.to_s}" unless return_type.undefined?
52
- detail.strip!
53
- return nil if detail.empty?
54
- detail
55
- end
56
-
57
- # Get a markdown-flavored link to a documentation page.
58
- #
59
- # @return [String]
60
- def link_documentation
61
- @link_documentation ||= generate_link
62
- end
63
-
64
- def text_documentation
65
- this_path = path || return_type.tag
66
- return nil if this_path == 'undefined'
67
- escape_brackets this_path
68
- end
69
-
70
- def reset_conversions
71
- @completion_item = nil
72
- @resolve_completion_item = nil
73
- @signature_help = nil
74
- @detail = nil
75
- @link_documentation = nil
76
- end
77
-
78
- private
79
-
80
- # @return [String]
81
- def generate_link
82
- this_path = path || return_type.tag
83
- return nil if this_path == 'undefined'
84
- return nil if this_path.nil? || this_path == 'undefined'
85
- "[#{escape_brackets(this_path).gsub('_', '\\\\_')}](solargraph:/document?query=#{CGI.escape(this_path)})"
86
- end
87
-
88
- # @param text [String]
89
- # @return [String]
90
- def escape_brackets text
91
- # text.gsub(/(\<|\>)/, "\\#{$1}")
92
- text.gsub("<", '\<').gsub(">", '\>')
93
- end
94
- end
95
- end
96
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'cgi'
4
+
5
+ module Solargraph
6
+ module Pin
7
+ # @todo Move this stuff. It should be the responsibility of the language server.
8
+ # @todo abstract methods below should be verified to be overridden
9
+ # by type checker when mixin included by non-abstract class
10
+ module Conversions
11
+ # @!parse
12
+ # include Documenting
13
+ # include Common
14
+
15
+ # @return [Integer]
16
+ # @abstract
17
+ def completion_item_kind
18
+ raise NotImplementedError
19
+ end
20
+
21
+ # @abstract
22
+ # @return [Boolean]
23
+ def deprecated?
24
+ raise NotImplementedError
25
+ end
26
+
27
+ # @abstract
28
+ def probed?
29
+ raise NotImplementedError
30
+ end
31
+
32
+ # @abstract
33
+ def proxied?
34
+ raise NotImplementedError
35
+ end
36
+
37
+ # @return [Hash]
38
+ def completion_item
39
+ @completion_item ||= {
40
+ label: name,
41
+ kind: completion_item_kind,
42
+ detail: detail,
43
+ data: {
44
+ path: path,
45
+ return_type: return_type.tag,
46
+ location: (location ? location.to_hash : nil),
47
+ deprecated: deprecated?
48
+ }
49
+ }
50
+ end
51
+
52
+ # @return [Hash]
53
+ def resolve_completion_item
54
+ @resolve_completion_item ||= begin
55
+ extra = {}
56
+ alldoc = ''
57
+ # alldoc += link_documentation unless link_documentation.nil?
58
+ # alldoc += "\n\n" unless alldoc.empty?
59
+ alldoc += documentation unless documentation.nil?
60
+ extra[:documentation] = alldoc unless alldoc.empty?
61
+ completion_item.merge(extra)
62
+ end
63
+ end
64
+
65
+ # @return [::Array<Hash>]
66
+ def signature_help
67
+ []
68
+ end
69
+
70
+ # @return [String, nil]
71
+ def detail
72
+ # This property is not cached in an instance variable because it can
73
+ # change when pins get proxied.
74
+ detail = String.new
75
+ detail += "=#{probed? ? '~' : (proxied? ? '^' : '>')} #{return_type.to_s}" unless return_type.undefined?
76
+ detail.strip!
77
+ return nil if detail.empty?
78
+ detail
79
+ end
80
+
81
+ # Get a markdown-flavored link to a documentation page.
82
+ #
83
+ # @return [String]
84
+ def link_documentation
85
+ @link_documentation ||= generate_link
86
+ end
87
+
88
+ # @return [String, nil]
89
+ def text_documentation
90
+ this_path = path || name || return_type.tag
91
+ return nil if this_path == 'undefined'
92
+ escape_brackets this_path
93
+ end
94
+
95
+ # @return [void]
96
+ def reset_conversions
97
+ @completion_item = nil
98
+ @resolve_completion_item = nil
99
+ @signature_help = nil
100
+ @detail = nil
101
+ @link_documentation = nil
102
+ end
103
+
104
+ private
105
+
106
+ # @return [String, nil]
107
+ def generate_link
108
+ this_path = path || name || return_type.tag
109
+ return nil if this_path == 'undefined'
110
+ return nil if this_path.nil? || this_path == 'undefined'
111
+ return this_path if path.nil?
112
+ "[#{escape_brackets(this_path).gsub('_', '\\\\_')}](solargraph:/document?query=#{CGI.escape(this_path)})"
113
+ end
114
+
115
+ # @param text [String]
116
+ # @return [String]
117
+ def escape_brackets text
118
+ # text.gsub(/(\<|\>)/, "\\#{$1}")
119
+ text.gsub("<", '\<').gsub(">", '\>')
120
+ end
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,101 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Pin
5
+ # A DelegatedMethod is a more complicated version of a MethodAlias that
6
+ # allows aliasing a method from a different closure (class/module etc).
7
+ class DelegatedMethod < Pin::Method
8
+ # A DelegatedMethod can be constructed with either a :resolved_method
9
+ # pin, or a :receiver_chain. When a :receiver_chain is supplied, it
10
+ # will be used to *dynamically* resolve a receiver type within the
11
+ # given closure/scope, and the delegated method will then be resolved
12
+ # to a method pin on that type.
13
+ #
14
+ # @param method [Method, nil] an already resolved method pin.
15
+ # @param receiver [Source::Chain, nil] the source code used to resolve the receiver for this delegated method.
16
+ # @param name [String]
17
+ # @param receiver_method_name [String] the method name that will be called on the receiver (defaults to :name).
18
+ def initialize(method: nil, receiver: nil, name: method&.name, receiver_method_name: name, **splat)
19
+ raise ArgumentError, 'either :method or :receiver is required' if (method && receiver) || (!method && !receiver)
20
+ super(name: name, **splat)
21
+
22
+ @receiver_chain = receiver
23
+ @resolved_method = method
24
+ @receiver_method_name = receiver_method_name
25
+ end
26
+
27
+ %i[comments parameters return_type location].each do |method|
28
+ define_method(method) do
29
+ @resolved_method ? @resolved_method.send(method) : super()
30
+ end
31
+ end
32
+
33
+ %i[typify realize infer probe].each do |method|
34
+ # @param api_map [ApiMap]
35
+ define_method(method) do |api_map|
36
+ resolve_method(api_map)
37
+ @resolved_method ? @resolved_method.send(method, api_map) : super(api_map)
38
+ end
39
+ end
40
+
41
+ # @param api_map [ApiMap]
42
+ def resolvable?(api_map)
43
+ resolve_method(api_map)
44
+ !!@resolved_method
45
+ end
46
+
47
+ private
48
+
49
+ # Resolves the receiver chain and method name to a method pin, resetting any previously resolution.
50
+ #
51
+ # @param api_map [ApiMap]
52
+ # @return [Pin::Method, nil]
53
+ def resolve_method api_map
54
+ return if @resolved_method
55
+
56
+ resolver = @receiver_chain.define(api_map, self, []).first
57
+
58
+ unless resolver
59
+ Solargraph.logger.warn \
60
+ "Delegated receiver for #{path} was resolved to nil from `#{print_chain(@receiver_chain)}'"
61
+ return
62
+ end
63
+
64
+ receiver_type = resolver.return_type
65
+
66
+ return if receiver_type.undefined?
67
+
68
+ receiver_path, method_scope =
69
+ if @receiver_chain.constant?
70
+ # HACK: the `return_type` of a constant is Class<Whatever>, but looking up a method expects
71
+ # the arguments `"Whatever"` and `scope: :class`.
72
+ [receiver_type.to_s.sub(/^Class<(.+)>$/, '\1'), :class]
73
+ else
74
+ [receiver_type.to_s, :instance]
75
+ end
76
+
77
+ method_stack = api_map.get_method_stack(receiver_path, @receiver_method_name, scope: method_scope)
78
+ @resolved_method = method_stack.first
79
+ end
80
+
81
+ # helper to print a source chain as code, probably not 100% correct.
82
+ #
83
+ # @param chain [Source::Chain]
84
+ # @return [String]
85
+ def print_chain(chain)
86
+ out = +''
87
+ chain.links.each_with_index do |link, index|
88
+ if index > 0
89
+ if Source::Chain::Constant
90
+ out << '::' unless link.word.start_with?('::')
91
+ else
92
+ out << '.'
93
+ end
94
+ end
95
+ out << link.word
96
+ end
97
+ out
98
+ end
99
+ end
100
+ end
101
+ end