solargraph 0.50.0 → 0.58.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (264) hide show
  1. checksums.yaml +4 -4
  2. data/.gitattributes +2 -0
  3. data/.github/workflows/linting.yml +127 -0
  4. data/.github/workflows/plugins.yml +218 -0
  5. data/.github/workflows/rspec.yml +58 -12
  6. data/.github/workflows/typecheck.yml +39 -0
  7. data/.gitignore +8 -0
  8. data/.overcommit.yml +72 -0
  9. data/.rspec +1 -0
  10. data/.rubocop.yml +66 -0
  11. data/.rubocop_todo.yml +1279 -0
  12. data/.yardopts +3 -2
  13. data/CHANGELOG.md +306 -3
  14. data/README.md +29 -18
  15. data/Rakefile +125 -13
  16. data/SPONSORS.md +2 -9
  17. data/bin/solargraph +3 -0
  18. data/lib/solargraph/api_map/cache.rb +110 -70
  19. data/lib/solargraph/api_map/constants.rb +279 -0
  20. data/lib/solargraph/api_map/index.rb +193 -0
  21. data/lib/solargraph/api_map/source_to_yard.rb +97 -81
  22. data/lib/solargraph/api_map/store.rb +384 -268
  23. data/lib/solargraph/api_map.rb +945 -704
  24. data/lib/solargraph/bench.rb +21 -3
  25. data/lib/solargraph/complex_type/type_methods.rb +228 -134
  26. data/lib/solargraph/complex_type/unique_type.rb +482 -132
  27. data/lib/solargraph/complex_type.rb +444 -254
  28. data/lib/solargraph/convention/active_support_concern.rb +111 -0
  29. data/lib/solargraph/convention/base.rb +20 -3
  30. data/lib/solargraph/convention/data_definition/data_assignment_node.rb +61 -0
  31. data/lib/solargraph/convention/data_definition/data_definition_node.rb +91 -0
  32. data/lib/solargraph/convention/data_definition.rb +105 -0
  33. data/lib/solargraph/convention/gemspec.rb +3 -2
  34. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +61 -0
  35. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +102 -0
  36. data/lib/solargraph/convention/struct_definition.rb +164 -0
  37. data/lib/solargraph/convention.rb +36 -7
  38. data/lib/solargraph/converters/dd.rb +5 -0
  39. data/lib/solargraph/converters/dl.rb +3 -0
  40. data/lib/solargraph/converters/dt.rb +3 -0
  41. data/lib/solargraph/diagnostics/require_not_found.rb +53 -53
  42. data/lib/solargraph/diagnostics/rubocop.rb +118 -112
  43. data/lib/solargraph/diagnostics/rubocop_helpers.rb +68 -65
  44. data/lib/solargraph/diagnostics/type_check.rb +55 -54
  45. data/lib/solargraph/diagnostics.rb +2 -2
  46. data/lib/solargraph/doc_map.rb +439 -0
  47. data/lib/solargraph/environ.rb +9 -2
  48. data/lib/solargraph/equality.rb +34 -0
  49. data/lib/solargraph/gem_pins.rb +98 -0
  50. data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
  51. data/lib/solargraph/language_server/host/dispatch.rb +130 -111
  52. data/lib/solargraph/language_server/host/message_worker.rb +112 -59
  53. data/lib/solargraph/language_server/host/sources.rb +99 -156
  54. data/lib/solargraph/language_server/host.rb +878 -869
  55. data/lib/solargraph/language_server/message/base.rb +20 -12
  56. data/lib/solargraph/language_server/message/completion_item/resolve.rb +3 -1
  57. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +114 -100
  58. data/lib/solargraph/language_server/message/extended/document.rb +23 -20
  59. data/lib/solargraph/language_server/message/extended/document_gems.rb +3 -3
  60. data/lib/solargraph/language_server/message/initialize.rb +28 -1
  61. data/lib/solargraph/language_server/message/initialized.rb +1 -0
  62. data/lib/solargraph/language_server/message/text_document/completion.rb +56 -59
  63. data/lib/solargraph/language_server/message/text_document/definition.rb +40 -38
  64. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +26 -23
  65. data/lib/solargraph/language_server/message/text_document/formatting.rb +148 -126
  66. data/lib/solargraph/language_server/message/text_document/hover.rb +58 -56
  67. data/lib/solargraph/language_server/message/text_document/signature_help.rb +24 -24
  68. data/lib/solargraph/language_server/message/text_document/type_definition.rb +25 -0
  69. data/lib/solargraph/language_server/message/text_document.rb +1 -1
  70. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +5 -0
  71. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +2 -0
  72. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +23 -23
  73. data/lib/solargraph/language_server/message.rb +1 -0
  74. data/lib/solargraph/language_server/progress.rb +143 -0
  75. data/lib/solargraph/language_server/request.rb +4 -1
  76. data/lib/solargraph/language_server/transport/adapter.rb +16 -1
  77. data/lib/solargraph/language_server/transport/data_reader.rb +2 -0
  78. data/lib/solargraph/language_server.rb +1 -0
  79. data/lib/solargraph/library.rb +683 -551
  80. data/lib/solargraph/location.rb +82 -37
  81. data/lib/solargraph/logging.rb +37 -27
  82. data/lib/solargraph/page.rb +9 -0
  83. data/lib/solargraph/parser/comment_ripper.rb +69 -52
  84. data/lib/solargraph/parser/flow_sensitive_typing.rb +255 -0
  85. data/lib/solargraph/parser/node_processor/base.rb +92 -77
  86. data/lib/solargraph/parser/node_processor.rb +62 -43
  87. data/lib/solargraph/parser/{legacy → parser_gem}/class_methods.rb +149 -135
  88. data/lib/solargraph/parser/{legacy → parser_gem}/flawed_builder.rb +4 -1
  89. data/lib/solargraph/parser/{legacy → parser_gem}/node_chainer.rb +166 -148
  90. data/lib/solargraph/parser/{legacy → parser_gem}/node_methods.rb +486 -325
  91. data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/alias_node.rb +3 -2
  92. data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +22 -0
  93. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +59 -0
  94. data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/begin_node.rb +15 -15
  95. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/block_node.rb +46 -42
  96. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/casgn_node.rb +4 -3
  97. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/cvasgn_node.rb +3 -2
  98. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/def_node.rb +53 -63
  99. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/defs_node.rb +4 -3
  100. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/gvasgn_node.rb +3 -2
  101. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +23 -0
  102. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/ivasgn_node.rb +40 -38
  103. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/lvasgn_node.rb +29 -28
  104. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +59 -0
  105. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/namespace_node.rb +10 -9
  106. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +98 -0
  107. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/orasgn_node.rb +17 -16
  108. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/resbody_node.rb +38 -36
  109. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/sclass_node.rb +52 -42
  110. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/send_node.rb +291 -257
  111. data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/sym_node.rb +4 -2
  112. data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +29 -0
  113. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +29 -0
  114. data/lib/solargraph/parser/parser_gem/node_processors.rb +70 -0
  115. data/lib/solargraph/parser/parser_gem.rb +12 -0
  116. data/lib/solargraph/parser/region.rb +69 -66
  117. data/lib/solargraph/parser/snippet.rb +17 -13
  118. data/lib/solargraph/parser.rb +9 -12
  119. data/lib/solargraph/pin/base.rb +729 -299
  120. data/lib/solargraph/pin/base_variable.rb +126 -84
  121. data/lib/solargraph/pin/block.rb +104 -73
  122. data/lib/solargraph/pin/breakable.rb +9 -0
  123. data/lib/solargraph/pin/callable.rb +231 -0
  124. data/lib/solargraph/pin/closure.rb +72 -37
  125. data/lib/solargraph/pin/common.rb +79 -70
  126. data/lib/solargraph/pin/constant.rb +2 -0
  127. data/lib/solargraph/pin/conversions.rb +123 -92
  128. data/lib/solargraph/pin/delegated_method.rb +120 -0
  129. data/lib/solargraph/pin/documenting.rb +114 -105
  130. data/lib/solargraph/pin/instance_variable.rb +34 -30
  131. data/lib/solargraph/pin/keyword.rb +20 -15
  132. data/lib/solargraph/pin/local_variable.rb +75 -55
  133. data/lib/solargraph/pin/method.rb +672 -335
  134. data/lib/solargraph/pin/method_alias.rb +34 -31
  135. data/lib/solargraph/pin/namespace.rb +115 -94
  136. data/lib/solargraph/pin/parameter.rb +275 -206
  137. data/lib/solargraph/pin/proxy_type.rb +39 -29
  138. data/lib/solargraph/pin/reference/override.rb +47 -29
  139. data/lib/solargraph/pin/reference/require.rb +2 -2
  140. data/lib/solargraph/pin/reference/superclass.rb +15 -10
  141. data/lib/solargraph/pin/reference.rb +39 -14
  142. data/lib/solargraph/pin/search.rb +61 -56
  143. data/lib/solargraph/pin/signature.rb +61 -23
  144. data/lib/solargraph/pin/singleton.rb +1 -1
  145. data/lib/solargraph/pin/symbol.rb +53 -47
  146. data/lib/solargraph/pin/until.rb +18 -0
  147. data/lib/solargraph/pin/while.rb +18 -0
  148. data/lib/solargraph/pin.rb +44 -38
  149. data/lib/solargraph/pin_cache.rb +245 -0
  150. data/lib/solargraph/position.rb +132 -100
  151. data/lib/solargraph/range.rb +112 -95
  152. data/lib/solargraph/rbs_map/conversions.rb +823 -394
  153. data/lib/solargraph/rbs_map/core_fills.rb +53 -30
  154. data/lib/solargraph/rbs_map/core_map.rb +58 -38
  155. data/lib/solargraph/rbs_map/stdlib_map.rb +43 -36
  156. data/lib/solargraph/rbs_map.rb +163 -73
  157. data/lib/solargraph/shell.rb +352 -244
  158. data/lib/solargraph/source/chain/array.rb +37 -0
  159. data/lib/solargraph/source/chain/block_symbol.rb +13 -0
  160. data/lib/solargraph/source/chain/block_variable.rb +1 -1
  161. data/lib/solargraph/source/chain/call.rb +337 -215
  162. data/lib/solargraph/source/chain/constant.rb +26 -75
  163. data/lib/solargraph/source/chain/hash.rb +34 -28
  164. data/lib/solargraph/source/chain/head.rb +1 -1
  165. data/lib/solargraph/source/chain/if.rb +28 -0
  166. data/lib/solargraph/source/chain/instance_variable.rb +13 -13
  167. data/lib/solargraph/source/chain/link.rb +44 -6
  168. data/lib/solargraph/source/chain/literal.rb +48 -23
  169. data/lib/solargraph/source/chain/or.rb +23 -23
  170. data/lib/solargraph/source/chain/z_super.rb +4 -4
  171. data/lib/solargraph/source/chain.rb +291 -179
  172. data/lib/solargraph/source/change.rb +82 -79
  173. data/lib/solargraph/source/cursor.rb +166 -164
  174. data/lib/solargraph/source/encoding_fixes.rb +23 -23
  175. data/lib/solargraph/source/source_chainer.rb +194 -191
  176. data/lib/solargraph/source/updater.rb +55 -54
  177. data/lib/solargraph/source.rb +498 -522
  178. data/lib/solargraph/source_map/clip.rb +226 -229
  179. data/lib/solargraph/source_map/data.rb +34 -0
  180. data/lib/solargraph/source_map/mapper.rb +259 -243
  181. data/lib/solargraph/source_map.rb +212 -180
  182. data/lib/solargraph/type_checker/checks.rb +124 -112
  183. data/lib/solargraph/type_checker/param_def.rb +37 -35
  184. data/lib/solargraph/type_checker/problem.rb +32 -32
  185. data/lib/solargraph/type_checker/rules.rb +84 -57
  186. data/lib/solargraph/type_checker.rb +814 -549
  187. data/lib/solargraph/version.rb +5 -5
  188. data/lib/solargraph/views/_method.erb +10 -10
  189. data/lib/solargraph/views/_namespace.erb +3 -3
  190. data/lib/solargraph/views/document.erb +10 -10
  191. data/lib/solargraph/views/environment.erb +3 -5
  192. data/lib/solargraph/workspace/config.rb +255 -231
  193. data/lib/solargraph/workspace/require_paths.rb +97 -0
  194. data/lib/solargraph/workspace.rb +220 -212
  195. data/lib/solargraph/yard_map/cache.rb +6 -0
  196. data/lib/solargraph/yard_map/helpers.rb +44 -16
  197. data/lib/solargraph/yard_map/mapper/to_constant.rb +8 -5
  198. data/lib/solargraph/yard_map/mapper/to_method.rb +130 -81
  199. data/lib/solargraph/yard_map/mapper/to_namespace.rb +31 -27
  200. data/lib/solargraph/yard_map/mapper.rb +79 -77
  201. data/lib/solargraph/yard_map/to_method.rb +89 -79
  202. data/lib/solargraph/yard_map.rb +1 -284
  203. data/lib/solargraph/yard_tags.rb +20 -0
  204. data/lib/solargraph/yardoc.rb +87 -0
  205. data/lib/solargraph.rb +105 -69
  206. data/rbs/fills/bundler/0/bundler.rbs +4271 -0
  207. data/rbs/fills/open3/0/open3.rbs +172 -0
  208. data/rbs/fills/rubygems/0/basic_specification.rbs +326 -0
  209. data/rbs/fills/rubygems/0/errors.rbs +364 -0
  210. data/rbs/fills/rubygems/0/spec_fetcher.rbs +107 -0
  211. data/rbs/fills/rubygems/0/specification.rbs +1753 -0
  212. data/rbs/fills/tuple/tuple.rbs +149 -0
  213. data/rbs/shims/ast/0/node.rbs +5 -0
  214. data/rbs/shims/ast/2.4/.rbs_meta.yaml +9 -0
  215. data/rbs/shims/ast/2.4/ast.rbs +73 -0
  216. data/rbs/shims/parser/3.2.0.1/builders/default.rbs +195 -0
  217. data/rbs/shims/parser/3.2.0.1/manifest.yaml +7 -0
  218. data/rbs/shims/parser/3.2.0.1/parser.rbs +201 -0
  219. data/rbs/shims/parser/3.2.0.1/polyfill.rbs +4 -0
  220. data/rbs/shims/thor/1.2.0.1/.rbs_meta.yaml +9 -0
  221. data/rbs/shims/thor/1.2.0.1/manifest.yaml +7 -0
  222. data/rbs/shims/thor/1.2.0.1/thor.rbs +17 -0
  223. data/rbs_collection.yaml +19 -0
  224. data/solargraph.gemspec +39 -11
  225. metadata +354 -97
  226. data/lib/.rubocop.yml +0 -22
  227. data/lib/solargraph/api_map/bundler_methods.rb +0 -22
  228. data/lib/solargraph/cache.rb +0 -53
  229. data/lib/solargraph/convention/rspec.rb +0 -30
  230. data/lib/solargraph/documentor.rb +0 -76
  231. data/lib/solargraph/language_server/host/cataloger.rb +0 -56
  232. data/lib/solargraph/parser/legacy/node_processors/alias_node.rb +0 -23
  233. data/lib/solargraph/parser/legacy/node_processors/args_node.rb +0 -35
  234. data/lib/solargraph/parser/legacy/node_processors/begin_node.rb +0 -15
  235. data/lib/solargraph/parser/legacy/node_processors/sym_node.rb +0 -18
  236. data/lib/solargraph/parser/legacy/node_processors.rb +0 -54
  237. data/lib/solargraph/parser/legacy.rb +0 -12
  238. data/lib/solargraph/parser/node_methods.rb +0 -43
  239. data/lib/solargraph/parser/rubyvm/class_methods.rb +0 -149
  240. data/lib/solargraph/parser/rubyvm/node_chainer.rb +0 -160
  241. data/lib/solargraph/parser/rubyvm/node_methods.rb +0 -315
  242. data/lib/solargraph/parser/rubyvm/node_processors/args_node.rb +0 -85
  243. data/lib/solargraph/parser/rubyvm/node_processors/block_node.rb +0 -42
  244. data/lib/solargraph/parser/rubyvm/node_processors/casgn_node.rb +0 -33
  245. data/lib/solargraph/parser/rubyvm/node_processors/cvasgn_node.rb +0 -23
  246. data/lib/solargraph/parser/rubyvm/node_processors/def_node.rb +0 -75
  247. data/lib/solargraph/parser/rubyvm/node_processors/defs_node.rb +0 -68
  248. data/lib/solargraph/parser/rubyvm/node_processors/gvasgn_node.rb +0 -23
  249. data/lib/solargraph/parser/rubyvm/node_processors/ivasgn_node.rb +0 -38
  250. data/lib/solargraph/parser/rubyvm/node_processors/kw_arg_node.rb +0 -39
  251. data/lib/solargraph/parser/rubyvm/node_processors/lit_node.rb +0 -20
  252. data/lib/solargraph/parser/rubyvm/node_processors/lvasgn_node.rb +0 -27
  253. data/lib/solargraph/parser/rubyvm/node_processors/namespace_node.rb +0 -39
  254. data/lib/solargraph/parser/rubyvm/node_processors/opt_arg_node.rb +0 -26
  255. data/lib/solargraph/parser/rubyvm/node_processors/orasgn_node.rb +0 -15
  256. data/lib/solargraph/parser/rubyvm/node_processors/resbody_node.rb +0 -45
  257. data/lib/solargraph/parser/rubyvm/node_processors/sclass_node.rb +0 -32
  258. data/lib/solargraph/parser/rubyvm/node_processors/scope_node.rb +0 -15
  259. data/lib/solargraph/parser/rubyvm/node_processors/send_node.rb +0 -279
  260. data/lib/solargraph/parser/rubyvm/node_processors.rb +0 -63
  261. data/lib/solargraph/parser/rubyvm/node_wrapper.rb +0 -47
  262. data/lib/solargraph/parser/rubyvm.rb +0 -40
  263. data/lib/solargraph/rbs_map/core_signs.rb +0 -33
  264. data/lib/yard-solargraph.rb +0 -33
@@ -1,37 +1,72 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module Pin
5
- class Closure < Base
6
- # @return [::Symbol] :class or :instance
7
- attr_reader :scope
8
-
9
- def initialize scope: :class, **splat
10
- super(**splat)
11
- @scope = scope
12
- end
13
-
14
- def context
15
- @context ||= begin
16
- result = super
17
- if scope == :instance
18
- Solargraph::ComplexType.parse(result.namespace)
19
- else
20
- result
21
- end
22
- end
23
- end
24
-
25
- def binder
26
- @binder || context
27
- end
28
-
29
- # @return [Array<String>]
30
- def gates
31
- # @todo This check might not be necessary. There should always be a
32
- # root pin
33
- closure ? closure.gates : ['']
34
- end
35
- end
36
- end
37
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Pin
5
+ class Closure < Base
6
+ # @return [::Symbol] :class or :instance
7
+ attr_reader :scope
8
+
9
+ # @param scope [::Symbol] :class or :instance
10
+ # @param generics [::Array<Pin::Parameter>, nil]
11
+ # @param generic_defaults [Hash{String => ComplexType}]
12
+ def initialize scope: :class, generics: nil, generic_defaults: {}, **splat
13
+ super(**splat)
14
+ @scope = scope
15
+ @generics = generics
16
+ @generic_defaults = generic_defaults
17
+ end
18
+
19
+ # @return [Hash{String => ComplexType}]
20
+ def generic_defaults
21
+ @generic_defaults ||= {}
22
+ end
23
+
24
+ # @param other [self]
25
+ # @param attrs [Hash{Symbol => Object}]
26
+ #
27
+ # @return [self]
28
+ def combine_with(other, attrs={})
29
+ new_attrs = {
30
+ scope: assert_same(other, :scope),
31
+ generics: generics.empty? ? other.generics : generics,
32
+ }.merge(attrs)
33
+ super(other, new_attrs)
34
+ end
35
+
36
+ def context
37
+ @context ||= begin
38
+ result = super
39
+ if scope == :instance
40
+ result.reduce_class_type
41
+ else
42
+ result
43
+ end
44
+ end
45
+ end
46
+
47
+ def binder
48
+ @binder || context
49
+ end
50
+
51
+ # @param api_map [Solargraph::ApiMap]
52
+ # @return [void]
53
+ def rebind api_map; end
54
+
55
+ # @return [::Array<String>]
56
+ def generics
57
+ @generics ||= docstring.tags(:generic).map(&:name)
58
+ end
59
+
60
+ def to_rbs
61
+ rbs_generics + return_type.to_rbs
62
+ end
63
+
64
+ # @return [String]
65
+ def rbs_generics
66
+ return '' if generics.empty?
67
+
68
+ '[' + generics.map { |gen| gen.to_s }.join(', ') + '] '
69
+ end
70
+ end
71
+ end
72
+ end
@@ -1,70 +1,79 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module Pin
5
- module Common
6
- # @return [Location]
7
- attr_reader :location
8
-
9
- # @return [Pin::Base, nil]
10
- attr_reader :closure
11
-
12
- # @return [String]
13
- def name
14
- @name ||= ''
15
- end
16
-
17
- # @return [ComplexType]
18
- def return_type
19
- @return_type ||= ComplexType::UNDEFINED
20
- end
21
-
22
- # @return [ComplexType]
23
- def context
24
- # Get the static context from the nearest namespace
25
- @context ||= find_context
26
- end
27
- alias full_context context
28
-
29
- # @return [String]
30
- def namespace
31
- context.namespace.to_s
32
- end
33
-
34
- # @return [ComplexType]
35
- def binder
36
- @binder || context
37
- end
38
-
39
- # @return [String]
40
- def comments
41
- @comments ||= ''
42
- end
43
-
44
- # @return [String]
45
- def path
46
- @path ||= name.empty? ? context.namespace : "#{context.namespace}::#{name}"
47
- end
48
-
49
- private
50
-
51
- # @return [ComplexType]
52
- def find_context
53
- here = closure
54
- until here.nil?
55
- if here.is_a?(Pin::Namespace)
56
- return here.return_type
57
- elsif here.is_a?(Pin::Method)
58
- if here.scope == :instance
59
- return ComplexType.try_parse(here.context.namespace)
60
- else
61
- return here.context
62
- end
63
- end
64
- here = here.closure
65
- end
66
- ComplexType::ROOT
67
- end
68
- end
69
- end
70
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Pin
5
+ module Common
6
+ # @!method source
7
+ # @abstract
8
+ # @return [Source, nil]
9
+ # @type @closure [Pin::Closure, nil]
10
+
11
+ # @return [Location]
12
+ attr_reader :location
13
+
14
+ # @sg-ignore Solargraph::Pin::Common#closure return type could not be inferred
15
+ # @return [Pin::Closure, nil]
16
+ def closure
17
+ Solargraph.assert_or_log(:closure, "Closure not set on #{self.class} #{name.inspect} from #{source.inspect}") unless @closure
18
+ @closure
19
+ end
20
+
21
+ # @return [String]
22
+ def name
23
+ @name ||= ''
24
+ end
25
+
26
+ # @return [ComplexType]
27
+ def return_type
28
+ @return_type ||= ComplexType::UNDEFINED
29
+ end
30
+
31
+ # @return [ComplexType]
32
+ def context
33
+ # Get the static context from the nearest namespace
34
+ @context ||= find_context
35
+ end
36
+ alias full_context context
37
+
38
+ # @return [String]
39
+ def namespace
40
+ context.namespace.to_s
41
+ end
42
+
43
+ # @return [ComplexType]
44
+ def binder
45
+ @binder || context
46
+ end
47
+
48
+ # @return [String]
49
+ def comments
50
+ @comments ||= ''
51
+ end
52
+
53
+ # @return [String]
54
+ def path
55
+ @path ||= name.empty? ? context.namespace : "#{context.namespace}::#{name}"
56
+ end
57
+
58
+ protected
59
+
60
+ attr_writer :context
61
+
62
+ private
63
+
64
+ # @return [ComplexType]
65
+ def find_context
66
+ here = closure
67
+ until here.nil?
68
+ if here.is_a?(Pin::Namespace)
69
+ return here.return_type
70
+ elsif here.is_a?(Pin::Method)
71
+ return here.context
72
+ end
73
+ here = here.closure
74
+ end
75
+ ComplexType::ROOT
76
+ end
77
+ end
78
+ end
79
+ end
@@ -5,6 +5,8 @@ module Solargraph
5
5
  class Constant < BaseVariable
6
6
  attr_reader :visibility
7
7
 
8
+ # @param visibility [::Symbol] The visibility of the constant (:public, :protected, or :private)
9
+ # @param splat [Hash] Additional options supported by superclasses
8
10
  def initialize visibility: :public, **splat
9
11
  super(**splat)
10
12
  @visibility = visibility
@@ -1,92 +1,123 @@
1
- # frozen_string_literal: true
2
-
3
- require 'cgi'
4
-
5
- module Solargraph
6
- module Pin
7
- # @todo Move this stuff. It should be the responsibility of the language server.
8
- module Conversions
9
- # @return [Hash]
10
- def completion_item
11
- @completion_item ||= {
12
- label: name,
13
- kind: completion_item_kind,
14
- detail: detail,
15
- data: {
16
- path: path,
17
- return_type: return_type.tag,
18
- location: (location ? location.to_hash : nil),
19
- deprecated: deprecated?
20
- }
21
- }
22
- end
23
-
24
- # @return [Hash]
25
- def resolve_completion_item
26
- @resolve_completion_item ||= begin
27
- extra = {}
28
- alldoc = ''
29
- # alldoc += link_documentation unless link_documentation.nil?
30
- # alldoc += "\n\n" unless alldoc.empty?
31
- alldoc += documentation unless documentation.nil?
32
- extra[:documentation] = alldoc unless alldoc.empty?
33
- completion_item.merge(extra)
34
- end
35
- end
36
-
37
- # @return [Array<Hash>]
38
- def signature_help
39
- []
40
- end
41
-
42
- # @return [String]
43
- def detail
44
- # This property is not cached in an instance variable because it can
45
- # change when pins get proxied.
46
- detail = String.new
47
- detail += "=#{probed? ? '~' : (proxied? ? '^' : '>')} #{return_type.to_s}" unless return_type.undefined?
48
- detail.strip!
49
- return nil if detail.empty?
50
- detail
51
- end
52
-
53
- # Get a markdown-flavored link to a documentation page.
54
- #
55
- # @return [String]
56
- def link_documentation
57
- @link_documentation ||= generate_link
58
- end
59
-
60
- def text_documentation
61
- this_path = path || return_type.tag
62
- return nil if this_path == 'undefined'
63
- escape_brackets this_path
64
- end
65
-
66
- def reset_conversions
67
- @completion_item = nil
68
- @resolve_completion_item = nil
69
- @signature_help = nil
70
- @detail = nil
71
- @link_documentation = nil
72
- end
73
-
74
- private
75
-
76
- # @return [String]
77
- def generate_link
78
- this_path = path || return_type.tag
79
- return nil if this_path == 'undefined'
80
- return nil if this_path.nil? || this_path == 'undefined'
81
- "[#{escape_brackets(this_path).gsub('_', '\\\\_')}](solargraph:/document?query=#{CGI.escape(this_path)})"
82
- end
83
-
84
- # @param text [String]
85
- # @return [String]
86
- def escape_brackets text
87
- # text.gsub(/(\<|\>)/, "\\#{$1}")
88
- text.gsub("<", '\<').gsub(">", '\>')
89
- end
90
- end
91
- end
92
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'cgi'
4
+
5
+ module Solargraph
6
+ module Pin
7
+ # @todo Move this stuff. It should be the responsibility of the language server.
8
+ # @todo abstract methods below should be verified to be overridden
9
+ # by type checker when mixin included by non-abstract class
10
+ module Conversions
11
+ # @!parse
12
+ # include Documenting
13
+ # include Common
14
+
15
+ # @return [Integer]
16
+ # @abstract
17
+ def completion_item_kind
18
+ raise NotImplementedError
19
+ end
20
+
21
+ # @abstract
22
+ # @return [Boolean]
23
+ def deprecated?
24
+ raise NotImplementedError
25
+ end
26
+
27
+ # @abstract
28
+ def probed?
29
+ raise NotImplementedError
30
+ end
31
+
32
+ # @abstract
33
+ def proxied?
34
+ raise NotImplementedError
35
+ end
36
+
37
+ # @return [Hash]
38
+ def completion_item
39
+ @completion_item ||= {
40
+ label: name,
41
+ kind: completion_item_kind,
42
+ detail: detail,
43
+ data: {
44
+ path: path,
45
+ return_type: return_type.tag,
46
+ location: (location ? location.to_hash : nil),
47
+ deprecated: deprecated?
48
+ }
49
+ }
50
+ end
51
+
52
+ # @return [Hash]
53
+ def resolve_completion_item
54
+ @resolve_completion_item ||= begin
55
+ extra = {}
56
+ alldoc = ''
57
+ # alldoc += link_documentation unless link_documentation.nil?
58
+ # alldoc += "\n\n" unless alldoc.empty?
59
+ alldoc += documentation unless documentation.nil?
60
+ extra[:documentation] = alldoc unless alldoc.empty?
61
+ completion_item.merge(extra)
62
+ end
63
+ end
64
+
65
+ # @return [::Array<Hash>]
66
+ def signature_help
67
+ []
68
+ end
69
+
70
+ # @return [String, nil]
71
+ def detail
72
+ # This property is not cached in an instance variable because it can
73
+ # change when pins get proxied.
74
+ detail = String.new
75
+ detail += "=#{probed? ? '~' : (proxied? ? '^' : '>')} #{return_type.to_s}" unless return_type.undefined?
76
+ detail.strip!
77
+ return nil if detail.empty?
78
+ detail
79
+ end
80
+
81
+ # Get a markdown-flavored link to a documentation page.
82
+ #
83
+ # @return [String]
84
+ def link_documentation
85
+ @link_documentation ||= generate_link
86
+ end
87
+
88
+ # @return [String, nil]
89
+ def text_documentation
90
+ this_path = path || name || return_type.tag
91
+ return nil if this_path == 'undefined'
92
+ escape_brackets this_path
93
+ end
94
+
95
+ # @return [void]
96
+ def reset_conversions
97
+ @completion_item = nil
98
+ @resolve_completion_item = nil
99
+ @signature_help = nil
100
+ @detail = nil
101
+ @link_documentation = nil
102
+ end
103
+
104
+ private
105
+
106
+ # @return [String, nil]
107
+ def generate_link
108
+ this_path = path || name || return_type.tag
109
+ return nil if this_path == 'undefined'
110
+ return nil if this_path.nil? || this_path == 'undefined'
111
+ return this_path if path.nil?
112
+ "[#{escape_brackets(this_path).gsub('_', '\\\\_')}](solargraph:/document?query=#{CGI.escape(this_path)})"
113
+ end
114
+
115
+ # @param text [String]
116
+ # @return [String]
117
+ def escape_brackets text
118
+ # text.gsub(/(\<|\>)/, "\\#{$1}")
119
+ text.gsub("<", '\<').gsub(">", '\>')
120
+ end
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,120 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Pin
5
+ # A DelegatedMethod is a more complicated version of a MethodAlias that
6
+ # allows aliasing a method from a different closure (class/module etc).
7
+ class DelegatedMethod < Pin::Method
8
+ # A DelegatedMethod can be constructed with either a :resolved_method
9
+ # pin, or a :receiver_chain. When a :receiver_chain is supplied, it
10
+ # will be used to *dynamically* resolve a receiver type within the
11
+ # given closure/scope, and the delegated method will then be resolved
12
+ # to a method pin on that type.
13
+ #
14
+ # @param method [Method, nil] an already resolved method pin.
15
+ # @param receiver [Source::Chain, nil] the source code used to resolve the receiver for this delegated method.
16
+ # @param name [String]
17
+ # @param receiver_method_name [String] the method name that will be called on the receiver (defaults to :name).
18
+ def initialize(method: nil, receiver: nil, name: method&.name, receiver_method_name: name, **splat)
19
+ raise ArgumentError, 'either :method or :receiver is required' if (method && receiver) || (!method && !receiver)
20
+ super(name: name, **splat)
21
+
22
+ @receiver_chain = receiver
23
+ @resolved_method = method
24
+ @receiver_method_name = receiver_method_name
25
+ end
26
+
27
+ def inner_desc
28
+ "#{name} => #{@receiver_chain}##{@receiver_method_name}"
29
+ end
30
+
31
+ def location
32
+ return super if super
33
+
34
+ @resolved_method&.send(:location)
35
+ end
36
+
37
+
38
+ def type_location
39
+ return super if super
40
+
41
+ @resolved_method&.send(:type_location)
42
+ end
43
+
44
+ %i[comments parameters return_type signatures].each do |method|
45
+ define_method(method) do
46
+ # @sg-ignore Need to set context correctly in define_method blocks
47
+ @resolved_method ? @resolved_method.send(method) : super()
48
+ end
49
+ end
50
+
51
+ %i[typify realize infer probe].each do |method|
52
+ # @param api_map [ApiMap]
53
+ define_method(method) do |api_map|
54
+ resolve_method(api_map)
55
+ # @sg-ignore Need to set context correctly in define_method blocks
56
+ @resolved_method ? @resolved_method.send(method, api_map) : super(api_map)
57
+ end
58
+ end
59
+
60
+ # @param api_map [ApiMap]
61
+ def resolvable?(api_map)
62
+ resolve_method(api_map)
63
+ !!@resolved_method
64
+ end
65
+
66
+ private
67
+
68
+ # Resolves the receiver chain and method name to a method pin, resetting any previously resolution.
69
+ #
70
+ # @param api_map [ApiMap]
71
+ # @return [Pin::Method, nil]
72
+ def resolve_method api_map
73
+ return if @resolved_method
74
+
75
+ resolver = @receiver_chain.define(api_map, self, []).first
76
+
77
+ unless resolver
78
+ Solargraph.logger.warn \
79
+ "Delegated receiver for #{path} was resolved to nil from `#{print_chain(@receiver_chain)}'"
80
+ return
81
+ end
82
+
83
+ receiver_type = resolver.return_type
84
+
85
+ return if receiver_type.undefined?
86
+
87
+ receiver_path, method_scope =
88
+ if @receiver_chain.constant?
89
+ # HACK: the `return_type` of a constant is Class<Whatever>, but looking up a method expects
90
+ # the arguments `"Whatever"` and `scope: :class`.
91
+ [receiver_type.to_s.sub(/^Class<(.+)>$/, '\1'), :class]
92
+ else
93
+ [receiver_type.to_s, :instance]
94
+ end
95
+
96
+ method_stack = api_map.get_method_stack(receiver_path, @receiver_method_name, scope: method_scope)
97
+ @resolved_method = method_stack.first
98
+ end
99
+
100
+ # helper to print a source chain as code, probably not 100% correct.
101
+ #
102
+ # @param chain [Source::Chain]
103
+ # @return [String]
104
+ def print_chain(chain)
105
+ out = +''
106
+ chain.links.each_with_index do |link, index|
107
+ if index > 0
108
+ if Source::Chain::Constant
109
+ out << '::' unless link.word.start_with?('::')
110
+ else
111
+ out << '.'
112
+ end
113
+ end
114
+ out << link.word
115
+ end
116
+ out
117
+ end
118
+ end
119
+ end
120
+ end