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,212 +1,224 @@
1
- # frozen_string_literal: true
2
-
3
- require 'yard'
4
- require 'solargraph/yard_tags'
5
-
6
- module Solargraph
7
- # An index of Pins and other ApiMap-related data for a single Source
8
- # that can be queried.
9
- #
10
- class SourceMap
11
- autoload :Mapper, 'solargraph/source_map/mapper'
12
- autoload :Clip, 'solargraph/source_map/clip'
13
- autoload :Completion, 'solargraph/source_map/completion'
14
- autoload :Data, 'solargraph/source_map/data'
15
-
16
- # @return [Source]
17
- attr_reader :source
18
-
19
- # @return [Array<Pin::Base>]
20
- def pins
21
- data.pins
22
- end
23
-
24
- # @return [Array<Pin::Base>]
25
- def all_pins
26
- pins + convention_pins
27
- end
28
-
29
- # @return [Array<Pin::LocalVariable>]
30
- def locals
31
- data.locals
32
- end
33
-
34
- # @param source [Source]
35
- def initialize source
36
- @source = source
37
-
38
- conventions_environ.merge Convention.for_local(self) unless filename.nil?
39
- # FIXME: unmemoizing the document_symbols in case it was called and memoized from any of conventions above
40
- # this is to ensure that the convention_pins from all conventions are used in the document_symbols.
41
- # solargraph-rails is known to use this method to get the document symbols. It should probably be removed.
42
- @document_symbols = nil
43
- self.convention_pins = conventions_environ.pins
44
- # @type [Hash{Class<Pin::Base> => Array<Pin::Base>}]
45
- @pin_select_cache = {}
46
- end
47
-
48
- # @generic T
49
- # @param klass [Class<generic<T>>]
50
- #
51
- # @return [Array<generic<T>>]
52
- def pins_by_class klass
53
- @pin_select_cache[klass] ||= pin_class_hash.select { |key, _| key <= klass }.values.flatten
54
- end
55
-
56
- # A hash representing the state of the source map's API.
57
- #
58
- # ApiMap#catalog uses this value to determine whether it needs to clear its
59
- # cache.
60
- #
61
- # @return [Integer]
62
- def api_hash
63
- @api_hash ||= (pins_by_class(Pin::Constant) + pins_by_class(Pin::Namespace).select { |pin| pin.namespace.to_s > '' } + pins_by_class(Pin::Reference) + pins_by_class(Pin::Method).map(&:node) + locals).hash
64
- end
65
-
66
- # @return [String]
67
- def filename
68
- source.filename
69
- end
70
-
71
- # @return [String]
72
- def code
73
- source.code
74
- end
75
-
76
- # @return [Array<Pin::Reference::Require>]
77
- def requires
78
- pins_by_class(Pin::Reference::Require)
79
- end
80
-
81
- # @return [Environ]
82
- def conventions_environ
83
- @conventions_environ ||= Environ.new
84
- end
85
-
86
- # all pins except Solargraph::Pin::Reference::Reference
87
- # @return [Array<Pin::Base>]
88
- def document_symbols
89
- @document_symbols ||= (pins + convention_pins).select do |pin|
90
- pin.path && !pin.path.empty?
91
- end
92
- end
93
-
94
- # @param query [String]
95
- # @return [Array<Pin::Base>]
96
- def query_symbols query
97
- Pin::Search.new(document_symbols, query).results
98
- end
99
-
100
- # @param position [Position]
101
- # @return [Source::Cursor]
102
- def cursor_at position
103
- Source::Cursor.new(source, position)
104
- end
105
-
106
- # @param path [String]
107
- # @return [Pin::Base]
108
- def first_pin path
109
- pins.select { |p| p.path == path }.first
110
- end
111
-
112
- # @param location [Solargraph::Location]
113
- # @return [Array<Solargraph::Pin::Base>]
114
- def locate_pins location
115
- # return nil unless location.start_with?("#{filename}:")
116
- (pins + locals).select { |pin| pin.location == location }
117
- end
118
-
119
- # @param line [Integer]
120
- # @param character [Integer]
121
- # @return [Pin::Method,Pin::Namespace]
122
- def locate_named_path_pin line, character
123
- _locate_pin line, character, Pin::Namespace, Pin::Method
124
- end
125
-
126
- # @param line [Integer]
127
- # @param character [Integer]
128
- # @return [Pin::Namespace,Pin::Method,Pin::Block]
129
- def locate_closure_pin line, character
130
- _locate_pin line, character, Pin::Closure
131
- end
132
-
133
- # @deprecated Please use locate_closure_pin instead
134
- alias locate_block_pin locate_closure_pin
135
-
136
- # @param name [String]
137
- # @return [Array<Location>]
138
- def references name
139
- source.references name
140
- end
141
-
142
- # @param location [Location]
143
- # @return [Array<Pin::LocalVariable>]
144
- def locals_at(location)
145
- return [] if location.filename != filename
146
- closure = locate_named_path_pin(location.range.start.line, location.range.start.character)
147
- locals.select { |pin| pin.visible_at?(closure, location) }
148
- end
149
-
150
- class << self
151
- # @param filename [String]
152
- # @return [SourceMap]
153
- def load filename
154
- source = Solargraph::Source.load(filename)
155
- SourceMap.map(source)
156
- end
157
-
158
- # @param code [String]
159
- # @param filename [String, nil]
160
- # @return [SourceMap]
161
- def load_string code, filename = nil
162
- source = Solargraph::Source.load_string(code, filename)
163
- SourceMap.map(source)
164
- end
165
-
166
- # @deprecated
167
- # @param source [Source]
168
- # @return [SourceMap]
169
- def map source
170
- new(source)
171
- end
172
- end
173
-
174
- private
175
-
176
- # @return [Array<Pin::Base>]
177
- attr_writer :convention_pins
178
-
179
- # @return [Hash{Class<Pin::Base> => Array<Pin::Base>}]
180
- def pin_class_hash
181
- @pin_class_hash ||= pins.to_set.classify(&:class).transform_values(&:to_a)
182
- end
183
-
184
- # @return [Data]
185
- def data
186
- @data ||= Data.new(source)
187
- end
188
-
189
- # @return [Array<Pin::Base>]
190
- def convention_pins
191
- @convention_pins || []
192
- end
193
-
194
- # @param line [Integer]
195
- # @param character [Integer]
196
- # @param klasses [Array<Class>]
197
- # @return [Pin::Base, nil]
198
- def _locate_pin line, character, *klasses
199
- position = Position.new(line, character)
200
- found = nil
201
- pins.each do |pin|
202
- # @todo Attribute pins should not be treated like closures, but
203
- # there's probably a better way to handle it
204
- next if pin.is_a?(Pin::Method) && pin.attribute?
205
- found = pin if (klasses.empty? || klasses.any? { |kls| pin.is_a?(kls) } ) && pin.location.range.contain?(position)
206
- break if pin.location.range.start.line > line
207
- end
208
- # Assuming the root pin is always valid
209
- found || pins.first
210
- end
211
- end
212
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'yard'
4
+ require 'solargraph/yard_tags'
5
+
6
+ module Solargraph
7
+ # An index of Pins and other ApiMap-related data for a single Source
8
+ # that can be queried.
9
+ #
10
+ class SourceMap
11
+ autoload :Mapper, 'solargraph/source_map/mapper'
12
+ autoload :Clip, 'solargraph/source_map/clip'
13
+ autoload :Completion, 'solargraph/source_map/completion'
14
+ autoload :Data, 'solargraph/source_map/data'
15
+
16
+ # @return [Source]
17
+ attr_reader :source
18
+
19
+ # @return [Array<Pin::Base>]
20
+ def pins
21
+ data.pins
22
+ end
23
+
24
+ # @return [Array<Pin::Base>]
25
+ def all_pins
26
+ pins + convention_pins
27
+ end
28
+
29
+ # @return [Array<Pin::LocalVariable>]
30
+ def locals
31
+ data.locals
32
+ end
33
+
34
+ # @param source [Source]
35
+ def initialize source
36
+ @source = source
37
+ # @type [Array<Pin::Base>, nil]
38
+ @convention_pins = nil
39
+
40
+ conventions_environ.merge Convention.for_local(self) unless filename.nil?
41
+ # FIXME: unmemoizing the document_symbols in case it was called and memoized from any of conventions above
42
+ # this is to ensure that the convention_pins from all conventions are used in the document_symbols.
43
+ # solargraph-rails is known to use this method to get the document symbols. It should probably be removed.
44
+ @document_symbols = nil
45
+ self.convention_pins = conventions_environ.pins
46
+ # @type [Hash{Class<Pin::Base> => Array<Pin::Base>}]
47
+ @pin_select_cache = {}
48
+ end
49
+
50
+ # @generic T
51
+ # @param klass [Class<generic<T>>]
52
+ #
53
+ # @return [Array<generic<T>>]
54
+ def pins_by_class klass
55
+ @pin_select_cache[klass] ||= pin_class_hash.select { |key, _| key <= klass }.values.flatten
56
+ end
57
+
58
+ # A hash representing the state of the source map's API.
59
+ #
60
+ # ApiMap#catalog uses this value to determine whether it needs to clear its
61
+ # cache.
62
+ #
63
+ # @return [Integer]
64
+ def api_hash
65
+ @api_hash ||= (pins_by_class(Pin::Constant) + pins_by_class(Pin::Namespace).select do |pin|
66
+ pin.namespace.to_s > ''
67
+ end + pins_by_class(Pin::Reference) + pins_by_class(Pin::Method).map(&:node) + locals).hash
68
+ end
69
+
70
+ # @return [String, nil]
71
+ def filename
72
+ source.filename
73
+ end
74
+
75
+ # @return [String]
76
+ def code
77
+ source.code
78
+ end
79
+
80
+ # @return [Array<Pin::Reference::Require>]
81
+ def requires
82
+ pins_by_class(Pin::Reference::Require)
83
+ end
84
+
85
+ # @return [Environ]
86
+ def conventions_environ
87
+ @conventions_environ ||= Environ.new
88
+ end
89
+
90
+ # all pins except Solargraph::Pin::Reference::Reference
91
+ #
92
+ # @return [Array<Pin::Base>]
93
+ def document_symbols
94
+ @document_symbols ||= (pins + convention_pins).select do |pin|
95
+ pin.path && !pin.path.empty?
96
+ end
97
+ end
98
+
99
+ # @param query [String]
100
+ # @return [Array<Pin::Base>]
101
+ def query_symbols query
102
+ Pin::Search.new(document_symbols, query).results
103
+ end
104
+
105
+ # @param position [Position, Array(Integer, Integer)]
106
+ # @return [Source::Cursor]
107
+ def cursor_at position
108
+ Source::Cursor.new(source, position)
109
+ end
110
+
111
+ # @param path [String]
112
+ # @return [Pin::Base]
113
+ def first_pin path
114
+ pins.select { |p| p.path == path }.first
115
+ end
116
+
117
+ # @param location [Solargraph::Location]
118
+ # @return [Array<Solargraph::Pin::Base>]
119
+ def locate_pins location
120
+ # return nil unless location.start_with?("#{filename}:")
121
+ (pins + locals).select { |pin| pin.location == location }
122
+ end
123
+
124
+ # @param line [Integer]
125
+ # @param character [Integer]
126
+ # @return [Pin::Method,Pin::Namespace]
127
+ def locate_named_path_pin line, character
128
+ _locate_pin line, character, Pin::Namespace, Pin::Method
129
+ end
130
+
131
+ # @param line [Integer]
132
+ # @param character [Integer]
133
+ # @return [Pin::Closure]
134
+ def locate_closure_pin line, character
135
+ _locate_pin line, character, Pin::Closure
136
+ end
137
+
138
+ # @deprecated Please use locate_closure_pin instead
139
+ alias locate_block_pin locate_closure_pin
140
+
141
+ # @param name [String]
142
+ # @return [Array<Location>]
143
+ def references name
144
+ source.references name
145
+ end
146
+
147
+ # @param location [Location]
148
+ # @return [Array<Pin::LocalVariable>]
149
+ def locals_at location
150
+ return [] if location.filename != filename
151
+ closure = locate_closure_pin(location.range.start.line, location.range.start.character)
152
+ locals.select { |pin| pin.visible_at?(closure, location) }
153
+ end
154
+
155
+ class << self
156
+ # @param filename [String]
157
+ # @return [SourceMap]
158
+ def load filename
159
+ source = Solargraph::Source.load(filename)
160
+ SourceMap.map(source)
161
+ end
162
+
163
+ # @param code [String]
164
+ # @param filename [String, nil]
165
+ # @return [SourceMap]
166
+ def load_string code, filename = nil
167
+ source = Solargraph::Source.load_string(code, filename)
168
+ SourceMap.map(source)
169
+ end
170
+
171
+ # @deprecated
172
+ # @param source [Source]
173
+ # @return [SourceMap]
174
+ def map source
175
+ new(source)
176
+ end
177
+ end
178
+
179
+ private
180
+
181
+ # @return [Array<Pin::Base>]
182
+ attr_writer :convention_pins
183
+
184
+ # @return [Hash{Class<Pin::Base> => Array<Pin::Base>}]
185
+ def pin_class_hash
186
+ # @todo Need to support generic resolution in classify and transform_values
187
+ @pin_class_hash ||= pins.to_set.classify(&:class).transform_values(&:to_a)
188
+ end
189
+
190
+ # @return [Data]
191
+ def data
192
+ @data ||= Data.new(source)
193
+ end
194
+
195
+ # @return [Array<Pin::Base>]
196
+ def convention_pins
197
+ @convention_pins || []
198
+ end
199
+
200
+ # @generic T
201
+ # @param line [Integer]
202
+ # @param character [Integer]
203
+ # @param klasses [Array<Class<generic<T>>>]
204
+ # @return [generic<T>, nil]
205
+ # @sg-ignore Need better generic inference here
206
+ def _locate_pin line, character, *klasses
207
+ position = Position.new(line, character)
208
+ found = nil
209
+ pins.each do |pin|
210
+ # @todo Attribute pins should not be treated like closures, but
211
+ # there's probably a better way to handle it
212
+ next if pin.is_a?(Pin::Method) && pin.attribute?
213
+ found = pin if (klasses.empty? || klasses.any? do |kls|
214
+ pin.is_a?(kls)
215
+ # @sg-ignore Need to add nil check here
216
+ end) && pin.location.range.contain?(position)
217
+ # @sg-ignore Need to add nil check here
218
+ break if pin.location.range.start.line > line
219
+ end
220
+ # Assuming the root pin is always valid
221
+ found || pins.first
222
+ end
223
+ end
224
+ end
@@ -1,32 +1,34 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- class TypeChecker
5
- # A problem reported by TypeChecker.
6
- #
7
- class Problem
8
- # @return [Solargraph::Location]
9
- attr_reader :location
10
-
11
- # @return [String]
12
- attr_reader :message
13
-
14
- # @return [Pin::Base]
15
- attr_reader :pin
16
-
17
- # @return [String, nil]
18
- attr_reader :suggestion
19
-
20
- # @param location [Solargraph::Location]
21
- # @param message [String]
22
- # @param pin [Solargraph::Pin::Base, nil]
23
- # @param suggestion [String, nil]
24
- def initialize location, message, pin: nil, suggestion: nil
25
- @location = location
26
- @message = message
27
- @pin = pin
28
- @suggestion = suggestion
29
- end
30
- end
31
- end
32
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ class TypeChecker
5
+ # A problem reported by TypeChecker.
6
+ #
7
+ class Problem
8
+ # @todo Missed nil violation
9
+ # @return [Solargraph::Location]
10
+ attr_reader :location
11
+
12
+ # @return [String]
13
+ attr_reader :message
14
+
15
+ # @todo Missed nil violation
16
+ # @return [Pin::Base]
17
+ attr_reader :pin
18
+
19
+ # @return [String, nil]
20
+ attr_reader :suggestion
21
+
22
+ # @param location [Solargraph::Location, nil]
23
+ # @param message [String]
24
+ # @param pin [Solargraph::Pin::Base, nil]
25
+ # @param suggestion [String, nil]
26
+ def initialize location, message, pin: nil, suggestion: nil
27
+ @location = location
28
+ @message = message
29
+ @pin = pin
30
+ @suggestion = suggestion
31
+ end
32
+ end
33
+ end
34
+ end