solargraph 0.58.3 → 0.60.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (238) 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 +18 -28
  6. data/.github/workflows/typecheck.yml +6 -3
  7. data/.rubocop.yml +39 -6
  8. data/.rubocop_todo.yml +53 -966
  9. data/CHANGELOG.md +35 -0
  10. data/Gemfile +6 -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 +42 -20
  17. data/lib/solargraph/api_map/source_to_yard.rb +22 -9
  18. data/lib/solargraph/api_map/store.rb +61 -36
  19. data/lib/solargraph/api_map.rb +192 -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 +225 -63
  24. data/lib/solargraph/complex_type.rb +177 -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 +39 -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 +222 -72
  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 +64 -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 +156 -84
  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 +67 -23
  138. data/lib/solargraph/pin/closure.rb +7 -10
  139. data/lib/solargraph/pin/common.rb +36 -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 +205 -111
  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 +278 -191
  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/rbs_translator.rb +206 -0
  174. data/lib/solargraph/server_methods.rb +1 -1
  175. data/lib/solargraph/shell.rb +330 -71
  176. data/lib/solargraph/source/chain/array.rb +3 -12
  177. data/lib/solargraph/source/chain/block_symbol.rb +13 -13
  178. data/lib/solargraph/source/chain/block_variable.rb +13 -13
  179. data/lib/solargraph/source/chain/call.rb +91 -119
  180. data/lib/solargraph/source/chain/class_variable.rb +1 -1
  181. data/lib/solargraph/source/chain/constant.rb +5 -1
  182. data/lib/solargraph/source/chain/global_variable.rb +1 -1
  183. data/lib/solargraph/source/chain/hash.rb +8 -5
  184. data/lib/solargraph/source/chain/head.rb +19 -19
  185. data/lib/solargraph/source/chain/if.rb +12 -10
  186. data/lib/solargraph/source/chain/instance_variable.rb +24 -1
  187. data/lib/solargraph/source/chain/link.rb +12 -22
  188. data/lib/solargraph/source/chain/literal.rb +22 -15
  189. data/lib/solargraph/source/chain/or.rb +10 -4
  190. data/lib/solargraph/source/chain/q_call.rb +2 -0
  191. data/lib/solargraph/source/chain/variable.rb +3 -1
  192. data/lib/solargraph/source/chain/z_super.rb +1 -3
  193. data/lib/solargraph/source/chain.rb +51 -38
  194. data/lib/solargraph/source/change.rb +12 -5
  195. data/lib/solargraph/source/cursor.rb +33 -18
  196. data/lib/solargraph/source/encoding_fixes.rb +6 -7
  197. data/lib/solargraph/source/source_chainer.rb +56 -32
  198. data/lib/solargraph/source/updater.rb +5 -1
  199. data/lib/solargraph/source.rb +59 -35
  200. data/lib/solargraph/source_map/clip.rb +54 -30
  201. data/lib/solargraph/source_map/data.rb +4 -1
  202. data/lib/solargraph/source_map/mapper.rb +28 -131
  203. data/lib/solargraph/source_map.rb +35 -9
  204. data/lib/solargraph/type_checker/problem.rb +3 -1
  205. data/lib/solargraph/type_checker/rules.rb +81 -8
  206. data/lib/solargraph/type_checker.rb +196 -122
  207. data/lib/solargraph/version.rb +19 -1
  208. data/lib/solargraph/workspace/config.rb +14 -11
  209. data/lib/solargraph/workspace/gemspecs.rb +367 -0
  210. data/lib/solargraph/workspace/require_paths.rb +1 -0
  211. data/lib/solargraph/workspace.rb +50 -28
  212. data/lib/solargraph/yard_map/cache.rb +25 -25
  213. data/lib/solargraph/yard_map/directives/attribute_directive.rb +65 -0
  214. data/lib/solargraph/yard_map/directives/domain_directive.rb +30 -0
  215. data/lib/solargraph/yard_map/directives/method_directive.rb +51 -0
  216. data/lib/solargraph/yard_map/directives/override_directive.rb +30 -0
  217. data/lib/solargraph/yard_map/directives/parse_directive.rb +53 -0
  218. data/lib/solargraph/yard_map/directives/visibility_directive.rb +70 -0
  219. data/lib/solargraph/yard_map/directives.rb +35 -0
  220. data/lib/solargraph/yard_map/helpers.rb +8 -3
  221. data/lib/solargraph/yard_map/macro.rb +113 -0
  222. data/lib/solargraph/yard_map/mapper/to_constant.rb +28 -28
  223. data/lib/solargraph/yard_map/mapper/to_method.rb +13 -7
  224. data/lib/solargraph/yard_map/mapper/to_namespace.rb +2 -1
  225. data/lib/solargraph/yard_map/mapper.rb +31 -8
  226. data/lib/solargraph/yard_map.rb +19 -18
  227. data/lib/solargraph/yard_tags.rb +2 -2
  228. data/lib/solargraph/yardoc.rb +7 -4
  229. data/lib/solargraph.rb +34 -10
  230. data/rbs/fills/rubygems/0/dependency.rbs +193 -0
  231. data/rbs/shims/ast/0/node.rbs +1 -1
  232. data/rbs/shims/diff-lcs/1.5/diff-lcs.rbs +11 -0
  233. data/solargraph.gemspec +38 -35
  234. metadata +64 -42
  235. data/lib/solargraph/type_checker/checks.rb +0 -124
  236. data/lib/solargraph/type_checker/param_def.rb +0 -37
  237. data/lib/solargraph/yard_map/to_method.rb +0 -89
  238. data/rbs/fills/tuple/tuple.rbs +0 -149
@@ -11,6 +11,7 @@ module Solargraph
11
11
  # @param spec [Gem::Specification, nil]
12
12
  def initialize code_objects, spec = nil
13
13
  @code_objects = code_objects
14
+ @macro_code_objects = code_objects.select { |co| co.is_a?(YARD::CodeObjects::MacroObject) }
14
15
  @spec = spec
15
16
  # @type [Array<Solargraph::Pin::Base>]
16
17
  @pins = []
@@ -24,6 +25,7 @@ module Solargraph
24
25
  end
25
26
  # Some yardocs contain documentation for dependencies that can be
26
27
  # ignored here. The YardMap will load dependencies separately.
28
+ # @sg-ignore does not consider `pin.location.nil? || ` condition
27
29
  @pins.keep_if { |pin| pin.location.nil? || File.file?(pin.location.filename) } if @spec
28
30
  @pins
29
31
  end
@@ -34,24 +36,27 @@ module Solargraph
34
36
  # @return [Array<Pin::Base>]
35
37
  def generate_pins code_object
36
38
  result = []
37
- if code_object.is_a?(YARD::CodeObjects::NamespaceObject)
39
+ case code_object
40
+ when YARD::CodeObjects::NamespaceObject
38
41
  nspin = ToNamespace.make(code_object, @spec, @namespace_pins[code_object.namespace.to_s])
39
42
  @namespace_pins[code_object.path] = nspin
40
43
  result.push nspin
41
- if code_object.is_a?(YARD::CodeObjects::ClassObject) and !code_object.superclass.nil?
44
+ if code_object.is_a?(YARD::CodeObjects::ClassObject) && !code_object.superclass.nil?
42
45
  # This method of superclass detection is a bit of a hack. If
43
46
  # the superclass is a Proxy, it is assumed to be undefined in its
44
47
  # yardoc and converted to a fully qualified namespace.
45
48
  superclass = if code_object.superclass.is_a?(YARD::CodeObjects::Proxy)
46
- "::#{code_object.superclass}"
47
- else
48
- code_object.superclass.to_s
49
- end
49
+ "::#{code_object.superclass}"
50
+ else
51
+ code_object.superclass.to_s
52
+ end
50
53
  result.push Solargraph::Pin::Reference::Superclass.new(name: superclass, closure: nspin, source: :yard_map)
51
54
  end
55
+ # @sg-ignore flow sensitive typing ought to be able to handle 'when ClassName'
52
56
  code_object.class_mixins.each do |m|
53
57
  result.push Solargraph::Pin::Reference::Extend.new(closure: nspin, name: m.path, source: :yard_map)
54
58
  end
59
+ # @sg-ignore flow sensitive typing ought to be able to handle 'when ClassName'
55
60
  code_object.instance_mixins.each do |m|
56
61
  result.push Solargraph::Pin::Reference::Include.new(
57
62
  closure: nspin, # @todo Fix this
@@ -59,8 +64,10 @@ module Solargraph
59
64
  source: :yard_map
60
65
  )
61
66
  end
62
- elsif code_object.is_a?(YARD::CodeObjects::MethodObject)
67
+ when YARD::CodeObjects::MethodObject
63
68
  closure = @namespace_pins[code_object.namespace.to_s]
69
+ macros_for_method_object(code_object)
70
+ # @sg-ignore flow sensitive typing ought to be able to handle 'when ClassName'
64
71
  if code_object.name == :initialize && code_object.scope == :instance
65
72
  # @todo Check the visibility of <Class>.new
66
73
  result.push ToMethod.make(code_object, 'new', :class, :public, closure, @spec)
@@ -68,12 +75,28 @@ module Solargraph
68
75
  else
69
76
  result.push ToMethod.make(code_object, nil, nil, nil, closure, @spec)
70
77
  end
71
- elsif code_object.is_a?(YARD::CodeObjects::ConstantObject)
78
+ when YARD::CodeObjects::ConstantObject
72
79
  closure = @namespace_pins[code_object.namespace]
73
80
  result.push ToConstant.make(code_object, closure, @spec)
74
81
  end
75
82
  result
76
83
  end
84
+
85
+ # @return [Array<YARD::CodeObjects::MacroObject>]
86
+ def attached_macros
87
+ @attached_macros ||= @macro_code_objects.select(&:attached?)
88
+ end
89
+
90
+ # @return [Hash{YARD::CodeObjects::MethodObject => Array<YARD::CodeObjects::MacroObject>}]
91
+ def attached_macros_by_method_object
92
+ @attached_macros_by_method_object ||= attached_macros.group_by(&:method_object)
93
+ end
94
+
95
+ # @param method_object [YARD::CodeObjects::MethodObject]
96
+ # @return [Array<YARD::CodeObjects::MacroObject>]
97
+ def macros_for_method_object method_object
98
+ attached_macros_by_method_object[method_object]
99
+ end
77
100
  end
78
101
  end
79
102
  end
@@ -1,18 +1,19 @@
1
- # frozen_string_literal: true
2
-
3
- require 'yard'
4
- require 'solargraph/yard_tags'
5
-
6
- module Solargraph
7
- # The YardMap provides access to YARD documentation for the Ruby core, the
8
- # stdlib, and gems.
9
- #
10
- class YardMap
11
- class NoYardocError < StandardError; end
12
-
13
- autoload :Cache, 'solargraph/yard_map/cache'
14
- autoload :Mapper, 'solargraph/yard_map/mapper'
15
- autoload :Helpers, 'solargraph/yard_map/helpers'
16
- autoload :ToMethod, 'solargraph/yard_map/to_method'
17
- end
18
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'yard'
4
+ require 'solargraph/yard_tags'
5
+
6
+ module Solargraph
7
+ # The YardMap provides access to YARD documentation for the Ruby core, the
8
+ # stdlib, and gems.
9
+ #
10
+ class YardMap
11
+ class NoYardocError < StandardError; end
12
+
13
+ autoload :Cache, 'solargraph/yard_map/cache'
14
+ autoload :Mapper, 'solargraph/yard_map/mapper'
15
+ autoload :Helpers, 'solargraph/yard_map/helpers'
16
+ autoload :Macro, 'solargraph/yard_map/macro'
17
+ autoload :Directives, 'solargraph/yard_map/directives'
18
+ end
19
+ end
@@ -14,7 +14,7 @@ module Solargraph
14
14
  end
15
15
 
16
16
  # Define a @type tag for documenting variables
17
- YARD::Tags::Library.define_tag("Type", :type, :with_types_and_name)
17
+ YARD::Tags::Library.define_tag('Type', :type, :with_types_and_name)
18
18
 
19
19
  # Define an @!override directive for overriding method tags
20
- YARD::Tags::Library.define_directive("override", :with_name, Solargraph::DomainDirective)
20
+ YARD::Tags::Library.define_directive('override', :with_name, Solargraph::DomainDirective)
@@ -14,7 +14,7 @@ module Solargraph
14
14
  # @param yard_plugins [Array<String>] The names of YARD plugins to use.
15
15
  # @param gemspec [Gem::Specification]
16
16
  # @return [String] The path to the cached yardoc.
17
- def cache(yard_plugins, gemspec)
17
+ def cache yard_plugins, gemspec
18
18
  path = PinCache.yardoc_path gemspec
19
19
  return path if cached?(gemspec)
20
20
 
@@ -32,6 +32,8 @@ module Solargraph
32
32
  yard_plugins.each { |plugin| cmd << " --plugin #{plugin}" }
33
33
  Solargraph.logger.debug { "Running: #{cmd}" }
34
34
  # @todo set these up to run in parallel
35
+ # @todo Is the chdir argument being used here?
36
+ # @sg-ignore Unrecognized keyword argument chdir to Open3.capture2e
35
37
  stdout_and_stderr_str, status = Open3.capture2e(current_bundle_env_tweaks, cmd, chdir: gemspec.gem_dir)
36
38
  unless status.success?
37
39
  Solargraph.logger.warn { "YARD failed running #{cmd.inspect} in #{gemspec.gem_dir}" }
@@ -43,7 +45,7 @@ module Solargraph
43
45
  # True if the gem yardoc is cached.
44
46
  #
45
47
  # @param gemspec [Gem::Specification]
46
- def cached?(gemspec)
48
+ def cached? gemspec
47
49
  yardoc = File.join(PinCache.yardoc_path(gemspec), 'complete')
48
50
  File.exist?(yardoc)
49
51
  end
@@ -51,7 +53,7 @@ module Solargraph
51
53
  # True if another process is currently building the yardoc cache.
52
54
  #
53
55
  # @param gemspec [Gem::Specification]
54
- def processing?(gemspec)
56
+ def processing? gemspec
55
57
  yardoc = File.join(PinCache.yardoc_path(gemspec), 'processing')
56
58
  File.exist?(yardoc)
57
59
  end
@@ -62,7 +64,7 @@ module Solargraph
62
64
  #
63
65
  # @param gemspec [Gem::Specification]
64
66
  # @return [Array<YARD::CodeObjects::Base>]
65
- def load!(gemspec)
67
+ def load! gemspec
66
68
  YARD::Registry.load! PinCache.yardoc_path gemspec
67
69
  YARD::Registry.all
68
70
  end
@@ -78,6 +80,7 @@ module Solargraph
78
80
  # @return [Hash{String => String}] a hash of environment variables to override
79
81
  def current_bundle_env_tweaks
80
82
  tweaks = {}
83
+ # @sg-ignore Unresolved call to empty? on String, nil
81
84
  if ENV['BUNDLE_GEMFILE'] && !ENV['BUNDLE_GEMFILE'].empty?
82
85
  tweaks['BUNDLE_GEMFILE'] = File.expand_path(ENV['BUNDLE_GEMFILE'])
83
86
  end
data/lib/solargraph.rb CHANGED
@@ -49,14 +49,15 @@ module Solargraph
49
49
  autoload :RbsMap, 'solargraph/rbs_map'
50
50
  autoload :GemPins, 'solargraph/gem_pins'
51
51
  autoload :PinCache, 'solargraph/pin_cache'
52
+ autoload :RbsTranslator, 'solargraph/rbs_translator'
52
53
 
53
54
  dir = File.dirname(__FILE__)
54
55
  VIEWS_PATH = File.join(dir, 'solargraph', 'views')
55
56
 
56
57
  CHDIR_MUTEX = Mutex.new
57
58
 
58
- # @param type [Symbol] Type of assert.
59
- def self.asserts_on?(type)
59
+ def self.asserts_on?
60
+ # @sg-ignore Translate to something flow sensitive typing understands
60
61
  if ENV['SOLARGRAPH_ASSERTS'].nil? || ENV['SOLARGRAPH_ASSERTS'].empty?
61
62
  false
62
63
  elsif ENV['SOLARGRAPH_ASSERTS'] == 'on'
@@ -71,8 +72,31 @@ module Solargraph
71
72
  # @param msg [String, nil] An optional message to log
72
73
  # @param block [Proc] A block that returns a message to log
73
74
  # @return [void]
74
- def self.assert_or_log(type, msg = nil, &block)
75
- raise (msg || block.call) if asserts_on?(type) && ![:combine_with_visibility].include?(type)
75
+ def self.assert_or_log type, msg = nil, &block
76
+ if asserts_on?
77
+ # @type [String, nil]
78
+ msg ||= block.call
79
+
80
+ raise "No message given for #{type.inspect}" if msg.nil?
81
+
82
+ # conditional aliases to handle compatibility corner cases
83
+ # @sg-ignore flow sensitive typing needs to handle 'raise if'
84
+ return if type == :alias_target_missing && msg.include?('highline/compatibility.rb')
85
+ # @sg-ignore flow sensitive typing needs to handle 'raise if'
86
+ return if type == :alias_target_missing && msg.include?('lib/json/add/date.rb')
87
+ # @sg-ignore flow sensitive typing needs to handle 'raise if'
88
+ return if type == :alias_target_missing && msg.include?('rubocop-ast.rbs')
89
+ # @todo :combine_with_visibility is not ready for prime time -
90
+ # lots of disagreements found in practice that heuristics need
91
+ # to be created for and/or debugging needs to resolve in pin
92
+ # generation.
93
+ # @todo :api_map_namespace_pin_stack triggers in a badly handled
94
+ # self type case - 'keeps track of self type in method
95
+ # parameters in subclass' in call_spec.rb
96
+ return if %i[api_map_namespace_pin_stack combine_with_visibility].include?(type)
97
+
98
+ raise msg
99
+ end
76
100
  logger.info msg, &block
77
101
  end
78
102
 
@@ -90,13 +114,13 @@ module Solargraph
90
114
  # @yieldreturn [generic<T>]
91
115
  # @sg-ignore dynamic call, but both functions behave the same
92
116
  # @return [generic<T>]
93
- def self.with_clean_env &block
117
+ def self.with_clean_env(&)
94
118
  meth = if Bundler.respond_to?(:with_original_env)
95
- :with_original_env
96
- else
97
- :with_clean_env
98
- end
99
- Bundler.send meth, &block
119
+ :with_original_env
120
+ else
121
+ :with_clean_env
122
+ end
123
+ Bundler.send(meth, &)
100
124
  end
101
125
  end
102
126
 
@@ -0,0 +1,193 @@
1
+ # <!-- rdoc-file=lib/rubygems/dependency.rb -->
2
+ # The Dependency class holds a Gem name and a Gem::Requirement.
3
+ #
4
+ class Gem::Dependency
5
+ @name: untyped
6
+
7
+ @requirement: untyped
8
+
9
+ @type: untyped
10
+
11
+ @prerelease: untyped
12
+
13
+ @version_requirements: untyped
14
+
15
+ @version_requirement: untyped
16
+
17
+ # <!-- rdoc-file=lib/rubygems/dependency.rb -->
18
+ # Valid dependency types.
19
+ #
20
+ TYPES: ::Array[:development | :runtime]
21
+
22
+ # <!-- rdoc-file=lib/rubygems/dependency.rb -->
23
+ # Dependency name or regular expression.
24
+ #
25
+ attr_accessor name: untyped
26
+
27
+ # <!-- rdoc-file=lib/rubygems/dependency.rb -->
28
+ # Allows you to force this dependency to be a prerelease.
29
+ #
30
+ attr_writer prerelease: untyped
31
+
32
+ # <!--
33
+ # rdoc-file=lib/rubygems/dependency.rb
34
+ # - new(name, *requirements)
35
+ # -->
36
+ # Constructs a dependency with `name` and `requirements`. The last argument can
37
+ # optionally be the dependency type, which defaults to `:runtime`.
38
+ #
39
+ def initialize: (untyped name, *untyped requirements) -> void
40
+
41
+ def hash: () -> untyped
42
+
43
+ def inspect: () -> untyped
44
+
45
+ # <!--
46
+ # rdoc-file=lib/rubygems/dependency.rb
47
+ # - prerelease?()
48
+ # -->
49
+ # Does this dependency require a prerelease?
50
+ #
51
+ def prerelease?: () -> untyped
52
+
53
+ # <!--
54
+ # rdoc-file=lib/rubygems/dependency.rb
55
+ # - latest_version?()
56
+ # -->
57
+ # Is this dependency simply asking for the latest version of a gem?
58
+ #
59
+ def latest_version?: () -> untyped
60
+
61
+ def pretty_print: (untyped q) -> untyped
62
+
63
+ # <!--
64
+ # rdoc-file=lib/rubygems/dependency.rb
65
+ # - requirement()
66
+ # -->
67
+ # What does this dependency require?
68
+ #
69
+ def requirement: () -> untyped
70
+
71
+ # <!--
72
+ # rdoc-file=lib/rubygems/dependency.rb
73
+ # - requirements_list()
74
+ # -->
75
+ #
76
+ def requirements_list: () -> untyped
77
+
78
+ def to_s: () -> ::String
79
+
80
+ # <!--
81
+ # rdoc-file=lib/rubygems/dependency.rb
82
+ # - type()
83
+ # -->
84
+ # Dependency type.
85
+ #
86
+ def type: () -> untyped
87
+
88
+ # <!--
89
+ # rdoc-file=lib/rubygems/dependency.rb
90
+ # - runtime?()
91
+ # -->
92
+ #
93
+ def runtime?: () -> untyped
94
+
95
+ def ==: (untyped other) -> untyped
96
+
97
+ # <!--
98
+ # rdoc-file=lib/rubygems/dependency.rb
99
+ # - <=>(other)
100
+ # -->
101
+ # Dependencies are ordered by name.
102
+ #
103
+ def <=>: (untyped other) -> untyped
104
+
105
+ # <!--
106
+ # rdoc-file=lib/rubygems/dependency.rb
107
+ # - =~(other)
108
+ # -->
109
+ # Uses this dependency as a pattern to compare to `other`. This dependency will
110
+ # match if the name matches the other's name, and other has only an equal
111
+ # version requirement that satisfies this dependency.
112
+ #
113
+ def =~: (untyped other) -> (nil | false | untyped)
114
+
115
+ # <!--
116
+ # rdoc-file=lib/rubygems/dependency.rb
117
+ # - ===(other)
118
+ # -->
119
+ #
120
+ alias === =~
121
+
122
+ # <!--
123
+ # rdoc-file=lib/rubygems/dependency.rb
124
+ # - dep.match? name => true or false
125
+ # - dep.match? name, version => true or false
126
+ # - dep.match? spec => true or false
127
+ # -->
128
+ # Does this dependency match the specification described by `name` and `version`
129
+ # or match `spec`?
130
+ #
131
+ # NOTE: Unlike #matches_spec? this method does not return true when the version
132
+ # is a prerelease version unless this is a prerelease dependency.
133
+ #
134
+ def match?: (untyped obj, ?untyped? version, ?bool allow_prerelease) -> (false | true | untyped)
135
+
136
+ # <!--
137
+ # rdoc-file=lib/rubygems/dependency.rb
138
+ # - matches_spec?(spec)
139
+ # -->
140
+ # Does this dependency match `spec`?
141
+ #
142
+ # NOTE: This is not a convenience method. Unlike #match? this method returns
143
+ # true when `spec` is a prerelease version even if this dependency is not a
144
+ # prerelease dependency.
145
+ #
146
+ def matches_spec?: (untyped spec) -> (false | true | untyped)
147
+
148
+ # <!--
149
+ # rdoc-file=lib/rubygems/dependency.rb
150
+ # - merge(other)
151
+ # -->
152
+ # Merges the requirements of `other` into this dependency
153
+ #
154
+ def merge: (untyped other) -> untyped
155
+
156
+ # <!--
157
+ # rdoc-file=lib/rubygems/dependency.rb
158
+ # - matching_specs(platform_only = false)
159
+ # -->
160
+ #
161
+ def matching_specs: (?bool platform_only) -> untyped
162
+
163
+ # <!--
164
+ # rdoc-file=lib/rubygems/dependency.rb
165
+ # - specific?()
166
+ # -->
167
+ # True if the dependency will not always match the latest version.
168
+ #
169
+ def specific?: () -> untyped
170
+
171
+ # <!--
172
+ # rdoc-file=lib/rubygems/dependency.rb
173
+ # - to_specs()
174
+ # -->
175
+ #
176
+ def to_specs: () -> untyped
177
+
178
+ # <!--
179
+ # rdoc-file=lib/rubygems/dependency.rb
180
+ # - to_spec()
181
+ # -->
182
+ #
183
+ def to_spec: () -> untyped
184
+
185
+ # <!--
186
+ # rdoc-file=lib/rubygems/dependency.rb
187
+ # - identity()
188
+ # -->
189
+ #
190
+ def identity: () -> (:complete | :abs_latest | :latest | :released)
191
+
192
+ def encode_with: (untyped coder) -> untyped
193
+ end
@@ -1,5 +1,5 @@
1
1
  module ::AST
2
2
  class Node
3
- def children: () -> [self, Integer, String, Symbol, nil]
3
+ def children: () -> Array[self | Integer | String | Symbol | nil]
4
4
  end
5
5
  end
@@ -0,0 +1,11 @@
1
+ module Diff
2
+ end
3
+
4
+ module Diff::LCS
5
+ def self.LCS: (Array[String], Array[String]) -> Array[String]
6
+ | (String, String) -> Array[String]
7
+ def self.diff: (Array[String], Array[String]) -> Array[Array[String]]
8
+ | (String, String) -> Array[Array[Diff::LCS::Change]]
9
+
10
+ def self.patch!: (Array[String], Array[String]) -> String
11
+ end
data/solargraph.gemspec CHANGED
@@ -1,4 +1,7 @@
1
- $LOAD_PATH.unshift File.dirname(__FILE__) + '/lib'
1
+ # frozen_string_literal: true
2
+
3
+ # @sg-ignore Should better support meaning of '&' in RBS
4
+ $LOAD_PATH.unshift "#{File.dirname(__FILE__)}/lib"
2
5
  require 'solargraph/version'
3
6
  require 'date'
4
7
 
@@ -6,12 +9,11 @@ require 'date'
6
9
  Gem::Specification.new do |s|
7
10
  s.name = 'solargraph'
8
11
  s.version = Solargraph::VERSION
9
- s.date = Date.today.strftime("%Y-%m-%d")
10
- s.summary = "A Ruby language server"
11
- s.description = "IDE tools for code completion, inline documentation, and static analysis"
12
- s.authors = ["Fred Snyder"]
12
+ s.summary = 'A Ruby language server'
13
+ s.description = 'IDE tools for code completion, inline documentation, and static analysis'
14
+ s.authors = ['Fred Snyder']
13
15
  s.email = 'admin@castwide.com'
14
- s.files = Dir.chdir(File.expand_path('..', __FILE__)) do
16
+ s.files = Dir.chdir(File.expand_path(__dir__)) do
15
17
  # @sg-ignore Need backtick support
16
18
  # @type [String]
17
19
  all_files = `git ls-files -z`
@@ -20,36 +22,37 @@ Gem::Specification.new do |s|
20
22
  s.homepage = 'https://solargraph.org'
21
23
  s.license = 'MIT'
22
24
  s.executables = ['solargraph']
23
- s.metadata["funding_uri"] = "https://www.patreon.com/castwide"
24
- s.metadata["bug_tracker_uri"] = "https://github.com/castwide/solargraph/issues"
25
- s.metadata["changelog_uri"] = "https://github.com/castwide/solargraph/blob/master/CHANGELOG.md"
26
- s.metadata["source_code_uri"] = "https://github.com/castwide/solargraph"
27
- s.metadata["rubygems_mfa_required"] = "true"
25
+ s.metadata['funding_uri'] = 'https://www.patreon.com/castwide'
26
+ s.metadata['bug_tracker_uri'] = 'https://github.com/castwide/solargraph/issues'
27
+ s.metadata['changelog_uri'] = 'https://github.com/castwide/solargraph/blob/master/CHANGELOG.md'
28
+ s.metadata['source_code_uri'] = 'https://github.com/castwide/solargraph'
29
+ s.metadata['rubygems_mfa_required'] = 'true'
28
30
 
29
- s.required_ruby_version = '>= 3.0'
31
+ s.required_ruby_version = '>= 3.1'
30
32
 
31
- s.add_runtime_dependency 'ast', '~> 2.4.3'
32
- s.add_runtime_dependency 'backport', '~> 1.2'
33
- s.add_runtime_dependency 'benchmark', '~> 0.4'
34
- s.add_runtime_dependency 'bundler', '>= 2.0'
35
- s.add_runtime_dependency 'diff-lcs', '~> 1.4'
36
- s.add_runtime_dependency 'jaro_winkler', '~> 1.6', '>= 1.6.1'
37
- s.add_runtime_dependency 'kramdown', '~> 2.3'
38
- s.add_runtime_dependency 'kramdown-parser-gfm', '~> 1.1'
39
- s.add_runtime_dependency 'logger', '~> 1.6'
40
- s.add_runtime_dependency 'observer', '~> 0.1'
41
- s.add_runtime_dependency 'ostruct', '~> 0.6'
42
- s.add_runtime_dependency 'open3', '~> 0.2.1'
43
- s.add_runtime_dependency 'parser', '~> 3.0'
44
- s.add_runtime_dependency 'prism', '~> 1.4'
45
- s.add_runtime_dependency 'rbs', ['>= 3.6.1', '<= 4.0.0.dev.4']
46
- s.add_runtime_dependency 'reverse_markdown', '~> 3.0'
47
- s.add_runtime_dependency 'rubocop', '~> 1.76'
48
- s.add_runtime_dependency 'thor', '~> 1.0'
49
- s.add_runtime_dependency 'tilt', '~> 2.0'
50
- s.add_runtime_dependency 'yard', '~> 0.9', '>= 0.9.24'
51
- s.add_runtime_dependency 'yard-solargraph', '~> 0.1'
52
- s.add_runtime_dependency 'yard-activesupport-concern', '~> 0.0'
33
+ s.add_dependency 'ast', '~> 2.4.3'
34
+ s.add_dependency 'backport', '~> 1.2'
35
+ s.add_dependency 'benchmark', '~> 0.4'
36
+ s.add_dependency 'bundler', '>= 2.0'
37
+ s.add_dependency 'diff-lcs', '~> 1.4'
38
+ s.add_dependency 'jaro_winkler', '~> 1.6', '>= 1.6.1'
39
+ s.add_dependency 'kramdown', '~> 2.3'
40
+ s.add_dependency 'kramdown-parser-gfm', '~> 1.1'
41
+ s.add_dependency 'logger', '~> 1.6'
42
+ s.add_dependency 'observer', '~> 0.1'
43
+ s.add_dependency 'open3', '~> 0.2.1'
44
+ s.add_dependency 'ostruct', '~> 0.6'
45
+ s.add_dependency 'parser', '~> 3.0'
46
+ s.add_dependency 'prism', '~> 1.4'
47
+ s.add_dependency 'rbs', '>= 3.10.0'
48
+ s.add_dependency 'reverse_markdown', '~> 3.0'
49
+ s.add_dependency 'rubocop', '~> 1.76'
50
+ s.add_dependency 'sord', '~> 7.0'
51
+ s.add_dependency 'thor', '~> 1.0'
52
+ s.add_dependency 'tilt', '~> 2.0'
53
+ s.add_dependency 'yard', '~> 0.9', '>= 0.9.24'
54
+ s.add_dependency 'yard-activesupport-concern', '~> 0.0'
55
+ s.add_dependency 'yard-solargraph', '~> 0.1'
53
56
 
54
57
  s.add_development_dependency 'pry', '~> 0.15'
55
58
  s.add_development_dependency 'public_suffix', '~> 3.1'
@@ -61,6 +64,7 @@ Gem::Specification.new do |s|
61
64
  #
62
65
  # even more specific on RuboCop itself, which is written into _todo
63
66
  # file.
67
+ s.add_development_dependency 'overcommit', '~> 0.68.0'
64
68
  s.add_development_dependency 'rubocop', '~> 1.80.0.0'
65
69
  s.add_development_dependency 'rubocop-rake', '~> 0.7.1'
66
70
  s.add_development_dependency 'rubocop-rspec', '~> 3.6.0'
@@ -68,7 +72,6 @@ Gem::Specification.new do |s|
68
72
  s.add_development_dependency 'simplecov', '~> 0.21'
69
73
  s.add_development_dependency 'simplecov-lcov', '~> 0.8'
70
74
  s.add_development_dependency 'undercover', '~> 0.7'
71
- s.add_development_dependency 'overcommit', '~> 0.68.0'
72
75
  s.add_development_dependency 'webmock', '~> 3.6'
73
76
  # work around missing yard dependency needed as of Ruby 3.5
74
77
  s.add_development_dependency 'irb', '~> 1.15'