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,204 +1,204 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- class Source
5
- class Chain
6
- class Call < Link
7
- # @return [String]
8
- attr_reader :word
9
-
10
- # @return [Array<Chain>]
11
- attr_reader :arguments
12
-
13
- # @param word [String]
14
- # @param arguments [Array<Chain>]
15
- # @param with_block [Boolean] True if the chain is inside a block
16
- # @param head [Boolean] True if the call is the start of its chain
17
- def initialize word, arguments = [], with_block = false
18
- @word = word
19
- @arguments = arguments
20
- @with_block = with_block
21
- end
22
-
23
- def with_block?
24
- @with_block
25
- end
26
-
27
- # @param api_map [ApiMap]
28
- # @param name_pin [Pin::Base]
29
- # @param locals [Array<Pin::Base>]
30
- def resolve api_map, name_pin, locals
31
- return super_pins(api_map, name_pin) if word == 'super'
32
- found = if head?
33
- locals.select { |p| p.name == word }
34
- else
35
- []
36
- end
37
- return inferred_pins(found, api_map, name_pin.context, locals) unless found.empty?
38
- pins = api_map.get_method_stack(name_pin.binder.namespace, word, scope: name_pin.binder.scope)
39
- return [] if pins.empty?
40
- inferred_pins(pins, api_map, name_pin.context, locals)
41
- end
42
-
43
- private
44
-
45
- # @param pins [Array<Pin::Base>]
46
- # @param api_map [ApiMap]
47
- # @param context [ComplexType]
48
- # @param locals [Pin::LocalVariable]
49
- # @return [Array<Pin::Base>]
50
- def inferred_pins pins, api_map, context, locals
51
- result = pins.map do |p|
52
- overloads = p.docstring.tags(:overload)
53
- # next p if overloads.empty?
54
- type = ComplexType::UNDEFINED
55
- # @param [YARD::Tags::OverloadTag]
56
- overloads.each do |ol|
57
- next unless arguments_match(arguments, ol.parameters)
58
- next if ol.parameters.last && ol.parameters.last.first.start_with?('&') && ol.parameters.last.last.nil? && !with_block?
59
- match = true
60
- arguments.each_with_index do |arg, idx|
61
- achain = arguments[idx]
62
- next if achain.nil?
63
- param = ol.parameters[idx]
64
- if param.nil?
65
- match = false unless ol.parameters.last && ol.parameters.last.first.start_with?('*')
66
- break
67
- end
68
- par = ol.tags(:param).select { |pp| pp.name == param.first }.first
69
- next if par.nil? || par.types.nil? || par.types.empty?
70
- atype = achain.infer(api_map, Pin::ProxyType.anonymous(context), locals)
71
- other = ComplexType.try_parse(*par.types)
72
- # @todo Weak type comparison
73
- unless atype.tag == other.tag || api_map.super_and_sub?(other.tag, atype.tag)
74
- match = false
75
- break
76
- end
77
- end
78
- if match
79
- type = extra_return_type(ol, context)
80
- break if type
81
- type = ComplexType.try_parse(*ol.tag(:return).types).self_to(context.to_s).qualify(api_map, context.namespace) if ol.has_tag?(:return) && ol.tag(:return).types && !ol.tag(:return).types.empty? && (type.nil? || type.undefined?)
82
- type ||= ComplexType::UNDEFINED
83
- end
84
- break if type.defined?
85
- end
86
- next p.proxy(type) if type.defined?
87
- type = extra_return_type(p.docstring, context)
88
- if type
89
- next Solargraph::Pin::Method.new(
90
- location: p.location,
91
- closure: p.closure,
92
- name: p.name,
93
- comments: "@return [#{context.subtypes.first.to_s}]",
94
- scope: p.scope,
95
- visibility: p.visibility,
96
- parameters: p.parameters,
97
- node: p.node
98
- )
99
- end
100
- if p.is_a?(Pin::Method) && !p.macros.empty?
101
- result = process_macro(p, api_map, context, locals)
102
- next result unless result.return_type.undefined?
103
- elsif !p.directives.empty?
104
- result = process_directive(p, api_map, context, locals)
105
- next result unless result.return_type.undefined?
106
- end
107
- p
108
- end
109
- result.map do |pin|
110
- next pin if pin.return_type.undefined?
111
- selfy = pin.return_type.self_to(context.tag)
112
- selfy == pin.return_type ? pin : pin.proxy(selfy)
113
- end
114
- end
115
-
116
- # @param pin [Pin::Method]
117
- # @param api_map [ApiMap]
118
- # @param context [ComplexType]
119
- # @param locals [Pin::Base]
120
- # @return [Pin::Base]
121
- def process_macro pin, api_map, context, locals
122
- pin.macros.each do |macro|
123
- result = inner_process_macro(pin, macro, api_map, context, locals)
124
- return result unless result.return_type.undefined?
125
- end
126
- Pin::ProxyType.anonymous(ComplexType::UNDEFINED)
127
- end
128
-
129
- # @param pin [Pin::Method]
130
- # @param api_map [ApiMap]
131
- # @param context [ComplexType]
132
- # @param locals [Pin::Base]
133
- # @return [Pin::ProxyType]
134
- def process_directive pin, api_map, context, locals
135
- pin.directives.each do |dir|
136
- macro = api_map.named_macro(dir.tag.name)
137
- next if macro.nil?
138
- result = inner_process_macro(pin, macro, api_map, context, locals)
139
- return result unless result.return_type.undefined?
140
- end
141
- Pin::ProxyType.anonymous ComplexType::UNDEFINED
142
- end
143
-
144
- # @param pin [Pin]
145
- # @param macro [YARD::Tags::MacroDirective]
146
- # @param api_map [ApiMap]
147
- # @param context [ComplexType]
148
- # @param locals [Array<Pin::Base>]
149
- # @return [Pin::ProxyType]
150
- def inner_process_macro pin, macro, api_map, context, locals
151
- vals = arguments.map{ |c| Pin::ProxyType.anonymous(c.infer(api_map, pin, locals)) }
152
- txt = macro.tag.text.clone
153
- if txt.empty? && macro.tag.name
154
- named = api_map.named_macro(macro.tag.name)
155
- txt = named.tag.text.clone if named
156
- end
157
- i = 1
158
- vals.each do |v|
159
- txt.gsub!(/\$#{i}/, v.context.namespace)
160
- i += 1
161
- end
162
- docstring = Solargraph::Source.parse_docstring(txt).to_docstring
163
- tag = docstring.tag(:return)
164
- unless tag.nil? || tag.types.nil?
165
- return Pin::ProxyType.anonymous(ComplexType.try_parse(*tag.types))
166
- end
167
- Pin::ProxyType.anonymous(ComplexType::UNDEFINED)
168
- end
169
-
170
- # @param docstring [YARD::Docstring]
171
- # @param context [ComplexType]
172
- # @return [ComplexType]
173
- def extra_return_type docstring, context
174
- if docstring.has_tag?(:return_single_parameter) #&& context.subtypes.one?
175
- return context.subtypes.first || ComplexType::UNDEFINED
176
- elsif docstring.has_tag?(:return_value_parameter) && context.value_types.one?
177
- return context.value_types.first
178
- end
179
- nil
180
- end
181
-
182
- # @param arguments [Array<Chain>]
183
- # @param parameters [Array<String>]
184
- # @return [Boolean]
185
- def arguments_match arguments, parameters
186
- argcount = arguments.length
187
- # argcount -= 1 if !arguments.empty? && arguments.last.links.first.word.start_with?('&')
188
- parcount = parameters.length
189
- parcount -= 1 if !parameters.empty? && parameters.last.first.start_with?('&')
190
- return false if argcount < parcount && !(argcount == parcount - 1 && parameters.last.first.start_with?('*'))
191
- true
192
- end
193
-
194
- # @param api_map [ApiMap]
195
- # @param name_pin [Pin::Base]
196
- # @return [Array<Pin::Base>]
197
- def super_pins api_map, name_pin
198
- pins = api_map.get_method_stack(name_pin.namespace, name_pin.name, scope: name_pin.scope)
199
- pins.reject{|p| p.path == name_pin.path}
200
- end
201
- end
202
- end
203
- end
204
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ class Source
5
+ class Chain
6
+ class Call < Link
7
+ # @return [String]
8
+ attr_reader :word
9
+
10
+ # @return [Array<Chain>]
11
+ attr_reader :arguments
12
+
13
+ # @param word [String]
14
+ # @param arguments [Array<Chain>]
15
+ # @param with_block [Boolean] True if the chain is inside a block
16
+ # @param head [Boolean] True if the call is the start of its chain
17
+ def initialize word, arguments = [], with_block = false
18
+ @word = word
19
+ @arguments = arguments
20
+ @with_block = with_block
21
+ end
22
+
23
+ def with_block?
24
+ @with_block
25
+ end
26
+
27
+ # @param api_map [ApiMap]
28
+ # @param name_pin [Pin::Base]
29
+ # @param locals [Array<Pin::Base>]
30
+ def resolve api_map, name_pin, locals
31
+ return super_pins(api_map, name_pin) if word == 'super'
32
+ found = if head?
33
+ locals.select { |p| p.name == word }
34
+ else
35
+ []
36
+ end
37
+ return inferred_pins(found, api_map, name_pin.context, locals) unless found.empty?
38
+ pins = api_map.get_method_stack(name_pin.binder.namespace, word, scope: name_pin.binder.scope)
39
+ return [] if pins.empty?
40
+ inferred_pins(pins, api_map, name_pin.context, locals)
41
+ end
42
+
43
+ private
44
+
45
+ # @param pins [Array<Pin::Base>]
46
+ # @param api_map [ApiMap]
47
+ # @param context [ComplexType]
48
+ # @param locals [Pin::LocalVariable]
49
+ # @return [Array<Pin::Base>]
50
+ def inferred_pins pins, api_map, context, locals
51
+ result = pins.map do |p|
52
+ overloads = p.docstring.tags(:overload)
53
+ # next p if overloads.empty?
54
+ type = ComplexType::UNDEFINED
55
+ # @param [YARD::Tags::OverloadTag]
56
+ overloads.each do |ol|
57
+ next unless arguments_match(arguments, ol.parameters)
58
+ next if ol.parameters.last && ol.parameters.last.first.start_with?('&') && ol.parameters.last.last.nil? && !with_block?
59
+ match = true
60
+ arguments.each_with_index do |arg, idx|
61
+ achain = arguments[idx]
62
+ next if achain.nil?
63
+ param = ol.parameters[idx]
64
+ if param.nil?
65
+ match = false unless ol.parameters.last && ol.parameters.last.first.start_with?('*')
66
+ break
67
+ end
68
+ par = ol.tags(:param).select { |pp| pp.name == param.first }.first
69
+ next if par.nil? || par.types.nil? || par.types.empty?
70
+ atype = achain.infer(api_map, Pin::ProxyType.anonymous(context), locals)
71
+ other = ComplexType.try_parse(*par.types)
72
+ # @todo Weak type comparison
73
+ unless atype.tag == other.tag || api_map.super_and_sub?(other.tag, atype.tag)
74
+ match = false
75
+ break
76
+ end
77
+ end
78
+ if match
79
+ type = extra_return_type(ol, context)
80
+ break if type
81
+ type = ComplexType.try_parse(*ol.tag(:return).types).self_to(context.to_s).qualify(api_map, context.namespace) if ol.has_tag?(:return) && ol.tag(:return).types && !ol.tag(:return).types.empty? && (type.nil? || type.undefined?)
82
+ type ||= ComplexType::UNDEFINED
83
+ end
84
+ break if type.defined?
85
+ end
86
+ next p.proxy(type) if type.defined?
87
+ type = extra_return_type(p.docstring, context)
88
+ if type
89
+ next Solargraph::Pin::Method.new(
90
+ location: p.location,
91
+ closure: p.closure,
92
+ name: p.name,
93
+ comments: "@return [#{context.subtypes.first.to_s}]",
94
+ scope: p.scope,
95
+ visibility: p.visibility,
96
+ parameters: p.parameters,
97
+ node: p.node
98
+ )
99
+ end
100
+ if p.is_a?(Pin::Method) && !p.macros.empty?
101
+ result = process_macro(p, api_map, context, locals)
102
+ next result unless result.return_type.undefined?
103
+ elsif !p.directives.empty?
104
+ result = process_directive(p, api_map, context, locals)
105
+ next result unless result.return_type.undefined?
106
+ end
107
+ p
108
+ end
109
+ result.map do |pin|
110
+ next pin if pin.return_type.undefined?
111
+ selfy = pin.return_type.self_to(context.tag)
112
+ selfy == pin.return_type ? pin : pin.proxy(selfy)
113
+ end
114
+ end
115
+
116
+ # @param pin [Pin::Method]
117
+ # @param api_map [ApiMap]
118
+ # @param context [ComplexType]
119
+ # @param locals [Pin::Base]
120
+ # @return [Pin::Base]
121
+ def process_macro pin, api_map, context, locals
122
+ pin.macros.each do |macro|
123
+ result = inner_process_macro(pin, macro, api_map, context, locals)
124
+ return result unless result.return_type.undefined?
125
+ end
126
+ Pin::ProxyType.anonymous(ComplexType::UNDEFINED)
127
+ end
128
+
129
+ # @param pin [Pin::Method]
130
+ # @param api_map [ApiMap]
131
+ # @param context [ComplexType]
132
+ # @param locals [Pin::Base]
133
+ # @return [Pin::ProxyType]
134
+ def process_directive pin, api_map, context, locals
135
+ pin.directives.each do |dir|
136
+ macro = api_map.named_macro(dir.tag.name)
137
+ next if macro.nil?
138
+ result = inner_process_macro(pin, macro, api_map, context, locals)
139
+ return result unless result.return_type.undefined?
140
+ end
141
+ Pin::ProxyType.anonymous ComplexType::UNDEFINED
142
+ end
143
+
144
+ # @param pin [Pin]
145
+ # @param macro [YARD::Tags::MacroDirective]
146
+ # @param api_map [ApiMap]
147
+ # @param context [ComplexType]
148
+ # @param locals [Array<Pin::Base>]
149
+ # @return [Pin::ProxyType]
150
+ def inner_process_macro pin, macro, api_map, context, locals
151
+ vals = arguments.map{ |c| Pin::ProxyType.anonymous(c.infer(api_map, pin, locals)) }
152
+ txt = macro.tag.text.clone
153
+ if txt.empty? && macro.tag.name
154
+ named = api_map.named_macro(macro.tag.name)
155
+ txt = named.tag.text.clone if named
156
+ end
157
+ i = 1
158
+ vals.each do |v|
159
+ txt.gsub!(/\$#{i}/, v.context.namespace)
160
+ i += 1
161
+ end
162
+ docstring = Solargraph::Source.parse_docstring(txt).to_docstring
163
+ tag = docstring.tag(:return)
164
+ unless tag.nil? || tag.types.nil?
165
+ return Pin::ProxyType.anonymous(ComplexType.try_parse(*tag.types))
166
+ end
167
+ Pin::ProxyType.anonymous(ComplexType::UNDEFINED)
168
+ end
169
+
170
+ # @param docstring [YARD::Docstring]
171
+ # @param context [ComplexType]
172
+ # @return [ComplexType]
173
+ def extra_return_type docstring, context
174
+ if docstring.has_tag?(:return_single_parameter) #&& context.subtypes.one?
175
+ return context.subtypes.first || ComplexType::UNDEFINED
176
+ elsif docstring.has_tag?(:return_value_parameter) && context.value_types.one?
177
+ return context.value_types.first
178
+ end
179
+ nil
180
+ end
181
+
182
+ # @param arguments [Array<Chain>]
183
+ # @param parameters [Array<String>]
184
+ # @return [Boolean]
185
+ def arguments_match arguments, parameters
186
+ argcount = arguments.length
187
+ # argcount -= 1 if !arguments.empty? && arguments.last.links.first.word.start_with?('&')
188
+ parcount = parameters.length
189
+ parcount -= 1 if !parameters.empty? && parameters.last.first.start_with?('&')
190
+ return false if argcount < parcount && !(argcount == parcount - 1 && parameters.last.first.start_with?('*'))
191
+ true
192
+ end
193
+
194
+ # @param api_map [ApiMap]
195
+ # @param name_pin [Pin::Base]
196
+ # @return [Array<Pin::Base>]
197
+ def super_pins api_map, name_pin
198
+ pins = api_map.get_method_stack(name_pin.namespace, name_pin.name, scope: name_pin.scope)
199
+ pins.reject{|p| p.path == name_pin.path}
200
+ end
201
+ end
202
+ end
203
+ end
204
+ end
@@ -1,13 +1,13 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- class Source
5
- class Chain
6
- class ClassVariable < Link
7
- def resolve api_map, name_pin, locals
8
- api_map.get_class_variable_pins(name_pin.context.namespace).select{|p| p.name == word}
9
- end
10
- end
11
- end
12
- end
13
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ class Source
5
+ class Chain
6
+ class ClassVariable < Link
7
+ def resolve api_map, name_pin, locals
8
+ api_map.get_class_variable_pins(name_pin.context.namespace).select{|p| p.name == word}
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -1,75 +1,75 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- class Source
5
- class Chain
6
- class Constant < Link
7
- def initialize word
8
- @word = word
9
- end
10
-
11
- def resolve api_map, name_pin, locals
12
- return [Pin::ROOT_PIN] if word.empty?
13
- if word.start_with?('::')
14
- base = word[2..-1]
15
- gates = ['']
16
- else
17
- base = word
18
- gates = crawl_gates(name_pin)
19
- end
20
- parts = base.split('::')
21
- gates.each do |gate|
22
- type = deep_constant_type(gate, api_map)
23
- # Use deep inference to resolve root
24
- parts[0..-2].each do |sym|
25
- pins = api_map.get_constants('', type.namespace).select{ |pin| pin.name == sym }
26
- type = first_pin_type(pins, api_map)
27
- break if type.undefined?
28
- end
29
- next if type.undefined?
30
- result = api_map.get_constants('', type.namespace).select { |pin| pin.name == parts.last }
31
- return result unless result.empty?
32
- end
33
- []
34
- end
35
-
36
- private
37
-
38
- def crawl_gates pin
39
- clos = pin
40
- until clos.nil?
41
- if clos.is_a?(Pin::Namespace)
42
- gates = clos.gates
43
- gates.push('') if gates.empty?
44
- return gates
45
- end
46
- clos = clos.closure
47
- end
48
- ['']
49
- end
50
-
51
- def first_pin_type(pins, api_map)
52
- type = ComplexType::UNDEFINED
53
- pins.each do |pin|
54
- type = pin.typify(api_map)
55
- break if type.defined?
56
- type = pin.probe(api_map)
57
- break if type.defined?
58
- end
59
- type
60
- end
61
-
62
- def deep_constant_type(gate, api_map)
63
- type = ComplexType::ROOT
64
- return type if gate == ''
65
- gate.split('::').each do |word|
66
- pins = api_map.get_constants('', type.namespace).select { |pin| pin.name == word }
67
- type = first_pin_type(pins, api_map)
68
- break if type.undefined?
69
- end
70
- type
71
- end
72
- end
73
- end
74
- end
75
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ class Source
5
+ class Chain
6
+ class Constant < Link
7
+ def initialize word
8
+ @word = word
9
+ end
10
+
11
+ def resolve api_map, name_pin, locals
12
+ return [Pin::ROOT_PIN] if word.empty?
13
+ if word.start_with?('::')
14
+ base = word[2..-1]
15
+ gates = ['']
16
+ else
17
+ base = word
18
+ gates = crawl_gates(name_pin)
19
+ end
20
+ parts = base.split('::')
21
+ gates.each do |gate|
22
+ type = deep_constant_type(gate, api_map)
23
+ # Use deep inference to resolve root
24
+ parts[0..-2].each do |sym|
25
+ pins = api_map.get_constants('', type.namespace).select{ |pin| pin.name == sym }
26
+ type = first_pin_type(pins, api_map)
27
+ break if type.undefined?
28
+ end
29
+ next if type.undefined?
30
+ result = api_map.get_constants('', type.namespace).select { |pin| pin.name == parts.last }
31
+ return result unless result.empty?
32
+ end
33
+ []
34
+ end
35
+
36
+ private
37
+
38
+ def crawl_gates pin
39
+ clos = pin
40
+ until clos.nil?
41
+ if clos.is_a?(Pin::Namespace)
42
+ gates = clos.gates
43
+ gates.push('') if gates.empty?
44
+ return gates
45
+ end
46
+ clos = clos.closure
47
+ end
48
+ ['']
49
+ end
50
+
51
+ def first_pin_type(pins, api_map)
52
+ type = ComplexType::UNDEFINED
53
+ pins.each do |pin|
54
+ type = pin.typify(api_map)
55
+ break if type.defined?
56
+ type = pin.probe(api_map)
57
+ break if type.defined?
58
+ end
59
+ type
60
+ end
61
+
62
+ def deep_constant_type(gate, api_map)
63
+ type = ComplexType::ROOT
64
+ return type if gate == ''
65
+ gate.split('::').each do |word|
66
+ pins = api_map.get_constants('', type.namespace).select { |pin| pin.name == word }
67
+ type = first_pin_type(pins, api_map)
68
+ break if type.undefined?
69
+ end
70
+ type
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
@@ -1,13 +1,13 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- class Source
5
- class Chain
6
- class GlobalVariable < Link
7
- def resolve api_map, name_pin, locals
8
- api_map.get_global_variable_pins.select{|p| p.name == word}
9
- end
10
- end
11
- end
12
- end
13
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ class Source
5
+ class Chain
6
+ class GlobalVariable < Link
7
+ def resolve api_map, name_pin, locals
8
+ api_map.get_global_variable_pins.select{|p| p.name == word}
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -1,28 +1,28 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- class Source
5
- class Chain
6
- class Hash < Literal
7
- # @param type [String]
8
- # @param splatted [Boolean]
9
- def initialize type, splatted = false
10
- super(type)
11
- @splatted = splatted
12
- end
13
-
14
- def word
15
- @word ||= "<#{@type}>"
16
- end
17
-
18
- def resolve api_map, name_pin, locals
19
- [Pin::ProxyType.anonymous(@complex_type)]
20
- end
21
-
22
- def splatted?
23
- @splatted
24
- end
25
- end
26
- end
27
- end
28
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ class Source
5
+ class Chain
6
+ class Hash < Literal
7
+ # @param type [String]
8
+ # @param splatted [Boolean]
9
+ def initialize type, splatted = false
10
+ super(type)
11
+ @splatted = splatted
12
+ end
13
+
14
+ def word
15
+ @word ||= "<#{@type}>"
16
+ end
17
+
18
+ def resolve api_map, name_pin, locals
19
+ [Pin::ProxyType.anonymous(@complex_type)]
20
+ end
21
+
22
+ def splatted?
23
+ @splatted
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end