solargraph 0.44.2 → 0.46.0

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 (246) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rspec.yml +41 -0
  3. data/.gitignore +9 -9
  4. data/.rspec +2 -2
  5. data/.travis.yml +19 -19
  6. data/CHANGELOG.md +1115 -1088
  7. data/Gemfile +0 -0
  8. data/LICENSE +0 -0
  9. data/README.md +128 -120
  10. data/Rakefile +0 -0
  11. data/SPONSORS.md +18 -15
  12. data/bin/solargraph +0 -0
  13. data/lib/solargraph/api_map/bundler_methods.rb +22 -22
  14. data/lib/solargraph/api_map/cache.rb +70 -70
  15. data/lib/solargraph/api_map/source_to_yard.rb +81 -81
  16. data/lib/solargraph/api_map/store.rb +256 -256
  17. data/lib/solargraph/api_map.rb +686 -681
  18. data/lib/solargraph/bench.rb +27 -27
  19. data/lib/solargraph/compat.rb +37 -37
  20. data/lib/solargraph/complex_type/type_methods.rb +130 -130
  21. data/lib/solargraph/complex_type/unique_type.rb +75 -75
  22. data/lib/solargraph/complex_type.rb +221 -221
  23. data/lib/solargraph/convention/base.rb +33 -33
  24. data/lib/solargraph/convention/gemfile.rb +15 -15
  25. data/lib/solargraph/convention/gemspec.rb +22 -22
  26. data/lib/solargraph/convention/rspec.rb +30 -21
  27. data/lib/solargraph/convention.rb +47 -47
  28. data/lib/solargraph/converters/dd.rb +12 -12
  29. data/lib/solargraph/converters/dl.rb +12 -12
  30. data/lib/solargraph/converters/dt.rb +12 -12
  31. data/lib/solargraph/converters/misc.rb +1 -1
  32. data/lib/solargraph/diagnostics/base.rb +29 -29
  33. data/lib/solargraph/diagnostics/require_not_found.rb +53 -37
  34. data/lib/solargraph/diagnostics/rubocop.rb +98 -98
  35. data/lib/solargraph/diagnostics/rubocop_helpers.rb +63 -63
  36. data/lib/solargraph/diagnostics/severities.rb +15 -15
  37. data/lib/solargraph/diagnostics/type_check.rb +54 -54
  38. data/lib/solargraph/diagnostics/update_errors.rb +41 -41
  39. data/lib/solargraph/diagnostics.rb +55 -55
  40. data/lib/solargraph/documentor.rb +76 -76
  41. data/lib/solargraph/environ.rb +45 -45
  42. data/lib/solargraph/language_server/completion_item_kinds.rb +35 -35
  43. data/lib/solargraph/language_server/error_codes.rb +20 -20
  44. data/lib/solargraph/language_server/host/cataloger.rb +56 -56
  45. data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
  46. data/lib/solargraph/language_server/host/dispatch.rb +111 -111
  47. data/lib/solargraph/language_server/host/message_worker.rb +59 -59
  48. data/lib/solargraph/language_server/host/sources.rb +156 -156
  49. data/lib/solargraph/language_server/host.rb +865 -865
  50. data/lib/solargraph/language_server/message/base.rb +89 -89
  51. data/lib/solargraph/language_server/message/cancel_request.rb +13 -13
  52. data/lib/solargraph/language_server/message/client/register_capability.rb +15 -15
  53. data/lib/solargraph/language_server/message/client.rb +11 -11
  54. data/lib/solargraph/language_server/message/completion_item/resolve.rb +58 -58
  55. data/lib/solargraph/language_server/message/completion_item.rb +11 -11
  56. data/lib/solargraph/language_server/message/exit_notification.rb +13 -13
  57. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +100 -100
  58. data/lib/solargraph/language_server/message/extended/document.rb +20 -20
  59. data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -32
  60. data/lib/solargraph/language_server/message/extended/download_core.rb +23 -23
  61. data/lib/solargraph/language_server/message/extended/environment.rb +25 -25
  62. data/lib/solargraph/language_server/message/extended/search.rb +20 -20
  63. data/lib/solargraph/language_server/message/extended.rb +21 -21
  64. data/lib/solargraph/language_server/message/initialize.rb +162 -162
  65. data/lib/solargraph/language_server/message/initialized.rb +27 -27
  66. data/lib/solargraph/language_server/message/method_not_found.rb +16 -16
  67. data/lib/solargraph/language_server/message/method_not_implemented.rb +14 -14
  68. data/lib/solargraph/language_server/message/shutdown.rb +13 -13
  69. data/lib/solargraph/language_server/message/text_document/base.rb +19 -19
  70. data/lib/solargraph/language_server/message/text_document/code_action.rb +17 -17
  71. data/lib/solargraph/language_server/message/text_document/completion.rb +59 -59
  72. data/lib/solargraph/language_server/message/text_document/definition.rb +38 -38
  73. data/lib/solargraph/language_server/message/text_document/did_change.rb +15 -15
  74. data/lib/solargraph/language_server/message/text_document/did_close.rb +15 -15
  75. data/lib/solargraph/language_server/message/text_document/did_open.rb +15 -15
  76. data/lib/solargraph/language_server/message/text_document/did_save.rb +17 -17
  77. data/lib/solargraph/language_server/message/text_document/document_highlight.rb +16 -16
  78. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +23 -23
  79. data/lib/solargraph/language_server/message/text_document/folding_range.rb +26 -26
  80. data/lib/solargraph/language_server/message/text_document/formatting.rb +126 -126
  81. data/lib/solargraph/language_server/message/text_document/hover.rb +54 -44
  82. data/lib/solargraph/language_server/message/text_document/on_type_formatting.rb +34 -34
  83. data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +11 -11
  84. data/lib/solargraph/language_server/message/text_document/references.rb +16 -16
  85. data/lib/solargraph/language_server/message/text_document/rename.rb +19 -19
  86. data/lib/solargraph/language_server/message/text_document/signature_help.rb +29 -29
  87. data/lib/solargraph/language_server/message/text_document.rb +28 -28
  88. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +30 -30
  89. data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +33 -33
  90. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +24 -24
  91. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +23 -23
  92. data/lib/solargraph/language_server/message/workspace.rb +14 -14
  93. data/lib/solargraph/language_server/message.rb +93 -93
  94. data/lib/solargraph/language_server/message_types.rb +14 -14
  95. data/lib/solargraph/language_server/request.rb +24 -24
  96. data/lib/solargraph/language_server/symbol_kinds.rb +36 -36
  97. data/lib/solargraph/language_server/transport/adapter.rb +53 -53
  98. data/lib/solargraph/language_server/transport/data_reader.rb +72 -72
  99. data/lib/solargraph/language_server/transport.rb +13 -13
  100. data/lib/solargraph/language_server/uri_helpers.rb +49 -49
  101. data/lib/solargraph/language_server.rb +19 -19
  102. data/lib/solargraph/library.rb +546 -546
  103. data/lib/solargraph/location.rb +37 -37
  104. data/lib/solargraph/logging.rb +27 -27
  105. data/lib/solargraph/page.rb +83 -83
  106. data/lib/solargraph/parser/comment_ripper.rb +52 -52
  107. data/lib/solargraph/parser/legacy/class_methods.rb +135 -140
  108. data/lib/solargraph/parser/legacy/flawed_builder.rb +16 -16
  109. data/lib/solargraph/parser/legacy/node_chainer.rb +148 -148
  110. data/lib/solargraph/parser/legacy/node_methods.rb +325 -325
  111. data/lib/solargraph/parser/legacy/node_processors/alias_node.rb +23 -23
  112. data/lib/solargraph/parser/legacy/node_processors/args_node.rb +35 -35
  113. data/lib/solargraph/parser/legacy/node_processors/begin_node.rb +15 -15
  114. data/lib/solargraph/parser/legacy/node_processors/block_node.rb +42 -42
  115. data/lib/solargraph/parser/legacy/node_processors/casgn_node.rb +25 -25
  116. data/lib/solargraph/parser/legacy/node_processors/cvasgn_node.rb +23 -23
  117. data/lib/solargraph/parser/legacy/node_processors/def_node.rb +63 -63
  118. data/lib/solargraph/parser/legacy/node_processors/defs_node.rb +36 -36
  119. data/lib/solargraph/parser/legacy/node_processors/gvasgn_node.rb +23 -23
  120. data/lib/solargraph/parser/legacy/node_processors/ivasgn_node.rb +38 -38
  121. data/lib/solargraph/parser/legacy/node_processors/lvasgn_node.rb +28 -28
  122. data/lib/solargraph/parser/legacy/node_processors/namespace_node.rb +39 -39
  123. data/lib/solargraph/parser/legacy/node_processors/orasgn_node.rb +16 -16
  124. data/lib/solargraph/parser/legacy/node_processors/resbody_node.rb +36 -36
  125. data/lib/solargraph/parser/legacy/node_processors/sclass_node.rb +21 -21
  126. data/lib/solargraph/parser/legacy/node_processors/send_node.rb +257 -257
  127. data/lib/solargraph/parser/legacy/node_processors/sym_node.rb +18 -18
  128. data/lib/solargraph/parser/legacy/node_processors.rb +54 -54
  129. data/lib/solargraph/parser/legacy.rb +12 -12
  130. data/lib/solargraph/parser/node_methods.rb +43 -43
  131. data/lib/solargraph/parser/node_processor/base.rb +77 -77
  132. data/lib/solargraph/parser/node_processor.rb +43 -43
  133. data/lib/solargraph/parser/region.rb +66 -66
  134. data/lib/solargraph/parser/rubyvm/class_methods.rb +144 -155
  135. data/lib/solargraph/parser/rubyvm/node_chainer.rb +160 -160
  136. data/lib/solargraph/parser/rubyvm/node_methods.rb +315 -315
  137. data/lib/solargraph/parser/rubyvm/node_processors/alias_node.rb +23 -23
  138. data/lib/solargraph/parser/rubyvm/node_processors/args_node.rb +85 -85
  139. data/lib/solargraph/parser/rubyvm/node_processors/begin_node.rb +15 -15
  140. data/lib/solargraph/parser/rubyvm/node_processors/block_node.rb +42 -42
  141. data/lib/solargraph/parser/rubyvm/node_processors/casgn_node.rb +22 -22
  142. data/lib/solargraph/parser/rubyvm/node_processors/cvasgn_node.rb +23 -23
  143. data/lib/solargraph/parser/rubyvm/node_processors/def_node.rb +63 -64
  144. data/lib/solargraph/parser/rubyvm/node_processors/defs_node.rb +57 -57
  145. data/lib/solargraph/parser/rubyvm/node_processors/gvasgn_node.rb +23 -23
  146. data/lib/solargraph/parser/rubyvm/node_processors/ivasgn_node.rb +38 -38
  147. data/lib/solargraph/parser/rubyvm/node_processors/kw_arg_node.rb +39 -39
  148. data/lib/solargraph/parser/rubyvm/node_processors/lit_node.rb +20 -20
  149. data/lib/solargraph/parser/rubyvm/node_processors/lvasgn_node.rb +27 -27
  150. data/lib/solargraph/parser/rubyvm/node_processors/namespace_node.rb +39 -39
  151. data/lib/solargraph/parser/rubyvm/node_processors/opt_arg_node.rb +26 -26
  152. data/lib/solargraph/parser/rubyvm/node_processors/orasgn_node.rb +15 -15
  153. data/lib/solargraph/parser/rubyvm/node_processors/resbody_node.rb +45 -45
  154. data/lib/solargraph/parser/rubyvm/node_processors/sclass_node.rb +21 -21
  155. data/lib/solargraph/parser/rubyvm/node_processors/scope_node.rb +15 -15
  156. data/lib/solargraph/parser/rubyvm/node_processors/send_node.rb +277 -277
  157. data/lib/solargraph/parser/rubyvm/node_processors/sym_node.rb +18 -18
  158. data/lib/solargraph/parser/rubyvm/node_processors.rb +63 -62
  159. data/lib/solargraph/parser/rubyvm.rb +40 -40
  160. data/lib/solargraph/parser/snippet.rb +13 -13
  161. data/lib/solargraph/parser.rb +26 -26
  162. data/lib/solargraph/pin/base.rb +296 -296
  163. data/lib/solargraph/pin/base_variable.rb +84 -84
  164. data/lib/solargraph/pin/block.rb +72 -72
  165. data/lib/solargraph/pin/class_variable.rb +8 -8
  166. data/lib/solargraph/pin/closure.rb +37 -37
  167. data/lib/solargraph/pin/common.rb +70 -70
  168. data/lib/solargraph/pin/constant.rb +43 -43
  169. data/lib/solargraph/pin/conversions.rb +96 -96
  170. data/lib/solargraph/pin/documenting.rb +105 -105
  171. data/lib/solargraph/pin/duck_method.rb +16 -16
  172. data/lib/solargraph/pin/global_variable.rb +8 -8
  173. data/lib/solargraph/pin/instance_variable.rb +30 -30
  174. data/lib/solargraph/pin/keyword.rb +15 -15
  175. data/lib/solargraph/pin/keyword_param.rb +8 -8
  176. data/lib/solargraph/pin/local_variable.rb +55 -55
  177. data/lib/solargraph/pin/method.rb +245 -245
  178. data/lib/solargraph/pin/method_alias.rb +31 -31
  179. data/lib/solargraph/pin/namespace.rb +91 -91
  180. data/lib/solargraph/pin/parameter.rb +201 -206
  181. data/lib/solargraph/pin/proxy_type.rb +29 -29
  182. data/lib/solargraph/pin/reference/extend.rb +10 -10
  183. data/lib/solargraph/pin/reference/include.rb +10 -10
  184. data/lib/solargraph/pin/reference/override.rb +29 -29
  185. data/lib/solargraph/pin/reference/prepend.rb +10 -10
  186. data/lib/solargraph/pin/reference/require.rb +14 -14
  187. data/lib/solargraph/pin/reference/superclass.rb +10 -10
  188. data/lib/solargraph/pin/reference.rb +14 -14
  189. data/lib/solargraph/pin/search.rb +56 -0
  190. data/lib/solargraph/pin/singleton.rb +11 -11
  191. data/lib/solargraph/pin/symbol.rb +47 -47
  192. data/lib/solargraph/pin.rb +37 -36
  193. data/lib/solargraph/position.rb +100 -100
  194. data/lib/solargraph/range.rb +95 -95
  195. data/lib/solargraph/server_methods.rb +16 -16
  196. data/lib/solargraph/shell.rb +226 -226
  197. data/lib/solargraph/source/chain/block_variable.rb +13 -13
  198. data/lib/solargraph/source/chain/call.rb +204 -204
  199. data/lib/solargraph/source/chain/class_variable.rb +13 -13
  200. data/lib/solargraph/source/chain/constant.rb +75 -75
  201. data/lib/solargraph/source/chain/global_variable.rb +13 -13
  202. data/lib/solargraph/source/chain/hash.rb +28 -28
  203. data/lib/solargraph/source/chain/head.rb +19 -19
  204. data/lib/solargraph/source/chain/instance_variable.rb +13 -13
  205. data/lib/solargraph/source/chain/link.rb +71 -71
  206. data/lib/solargraph/source/chain/literal.rb +23 -23
  207. data/lib/solargraph/source/chain/or.rb +23 -23
  208. data/lib/solargraph/source/chain/q_call.rb +11 -11
  209. data/lib/solargraph/source/chain/variable.rb +13 -13
  210. data/lib/solargraph/source/chain/z_super.rb +30 -30
  211. data/lib/solargraph/source/chain.rb +164 -164
  212. data/lib/solargraph/source/change.rb +79 -79
  213. data/lib/solargraph/source/cursor.rb +164 -164
  214. data/lib/solargraph/source/source_chainer.rb +191 -191
  215. data/lib/solargraph/source/updater.rb +54 -54
  216. data/lib/solargraph/source.rb +522 -522
  217. data/lib/solargraph/source_map/clip.rb +224 -224
  218. data/lib/solargraph/source_map/completion.rb +23 -23
  219. data/lib/solargraph/source_map/mapper.rb +212 -212
  220. data/lib/solargraph/source_map.rb +180 -189
  221. data/lib/solargraph/type_checker/checks.rb +99 -99
  222. data/lib/solargraph/type_checker/param_def.rb +35 -35
  223. data/lib/solargraph/type_checker/problem.rb +32 -32
  224. data/lib/solargraph/type_checker/rules.rb +57 -57
  225. data/lib/solargraph/type_checker.rb +543 -510
  226. data/lib/solargraph/version.rb +5 -5
  227. data/lib/solargraph/views/environment.erb +58 -58
  228. data/lib/solargraph/workspace/config.rb +231 -231
  229. data/lib/solargraph/workspace.rb +215 -214
  230. data/lib/solargraph/yard_map/cache.rb +19 -19
  231. data/lib/solargraph/yard_map/core_docs.rb +170 -170
  232. data/lib/solargraph/yard_map/core_fills.rb +208 -203
  233. data/lib/solargraph/yard_map/core_gen.rb +76 -76
  234. data/lib/solargraph/yard_map/helpers.rb +16 -16
  235. data/lib/solargraph/yard_map/mapper/to_constant.rb +25 -25
  236. data/lib/solargraph/yard_map/mapper/to_method.rb +78 -78
  237. data/lib/solargraph/yard_map/mapper/to_namespace.rb +27 -27
  238. data/lib/solargraph/yard_map/mapper.rb +77 -77
  239. data/lib/solargraph/yard_map/rdoc_to_yard.rb +140 -140
  240. data/lib/solargraph/yard_map/stdlib_fills.rb +43 -43
  241. data/lib/solargraph/yard_map/to_method.rb +79 -79
  242. data/lib/solargraph/yard_map.rb +460 -443
  243. data/lib/solargraph.rb +69 -69
  244. data/lib/yard-solargraph.rb +33 -33
  245. data/solargraph.gemspec +0 -0
  246. metadata +14 -12
@@ -1,296 +1,296 @@
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 [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