solargraph 0.54.4 → 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 (238) 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 +185 -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 +143 -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 +45 -28
  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/gemfile.rb +15 -15
  33. data/lib/solargraph/convention/gemspec.rb +23 -22
  34. data/lib/solargraph/convention/rakefile.rb +17 -17
  35. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +61 -0
  36. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +102 -0
  37. data/lib/solargraph/convention/struct_definition.rb +164 -0
  38. data/lib/solargraph/convention.rb +78 -47
  39. data/lib/solargraph/converters/dd.rb +17 -17
  40. data/lib/solargraph/converters/dl.rb +15 -15
  41. data/lib/solargraph/converters/dt.rb +15 -15
  42. data/lib/solargraph/converters/misc.rb +1 -1
  43. data/lib/solargraph/diagnostics/require_not_found.rb +53 -53
  44. data/lib/solargraph/diagnostics/rubocop.rb +118 -113
  45. data/lib/solargraph/diagnostics/rubocop_helpers.rb +68 -66
  46. data/lib/solargraph/diagnostics/type_check.rb +55 -55
  47. data/lib/solargraph/diagnostics/update_errors.rb +41 -41
  48. data/lib/solargraph/doc_map.rb +439 -188
  49. data/lib/solargraph/environ.rb +9 -2
  50. data/lib/solargraph/equality.rb +34 -33
  51. data/lib/solargraph/gem_pins.rb +98 -72
  52. data/lib/solargraph/language_server/error_codes.rb +20 -20
  53. data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
  54. data/lib/solargraph/language_server/host/dispatch.rb +130 -128
  55. data/lib/solargraph/language_server/host/message_worker.rb +112 -106
  56. data/lib/solargraph/language_server/host/sources.rb +99 -99
  57. data/lib/solargraph/language_server/host.rb +878 -861
  58. data/lib/solargraph/language_server/message/base.rb +97 -96
  59. data/lib/solargraph/language_server/message/client/register_capability.rb +15 -15
  60. data/lib/solargraph/language_server/message/completion_item/resolve.rb +60 -60
  61. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +114 -112
  62. data/lib/solargraph/language_server/message/extended/document.rb +23 -20
  63. data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -32
  64. data/lib/solargraph/language_server/message/extended/download_core.rb +19 -19
  65. data/lib/solargraph/language_server/message/extended/search.rb +20 -20
  66. data/lib/solargraph/language_server/message/initialize.rb +191 -191
  67. data/lib/solargraph/language_server/message/text_document/completion.rb +56 -56
  68. data/lib/solargraph/language_server/message/text_document/definition.rb +40 -38
  69. data/lib/solargraph/language_server/message/text_document/document_highlight.rb +16 -16
  70. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +26 -26
  71. data/lib/solargraph/language_server/message/text_document/formatting.rb +148 -131
  72. data/lib/solargraph/language_server/message/text_document/hover.rb +58 -58
  73. data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +11 -11
  74. data/lib/solargraph/language_server/message/text_document/references.rb +16 -16
  75. data/lib/solargraph/language_server/message/text_document/rename.rb +19 -19
  76. data/lib/solargraph/language_server/message/text_document/signature_help.rb +24 -24
  77. data/lib/solargraph/language_server/message/text_document/type_definition.rb +25 -24
  78. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +35 -35
  79. data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +40 -40
  80. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +26 -24
  81. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +23 -23
  82. data/lib/solargraph/language_server/message.rb +94 -94
  83. data/lib/solargraph/language_server/progress.rb +8 -0
  84. data/lib/solargraph/language_server/request.rb +27 -24
  85. data/lib/solargraph/language_server/transport/data_reader.rb +74 -74
  86. data/lib/solargraph/language_server/uri_helpers.rb +49 -49
  87. data/lib/solargraph/library.rb +683 -662
  88. data/lib/solargraph/location.rb +82 -58
  89. data/lib/solargraph/logging.rb +37 -27
  90. data/lib/solargraph/page.rb +92 -89
  91. data/lib/solargraph/parser/comment_ripper.rb +69 -56
  92. data/lib/solargraph/parser/flow_sensitive_typing.rb +255 -0
  93. data/lib/solargraph/parser/node_processor/base.rb +92 -87
  94. data/lib/solargraph/parser/node_processor.rb +62 -45
  95. data/lib/solargraph/parser/parser_gem/class_methods.rb +149 -157
  96. data/lib/solargraph/parser/parser_gem/flawed_builder.rb +19 -18
  97. data/lib/solargraph/parser/parser_gem/node_chainer.rb +166 -164
  98. data/lib/solargraph/parser/parser_gem/node_methods.rb +486 -495
  99. data/lib/solargraph/parser/parser_gem/node_processors/alias_node.rb +2 -1
  100. data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +22 -0
  101. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +59 -57
  102. data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +15 -15
  103. data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +46 -43
  104. data/lib/solargraph/parser/parser_gem/node_processors/casgn_node.rb +2 -1
  105. data/lib/solargraph/parser/parser_gem/node_processors/cvasgn_node.rb +2 -1
  106. data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +53 -50
  107. data/lib/solargraph/parser/parser_gem/node_processors/defs_node.rb +37 -36
  108. data/lib/solargraph/parser/parser_gem/node_processors/gvasgn_node.rb +2 -1
  109. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +23 -0
  110. data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +40 -38
  111. data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +29 -28
  112. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +59 -53
  113. data/lib/solargraph/parser/parser_gem/node_processors/namespace_node.rb +8 -7
  114. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +98 -0
  115. data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +17 -16
  116. data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +38 -36
  117. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +52 -42
  118. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +291 -259
  119. data/lib/solargraph/parser/parser_gem/node_processors/sym_node.rb +3 -1
  120. data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +29 -0
  121. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +29 -0
  122. data/lib/solargraph/parser/parser_gem/node_processors.rb +70 -56
  123. data/lib/solargraph/parser/parser_gem.rb +12 -12
  124. data/lib/solargraph/parser/region.rb +69 -66
  125. data/lib/solargraph/parser/snippet.rb +17 -15
  126. data/lib/solargraph/parser.rb +23 -22
  127. data/lib/solargraph/pin/base.rb +729 -378
  128. data/lib/solargraph/pin/base_variable.rb +126 -118
  129. data/lib/solargraph/pin/block.rb +104 -101
  130. data/lib/solargraph/pin/breakable.rb +9 -0
  131. data/lib/solargraph/pin/callable.rb +231 -147
  132. data/lib/solargraph/pin/closure.rb +72 -57
  133. data/lib/solargraph/pin/common.rb +79 -70
  134. data/lib/solargraph/pin/constant.rb +45 -43
  135. data/lib/solargraph/pin/conversions.rb +123 -123
  136. data/lib/solargraph/pin/delegated_method.rb +120 -101
  137. data/lib/solargraph/pin/documenting.rb +114 -98
  138. data/lib/solargraph/pin/instance_variable.rb +34 -34
  139. data/lib/solargraph/pin/keyword.rb +20 -15
  140. data/lib/solargraph/pin/local_variable.rb +75 -67
  141. data/lib/solargraph/pin/method.rb +672 -527
  142. data/lib/solargraph/pin/method_alias.rb +34 -31
  143. data/lib/solargraph/pin/namespace.rb +115 -107
  144. data/lib/solargraph/pin/parameter.rb +275 -212
  145. data/lib/solargraph/pin/proxy_type.rb +39 -29
  146. data/lib/solargraph/pin/reference/override.rb +47 -29
  147. data/lib/solargraph/pin/reference/require.rb +2 -2
  148. data/lib/solargraph/pin/reference/superclass.rb +15 -10
  149. data/lib/solargraph/pin/reference.rb +39 -22
  150. data/lib/solargraph/pin/search.rb +61 -56
  151. data/lib/solargraph/pin/signature.rb +61 -17
  152. data/lib/solargraph/pin/singleton.rb +1 -1
  153. data/lib/solargraph/pin/symbol.rb +53 -47
  154. data/lib/solargraph/pin/until.rb +18 -0
  155. data/lib/solargraph/pin/while.rb +18 -0
  156. data/lib/solargraph/pin.rb +44 -41
  157. data/lib/solargraph/pin_cache.rb +245 -0
  158. data/lib/solargraph/position.rb +132 -107
  159. data/lib/solargraph/range.rb +112 -98
  160. data/lib/solargraph/rbs_map/conversions.rb +823 -646
  161. data/lib/solargraph/rbs_map/core_fills.rb +84 -50
  162. data/lib/solargraph/rbs_map/core_map.rb +58 -28
  163. data/lib/solargraph/rbs_map/stdlib_map.rb +43 -33
  164. data/lib/solargraph/rbs_map.rb +163 -93
  165. data/lib/solargraph/server_methods.rb +16 -16
  166. data/lib/solargraph/shell.rb +363 -269
  167. data/lib/solargraph/source/chain/array.rb +37 -33
  168. data/lib/solargraph/source/chain/block_symbol.rb +1 -1
  169. data/lib/solargraph/source/chain/block_variable.rb +1 -1
  170. data/lib/solargraph/source/chain/call.rb +337 -303
  171. data/lib/solargraph/source/chain/class_variable.rb +13 -13
  172. data/lib/solargraph/source/chain/constant.rb +26 -89
  173. data/lib/solargraph/source/chain/global_variable.rb +13 -13
  174. data/lib/solargraph/source/chain/hash.rb +34 -33
  175. data/lib/solargraph/source/chain/head.rb +1 -1
  176. data/lib/solargraph/source/chain/if.rb +28 -28
  177. data/lib/solargraph/source/chain/instance_variable.rb +13 -13
  178. data/lib/solargraph/source/chain/link.rb +109 -98
  179. data/lib/solargraph/source/chain/literal.rb +48 -28
  180. data/lib/solargraph/source/chain/or.rb +23 -23
  181. data/lib/solargraph/source/chain/q_call.rb +11 -11
  182. data/lib/solargraph/source/chain/variable.rb +13 -13
  183. data/lib/solargraph/source/chain/z_super.rb +30 -30
  184. data/lib/solargraph/source/chain.rb +291 -252
  185. data/lib/solargraph/source/change.rb +82 -82
  186. data/lib/solargraph/source/cursor.rb +166 -167
  187. data/lib/solargraph/source/encoding_fixes.rb +23 -23
  188. data/lib/solargraph/source/source_chainer.rb +194 -194
  189. data/lib/solargraph/source/updater.rb +55 -55
  190. data/lib/solargraph/source.rb +498 -495
  191. data/lib/solargraph/source_map/clip.rb +226 -232
  192. data/lib/solargraph/source_map/data.rb +34 -30
  193. data/lib/solargraph/source_map/mapper.rb +259 -255
  194. data/lib/solargraph/source_map.rb +212 -217
  195. data/lib/solargraph/type_checker/checks.rb +124 -120
  196. data/lib/solargraph/type_checker/param_def.rb +37 -35
  197. data/lib/solargraph/type_checker/problem.rb +32 -32
  198. data/lib/solargraph/type_checker/rules.rb +84 -62
  199. data/lib/solargraph/type_checker.rb +814 -672
  200. data/lib/solargraph/version.rb +5 -5
  201. data/lib/solargraph/views/_method.erb +10 -10
  202. data/lib/solargraph/views/_namespace.erb +3 -3
  203. data/lib/solargraph/views/document.erb +10 -10
  204. data/lib/solargraph/workspace/config.rb +255 -239
  205. data/lib/solargraph/workspace/require_paths.rb +97 -0
  206. data/lib/solargraph/workspace.rb +220 -239
  207. data/lib/solargraph/yard_map/helpers.rb +44 -16
  208. data/lib/solargraph/yard_map/mapper/to_constant.rb +7 -5
  209. data/lib/solargraph/yard_map/mapper/to_method.rb +130 -94
  210. data/lib/solargraph/yard_map/mapper/to_namespace.rb +31 -28
  211. data/lib/solargraph/yard_map/mapper.rb +79 -78
  212. data/lib/solargraph/yard_map/to_method.rb +89 -86
  213. data/lib/solargraph/yard_tags.rb +20 -20
  214. data/lib/solargraph/yardoc.rb +87 -52
  215. data/lib/solargraph.rb +105 -72
  216. data/rbs/fills/bundler/0/bundler.rbs +4271 -0
  217. data/rbs/fills/open3/0/open3.rbs +172 -0
  218. data/rbs/fills/rubygems/0/basic_specification.rbs +326 -0
  219. data/rbs/fills/rubygems/0/errors.rbs +364 -0
  220. data/rbs/fills/rubygems/0/spec_fetcher.rbs +107 -0
  221. data/rbs/fills/rubygems/0/specification.rbs +1753 -0
  222. data/rbs/fills/tuple/tuple.rbs +149 -0
  223. data/rbs/shims/ast/0/node.rbs +5 -0
  224. data/rbs/shims/ast/2.4/.rbs_meta.yaml +9 -0
  225. data/rbs/shims/ast/2.4/ast.rbs +73 -0
  226. data/rbs/shims/parser/3.2.0.1/builders/default.rbs +195 -0
  227. data/rbs/shims/parser/3.2.0.1/manifest.yaml +7 -0
  228. data/rbs/shims/parser/3.2.0.1/parser.rbs +201 -0
  229. data/rbs/shims/parser/3.2.0.1/polyfill.rbs +4 -0
  230. data/rbs/shims/thor/1.2.0.1/.rbs_meta.yaml +9 -0
  231. data/rbs/shims/thor/1.2.0.1/manifest.yaml +7 -0
  232. data/rbs/shims/thor/1.2.0.1/thor.rbs +17 -0
  233. data/rbs_collection.yaml +19 -0
  234. data/solargraph.gemspec +27 -5
  235. metadata +215 -18
  236. data/lib/.rubocop.yml +0 -22
  237. data/lib/solargraph/cache.rb +0 -77
  238. 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