solargraph 0.44.2 → 0.46.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 (246) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rspec.yml +41 -0
  3. data/.gitignore +9 -9
  4. data/.rspec +2 -2
  5. data/.travis.yml +19 -19
  6. data/CHANGELOG.md +1115 -1088
  7. data/Gemfile +0 -0
  8. data/LICENSE +0 -0
  9. data/README.md +128 -120
  10. data/Rakefile +0 -0
  11. data/SPONSORS.md +18 -15
  12. data/bin/solargraph +0 -0
  13. data/lib/solargraph/api_map/bundler_methods.rb +22 -22
  14. data/lib/solargraph/api_map/cache.rb +70 -70
  15. data/lib/solargraph/api_map/source_to_yard.rb +81 -81
  16. data/lib/solargraph/api_map/store.rb +256 -256
  17. data/lib/solargraph/api_map.rb +686 -681
  18. data/lib/solargraph/bench.rb +27 -27
  19. data/lib/solargraph/compat.rb +37 -37
  20. data/lib/solargraph/complex_type/type_methods.rb +130 -130
  21. data/lib/solargraph/complex_type/unique_type.rb +75 -75
  22. data/lib/solargraph/complex_type.rb +221 -221
  23. data/lib/solargraph/convention/base.rb +33 -33
  24. data/lib/solargraph/convention/gemfile.rb +15 -15
  25. data/lib/solargraph/convention/gemspec.rb +22 -22
  26. data/lib/solargraph/convention/rspec.rb +30 -21
  27. data/lib/solargraph/convention.rb +47 -47
  28. data/lib/solargraph/converters/dd.rb +12 -12
  29. data/lib/solargraph/converters/dl.rb +12 -12
  30. data/lib/solargraph/converters/dt.rb +12 -12
  31. data/lib/solargraph/converters/misc.rb +1 -1
  32. data/lib/solargraph/diagnostics/base.rb +29 -29
  33. data/lib/solargraph/diagnostics/require_not_found.rb +53 -37
  34. data/lib/solargraph/diagnostics/rubocop.rb +98 -98
  35. data/lib/solargraph/diagnostics/rubocop_helpers.rb +63 -63
  36. data/lib/solargraph/diagnostics/severities.rb +15 -15
  37. data/lib/solargraph/diagnostics/type_check.rb +54 -54
  38. data/lib/solargraph/diagnostics/update_errors.rb +41 -41
  39. data/lib/solargraph/diagnostics.rb +55 -55
  40. data/lib/solargraph/documentor.rb +76 -76
  41. data/lib/solargraph/environ.rb +45 -45
  42. data/lib/solargraph/language_server/completion_item_kinds.rb +35 -35
  43. data/lib/solargraph/language_server/error_codes.rb +20 -20
  44. data/lib/solargraph/language_server/host/cataloger.rb +56 -56
  45. data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
  46. data/lib/solargraph/language_server/host/dispatch.rb +111 -111
  47. data/lib/solargraph/language_server/host/message_worker.rb +59 -59
  48. data/lib/solargraph/language_server/host/sources.rb +156 -156
  49. data/lib/solargraph/language_server/host.rb +865 -865
  50. data/lib/solargraph/language_server/message/base.rb +89 -89
  51. data/lib/solargraph/language_server/message/cancel_request.rb +13 -13
  52. data/lib/solargraph/language_server/message/client/register_capability.rb +15 -15
  53. data/lib/solargraph/language_server/message/client.rb +11 -11
  54. data/lib/solargraph/language_server/message/completion_item/resolve.rb +58 -58
  55. data/lib/solargraph/language_server/message/completion_item.rb +11 -11
  56. data/lib/solargraph/language_server/message/exit_notification.rb +13 -13
  57. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +100 -100
  58. data/lib/solargraph/language_server/message/extended/document.rb +20 -20
  59. data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -32
  60. data/lib/solargraph/language_server/message/extended/download_core.rb +23 -23
  61. data/lib/solargraph/language_server/message/extended/environment.rb +25 -25
  62. data/lib/solargraph/language_server/message/extended/search.rb +20 -20
  63. data/lib/solargraph/language_server/message/extended.rb +21 -21
  64. data/lib/solargraph/language_server/message/initialize.rb +162 -162
  65. data/lib/solargraph/language_server/message/initialized.rb +27 -27
  66. data/lib/solargraph/language_server/message/method_not_found.rb +16 -16
  67. data/lib/solargraph/language_server/message/method_not_implemented.rb +14 -14
  68. data/lib/solargraph/language_server/message/shutdown.rb +13 -13
  69. data/lib/solargraph/language_server/message/text_document/base.rb +19 -19
  70. data/lib/solargraph/language_server/message/text_document/code_action.rb +17 -17
  71. data/lib/solargraph/language_server/message/text_document/completion.rb +59 -59
  72. data/lib/solargraph/language_server/message/text_document/definition.rb +38 -38
  73. data/lib/solargraph/language_server/message/text_document/did_change.rb +15 -15
  74. data/lib/solargraph/language_server/message/text_document/did_close.rb +15 -15
  75. data/lib/solargraph/language_server/message/text_document/did_open.rb +15 -15
  76. data/lib/solargraph/language_server/message/text_document/did_save.rb +17 -17
  77. data/lib/solargraph/language_server/message/text_document/document_highlight.rb +16 -16
  78. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +23 -23
  79. data/lib/solargraph/language_server/message/text_document/folding_range.rb +26 -26
  80. data/lib/solargraph/language_server/message/text_document/formatting.rb +126 -126
  81. data/lib/solargraph/language_server/message/text_document/hover.rb +54 -44
  82. data/lib/solargraph/language_server/message/text_document/on_type_formatting.rb +34 -34
  83. data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +11 -11
  84. data/lib/solargraph/language_server/message/text_document/references.rb +16 -16
  85. data/lib/solargraph/language_server/message/text_document/rename.rb +19 -19
  86. data/lib/solargraph/language_server/message/text_document/signature_help.rb +29 -29
  87. data/lib/solargraph/language_server/message/text_document.rb +28 -28
  88. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +30 -30
  89. data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +33 -33
  90. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +24 -24
  91. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +23 -23
  92. data/lib/solargraph/language_server/message/workspace.rb +14 -14
  93. data/lib/solargraph/language_server/message.rb +93 -93
  94. data/lib/solargraph/language_server/message_types.rb +14 -14
  95. data/lib/solargraph/language_server/request.rb +24 -24
  96. data/lib/solargraph/language_server/symbol_kinds.rb +36 -36
  97. data/lib/solargraph/language_server/transport/adapter.rb +53 -53
  98. data/lib/solargraph/language_server/transport/data_reader.rb +72 -72
  99. data/lib/solargraph/language_server/transport.rb +13 -13
  100. data/lib/solargraph/language_server/uri_helpers.rb +49 -49
  101. data/lib/solargraph/language_server.rb +19 -19
  102. data/lib/solargraph/library.rb +546 -546
  103. data/lib/solargraph/location.rb +37 -37
  104. data/lib/solargraph/logging.rb +27 -27
  105. data/lib/solargraph/page.rb +83 -83
  106. data/lib/solargraph/parser/comment_ripper.rb +52 -52
  107. data/lib/solargraph/parser/legacy/class_methods.rb +135 -140
  108. data/lib/solargraph/parser/legacy/flawed_builder.rb +16 -16
  109. data/lib/solargraph/parser/legacy/node_chainer.rb +148 -148
  110. data/lib/solargraph/parser/legacy/node_methods.rb +325 -325
  111. data/lib/solargraph/parser/legacy/node_processors/alias_node.rb +23 -23
  112. data/lib/solargraph/parser/legacy/node_processors/args_node.rb +35 -35
  113. data/lib/solargraph/parser/legacy/node_processors/begin_node.rb +15 -15
  114. data/lib/solargraph/parser/legacy/node_processors/block_node.rb +42 -42
  115. data/lib/solargraph/parser/legacy/node_processors/casgn_node.rb +25 -25
  116. data/lib/solargraph/parser/legacy/node_processors/cvasgn_node.rb +23 -23
  117. data/lib/solargraph/parser/legacy/node_processors/def_node.rb +63 -63
  118. data/lib/solargraph/parser/legacy/node_processors/defs_node.rb +36 -36
  119. data/lib/solargraph/parser/legacy/node_processors/gvasgn_node.rb +23 -23
  120. data/lib/solargraph/parser/legacy/node_processors/ivasgn_node.rb +38 -38
  121. data/lib/solargraph/parser/legacy/node_processors/lvasgn_node.rb +28 -28
  122. data/lib/solargraph/parser/legacy/node_processors/namespace_node.rb +39 -39
  123. data/lib/solargraph/parser/legacy/node_processors/orasgn_node.rb +16 -16
  124. data/lib/solargraph/parser/legacy/node_processors/resbody_node.rb +36 -36
  125. data/lib/solargraph/parser/legacy/node_processors/sclass_node.rb +21 -21
  126. data/lib/solargraph/parser/legacy/node_processors/send_node.rb +257 -257
  127. data/lib/solargraph/parser/legacy/node_processors/sym_node.rb +18 -18
  128. data/lib/solargraph/parser/legacy/node_processors.rb +54 -54
  129. data/lib/solargraph/parser/legacy.rb +12 -12
  130. data/lib/solargraph/parser/node_methods.rb +43 -43
  131. data/lib/solargraph/parser/node_processor/base.rb +77 -77
  132. data/lib/solargraph/parser/node_processor.rb +43 -43
  133. data/lib/solargraph/parser/region.rb +66 -66
  134. data/lib/solargraph/parser/rubyvm/class_methods.rb +144 -155
  135. data/lib/solargraph/parser/rubyvm/node_chainer.rb +160 -160
  136. data/lib/solargraph/parser/rubyvm/node_methods.rb +315 -315
  137. data/lib/solargraph/parser/rubyvm/node_processors/alias_node.rb +23 -23
  138. data/lib/solargraph/parser/rubyvm/node_processors/args_node.rb +85 -85
  139. data/lib/solargraph/parser/rubyvm/node_processors/begin_node.rb +15 -15
  140. data/lib/solargraph/parser/rubyvm/node_processors/block_node.rb +42 -42
  141. data/lib/solargraph/parser/rubyvm/node_processors/casgn_node.rb +22 -22
  142. data/lib/solargraph/parser/rubyvm/node_processors/cvasgn_node.rb +23 -23
  143. data/lib/solargraph/parser/rubyvm/node_processors/def_node.rb +63 -64
  144. data/lib/solargraph/parser/rubyvm/node_processors/defs_node.rb +57 -57
  145. data/lib/solargraph/parser/rubyvm/node_processors/gvasgn_node.rb +23 -23
  146. data/lib/solargraph/parser/rubyvm/node_processors/ivasgn_node.rb +38 -38
  147. data/lib/solargraph/parser/rubyvm/node_processors/kw_arg_node.rb +39 -39
  148. data/lib/solargraph/parser/rubyvm/node_processors/lit_node.rb +20 -20
  149. data/lib/solargraph/parser/rubyvm/node_processors/lvasgn_node.rb +27 -27
  150. data/lib/solargraph/parser/rubyvm/node_processors/namespace_node.rb +39 -39
  151. data/lib/solargraph/parser/rubyvm/node_processors/opt_arg_node.rb +26 -26
  152. data/lib/solargraph/parser/rubyvm/node_processors/orasgn_node.rb +15 -15
  153. data/lib/solargraph/parser/rubyvm/node_processors/resbody_node.rb +45 -45
  154. data/lib/solargraph/parser/rubyvm/node_processors/sclass_node.rb +21 -21
  155. data/lib/solargraph/parser/rubyvm/node_processors/scope_node.rb +15 -15
  156. data/lib/solargraph/parser/rubyvm/node_processors/send_node.rb +277 -277
  157. data/lib/solargraph/parser/rubyvm/node_processors/sym_node.rb +18 -18
  158. data/lib/solargraph/parser/rubyvm/node_processors.rb +63 -62
  159. data/lib/solargraph/parser/rubyvm.rb +40 -40
  160. data/lib/solargraph/parser/snippet.rb +13 -13
  161. data/lib/solargraph/parser.rb +26 -26
  162. data/lib/solargraph/pin/base.rb +296 -296
  163. data/lib/solargraph/pin/base_variable.rb +84 -84
  164. data/lib/solargraph/pin/block.rb +72 -72
  165. data/lib/solargraph/pin/class_variable.rb +8 -8
  166. data/lib/solargraph/pin/closure.rb +37 -37
  167. data/lib/solargraph/pin/common.rb +70 -70
  168. data/lib/solargraph/pin/constant.rb +43 -43
  169. data/lib/solargraph/pin/conversions.rb +96 -96
  170. data/lib/solargraph/pin/documenting.rb +105 -105
  171. data/lib/solargraph/pin/duck_method.rb +16 -16
  172. data/lib/solargraph/pin/global_variable.rb +8 -8
  173. data/lib/solargraph/pin/instance_variable.rb +30 -30
  174. data/lib/solargraph/pin/keyword.rb +15 -15
  175. data/lib/solargraph/pin/keyword_param.rb +8 -8
  176. data/lib/solargraph/pin/local_variable.rb +55 -55
  177. data/lib/solargraph/pin/method.rb +245 -245
  178. data/lib/solargraph/pin/method_alias.rb +31 -31
  179. data/lib/solargraph/pin/namespace.rb +91 -91
  180. data/lib/solargraph/pin/parameter.rb +201 -206
  181. data/lib/solargraph/pin/proxy_type.rb +29 -29
  182. data/lib/solargraph/pin/reference/extend.rb +10 -10
  183. data/lib/solargraph/pin/reference/include.rb +10 -10
  184. data/lib/solargraph/pin/reference/override.rb +29 -29
  185. data/lib/solargraph/pin/reference/prepend.rb +10 -10
  186. data/lib/solargraph/pin/reference/require.rb +14 -14
  187. data/lib/solargraph/pin/reference/superclass.rb +10 -10
  188. data/lib/solargraph/pin/reference.rb +14 -14
  189. data/lib/solargraph/pin/search.rb +56 -0
  190. data/lib/solargraph/pin/singleton.rb +11 -11
  191. data/lib/solargraph/pin/symbol.rb +47 -47
  192. data/lib/solargraph/pin.rb +37 -36
  193. data/lib/solargraph/position.rb +100 -100
  194. data/lib/solargraph/range.rb +95 -95
  195. data/lib/solargraph/server_methods.rb +16 -16
  196. data/lib/solargraph/shell.rb +226 -226
  197. data/lib/solargraph/source/chain/block_variable.rb +13 -13
  198. data/lib/solargraph/source/chain/call.rb +204 -204
  199. data/lib/solargraph/source/chain/class_variable.rb +13 -13
  200. data/lib/solargraph/source/chain/constant.rb +75 -75
  201. data/lib/solargraph/source/chain/global_variable.rb +13 -13
  202. data/lib/solargraph/source/chain/hash.rb +28 -28
  203. data/lib/solargraph/source/chain/head.rb +19 -19
  204. data/lib/solargraph/source/chain/instance_variable.rb +13 -13
  205. data/lib/solargraph/source/chain/link.rb +71 -71
  206. data/lib/solargraph/source/chain/literal.rb +23 -23
  207. data/lib/solargraph/source/chain/or.rb +23 -23
  208. data/lib/solargraph/source/chain/q_call.rb +11 -11
  209. data/lib/solargraph/source/chain/variable.rb +13 -13
  210. data/lib/solargraph/source/chain/z_super.rb +30 -30
  211. data/lib/solargraph/source/chain.rb +164 -164
  212. data/lib/solargraph/source/change.rb +79 -79
  213. data/lib/solargraph/source/cursor.rb +164 -164
  214. data/lib/solargraph/source/source_chainer.rb +191 -191
  215. data/lib/solargraph/source/updater.rb +54 -54
  216. data/lib/solargraph/source.rb +522 -522
  217. data/lib/solargraph/source_map/clip.rb +224 -224
  218. data/lib/solargraph/source_map/completion.rb +23 -23
  219. data/lib/solargraph/source_map/mapper.rb +212 -212
  220. data/lib/solargraph/source_map.rb +180 -189
  221. data/lib/solargraph/type_checker/checks.rb +99 -99
  222. data/lib/solargraph/type_checker/param_def.rb +35 -35
  223. data/lib/solargraph/type_checker/problem.rb +32 -32
  224. data/lib/solargraph/type_checker/rules.rb +57 -57
  225. data/lib/solargraph/type_checker.rb +543 -510
  226. data/lib/solargraph/version.rb +5 -5
  227. data/lib/solargraph/views/environment.erb +58 -58
  228. data/lib/solargraph/workspace/config.rb +231 -231
  229. data/lib/solargraph/workspace.rb +215 -214
  230. data/lib/solargraph/yard_map/cache.rb +19 -19
  231. data/lib/solargraph/yard_map/core_docs.rb +170 -170
  232. data/lib/solargraph/yard_map/core_fills.rb +208 -203
  233. data/lib/solargraph/yard_map/core_gen.rb +76 -76
  234. data/lib/solargraph/yard_map/helpers.rb +16 -16
  235. data/lib/solargraph/yard_map/mapper/to_constant.rb +25 -25
  236. data/lib/solargraph/yard_map/mapper/to_method.rb +78 -78
  237. data/lib/solargraph/yard_map/mapper/to_namespace.rb +27 -27
  238. data/lib/solargraph/yard_map/mapper.rb +77 -77
  239. data/lib/solargraph/yard_map/rdoc_to_yard.rb +140 -140
  240. data/lib/solargraph/yard_map/stdlib_fills.rb +43 -43
  241. data/lib/solargraph/yard_map/to_method.rb +79 -79
  242. data/lib/solargraph/yard_map.rb +460 -443
  243. data/lib/solargraph.rb +69 -69
  244. data/lib/yard-solargraph.rb +33 -33
  245. data/solargraph.gemspec +0 -0
  246. metadata +14 -12
@@ -1,189 +1,180 @@
1
- # frozen_string_literal: true
2
-
3
- require 'jaro_winkler'
4
- require 'yard'
5
- require 'yard-solargraph'
6
- require 'set'
7
-
8
- module Solargraph
9
- # An index of pins and other ApiMap-related data for a Source.
10
- #
11
- class SourceMap
12
- autoload :Mapper, 'solargraph/source_map/mapper'
13
- autoload :Clip, 'solargraph/source_map/clip'
14
- autoload :Completion, 'solargraph/source_map/completion'
15
-
16
- # @return [Source]
17
- attr_reader :source
18
-
19
- # @return [Array<Pin::Base>]
20
- attr_reader :pins
21
-
22
- # @return [Array<Pin::Base>]
23
- attr_reader :locals
24
-
25
- # @param source [Source]
26
- # @param pins [Array<Pin::Base>]
27
- # @param locals [Array<Pin::Base>]
28
- def initialize source, pins, locals
29
- # HACK: Keep the library from changing this
30
- @source = source.dup
31
- @pins = pins
32
- @locals = locals
33
- environ.merge Convention.for_local(self) unless filename.nil?
34
- @pin_class_hash = pins.to_set.classify(&:class).transform_values(&:to_a)
35
- @pin_select_cache = {}
36
- end
37
-
38
- def pins_by_class klass
39
- @pin_select_cache[klass] ||= @pin_class_hash.select { |key, _| key <= klass }.values.flatten
40
- end
41
-
42
- def rebindable_method_names
43
- @rebindable_method_names ||= pins_by_class(Pin::Method)
44
- .select { |pin| pin.comments && pin.comments.include?('@yieldself') }
45
- .map(&:name)
46
- .to_set
47
- end
48
-
49
- # @return [String]
50
- def filename
51
- source.filename
52
- end
53
-
54
- # @return [String]
55
- def code
56
- source.code
57
- end
58
-
59
- # @return [Array<Pin::Reference::Require>]
60
- def requires
61
- pins_by_class(Pin::Reference::Require)
62
- end
63
-
64
- # @return [Environ]
65
- def environ
66
- @environ ||= Environ.new
67
- end
68
-
69
- # @return [Array<Pin::Base>]
70
- def document_symbols
71
- @document_symbols ||= pins.select { |pin|
72
- pin.path && !pin.path.empty?
73
- }
74
- end
75
-
76
- # @param query [String]
77
- # @return [Array<Pin::Base>]
78
- def query_symbols query
79
- return document_symbols if query && query.empty?
80
- document_symbols.select{ |pin| fuzzy_string_match(pin.path, query) || fuzzy_string_match(pin.name, query) }
81
- end
82
-
83
- # @param position [Position]
84
- # @return [Source::Cursor]
85
- def cursor_at position
86
- Source::Cursor.new(source, position)
87
- end
88
-
89
- # @param path [String]
90
- # @return [Pin::Base]
91
- def first_pin path
92
- pins.select { |p| p.path == path }.first
93
- end
94
-
95
- # @param location [Solargraph::Location]
96
- # @return [Array<Solargraph::Pin::Base>]
97
- def locate_pins location
98
- # return nil unless location.start_with?("#{filename}:")
99
- (pins + locals).select { |pin| pin.location == location }
100
- end
101
-
102
- def locate_named_path_pin line, character
103
- _locate_pin line, character, Pin::Namespace, Pin::Method
104
- end
105
-
106
- def locate_block_pin line, character
107
- _locate_pin line, character, Pin::Namespace, Pin::Method, Pin::Block
108
- end
109
-
110
- # @param other_map [SourceMap]
111
- # @return [Boolean]
112
- def try_merge! other_map
113
- 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
114
- pins.each_index do |i|
115
- return false unless pins[i].try_merge!(other_map.pins[i])
116
- end
117
- locals.each_index do |i|
118
- return false unless locals[i].try_merge!(other_map.locals[i])
119
- end
120
- @source = other_map.source
121
- true
122
- end
123
-
124
- # @param name [String]
125
- # @return [Array<Location>]
126
- def references name
127
- source.references name
128
- end
129
-
130
- # @param location [Location]
131
- # @return [Array<Pin::LocalVariable>]
132
- def locals_at(location)
133
- return [] if location.filename != filename
134
- closure = locate_named_path_pin(location.range.start.line, location.range.start.character)
135
- locals.select { |pin| pin.visible_at?(closure, location) }
136
- end
137
-
138
- class << self
139
- # @param filename [String]
140
- # @return [SourceMap]
141
- def load filename
142
- source = Solargraph::Source.load(filename)
143
- SourceMap.map(source)
144
- end
145
-
146
- # @param code [String]
147
- # @param filename [String, nil]
148
- # @return [SourceMap]
149
- def load_string code, filename = nil
150
- source = Solargraph::Source.load_string(code, filename)
151
- SourceMap.map(source)
152
- end
153
-
154
- # @param source [Source]
155
- # @return [SourceMap]
156
- def map source
157
- result = SourceMap::Mapper.map(source)
158
- new(source, *result)
159
- end
160
- end
161
-
162
- private
163
-
164
- # @param line [Integer]
165
- # @param character [Integer]
166
- # @param klasses [Array<Class>]
167
- # @return [Pin::Base]
168
- def _locate_pin line, character, *klasses
169
- position = Position.new(line, character)
170
- found = nil
171
- pins.each do |pin|
172
- # @todo Attribute pins should not be treated like closures, but
173
- # there's probably a better way to handle it
174
- next if pin.is_a?(Pin::Method) && pin.attribute?
175
- found = pin if (klasses.empty? || klasses.any? { |kls| pin.is_a?(kls) } ) && pin.location.range.contain?(position)
176
- break if pin.location.range.start.line > line
177
- end
178
- # Assuming the root pin is always valid
179
- found || pins.first
180
- end
181
-
182
- # @param str1 [String]
183
- # @param str2 [String]
184
- # @return [Boolean]
185
- def fuzzy_string_match str1, str2
186
- JaroWinkler.distance(str1, str2) > 0.6
187
- end
188
- end
189
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'yard'
4
+ require 'yard-solargraph'
5
+ require 'set'
6
+
7
+ module Solargraph
8
+ # An index of pins and other ApiMap-related data for a Source.
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
+
15
+ # @return [Source]
16
+ attr_reader :source
17
+
18
+ # @return [Array<Pin::Base>]
19
+ attr_reader :pins
20
+
21
+ # @return [Array<Pin::Base>]
22
+ attr_reader :locals
23
+
24
+ # @param source [Source]
25
+ # @param pins [Array<Pin::Base>]
26
+ # @param locals [Array<Pin::Base>]
27
+ def initialize source, pins, locals
28
+ # HACK: Keep the library from changing this
29
+ @source = source.dup
30
+ @pins = pins
31
+ @locals = locals
32
+ environ.merge Convention.for_local(self) unless filename.nil?
33
+ @pin_class_hash = pins.to_set.classify(&:class).transform_values(&:to_a)
34
+ @pin_select_cache = {}
35
+ end
36
+
37
+ def pins_by_class klass
38
+ @pin_select_cache[klass] ||= @pin_class_hash.select { |key, _| key <= klass }.values.flatten
39
+ end
40
+
41
+ def rebindable_method_names
42
+ @rebindable_method_names ||= pins_by_class(Pin::Method)
43
+ .select { |pin| pin.comments && pin.comments.include?('@yieldself') }
44
+ .map(&:name)
45
+ .to_set
46
+ end
47
+
48
+ # @return [String]
49
+ def filename
50
+ source.filename
51
+ end
52
+
53
+ # @return [String]
54
+ def code
55
+ source.code
56
+ end
57
+
58
+ # @return [Array<Pin::Reference::Require>]
59
+ def requires
60
+ pins_by_class(Pin::Reference::Require)
61
+ end
62
+
63
+ # @return [Environ]
64
+ def environ
65
+ @environ ||= Environ.new
66
+ end
67
+
68
+ # @return [Array<Pin::Base>]
69
+ def document_symbols
70
+ @document_symbols ||= pins.select { |pin|
71
+ pin.path && !pin.path.empty?
72
+ }
73
+ end
74
+
75
+ # @param query [String]
76
+ # @return [Array<Pin::Base>]
77
+ def query_symbols query
78
+ Pin::Search.new(document_symbols, query).results
79
+ end
80
+
81
+ # @param position [Position]
82
+ # @return [Source::Cursor]
83
+ def cursor_at position
84
+ Source::Cursor.new(source, position)
85
+ end
86
+
87
+ # @param path [String]
88
+ # @return [Pin::Base]
89
+ def first_pin path
90
+ pins.select { |p| p.path == path }.first
91
+ end
92
+
93
+ # @param location [Solargraph::Location]
94
+ # @return [Array<Solargraph::Pin::Base>]
95
+ def locate_pins location
96
+ # return nil unless location.start_with?("#{filename}:")
97
+ (pins + locals).select { |pin| pin.location == location }
98
+ end
99
+
100
+ def locate_named_path_pin line, character
101
+ _locate_pin line, character, Pin::Namespace, Pin::Method
102
+ end
103
+
104
+ def locate_block_pin line, character
105
+ _locate_pin line, character, Pin::Namespace, Pin::Method, Pin::Block
106
+ end
107
+
108
+ # @param other_map [SourceMap]
109
+ # @return [Boolean]
110
+ def try_merge! other_map
111
+ 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
112
+ pins.each_index do |i|
113
+ return false unless pins[i].try_merge!(other_map.pins[i])
114
+ end
115
+ locals.each_index do |i|
116
+ return false unless locals[i].try_merge!(other_map.locals[i])
117
+ end
118
+ @source = other_map.source
119
+ true
120
+ end
121
+
122
+ # @param name [String]
123
+ # @return [Array<Location>]
124
+ def references name
125
+ source.references name
126
+ end
127
+
128
+ # @param location [Location]
129
+ # @return [Array<Pin::LocalVariable>]
130
+ def locals_at(location)
131
+ return [] if location.filename != filename
132
+ closure = locate_named_path_pin(location.range.start.line, location.range.start.character)
133
+ locals.select { |pin| pin.visible_at?(closure, location) }
134
+ end
135
+
136
+ class << self
137
+ # @param filename [String]
138
+ # @return [SourceMap]
139
+ def load filename
140
+ source = Solargraph::Source.load(filename)
141
+ SourceMap.map(source)
142
+ end
143
+
144
+ # @param code [String]
145
+ # @param filename [String, nil]
146
+ # @return [SourceMap]
147
+ def load_string code, filename = nil
148
+ source = Solargraph::Source.load_string(code, filename)
149
+ SourceMap.map(source)
150
+ end
151
+
152
+ # @param source [Source]
153
+ # @return [SourceMap]
154
+ def map source
155
+ result = SourceMap::Mapper.map(source)
156
+ new(source, *result)
157
+ end
158
+ end
159
+
160
+ private
161
+
162
+ # @param line [Integer]
163
+ # @param character [Integer]
164
+ # @param klasses [Array<Class>]
165
+ # @return [Pin::Base]
166
+ def _locate_pin line, character, *klasses
167
+ position = Position.new(line, character)
168
+ found = nil
169
+ pins.each do |pin|
170
+ # @todo Attribute pins should not be treated like closures, but
171
+ # there's probably a better way to handle it
172
+ next if pin.is_a?(Pin::Method) && pin.attribute?
173
+ found = pin if (klasses.empty? || klasses.any? { |kls| pin.is_a?(kls) } ) && pin.location.range.contain?(position)
174
+ break if pin.location.range.start.line > line
175
+ end
176
+ # Assuming the root pin is always valid
177
+ found || pins.first
178
+ end
179
+ end
180
+ end
@@ -1,99 +1,99 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- class TypeChecker
5
- # Helper methods for performing type checks
6
- #
7
- module Checks
8
- module_function
9
-
10
- # Compare an expected type with an inferred type. Common usage is to
11
- # check if the type declared in a method's @return tag matches the type
12
- # inferred from static analysis of the code.
13
- #
14
- # @param api_map [ApiMap]
15
- # @param expected [ComplexType]
16
- # @param inferred [ComplexType]
17
- # @return [Boolean]
18
- def types_match? api_map, expected, inferred
19
- return true if expected.to_s == inferred.to_s
20
- matches = []
21
- expected.each do |exp|
22
- found = false
23
- inferred.each do |inf|
24
- # if api_map.super_and_sub?(fuzz(inf), fuzz(exp))
25
- if either_way?(api_map, inf, exp)
26
- found = true
27
- matches.push inf
28
- break
29
- end
30
- end
31
- return false unless found
32
- end
33
- inferred.each do |inf|
34
- next if matches.include?(inf)
35
- found = false
36
- expected.each do |exp|
37
- # if api_map.super_and_sub?(fuzz(inf), fuzz(exp))
38
- if either_way?(api_map, inf, exp)
39
- found = true
40
- break
41
- end
42
- end
43
- return false unless found
44
- end
45
- true
46
- end
47
-
48
- # @param api_map [ApiMap]
49
- # @param expected [ComplexType]
50
- # @param inferred [ComplexType]
51
- # @return [Boolean]
52
- def any_types_match? api_map, expected, inferred
53
- return duck_types_match?(api_map, expected, inferred) if expected.duck_type?
54
- expected.each do |exp|
55
- next if exp.duck_type?
56
- inferred.each do |inf|
57
- # return true if exp == inf || api_map.super_and_sub?(fuzz(inf), fuzz(exp))
58
- return true if exp == inf || either_way?(api_map, inf, exp)
59
- end
60
- end
61
- false
62
- end
63
-
64
- # @param api_map [ApiMap]
65
- # @param expected [ComplexType]
66
- # @param inferred [ComplexType]
67
- # @return [Boolean]
68
- def duck_types_match? api_map, expected, inferred
69
- raise ArgumentError, 'Expected type must be duck type' unless expected.duck_type?
70
- expected.each do |exp|
71
- next unless exp.duck_type?
72
- quack = exp.to_s[1..-1]
73
- return false if api_map.get_method_stack(inferred.namespace, quack, scope: inferred.scope).empty?
74
- end
75
- true
76
- end
77
-
78
- # @param type [ComplexType::UniqueType]
79
- # @return [String]
80
- def fuzz type
81
- if type.parameters?
82
- type.name
83
- else
84
- type.tag
85
- end
86
- end
87
-
88
- # @param api_map [ApiMap]
89
- # @param cls1 [ComplexType::UniqueType]
90
- # @param cls2 [ComplexType::UniqueType]
91
- # @return [Boolean]
92
- def either_way?(api_map, cls1, cls2)
93
- f1 = fuzz(cls1)
94
- f2 = fuzz(cls2)
95
- api_map.type_include?(f1, f2) || api_map.super_and_sub?(f1, f2) || api_map.super_and_sub?(f2, f1)
96
- end
97
- end
98
- end
99
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ class TypeChecker
5
+ # Helper methods for performing type checks
6
+ #
7
+ module Checks
8
+ module_function
9
+
10
+ # Compare an expected type with an inferred type. Common usage is to
11
+ # check if the type declared in a method's @return tag matches the type
12
+ # inferred from static analysis of the code.
13
+ #
14
+ # @param api_map [ApiMap]
15
+ # @param expected [ComplexType]
16
+ # @param inferred [ComplexType]
17
+ # @return [Boolean]
18
+ def types_match? api_map, expected, inferred
19
+ return true if expected.to_s == inferred.to_s
20
+ matches = []
21
+ expected.each do |exp|
22
+ found = false
23
+ inferred.each do |inf|
24
+ # if api_map.super_and_sub?(fuzz(inf), fuzz(exp))
25
+ if either_way?(api_map, inf, exp)
26
+ found = true
27
+ matches.push inf
28
+ break
29
+ end
30
+ end
31
+ return false unless found
32
+ end
33
+ inferred.each do |inf|
34
+ next if matches.include?(inf)
35
+ found = false
36
+ expected.each do |exp|
37
+ # if api_map.super_and_sub?(fuzz(inf), fuzz(exp))
38
+ if either_way?(api_map, inf, exp)
39
+ found = true
40
+ break
41
+ end
42
+ end
43
+ return false unless found
44
+ end
45
+ true
46
+ end
47
+
48
+ # @param api_map [ApiMap]
49
+ # @param expected [ComplexType]
50
+ # @param inferred [ComplexType]
51
+ # @return [Boolean]
52
+ def any_types_match? api_map, expected, inferred
53
+ return duck_types_match?(api_map, expected, inferred) if expected.duck_type?
54
+ expected.each do |exp|
55
+ next if exp.duck_type?
56
+ inferred.each do |inf|
57
+ # return true if exp == inf || api_map.super_and_sub?(fuzz(inf), fuzz(exp))
58
+ return true if exp == inf || either_way?(api_map, inf, exp)
59
+ end
60
+ end
61
+ false
62
+ end
63
+
64
+ # @param api_map [ApiMap]
65
+ # @param expected [ComplexType]
66
+ # @param inferred [ComplexType]
67
+ # @return [Boolean]
68
+ def duck_types_match? api_map, expected, inferred
69
+ raise ArgumentError, 'Expected type must be duck type' unless expected.duck_type?
70
+ expected.each do |exp|
71
+ next unless exp.duck_type?
72
+ quack = exp.to_s[1..-1]
73
+ return false if api_map.get_method_stack(inferred.namespace, quack, scope: inferred.scope).empty?
74
+ end
75
+ true
76
+ end
77
+
78
+ # @param type [ComplexType::UniqueType]
79
+ # @return [String]
80
+ def fuzz type
81
+ if type.parameters?
82
+ type.name
83
+ else
84
+ type.tag
85
+ end
86
+ end
87
+
88
+ # @param api_map [ApiMap]
89
+ # @param cls1 [ComplexType::UniqueType]
90
+ # @param cls2 [ComplexType::UniqueType]
91
+ # @return [Boolean]
92
+ def either_way?(api_map, cls1, cls2)
93
+ f1 = fuzz(cls1)
94
+ f2 = fuzz(cls2)
95
+ api_map.type_include?(f1, f2) || api_map.super_and_sub?(f1, f2) || api_map.super_and_sub?(f2, f1)
96
+ end
97
+ end
98
+ end
99
+ end
@@ -1,35 +1,35 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- class TypeChecker
5
- # Data about a method parameter definition. This is the information from
6
- # the args list in the def call, not the `@param` tags.
7
- #
8
- class ParamDef
9
- # @return [String]
10
- attr_reader :name
11
-
12
- # @return [Symbol]
13
- attr_reader :type
14
-
15
- def initialize name, type
16
- @name = name
17
- @type = type
18
- end
19
-
20
- class << self
21
- # Get an array of ParamDefs from a method pin.
22
- #
23
- # @param pin [Solargraph::Pin::Method]
24
- # @return [Array<ParamDef>]
25
- def from pin
26
- result = []
27
- pin.parameters.each do |par|
28
- result.push ParamDef.new(par.name, par.decl)
29
- end
30
- result
31
- end
32
- end
33
- end
34
- end
35
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ class TypeChecker
5
+ # Data about a method parameter definition. This is the information from
6
+ # the args list in the def call, not the `@param` tags.
7
+ #
8
+ class ParamDef
9
+ # @return [String]
10
+ attr_reader :name
11
+
12
+ # @return [Symbol]
13
+ attr_reader :type
14
+
15
+ def initialize name, type
16
+ @name = name
17
+ @type = type
18
+ end
19
+
20
+ class << self
21
+ # Get an array of ParamDefs from a method pin.
22
+ #
23
+ # @param pin [Solargraph::Pin::Method]
24
+ # @return [Array<ParamDef>]
25
+ def from pin
26
+ result = []
27
+ pin.parameters.each do |par|
28
+ result.push ParamDef.new(par.name, par.decl)
29
+ end
30
+ result
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end