solargraph 0.54.4 → 0.58.2

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 (209) hide show
  1. checksums.yaml +4 -4
  2. data/.gitattributes +2 -0
  3. data/.github/workflows/linting.yml +127 -0
  4. data/.github/workflows/plugins.yml +184 -6
  5. data/.github/workflows/rspec.yml +55 -5
  6. data/.github/workflows/typecheck.yml +8 -3
  7. data/.gitignore +8 -0
  8. data/.overcommit.yml +72 -0
  9. data/.rspec +1 -0
  10. data/.rubocop.yml +66 -0
  11. data/.rubocop_todo.yml +1279 -0
  12. data/.yardopts +1 -0
  13. data/CHANGELOG.md +140 -0
  14. data/README.md +20 -6
  15. data/Rakefile +125 -13
  16. data/bin/solargraph +3 -0
  17. data/lib/solargraph/api_map/cache.rb +110 -109
  18. data/lib/solargraph/api_map/constants.rb +279 -0
  19. data/lib/solargraph/api_map/index.rb +193 -167
  20. data/lib/solargraph/api_map/source_to_yard.rb +97 -88
  21. data/lib/solargraph/api_map/store.rb +384 -241
  22. data/lib/solargraph/api_map.rb +945 -875
  23. data/lib/solargraph/bench.rb +18 -1
  24. data/lib/solargraph/complex_type/type_methods.rb +228 -217
  25. data/lib/solargraph/complex_type/unique_type.rb +482 -386
  26. data/lib/solargraph/complex_type.rb +444 -394
  27. data/lib/solargraph/convention/active_support_concern.rb +111 -0
  28. data/lib/solargraph/convention/base.rb +20 -3
  29. data/lib/solargraph/convention/data_definition/data_assignment_node.rb +61 -0
  30. data/lib/solargraph/convention/data_definition/data_definition_node.rb +91 -0
  31. data/lib/solargraph/convention/data_definition.rb +105 -0
  32. data/lib/solargraph/convention/gemspec.rb +3 -2
  33. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +61 -0
  34. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +102 -0
  35. data/lib/solargraph/convention/struct_definition.rb +164 -0
  36. data/lib/solargraph/convention.rb +35 -4
  37. data/lib/solargraph/diagnostics/require_not_found.rb +53 -53
  38. data/lib/solargraph/diagnostics/rubocop.rb +118 -113
  39. data/lib/solargraph/diagnostics/rubocop_helpers.rb +68 -66
  40. data/lib/solargraph/diagnostics/type_check.rb +55 -55
  41. data/lib/solargraph/doc_map.rb +439 -188
  42. data/lib/solargraph/environ.rb +9 -2
  43. data/lib/solargraph/equality.rb +34 -33
  44. data/lib/solargraph/gem_pins.rb +98 -72
  45. data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
  46. data/lib/solargraph/language_server/host/dispatch.rb +130 -128
  47. data/lib/solargraph/language_server/host/message_worker.rb +112 -106
  48. data/lib/solargraph/language_server/host/sources.rb +99 -99
  49. data/lib/solargraph/language_server/host.rb +878 -861
  50. data/lib/solargraph/language_server/message/base.rb +2 -1
  51. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +114 -112
  52. data/lib/solargraph/language_server/message/extended/document.rb +23 -20
  53. data/lib/solargraph/language_server/message/extended/document_gems.rb +3 -3
  54. data/lib/solargraph/language_server/message/text_document/completion.rb +56 -56
  55. data/lib/solargraph/language_server/message/text_document/definition.rb +40 -38
  56. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +26 -26
  57. data/lib/solargraph/language_server/message/text_document/formatting.rb +148 -131
  58. data/lib/solargraph/language_server/message/text_document/hover.rb +58 -58
  59. data/lib/solargraph/language_server/message/text_document/signature_help.rb +24 -24
  60. data/lib/solargraph/language_server/message/text_document/type_definition.rb +25 -24
  61. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +2 -0
  62. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +23 -23
  63. data/lib/solargraph/language_server/progress.rb +8 -0
  64. data/lib/solargraph/language_server/request.rb +4 -1
  65. data/lib/solargraph/library.rb +683 -662
  66. data/lib/solargraph/location.rb +82 -58
  67. data/lib/solargraph/logging.rb +37 -27
  68. data/lib/solargraph/page.rb +3 -0
  69. data/lib/solargraph/parser/comment_ripper.rb +69 -56
  70. data/lib/solargraph/parser/flow_sensitive_typing.rb +255 -0
  71. data/lib/solargraph/parser/node_processor/base.rb +92 -87
  72. data/lib/solargraph/parser/node_processor.rb +62 -45
  73. data/lib/solargraph/parser/parser_gem/class_methods.rb +149 -157
  74. data/lib/solargraph/parser/parser_gem/flawed_builder.rb +1 -0
  75. data/lib/solargraph/parser/parser_gem/node_chainer.rb +166 -164
  76. data/lib/solargraph/parser/parser_gem/node_methods.rb +486 -495
  77. data/lib/solargraph/parser/parser_gem/node_processors/alias_node.rb +2 -1
  78. data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +22 -0
  79. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +59 -57
  80. data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +15 -15
  81. data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +46 -43
  82. data/lib/solargraph/parser/parser_gem/node_processors/casgn_node.rb +2 -1
  83. data/lib/solargraph/parser/parser_gem/node_processors/cvasgn_node.rb +2 -1
  84. data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +53 -50
  85. data/lib/solargraph/parser/parser_gem/node_processors/defs_node.rb +2 -1
  86. data/lib/solargraph/parser/parser_gem/node_processors/gvasgn_node.rb +2 -1
  87. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +23 -0
  88. data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +40 -38
  89. data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +29 -28
  90. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +59 -53
  91. data/lib/solargraph/parser/parser_gem/node_processors/namespace_node.rb +8 -7
  92. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +98 -0
  93. data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +17 -16
  94. data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +38 -36
  95. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +52 -42
  96. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +291 -259
  97. data/lib/solargraph/parser/parser_gem/node_processors/sym_node.rb +3 -1
  98. data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +29 -0
  99. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +29 -0
  100. data/lib/solargraph/parser/parser_gem/node_processors.rb +70 -56
  101. data/lib/solargraph/parser/region.rb +69 -66
  102. data/lib/solargraph/parser/snippet.rb +17 -15
  103. data/lib/solargraph/parser.rb +1 -0
  104. data/lib/solargraph/pin/base.rb +729 -378
  105. data/lib/solargraph/pin/base_variable.rb +126 -118
  106. data/lib/solargraph/pin/block.rb +104 -101
  107. data/lib/solargraph/pin/breakable.rb +9 -0
  108. data/lib/solargraph/pin/callable.rb +231 -147
  109. data/lib/solargraph/pin/closure.rb +72 -57
  110. data/lib/solargraph/pin/common.rb +79 -70
  111. data/lib/solargraph/pin/constant.rb +2 -0
  112. data/lib/solargraph/pin/conversions.rb +123 -123
  113. data/lib/solargraph/pin/delegated_method.rb +120 -101
  114. data/lib/solargraph/pin/documenting.rb +114 -98
  115. data/lib/solargraph/pin/instance_variable.rb +34 -34
  116. data/lib/solargraph/pin/keyword.rb +20 -15
  117. data/lib/solargraph/pin/local_variable.rb +75 -67
  118. data/lib/solargraph/pin/method.rb +672 -527
  119. data/lib/solargraph/pin/method_alias.rb +34 -31
  120. data/lib/solargraph/pin/namespace.rb +115 -107
  121. data/lib/solargraph/pin/parameter.rb +275 -212
  122. data/lib/solargraph/pin/proxy_type.rb +39 -29
  123. data/lib/solargraph/pin/reference/override.rb +47 -29
  124. data/lib/solargraph/pin/reference/require.rb +2 -2
  125. data/lib/solargraph/pin/reference/superclass.rb +15 -10
  126. data/lib/solargraph/pin/reference.rb +39 -22
  127. data/lib/solargraph/pin/search.rb +61 -56
  128. data/lib/solargraph/pin/signature.rb +61 -17
  129. data/lib/solargraph/pin/singleton.rb +1 -1
  130. data/lib/solargraph/pin/symbol.rb +53 -47
  131. data/lib/solargraph/pin/until.rb +18 -0
  132. data/lib/solargraph/pin/while.rb +18 -0
  133. data/lib/solargraph/pin.rb +44 -41
  134. data/lib/solargraph/pin_cache.rb +245 -0
  135. data/lib/solargraph/position.rb +132 -107
  136. data/lib/solargraph/range.rb +112 -98
  137. data/lib/solargraph/rbs_map/conversions.rb +823 -646
  138. data/lib/solargraph/rbs_map/core_fills.rb +50 -16
  139. data/lib/solargraph/rbs_map/core_map.rb +58 -28
  140. data/lib/solargraph/rbs_map/stdlib_map.rb +43 -33
  141. data/lib/solargraph/rbs_map.rb +163 -93
  142. data/lib/solargraph/shell.rb +352 -269
  143. data/lib/solargraph/source/chain/array.rb +11 -7
  144. data/lib/solargraph/source/chain/block_symbol.rb +1 -1
  145. data/lib/solargraph/source/chain/block_variable.rb +1 -1
  146. data/lib/solargraph/source/chain/call.rb +337 -303
  147. data/lib/solargraph/source/chain/constant.rb +26 -89
  148. data/lib/solargraph/source/chain/hash.rb +34 -33
  149. data/lib/solargraph/source/chain/head.rb +1 -1
  150. data/lib/solargraph/source/chain/if.rb +28 -28
  151. data/lib/solargraph/source/chain/instance_variable.rb +13 -13
  152. data/lib/solargraph/source/chain/link.rb +13 -2
  153. data/lib/solargraph/source/chain/literal.rb +48 -28
  154. data/lib/solargraph/source/chain/or.rb +23 -23
  155. data/lib/solargraph/source/chain/z_super.rb +1 -1
  156. data/lib/solargraph/source/chain.rb +291 -252
  157. data/lib/solargraph/source/change.rb +82 -82
  158. data/lib/solargraph/source/cursor.rb +166 -167
  159. data/lib/solargraph/source/encoding_fixes.rb +23 -23
  160. data/lib/solargraph/source/source_chainer.rb +194 -194
  161. data/lib/solargraph/source/updater.rb +55 -55
  162. data/lib/solargraph/source.rb +498 -495
  163. data/lib/solargraph/source_map/clip.rb +226 -232
  164. data/lib/solargraph/source_map/data.rb +34 -30
  165. data/lib/solargraph/source_map/mapper.rb +259 -255
  166. data/lib/solargraph/source_map.rb +212 -217
  167. data/lib/solargraph/type_checker/checks.rb +124 -120
  168. data/lib/solargraph/type_checker/param_def.rb +37 -35
  169. data/lib/solargraph/type_checker/problem.rb +32 -32
  170. data/lib/solargraph/type_checker/rules.rb +84 -62
  171. data/lib/solargraph/type_checker.rb +814 -672
  172. data/lib/solargraph/version.rb +5 -5
  173. data/lib/solargraph/views/_method.erb +10 -10
  174. data/lib/solargraph/views/_namespace.erb +3 -3
  175. data/lib/solargraph/views/document.erb +10 -10
  176. data/lib/solargraph/workspace/config.rb +255 -239
  177. data/lib/solargraph/workspace/require_paths.rb +97 -0
  178. data/lib/solargraph/workspace.rb +220 -239
  179. data/lib/solargraph/yard_map/helpers.rb +44 -16
  180. data/lib/solargraph/yard_map/mapper/to_constant.rb +7 -5
  181. data/lib/solargraph/yard_map/mapper/to_method.rb +130 -94
  182. data/lib/solargraph/yard_map/mapper/to_namespace.rb +31 -28
  183. data/lib/solargraph/yard_map/mapper.rb +79 -78
  184. data/lib/solargraph/yard_map/to_method.rb +89 -86
  185. data/lib/solargraph/yardoc.rb +87 -52
  186. data/lib/solargraph.rb +105 -72
  187. data/rbs/fills/bundler/0/bundler.rbs +4271 -0
  188. data/rbs/fills/open3/0/open3.rbs +172 -0
  189. data/rbs/fills/rubygems/0/basic_specification.rbs +326 -0
  190. data/rbs/fills/rubygems/0/errors.rbs +364 -0
  191. data/rbs/fills/rubygems/0/spec_fetcher.rbs +107 -0
  192. data/rbs/fills/rubygems/0/specification.rbs +1753 -0
  193. data/rbs/fills/tuple/tuple.rbs +149 -0
  194. data/rbs/shims/ast/0/node.rbs +5 -0
  195. data/rbs/shims/ast/2.4/.rbs_meta.yaml +9 -0
  196. data/rbs/shims/ast/2.4/ast.rbs +73 -0
  197. data/rbs/shims/parser/3.2.0.1/builders/default.rbs +195 -0
  198. data/rbs/shims/parser/3.2.0.1/manifest.yaml +7 -0
  199. data/rbs/shims/parser/3.2.0.1/parser.rbs +201 -0
  200. data/rbs/shims/parser/3.2.0.1/polyfill.rbs +4 -0
  201. data/rbs/shims/thor/1.2.0.1/.rbs_meta.yaml +9 -0
  202. data/rbs/shims/thor/1.2.0.1/manifest.yaml +7 -0
  203. data/rbs/shims/thor/1.2.0.1/thor.rbs +17 -0
  204. data/rbs_collection.yaml +19 -0
  205. data/solargraph.gemspec +27 -5
  206. metadata +215 -18
  207. data/lib/.rubocop.yml +0 -22
  208. data/lib/solargraph/cache.rb +0 -77
  209. data/lib/solargraph/parser/node_methods.rb +0 -83
@@ -1,217 +1,212 @@
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::LocalVariable>]
25
- def locals
26
- data.locals
27
- end
28
-
29
- # @param source [Source]
30
- def initialize source
31
- @source = source
32
-
33
- environ.merge Convention.for_local(self) unless filename.nil?
34
- self.convention_pins = environ.pins
35
- @pin_select_cache = {}
36
- end
37
-
38
- # @param klass [Class]
39
- # @return [Array<Pin::Base>]
40
- def pins_by_class klass
41
- @pin_select_cache[klass] ||= pin_class_hash.select { |key, _| key <= klass }.values.flatten
42
- end
43
-
44
- # A hash representing the state of the source map's API.
45
- #
46
- # ApiMap#catalog uses this value to determine whether it needs to clear its
47
- # cache.
48
- #
49
- # @return [Integer]
50
- def api_hash
51
- @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
52
- end
53
-
54
- # @return [String]
55
- def filename
56
- source.filename
57
- end
58
-
59
- # @return [String]
60
- def code
61
- source.code
62
- end
63
-
64
- # @return [Array<Pin::Reference::Require>]
65
- def requires
66
- pins_by_class(Pin::Reference::Require)
67
- end
68
-
69
- # @return [Environ]
70
- def environ
71
- @environ ||= Environ.new
72
- end
73
-
74
- # all pins except Solargraph::Pin::Reference::Reference
75
- # @return [Array<Pin::Base>]
76
- def document_symbols
77
- @document_symbols ||= (pins + convention_pins).select do |pin|
78
- pin.path && !pin.path.empty?
79
- end
80
- end
81
-
82
- # @param query [String]
83
- # @return [Array<Pin::Base>]
84
- def query_symbols query
85
- Pin::Search.new(document_symbols, query).results
86
- end
87
-
88
- # @param position [Position]
89
- # @return [Source::Cursor]
90
- def cursor_at position
91
- Source::Cursor.new(source, position)
92
- end
93
-
94
- # @param path [String]
95
- # @return [Pin::Base]
96
- def first_pin path
97
- pins.select { |p| p.path == path }.first
98
- end
99
-
100
- # @param location [Solargraph::Location]
101
- # @return [Array<Solargraph::Pin::Base>]
102
- def locate_pins location
103
- # return nil unless location.start_with?("#{filename}:")
104
- (pins + locals).select { |pin| pin.location == location }
105
- end
106
-
107
- # @param line [Integer]
108
- # @param character [Integer]
109
- # @return [Pin::Method,Pin::Namespace]
110
- def locate_named_path_pin line, character
111
- _locate_pin line, character, Pin::Namespace, Pin::Method
112
- end
113
-
114
- # @param line [Integer]
115
- # @param character [Integer]
116
- # @return [Pin::Namespace,Pin::Method,Pin::Block]
117
- def locate_block_pin line, character
118
- _locate_pin line, character, Pin::Namespace, Pin::Method, Pin::Block
119
- end
120
-
121
- # @todo Candidate for deprecation
122
- #
123
- # @param other_map [SourceMap]
124
- # @return [Boolean]
125
- def try_merge! other_map
126
- return false if pins.length != other_map.pins.length || locals.length != other_map.locals.length || requires.map(&:name).uniq.sort != other_map.requires.map(&:name).uniq.sort
127
-
128
- pins.each_index do |i|
129
- return false unless pins[i].try_merge!(other_map.pins[i])
130
- end
131
- locals.each_index do |i|
132
- return false unless locals[i].try_merge!(other_map.locals[i])
133
- end
134
- @source = other_map.source
135
- true
136
- end
137
-
138
- # @param name [String]
139
- # @return [Array<Location>]
140
- def references name
141
- source.references name
142
- end
143
-
144
- # @param location [Location]
145
- # @return [Array<Pin::LocalVariable>]
146
- def locals_at(location)
147
- return [] if location.filename != filename
148
- closure = locate_named_path_pin(location.range.start.line, location.range.start.character)
149
- locals.select { |pin| pin.visible_at?(closure, location) }
150
- end
151
-
152
- class << self
153
- # @param filename [String]
154
- # @return [SourceMap]
155
- def load filename
156
- source = Solargraph::Source.load(filename)
157
- SourceMap.map(source)
158
- end
159
-
160
- # @param code [String]
161
- # @param filename [String, nil]
162
- # @return [SourceMap]
163
- def load_string code, filename = nil
164
- source = Solargraph::Source.load_string(code, filename)
165
- SourceMap.map(source)
166
- end
167
-
168
- # @deprecated
169
- # @param source [Source]
170
- # @return [SourceMap]
171
- def map source
172
- new(source)
173
- end
174
- end
175
-
176
- private
177
-
178
- def pin_class_hash
179
- @pin_class_hash ||= pins.to_set.classify(&:class).transform_values(&:to_a)
180
- end
181
-
182
- def data
183
- @data ||= Data.new(source)
184
- end
185
-
186
- # @return [Array<Pin::Base>]
187
- def convention_pins
188
- @convention_pins || []
189
- end
190
-
191
- # @param pins [Array<Pin::Base>]
192
- # @return [Array<Pin::Base>]
193
- def convention_pins=(pins)
194
- # unmemoizing the document_symbols in case it was called from any of conventions
195
- @document_symbols = nil
196
- @convention_pins = pins
197
- end
198
-
199
- # @param line [Integer]
200
- # @param character [Integer]
201
- # @param klasses [Array<Class>]
202
- # @return [Pin::Base, nil]
203
- def _locate_pin line, character, *klasses
204
- position = Position.new(line, character)
205
- found = nil
206
- pins.each do |pin|
207
- # @todo Attribute pins should not be treated like closures, but
208
- # there's probably a better way to handle it
209
- next if pin.is_a?(Pin::Method) && pin.attribute?
210
- found = pin if (klasses.empty? || klasses.any? { |kls| pin.is_a?(kls) } ) && pin.location.range.contain?(position)
211
- break if pin.location.range.start.line > line
212
- end
213
- # Assuming the root pin is always valid
214
- found || pins.first
215
- end
216
- end
217
- 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
+
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