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,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Convention
5
+ class Base
6
+ EMPTY_ENVIRON = Environ.new
7
+
8
+ # True if the source qualifies for this convention.
9
+ # Subclasses should override this method.
10
+ #
11
+ # @param source [Source]
12
+ def match? source
13
+ false
14
+ end
15
+
16
+ # The Environ for this convention.
17
+ # Subclasses should override this method.
18
+ #
19
+ # @return [Environ]
20
+ def environ
21
+ EMPTY_ENVIRON
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Convention
5
+ class Gemfile < Base
6
+ def match? source
7
+ File.basename(source.filename) == 'Gemfile'
8
+ end
9
+
10
+ def environ
11
+ @environ ||= Environ.new(
12
+ requires: ['bundler'],
13
+ domains: ['Bundler::Dsl']
14
+ )
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Convention
5
+ class Gemspec < Base
6
+ def match? source
7
+ File.basename(source.filename).end_with?('.gemspec')
8
+ end
9
+
10
+ def environ
11
+ @environ ||= Environ.new(
12
+ requires: ['rubygems'],
13
+ overrides: [
14
+ Solargraph::Pin::Reference::Override.from_comment(
15
+ 'Gem::Specification.new',
16
+ %(
17
+ @yieldparam [self]
18
+ )
19
+ )
20
+ ]
21
+ )
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Convention
5
+ class Rspec < Base
6
+ def match? source
7
+ File.basename(source.filename) =~ /_spec\.rb$/
8
+ end
9
+
10
+ def environ
11
+ @environ ||= Environ.new(
12
+ requires: ['rspec'],
13
+ domains: ['RSpec::Matchers', 'RSpec::ExpectationGroups'],
14
+ # This override is necessary due to an erroneous @return tag in
15
+ # rspec's YARD documentation.
16
+ # @todo The return types have been fixed (https://github.com/rspec/rspec-expectations/pull/1121)
17
+ overrides: [
18
+ Solargraph::Pin::Reference::Override.method_return('RSpec::Matchers#expect', 'RSpec::Expectations::ExpectationTarget')
19
+ ]
20
+ )
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,12 @@
1
+ module ReverseMarkdown
2
+ module Converters
3
+ class Dd < Base
4
+ def convert node, state = {}
5
+ content = treat_children(node, state)
6
+ ": #{content.strip}\n"
7
+ end
8
+ end
9
+ end
10
+ end
11
+
12
+ ReverseMarkdown::Converters.register :dd, ReverseMarkdown::Converters::Dd.new
@@ -0,0 +1,12 @@
1
+ module ReverseMarkdown
2
+ module Converters
3
+ class Dl < Base
4
+ def convert node, state = {}
5
+ content = treat_children(node, state).strip
6
+ "\n\n#{content}\n"
7
+ end
8
+ end
9
+ end
10
+ end
11
+
12
+ ReverseMarkdown::Converters.register :dl, ReverseMarkdown::Converters::Dl.new
@@ -0,0 +1,12 @@
1
+ module ReverseMarkdown
2
+ module Converters
3
+ class Dt < Base
4
+ def convert node, state = {}
5
+ content = treat_children(node, state)
6
+ "\n#{content.strip}\n"
7
+ end
8
+ end
9
+ end
10
+ end
11
+
12
+ ReverseMarkdown::Converters.register :dt, ReverseMarkdown::Converters::Dt.new
@@ -0,0 +1 @@
1
+ ReverseMarkdown::Converters.register :tt, ReverseMarkdown::Converters::Code.new
@@ -0,0 +1,159 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ # Overrides for the Ruby core.
5
+ #
6
+ # The YardMap uses this module to add type information to core methods.
7
+ #
8
+ module CoreFills
9
+ Override = Pin::Reference::Override
10
+
11
+ KEYWORDS = [
12
+ '__ENCODING__', '__LINE__', '__FILE__', 'BEGIN', 'END', 'alias', 'and',
13
+ 'begin', 'break', 'case', 'class', 'def', 'defined?', 'do', 'else',
14
+ 'elsif', 'end', 'ensure', 'false', 'for', 'if', 'in', 'module', 'next',
15
+ 'nil', 'not', 'or', 'redo', 'rescue', 'retry', 'return', 'self', 'super',
16
+ 'then', 'true', 'undef', 'unless', 'until', 'when', 'while', 'yield'
17
+ ].freeze
18
+
19
+ methods_with_yieldparam_subtypes = %w[
20
+ Array#each Array#map Array#map! Array#any? Array#all? Array#index
21
+ Array#keep_if Array#delete_if
22
+ Enumerable#each_entry Enumerable#map Enumerable#any? Enumerable#all?
23
+ Enumerable#select Enumerable#reject
24
+ Set#each
25
+ ]
26
+
27
+ OVERRIDES = [
28
+ Override.method_return('Array#keep_if', 'self'),
29
+ Override.method_return('Array#delete_if', 'self'),
30
+ Override.from_comment('Array#reject', %(
31
+ @overload reject(&block)
32
+ @return [self]
33
+ @overload reject()
34
+ @return [Enumerator]
35
+ )),
36
+ Override.method_return('Array#reverse', 'self', delete: ['overload']),
37
+ Override.from_comment('Array#select', %(
38
+ @overload select(&block)
39
+ @return [self]
40
+ @overload select()
41
+ @return [Enumerator]
42
+ )),
43
+ Override.from_comment('Array#[]', %(
44
+ @overload [](range)
45
+ @param range [Range]
46
+ @return [self]
47
+ @overload [](num1, num2)
48
+ @param num1 [Integer]
49
+ @param num2 [Integer]
50
+ @return [self]
51
+ @overload [](num)
52
+ @param num [Integer]
53
+ @return_single_parameter
54
+ @return_single_parameter
55
+ )),
56
+ Override.from_comment('Array#first', %(
57
+ @overload first(num)
58
+ @param num [Integer]
59
+ @return [self]
60
+ @return_single_parameter
61
+ )),
62
+ Override.from_comment('Array#last', %(
63
+ @overload last(num)
64
+ @param num [Integer]
65
+ @return [self]
66
+ @return_single_parameter
67
+ )),
68
+ Override.method_return('Array#uniq', 'self'),
69
+
70
+ Override.from_comment('BasicObject#==', %(
71
+ @param other [BasicObject]
72
+ @return [Boolean]
73
+ )),
74
+ Override.method_return('BasicObject#initialize', 'void'),
75
+
76
+ Override.method_return('Class#new', 'self'),
77
+ Override.method_return('Class.new', 'Class<Object>'),
78
+ Override.method_return('Class#allocate', 'self'),
79
+ Override.method_return('Class.allocate', 'Class<Object>'),
80
+
81
+ Override.method_return('Enumerable#select', 'self'),
82
+
83
+ Override.method_return('File.absolute_path', 'String'),
84
+ Override.method_return('File.basename', 'String'),
85
+ Override.method_return('File.dirname', 'String'),
86
+ Override.method_return('File.extname', 'String'),
87
+ Override.method_return('File.join', 'String'),
88
+
89
+ Override.from_comment('Float#+', %(
90
+ @param y [Numeric]
91
+ @return [Numeric]
92
+ )),
93
+
94
+ Override.from_comment('Hash#[]', %(
95
+ @return_value_parameter
96
+ )),
97
+
98
+ # @todo This override isn't robust enough. It needs to allow for
99
+ # parameterized Hash types, e.g., [Hash{Symbol => String}].
100
+ Override.from_comment('Hash#[]=', %(
101
+ @param_tuple
102
+ )),
103
+
104
+ Override.from_comment('Integer#+', %(
105
+ @param y [Numeric]
106
+ @return [Numeric]
107
+ )),
108
+
109
+ Override.method_return('Kernel#puts', 'nil'),
110
+
111
+ # Override.method_return('Module#attr_reader', 'void'),
112
+ # Override.method_return('Module#attr_writer', 'void'),
113
+ # Override.method_return('Module#attr_accessor', 'void'),
114
+
115
+ Override.from_comment('Numeric#+', %(
116
+ @param y [Numeric]
117
+ @return [Numeric]
118
+ )),
119
+
120
+ Override.method_return('Object#!', 'Boolean'),
121
+ Override.method_return('Object#clone', 'self', delete: [:overload]),
122
+ Override.method_return('Object#dup', 'self', delete: [:overload]),
123
+ Override.method_return('Object#freeze', 'self', delete: [:overload]),
124
+ Override.method_return('Object#inspect', 'String'),
125
+ Override.method_return('Object#taint', 'self'),
126
+ Override.method_return('Object#to_s', 'String'),
127
+ Override.method_return('Object#untaint', 'self'),
128
+ Override.from_comment('Object#tap', %(
129
+ @return [self]
130
+ @yieldparam [self]
131
+ )),
132
+
133
+ Override.from_comment('STDERR', %(
134
+ @type [IO]
135
+ )),
136
+
137
+ Override.from_comment('STDIN', %(
138
+ @type [IO]
139
+ )),
140
+
141
+ Override.from_comment('STDOUT', %(
142
+ @type [IO]
143
+ )),
144
+
145
+ Override.method_return('String#freeze', 'self'),
146
+ Override.method_return('String#split', 'Array<String>'),
147
+ Override.method_return('String#lines', 'Array<String>'),
148
+ Override.from_comment('String#each_line', %(
149
+ @yieldparam [String]
150
+ ))
151
+ ].concat(
152
+ methods_with_yieldparam_subtypes.map do |path|
153
+ Override.from_comment(path, %(
154
+ @yieldparam_single_parameter
155
+ ))
156
+ end
157
+ )
158
+ end
159
+ end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ # The Diagnostics library provides reporters for analyzing problems in code
5
+ # and providing the results to language server clients.
6
+ #
7
+ module Diagnostics
8
+ autoload :Base, 'solargraph/diagnostics/base'
9
+ autoload :Severities, 'solargraph/diagnostics/severities'
10
+ autoload :Rubocop, 'solargraph/diagnostics/rubocop'
11
+ autoload :RubocopHelpers, 'solargraph/diagnostics/rubocop_helpers'
12
+ autoload :RequireNotFound, 'solargraph/diagnostics/require_not_found'
13
+ autoload :UpdateErrors, 'solargraph/diagnostics/update_errors'
14
+ autoload :TypeCheck, 'solargraph/diagnostics/type_check'
15
+
16
+ class << self
17
+ # Add a reporter with a name to identify it in .solargraph.yml files.
18
+ #
19
+ # @param name [String] The name
20
+ # @param klass [Class<Solargraph::Diagnostics::Base>] The class implementation
21
+ # @return [void]
22
+ def register name, klass
23
+ reporter_hash[name] = klass
24
+ end
25
+
26
+ # Get an array of reporter names.
27
+ #
28
+ # @return [Array<String>]
29
+ def reporters
30
+ reporter_hash.keys - ['type_not_defined'] # @todo Hide type_not_defined for now
31
+ end
32
+
33
+ # Find a reporter by name.
34
+ #
35
+ # @param name [String] The name with which the reporter was registered
36
+ # @return [Class<Solargraph::Diagnostics::Base>]
37
+ def reporter name
38
+ reporter_hash[name]
39
+ end
40
+
41
+ private
42
+
43
+ # @return [Hash]
44
+ def reporter_hash
45
+ @reporter_hash ||= {}
46
+ end
47
+ end
48
+
49
+ register 'rubocop', Rubocop
50
+ register 'require_not_found', RequireNotFound
51
+ register 'typecheck', TypeCheck
52
+ register 'update_errors', UpdateErrors
53
+ register 'type_not_defined', TypeCheck # @todo Retained for backwards compatibility
54
+ end
55
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Diagnostics
5
+ # The base class for diagnostics reporters.
6
+ #
7
+ class Base
8
+ # @return [Array<String>]
9
+ attr_reader :args
10
+
11
+ def initialize *args
12
+ @args = args
13
+ end
14
+
15
+ # Perform a diagnosis on a Source within the context of an ApiMap.
16
+ # The result is an array of hash objects that conform to the LSP's
17
+ # Diagnostic specification.
18
+ #
19
+ # Subclasses should override this method.
20
+ #
21
+ # @param source [Solargraph::Source]
22
+ # @param api_map [Solargraph::ApiMap]
23
+ # @return [Array<Hash>]
24
+ def diagnose source, api_map
25
+ []
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Diagnostics
5
+ # RequireNotFound reports required paths that could not be resolved to
6
+ # either a file in the workspace or a gem.
7
+ #
8
+ class RequireNotFound < Base
9
+ def diagnose source, api_map
10
+ return [] unless source.parsed? && source.synchronized?
11
+ result = []
12
+ refs = {}
13
+ map = api_map.source_map(source.filename)
14
+ map.requires.each { |ref| refs[ref.name] = ref }
15
+ api_map.unresolved_requires.each do |r|
16
+ next unless refs.key?(r)
17
+ result.push require_error(r, refs[r].location)
18
+ end
19
+ result
20
+ end
21
+
22
+ private
23
+
24
+ # @param path [String]
25
+ # @param location [Location]
26
+ # @return [Hash]
27
+ def require_error path, location
28
+ {
29
+ range: location.range.to_hash,
30
+ severity: Diagnostics::Severities::WARNING,
31
+ source: 'RequireNotFound',
32
+ message: "Required path #{path} could not be resolved."
33
+ }
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,90 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rubocop'
4
+ require 'stringio'
5
+
6
+ module Solargraph
7
+ module Diagnostics
8
+ # This reporter provides linting through RuboCop.
9
+ #
10
+ class Rubocop < Base
11
+ include RubocopHelpers
12
+
13
+ # Conversion of RuboCop severity names to LSP constants
14
+ SEVERITIES = {
15
+ 'refactor' => Severities::HINT,
16
+ 'convention' => Severities::INFORMATION,
17
+ 'warning' => Severities::WARNING,
18
+ 'error' => Severities::ERROR,
19
+ 'fatal' => Severities::ERROR
20
+ }
21
+
22
+ # @param source [Solargraph::Source]
23
+ # @param _api_map [Solargraph::ApiMap]
24
+ # @return [Array<Hash>]
25
+ def diagnose source, _api_map
26
+ options, paths = generate_options(source.filename, source.code)
27
+ store = RuboCop::ConfigStore.new
28
+ runner = RuboCop::Runner.new(options, store)
29
+ result = redirect_stdout{ runner.run(paths) }
30
+ make_array JSON.parse(result)
31
+ rescue RuboCop::ValidationError, RuboCop::ConfigNotFoundError => e
32
+ raise DiagnosticsError, "Error in RuboCop configuration: #{e.message}"
33
+ rescue JSON::ParserError
34
+ raise DiagnosticsError, 'RuboCop returned invalid data'
35
+ end
36
+
37
+ private
38
+
39
+ # @param resp [Hash]
40
+ # @return [Array<Hash>]
41
+ def make_array resp
42
+ diagnostics = []
43
+ resp['files'].each do |file|
44
+ file['offenses'].each do |off|
45
+ diagnostics.push offense_to_diagnostic(off)
46
+ end
47
+ end
48
+ diagnostics
49
+ end
50
+
51
+ # Convert a RuboCop offense to an LSP diagnostic
52
+ #
53
+ # @param off [Hash] Offense received from Rubocop
54
+ # @return [Hash] LSP diagnostic
55
+ def offense_to_diagnostic off
56
+ {
57
+ range: offense_range(off).to_hash,
58
+ # 1 = Error, 2 = Warning, 3 = Information, 4 = Hint
59
+ severity: SEVERITIES[off['severity']],
60
+ source: off['cop_name'],
61
+ message: off['message'].gsub(/^#{off['cop_name']}\:/, '')
62
+ }
63
+ end
64
+
65
+ # @param off [Hash]
66
+ # @return [Range]
67
+ def offense_range off
68
+ Range.new(offense_start_position(off), offense_ending_position(off))
69
+ end
70
+
71
+ # @param off [Hash]
72
+ # @return [Position]
73
+ def offense_start_position off
74
+ Position.new(off['location']['start_line'] - 1, off['location']['start_column'] - 1)
75
+ end
76
+
77
+ # @param off [Hash]
78
+ # @return [Position]
79
+ def offense_ending_position off
80
+ if off['location']['start_line'] != off['location']['last_line']
81
+ Position.new(off['location']['start_line'], 0)
82
+ else
83
+ Position.new(
84
+ off['location']['start_line'] - 1, off['location']['last_column']
85
+ )
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end