solargraph 0.57.0 → 0.58.3

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