solargraph 0.58.3 → 0.59.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (229) hide show
  1. checksums.yaml +4 -4
  2. data/.envrc +3 -0
  3. data/.github/workflows/linting.yml +12 -5
  4. data/.github/workflows/plugins.yml +54 -34
  5. data/.github/workflows/rspec.yml +15 -28
  6. data/.github/workflows/typecheck.yml +6 -3
  7. data/.rubocop.yml +38 -6
  8. data/.rubocop_todo.yml +53 -966
  9. data/CHANGELOG.md +24 -0
  10. data/Gemfile +3 -1
  11. data/README.md +3 -3
  12. data/Rakefile +26 -23
  13. data/bin/solargraph +2 -1
  14. data/lib/solargraph/api_map/cache.rb +3 -3
  15. data/lib/solargraph/api_map/constants.rb +12 -3
  16. data/lib/solargraph/api_map/index.rb +29 -18
  17. data/lib/solargraph/api_map/source_to_yard.rb +22 -9
  18. data/lib/solargraph/api_map/store.rb +40 -30
  19. data/lib/solargraph/api_map.rb +160 -78
  20. data/lib/solargraph/bench.rb +2 -3
  21. data/lib/solargraph/complex_type/conformance.rb +176 -0
  22. data/lib/solargraph/complex_type/type_methods.rb +31 -18
  23. data/lib/solargraph/complex_type/unique_type.rb +221 -63
  24. data/lib/solargraph/complex_type.rb +173 -59
  25. data/lib/solargraph/convention/active_support_concern.rb +111 -111
  26. data/lib/solargraph/convention/base.rb +50 -50
  27. data/lib/solargraph/convention/data_definition/data_assignment_node.rb +1 -1
  28. data/lib/solargraph/convention/data_definition/data_definition_node.rb +7 -5
  29. data/lib/solargraph/convention/data_definition.rb +5 -2
  30. data/lib/solargraph/convention/gemfile.rb +1 -1
  31. data/lib/solargraph/convention/gemspec.rb +1 -1
  32. data/lib/solargraph/convention/rakefile.rb +1 -1
  33. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +2 -1
  34. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +4 -3
  35. data/lib/solargraph/convention/struct_definition.rb +8 -4
  36. data/lib/solargraph/convention.rb +2 -2
  37. data/lib/solargraph/converters/dd.rb +2 -0
  38. data/lib/solargraph/converters/dl.rb +2 -0
  39. data/lib/solargraph/converters/dt.rb +2 -0
  40. data/lib/solargraph/converters/misc.rb +2 -0
  41. data/lib/solargraph/diagnostics/require_not_found.rb +1 -0
  42. data/lib/solargraph/diagnostics/rubocop.rb +11 -10
  43. data/lib/solargraph/diagnostics/rubocop_helpers.rb +5 -3
  44. data/lib/solargraph/diagnostics/type_check.rb +11 -10
  45. data/lib/solargraph/diagnostics/update_errors.rb +4 -8
  46. data/lib/solargraph/diagnostics.rb +55 -55
  47. data/lib/solargraph/doc_map.rb +38 -39
  48. data/lib/solargraph/environ.rb +52 -52
  49. data/lib/solargraph/equality.rb +4 -4
  50. data/lib/solargraph/gem_pins.rb +4 -15
  51. data/lib/solargraph/language_server/error_codes.rb +10 -10
  52. data/lib/solargraph/language_server/host/diagnoser.rb +1 -1
  53. data/lib/solargraph/language_server/host/dispatch.rb +3 -3
  54. data/lib/solargraph/language_server/host/message_worker.rb +4 -3
  55. data/lib/solargraph/language_server/host/sources.rb +2 -1
  56. data/lib/solargraph/language_server/host.rb +35 -28
  57. data/lib/solargraph/language_server/message/base.rb +1 -1
  58. data/lib/solargraph/language_server/message/client/register_capability.rb +1 -3
  59. data/lib/solargraph/language_server/message/completion_item/resolve.rb +6 -8
  60. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +12 -18
  61. data/lib/solargraph/language_server/message/extended/document.rb +1 -0
  62. data/lib/solargraph/language_server/message/extended/document_gems.rb +7 -7
  63. data/lib/solargraph/language_server/message/extended/download_core.rb +2 -1
  64. data/lib/solargraph/language_server/message/extended/environment.rb +25 -25
  65. data/lib/solargraph/language_server/message/extended/search.rb +1 -1
  66. data/lib/solargraph/language_server/message/initialize.rb +20 -14
  67. data/lib/solargraph/language_server/message/initialized.rb +28 -28
  68. data/lib/solargraph/language_server/message/text_document/completion.rb +10 -8
  69. data/lib/solargraph/language_server/message/text_document/definition.rb +41 -32
  70. data/lib/solargraph/language_server/message/text_document/document_highlight.rb +17 -10
  71. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +29 -19
  72. data/lib/solargraph/language_server/message/text_document/formatting.rb +8 -6
  73. data/lib/solargraph/language_server/message/text_document/hover.rb +5 -5
  74. data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +13 -6
  75. data/lib/solargraph/language_server/message/text_document/references.rb +17 -10
  76. data/lib/solargraph/language_server/message/text_document/rename.rb +20 -13
  77. data/lib/solargraph/language_server/message/text_document/signature_help.rb +3 -2
  78. data/lib/solargraph/language_server/message/text_document/type_definition.rb +25 -17
  79. data/lib/solargraph/language_server/message/text_document.rb +28 -28
  80. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +34 -28
  81. data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +38 -30
  82. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +23 -17
  83. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +27 -17
  84. data/lib/solargraph/language_server/message.rb +1 -1
  85. data/lib/solargraph/language_server/progress.rb +143 -143
  86. data/lib/solargraph/language_server/request.rb +4 -2
  87. data/lib/solargraph/language_server/transport/adapter.rb +68 -68
  88. data/lib/solargraph/language_server/transport/data_reader.rb +11 -13
  89. data/lib/solargraph/language_server/uri_helpers.rb +2 -2
  90. data/lib/solargraph/language_server.rb +20 -20
  91. data/lib/solargraph/library.rb +57 -38
  92. data/lib/solargraph/location.rb +17 -14
  93. data/lib/solargraph/logging.rb +22 -4
  94. data/lib/solargraph/page.rb +1 -1
  95. data/lib/solargraph/parser/comment_ripper.rb +19 -4
  96. data/lib/solargraph/parser/flow_sensitive_typing.rb +324 -108
  97. data/lib/solargraph/parser/node_processor/base.rb +34 -4
  98. data/lib/solargraph/parser/node_processor.rb +8 -7
  99. data/lib/solargraph/parser/parser_gem/class_methods.rb +30 -14
  100. data/lib/solargraph/parser/parser_gem/flawed_builder.rb +1 -1
  101. data/lib/solargraph/parser/parser_gem/node_chainer.rb +51 -25
  102. data/lib/solargraph/parser/parser_gem/node_methods.rb +181 -73
  103. data/lib/solargraph/parser/parser_gem/node_processors/alias_node.rb +24 -24
  104. data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +4 -4
  105. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +13 -11
  106. data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +9 -0
  107. data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +11 -12
  108. data/lib/solargraph/parser/parser_gem/node_processors/casgn_node.rb +36 -36
  109. data/lib/solargraph/parser/parser_gem/node_processors/cvasgn_node.rb +24 -24
  110. data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +10 -3
  111. data/lib/solargraph/parser/parser_gem/node_processors/defs_node.rb +9 -8
  112. data/lib/solargraph/parser/parser_gem/node_processors/gvasgn_node.rb +24 -24
  113. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +36 -6
  114. data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +5 -3
  115. data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +1 -0
  116. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +3 -1
  117. data/lib/solargraph/parser/parser_gem/node_processors/namespace_node.rb +40 -40
  118. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +3 -3
  119. data/lib/solargraph/parser/parser_gem/node_processors/or_node.rb +22 -0
  120. data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +1 -1
  121. data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +2 -1
  122. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +4 -5
  123. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +124 -113
  124. data/lib/solargraph/parser/parser_gem/node_processors/sym_node.rb +20 -20
  125. data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +1 -1
  126. data/lib/solargraph/parser/parser_gem/node_processors/when_node.rb +23 -0
  127. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +6 -2
  128. data/lib/solargraph/parser/parser_gem/node_processors.rb +4 -0
  129. data/lib/solargraph/parser/parser_gem.rb +2 -0
  130. data/lib/solargraph/parser/region.rb +9 -3
  131. data/lib/solargraph/parser/snippet.rb +3 -1
  132. data/lib/solargraph/parser.rb +2 -0
  133. data/lib/solargraph/pin/base.rb +126 -82
  134. data/lib/solargraph/pin/base_variable.rb +273 -24
  135. data/lib/solargraph/pin/block.rb +29 -6
  136. data/lib/solargraph/pin/breakable.rb +7 -1
  137. data/lib/solargraph/pin/callable.rb +65 -21
  138. data/lib/solargraph/pin/closure.rb +7 -10
  139. data/lib/solargraph/pin/common.rb +24 -6
  140. data/lib/solargraph/pin/compound_statement.rb +55 -0
  141. data/lib/solargraph/pin/constant.rb +3 -5
  142. data/lib/solargraph/pin/conversions.rb +10 -4
  143. data/lib/solargraph/pin/delegated_method.rb +19 -8
  144. data/lib/solargraph/pin/documenting.rb +4 -2
  145. data/lib/solargraph/pin/instance_variable.rb +5 -1
  146. data/lib/solargraph/pin/keyword.rb +0 -4
  147. data/lib/solargraph/pin/local_variable.rb +15 -59
  148. data/lib/solargraph/pin/method.rb +158 -104
  149. data/lib/solargraph/pin/method_alias.rb +8 -0
  150. data/lib/solargraph/pin/namespace.rb +19 -12
  151. data/lib/solargraph/pin/parameter.rb +102 -36
  152. data/lib/solargraph/pin/proxy_type.rb +4 -1
  153. data/lib/solargraph/pin/reference/override.rb +1 -1
  154. data/lib/solargraph/pin/reference/require.rb +14 -14
  155. data/lib/solargraph/pin/reference/superclass.rb +2 -0
  156. data/lib/solargraph/pin/reference/type_alias.rb +16 -0
  157. data/lib/solargraph/pin/reference.rb +20 -0
  158. data/lib/solargraph/pin/search.rb +8 -7
  159. data/lib/solargraph/pin/signature.rb +15 -12
  160. data/lib/solargraph/pin/singleton.rb +11 -11
  161. data/lib/solargraph/pin/symbol.rb +2 -1
  162. data/lib/solargraph/pin/until.rb +2 -4
  163. data/lib/solargraph/pin/while.rb +2 -4
  164. data/lib/solargraph/pin.rb +2 -0
  165. data/lib/solargraph/pin_cache.rb +22 -19
  166. data/lib/solargraph/position.rb +17 -10
  167. data/lib/solargraph/range.rb +16 -15
  168. data/lib/solargraph/rbs_map/conversions.rb +367 -231
  169. data/lib/solargraph/rbs_map/core_fills.rb +18 -11
  170. data/lib/solargraph/rbs_map/core_map.rb +24 -17
  171. data/lib/solargraph/rbs_map/stdlib_map.rb +33 -5
  172. data/lib/solargraph/rbs_map.rb +76 -32
  173. data/lib/solargraph/server_methods.rb +1 -1
  174. data/lib/solargraph/shell.rb +258 -66
  175. data/lib/solargraph/source/chain/array.rb +3 -12
  176. data/lib/solargraph/source/chain/block_symbol.rb +13 -13
  177. data/lib/solargraph/source/chain/block_variable.rb +13 -13
  178. data/lib/solargraph/source/chain/call.rb +96 -56
  179. data/lib/solargraph/source/chain/class_variable.rb +1 -1
  180. data/lib/solargraph/source/chain/constant.rb +5 -1
  181. data/lib/solargraph/source/chain/global_variable.rb +1 -1
  182. data/lib/solargraph/source/chain/hash.rb +8 -5
  183. data/lib/solargraph/source/chain/head.rb +19 -19
  184. data/lib/solargraph/source/chain/if.rb +12 -10
  185. data/lib/solargraph/source/chain/instance_variable.rb +24 -1
  186. data/lib/solargraph/source/chain/link.rb +12 -22
  187. data/lib/solargraph/source/chain/literal.rb +22 -15
  188. data/lib/solargraph/source/chain/or.rb +10 -4
  189. data/lib/solargraph/source/chain/q_call.rb +2 -0
  190. data/lib/solargraph/source/chain/variable.rb +3 -1
  191. data/lib/solargraph/source/chain/z_super.rb +1 -3
  192. data/lib/solargraph/source/chain.rb +51 -38
  193. data/lib/solargraph/source/change.rb +12 -5
  194. data/lib/solargraph/source/cursor.rb +33 -18
  195. data/lib/solargraph/source/encoding_fixes.rb +6 -7
  196. data/lib/solargraph/source/source_chainer.rb +56 -32
  197. data/lib/solargraph/source/updater.rb +5 -1
  198. data/lib/solargraph/source.rb +59 -35
  199. data/lib/solargraph/source_map/clip.rb +54 -30
  200. data/lib/solargraph/source_map/data.rb +4 -1
  201. data/lib/solargraph/source_map/mapper.rb +69 -42
  202. data/lib/solargraph/source_map.rb +21 -9
  203. data/lib/solargraph/type_checker/problem.rb +3 -1
  204. data/lib/solargraph/type_checker/rules.rb +81 -8
  205. data/lib/solargraph/type_checker.rb +196 -122
  206. data/lib/solargraph/version.rb +1 -1
  207. data/lib/solargraph/workspace/config.rb +14 -11
  208. data/lib/solargraph/workspace/gemspecs.rb +367 -0
  209. data/lib/solargraph/workspace/require_paths.rb +1 -0
  210. data/lib/solargraph/workspace.rb +50 -28
  211. data/lib/solargraph/yard_map/cache.rb +25 -25
  212. data/lib/solargraph/yard_map/helpers.rb +8 -3
  213. data/lib/solargraph/yard_map/mapper/to_constant.rb +28 -28
  214. data/lib/solargraph/yard_map/mapper/to_method.rb +13 -7
  215. data/lib/solargraph/yard_map/mapper/to_namespace.rb +2 -1
  216. data/lib/solargraph/yard_map/mapper.rb +13 -8
  217. data/lib/solargraph/yard_map.rb +17 -18
  218. data/lib/solargraph/yard_tags.rb +2 -2
  219. data/lib/solargraph/yardoc.rb +7 -4
  220. data/lib/solargraph.rb +33 -10
  221. data/rbs/fills/rubygems/0/dependency.rbs +193 -0
  222. data/rbs/shims/ast/0/node.rbs +1 -1
  223. data/rbs/shims/diff-lcs/1.5/diff-lcs.rbs +11 -0
  224. data/solargraph.gemspec +37 -35
  225. metadata +41 -42
  226. data/lib/solargraph/type_checker/checks.rb +0 -124
  227. data/lib/solargraph/type_checker/param_def.rb +0 -37
  228. data/lib/solargraph/yard_map/to_method.rb +0 -89
  229. data/rbs/fills/tuple/tuple.rbs +0 -149
@@ -1,68 +1,68 @@
1
- # frozen_string_literal: true
2
-
3
- require 'backport'
4
-
5
- module Solargraph
6
- module LanguageServer
7
- module Transport
8
- # A common module for running language servers in Backport.
9
- #
10
- module Adapter
11
- # This runs in the context of Backport::Adapter, which
12
- # provides write() - but if we didn't hide this behind a parse
13
- # tag, it would override the one in the class.
14
- #
15
- # @!method write(text)
16
- # @abstract
17
- # Write the change to the specified text.
18
- # @param text [String] The text to be changed.
19
- # @return [String] The updated text.
20
-
21
- # @return [void]
22
- def opening
23
- @host = Solargraph::LanguageServer::Host.new
24
- @host.add_observer self
25
- @host.start
26
- @data_reader = Solargraph::LanguageServer::Transport::DataReader.new
27
- @data_reader.set_message_handler do |message|
28
- process message
29
- end
30
- end
31
-
32
- # @return [void]
33
- def closing
34
- @host.stop
35
- end
36
-
37
- # @param data [String]
38
- # @return [void]
39
- def receiving data
40
- @data_reader.receive data
41
- end
42
-
43
- # @return [void]
44
- def update
45
- if @host.stopped?
46
- shutdown
47
- else
48
- tmp = @host.flush
49
- write tmp unless tmp.empty?
50
- end
51
- end
52
-
53
- private
54
-
55
- # @param request [Hash]
56
- # @return [void]
57
- def process request
58
- @host.process(request)
59
- end
60
-
61
- # @return [void]
62
- def shutdown
63
- Backport.stop unless @host.options['transport'] == 'external'
64
- end
65
- end
66
- end
67
- end
68
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'backport'
4
+
5
+ module Solargraph
6
+ module LanguageServer
7
+ module Transport
8
+ # A common module for running language servers in Backport.
9
+ #
10
+ module Adapter
11
+ # This runs in the context of Backport::Adapter, which
12
+ # provides write() - but if we didn't hide this behind a parse
13
+ # tag, it would override the one in the class.
14
+ #
15
+ # @!method write(text)
16
+ # @abstract
17
+ # Write the change to the specified text.
18
+ # @param text [String] The text to be changed.
19
+ # @return [String] The updated text.
20
+
21
+ # @return [void]
22
+ def opening
23
+ @host = Solargraph::LanguageServer::Host.new
24
+ @host.add_observer self
25
+ @host.start
26
+ @data_reader = Solargraph::LanguageServer::Transport::DataReader.new
27
+ @data_reader.set_message_handler do |message|
28
+ process message
29
+ end
30
+ end
31
+
32
+ # @return [void]
33
+ def closing
34
+ @host.stop
35
+ end
36
+
37
+ # @param data [String]
38
+ # @return [void]
39
+ def receiving data
40
+ @data_reader.receive data
41
+ end
42
+
43
+ # @return [void]
44
+ def update
45
+ if @host.stopped?
46
+ shutdown
47
+ else
48
+ tmp = @host.flush
49
+ write tmp unless tmp.empty?
50
+ end
51
+ end
52
+
53
+ private
54
+
55
+ # @param request [Hash]
56
+ # @return [void]
57
+ def process request
58
+ @host.process(request)
59
+ end
60
+
61
+ # @return [void]
62
+ def shutdown
63
+ Backport.stop unless @host.options['transport'] == 'external'
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
@@ -33,8 +33,8 @@ module Solargraph
33
33
  @buffer.concat char
34
34
  if @in_header
35
35
  prepare_to_parse_message if @buffer.end_with?("\r\n\r\n")
36
- else
37
- parse_message_from_buffer if @buffer.bytesize == @content_length
36
+ elsif @buffer.bytesize == @content_length
37
+ parse_message_from_buffer
38
38
  end
39
39
  end
40
40
  end
@@ -56,17 +56,15 @@ module Solargraph
56
56
 
57
57
  # @return [void]
58
58
  def parse_message_from_buffer
59
- begin
60
- msg = JSON.parse(@buffer)
61
- @message_handler.call msg unless @message_handler.nil?
62
- rescue JSON::ParserError => e
63
- Solargraph::Logging.logger.warn "Failed to parse request: #{e.message}"
64
- Solargraph::Logging.logger.debug "Buffer: #{@buffer}"
65
- ensure
66
- @buffer.clear
67
- @in_header = true
68
- @content_length = 0
69
- end
59
+ msg = JSON.parse(@buffer)
60
+ @message_handler&.call msg
61
+ rescue JSON::ParserError => e
62
+ Solargraph::Logging.logger.warn "Failed to parse request: #{e.message}"
63
+ Solargraph::Logging.logger.debug "Buffer: #{@buffer}"
64
+ ensure
65
+ @buffer.clear
66
+ @in_header = true
67
+ @content_length = 0
70
68
  end
71
69
  end
72
70
  end
@@ -14,7 +14,7 @@ module Solargraph
14
14
  # @param uri [String]
15
15
  # @return [String]
16
16
  def uri_to_file uri
17
- decode(uri).sub(/^file\:(?:\/\/)?/, '').sub(/^\/([a-z]\:)/i, '\1')
17
+ decode(uri).sub(%r{^file:(?://)?}, '').sub(%r{^/([a-z]:)}i, '\1')
18
18
  end
19
19
 
20
20
  # Convert a file path to a URI.
@@ -22,7 +22,7 @@ module Solargraph
22
22
  # @param file [String]
23
23
  # @return [String]
24
24
  def file_to_uri file
25
- "file://#{encode(file.gsub(/^([a-z]\:)/i, '/\1'))}"
25
+ "file://#{encode(file.gsub(/^([a-z]:)/i, '/\1'))}"
26
26
  end
27
27
 
28
28
  # Encode text to be used as a URI path component in LSP.
@@ -1,20 +1,20 @@
1
- # frozen_string_literal: true
2
-
3
- require 'solargraph/language_server/error_codes'
4
- require 'solargraph/language_server/completion_item_kinds'
5
- require 'solargraph/language_server/symbol_kinds'
6
-
7
- module Solargraph
8
- # The LanguageServer namespace contains the classes and modules that compose
9
- # concrete implementations of language servers.
10
- #
11
- module LanguageServer
12
- autoload :Host, 'solargraph/language_server/host'
13
- autoload :Message, 'solargraph/language_server/message'
14
- autoload :UriHelpers, 'solargraph/language_server/uri_helpers'
15
- autoload :MessageTypes, 'solargraph/language_server/message_types'
16
- autoload :Request, 'solargraph/language_server/request'
17
- autoload :Transport, 'solargraph/language_server/transport'
18
- autoload :Progress, 'solargraph/language_server/progress'
19
- end
20
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'solargraph/language_server/error_codes'
4
+ require 'solargraph/language_server/completion_item_kinds'
5
+ require 'solargraph/language_server/symbol_kinds'
6
+
7
+ module Solargraph
8
+ # The LanguageServer namespace contains the classes and modules that compose
9
+ # concrete implementations of language servers.
10
+ #
11
+ module LanguageServer
12
+ autoload :Host, 'solargraph/language_server/host'
13
+ autoload :Message, 'solargraph/language_server/message'
14
+ autoload :UriHelpers, 'solargraph/language_server/uri_helpers'
15
+ autoload :MessageTypes, 'solargraph/language_server/message_types'
16
+ autoload :Request, 'solargraph/language_server/request'
17
+ autoload :Transport, 'solargraph/language_server/transport'
18
+ autoload :Progress, 'solargraph/language_server/progress'
19
+ end
20
+ end
@@ -57,9 +57,11 @@ module Solargraph
57
57
  # @param source [Source, nil]
58
58
  # @return [void]
59
59
  def attach source
60
- if @current && (!source || @current.filename != source.filename) && source_map_hash.key?(@current.filename) && !workspace.has_file?(@current.filename)
61
- source_map_hash.delete @current.filename
62
- source_map_external_require_hash.delete @current.filename
60
+ # @type [String, nil]
61
+ current_filename = @current&.filename
62
+ if @current && (!source || current_filename != source.filename) && current_filename && source_map_hash.key?(current_filename) && !workspace.has_file?(current_filename)
63
+ source_map_hash.delete current_filename
64
+ source_map_external_require_hash.delete current_filename
63
65
  @external_requires = nil
64
66
  end
65
67
  changed = source && @current != source
@@ -116,8 +118,8 @@ module Solargraph
116
118
  # @return [Boolean] True if at least one file was added to the workspace.
117
119
  def create_from_disk *filenames
118
120
  sources = filenames
119
- .reject { |filename| File.directory?(filename) || !File.exist?(filename) }
120
- .map { |filename| Solargraph::Source.load_string(File.read(filename), filename) }
121
+ .reject { |filename| File.directory?(filename) || !File.exist?(filename) }
122
+ .map { |filename| Solargraph::Source.load_string(File.read(filename), filename) }
121
123
  result = workspace.merge(*sources)
122
124
  sources.each { |source| maybe_map source }
123
125
  result
@@ -182,9 +184,12 @@ module Solargraph
182
184
  if cursor.comment?
183
185
  source = read(filename)
184
186
  offset = Solargraph::Position.to_offset(source.code, Solargraph::Position.new(line, column))
185
- lft = source.code[0..offset-1].match(/\[[a-z0-9_:<, ]*?([a-z0-9_:]*)\z/i)
186
- rgt = source.code[offset..-1].match(/^([a-z0-9_]*)(:[a-z0-9_:]*)?[\]>, ]/i)
187
+ # @type [MatchData, nil]
188
+ lft = source.code[0..(offset - 1)]&.match(/\[[a-z0-9_:<, ]*?([a-z0-9_:]*)\z/i)
189
+ # @type [MatchData, nil]
190
+ rgt = source.code[offset..]&.match(/^([a-z0-9_]*)(:[a-z0-9_:]*)?[\]>, ]/i)
187
191
  if lft && rgt
192
+ # @sg-ignore lft and rgt are checked for nil above
188
193
  tag = (lft[1] + rgt[1]).sub(/:+$/, '')
189
194
  clip = mutex.synchronize { api_map.clip(cursor) }
190
195
  clip.translate tag
@@ -246,16 +251,17 @@ module Solargraph
246
251
  clip = mutex.synchronize { api_map.clip(cursor) }
247
252
  pin = clip.define.first
248
253
  return [] unless pin
254
+
249
255
  result = []
250
256
  files = if only
251
- [api_map.source_map(filename)]
252
- else
253
- (workspace.sources + (@current ? [@current] : []))
254
- end
257
+ [api_map.source_map(filename)]
258
+ else
259
+ (workspace.sources + (@current ? [@current] : []))
260
+ end
255
261
  files.uniq(&:filename).each do |source|
256
262
  found = source.references(pin.name)
257
263
  found.select! do |loc|
258
- referenced = definitions_at(loc.filename, loc.range.ending.line, loc.range.ending.character).first
264
+ referenced = definitions_at(loc.filename, loc.range.ending.line, loc.range.ending.character)&.first
259
265
  referenced&.path == pin.path
260
266
  end
261
267
  if pin.path == 'Class#new'
@@ -271,8 +277,9 @@ module Solargraph
271
277
  end
272
278
  end
273
279
  # HACK: for language clients that exclude special characters from the start of variable names
274
- if strip && match = cursor.word.match(/^[^a-z0-9_]+/i)
280
+ if strip && (match = cursor.word.match(/^[^a-z0-9_]+/i))
275
281
  found.map! do |loc|
282
+ # @sg-ignore Unresolved call to []
276
283
  Solargraph::Location.new(loc.filename, Solargraph::Range.from_to(loc.range.start.line, loc.range.start.column + match[0].length, loc.range.ending.line, loc.range.ending.column))
277
284
  end
278
285
  end
@@ -299,7 +306,7 @@ module Solargraph
299
306
  def locate_ref location
300
307
  map = source_map_hash[location.filename]
301
308
  return if map.nil?
302
- pin = map.requires.select { |p| p.location.range.contain?(location.range.start) }.first
309
+ pin = map.requires.select { |p| p.location&.range&.contain?(location.range.start) }.first
303
310
  return nil if pin.nil?
304
311
  # @param full [String]
305
312
  return_if_match = proc do |full|
@@ -309,8 +316,8 @@ module Solargraph
309
316
  end
310
317
  workspace.require_paths.each do |path|
311
318
  full = File.join path, pin.name
312
- return_if_match.(full)
313
- return_if_match.(full << ".rb")
319
+ return_if_match.call(full)
320
+ return_if_match.call(full << '.rb')
314
321
  end
315
322
  nil
316
323
  rescue FileNotFoundError
@@ -403,14 +410,17 @@ module Solargraph
403
410
  workspace.config.reporters.each do |line|
404
411
  if line == 'all!'
405
412
  Diagnostics.reporters.each do |reporter_name|
406
- repargs[Diagnostics.reporter(reporter_name)] ||= []
413
+ r = Diagnostics.reporter(reporter_name)
414
+ repargs[r] ||= [] if r
407
415
  end
408
416
  else
409
417
  args = line.split(':').map(&:strip)
410
418
  name = args.shift
411
419
  reporter = Diagnostics.reporter(name)
412
420
  raise DiagnosticsError, "Diagnostics reporter #{name} does not exist" if reporter.nil?
421
+ # @sg-ignore Hash errors
413
422
  repargs[reporter] ||= []
423
+ # @sg-ignore Hash errors
414
424
  repargs[reporter].concat args
415
425
  end
416
426
  end
@@ -433,6 +443,7 @@ module Solargraph
433
443
  source_maps: source_map_hash.values,
434
444
  workspace: workspace,
435
445
  external_requires: external_requires,
446
+ # @sg-ignore OK if @current.filename is nil
436
447
  live_map: @current ? source_map_hash[@current.filename] : nil
437
448
  )
438
449
  end
@@ -472,7 +483,9 @@ module Solargraph
472
483
  src = workspace.sources.find { |s| !source_map_hash.key?(s.filename) }
473
484
  if src
474
485
  Logging.logger.debug "Mapping #{src.filename}"
486
+ # @sg-ignore OK if src.filename is nil
475
487
  source_map_hash[src.filename] = Solargraph::SourceMap.map(src)
488
+ # @sg-ignore OK if src.filename is nil
476
489
  source_map_hash[src.filename]
477
490
  else
478
491
  false
@@ -482,7 +495,9 @@ module Solargraph
482
495
  # @return [self]
483
496
  def map!
484
497
  workspace.sources.each do |src|
498
+ # @sg-ignore OK if src.filename is nil
485
499
  source_map_hash[src.filename] = Solargraph::SourceMap.map(src)
500
+ # @sg-ignore OK if src.filename is nil
486
501
  find_external_requires source_map_hash[src.filename]
487
502
  end
488
503
  self
@@ -509,14 +524,14 @@ module Solargraph
509
524
  # @return [void]
510
525
  def find_external_requires source_map
511
526
  # @type [Set<String>]
512
- new_set = source_map.requires.map(&:name).to_set
513
- # return if new_set == source_map_external_require_hash[source_map.filename]
527
+ new_set = source_map.requires.to_set(&:name)
514
528
  _filenames = nil
515
- filenames = ->{ _filenames ||= workspace.filenames.to_set }
529
+ filenames = -> { _filenames ||= workspace.filenames.to_set }
530
+ # @sg-ignore OK if source_map.filename is nil
516
531
  source_map_external_require_hash[source_map.filename] = new_set.reject do |path|
517
532
  workspace.require_paths.any? do |base|
518
533
  full = File.join(base, path)
519
- filenames[].include?(full) or filenames[].include?(full << ".rb")
534
+ filenames[].include?(full) or filenames[].include?(full << '.rb')
520
535
  end
521
536
  end
522
537
  @external_requires = nil
@@ -550,23 +565,23 @@ module Solargraph
550
565
  # @param error [FileNotFoundError]
551
566
  # @return [nil]
552
567
  def handle_file_not_found filename, error
553
- if workspace.source(filename)
554
- Solargraph.logger.debug "#{filename} is not cataloged in the ApiMap"
555
- nil
556
- else
557
- raise error
558
- end
568
+ raise error unless workspace.source(filename)
569
+ Solargraph.logger.debug "#{filename} is not cataloged in the ApiMap"
570
+ nil
559
571
  end
560
572
 
561
573
  # @param source [Source, nil]
562
574
  # @return [void]
563
575
  def maybe_map source
564
576
  return unless source
577
+ # @sg-ignore Wrong argument type for Solargraph::Workspace#has_file?: filename expected String, received String, nil
565
578
  return unless @current == source || workspace.has_file?(source.filename)
566
579
  if source_map_hash.key?(source.filename)
567
580
  new_map = Solargraph::SourceMap.map(source)
581
+ # @sg-ignore OK if source.filename is nil
568
582
  source_map_hash[source.filename] = new_map
569
583
  else
584
+ # @sg-ignore OK if source.filename is nil
570
585
  source_map_hash[source.filename] = Solargraph::SourceMap.map(source)
571
586
  end
572
587
  end
@@ -632,26 +647,30 @@ module Solargraph
632
647
  # @return [void]
633
648
  def report_cache_progress gem_name, pending
634
649
  @total ||= pending
650
+ # @sg-ignore Wrong argument type for Integer#>: arg_0 expected Numeric, received Integer, nil
635
651
  @total = pending if pending > @total
652
+ # @sg-ignore Unresolved call to - on Integer, nil
636
653
  finished = @total - pending
654
+ # @sg-ignore @total should always be an Integer
637
655
  pct = if @total.zero?
638
- 0
639
- else
640
- ((finished.to_f / @total.to_f) * 100).to_i
641
- end
642
- message = "#{gem_name}#{pending > 0 ? " (+#{pending})" : ''}"
656
+ 0
657
+ else
658
+ # @sg-ignore Unresolved call to to_f
659
+ ((finished.to_f / @total) * 100).to_i
660
+ end
661
+ message = "#{gem_name}#{" (+#{pending})" if pending.positive?}"
643
662
  # "
644
- if @cache_progress
645
- @cache_progress.report(message, pct)
646
- else
663
+ unless @cache_progress
647
664
  @cache_progress = LanguageServer::Progress.new('Caching gem')
648
665
  # If we don't send both a begin and a report, the progress notification
649
666
  # might get stuck in the status bar forever
667
+ # @sg-ignore Unresolved call to begin
650
668
  @cache_progress.begin(message, pct)
651
669
  changed
652
670
  notify_observers @cache_progress
653
- @cache_progress.report(message, pct)
654
671
  end
672
+ # @sg-ignore Unresolved call to report
673
+ @cache_progress.report(message, pct)
655
674
  changed
656
675
  notify_observers @cache_progress
657
676
  end
@@ -666,11 +685,11 @@ module Solargraph
666
685
 
667
686
  # @return [void]
668
687
  def sync_catalog
669
- return if @sync_count == 0
688
+ return if @sync_count.zero?
670
689
 
671
690
  mutex.synchronize do
672
691
  logger.info "Cataloging #{workspace.directory.empty? ? 'generic workspace' : workspace.directory}"
673
- source_map_hash.values.each { |map| find_external_requires(map) }
692
+ source_map_hash.each_value { |map| find_external_requires(map) }
674
693
  api_map.catalog bench
675
694
  logger.info "Catalog complete (#{api_map.source_maps.length} files, #{api_map.pins.length} pins)"
676
695
  logger.info "#{api_map.uncached_yard_gemspecs.length} uncached YARD gemspecs"
@@ -6,6 +6,7 @@ module Solargraph
6
6
  #
7
7
  class Location
8
8
  include Equality
9
+ include Comparable
9
10
 
10
11
  # @return [String]
11
12
  attr_reader :filename
@@ -13,20 +14,17 @@ module Solargraph
13
14
  # @return [Solargraph::Range]
14
15
  attr_reader :range
15
16
 
16
- # @param filename [String]
17
+ # @param filename [String, nil]
17
18
  # @param range [Solargraph::Range]
18
19
  def initialize filename, range
20
+ raise 'Use nil to represent no-file' if filename&.empty?
21
+
19
22
  @filename = filename
20
23
  @range = range
21
24
  end
22
25
 
23
- # @sg-ignore Fix "Not enough arguments to Module#protected"
24
- protected def equality_fields
25
- [filename, range]
26
- end
27
-
28
26
  # @param other [self]
29
- def <=>(other)
27
+ def <=> other
30
28
  return nil unless other.is_a?(Location)
31
29
  if filename == other.filename
32
30
  range <=> other.range
@@ -44,10 +42,6 @@ module Solargraph
44
42
  range.contain?(location.range.start) && range.contain?(location.range.ending) && filename == location.filename
45
43
  end
46
44
 
47
- def inspect
48
- "<#{self.class.name}: filename=#{filename}, range=#{range.inspect}>"
49
- end
50
-
51
45
  def to_s
52
46
  inspect
53
47
  end
@@ -62,21 +56,30 @@ module Solargraph
62
56
 
63
57
  # @param node [Parser::AST::Node, nil]
64
58
  # @return [Location, nil]
65
- def self.from_node(node)
59
+ def self.from_node node
66
60
  return nil if node.nil? || node.loc.nil?
61
+ filename = node.loc.expression.source_buffer.name
62
+ # @sg-ignore flow sensitive typing needs to create separate ranges for postfix if
63
+ filename = nil if filename.empty?
67
64
  range = Range.from_node(node)
68
- self.new(node.loc.expression.source_buffer.name, range)
65
+ # @sg-ignore Need to add nil check here
66
+ new(filename, range)
69
67
  end
70
68
 
71
69
  # @param other [BasicObject]
72
70
  def == other
73
71
  return false unless other.is_a?(Location)
74
- # @sg-ignore https://github.com/castwide/solargraph/pull/1114
75
72
  filename == other.filename and range == other.range
76
73
  end
77
74
 
78
75
  def inspect
79
76
  "#<#{self.class} #{filename}, #{range.inspect}>"
80
77
  end
78
+
79
+ protected
80
+
81
+ def equality_fields
82
+ [filename, range]
83
+ end
81
84
  end
82
85
  end
@@ -10,7 +10,7 @@ module Solargraph
10
10
  'warn' => Logger::WARN,
11
11
  'info' => Logger::INFO,
12
12
  'debug' => Logger::DEBUG
13
- }
13
+ }.freeze
14
14
  configured_level = ENV.fetch('SOLARGRAPH_LOG', nil)
15
15
  level = if LOG_LEVELS.keys.include?(configured_level)
16
16
  LOG_LEVELS.fetch(configured_level)
@@ -21,17 +21,35 @@ module Solargraph
21
21
  end
22
22
  DEFAULT_LOG_LEVEL
23
23
  end
24
- @@logger = Logger.new(STDERR, level: level)
24
+ @@logger = Logger.new($stderr, level: level)
25
25
  # @sg-ignore Fix cvar issue
26
- @@logger.formatter = proc do |severity, datetime, progname, msg|
26
+ @@logger.formatter = proc do |severity, _datetime, _progname, msg|
27
27
  "[#{severity}] #{msg}\n"
28
28
  end
29
29
 
30
30
  module_function
31
31
 
32
+ # override this in your class to temporarily set a custom
33
+ # filtering log level for the class (e.g., suppress any debug
34
+ # message by setting it to :info even if it is set elsewhere, or
35
+ # show existing debug messages by setting to :debug).
36
+ #
37
+ # @return [Symbol]
38
+ def log_level
39
+ :warn
40
+ end
41
+
32
42
  # @return [Logger]
33
43
  def logger
34
- @@logger
44
+ if LOG_LEVELS[log_level.to_s] == DEFAULT_LOG_LEVEL
45
+ @@logger
46
+ else
47
+ new_log_level = LOG_LEVELS[log_level.to_s]
48
+ logger = Logger.new($stderr, level: new_log_level)
49
+
50
+ logger.formatter = @@logger.formatter
51
+ logger
52
+ end
35
53
  end
36
54
  end
37
55
  end
@@ -49,7 +49,7 @@ module Solargraph
49
49
 
50
50
  # @param directory [String]
51
51
  def initialize directory = VIEWS_PATH
52
- directory = VIEWS_PATH if directory.nil? or !File.directory?(directory)
52
+ directory = VIEWS_PATH if directory.nil? || !File.directory?(directory)
53
53
  directories = [directory]
54
54
  directories.push VIEWS_PATH if directory != VIEWS_PATH
55
55
  # @type [Proc]
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'ripper'
2
4
 
3
5
  module Solargraph
@@ -23,37 +25,50 @@ module Solargraph
23
25
  # @sg-ignore
24
26
  # @type [Array(Symbol, String, Array([Integer, nil], [Integer, nil]))]
25
27
  result = super
28
+ # @sg-ignore Need to add nil check here
26
29
  if @buffer_lines[result[2][0]][0..result[2][1]].strip =~ /^#/
27
30
  chomped = result[1].chomp
28
- if result[2][0] == 0 && chomped.encode('UTF-8', 'binary', invalid: :replace, undef: :replace, replace: '').match(/^#\s*frozen_string_literal:/)
31
+ if result[2][0].zero? && chomped.encode('UTF-8', 'binary', invalid: :replace, undef: :replace,
32
+ replace: '').match(/^#\s*frozen_string_literal:/)
29
33
  chomped = '#'
30
34
  end
31
- @comments[result[2][0]] = Snippet.new(Range.from_to(result[2][0], result[2][1], result[2][0], result[2][1] + chomped.length), chomped)
35
+ @comments[result[2][0]] =
36
+ Snippet.new(Range.from_to(result[2][0], result[2][1], result[2][0], result[2][1] + chomped.length), chomped)
32
37
  end
33
38
  result
34
39
  end
35
40
 
36
41
  # @param result [Array(Symbol, String, Array([Integer, nil], [Integer, nil]))]
37
42
  # @return [void]
38
- def create_snippet(result)
43
+ def create_snippet result
39
44
  chomped = result[1].chomp
40
- @comments[result[2][0]] = Snippet.new(Range.from_to(result[2][0] || 0, result[2][1] || 0, result[2][0] || 0, (result[2][1] || 0) + chomped.length), chomped)
45
+ @comments[result[2][0]] =
46
+ Snippet.new(
47
+ Range.from_to(result[2][0] || 0, result[2][1] || 0, result[2][0] || 0,
48
+ (result[2][1] || 0) + chomped.length), chomped
49
+ )
41
50
  end
42
51
 
52
+ # @sg-ignore @override is adding, not overriding
43
53
  def on_embdoc_beg *args
44
54
  result = super
55
+ # @sg-ignore @override is adding, not overriding
45
56
  create_snippet(result)
46
57
  result
47
58
  end
48
59
 
60
+ # @sg-ignore @override is adding, not overriding
49
61
  def on_embdoc *args
50
62
  result = super
63
+ # @sg-ignore @override is adding, not overriding
51
64
  create_snippet(result)
52
65
  result
53
66
  end
54
67
 
68
+ # @sg-ignore @override is adding, not overriding
55
69
  def on_embdoc_end *args
56
70
  result = super
71
+ # @sg-ignore @override is adding, not overriding
57
72
  create_snippet(result)
58
73
  result
59
74
  end