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,91 +1,91 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module Pin
5
- class Namespace < Closure
6
- # @return [::Symbol] :public or :private
7
- attr_reader :visibility
8
-
9
- # @return [::Symbol] :class or :module
10
- attr_reader :type
11
-
12
- # @param type [::Symbol] :class or :module
13
- # @param visibility [::Symbol] :public or :private
14
- # @param gates [Array<String>]
15
- def initialize type: :class, visibility: :public, gates: [''], **splat
16
- # super(location, namespace, name, comments)
17
- super(**splat)
18
- @type = type
19
- @visibility = visibility
20
- if name.start_with?('::')
21
- @name = name[2..-1]
22
- @closure = Solargraph::Pin::ROOT_PIN
23
- end
24
- @open_gates = gates
25
- if @name.include?('::')
26
- # In this case, a chained namespace was opened (e.g., Foo::Bar)
27
- # but Foo does not exist.
28
- parts = @name.split('::')
29
- @name = parts.pop
30
- closure_name = if [Solargraph::Pin::ROOT_PIN, nil].include?(closure)
31
- ''
32
- else
33
- closure.full_context.namespace + '::'
34
- end
35
- closure_name += parts.join('::')
36
- @closure = Pin::Namespace.new(name: closure_name, gates: [parts.join('::')])
37
- @context = nil
38
- end
39
- end
40
-
41
- def namespace
42
- context.namespace
43
- end
44
-
45
- def full_context
46
- @full_context ||= ComplexType.try_parse("#{type.to_s.capitalize}<#{path}>")
47
- end
48
-
49
- def binder
50
- full_context
51
- end
52
-
53
- def scope
54
- context.scope
55
- end
56
-
57
- def completion_item_kind
58
- (type == :class ? LanguageServer::CompletionItemKinds::CLASS : LanguageServer::CompletionItemKinds::MODULE)
59
- end
60
-
61
- # @return [Integer]
62
- def symbol_kind
63
- (type == :class ? LanguageServer::SymbolKinds::CLASS : LanguageServer::SymbolKinds::MODULE)
64
- end
65
-
66
- def path
67
- @path ||= (namespace.empty? ? '' : "#{namespace}::") + name
68
- end
69
-
70
- def return_type
71
- @return_type ||= ComplexType.try_parse( (type == :class ? 'Class' : 'Module') + "<#{path}>" )
72
- end
73
-
74
- def domains
75
- @domains ||= []
76
- end
77
-
78
- def typify api_map
79
- return_type
80
- end
81
-
82
- def gates
83
- @gates ||= if path.empty?
84
- @open_gates
85
- else
86
- [path] + @open_gates
87
- end
88
- end
89
- end
90
- end
91
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Pin
5
+ class Namespace < Closure
6
+ # @return [::Symbol] :public or :private
7
+ attr_reader :visibility
8
+
9
+ # @return [::Symbol] :class or :module
10
+ attr_reader :type
11
+
12
+ # @param type [::Symbol] :class or :module
13
+ # @param visibility [::Symbol] :public or :private
14
+ # @param gates [Array<String>]
15
+ def initialize type: :class, visibility: :public, gates: [''], **splat
16
+ # super(location, namespace, name, comments)
17
+ super(**splat)
18
+ @type = type
19
+ @visibility = visibility
20
+ if name.start_with?('::')
21
+ @name = name[2..-1]
22
+ @closure = Solargraph::Pin::ROOT_PIN
23
+ end
24
+ @open_gates = gates
25
+ if @name.include?('::')
26
+ # In this case, a chained namespace was opened (e.g., Foo::Bar)
27
+ # but Foo does not exist.
28
+ parts = @name.split('::')
29
+ @name = parts.pop
30
+ closure_name = if [Solargraph::Pin::ROOT_PIN, nil].include?(closure)
31
+ ''
32
+ else
33
+ closure.full_context.namespace + '::'
34
+ end
35
+ closure_name += parts.join('::')
36
+ @closure = Pin::Namespace.new(name: closure_name, gates: [parts.join('::')])
37
+ @context = nil
38
+ end
39
+ end
40
+
41
+ def namespace
42
+ context.namespace
43
+ end
44
+
45
+ def full_context
46
+ @full_context ||= ComplexType.try_parse("#{type.to_s.capitalize}<#{path}>")
47
+ end
48
+
49
+ def binder
50
+ full_context
51
+ end
52
+
53
+ def scope
54
+ context.scope
55
+ end
56
+
57
+ def completion_item_kind
58
+ (type == :class ? LanguageServer::CompletionItemKinds::CLASS : LanguageServer::CompletionItemKinds::MODULE)
59
+ end
60
+
61
+ # @return [Integer]
62
+ def symbol_kind
63
+ (type == :class ? LanguageServer::SymbolKinds::CLASS : LanguageServer::SymbolKinds::MODULE)
64
+ end
65
+
66
+ def path
67
+ @path ||= (namespace.empty? ? '' : "#{namespace}::") + name
68
+ end
69
+
70
+ def return_type
71
+ @return_type ||= ComplexType.try_parse( (type == :class ? 'Class' : 'Module') + "<#{path}>" )
72
+ end
73
+
74
+ def domains
75
+ @domains ||= []
76
+ end
77
+
78
+ def typify api_map
79
+ return_type
80
+ end
81
+
82
+ def gates
83
+ @gates ||= if path.empty?
84
+ @open_gates
85
+ else
86
+ [path] + @open_gates
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
@@ -1,206 +1,201 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module Pin
5
- class Parameter < LocalVariable
6
- attr_reader :decl
7
-
8
- attr_reader :asgn_code
9
-
10
- def initialize decl: :arg, asgn_code: nil, **splat
11
- super(**splat)
12
- @asgn_code = asgn_code
13
- @decl = decl
14
- end
15
-
16
- def keyword?
17
- [:kwarg, :kwoptarg].include?(decl)
18
- end
19
-
20
- def kwrestarg?
21
- decl == :kwrestarg || (assignment && [:HASH, :hash].include?(assignment.type))
22
- end
23
-
24
- def restarg?
25
- decl == :restarg
26
- end
27
-
28
- def rest?
29
- decl == :restarg || decl == :kwrestarg
30
- end
31
-
32
- def full
33
- case decl
34
- when :optarg
35
- "#{name} = #{asgn_code}"
36
- when :kwarg
37
- "#{name}:"
38
- when :kwoptarg
39
- "#{name}: #{asgn_code}"
40
- when :restarg
41
- "*#{name}"
42
- when :kwrestarg
43
- "**#{name}"
44
- when :block, :blockarg
45
- "&#{name}"
46
- else
47
- name
48
- end
49
- end
50
-
51
- def return_type
52
- if @return_type.nil?
53
- @return_type = ComplexType::UNDEFINED
54
- found = param_tag
55
- @return_type = ComplexType.try_parse(*found.types) unless found.nil? or found.types.nil?
56
- if @return_type.undefined?
57
- if decl == :restarg
58
- @return_type = ComplexType.try_parse('Array')
59
- elsif decl == :kwrestarg
60
- @return_type = ComplexType.try_parse('Hash')
61
- elsif decl == :blockarg
62
- @return_type = ComplexType.try_parse('Proc')
63
- end
64
- end
65
- end
66
- super
67
- @return_type
68
- end
69
-
70
- # The parameter's zero-based location in the block's signature.
71
- #
72
- # @return [Integer]
73
- def index
74
- closure.parameter_names.index(name)
75
- end
76
-
77
- # @param api_map [ApiMap]
78
- def typify api_map
79
- return return_type.qualify(api_map, closure.context.namespace) unless return_type.undefined?
80
- closure.is_a?(Pin::Block) ? typify_block_param(api_map) : typify_method_param(api_map)
81
- end
82
-
83
- def documentation
84
- tag = param_tag
85
- return '' if tag.nil? || tag.text.nil?
86
- tag.text
87
- end
88
-
89
- def try_merge! pin
90
- return false unless super && closure == pin.closure
91
- true
92
- end
93
-
94
- def probe api_map
95
- typify api_map
96
- end
97
-
98
- private
99
-
100
- # @return [YARD::Tags::Tag]
101
- def param_tag
102
- found = nil
103
- params = closure.docstring.tags(:param)
104
- params.each do |p|
105
- next unless p.name == name
106
- found = p
107
- break
108
- end
109
- if found.nil? and !index.nil?
110
- found = params[index] if params[index] && (params[index].name.nil? || params[index].name.empty?)
111
- end
112
- found
113
- end
114
-
115
- # @param api_map [ApiMap]
116
- # @return [ComplexType]
117
- def typify_block_param api_map
118
- if closure.is_a?(Pin::Block) && closure.receiver
119
- chain = Parser.chain(closure.receiver, filename)
120
- clip = api_map.clip_at(location.filename, location.range.start)
121
- locals = clip.locals - [self]
122
- meths = chain.define(api_map, closure, locals)
123
- meths.each do |meth|
124
- if meth.docstring.has_tag?(:yieldparam_single_parameter)
125
- type = chain.base.infer(api_map, closure, locals)
126
- if type.defined? && !type.subtypes.empty?
127
- bmeth = chain.base.define(api_map, closure, locals).first
128
- return type.subtypes.first.qualify(api_map, bmeth.context.namespace)
129
- end
130
- else
131
- yps = meth.docstring.tags(:yieldparam)
132
- unless yps[index].nil? or yps[index].types.nil? or yps[index].types.empty?
133
- return ComplexType.try_parse(yps[index].types.first).self_to(chain.base.infer(api_map, closure, locals).namespace).qualify(api_map, meth.context.namespace)
134
- end
135
- end
136
- end
137
- end
138
- ComplexType::UNDEFINED
139
- end
140
-
141
- # @param api_map [ApiMap]
142
- # @return [ComplexType]
143
- def typify_method_param api_map
144
- meths = api_map.get_method_stack(closure.full_context.namespace, closure.name, scope: closure.scope)
145
- # meths.shift # Ignore the first one
146
- meths.each do |meth|
147
- found = nil
148
- params = meth.docstring.tags(:param)
149
- if params.empty?
150
- params = see_reference(docstring, api_map)
151
- end
152
- params.each do |p|
153
- next unless p.name == name
154
- found = p
155
- break
156
- end
157
- if found.nil? and !index.nil?
158
- found = params[index] if params[index] && (params[index].name.nil? || params[index].name.empty?)
159
- end
160
- return ComplexType.try_parse(*found.types).qualify(api_map, meth.context.namespace) unless found.nil? || found.types.nil?
161
- end
162
- ComplexType::UNDEFINED
163
- end
164
-
165
- # @param heredoc [YARD::Docstring]
166
- # @param api_map [ApiMap]
167
- # @param skip [Array]
168
- # @return [Array<YARD::Tags::Tag>]
169
- def see_reference heredoc, api_map, skip = []
170
- heredoc.ref_tags.each do |ref|
171
- next unless ref.tag_name == 'param' && ref.owner
172
- result = resolve_reference(ref.owner.to_s, api_map, skip)
173
- return result unless result.nil?
174
- end
175
- []
176
- end
177
-
178
- # @param ref [String]
179
- # @param api_map [ApiMap]
180
- # @param skip [Array]
181
- # @return [Array<YARD::Tags::Tag>, nil]
182
- def resolve_reference ref, api_map, skip
183
- return nil if skip.include?(ref)
184
- skip.push ref
185
- parts = ref.split(/[\.#]/)
186
- if parts.first.empty?
187
- path = "#{namespace}#{ref}"
188
- else
189
- fqns = api_map.qualify(parts.first, namespace)
190
- return nil if fqns.nil?
191
- path = fqns + ref[parts.first.length] + parts.last
192
- end
193
- pins = api_map.get_path_pins(path)
194
- pins.each do |pin|
195
- params = pin.docstring.tags(:param)
196
- return params unless params.empty?
197
- end
198
- pins.each do |pin|
199
- params = see_reference(pin.docstring, api_map, skip)
200
- return params unless params.empty?
201
- end
202
- nil
203
- end
204
- end
205
- end
206
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Pin
5
+ class Parameter < LocalVariable
6
+ # @return [Symbol]
7
+ attr_reader :decl
8
+
9
+ # @return [String]
10
+ attr_reader :asgn_code
11
+
12
+ def initialize decl: :arg, asgn_code: nil, **splat
13
+ super(**splat)
14
+ @asgn_code = asgn_code
15
+ @decl = decl
16
+ end
17
+
18
+ def keyword?
19
+ [:kwarg, :kwoptarg].include?(decl)
20
+ end
21
+
22
+ def kwrestarg?
23
+ decl == :kwrestarg || (assignment && [:HASH, :hash].include?(assignment.type))
24
+ end
25
+
26
+ def restarg?
27
+ decl == :restarg
28
+ end
29
+
30
+ def rest?
31
+ decl == :restarg || decl == :kwrestarg
32
+ end
33
+
34
+ def full
35
+ case decl
36
+ when :optarg
37
+ "#{name} = #{asgn_code}"
38
+ when :kwarg
39
+ "#{name}:"
40
+ when :kwoptarg
41
+ "#{name}: #{asgn_code}"
42
+ when :restarg
43
+ "*#{name}"
44
+ when :kwrestarg
45
+ "**#{name}"
46
+ when :block, :blockarg
47
+ "&#{name}"
48
+ else
49
+ name
50
+ end
51
+ end
52
+
53
+ def return_type
54
+ if @return_type.nil?
55
+ @return_type = ComplexType::UNDEFINED
56
+ found = param_tag
57
+ @return_type = ComplexType.try_parse(*found.types) unless found.nil? or found.types.nil?
58
+ if @return_type.undefined?
59
+ if decl == :restarg
60
+ @return_type = ComplexType.try_parse('Array')
61
+ elsif decl == :kwrestarg
62
+ @return_type = ComplexType.try_parse('Hash')
63
+ elsif decl == :blockarg
64
+ @return_type = ComplexType.try_parse('Proc')
65
+ end
66
+ end
67
+ end
68
+ super
69
+ @return_type
70
+ end
71
+
72
+ # The parameter's zero-based location in the block's signature.
73
+ #
74
+ # @return [Integer]
75
+ def index
76
+ closure.parameter_names.index(name)
77
+ end
78
+
79
+ # @param api_map [ApiMap]
80
+ def typify api_map
81
+ return return_type.qualify(api_map, closure.context.namespace) unless return_type.undefined?
82
+ closure.is_a?(Pin::Block) ? typify_block_param(api_map) : typify_method_param(api_map)
83
+ end
84
+
85
+ def documentation
86
+ tag = param_tag
87
+ return '' if tag.nil? || tag.text.nil?
88
+ tag.text
89
+ end
90
+
91
+ def try_merge! pin
92
+ return false unless super && closure == pin.closure
93
+ true
94
+ end
95
+
96
+ private
97
+
98
+ # @return [YARD::Tags::Tag]
99
+ def param_tag
100
+ found = nil
101
+ params = closure.docstring.tags(:param)
102
+ params.each do |p|
103
+ next unless p.name == name
104
+ found = p
105
+ break
106
+ end
107
+ if found.nil? and !index.nil?
108
+ found = params[index] if params[index] && (params[index].name.nil? || params[index].name.empty?)
109
+ end
110
+ found
111
+ end
112
+
113
+ # @param api_map [ApiMap]
114
+ # @return [ComplexType]
115
+ def typify_block_param api_map
116
+ if closure.is_a?(Pin::Block) && closure.receiver
117
+ chain = Parser.chain(closure.receiver, filename)
118
+ clip = api_map.clip_at(location.filename, location.range.start)
119
+ locals = clip.locals - [self]
120
+ meths = chain.define(api_map, closure, locals)
121
+ meths.each do |meth|
122
+ if meth.docstring.has_tag?(:yieldparam_single_parameter)
123
+ type = chain.base.infer(api_map, closure, locals)
124
+ if type.defined? && !type.subtypes.empty?
125
+ bmeth = chain.base.define(api_map, closure, locals).first
126
+ return type.subtypes.first.qualify(api_map, bmeth.context.namespace)
127
+ end
128
+ else
129
+ yps = meth.docstring.tags(:yieldparam)
130
+ unless yps[index].nil? or yps[index].types.nil? or yps[index].types.empty?
131
+ return ComplexType.try_parse(yps[index].types.first).self_to(chain.base.infer(api_map, closure, locals).namespace).qualify(api_map, meth.context.namespace)
132
+ end
133
+ end
134
+ end
135
+ end
136
+ ComplexType::UNDEFINED
137
+ end
138
+
139
+ # @param api_map [ApiMap]
140
+ # @return [ComplexType]
141
+ def typify_method_param api_map
142
+ meths = api_map.get_method_stack(closure.full_context.namespace, closure.name, scope: closure.scope)
143
+ # meths.shift # Ignore the first one
144
+ meths.each do |meth|
145
+ found = nil
146
+ params = meth.docstring.tags(:param) + see_reference(docstring, api_map)
147
+ params.each do |p|
148
+ next unless p.name == name
149
+ found = p
150
+ break
151
+ end
152
+ if found.nil? and !index.nil?
153
+ found = params[index] if params[index] && (params[index].name.nil? || params[index].name.empty?)
154
+ end
155
+ return ComplexType.try_parse(*found.types).qualify(api_map, meth.context.namespace) unless found.nil? || found.types.nil?
156
+ end
157
+ ComplexType::UNDEFINED
158
+ end
159
+
160
+ # @param heredoc [YARD::Docstring]
161
+ # @param api_map [ApiMap]
162
+ # @param skip [Array]
163
+ # @return [Array<YARD::Tags::Tag>]
164
+ def see_reference heredoc, api_map, skip = []
165
+ heredoc.ref_tags.each do |ref|
166
+ next unless ref.tag_name == 'param' && ref.owner
167
+ result = resolve_reference(ref.owner.to_s, api_map, skip)
168
+ return result unless result.nil?
169
+ end
170
+ []
171
+ end
172
+
173
+ # @param ref [String]
174
+ # @param api_map [ApiMap]
175
+ # @param skip [Array]
176
+ # @return [Array<YARD::Tags::Tag>, nil]
177
+ def resolve_reference ref, api_map, skip
178
+ return nil if skip.include?(ref)
179
+ skip.push ref
180
+ parts = ref.split(/[\.#]/)
181
+ if parts.first.empty?
182
+ path = "#{namespace}#{ref}"
183
+ else
184
+ fqns = api_map.qualify(parts.first, namespace)
185
+ return nil if fqns.nil?
186
+ path = fqns + ref[parts.first.length] + parts.last
187
+ end
188
+ pins = api_map.get_path_pins(path)
189
+ pins.each do |pin|
190
+ params = pin.docstring.tags(:param)
191
+ return params unless params.empty?
192
+ end
193
+ pins.each do |pin|
194
+ params = see_reference(pin.docstring, api_map, skip)
195
+ return params unless params.empty?
196
+ end
197
+ nil
198
+ end
199
+ end
200
+ end
201
+ end
@@ -1,29 +1,29 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module Pin
5
- class ProxyType < Base
6
- # @param return_type [ComplexType]
7
- def initialize return_type: ComplexType::UNDEFINED, **splat
8
- super(**splat)
9
- @return_type = return_type
10
- end
11
-
12
- def context
13
- @return_type
14
- end
15
-
16
- # @param return_type [ComplexType]
17
- # @return [ProxyType]
18
- def self.anonymous return_type
19
- parts = return_type.namespace.split('::')
20
- namespace = parts[0..-2].join('::').to_s
21
- name = parts.last.to_s
22
- # ProxyType.new(nil, namespace, name, return_type)
23
- ProxyType.new(
24
- closure: Solargraph::Pin::Namespace.new(name: namespace), return_type: return_type
25
- )
26
- end
27
- end
28
- end
29
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Pin
5
+ class ProxyType < Base
6
+ # @param return_type [ComplexType]
7
+ def initialize return_type: ComplexType::UNDEFINED, **splat
8
+ super(**splat)
9
+ @return_type = return_type
10
+ end
11
+
12
+ def context
13
+ @return_type
14
+ end
15
+
16
+ # @param return_type [ComplexType]
17
+ # @return [ProxyType]
18
+ def self.anonymous return_type
19
+ parts = return_type.namespace.split('::')
20
+ namespace = parts[0..-2].join('::').to_s
21
+ name = parts.last.to_s
22
+ # ProxyType.new(nil, namespace, name, return_type)
23
+ ProxyType.new(
24
+ closure: Solargraph::Pin::Namespace.new(name: namespace), return_type: return_type
25
+ )
26
+ end
27
+ end
28
+ end
29
+ end