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,296 +1,378 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module Pin
5
- # The base class for map pins.
6
- #
7
- class Base
8
- include Common
9
- include Conversions
10
- include Documenting
11
-
12
- # @return [YARD::CodeObjects::Base]
13
- attr_reader :code_object
14
-
15
- # @return [Solargraph::Location]
16
- attr_reader :location
17
-
18
- # @return [String]
19
- attr_reader :name
20
-
21
- # @return [String]
22
- attr_reader :path
23
-
24
- # @param location [Solargraph::Location]
25
- # @param kind [Integer]
26
- # @param closure [Solargraph::Pin::Closure]
27
- # @param name [String]
28
- # @param comments [String]
29
- def initialize location: nil, closure: nil, name: '', comments: ''
30
- @location = location
31
- @closure = closure
32
- @name = name
33
- @comments = comments
34
- end
35
-
36
- # @return [String]
37
- def comments
38
- @comments ||= ''
39
- end
40
-
41
- # @return [String, nil]
42
- def filename
43
- return nil if location.nil?
44
- location.filename
45
- end
46
-
47
- # @return [Integer]
48
- def completion_item_kind
49
- LanguageServer::CompletionItemKinds::KEYWORD
50
- end
51
-
52
- # @return [Integer, nil]
53
- def symbol_kind
54
- nil
55
- end
56
-
57
- def to_s
58
- name.to_s
59
- end
60
-
61
- # @return [Boolean]
62
- def variable?
63
- false
64
- end
65
-
66
- # Pin equality is determined using the #nearly? method and also
67
- # requiring both pins to have the same location.
68
- #
69
- def == other
70
- return false unless nearly? other
71
- comments == other.comments and location == other.location
72
- end
73
-
74
- # True if the specified pin is a near match to this one. A near match
75
- # indicates that the pins contain mostly the same data. Any differences
76
- # between them should not have an impact on the API surface.
77
- #
78
- # @param other [Solargraph::Pin::Base, Object]
79
- # @return [Boolean]
80
- def nearly? other
81
- self.class == other.class &&
82
- name == other.name &&
83
- (closure == other.closure || (closure && closure.nearly?(other.closure))) &&
84
- (comments == other.comments ||
85
- (((maybe_directives? == false && other.maybe_directives? == false) || compare_directives(directives, other.directives)) &&
86
- compare_docstring_tags(docstring, other.docstring))
87
- )
88
- end
89
-
90
- # The pin's return type.
91
- #
92
- # @return [ComplexType]
93
- def return_type
94
- @return_type ||= ComplexType::UNDEFINED
95
- end
96
-
97
- # @return [YARD::Docstring]
98
- def docstring
99
- parse_comments unless defined?(@docstring)
100
- @docstring ||= Solargraph::Source.parse_docstring('').to_docstring
101
- end
102
-
103
- # @return [Array<YARD::Tags::Directive>]
104
- def directives
105
- parse_comments unless defined?(@directives)
106
- @directives
107
- end
108
-
109
- # @return [Array<YARD::Tags::MacroDirective>]
110
- def macros
111
- @macros ||= collect_macros
112
- end
113
-
114
- # Perform a quick check to see if this pin possibly includes YARD
115
- # directives. This method does not require parsing the comments.
116
- #
117
- # After the comments have been parsed, this method will return false if
118
- # no directives were found, regardless of whether it previously appeared
119
- # possible.
120
- #
121
- # @return [Boolean]
122
- def maybe_directives?
123
- return !@directives.empty? if defined?(@directives)
124
- @maybe_directives ||= comments.include?('@!')
125
- end
126
-
127
- # @return [Boolean]
128
- def deprecated?
129
- @deprecated ||= docstring.has_tag?('deprecated')
130
- end
131
-
132
- # Get a fully qualified type from the pin's return type.
133
- #
134
- # The relative type is determined from YARD documentation (@return,
135
- # @param, @type, etc.) and its namespaces are fully qualified using the
136
- # provided ApiMap.
137
- #
138
- # @param api_map [ApiMap]
139
- # @return [ComplexType]
140
- def typify api_map
141
- return_type.qualify(api_map, namespace)
142
- end
143
-
144
- # Infer the pin's return type via static code analysis.
145
- #
146
- # @param api_map [ApiMap]
147
- # @return [ComplexType]
148
- def probe api_map
149
- typify api_map
150
- end
151
-
152
- # @deprecated Use #typify and/or #probe instead
153
- # @param api_map [ApiMap]
154
- # @return [ComplexType]
155
- def infer api_map
156
- Solargraph::Logging.logger.warn "WARNING: Pin #infer methods are deprecated. Use #typify or #probe instead."
157
- type = typify(api_map)
158
- return type unless type.undefined?
159
- probe api_map
160
- end
161
-
162
- # Try to merge data from another pin. Merges are only possible if the
163
- # pins are near matches (see the #nearly? method). The changes should
164
- # not have any side effects on the API surface.
165
- #
166
- # @param pin [Pin::Base] The pin to merge into this one
167
- # @return [Boolean] True if the pins were merged
168
- def try_merge! pin
169
- return false unless nearly?(pin)
170
- @location = pin.location
171
- @closure = pin.closure
172
- return true if comments == pin.comments
173
- @comments = pin.comments
174
- @docstring = pin.docstring
175
- @return_type = pin.return_type
176
- @documentation = nil
177
- @deprecated = nil
178
- reset_conversions
179
- true
180
- end
181
-
182
- def proxied?
183
- @proxied ||= false
184
- end
185
-
186
- def probed?
187
- @probed ||= false
188
- end
189
-
190
- # @param api_map [ApiMap]
191
- # @return [self]
192
- def realize api_map
193
- return self if return_type.defined?
194
- type = typify(api_map)
195
- return proxy(type) if type.defined?
196
- type = probe(api_map)
197
- return self if type.undefined?
198
- result = proxy(type)
199
- result.probed = true
200
- result
201
- end
202
-
203
- # Return a proxy for this pin with the specified return type. Other than
204
- # the return type and the #proxied? setting, the proxy should be a clone
205
- # of the original.
206
- #
207
- # @param return_type [ComplexType]
208
- # @return [self]
209
- def proxy return_type
210
- result = dup
211
- result.return_type = return_type
212
- result.proxied = true
213
- result
214
- end
215
-
216
- def identity
217
- @identity ||= "#{closure.context.namespace}|#{name}"
218
- end
219
-
220
- def inspect
221
- "#<#{self.class} `#{self.path}` at #{self.location.inspect}>"
222
- end
223
-
224
- protected
225
-
226
- # @return [Boolean]
227
- attr_writer :probed
228
-
229
- # @return [Boolean]
230
- attr_writer :proxied
231
-
232
- # @return [ComplexType]
233
- attr_writer :return_type
234
-
235
- private
236
-
237
- # @return [void]
238
- def parse_comments
239
- # HACK: Avoid a NoMethodError on nil with empty overload tags
240
- if comments.nil? || comments.empty? || comments.strip.end_with?('@overload')
241
- @docstring = nil
242
- @directives = []
243
- else
244
- # HACK: Pass a dummy code object to the parser for plugins that
245
- # expect it not to be nil
246
- parse = Solargraph::Source.parse_docstring(comments)
247
- @docstring = parse.to_docstring
248
- @directives = parse.directives
249
- end
250
- end
251
-
252
- # True if two docstrings have the same tags, regardless of any other
253
- # differences.
254
- #
255
- # @param d1 [YARD::Docstring]
256
- # @param d2 [YARD::Docstring]
257
- # @return [Boolean]
258
- def compare_docstring_tags d1, d2
259
- return false if d1.tags.length != d2.tags.length
260
- d1.tags.each_index do |i|
261
- return false unless compare_tags(d1.tags[i], d2.tags[i])
262
- end
263
- true
264
- end
265
-
266
- # @param dir1 [Array<YARD::Tags::Directive>]
267
- # @param dir2 [Array<YARD::Tags::Directive>]
268
- # @return [Boolean]
269
- def compare_directives dir1, dir2
270
- return false if dir1.length != dir2.length
271
- dir1.each_index do |i|
272
- return false unless compare_tags(dir1[i].tag, dir2[i].tag)
273
- end
274
- true
275
- end
276
-
277
- # @param tag1 [YARD::Tags::Tag]
278
- # @param tag2 [YARD::Tags::Tag]
279
- # @return [Boolean]
280
- def compare_tags tag1, tag2
281
- tag1.class == tag2.class &&
282
- tag1.tag_name == tag2.tag_name &&
283
- tag1.text == tag2.text &&
284
- tag1.name == tag2.name &&
285
- tag1.types == tag2.types
286
- end
287
-
288
- # @return [Array<YARD::Tags::Handlers::Directive>]
289
- def collect_macros
290
- return [] unless maybe_directives?
291
- parse = Solargraph::Source.parse_docstring(comments)
292
- parse.directives.select{ |d| d.tag.tag_name == 'macro' }
293
- end
294
- end
295
- end
296
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Pin
5
+ # The base class for map pins.
6
+ #
7
+ class Base
8
+ include Common
9
+ include Conversions
10
+ include Documenting
11
+
12
+ # @return [YARD::CodeObjects::Base]
13
+ attr_reader :code_object
14
+
15
+ # @return [Solargraph::Location]
16
+ attr_reader :location
17
+
18
+ # @return [Solargraph::Location]
19
+ attr_reader :type_location
20
+
21
+ # @return [String]
22
+ attr_reader :name
23
+
24
+ # @return [String]
25
+ attr_reader :path
26
+
27
+ # @return [::Symbol]
28
+ attr_accessor :source
29
+
30
+ # @param location [Solargraph::Location, nil]
31
+ # @param type_location [Solargraph::Location, nil]
32
+ # @param closure [Solargraph::Pin::Closure, nil]
33
+ # @param name [String]
34
+ # @param comments [String]
35
+ def initialize location: nil, type_location: nil, closure: nil, name: '', comments: ''
36
+ @location = location
37
+ @type_location = type_location
38
+ @closure = closure
39
+ @name = name
40
+ @comments = comments
41
+ end
42
+
43
+ # @return [String]
44
+ def comments
45
+ @comments ||= ''
46
+ end
47
+
48
+ # @param generics_to_resolve [Enumerable<String>]
49
+ # @param return_type_context [ComplexType, nil]
50
+ # @param context [ComplexType]
51
+ # @param resolved_generic_values [Hash{String => ComplexType}]
52
+ # @return [self]
53
+ def resolve_generics_from_context(generics_to_resolve, return_type_context = nil, resolved_generic_values: {})
54
+ proxy return_type.resolve_generics_from_context(generics_to_resolve,
55
+ return_type_context,
56
+ resolved_generic_values: resolved_generic_values)
57
+ end
58
+
59
+ # @yieldparam [ComplexType]
60
+ # @yieldreturn [ComplexType]
61
+ # @return [self]
62
+ def transform_types(&transform)
63
+ proxy return_type.transform(&transform)
64
+ end
65
+
66
+ # Determine the concrete type for each of the generic type
67
+ # parameters used in this method based on the parameters passed
68
+ # into the its class and return a new method pin.
69
+ #
70
+ # @param definitions [Pin::Namespace] The module/class which uses generic types
71
+ # @param context_type [ComplexType] The receiver type
72
+ # @return [self]
73
+ def resolve_generics definitions, context_type
74
+ transform_types { |t| t.resolve_generics(definitions, context_type) if t }
75
+ end
76
+
77
+ def all_rooted?
78
+ !return_type || return_type.all_rooted?
79
+ end
80
+
81
+ # @param generics_to_erase [::Array<String>]
82
+ # @return [self]
83
+ def erase_generics(generics_to_erase)
84
+ return self if generics_to_erase.empty?
85
+ transform_types { |t| t.erase_generics(generics_to_erase) }
86
+ end
87
+
88
+ # @return [String, nil]
89
+ def filename
90
+ return nil if location.nil?
91
+ location.filename
92
+ end
93
+
94
+ # @return [Integer]
95
+ def completion_item_kind
96
+ LanguageServer::CompletionItemKinds::KEYWORD
97
+ end
98
+
99
+ # @return [Integer, nil]
100
+ def symbol_kind
101
+ nil
102
+ end
103
+
104
+ def to_s
105
+ desc
106
+ end
107
+
108
+ # @return [Boolean]
109
+ def variable?
110
+ false
111
+ end
112
+
113
+ # @return [Location, nil]
114
+ def best_location
115
+ location || type_location
116
+ end
117
+
118
+ # True if the specified pin is a near match to this one. A near match
119
+ # indicates that the pins contain mostly the same data. Any differences
120
+ # between them should not have an impact on the API surface.
121
+ #
122
+ # @param other [Solargraph::Pin::Base, Object]
123
+ # @return [Boolean]
124
+ def nearly? other
125
+ self.class == other.class &&
126
+ name == other.name &&
127
+ (closure == other.closure || (closure && closure.nearly?(other.closure))) &&
128
+ (comments == other.comments ||
129
+ (((maybe_directives? == false && other.maybe_directives? == false) || compare_directives(directives, other.directives)) &&
130
+ compare_docstring_tags(docstring, other.docstring))
131
+ )
132
+ end
133
+
134
+ # Pin equality is determined using the #nearly? method and also
135
+ # requiring both pins to have the same location.
136
+ #
137
+ def == other
138
+ return false unless nearly? other
139
+ comments == other.comments && location == other.location
140
+ end
141
+
142
+ # The pin's return type.
143
+ #
144
+ # @return [ComplexType]
145
+ def return_type
146
+ @return_type ||= ComplexType::UNDEFINED
147
+ end
148
+
149
+ # @return [YARD::Docstring]
150
+ def docstring
151
+ parse_comments unless defined?(@docstring)
152
+ @docstring ||= Solargraph::Source.parse_docstring('').to_docstring
153
+ end
154
+
155
+ # @return [::Array<YARD::Tags::Directive>]
156
+ def directives
157
+ parse_comments unless defined?(@directives)
158
+ @directives
159
+ end
160
+
161
+ # @return [::Array<YARD::Tags::MacroDirective>]
162
+ def macros
163
+ @macros ||= collect_macros
164
+ end
165
+
166
+ # Perform a quick check to see if this pin possibly includes YARD
167
+ # directives. This method does not require parsing the comments.
168
+ #
169
+ # After the comments have been parsed, this method will return false if
170
+ # no directives were found, regardless of whether it previously appeared
171
+ # possible.
172
+ #
173
+ # @return [Boolean]
174
+ def maybe_directives?
175
+ return !@directives.empty? if defined?(@directives)
176
+ @maybe_directives ||= comments.include?('@!')
177
+ end
178
+
179
+ # @return [Boolean]
180
+ def deprecated?
181
+ @deprecated ||= docstring.has_tag?('deprecated')
182
+ end
183
+
184
+ # Get a fully qualified type from the pin's return type.
185
+ #
186
+ # The relative type is determined from YARD documentation (@return,
187
+ # @param, @type, etc.) and its namespaces are fully qualified using the
188
+ # provided ApiMap.
189
+ #
190
+ # @param api_map [ApiMap]
191
+ # @return [ComplexType]
192
+ def typify api_map
193
+ return_type.qualify(api_map, namespace)
194
+ end
195
+
196
+ # Infer the pin's return type via static code analysis.
197
+ #
198
+ # @param api_map [ApiMap]
199
+ # @return [ComplexType]
200
+ def probe api_map
201
+ typify api_map
202
+ end
203
+
204
+ # @deprecated Use #typify and/or #probe instead
205
+ # @param api_map [ApiMap]
206
+ # @return [ComplexType]
207
+ def infer api_map
208
+ Solargraph::Logging.logger.warn "WARNING: Pin #infer methods are deprecated. Use #typify or #probe instead."
209
+ type = typify(api_map)
210
+ return type unless type.undefined?
211
+ probe api_map
212
+ end
213
+
214
+ # Try to merge data from another pin. Merges are only possible if the
215
+ # pins are near matches (see the #nearly? method). The changes should
216
+ # not have any side effects on the API surface.
217
+ #
218
+ # @param pin [Pin::Base] The pin to merge into this one
219
+ # @return [Boolean] True if the pins were merged
220
+ def try_merge! pin
221
+ return false unless nearly?(pin)
222
+ @location = pin.location
223
+ @closure = pin.closure
224
+ return true if comments == pin.comments
225
+ @comments = pin.comments
226
+ @docstring = pin.docstring
227
+ @return_type = pin.return_type
228
+ @documentation = nil
229
+ @deprecated = nil
230
+ reset_conversions
231
+ true
232
+ end
233
+
234
+ def proxied?
235
+ @proxied ||= false
236
+ end
237
+
238
+ def probed?
239
+ @probed ||= false
240
+ end
241
+
242
+ # @param api_map [ApiMap]
243
+ # @return [self]
244
+ def realize api_map
245
+ return self if return_type.defined?
246
+ type = typify(api_map)
247
+ return proxy(type) if type.defined?
248
+ type = probe(api_map)
249
+ return self if type.undefined?
250
+ result = proxy(type)
251
+ result.probed = true
252
+ result
253
+ end
254
+
255
+ # Return a proxy for this pin with the specified return type. Other than
256
+ # the return type and the #proxied? setting, the proxy should be a clone
257
+ # of the original.
258
+ #
259
+ # @param return_type [ComplexType]
260
+ # @return [self]
261
+ def proxy return_type
262
+ result = dup
263
+ result.return_type = return_type
264
+ result.proxied = true
265
+ result
266
+ end
267
+
268
+ # @deprecated
269
+ # @return [String]
270
+ def identity
271
+ @identity ||= "#{closure&.path}|#{name}"
272
+ end
273
+
274
+ # @return [String, nil]
275
+ def to_rbs
276
+ return_type.to_rbs
277
+ end
278
+
279
+ # @return [String]
280
+ def type_desc
281
+ rbs = to_rbs
282
+ # RBS doesn't have a way to represent a Class<x> type
283
+ rbs = return_type.rooted_tags if return_type.name == 'Class'
284
+ if path
285
+ if rbs
286
+ path + ' ' + rbs
287
+ else
288
+ path
289
+ end
290
+ else
291
+ rbs
292
+ end
293
+ end
294
+
295
+ # @return [String]
296
+ def desc
297
+ closure_info = closure&.desc
298
+ binder_info = binder&.desc
299
+ "[#{type_desc}, closure=#{closure_info}, binder=#{binder}"
300
+ end
301
+
302
+ def inspect
303
+ "#<#{self.class} `#{self.desc}` at #{self.location.inspect}>"
304
+ end
305
+
306
+ protected
307
+
308
+ # @return [Boolean]
309
+ attr_writer :probed
310
+
311
+ # @return [Boolean]
312
+ attr_writer :proxied
313
+
314
+ # @return [ComplexType]
315
+ attr_writer :return_type
316
+
317
+ private
318
+
319
+ # @return [void]
320
+ def parse_comments
321
+ # HACK: Avoid a NoMethodError on nil with empty overload tags
322
+ if comments.nil? || comments.empty? || comments.strip.end_with?('@overload')
323
+ @docstring = nil
324
+ @directives = []
325
+ else
326
+ # HACK: Pass a dummy code object to the parser for plugins that
327
+ # expect it not to be nil
328
+ parse = Solargraph::Source.parse_docstring(comments)
329
+ @docstring = parse.to_docstring
330
+ @directives = parse.directives
331
+ end
332
+ end
333
+
334
+ # True if two docstrings have the same tags, regardless of any other
335
+ # differences.
336
+ #
337
+ # @param d1 [YARD::Docstring]
338
+ # @param d2 [YARD::Docstring]
339
+ # @return [Boolean]
340
+ def compare_docstring_tags d1, d2
341
+ return false if d1.tags.length != d2.tags.length
342
+ d1.tags.each_index do |i|
343
+ return false unless compare_tags(d1.tags[i], d2.tags[i])
344
+ end
345
+ true
346
+ end
347
+
348
+ # @param dir1 [::Array<YARD::Tags::Directive>]
349
+ # @param dir2 [::Array<YARD::Tags::Directive>]
350
+ # @return [Boolean]
351
+ def compare_directives dir1, dir2
352
+ return false if dir1.length != dir2.length
353
+ dir1.each_index do |i|
354
+ return false unless compare_tags(dir1[i].tag, dir2[i].tag)
355
+ end
356
+ true
357
+ end
358
+
359
+ # @param tag1 [YARD::Tags::Tag]
360
+ # @param tag2 [YARD::Tags::Tag]
361
+ # @return [Boolean]
362
+ def compare_tags tag1, tag2
363
+ tag1.class == tag2.class &&
364
+ tag1.tag_name == tag2.tag_name &&
365
+ tag1.text == tag2.text &&
366
+ tag1.name == tag2.name &&
367
+ tag1.types == tag2.types
368
+ end
369
+
370
+ # @return [::Array<YARD::Tags::Handlers::Directive>]
371
+ def collect_macros
372
+ return [] unless maybe_directives?
373
+ parse = Solargraph::Source.parse_docstring(comments)
374
+ parse.directives.select{ |d| d.tag.tag_name == 'macro' }
375
+ end
376
+ end
377
+ end
378
+ end