solargraph 0.58.0 → 0.59.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 (219) hide show
  1. checksums.yaml +4 -4
  2. data/.envrc +3 -0
  3. data/.gitattributes +2 -0
  4. data/.github/workflows/linting.yml +6 -5
  5. data/.github/workflows/plugins.yml +48 -35
  6. data/.github/workflows/rspec.yml +15 -28
  7. data/.github/workflows/typecheck.yml +3 -2
  8. data/.gitignore +1 -0
  9. data/.rubocop.yml +38 -6
  10. data/.rubocop_todo.yml +53 -966
  11. data/CHANGELOG.md +24 -0
  12. data/Gemfile +3 -1
  13. data/README.md +3 -3
  14. data/Rakefile +26 -23
  15. data/bin/solargraph +9 -8
  16. data/lib/solargraph/api_map/cache.rb +110 -110
  17. data/lib/solargraph/api_map/constants.rb +288 -279
  18. data/lib/solargraph/api_map/index.rb +204 -193
  19. data/lib/solargraph/api_map/source_to_yard.rb +110 -97
  20. data/lib/solargraph/api_map/store.rb +395 -384
  21. data/lib/solargraph/api_map.rb +1029 -945
  22. data/lib/solargraph/bench.rb +44 -45
  23. data/lib/solargraph/complex_type/conformance.rb +176 -0
  24. data/lib/solargraph/complex_type/type_methods.rb +240 -228
  25. data/lib/solargraph/complex_type/unique_type.rb +641 -482
  26. data/lib/solargraph/complex_type.rb +557 -444
  27. data/lib/solargraph/convention/data_definition/data_assignment_node.rb +61 -61
  28. data/lib/solargraph/convention/data_definition/data_definition_node.rb +93 -91
  29. data/lib/solargraph/convention/data_definition.rb +108 -105
  30. data/lib/solargraph/convention/gemfile.rb +15 -15
  31. data/lib/solargraph/convention/gemspec.rb +23 -23
  32. data/lib/solargraph/convention/rakefile.rb +17 -17
  33. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +62 -61
  34. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +103 -102
  35. data/lib/solargraph/convention/struct_definition.rb +168 -164
  36. data/lib/solargraph/convention.rb +78 -78
  37. data/lib/solargraph/converters/dd.rb +19 -17
  38. data/lib/solargraph/converters/dl.rb +17 -15
  39. data/lib/solargraph/converters/dt.rb +17 -15
  40. data/lib/solargraph/converters/misc.rb +3 -1
  41. data/lib/solargraph/diagnostics/require_not_found.rb +54 -53
  42. data/lib/solargraph/diagnostics/rubocop.rb +119 -118
  43. data/lib/solargraph/diagnostics/rubocop_helpers.rb +70 -68
  44. data/lib/solargraph/diagnostics/type_check.rb +56 -55
  45. data/lib/solargraph/diagnostics/update_errors.rb +37 -41
  46. data/lib/solargraph/doc_map.rb +438 -439
  47. data/lib/solargraph/equality.rb +34 -34
  48. data/lib/solargraph/gem_pins.rb +98 -98
  49. data/lib/solargraph/language_server/error_codes.rb +20 -20
  50. data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
  51. data/lib/solargraph/language_server/host/dispatch.rb +130 -130
  52. data/lib/solargraph/language_server/host/message_worker.rb +113 -112
  53. data/lib/solargraph/language_server/host/sources.rb +100 -99
  54. data/lib/solargraph/language_server/host.rb +886 -878
  55. data/lib/solargraph/language_server/message/base.rb +97 -97
  56. data/lib/solargraph/language_server/message/client/register_capability.rb +13 -15
  57. data/lib/solargraph/language_server/message/completion_item/resolve.rb +58 -60
  58. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +108 -114
  59. data/lib/solargraph/language_server/message/extended/document.rb +24 -23
  60. data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -32
  61. data/lib/solargraph/language_server/message/extended/download_core.rb +20 -19
  62. data/lib/solargraph/language_server/message/extended/search.rb +20 -20
  63. data/lib/solargraph/language_server/message/initialize.rb +197 -191
  64. data/lib/solargraph/language_server/message/text_document/completion.rb +58 -56
  65. data/lib/solargraph/language_server/message/text_document/definition.rb +49 -40
  66. data/lib/solargraph/language_server/message/text_document/document_highlight.rb +23 -16
  67. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +36 -26
  68. data/lib/solargraph/language_server/message/text_document/formatting.rb +150 -148
  69. data/lib/solargraph/language_server/message/text_document/hover.rb +58 -58
  70. data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +18 -11
  71. data/lib/solargraph/language_server/message/text_document/references.rb +23 -16
  72. data/lib/solargraph/language_server/message/text_document/rename.rb +26 -19
  73. data/lib/solargraph/language_server/message/text_document/signature_help.rb +25 -24
  74. data/lib/solargraph/language_server/message/text_document/type_definition.rb +33 -25
  75. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +41 -35
  76. data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +48 -40
  77. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +32 -26
  78. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +33 -23
  79. data/lib/solargraph/language_server/message.rb +94 -94
  80. data/lib/solargraph/language_server/request.rb +29 -27
  81. data/lib/solargraph/language_server/transport/data_reader.rb +72 -74
  82. data/lib/solargraph/language_server/uri_helpers.rb +49 -49
  83. data/lib/solargraph/library.rb +702 -683
  84. data/lib/solargraph/location.rb +85 -82
  85. data/lib/solargraph/logging.rb +55 -37
  86. data/lib/solargraph/page.rb +92 -92
  87. data/lib/solargraph/parser/comment_ripper.rb +84 -69
  88. data/lib/solargraph/parser/flow_sensitive_typing.rb +471 -255
  89. data/lib/solargraph/parser/node_processor/base.rb +122 -92
  90. data/lib/solargraph/parser/node_processor.rb +63 -62
  91. data/lib/solargraph/parser/parser_gem/class_methods.rb +165 -149
  92. data/lib/solargraph/parser/parser_gem/flawed_builder.rb +19 -19
  93. data/lib/solargraph/parser/parser_gem/node_chainer.rb +191 -166
  94. data/lib/solargraph/parser/parser_gem/node_methods.rb +507 -486
  95. data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +22 -22
  96. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +61 -59
  97. data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +24 -15
  98. data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +45 -46
  99. data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +60 -53
  100. data/lib/solargraph/parser/parser_gem/node_processors/defs_node.rb +38 -37
  101. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +53 -23
  102. data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +42 -40
  103. data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +30 -29
  104. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +61 -59
  105. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +98 -98
  106. data/lib/solargraph/parser/parser_gem/node_processors/or_node.rb +22 -0
  107. data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +17 -17
  108. data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +39 -38
  109. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +51 -52
  110. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +302 -291
  111. data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +29 -29
  112. data/lib/solargraph/parser/parser_gem/node_processors/when_node.rb +23 -0
  113. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +33 -29
  114. data/lib/solargraph/parser/parser_gem/node_processors.rb +74 -70
  115. data/lib/solargraph/parser/parser_gem.rb +14 -12
  116. data/lib/solargraph/parser/region.rb +75 -69
  117. data/lib/solargraph/parser/snippet.rb +19 -17
  118. data/lib/solargraph/parser.rb +25 -23
  119. data/lib/solargraph/pin/base.rb +773 -729
  120. data/lib/solargraph/pin/base_variable.rb +375 -126
  121. data/lib/solargraph/pin/block.rb +127 -104
  122. data/lib/solargraph/pin/breakable.rb +15 -9
  123. data/lib/solargraph/pin/callable.rb +275 -231
  124. data/lib/solargraph/pin/closure.rb +69 -72
  125. data/lib/solargraph/pin/common.rb +97 -79
  126. data/lib/solargraph/pin/compound_statement.rb +55 -0
  127. data/lib/solargraph/pin/constant.rb +43 -45
  128. data/lib/solargraph/pin/conversions.rb +129 -123
  129. data/lib/solargraph/pin/delegated_method.rb +131 -120
  130. data/lib/solargraph/pin/documenting.rb +116 -114
  131. data/lib/solargraph/pin/instance_variable.rb +38 -34
  132. data/lib/solargraph/pin/keyword.rb +16 -20
  133. data/lib/solargraph/pin/local_variable.rb +31 -75
  134. data/lib/solargraph/pin/method.rb +724 -672
  135. data/lib/solargraph/pin/method_alias.rb +42 -34
  136. data/lib/solargraph/pin/namespace.rb +122 -115
  137. data/lib/solargraph/pin/parameter.rb +339 -275
  138. data/lib/solargraph/pin/proxy_type.rb +42 -39
  139. data/lib/solargraph/pin/reference/override.rb +47 -47
  140. data/lib/solargraph/pin/reference/superclass.rb +17 -15
  141. data/lib/solargraph/pin/reference/type_alias.rb +16 -0
  142. data/lib/solargraph/pin/reference.rb +59 -39
  143. data/lib/solargraph/pin/search.rb +62 -61
  144. data/lib/solargraph/pin/signature.rb +64 -61
  145. data/lib/solargraph/pin/symbol.rb +54 -53
  146. data/lib/solargraph/pin/until.rb +16 -18
  147. data/lib/solargraph/pin/while.rb +16 -18
  148. data/lib/solargraph/pin.rb +46 -44
  149. data/lib/solargraph/pin_cache.rb +248 -245
  150. data/lib/solargraph/position.rb +139 -119
  151. data/lib/solargraph/range.rb +113 -112
  152. data/lib/solargraph/rbs_map/conversions.rb +952 -823
  153. data/lib/solargraph/rbs_map/core_fills.rb +91 -84
  154. data/lib/solargraph/rbs_map/core_map.rb +65 -58
  155. data/lib/solargraph/rbs_map/stdlib_map.rb +71 -43
  156. data/lib/solargraph/rbs_map.rb +207 -163
  157. data/lib/solargraph/server_methods.rb +16 -16
  158. data/lib/solargraph/shell.rb +555 -352
  159. data/lib/solargraph/source/chain/array.rb +39 -37
  160. data/lib/solargraph/source/chain/call.rb +377 -337
  161. data/lib/solargraph/source/chain/class_variable.rb +13 -13
  162. data/lib/solargraph/source/chain/constant.rb +30 -26
  163. data/lib/solargraph/source/chain/global_variable.rb +13 -13
  164. data/lib/solargraph/source/chain/hash.rb +37 -34
  165. data/lib/solargraph/source/chain/if.rb +30 -28
  166. data/lib/solargraph/source/chain/instance_variable.rb +36 -13
  167. data/lib/solargraph/source/chain/link.rb +99 -109
  168. data/lib/solargraph/source/chain/literal.rb +51 -48
  169. data/lib/solargraph/source/chain/or.rb +29 -23
  170. data/lib/solargraph/source/chain/q_call.rb +13 -11
  171. data/lib/solargraph/source/chain/variable.rb +15 -13
  172. data/lib/solargraph/source/chain/z_super.rb +28 -30
  173. data/lib/solargraph/source/chain.rb +304 -291
  174. data/lib/solargraph/source/change.rb +89 -82
  175. data/lib/solargraph/source/cursor.rb +172 -166
  176. data/lib/solargraph/source/encoding_fixes.rb +22 -23
  177. data/lib/solargraph/source/source_chainer.rb +218 -194
  178. data/lib/solargraph/source/updater.rb +59 -55
  179. data/lib/solargraph/source.rb +522 -498
  180. data/lib/solargraph/source_map/clip.rb +245 -226
  181. data/lib/solargraph/source_map/data.rb +37 -34
  182. data/lib/solargraph/source_map/mapper.rb +286 -259
  183. data/lib/solargraph/source_map.rb +224 -212
  184. data/lib/solargraph/type_checker/problem.rb +34 -32
  185. data/lib/solargraph/type_checker/rules.rb +157 -84
  186. data/lib/solargraph/type_checker.rb +888 -814
  187. data/lib/solargraph/version.rb +5 -5
  188. data/lib/solargraph/workspace/config.rb +258 -255
  189. data/lib/solargraph/workspace/gemspecs.rb +367 -0
  190. data/lib/solargraph/workspace/require_paths.rb +98 -97
  191. data/lib/solargraph/workspace.rb +242 -220
  192. data/lib/solargraph/yard_map/helpers.rb +49 -44
  193. data/lib/solargraph/yard_map/mapper/to_method.rb +136 -130
  194. data/lib/solargraph/yard_map/mapper/to_namespace.rb +32 -31
  195. data/lib/solargraph/yard_map/mapper.rb +84 -79
  196. data/lib/solargraph/yard_map.rb +17 -18
  197. data/lib/solargraph/yard_tags.rb +20 -20
  198. data/lib/solargraph/yardoc.rb +90 -87
  199. data/lib/solargraph.rb +128 -105
  200. data/rbs/fills/rubygems/0/dependency.rbs +193 -0
  201. data/rbs/fills/tuple/tuple.rbs +28 -0
  202. data/rbs/shims/ast/0/node.rbs +5 -0
  203. data/rbs/shims/diff-lcs/1.5/diff-lcs.rbs +11 -0
  204. data/rbs_collection.yaml +1 -1
  205. data/solargraph.gemspec +37 -35
  206. metadata +52 -51
  207. data/lib/solargraph/type_checker/checks.rb +0 -124
  208. data/lib/solargraph/type_checker/param_def.rb +0 -37
  209. data/lib/solargraph/yard_map/to_method.rb +0 -89
  210. data/sig/shims/ast/0/node.rbs +0 -5
  211. /data/{sig → rbs}/shims/ast/2.4/.rbs_meta.yaml +0 -0
  212. /data/{sig → rbs}/shims/ast/2.4/ast.rbs +0 -0
  213. /data/{sig → rbs}/shims/parser/3.2.0.1/builders/default.rbs +0 -0
  214. /data/{sig → rbs}/shims/parser/3.2.0.1/manifest.yaml +0 -0
  215. /data/{sig → rbs}/shims/parser/3.2.0.1/parser.rbs +0 -0
  216. /data/{sig → rbs}/shims/parser/3.2.0.1/polyfill.rbs +0 -0
  217. /data/{sig → rbs}/shims/thor/1.2.0.1/.rbs_meta.yaml +0 -0
  218. /data/{sig → rbs}/shims/thor/1.2.0.1/manifest.yaml +0 -0
  219. /data/{sig → rbs}/shims/thor/1.2.0.1/thor.rbs +0 -0
@@ -1,193 +1,204 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- class ApiMap
5
- class Index
6
- include Logging
7
-
8
- # @param pins [Array<Pin::Base>]
9
- def initialize pins = []
10
- catalog pins
11
- end
12
-
13
- # @return [Array<Pin::Base>]
14
- def pins
15
- @pins ||= []
16
- end
17
-
18
- # @return [Hash{String => Array<Pin::Namespace>}]
19
- def namespace_hash
20
- # @param h [String]
21
- # @param k [Array<Pin::Namespace>]
22
- @namespace_hash ||= Hash.new { |h, k| h[k] = [] }
23
- end
24
-
25
- # @return [Hash{String => Array<Pin::Base>}]
26
- def pin_class_hash
27
- # @param h [String]
28
- # @param k [Array<Pin::Base>]
29
- @pin_class_hash ||= Hash.new { |h, k| h[k] = [] }
30
- end
31
-
32
- # @return [Hash{String => Array<Pin::Base>}]
33
- def path_pin_hash
34
- # @param h [String]
35
- # @param k [Array<Pin::Base>]
36
- @path_pin_hash ||= Hash.new { |h, k| h[k] = [] }
37
- end
38
-
39
- # @generic T
40
- # @param klass [Class<generic<T>>]
41
- # @return [Set<generic<T>>]
42
- def pins_by_class klass
43
- # @type [Set<Solargraph::Pin::Base>]
44
- s = Set.new
45
- # @sg-ignore need to support destructured args in blocks
46
- @pin_select_cache[klass] ||= pin_class_hash.each_with_object(s) { |(key, o), n| n.merge(o) if key <= klass }
47
- end
48
-
49
- # @return [Hash{String => Array<String>}]
50
- def include_references
51
- # @param h [String]
52
- # @param k [Array<String>]
53
- @include_references ||= Hash.new { |h, k| h[k] = [] }
54
- end
55
-
56
- # @return [Hash{String => Array<Pin::Reference::Include>}]
57
- def include_reference_pins
58
- # @param h [String]
59
- # @param k [Array<Pin::Reference::Include>]
60
- @include_reference_pins ||= Hash.new { |h, k| h[k] = [] }
61
- end
62
-
63
- # @return [Hash{String => Array<String>}]
64
- def extend_references
65
- # @param h [String]
66
- # @param k [Array<String>]
67
- @extend_references ||= Hash.new { |h, k| h[k] = [] }
68
- end
69
-
70
- # @return [Hash{String => Array<String>}]
71
- def prepend_references
72
- # @param h [String]
73
- # @param k [Array<String>]
74
- @prepend_references ||= Hash.new { |h, k| h[k] = [] }
75
- end
76
-
77
- # @return [Hash{String => Array<String>}]
78
- def superclass_references
79
- # @param h [String]
80
- # @param k [Array<String>]
81
- @superclass_references ||= Hash.new { |h, k| h[k] = [] }
82
- end
83
-
84
- # @param pins [Enumerable<Pin::Base>]
85
- # @return [self]
86
- def merge pins
87
- deep_clone.catalog pins
88
- end
89
-
90
- protected
91
-
92
- attr_writer :pins, :pin_select_cache, :namespace_hash, :pin_class_hash, :path_pin_hash, :include_references,
93
- :extend_references, :prepend_references, :superclass_references
94
-
95
- # @return [self]
96
- def deep_clone
97
- Index.allocate.tap do |copy|
98
- copy.pin_select_cache = {}
99
- copy.pins = pins.clone
100
- %i[
101
- namespace_hash pin_class_hash path_pin_hash include_references extend_references prepend_references
102
- superclass_references
103
- ].each do |sym|
104
- copy.send("#{sym}=", send(sym).clone)
105
- copy.send(sym)&.transform_values!(&:clone)
106
- end
107
- end
108
- end
109
-
110
- # @param new_pins [Enumerable<Pin::Base>]
111
- #
112
- # @return [self]
113
- def catalog new_pins
114
- # @type [Hash{Class<generic<T>> => Set<generic<T>>}]
115
- @pin_select_cache = {}
116
- pins.concat new_pins
117
- set = new_pins.to_set
118
- # @param k [String]
119
- # @param v [Set<Pin::Base>]
120
- set.classify(&:class)
121
- .map { |k, v| pin_class_hash[k].concat v.to_a }
122
- # @param k [String]
123
- # @param v [Set<Pin::Namespace>]
124
- set.classify(&:namespace)
125
- .map { |k, v| namespace_hash[k].concat v.to_a }
126
- # @param k [String]
127
- # @param v [Set<Pin::Base>]
128
- set.classify(&:path)
129
- .map { |k, v| path_pin_hash[k].concat v.to_a }
130
- @namespaces = path_pin_hash.keys.compact.to_set
131
- map_references Pin::Reference::Include, include_references
132
- map_references Pin::Reference::Prepend, prepend_references
133
- map_references Pin::Reference::Extend, extend_references
134
- map_references Pin::Reference::Superclass, superclass_references
135
- map_overrides
136
- self
137
- end
138
-
139
- # @generic T
140
- # @param klass [Class<generic<T>>]
141
- # @param hash [Hash{String => generic<T>}]
142
- #
143
- # @return [void]
144
- def map_references klass, hash
145
- # @param pin [generic<T>]
146
- pins_by_class(klass).each do |pin|
147
- hash[pin.namespace].push pin
148
- end
149
- end
150
-
151
- # @return [void]
152
- def map_overrides
153
- # @param ovr [Pin::Reference::Override]
154
- pins_by_class(Pin::Reference::Override).each do |ovr|
155
- logger.debug { "ApiMap::Index#map_overrides: Looking at override #{ovr} for #{ovr.name}" }
156
- pins = path_pin_hash[ovr.name]
157
- logger.debug { "ApiMap::Index#map_overrides: pins for path=#{ovr.name}: #{pins}" }
158
- pins.each do |pin|
159
- new_pin = if pin.path.end_with?('#initialize')
160
- path_pin_hash[pin.path.sub(/#initialize/, '.new')].first
161
- end
162
- (ovr.tags.map(&:tag_name) + ovr.delete).uniq.each do |tag|
163
- pin.docstring.delete_tags tag
164
- new_pin.docstring.delete_tags tag if new_pin
165
- end
166
- ovr.tags.each do |tag|
167
- pin.docstring.add_tag(tag)
168
- redefine_return_type pin, tag
169
- if new_pin
170
- new_pin.docstring.add_tag(tag)
171
- redefine_return_type new_pin, tag
172
- end
173
- end
174
- end
175
- end
176
- end
177
-
178
- # @param pin [Pin::Method]
179
- # @param tag [YARD::Tags::Tag]
180
- # @return [void]
181
- def redefine_return_type pin, tag
182
- # @todo can this be made to not mutate existing pins and use
183
- # proxy() / proxy_with_signatures() instead?
184
- return unless pin && tag.tag_name == 'return'
185
- pin.instance_variable_set(:@return_type, ComplexType.try_parse(tag.type))
186
- pin.signatures.each do |sig|
187
- sig.instance_variable_set(:@return_type, ComplexType.try_parse(tag.type))
188
- end
189
- pin.reset_generated!
190
- end
191
- end
192
- end
193
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ class ApiMap
5
+ class Index
6
+ include Logging
7
+
8
+ # @param pins [Array<Pin::Base>]
9
+ def initialize pins = []
10
+ catalog pins
11
+ end
12
+
13
+ # @return [Array<Pin::Base>]
14
+ def pins
15
+ @pins ||= []
16
+ end
17
+
18
+ # @return [Hash{String => Array<Pin::Namespace>}]
19
+ def namespace_hash
20
+ # @param h [String]
21
+ # @param k [Array<Pin::Namespace>]
22
+ @namespace_hash ||= Hash.new { |h, k| h[k] = [] }
23
+ end
24
+
25
+ # @return [Hash{String => Array<Pin::Base>}]
26
+ def pin_class_hash
27
+ # @param h [String]
28
+ # @param k [Array<Pin::Base>]
29
+ @pin_class_hash ||= Hash.new { |h, k| h[k] = [] }
30
+ end
31
+
32
+ # @return [Hash{String => Array<Pin::Base>}]
33
+ def path_pin_hash
34
+ # @param h [String]
35
+ # @param k [Array<Pin::Base>]
36
+ @path_pin_hash ||= Hash.new { |h, k| h[k] = [] }
37
+ end
38
+
39
+ # @return [Hash{String => ComplexType}]
40
+ def alias_hash
41
+ @alias_hash ||= {}
42
+ end
43
+
44
+ # @generic T
45
+ # @param klass [Class<generic<T>>]
46
+ # @return [Set<generic<T>>]
47
+ def pins_by_class klass
48
+ # @type [Set<generic<T>>]
49
+ s = Set.new
50
+ # @sg-ignore need to support destructured args in blocks
51
+ @pin_select_cache[klass] ||= pin_class_hash.each_with_object(s) { |(key, o), n| n.merge(o) if key <= klass }
52
+ end
53
+
54
+ # @return [Hash{String => Array<Pin::Reference::Include>}]
55
+ def include_references
56
+ # @param h [String]
57
+ # @param k [Array<String>]
58
+ @include_references ||= Hash.new { |h, k| h[k] = [] }
59
+ end
60
+
61
+ # @return [Hash{String => Array<Pin::Reference::Include>}]
62
+ def include_reference_pins
63
+ # @param h [String]
64
+ # @param k [Array<Pin::Reference::Include>]
65
+ @include_reference_pins ||= Hash.new { |h, k| h[k] = [] }
66
+ end
67
+
68
+ # @return [Hash{String => Array<Pin::Reference::Extend>}]
69
+ def extend_references
70
+ # @param h [String]
71
+ # @param k [Array<String>]
72
+ @extend_references ||= Hash.new { |h, k| h[k] = [] }
73
+ end
74
+
75
+ # @return [Hash{String => Array<Pin::Reference::Prepend>}]
76
+ def prepend_references
77
+ # @param h [String]
78
+ # @param k [Array<String>]
79
+ @prepend_references ||= Hash.new { |h, k| h[k] = [] }
80
+ end
81
+
82
+ # @return [Hash{String => Array<Pin::Reference::Superclass>}]
83
+ def superclass_references
84
+ # @param h [String]
85
+ # @param k [Array<String>]
86
+ @superclass_references ||= Hash.new { |h, k| h[k] = [] }
87
+ end
88
+
89
+ # @param pins [Enumerable<Pin::Base>]
90
+ # @return [self]
91
+ def merge pins
92
+ deep_clone.catalog pins
93
+ end
94
+
95
+ protected
96
+
97
+ attr_writer :pins, :pin_select_cache, :namespace_hash, :pin_class_hash, :path_pin_hash, :include_references,
98
+ :extend_references, :prepend_references, :superclass_references
99
+
100
+ # @return [self]
101
+ def deep_clone
102
+ Index.allocate.tap do |copy|
103
+ copy.pin_select_cache = {}
104
+ copy.pins = pins.clone
105
+ %i[
106
+ namespace_hash pin_class_hash path_pin_hash include_references extend_references prepend_references
107
+ superclass_references
108
+ ].each do |sym|
109
+ copy.send("#{sym}=", send(sym).clone)
110
+ copy.send(sym)&.transform_values!(&:clone)
111
+ end
112
+ end
113
+ end
114
+
115
+ # @param new_pins [Enumerable<Pin::Base>]
116
+ #
117
+ # @return [self]
118
+ def catalog new_pins
119
+ # @type [Hash{Class<generic<T>> => Set<generic<T>>}]
120
+ @pin_select_cache = {}
121
+ pins.concat new_pins
122
+ set = new_pins.to_set
123
+ # @param k [String]
124
+ # @param v [Set<Pin::Base>]
125
+ set.classify(&:class)
126
+ .map { |k, v| pin_class_hash[k].concat v.to_a }
127
+ # @param k [String]
128
+ # @param v [Set<Pin::Namespace>]
129
+ set.classify(&:namespace)
130
+ .map { |k, v| namespace_hash[k].concat v.to_a }
131
+ # @param k [String]
132
+ # @param v [Set<Pin::Base>]
133
+ set.classify(&:path)
134
+ .map { |k, v| path_pin_hash[k].concat v.to_a }
135
+ @namespaces = path_pin_hash.keys.compact.to_set
136
+ map_references Pin::Reference::Include, include_references
137
+ map_references Pin::Reference::Prepend, prepend_references
138
+ map_references Pin::Reference::Extend, extend_references
139
+ map_references Pin::Reference::Superclass, superclass_references
140
+ map_overrides
141
+ pins_by_class(Pin::Reference::TypeAlias).each { |pin| alias_hash[pin.name] = pin.return_type }
142
+ self
143
+ end
144
+
145
+ # @generic T
146
+ # @param klass [Class<generic<T>>]
147
+ # @param hash [Hash{String => Array<generic<T>>}]
148
+ #
149
+ # @return [void]
150
+ def map_references klass, hash
151
+ # @param pin [generic<T>]
152
+ pins_by_class(klass).each do |pin|
153
+ hash[pin.namespace].push pin
154
+ end
155
+ end
156
+
157
+ # @return [void]
158
+ def map_overrides
159
+ # @todo should complain when type for 'ovr' is not provided
160
+ # @param ovr [Pin::Reference::Override]
161
+ pins_by_class(Pin::Reference::Override).each do |ovr|
162
+ logger.debug { "ApiMap::Index#map_overrides: Looking at override #{ovr} for #{ovr.name}" }
163
+ pins = path_pin_hash[ovr.name]
164
+ logger.debug { "ApiMap::Index#map_overrides: pins for path=#{ovr.name}: #{pins}" }
165
+ pins.each do |pin|
166
+ new_pin = (path_pin_hash[pin.path.sub('#initialize', '.new')].first if pin.path.end_with?('#initialize'))
167
+ (ovr.tags.map(&:tag_name) + ovr.delete).uniq.each do |tag|
168
+ # @sg-ignore Wrong argument type for
169
+ # YARD::Docstring#delete_tags: name expected String,
170
+ # received String, Symbol - delete_tags is ok with a
171
+ # _ToS, but we should fix anyway
172
+ pin.docstring.delete_tags tag
173
+ new_pin&.docstring&.delete_tags tag
174
+ end
175
+ ovr.tags.each do |tag|
176
+ pin.docstring.add_tag(tag)
177
+ redefine_return_type pin, tag
178
+ pin.reset_generated!
179
+
180
+ next unless new_pin
181
+
182
+ new_pin.docstring.add_tag(tag)
183
+ redefine_return_type new_pin, tag
184
+ new_pin.reset_generated!
185
+ end
186
+ end
187
+ end
188
+ end
189
+
190
+ # @param pin [Pin::Method]
191
+ # @param tag [YARD::Tags::Tag]
192
+ # @return [void]
193
+ def redefine_return_type pin, tag
194
+ # @todo can this be made to not mutate existing pins and use
195
+ # proxy() / proxy_with_signatures() instead?
196
+ return unless pin && tag.tag_name == 'return'
197
+ pin.instance_variable_set(:@return_type, ComplexType.try_parse(tag.type))
198
+ pin.signatures.each do |sig|
199
+ sig.instance_variable_set(:@return_type, ComplexType.try_parse(tag.type))
200
+ end
201
+ end
202
+ end
203
+ end
204
+ end
@@ -1,97 +1,110 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- class ApiMap
5
- module SourceToYard
6
-
7
- # Get the YARD CodeObject at the specified path.
8
- #
9
- # @generic T
10
- # @param path [String]
11
- # @param klass [Class<generic<T>>]
12
- # @return [generic<T>, nil]
13
- def code_object_at path, klass = YARD::CodeObjects::Base
14
- obj = code_object_map[path]
15
- obj if obj&.is_a?(klass)
16
- end
17
-
18
- # @return [Array<String>]
19
- def code_object_paths
20
- code_object_map.keys
21
- end
22
-
23
- # @param store [ApiMap::Store] ApiMap pin store
24
- # @return [void]
25
- def rake_yard store
26
- YARD::Registry.clear
27
- code_object_map.clear
28
- store.namespace_pins.each do |pin|
29
- next if pin.path.nil? || pin.path.empty?
30
- if pin.code_object
31
- code_object_map[pin.path] ||= pin.code_object
32
- next
33
- end
34
- if pin.type == :class
35
- # @param obj [YARD::CodeObjects::RootObject]
36
- code_object_map[pin.path] ||= YARD::CodeObjects::ClassObject.new(root_code_object, pin.path) { |obj|
37
- next if pin.location.nil? || pin.location.filename.nil?
38
- obj.add_file(pin.location.filename, pin.location.range.start.line, !pin.comments.empty?)
39
- }
40
- else
41
- # @param obj [YARD::CodeObjects::RootObject]
42
- code_object_map[pin.path] ||= YARD::CodeObjects::ModuleObject.new(root_code_object, pin.path) { |obj|
43
- next if pin.location.nil? || pin.location.filename.nil?
44
- obj.add_file(pin.location.filename, pin.location.range.start.line, !pin.comments.empty?)
45
- }
46
- end
47
- code_object_map[pin.path].docstring = pin.docstring
48
- store.get_includes(pin.path).each do |ref|
49
- include_object = code_object_at(pin.path, YARD::CodeObjects::ClassObject)
50
- unless include_object.nil? || include_object.nil?
51
- include_object.instance_mixins.push code_object_map[ref.type.to_s]
52
- end
53
- end
54
- store.get_extends(pin.path).each do |ref|
55
- extend_object = code_object_at(pin.path, YARD::CodeObjects::ClassObject)
56
- next unless extend_object
57
- code_object = code_object_map[ref.type.to_s]
58
- next unless code_object
59
- extend_object.class_mixins.push code_object
60
- # @todo add spec showing why this next line is necessary
61
- extend_object.instance_mixins.push code_object
62
- end
63
- end
64
- store.method_pins.each do |pin|
65
- if pin.code_object
66
- code_object_map[pin.path] ||= pin.code_object
67
- next
68
- end
69
-
70
- # @param obj [YARD::CodeObjects::RootObject]
71
- code_object_map[pin.path] ||= YARD::CodeObjects::MethodObject.new(code_object_at(pin.namespace, YARD::CodeObjects::NamespaceObject), pin.name, pin.scope) { |obj|
72
- next if pin.location.nil? || pin.location.filename.nil?
73
- obj.add_file pin.location.filename, pin.location.range.start.line
74
- }
75
- method_object = code_object_at(pin.path, YARD::CodeObjects::MethodObject)
76
- method_object.docstring = pin.docstring
77
- method_object.visibility = pin.visibility || :public
78
- method_object.parameters = pin.parameters.map do |p|
79
- [p.full_name, p.asgn_code]
80
- end
81
- end
82
- end
83
-
84
- private
85
-
86
- # @return [Hash{String => YARD::CodeObjects::Base}]
87
- def code_object_map
88
- @code_object_map ||= {}
89
- end
90
-
91
- # @return [YARD::CodeObjects::RootObject]
92
- def root_code_object
93
- @root_code_object ||= YARD::CodeObjects::RootObject.new(nil, 'root')
94
- end
95
- end
96
- end
97
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ class ApiMap
5
+ module SourceToYard
6
+ # Get the YARD CodeObject at the specified path.
7
+ #
8
+ # @sg-ignore Declared return type generic<T>, nil does not match
9
+ # inferred type ::YARD::CodeObjects::Base, nil for
10
+ # Solargraph::ApiMap::SourceToYard#code_object_at
11
+ # @generic T
12
+ # @param path [String]
13
+ # @param klass [Class<generic<T>>]
14
+ # @return [generic<T>, nil]
15
+ def code_object_at path, klass = YARD::CodeObjects::Base
16
+ obj = code_object_map[path]
17
+ obj if obj.is_a?(klass)
18
+ end
19
+
20
+ # @return [Array<String>]
21
+ def code_object_paths
22
+ code_object_map.keys
23
+ end
24
+
25
+ # @param store [ApiMap::Store] ApiMap pin store
26
+ # @return [void]
27
+ def rake_yard store
28
+ YARD::Registry.clear
29
+ code_object_map.clear
30
+ store.namespace_pins.each do |pin|
31
+ next if pin.path.nil? || pin.path.empty?
32
+ if pin.code_object
33
+ code_object_map[pin.path] ||= pin.code_object
34
+ next
35
+ end
36
+ if pin.type == :class
37
+ # @param obj [YARD::CodeObjects::RootObject]
38
+ code_object_map[pin.path] ||= YARD::CodeObjects::ClassObject.new(root_code_object, pin.path) do |obj|
39
+ # @sg-ignore flow sensitive typing needs to handle attrs
40
+ next if pin.location.nil? || pin.location.filename.nil?
41
+ # @sg-ignore flow sensitive typing needs to handle attrs
42
+ obj.add_file(pin.location.filename, pin.location.range.start.line, !pin.comments.empty?)
43
+ end
44
+ else
45
+ # @param obj [YARD::CodeObjects::RootObject]
46
+ code_object_map[pin.path] ||= YARD::CodeObjects::ModuleObject.new(root_code_object, pin.path) do |obj|
47
+ # @sg-ignore flow sensitive typing needs to handle attrs
48
+ next if pin.location.nil? || pin.location.filename.nil?
49
+ # @sg-ignore flow sensitive typing needs to handle attrs
50
+ obj.add_file(pin.location.filename, pin.location.range.start.line, !pin.comments.empty?)
51
+ end
52
+ end
53
+ code_object_map[pin.path].docstring = pin.docstring
54
+ store.get_includes(pin.path).each do |ref|
55
+ include_object = code_object_at(pin.path, YARD::CodeObjects::ClassObject)
56
+ unless include_object.nil? || include_object.nil?
57
+ include_object.instance_mixins.push code_object_map[ref.type.to_s]
58
+ end
59
+ end
60
+ store.get_extends(pin.path).each do |ref|
61
+ extend_object = code_object_at(pin.path, YARD::CodeObjects::ClassObject)
62
+ next unless extend_object
63
+ code_object = code_object_map[ref.type.to_s]
64
+ next unless code_object
65
+ extend_object.class_mixins.push code_object
66
+ extend_object.instance_mixins.push code_object
67
+ end
68
+ end
69
+ store.method_pins.each do |pin|
70
+ if pin.code_object
71
+ code_object_map[pin.path] ||= pin.code_object
72
+ next
73
+ end
74
+
75
+ # @sg-ignore Need to add nil check here
76
+ # @param obj [YARD::CodeObjects::RootObject]
77
+ code_object_map[pin.path] ||= YARD::CodeObjects::MethodObject.new(
78
+ code_object_at(pin.namespace, YARD::CodeObjects::NamespaceObject), pin.name, pin.scope
79
+ ) do |obj|
80
+ # @sg-ignore flow sensitive typing needs to handle attrs
81
+ next if pin.location.nil? || pin.location.filename.nil?
82
+ # @sg-ignore flow sensitive typing needs to handle attrs
83
+ obj.add_file pin.location.filename, pin.location.range.start.line
84
+ end
85
+ method_object = code_object_at(pin.path, YARD::CodeObjects::MethodObject)
86
+ # @sg-ignore Need to add nil check here
87
+ method_object.docstring = pin.docstring
88
+ # @sg-ignore Need to add nil check here
89
+ method_object.visibility = pin.visibility || :public
90
+ # @sg-ignore Need to add nil check here
91
+ method_object.parameters = pin.parameters.map do |p|
92
+ [p.full_name, p.asgn_code]
93
+ end
94
+ end
95
+ end
96
+
97
+ private
98
+
99
+ # @return [Hash{String => YARD::CodeObjects::Base}]
100
+ def code_object_map
101
+ @code_object_map ||= {}
102
+ end
103
+
104
+ # @return [YARD::CodeObjects::RootObject]
105
+ def root_code_object
106
+ @root_code_object ||= YARD::CodeObjects::RootObject.new(nil, 'root')
107
+ end
108
+ end
109
+ end
110
+ end