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,257 +1,257 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module Parser
5
- module Legacy
6
- module NodeProcessors
7
- class SendNode < Parser::NodeProcessor::Base
8
- include Legacy::NodeMethods
9
-
10
- def process
11
- if node.children[0].nil?
12
- if [:private, :public, :protected].include?(node.children[1])
13
- process_visibility
14
- elsif node.children[1] == :module_function
15
- process_module_function
16
- elsif [:attr_reader, :attr_writer, :attr_accessor].include?(node.children[1])
17
- process_attribute
18
- elsif node.children[1] == :include
19
- process_include
20
- elsif node.children[1] == :extend
21
- process_extend
22
- elsif node.children[1] == :prepend
23
- process_prepend
24
- elsif node.children[1] == :require
25
- process_require
26
- elsif node.children[1] == :autoload
27
- process_autoload
28
- elsif node.children[1] == :private_constant
29
- process_private_constant
30
- elsif node.children[1] == :alias_method && node.children[2] && node.children[2] && node.children[2].type == :sym && node.children[3] && node.children[3].type == :sym
31
- process_alias_method
32
- elsif node.children[1] == :private_class_method && node.children[2].is_a?(AST::Node)
33
- # Processing a private class can potentially handle children on its own
34
- return if process_private_class_method
35
- end
36
- elsif node.children[1] == :require && node.children[0].to_s == '(const nil :Bundler)'
37
- pins.push Pin::Reference::Require.new(Solargraph::Location.new(region.filename, Solargraph::Range.from_to(0, 0, 0, 0)), 'bundler/require')
38
- end
39
- process_children
40
- end
41
-
42
- private
43
-
44
- # @return [void]
45
- def process_visibility
46
- if (node.children.length > 2)
47
- node.children[2..-1].each do |child|
48
- if child.is_a?(AST::Node) && (child.type == :sym || child.type == :str)
49
- name = child.children[0].to_s
50
- matches = pins.select{ |pin| pin.is_a?(Pin::Method) && pin.name == name && pin.namespace == region.closure.full_context.namespace && pin.context.scope == (region.scope || :instance)}
51
- matches.each do |pin|
52
- # @todo Smelly instance variable access
53
- pin.instance_variable_set(:@visibility, node.children[1])
54
- end
55
- else
56
- process_children region.update(visibility: node.children[1])
57
- end
58
- end
59
- else
60
- # @todo Smelly instance variable access
61
- region.instance_variable_set(:@visibility, node.children[1])
62
- end
63
- end
64
-
65
- # @return [void]
66
- def process_attribute
67
- node.children[2..-1].each do |a|
68
- loc = get_node_location(node)
69
- clos = region.closure
70
- cmnt = comments_for(node)
71
- if node.children[1] == :attr_reader || node.children[1] == :attr_accessor
72
- pins.push Solargraph::Pin::Method.new(
73
- location: loc,
74
- closure: clos,
75
- name: a.children[0].to_s,
76
- comments: cmnt,
77
- scope: region.scope || :instance,
78
- visibility: region.visibility,
79
- attribute: true
80
- )
81
- end
82
- if node.children[1] == :attr_writer || node.children[1] == :attr_accessor
83
- pins.push Solargraph::Pin::Method.new(
84
- location: loc,
85
- closure: clos,
86
- name: "#{a.children[0]}=",
87
- comments: cmnt,
88
- scope: region.scope || :instance,
89
- visibility: region.visibility,
90
- attribute: true
91
- )
92
- pins.last.parameters.push Pin::Parameter.new(name: 'value', decl: :arg, closure: pins.last)
93
- if pins.last.return_type.defined?
94
- pins.last.docstring.add_tag YARD::Tags::Tag.new(:param, '', pins.last.return_type.to_s.split(', '), 'value')
95
- end
96
- end
97
- end
98
- end
99
-
100
- # @return [void]
101
- def process_include
102
- if node.children[2].is_a?(AST::Node) && node.children[2].type == :const
103
- cp = region.closure
104
- node.children[2..-1].each do |i|
105
- type = region.scope == :class ? Pin::Reference::Extend : Pin::Reference::Include
106
- pins.push type.new(
107
- location: get_node_location(i),
108
- closure: cp,
109
- name: unpack_name(i)
110
- )
111
- end
112
- end
113
- end
114
-
115
- def process_prepend
116
- if node.children[2].is_a?(AST::Node) && node.children[2].type == :const
117
- cp = region.closure
118
- node.children[2..-1].each do |i|
119
- pins.push Pin::Reference::Prepend.new(
120
- location: get_node_location(i),
121
- closure: cp,
122
- name: unpack_name(i)
123
- )
124
- end
125
- end
126
- end
127
-
128
- # @return [void]
129
- def process_extend
130
- node.children[2..-1].each do |i|
131
- loc = get_node_location(node)
132
- if i.type == :self
133
- pins.push Pin::Reference::Extend.new(
134
- location: loc,
135
- closure: region.closure,
136
- name: region.closure.full_context.namespace
137
- )
138
- else
139
- pins.push Pin::Reference::Extend.new(
140
- location: loc,
141
- closure: region.closure,
142
- name: unpack_name(i)
143
- )
144
- end
145
- end
146
- end
147
-
148
- # @return [void]
149
- def process_require
150
- if node.children[2].is_a?(AST::Node) && node.children[2].type == :str
151
- path = node.children[2].children[0].to_s
152
- pins.push Pin::Reference::Require.new(get_node_location(node), path)
153
- end
154
- end
155
-
156
- # @return [void]
157
- def process_autoload
158
- if node.children[3].is_a?(AST::Node) && node.children[3].type == :str
159
- path = node.children[3].children[0].to_s
160
- pins.push Pin::Reference::Require.new(get_node_location(node), path)
161
- end
162
- end
163
-
164
- # @return [void]
165
- def process_module_function
166
- if node.children[2].nil?
167
- # @todo Smelly instance variable access
168
- region.instance_variable_set(:@visibility, :module_function)
169
- elsif node.children[2].type == :sym || node.children[2].type == :str
170
- node.children[2..-1].each do |x|
171
- cn = x.children[0].to_s
172
- ref = pins.select{ |p| p.is_a?(Pin::Method) && p.namespace == region.closure.full_context.namespace && p.name == cn }.first
173
- unless ref.nil?
174
- pins.delete ref
175
- mm = Solargraph::Pin::Method.new(
176
- location: ref.location,
177
- closure: ref.closure,
178
- name: ref.name,
179
- parameters: ref.parameters,
180
- comments: ref.comments,
181
- scope: :class,
182
- visibility: :public,
183
- node: ref.node
184
- )
185
- cm = Solargraph::Pin::Method.new(
186
- location: ref.location,
187
- closure: ref.closure,
188
- name: ref.name,
189
- parameters: ref.parameters,
190
- comments: ref.comments,
191
- scope: :instance,
192
- visibility: :private,
193
- node: ref.node)
194
- pins.push mm, cm
195
- pins.select{|pin| pin.is_a?(Pin::InstanceVariable) && pin.closure.path == ref.path}.each do |ivar|
196
- pins.delete ivar
197
- pins.push Solargraph::Pin::InstanceVariable.new(
198
- location: ivar.location,
199
- closure: cm,
200
- name: ivar.name,
201
- comments: ivar.comments,
202
- assignment: ivar.assignment
203
- )
204
- pins.push Solargraph::Pin::InstanceVariable.new(
205
- location: ivar.location,
206
- closure: mm,
207
- name: ivar.name,
208
- comments: ivar.comments,
209
- assignment: ivar.assignment
210
- )
211
- end
212
- end
213
- end
214
- elsif node.children[2].type == :def
215
- NodeProcessor.process node.children[2], region.update(visibility: :module_function), pins, locals
216
- end
217
- end
218
-
219
- # @return [void]
220
- def process_private_constant
221
- if node.children[2] && (node.children[2].type == :sym || node.children[2].type == :str)
222
- cn = node.children[2].children[0].to_s
223
- ref = pins.select{|p| [Solargraph::Pin::Namespace, Solargraph::Pin::Constant].include?(p.class) && p.namespace == region.closure.full_context.namespace && p.name == cn}.first
224
- # HACK: Smelly instance variable access
225
- ref.instance_variable_set(:@visibility, :private) unless ref.nil?
226
- end
227
- end
228
-
229
- # @return [void]
230
- def process_alias_method
231
- loc = get_node_location(node)
232
- pins.push Solargraph::Pin::MethodAlias.new(
233
- location: get_node_location(node),
234
- closure: region.closure,
235
- name: node.children[2].children[0].to_s,
236
- original: node.children[3].children[0].to_s,
237
- scope: region.scope || :instance
238
- )
239
- end
240
-
241
- # @return [Boolean]
242
- def process_private_class_method
243
- if node.children[2].type == :sym || node.children[2].type == :str
244
- ref = pins.select { |p| p.is_a?(Pin::Method) && p.namespace == region.closure.full_context.namespace && p.name == node.children[2].children[0].to_s }.first
245
- # HACK: Smelly instance variable access
246
- ref.instance_variable_set(:@visibility, :private) unless ref.nil?
247
- false
248
- else
249
- process_children region.update(scope: :class, visibility: :private)
250
- true
251
- end
252
- end
253
- end
254
- end
255
- end
256
- end
257
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Parser
5
+ module Legacy
6
+ module NodeProcessors
7
+ class SendNode < Parser::NodeProcessor::Base
8
+ include Legacy::NodeMethods
9
+
10
+ def process
11
+ if node.children[0].nil?
12
+ if [:private, :public, :protected].include?(node.children[1])
13
+ process_visibility
14
+ elsif node.children[1] == :module_function
15
+ process_module_function
16
+ elsif [:attr_reader, :attr_writer, :attr_accessor].include?(node.children[1])
17
+ process_attribute
18
+ elsif node.children[1] == :include
19
+ process_include
20
+ elsif node.children[1] == :extend
21
+ process_extend
22
+ elsif node.children[1] == :prepend
23
+ process_prepend
24
+ elsif node.children[1] == :require
25
+ process_require
26
+ elsif node.children[1] == :autoload
27
+ process_autoload
28
+ elsif node.children[1] == :private_constant
29
+ process_private_constant
30
+ elsif node.children[1] == :alias_method && node.children[2] && node.children[2] && node.children[2].type == :sym && node.children[3] && node.children[3].type == :sym
31
+ process_alias_method
32
+ elsif node.children[1] == :private_class_method && node.children[2].is_a?(AST::Node)
33
+ # Processing a private class can potentially handle children on its own
34
+ return if process_private_class_method
35
+ end
36
+ elsif node.children[1] == :require && node.children[0].to_s == '(const nil :Bundler)'
37
+ pins.push Pin::Reference::Require.new(Solargraph::Location.new(region.filename, Solargraph::Range.from_to(0, 0, 0, 0)), 'bundler/require')
38
+ end
39
+ process_children
40
+ end
41
+
42
+ private
43
+
44
+ # @return [void]
45
+ def process_visibility
46
+ if (node.children.length > 2)
47
+ node.children[2..-1].each do |child|
48
+ if child.is_a?(AST::Node) && (child.type == :sym || child.type == :str)
49
+ name = child.children[0].to_s
50
+ matches = pins.select{ |pin| pin.is_a?(Pin::Method) && pin.name == name && pin.namespace == region.closure.full_context.namespace && pin.context.scope == (region.scope || :instance)}
51
+ matches.each do |pin|
52
+ # @todo Smelly instance variable access
53
+ pin.instance_variable_set(:@visibility, node.children[1])
54
+ end
55
+ else
56
+ process_children region.update(visibility: node.children[1])
57
+ end
58
+ end
59
+ else
60
+ # @todo Smelly instance variable access
61
+ region.instance_variable_set(:@visibility, node.children[1])
62
+ end
63
+ end
64
+
65
+ # @return [void]
66
+ def process_attribute
67
+ node.children[2..-1].each do |a|
68
+ loc = get_node_location(node)
69
+ clos = region.closure
70
+ cmnt = comments_for(node)
71
+ if node.children[1] == :attr_reader || node.children[1] == :attr_accessor
72
+ pins.push Solargraph::Pin::Method.new(
73
+ location: loc,
74
+ closure: clos,
75
+ name: a.children[0].to_s,
76
+ comments: cmnt,
77
+ scope: region.scope || :instance,
78
+ visibility: region.visibility,
79
+ attribute: true
80
+ )
81
+ end
82
+ if node.children[1] == :attr_writer || node.children[1] == :attr_accessor
83
+ pins.push Solargraph::Pin::Method.new(
84
+ location: loc,
85
+ closure: clos,
86
+ name: "#{a.children[0]}=",
87
+ comments: cmnt,
88
+ scope: region.scope || :instance,
89
+ visibility: region.visibility,
90
+ attribute: true
91
+ )
92
+ pins.last.parameters.push Pin::Parameter.new(name: 'value', decl: :arg, closure: pins.last)
93
+ if pins.last.return_type.defined?
94
+ pins.last.docstring.add_tag YARD::Tags::Tag.new(:param, '', pins.last.return_type.to_s.split(', '), 'value')
95
+ end
96
+ end
97
+ end
98
+ end
99
+
100
+ # @return [void]
101
+ def process_include
102
+ if node.children[2].is_a?(AST::Node) && node.children[2].type == :const
103
+ cp = region.closure
104
+ node.children[2..-1].each do |i|
105
+ type = region.scope == :class ? Pin::Reference::Extend : Pin::Reference::Include
106
+ pins.push type.new(
107
+ location: get_node_location(i),
108
+ closure: cp,
109
+ name: unpack_name(i)
110
+ )
111
+ end
112
+ end
113
+ end
114
+
115
+ def process_prepend
116
+ if node.children[2].is_a?(AST::Node) && node.children[2].type == :const
117
+ cp = region.closure
118
+ node.children[2..-1].each do |i|
119
+ pins.push Pin::Reference::Prepend.new(
120
+ location: get_node_location(i),
121
+ closure: cp,
122
+ name: unpack_name(i)
123
+ )
124
+ end
125
+ end
126
+ end
127
+
128
+ # @return [void]
129
+ def process_extend
130
+ node.children[2..-1].each do |i|
131
+ loc = get_node_location(node)
132
+ if i.type == :self
133
+ pins.push Pin::Reference::Extend.new(
134
+ location: loc,
135
+ closure: region.closure,
136
+ name: region.closure.full_context.namespace
137
+ )
138
+ else
139
+ pins.push Pin::Reference::Extend.new(
140
+ location: loc,
141
+ closure: region.closure,
142
+ name: unpack_name(i)
143
+ )
144
+ end
145
+ end
146
+ end
147
+
148
+ # @return [void]
149
+ def process_require
150
+ if node.children[2].is_a?(AST::Node) && node.children[2].type == :str
151
+ path = node.children[2].children[0].to_s
152
+ pins.push Pin::Reference::Require.new(get_node_location(node), path)
153
+ end
154
+ end
155
+
156
+ # @return [void]
157
+ def process_autoload
158
+ if node.children[3].is_a?(AST::Node) && node.children[3].type == :str
159
+ path = node.children[3].children[0].to_s
160
+ pins.push Pin::Reference::Require.new(get_node_location(node), path)
161
+ end
162
+ end
163
+
164
+ # @return [void]
165
+ def process_module_function
166
+ if node.children[2].nil?
167
+ # @todo Smelly instance variable access
168
+ region.instance_variable_set(:@visibility, :module_function)
169
+ elsif node.children[2].type == :sym || node.children[2].type == :str
170
+ node.children[2..-1].each do |x|
171
+ cn = x.children[0].to_s
172
+ ref = pins.select{ |p| p.is_a?(Pin::Method) && p.namespace == region.closure.full_context.namespace && p.name == cn }.first
173
+ unless ref.nil?
174
+ pins.delete ref
175
+ mm = Solargraph::Pin::Method.new(
176
+ location: ref.location,
177
+ closure: ref.closure,
178
+ name: ref.name,
179
+ parameters: ref.parameters,
180
+ comments: ref.comments,
181
+ scope: :class,
182
+ visibility: :public,
183
+ node: ref.node
184
+ )
185
+ cm = Solargraph::Pin::Method.new(
186
+ location: ref.location,
187
+ closure: ref.closure,
188
+ name: ref.name,
189
+ parameters: ref.parameters,
190
+ comments: ref.comments,
191
+ scope: :instance,
192
+ visibility: :private,
193
+ node: ref.node)
194
+ pins.push mm, cm
195
+ pins.select{|pin| pin.is_a?(Pin::InstanceVariable) && pin.closure.path == ref.path}.each do |ivar|
196
+ pins.delete ivar
197
+ pins.push Solargraph::Pin::InstanceVariable.new(
198
+ location: ivar.location,
199
+ closure: cm,
200
+ name: ivar.name,
201
+ comments: ivar.comments,
202
+ assignment: ivar.assignment
203
+ )
204
+ pins.push Solargraph::Pin::InstanceVariable.new(
205
+ location: ivar.location,
206
+ closure: mm,
207
+ name: ivar.name,
208
+ comments: ivar.comments,
209
+ assignment: ivar.assignment
210
+ )
211
+ end
212
+ end
213
+ end
214
+ elsif node.children[2].type == :def
215
+ NodeProcessor.process node.children[2], region.update(visibility: :module_function), pins, locals
216
+ end
217
+ end
218
+
219
+ # @return [void]
220
+ def process_private_constant
221
+ if node.children[2] && (node.children[2].type == :sym || node.children[2].type == :str)
222
+ cn = node.children[2].children[0].to_s
223
+ ref = pins.select{|p| [Solargraph::Pin::Namespace, Solargraph::Pin::Constant].include?(p.class) && p.namespace == region.closure.full_context.namespace && p.name == cn}.first
224
+ # HACK: Smelly instance variable access
225
+ ref.instance_variable_set(:@visibility, :private) unless ref.nil?
226
+ end
227
+ end
228
+
229
+ # @return [void]
230
+ def process_alias_method
231
+ loc = get_node_location(node)
232
+ pins.push Solargraph::Pin::MethodAlias.new(
233
+ location: get_node_location(node),
234
+ closure: region.closure,
235
+ name: node.children[2].children[0].to_s,
236
+ original: node.children[3].children[0].to_s,
237
+ scope: region.scope || :instance
238
+ )
239
+ end
240
+
241
+ # @return [Boolean]
242
+ def process_private_class_method
243
+ if node.children[2].type == :sym || node.children[2].type == :str
244
+ ref = pins.select { |p| p.is_a?(Pin::Method) && p.namespace == region.closure.full_context.namespace && p.name == node.children[2].children[0].to_s }.first
245
+ # HACK: Smelly instance variable access
246
+ ref.instance_variable_set(:@visibility, :private) unless ref.nil?
247
+ false
248
+ else
249
+ process_children region.update(scope: :class, visibility: :private)
250
+ true
251
+ end
252
+ end
253
+ end
254
+ end
255
+ end
256
+ end
257
+ end
@@ -1,18 +1,18 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module Parser
5
- module Legacy
6
- module NodeProcessors
7
- class SymNode < Parser::NodeProcessor::Base
8
- def process
9
- pins.push Solargraph::Pin::Symbol.new(
10
- get_node_location(node),
11
- ":#{node.children[0]}"
12
- )
13
- end
14
- end
15
- end
16
- end
17
- end
18
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Parser
5
+ module Legacy
6
+ module NodeProcessors
7
+ class SymNode < Parser::NodeProcessor::Base
8
+ def process
9
+ pins.push Solargraph::Pin::Symbol.new(
10
+ get_node_location(node),
11
+ ":#{node.children[0]}"
12
+ )
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end