solargraph 0.39.7

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 (252) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +9 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +28 -0
  5. data/.yardopts +2 -0
  6. data/Gemfile +7 -0
  7. data/LICENSE +21 -0
  8. data/README.md +104 -0
  9. data/Rakefile +14 -0
  10. data/SPONSORS.md +9 -0
  11. data/bin/solargraph +5 -0
  12. data/lib/.rubocop.yml +21 -0
  13. data/lib/solargraph.rb +66 -0
  14. data/lib/solargraph/api_map.rb +745 -0
  15. data/lib/solargraph/api_map/bundler_methods.rb +27 -0
  16. data/lib/solargraph/api_map/cache.rb +66 -0
  17. data/lib/solargraph/api_map/source_to_yard.rb +81 -0
  18. data/lib/solargraph/api_map/store.rb +267 -0
  19. data/lib/solargraph/bundle.rb +26 -0
  20. data/lib/solargraph/complex_type.rb +213 -0
  21. data/lib/solargraph/complex_type/type_methods.rb +127 -0
  22. data/lib/solargraph/complex_type/unique_type.rb +75 -0
  23. data/lib/solargraph/convention.rb +38 -0
  24. data/lib/solargraph/convention/base.rb +25 -0
  25. data/lib/solargraph/convention/gemfile.rb +18 -0
  26. data/lib/solargraph/convention/gemspec.rb +25 -0
  27. data/lib/solargraph/convention/rspec.rb +24 -0
  28. data/lib/solargraph/converters/dd.rb +12 -0
  29. data/lib/solargraph/converters/dl.rb +12 -0
  30. data/lib/solargraph/converters/dt.rb +12 -0
  31. data/lib/solargraph/converters/misc.rb +1 -0
  32. data/lib/solargraph/core_fills.rb +159 -0
  33. data/lib/solargraph/diagnostics.rb +55 -0
  34. data/lib/solargraph/diagnostics/base.rb +29 -0
  35. data/lib/solargraph/diagnostics/require_not_found.rb +37 -0
  36. data/lib/solargraph/diagnostics/rubocop.rb +90 -0
  37. data/lib/solargraph/diagnostics/rubocop_helpers.rb +64 -0
  38. data/lib/solargraph/diagnostics/severities.rb +15 -0
  39. data/lib/solargraph/diagnostics/type_check.rb +54 -0
  40. data/lib/solargraph/diagnostics/update_errors.rb +41 -0
  41. data/lib/solargraph/documentor.rb +76 -0
  42. data/lib/solargraph/environ.rb +40 -0
  43. data/lib/solargraph/language_server.rb +19 -0
  44. data/lib/solargraph/language_server/completion_item_kinds.rb +35 -0
  45. data/lib/solargraph/language_server/error_codes.rb +20 -0
  46. data/lib/solargraph/language_server/host.rb +741 -0
  47. data/lib/solargraph/language_server/host/cataloger.rb +56 -0
  48. data/lib/solargraph/language_server/host/diagnoser.rb +81 -0
  49. data/lib/solargraph/language_server/host/dispatch.rb +112 -0
  50. data/lib/solargraph/language_server/host/sources.rb +156 -0
  51. data/lib/solargraph/language_server/message.rb +92 -0
  52. data/lib/solargraph/language_server/message/base.rb +85 -0
  53. data/lib/solargraph/language_server/message/cancel_request.rb +13 -0
  54. data/lib/solargraph/language_server/message/client.rb +11 -0
  55. data/lib/solargraph/language_server/message/client/register_capability.rb +15 -0
  56. data/lib/solargraph/language_server/message/completion_item.rb +11 -0
  57. data/lib/solargraph/language_server/message/completion_item/resolve.rb +57 -0
  58. data/lib/solargraph/language_server/message/exit_notification.rb +13 -0
  59. data/lib/solargraph/language_server/message/extended.rb +21 -0
  60. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +95 -0
  61. data/lib/solargraph/language_server/message/extended/document.rb +20 -0
  62. data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -0
  63. data/lib/solargraph/language_server/message/extended/download_core.rb +23 -0
  64. data/lib/solargraph/language_server/message/extended/environment.rb +25 -0
  65. data/lib/solargraph/language_server/message/extended/search.rb +20 -0
  66. data/lib/solargraph/language_server/message/initialize.rb +153 -0
  67. data/lib/solargraph/language_server/message/initialized.rb +26 -0
  68. data/lib/solargraph/language_server/message/method_not_found.rb +16 -0
  69. data/lib/solargraph/language_server/message/method_not_implemented.rb +14 -0
  70. data/lib/solargraph/language_server/message/shutdown.rb +13 -0
  71. data/lib/solargraph/language_server/message/text_document.rb +28 -0
  72. data/lib/solargraph/language_server/message/text_document/base.rb +19 -0
  73. data/lib/solargraph/language_server/message/text_document/code_action.rb +17 -0
  74. data/lib/solargraph/language_server/message/text_document/completion.rb +57 -0
  75. data/lib/solargraph/language_server/message/text_document/definition.rb +38 -0
  76. data/lib/solargraph/language_server/message/text_document/did_change.rb +15 -0
  77. data/lib/solargraph/language_server/message/text_document/did_close.rb +15 -0
  78. data/lib/solargraph/language_server/message/text_document/did_open.rb +15 -0
  79. data/lib/solargraph/language_server/message/text_document/did_save.rb +17 -0
  80. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +23 -0
  81. data/lib/solargraph/language_server/message/text_document/folding_range.rb +26 -0
  82. data/lib/solargraph/language_server/message/text_document/formatting.rb +78 -0
  83. data/lib/solargraph/language_server/message/text_document/hover.rb +44 -0
  84. data/lib/solargraph/language_server/message/text_document/on_type_formatting.rb +34 -0
  85. data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +11 -0
  86. data/lib/solargraph/language_server/message/text_document/references.rb +16 -0
  87. data/lib/solargraph/language_server/message/text_document/rename.rb +19 -0
  88. data/lib/solargraph/language_server/message/text_document/signature_help.rb +29 -0
  89. data/lib/solargraph/language_server/message/workspace.rb +14 -0
  90. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +29 -0
  91. data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +33 -0
  92. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +24 -0
  93. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +23 -0
  94. data/lib/solargraph/language_server/message_types.rb +14 -0
  95. data/lib/solargraph/language_server/request.rb +24 -0
  96. data/lib/solargraph/language_server/symbol_kinds.rb +36 -0
  97. data/lib/solargraph/language_server/transport.rb +13 -0
  98. data/lib/solargraph/language_server/transport/adapter.rb +56 -0
  99. data/lib/solargraph/language_server/transport/data_reader.rb +72 -0
  100. data/lib/solargraph/language_server/uri_helpers.rb +49 -0
  101. data/lib/solargraph/library.rb +414 -0
  102. data/lib/solargraph/location.rb +37 -0
  103. data/lib/solargraph/logging.rb +27 -0
  104. data/lib/solargraph/page.rb +83 -0
  105. data/lib/solargraph/parser.rb +26 -0
  106. data/lib/solargraph/parser/comment_ripper.rb +52 -0
  107. data/lib/solargraph/parser/legacy.rb +12 -0
  108. data/lib/solargraph/parser/legacy/class_methods.rb +109 -0
  109. data/lib/solargraph/parser/legacy/flawed_builder.rb +16 -0
  110. data/lib/solargraph/parser/legacy/node_chainer.rb +118 -0
  111. data/lib/solargraph/parser/legacy/node_methods.rb +300 -0
  112. data/lib/solargraph/parser/legacy/node_processors.rb +54 -0
  113. data/lib/solargraph/parser/legacy/node_processors/alias_node.rb +23 -0
  114. data/lib/solargraph/parser/legacy/node_processors/args_node.rb +35 -0
  115. data/lib/solargraph/parser/legacy/node_processors/begin_node.rb +15 -0
  116. data/lib/solargraph/parser/legacy/node_processors/block_node.rb +22 -0
  117. data/lib/solargraph/parser/legacy/node_processors/casgn_node.rb +25 -0
  118. data/lib/solargraph/parser/legacy/node_processors/cvasgn_node.rb +23 -0
  119. data/lib/solargraph/parser/legacy/node_processors/def_node.rb +63 -0
  120. data/lib/solargraph/parser/legacy/node_processors/defs_node.rb +36 -0
  121. data/lib/solargraph/parser/legacy/node_processors/gvasgn_node.rb +23 -0
  122. data/lib/solargraph/parser/legacy/node_processors/ivasgn_node.rb +38 -0
  123. data/lib/solargraph/parser/legacy/node_processors/lvasgn_node.rb +28 -0
  124. data/lib/solargraph/parser/legacy/node_processors/namespace_node.rb +39 -0
  125. data/lib/solargraph/parser/legacy/node_processors/orasgn_node.rb +16 -0
  126. data/lib/solargraph/parser/legacy/node_processors/resbody_node.rb +36 -0
  127. data/lib/solargraph/parser/legacy/node_processors/sclass_node.rb +21 -0
  128. data/lib/solargraph/parser/legacy/node_processors/send_node.rb +234 -0
  129. data/lib/solargraph/parser/legacy/node_processors/sym_node.rb +18 -0
  130. data/lib/solargraph/parser/node_methods.rb +43 -0
  131. data/lib/solargraph/parser/node_processor.rb +43 -0
  132. data/lib/solargraph/parser/node_processor/base.rb +77 -0
  133. data/lib/solargraph/parser/region.rb +66 -0
  134. data/lib/solargraph/parser/rubyvm.rb +40 -0
  135. data/lib/solargraph/parser/rubyvm/class_methods.rb +150 -0
  136. data/lib/solargraph/parser/rubyvm/node_chainer.rb +135 -0
  137. data/lib/solargraph/parser/rubyvm/node_methods.rb +284 -0
  138. data/lib/solargraph/parser/rubyvm/node_processors.rb +61 -0
  139. data/lib/solargraph/parser/rubyvm/node_processors/alias_node.rb +23 -0
  140. data/lib/solargraph/parser/rubyvm/node_processors/args_node.rb +62 -0
  141. data/lib/solargraph/parser/rubyvm/node_processors/begin_node.rb +15 -0
  142. data/lib/solargraph/parser/rubyvm/node_processors/block_node.rb +22 -0
  143. data/lib/solargraph/parser/rubyvm/node_processors/casgn_node.rb +22 -0
  144. data/lib/solargraph/parser/rubyvm/node_processors/cvasgn_node.rb +23 -0
  145. data/lib/solargraph/parser/rubyvm/node_processors/def_node.rb +64 -0
  146. data/lib/solargraph/parser/rubyvm/node_processors/defs_node.rb +57 -0
  147. data/lib/solargraph/parser/rubyvm/node_processors/gvasgn_node.rb +23 -0
  148. data/lib/solargraph/parser/rubyvm/node_processors/ivasgn_node.rb +38 -0
  149. data/lib/solargraph/parser/rubyvm/node_processors/kw_arg_node.rb +39 -0
  150. data/lib/solargraph/parser/rubyvm/node_processors/lit_node.rb +20 -0
  151. data/lib/solargraph/parser/rubyvm/node_processors/lvasgn_node.rb +27 -0
  152. data/lib/solargraph/parser/rubyvm/node_processors/namespace_node.rb +39 -0
  153. data/lib/solargraph/parser/rubyvm/node_processors/opt_arg_node.rb +31 -0
  154. data/lib/solargraph/parser/rubyvm/node_processors/orasgn_node.rb +15 -0
  155. data/lib/solargraph/parser/rubyvm/node_processors/resbody_node.rb +45 -0
  156. data/lib/solargraph/parser/rubyvm/node_processors/sclass_node.rb +21 -0
  157. data/lib/solargraph/parser/rubyvm/node_processors/scope_node.rb +15 -0
  158. data/lib/solargraph/parser/rubyvm/node_processors/send_node.rb +255 -0
  159. data/lib/solargraph/parser/rubyvm/node_processors/sym_node.rb +18 -0
  160. data/lib/solargraph/parser/snippet.rb +13 -0
  161. data/lib/solargraph/pin.rb +39 -0
  162. data/lib/solargraph/pin/attribute.rb +49 -0
  163. data/lib/solargraph/pin/base.rb +296 -0
  164. data/lib/solargraph/pin/base_method.rb +141 -0
  165. data/lib/solargraph/pin/base_variable.rb +84 -0
  166. data/lib/solargraph/pin/block.rb +48 -0
  167. data/lib/solargraph/pin/class_variable.rb +8 -0
  168. data/lib/solargraph/pin/closure.rb +37 -0
  169. data/lib/solargraph/pin/common.rb +70 -0
  170. data/lib/solargraph/pin/constant.rb +43 -0
  171. data/lib/solargraph/pin/conversions.rb +97 -0
  172. data/lib/solargraph/pin/documenting.rb +110 -0
  173. data/lib/solargraph/pin/duck_method.rb +16 -0
  174. data/lib/solargraph/pin/global_variable.rb +8 -0
  175. data/lib/solargraph/pin/instance_variable.rb +30 -0
  176. data/lib/solargraph/pin/keyword.rb +15 -0
  177. data/lib/solargraph/pin/keyword_param.rb +8 -0
  178. data/lib/solargraph/pin/local_variable.rb +21 -0
  179. data/lib/solargraph/pin/localized.rb +43 -0
  180. data/lib/solargraph/pin/method.rb +111 -0
  181. data/lib/solargraph/pin/method_alias.rb +31 -0
  182. data/lib/solargraph/pin/namespace.rb +85 -0
  183. data/lib/solargraph/pin/parameter.rb +206 -0
  184. data/lib/solargraph/pin/proxy_type.rb +29 -0
  185. data/lib/solargraph/pin/reference.rb +14 -0
  186. data/lib/solargraph/pin/reference/extend.rb +10 -0
  187. data/lib/solargraph/pin/reference/include.rb +10 -0
  188. data/lib/solargraph/pin/reference/override.rb +29 -0
  189. data/lib/solargraph/pin/reference/prepend.rb +10 -0
  190. data/lib/solargraph/pin/reference/require.rb +14 -0
  191. data/lib/solargraph/pin/reference/superclass.rb +10 -0
  192. data/lib/solargraph/pin/singleton.rb +11 -0
  193. data/lib/solargraph/pin/symbol.rb +47 -0
  194. data/lib/solargraph/pin/yard_pin.rb +12 -0
  195. data/lib/solargraph/pin/yard_pin/constant.rb +25 -0
  196. data/lib/solargraph/pin/yard_pin/method.rb +65 -0
  197. data/lib/solargraph/pin/yard_pin/namespace.rb +27 -0
  198. data/lib/solargraph/pin/yard_pin/yard_mixin.rb +26 -0
  199. data/lib/solargraph/position.rb +112 -0
  200. data/lib/solargraph/range.rb +95 -0
  201. data/lib/solargraph/server_methods.rb +16 -0
  202. data/lib/solargraph/shell.rb +221 -0
  203. data/lib/solargraph/source.rb +533 -0
  204. data/lib/solargraph/source/chain.rb +172 -0
  205. data/lib/solargraph/source/chain/block_variable.rb +13 -0
  206. data/lib/solargraph/source/chain/call.rb +203 -0
  207. data/lib/solargraph/source/chain/class_variable.rb +13 -0
  208. data/lib/solargraph/source/chain/constant.rb +75 -0
  209. data/lib/solargraph/source/chain/global_variable.rb +13 -0
  210. data/lib/solargraph/source/chain/head.rb +35 -0
  211. data/lib/solargraph/source/chain/instance_variable.rb +13 -0
  212. data/lib/solargraph/source/chain/link.rb +67 -0
  213. data/lib/solargraph/source/chain/literal.rb +23 -0
  214. data/lib/solargraph/source/chain/or.rb +23 -0
  215. data/lib/solargraph/source/chain/variable.rb +13 -0
  216. data/lib/solargraph/source/chain/z_super.rb +184 -0
  217. data/lib/solargraph/source/change.rb +79 -0
  218. data/lib/solargraph/source/cursor.rb +164 -0
  219. data/lib/solargraph/source/encoding_fixes.rb +23 -0
  220. data/lib/solargraph/source/source_chainer.rb +189 -0
  221. data/lib/solargraph/source/updater.rb +54 -0
  222. data/lib/solargraph/source_map.rb +170 -0
  223. data/lib/solargraph/source_map/clip.rb +190 -0
  224. data/lib/solargraph/source_map/completion.rb +23 -0
  225. data/lib/solargraph/source_map/mapper.rb +199 -0
  226. data/lib/solargraph/stdlib_fills.rb +32 -0
  227. data/lib/solargraph/type_checker.rb +498 -0
  228. data/lib/solargraph/type_checker/checks.rb +95 -0
  229. data/lib/solargraph/type_checker/param_def.rb +35 -0
  230. data/lib/solargraph/type_checker/problem.rb +32 -0
  231. data/lib/solargraph/type_checker/rules.rb +53 -0
  232. data/lib/solargraph/version.rb +5 -0
  233. data/lib/solargraph/views/_method.erb +62 -0
  234. data/lib/solargraph/views/_name_type_tag.erb +10 -0
  235. data/lib/solargraph/views/_namespace.erb +24 -0
  236. data/lib/solargraph/views/document.erb +23 -0
  237. data/lib/solargraph/views/environment.erb +58 -0
  238. data/lib/solargraph/views/layout.erb +44 -0
  239. data/lib/solargraph/views/search.erb +11 -0
  240. data/lib/solargraph/workspace.rb +209 -0
  241. data/lib/solargraph/workspace/config.rb +215 -0
  242. data/lib/solargraph/yard_map.rb +420 -0
  243. data/lib/solargraph/yard_map/cache.rb +19 -0
  244. data/lib/solargraph/yard_map/core_docs.rb +170 -0
  245. data/lib/solargraph/yard_map/core_gen.rb +76 -0
  246. data/lib/solargraph/yard_map/mapper.rb +71 -0
  247. data/lib/solargraph/yard_map/rdoc_to_yard.rb +136 -0
  248. data/lib/yard-solargraph.rb +30 -0
  249. data/solargraph.gemspec +41 -0
  250. data/travis-bundler.rb +11 -0
  251. data/yardoc/2.2.2.tar.gz +0 -0
  252. metadata +575 -0
@@ -0,0 +1,141 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Pin
5
+ # The base class for method and attribute pins.
6
+ #
7
+ class BaseMethod < Closure
8
+ # @return [::Symbol] :public, :private, or :protected
9
+ attr_reader :visibility
10
+
11
+ # @return [Parser::AST::Node]
12
+ attr_reader :node
13
+
14
+ # @param visibility [::Symbol] :public, :protected, or :private
15
+ # @param explicit [Boolean]
16
+ def initialize visibility: :public, explicit: true, **splat
17
+ super(**splat)
18
+ @visibility = visibility
19
+ @explicit = explicit
20
+ end
21
+
22
+ def return_type
23
+ @return_type ||= generate_complex_type
24
+ end
25
+
26
+ def path
27
+ @path ||= "#{namespace}#{(scope == :instance ? '#' : '.')}#{name}"
28
+ end
29
+
30
+ def typify api_map
31
+ decl = super
32
+ return decl unless decl.undefined?
33
+ type = see_reference(api_map) || typify_from_super(api_map)
34
+ return type.qualify(api_map, namespace) unless type.nil?
35
+ name.end_with?('?') ? ComplexType::BOOLEAN : ComplexType::UNDEFINED
36
+ end
37
+
38
+ # @return [Array<Pin::Parameter>]
39
+ def parameters
40
+ @parameters ||= []
41
+ end
42
+
43
+ # @return [Array<String>]
44
+ def parameter_names
45
+ parameters.map(&:name)
46
+ end
47
+
48
+ def documentation
49
+ if @documentation.nil?
50
+ @documentation ||= super || ''
51
+ param_tags = docstring.tags(:param)
52
+ unless param_tags.nil? or param_tags.empty?
53
+ @documentation += "\n\n" unless @documentation.empty?
54
+ @documentation += "Params:\n"
55
+ lines = []
56
+ param_tags.each do |p|
57
+ l = "* #{p.name}"
58
+ l += " [#{escape_brackets(p.types.join(', '))}]" unless p.types.nil? or p.types.empty?
59
+ l += " #{p.text}"
60
+ lines.push l
61
+ end
62
+ @documentation += lines.join("\n")
63
+ end
64
+ return_tags = docstring.tags(:return)
65
+ unless return_tags.empty?
66
+ @documentation += "\n\n" unless @documentation.empty?
67
+ @documentation += "Returns:\n"
68
+ lines = []
69
+ return_tags.each do |r|
70
+ l = "*"
71
+ l += " [#{escape_brackets(r.types.join(', '))}]" unless r.types.nil? or r.types.empty?
72
+ l += " #{r.text}"
73
+ lines.push l
74
+ end
75
+ @documentation += lines.join("\n")
76
+ end
77
+ @documentation += "\n\n" unless @documentation.empty?
78
+ @documentation += "Visibility: #{visibility}"
79
+ end
80
+ @documentation.to_s
81
+ end
82
+
83
+ def explicit?
84
+ @explicit
85
+ end
86
+
87
+ private
88
+
89
+ # @return [ComplexType]
90
+ def generate_complex_type
91
+ tags = docstring.tags(:return).map(&:types).flatten.reject(&:nil?)
92
+ return ComplexType::UNDEFINED if tags.empty?
93
+ ComplexType.try_parse *tags
94
+ end
95
+
96
+ # @param api_map [ApiMap]
97
+ # @return [ComplexType, nil]
98
+ def see_reference api_map
99
+ docstring.ref_tags.each do |ref|
100
+ next unless ref.tag_name == 'return' && ref.owner
101
+ result = resolve_reference(ref.owner.to_s, api_map)
102
+ return result unless result.nil?
103
+ end
104
+ match = comments.match(/^[ \t]*\(see (.*)\)/m)
105
+ return nil if match.nil?
106
+ resolve_reference match[1], api_map
107
+ end
108
+
109
+ # @param api_map [ApiMap]
110
+ # @return [ComplexType, nil]
111
+ def typify_from_super api_map
112
+ stack = api_map.get_method_stack(namespace, name, scope: scope).reject { |pin| pin.path == path }
113
+ return nil if stack.empty?
114
+ stack.each do |pin|
115
+ return pin.return_type unless pin.return_type.undefined?
116
+ end
117
+ nil
118
+ end
119
+
120
+ # @param ref [String]
121
+ # @param api_map [ApiMap]
122
+ # @return [ComplexType]
123
+ def resolve_reference ref, api_map
124
+ parts = ref.split(/[\.#]/)
125
+ if parts.first.empty? || parts.one?
126
+ path = "#{namespace}#{ref}"
127
+ else
128
+ fqns = api_map.qualify(parts.first, namespace)
129
+ return ComplexType::UNDEFINED if fqns.nil?
130
+ path = fqns + ref[parts.first.length] + parts.last
131
+ end
132
+ pins = api_map.get_path_pins(path)
133
+ pins.each do |pin|
134
+ type = pin.typify(api_map)
135
+ return type unless type.undefined?
136
+ end
137
+ nil
138
+ end
139
+ end
140
+ end
141
+ end
@@ -0,0 +1,84 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Pin
5
+ class BaseVariable < Base
6
+ include Solargraph::Parser::NodeMethods
7
+ # include Solargraph::Source::NodeMethods
8
+
9
+ # @return [Parser::AST::Node, nil]
10
+ attr_reader :assignment
11
+
12
+ # @param assignment [Parser::AST::Node, nil]
13
+ def initialize assignment: nil, **splat
14
+ super(**splat)
15
+ @assignment = assignment
16
+ end
17
+
18
+ def completion_item_kind
19
+ Solargraph::LanguageServer::CompletionItemKinds::VARIABLE
20
+ end
21
+
22
+ # @return [Integer]
23
+ def symbol_kind
24
+ Solargraph::LanguageServer::SymbolKinds::VARIABLE
25
+ end
26
+
27
+ def return_type
28
+ @return_type ||= generate_complex_type
29
+ end
30
+
31
+ def nil_assignment?
32
+ return_type.nil?
33
+ end
34
+
35
+ def variable?
36
+ true
37
+ end
38
+
39
+ def probe api_map
40
+ return ComplexType::UNDEFINED if @assignment.nil?
41
+ types = []
42
+ returns_from(@assignment).each do |node|
43
+ # Nil nodes may not have a location
44
+ if node.nil? || node.type == :NIL || node.type == :nil
45
+ types.push ComplexType::NIL
46
+ else
47
+ rng = Range.from_node(node)
48
+ next if rng.nil?
49
+ pos = rng.ending
50
+ clip = api_map.clip_at(location.filename, pos)
51
+ # Use the return node for inference. The clip might infer from the
52
+ # first node in a method call instead of the entire call.
53
+ chain = Parser.chain(node, nil, clip.in_block?)
54
+ result = chain.infer(api_map, closure, clip.locals)
55
+ types.push result unless result.undefined?
56
+ end
57
+ end
58
+ return ComplexType::UNDEFINED if types.empty?
59
+ ComplexType.try_parse(*types.map(&:tag))
60
+ end
61
+
62
+ def == other
63
+ return false unless super
64
+ assignment == other.assignment
65
+ end
66
+
67
+ def try_merge! pin
68
+ return false unless super
69
+ @assignment = pin.assignment
70
+ @return_type = pin.return_type
71
+ true
72
+ end
73
+
74
+ private
75
+
76
+ # @return [ComplexType]
77
+ def generate_complex_type
78
+ tag = docstring.tag(:type)
79
+ return ComplexType.try_parse(*tag.types) unless tag.nil? || tag.types.nil? || tag.types.empty?
80
+ ComplexType.new
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Pin
5
+ class Block < Closure
6
+ # The signature of the method that receives this block.
7
+ #
8
+ # @return [Parser::AST::Node]
9
+ attr_reader :receiver
10
+
11
+ def initialize receiver: nil, args: [], **splat
12
+ super(**splat)
13
+ @receiver = receiver
14
+ @parameters = args
15
+ end
16
+
17
+ def rebind context
18
+ @rebound = true
19
+ @binder = context unless context.undefined?
20
+ end
21
+
22
+ def rebound?
23
+ @rebound ||= false
24
+ end
25
+
26
+ def binder
27
+ @binder || context
28
+ end
29
+
30
+ # @return [Array<String>]
31
+ def parameters
32
+ @parameters ||= []
33
+ end
34
+
35
+ # @return [Array<String>]
36
+ def parameter_names
37
+ @parameter_names ||= parameters.map(&:name)
38
+ end
39
+
40
+ def nearly? other
41
+ return false unless super
42
+ # @todo Trying to not to block merges too much
43
+ # receiver == other.receiver and parameters == other.parameters
44
+ true
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Pin
5
+ class ClassVariable < BaseVariable
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,37 @@
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
@@ -0,0 +1,70 @@
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::BaseMethod)
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
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Pin
5
+ class Constant < BaseVariable
6
+ attr_reader :visibility
7
+
8
+ def initialize visibility: :public, **splat
9
+ super(**splat)
10
+ @visibility = visibility
11
+ end
12
+
13
+ def return_type
14
+ @return_type ||= generate_complex_type
15
+ end
16
+
17
+ def completion_item_kind
18
+ Solargraph::LanguageServer::CompletionItemKinds::CONSTANT
19
+ end
20
+
21
+ # @return [Integer]
22
+ def symbol_kind
23
+ LanguageServer::SymbolKinds::CONSTANT
24
+ end
25
+
26
+ def path
27
+ @path ||= context.namespace.to_s.empty? ? name : "#{context.namespace}::#{name}"
28
+ end
29
+
30
+ private
31
+
32
+ # @return [ComplexType]
33
+ def generate_complex_type
34
+ tags = docstring.tags(:return).map(&:types).flatten.reject(&:nil?)
35
+ if tags.empty?
36
+ tags = docstring.tags(:type).map(&:types).flatten.reject(&:nil?)
37
+ end
38
+ return ComplexType::UNDEFINED if tags.empty?
39
+ ComplexType.try_parse *tags
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,97 @@
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
+ if @resolve_completion_item.nil?
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
+ @resolve_completion_item = completion_item.merge(extra)
34
+ end
35
+ @resolve_completion_item
36
+ end
37
+
38
+ # @return [Hash]
39
+ def signature_help
40
+ @signature_help ||= {
41
+ label: name + '(' + parameters.map(&:full).join(', ') + ')',
42
+ documentation: documentation
43
+ }
44
+ end
45
+
46
+ # @return [String]
47
+ def detail
48
+ # This property is not cached in an instance variable because it can
49
+ # change when pins get proxied.
50
+ detail = String.new
51
+ detail += "(#{parameters.map(&:full).join(', ')}) " unless !is_a?(Pin::BaseMethod) || parameters.empty?
52
+ detail += "=#{probed? ? '~' : (proxied? ? '^' : '>')} #{return_type.to_s}" unless return_type.undefined?
53
+ detail.strip!
54
+ return nil if detail.empty?
55
+ detail
56
+ end
57
+
58
+ # Get a markdown-flavored link to a documentation page.
59
+ #
60
+ # @return [String]
61
+ def link_documentation
62
+ @link_documentation ||= generate_link
63
+ end
64
+
65
+ def text_documentation
66
+ this_path = path || return_type.tag
67
+ return nil if this_path == 'undefined'
68
+ escape_brackets this_path
69
+ end
70
+
71
+ def reset_conversions
72
+ @completion_item = nil
73
+ @resolve_completion_item = nil
74
+ @signature_help = nil
75
+ @detail = nil
76
+ @link_documentation = nil
77
+ end
78
+
79
+ private
80
+
81
+ # @return [String]
82
+ def generate_link
83
+ this_path = path || return_type.tag
84
+ return nil if this_path == 'undefined'
85
+ return nil if this_path.nil? || this_path == 'undefined'
86
+ "[#{escape_brackets(this_path).gsub('_', '\\\\_')}](solargraph:/document?query=#{CGI.escape(this_path)})"
87
+ end
88
+
89
+ # @param text [String]
90
+ # @return [String]
91
+ def escape_brackets text
92
+ # text.gsub(/(\<|\>)/, "\\#{$1}")
93
+ text.gsub("<", '\<').gsub(">", '\>')
94
+ end
95
+ end
96
+ end
97
+ end