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,110 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'maruku'
4
+ require 'yard'
5
+ require 'reverse_markdown'
6
+ require 'solargraph/converters/dl'
7
+ require 'solargraph/converters/dt'
8
+ require 'solargraph/converters/dd'
9
+ require 'solargraph/converters/misc'
10
+
11
+ # HACK: Setting :html_parser through `Maruku.new` does not work
12
+ MaRuKu::Globals[:html_parser] = 'nokogiri'
13
+
14
+ module Solargraph
15
+ module Pin
16
+ # A module to add the Pin::Base#documentation method.
17
+ #
18
+ module Documenting
19
+ # A documentation formatter that either performs Markdown conversion for
20
+ # text, or applies backticks for code blocks.
21
+ #
22
+ class DocSection
23
+ # @return [String]
24
+ attr_reader :plaintext
25
+
26
+ # @param code [Boolean] True if this section is a code block
27
+ def initialize code
28
+ @plaintext = String.new('')
29
+ @code = code
30
+ end
31
+
32
+ def code?
33
+ @code
34
+ end
35
+
36
+ # @param text [String]
37
+ # @return [String]
38
+ def concat text
39
+ @plaintext.concat text
40
+ end
41
+
42
+ def to_s
43
+ return "\n```ruby\n#{@plaintext}#{@plaintext.end_with?("\n") ? '' : "\n"}```\n\n" if code?
44
+ ReverseMarkdown.convert unescape_brackets(Maruku.new(escape_brackets(@plaintext), on_error: :raise).to_html)
45
+ rescue MaRuKu::Exception
46
+ # Maruku exceptions usually indicate that the documentation is in
47
+ # RDoc syntax.
48
+ ReverseMarkdown.convert YARD::Templates::Helpers::Markup::RDocMarkup.new(@plaintext).to_html
49
+ end
50
+
51
+ private
52
+
53
+ # @param text [String]
54
+ # @return [String]
55
+ def escape_brackets text
56
+ text.gsub(/(\[[^\]]*\])([^\(]|\z)/, '!!!`\1`!!!\2')
57
+ end
58
+
59
+ # @param text [String]
60
+ # @return [String]
61
+ def unescape_brackets text
62
+ text.gsub('!!!`[', '[').gsub(']`!!!', ']')
63
+ end
64
+ end
65
+
66
+ # @return [String]
67
+ def documentation
68
+ @documentation ||= begin
69
+ # Using DocSections allows for code blocks that start with an empty
70
+ # line and at least two spaces of indentation. This is a common
71
+ # convention in Ruby core documentation, e.g., String#split.
72
+ sections = [DocSection.new(false)]
73
+ normalize_indentation(docstring.to_s).gsub(/\t/, ' ').lines.each do |l|
74
+ if l.strip.empty?
75
+ sections.last.concat l
76
+ else
77
+ if (l =~ /^ [^\s]/ && sections.last.plaintext =~ /(\r?\n[ \t]*?){2,}$/) || (l.start_with?(' ') && sections.last.code?)
78
+ # Code block
79
+ sections.push DocSection.new(true) unless sections.last.code?
80
+ sections.last.concat l[2..-1]
81
+ else
82
+ # Regular documentation
83
+ sections.push DocSection.new(false) if sections.last.code?
84
+ sections.last.concat l
85
+ end
86
+ end
87
+ end
88
+ sections.map(&:to_s).join
89
+ end
90
+ end
91
+
92
+ private
93
+
94
+ # @param text [String]
95
+ # @return [String]
96
+ def normalize_indentation text
97
+ text.lines.map { |l| remove_odd_spaces(l) }.join
98
+ end
99
+
100
+ # @param line [String]
101
+ # @return [String]
102
+ def remove_odd_spaces line
103
+ return line unless line.start_with?(' ')
104
+ spaces = line.match(/^ +/)[0].length
105
+ return line unless spaces.odd?
106
+ line[1..-1]
107
+ end
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Pin
5
+ # DuckMethod pins are used to add completion items for type tags that
6
+ # use duck typing, e.g., `@param file [#read]`.
7
+ #
8
+ class DuckMethod < Pin::Method
9
+ # @param location [Solargraph::Location]
10
+ # @param name [String]
11
+ # def initialize location, name
12
+ # # super(location, '', name, nil, :instance, :public, [])
13
+ # end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Pin
5
+ class GlobalVariable < BaseVariable
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Pin
5
+ class InstanceVariable < BaseVariable
6
+ def binder
7
+ closure.binder
8
+ end
9
+
10
+ def scope
11
+ closure.binder.scope
12
+ end
13
+
14
+ def context
15
+ @context ||= begin
16
+ result = super
17
+ if scope == :class
18
+ ComplexType.parse("Class<#{result.namespace}>")
19
+ else
20
+ ComplexType.parse("#{result.namespace}")
21
+ end
22
+ end
23
+ end
24
+
25
+ def nearly? other
26
+ super && binder == other.binder
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Pin
5
+ class Keyword < Base
6
+ def initialize name
7
+ super(name: name)
8
+ end
9
+
10
+ def name
11
+ @name
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Pin
5
+ class KeywordParam < Symbol
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Pin
5
+ class LocalVariable < BaseVariable
6
+ include Localized
7
+
8
+ def initialize assignment: nil, presence: nil, **splat
9
+ super(**splat)
10
+ @assignment = assignment
11
+ @presence = presence
12
+ end
13
+
14
+ def try_merge! pin
15
+ return false unless super
16
+ @presence = pin.presence
17
+ true
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Pin
5
+ module Localized
6
+ # @return [Range]
7
+ attr_reader :presence
8
+
9
+ # @param other [Pin::Base] The caller's block
10
+ # @param position [Position, Array(Integer, Integer)] The caller's position
11
+ # @return [Boolean]
12
+ def visible_from?(other, position)
13
+ position = Position.normalize(position)
14
+ other.filename == filename &&
15
+ match_tags(other.full_context.tag, full_context.tag) &&
16
+ (other == closure ||
17
+ (closure.location.range.contain?(other.location.range.start) && closure.location.range.contain?(other.location.range.ending))
18
+ ) &&
19
+ presence.contain?(position)
20
+ end
21
+
22
+ # @param other_loc [Location]
23
+ def visible_at?(other_loc)
24
+ return false if location.filename != other_loc.filename
25
+ presence.include?(other_loc.range.start)
26
+ end
27
+
28
+ private
29
+
30
+ # @param tag1 [String]
31
+ # @param tag2 [String]
32
+ # @return [Boolean]
33
+ def match_tags tag1, tag2
34
+ # @todo This is an unfortunate hack made necessary by a discrepancy in
35
+ # how tags indicate the root namespace. The long-term solution is to
36
+ # standardize it, whether it's `Class<>`, an empty string, or
37
+ # something else.
38
+ tag1 == tag2 ||
39
+ (['', 'Class<>'].include?(tag1) && ['', 'Class<>'].include?(tag2))
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,111 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Pin
5
+ class Method < BaseMethod
6
+ include Solargraph::Parser::NodeMethods
7
+
8
+ # @return [Array<String>]
9
+ attr_reader :parameters
10
+
11
+ # @param args [Array<String>]
12
+ # @param node [Parser::AST::Node, nil]
13
+ def initialize parameters: [], node: nil, **splat
14
+ super(**splat)
15
+ @parameters = parameters
16
+ @node = node
17
+ end
18
+
19
+ # @return [Array<String>]
20
+ def parameter_names
21
+ @parameter_names ||= parameters.map(&:name)
22
+ end
23
+
24
+ def completion_item_kind
25
+ Solargraph::LanguageServer::CompletionItemKinds::METHOD
26
+ end
27
+
28
+ def symbol_kind
29
+ LanguageServer::SymbolKinds::METHOD
30
+ end
31
+
32
+ def nearly? other
33
+ return false unless super
34
+ parameters == other.parameters and
35
+ scope == other.scope and
36
+ visibility == other.visibility
37
+ end
38
+
39
+ def probe api_map
40
+ infer_from_return_nodes(api_map)
41
+ end
42
+
43
+ def try_merge! pin
44
+ return false unless super
45
+ @node = pin.node
46
+ true
47
+ end
48
+
49
+ # @return [Array<Pin::Method>]
50
+ def overloads
51
+ @overloads ||= docstring.tags(:overload).map do |tag|
52
+ Solargraph::Pin::Method.new(
53
+ name: name,
54
+ closure: self,
55
+ # args: tag.parameters.map(&:first),
56
+ parameters: tag.parameters.map do |src|
57
+ Pin::Parameter.new(
58
+ location: location,
59
+ closure: self,
60
+ comments: tag.docstring.all.to_s,
61
+ name: src.first,
62
+ presence: location ? location.range : nil,
63
+ decl: :arg
64
+ )
65
+ end,
66
+ comments: tag.docstring.all.to_s
67
+ )
68
+ end
69
+ end
70
+
71
+ private
72
+
73
+ # @return [Parser::AST::Node, nil]
74
+ def method_body_node
75
+ return nil if node.nil?
76
+ return node.children[1].children.last if node.type == :DEFN
77
+ return node.children[2].children.last if node.type == :DEFS
78
+ return node.children[2] if node.type == :def || node.type == :DEFS
79
+ return node.children[3] if node.type == :defs
80
+ nil
81
+ end
82
+
83
+ # @param api_map [ApiMap]
84
+ # @return [ComplexType]
85
+ def infer_from_return_nodes api_map
86
+ return ComplexType::UNDEFINED if node.nil?
87
+ result = []
88
+ has_nil = false
89
+ return ComplexType::NIL if method_body_node.nil?
90
+ returns_from(method_body_node).each do |n|
91
+ if n.nil? || [:NIL, :nil].include?(n.type)
92
+ has_nil = true
93
+ next
94
+ end
95
+ rng = Range.from_node(n)
96
+ next unless rng
97
+ clip = api_map.clip_at(
98
+ location.filename,
99
+ rng.ending
100
+ )
101
+ chain = Solargraph::Parser.chain(n, location.filename)
102
+ type = chain.infer(api_map, self, clip.locals)
103
+ result.push type unless type.undefined?
104
+ end
105
+ result.push ComplexType::NIL if has_nil
106
+ return ComplexType::UNDEFINED if result.empty?
107
+ ComplexType.try_parse(*result.map(&:tag).uniq)
108
+ end
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Pin
5
+ # Use this class to track method aliases for later remapping. Common
6
+ # examples that defer mapping are aliases for superclass methods or
7
+ # methods from included modules.
8
+ #
9
+ class MethodAlias < BaseMethod
10
+ # @return [::Symbol]
11
+ attr_reader :scope
12
+
13
+ # @return [String]
14
+ attr_reader :original
15
+
16
+ def initialize scope: :instance, original: nil, **splat
17
+ super(**splat)
18
+ @scope = scope
19
+ @original = original
20
+ end
21
+
22
+ def visibility
23
+ :public
24
+ end
25
+
26
+ def path
27
+ @path ||= namespace + (scope == :instance ? '#' : '.') + name
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,85 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Pin
5
+ class Namespace < Closure
6
+ # @return [::Symbol] :public or :private
7
+ attr_reader :visibility
8
+
9
+ # @return [::Symbol] :class or :module
10
+ attr_reader :type
11
+
12
+ # @param type [Symbol] :class or :module
13
+ # @param visibility [Symbol] :public or :private
14
+ # @param gates [Array<String>]
15
+ def initialize type: :class, visibility: :public, gates: [''], **splat
16
+ # super(location, namespace, name, comments)
17
+ super(**splat)
18
+ @type = type
19
+ @visibility = visibility
20
+ if name.start_with?('::')
21
+ @name = name[2..-1]
22
+ @closure = Solargraph::Pin::ROOT_PIN
23
+ end
24
+ @open_gates = gates
25
+ if @open_gates.one? && @open_gates.first.empty? && @name.include?('::')
26
+ # In this case, a chained namespace was opened (e.g., Foo::Bar)
27
+ # but Foo does not exist.
28
+ parts = @name.split('::')
29
+ @name = parts.pop
30
+ @closure = Pin::Namespace.new(name: parts.join('::'), gates: [parts.join('::')])
31
+ @context = nil
32
+ end
33
+ end
34
+
35
+ def namespace
36
+ context.namespace
37
+ end
38
+
39
+ def full_context
40
+ @full_context ||= ComplexType.try_parse("#{type.to_s.capitalize}<#{path}>")
41
+ end
42
+
43
+ def binder
44
+ full_context
45
+ end
46
+
47
+ def scope
48
+ context.scope
49
+ end
50
+
51
+ def completion_item_kind
52
+ (type == :class ? LanguageServer::CompletionItemKinds::CLASS : LanguageServer::CompletionItemKinds::MODULE)
53
+ end
54
+
55
+ # @return [Integer]
56
+ def symbol_kind
57
+ (type == :class ? LanguageServer::SymbolKinds::CLASS : LanguageServer::SymbolKinds::MODULE)
58
+ end
59
+
60
+ def path
61
+ @path ||= (namespace.empty? ? '' : "#{namespace}::") + name
62
+ end
63
+
64
+ def return_type
65
+ @return_type ||= ComplexType.try_parse( (type == :class ? 'Class' : 'Module') + "<#{path}>" )
66
+ end
67
+
68
+ def domains
69
+ @domains ||= []
70
+ end
71
+
72
+ def typify api_map
73
+ return_type
74
+ end
75
+
76
+ def gates
77
+ @gates ||= if path.empty?
78
+ @open_gates
79
+ else
80
+ [path] + @open_gates
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end