solargraph 0.58.0 → 0.59.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 (219) hide show
  1. checksums.yaml +4 -4
  2. data/.envrc +3 -0
  3. data/.gitattributes +2 -0
  4. data/.github/workflows/linting.yml +6 -5
  5. data/.github/workflows/plugins.yml +48 -35
  6. data/.github/workflows/rspec.yml +15 -28
  7. data/.github/workflows/typecheck.yml +3 -2
  8. data/.gitignore +1 -0
  9. data/.rubocop.yml +38 -6
  10. data/.rubocop_todo.yml +53 -966
  11. data/CHANGELOG.md +24 -0
  12. data/Gemfile +3 -1
  13. data/README.md +3 -3
  14. data/Rakefile +26 -23
  15. data/bin/solargraph +9 -8
  16. data/lib/solargraph/api_map/cache.rb +110 -110
  17. data/lib/solargraph/api_map/constants.rb +288 -279
  18. data/lib/solargraph/api_map/index.rb +204 -193
  19. data/lib/solargraph/api_map/source_to_yard.rb +110 -97
  20. data/lib/solargraph/api_map/store.rb +395 -384
  21. data/lib/solargraph/api_map.rb +1029 -945
  22. data/lib/solargraph/bench.rb +44 -45
  23. data/lib/solargraph/complex_type/conformance.rb +176 -0
  24. data/lib/solargraph/complex_type/type_methods.rb +240 -228
  25. data/lib/solargraph/complex_type/unique_type.rb +641 -482
  26. data/lib/solargraph/complex_type.rb +557 -444
  27. data/lib/solargraph/convention/data_definition/data_assignment_node.rb +61 -61
  28. data/lib/solargraph/convention/data_definition/data_definition_node.rb +93 -91
  29. data/lib/solargraph/convention/data_definition.rb +108 -105
  30. data/lib/solargraph/convention/gemfile.rb +15 -15
  31. data/lib/solargraph/convention/gemspec.rb +23 -23
  32. data/lib/solargraph/convention/rakefile.rb +17 -17
  33. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +62 -61
  34. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +103 -102
  35. data/lib/solargraph/convention/struct_definition.rb +168 -164
  36. data/lib/solargraph/convention.rb +78 -78
  37. data/lib/solargraph/converters/dd.rb +19 -17
  38. data/lib/solargraph/converters/dl.rb +17 -15
  39. data/lib/solargraph/converters/dt.rb +17 -15
  40. data/lib/solargraph/converters/misc.rb +3 -1
  41. data/lib/solargraph/diagnostics/require_not_found.rb +54 -53
  42. data/lib/solargraph/diagnostics/rubocop.rb +119 -118
  43. data/lib/solargraph/diagnostics/rubocop_helpers.rb +70 -68
  44. data/lib/solargraph/diagnostics/type_check.rb +56 -55
  45. data/lib/solargraph/diagnostics/update_errors.rb +37 -41
  46. data/lib/solargraph/doc_map.rb +438 -439
  47. data/lib/solargraph/equality.rb +34 -34
  48. data/lib/solargraph/gem_pins.rb +98 -98
  49. data/lib/solargraph/language_server/error_codes.rb +20 -20
  50. data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
  51. data/lib/solargraph/language_server/host/dispatch.rb +130 -130
  52. data/lib/solargraph/language_server/host/message_worker.rb +113 -112
  53. data/lib/solargraph/language_server/host/sources.rb +100 -99
  54. data/lib/solargraph/language_server/host.rb +886 -878
  55. data/lib/solargraph/language_server/message/base.rb +97 -97
  56. data/lib/solargraph/language_server/message/client/register_capability.rb +13 -15
  57. data/lib/solargraph/language_server/message/completion_item/resolve.rb +58 -60
  58. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +108 -114
  59. data/lib/solargraph/language_server/message/extended/document.rb +24 -23
  60. data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -32
  61. data/lib/solargraph/language_server/message/extended/download_core.rb +20 -19
  62. data/lib/solargraph/language_server/message/extended/search.rb +20 -20
  63. data/lib/solargraph/language_server/message/initialize.rb +197 -191
  64. data/lib/solargraph/language_server/message/text_document/completion.rb +58 -56
  65. data/lib/solargraph/language_server/message/text_document/definition.rb +49 -40
  66. data/lib/solargraph/language_server/message/text_document/document_highlight.rb +23 -16
  67. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +36 -26
  68. data/lib/solargraph/language_server/message/text_document/formatting.rb +150 -148
  69. data/lib/solargraph/language_server/message/text_document/hover.rb +58 -58
  70. data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +18 -11
  71. data/lib/solargraph/language_server/message/text_document/references.rb +23 -16
  72. data/lib/solargraph/language_server/message/text_document/rename.rb +26 -19
  73. data/lib/solargraph/language_server/message/text_document/signature_help.rb +25 -24
  74. data/lib/solargraph/language_server/message/text_document/type_definition.rb +33 -25
  75. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +41 -35
  76. data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +48 -40
  77. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +32 -26
  78. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +33 -23
  79. data/lib/solargraph/language_server/message.rb +94 -94
  80. data/lib/solargraph/language_server/request.rb +29 -27
  81. data/lib/solargraph/language_server/transport/data_reader.rb +72 -74
  82. data/lib/solargraph/language_server/uri_helpers.rb +49 -49
  83. data/lib/solargraph/library.rb +702 -683
  84. data/lib/solargraph/location.rb +85 -82
  85. data/lib/solargraph/logging.rb +55 -37
  86. data/lib/solargraph/page.rb +92 -92
  87. data/lib/solargraph/parser/comment_ripper.rb +84 -69
  88. data/lib/solargraph/parser/flow_sensitive_typing.rb +471 -255
  89. data/lib/solargraph/parser/node_processor/base.rb +122 -92
  90. data/lib/solargraph/parser/node_processor.rb +63 -62
  91. data/lib/solargraph/parser/parser_gem/class_methods.rb +165 -149
  92. data/lib/solargraph/parser/parser_gem/flawed_builder.rb +19 -19
  93. data/lib/solargraph/parser/parser_gem/node_chainer.rb +191 -166
  94. data/lib/solargraph/parser/parser_gem/node_methods.rb +507 -486
  95. data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +22 -22
  96. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +61 -59
  97. data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +24 -15
  98. data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +45 -46
  99. data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +60 -53
  100. data/lib/solargraph/parser/parser_gem/node_processors/defs_node.rb +38 -37
  101. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +53 -23
  102. data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +42 -40
  103. data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +30 -29
  104. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +61 -59
  105. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +98 -98
  106. data/lib/solargraph/parser/parser_gem/node_processors/or_node.rb +22 -0
  107. data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +17 -17
  108. data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +39 -38
  109. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +51 -52
  110. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +302 -291
  111. data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +29 -29
  112. data/lib/solargraph/parser/parser_gem/node_processors/when_node.rb +23 -0
  113. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +33 -29
  114. data/lib/solargraph/parser/parser_gem/node_processors.rb +74 -70
  115. data/lib/solargraph/parser/parser_gem.rb +14 -12
  116. data/lib/solargraph/parser/region.rb +75 -69
  117. data/lib/solargraph/parser/snippet.rb +19 -17
  118. data/lib/solargraph/parser.rb +25 -23
  119. data/lib/solargraph/pin/base.rb +773 -729
  120. data/lib/solargraph/pin/base_variable.rb +375 -126
  121. data/lib/solargraph/pin/block.rb +127 -104
  122. data/lib/solargraph/pin/breakable.rb +15 -9
  123. data/lib/solargraph/pin/callable.rb +275 -231
  124. data/lib/solargraph/pin/closure.rb +69 -72
  125. data/lib/solargraph/pin/common.rb +97 -79
  126. data/lib/solargraph/pin/compound_statement.rb +55 -0
  127. data/lib/solargraph/pin/constant.rb +43 -45
  128. data/lib/solargraph/pin/conversions.rb +129 -123
  129. data/lib/solargraph/pin/delegated_method.rb +131 -120
  130. data/lib/solargraph/pin/documenting.rb +116 -114
  131. data/lib/solargraph/pin/instance_variable.rb +38 -34
  132. data/lib/solargraph/pin/keyword.rb +16 -20
  133. data/lib/solargraph/pin/local_variable.rb +31 -75
  134. data/lib/solargraph/pin/method.rb +724 -672
  135. data/lib/solargraph/pin/method_alias.rb +42 -34
  136. data/lib/solargraph/pin/namespace.rb +122 -115
  137. data/lib/solargraph/pin/parameter.rb +339 -275
  138. data/lib/solargraph/pin/proxy_type.rb +42 -39
  139. data/lib/solargraph/pin/reference/override.rb +47 -47
  140. data/lib/solargraph/pin/reference/superclass.rb +17 -15
  141. data/lib/solargraph/pin/reference/type_alias.rb +16 -0
  142. data/lib/solargraph/pin/reference.rb +59 -39
  143. data/lib/solargraph/pin/search.rb +62 -61
  144. data/lib/solargraph/pin/signature.rb +64 -61
  145. data/lib/solargraph/pin/symbol.rb +54 -53
  146. data/lib/solargraph/pin/until.rb +16 -18
  147. data/lib/solargraph/pin/while.rb +16 -18
  148. data/lib/solargraph/pin.rb +46 -44
  149. data/lib/solargraph/pin_cache.rb +248 -245
  150. data/lib/solargraph/position.rb +139 -119
  151. data/lib/solargraph/range.rb +113 -112
  152. data/lib/solargraph/rbs_map/conversions.rb +952 -823
  153. data/lib/solargraph/rbs_map/core_fills.rb +91 -84
  154. data/lib/solargraph/rbs_map/core_map.rb +65 -58
  155. data/lib/solargraph/rbs_map/stdlib_map.rb +71 -43
  156. data/lib/solargraph/rbs_map.rb +207 -163
  157. data/lib/solargraph/server_methods.rb +16 -16
  158. data/lib/solargraph/shell.rb +555 -352
  159. data/lib/solargraph/source/chain/array.rb +39 -37
  160. data/lib/solargraph/source/chain/call.rb +377 -337
  161. data/lib/solargraph/source/chain/class_variable.rb +13 -13
  162. data/lib/solargraph/source/chain/constant.rb +30 -26
  163. data/lib/solargraph/source/chain/global_variable.rb +13 -13
  164. data/lib/solargraph/source/chain/hash.rb +37 -34
  165. data/lib/solargraph/source/chain/if.rb +30 -28
  166. data/lib/solargraph/source/chain/instance_variable.rb +36 -13
  167. data/lib/solargraph/source/chain/link.rb +99 -109
  168. data/lib/solargraph/source/chain/literal.rb +51 -48
  169. data/lib/solargraph/source/chain/or.rb +29 -23
  170. data/lib/solargraph/source/chain/q_call.rb +13 -11
  171. data/lib/solargraph/source/chain/variable.rb +15 -13
  172. data/lib/solargraph/source/chain/z_super.rb +28 -30
  173. data/lib/solargraph/source/chain.rb +304 -291
  174. data/lib/solargraph/source/change.rb +89 -82
  175. data/lib/solargraph/source/cursor.rb +172 -166
  176. data/lib/solargraph/source/encoding_fixes.rb +22 -23
  177. data/lib/solargraph/source/source_chainer.rb +218 -194
  178. data/lib/solargraph/source/updater.rb +59 -55
  179. data/lib/solargraph/source.rb +522 -498
  180. data/lib/solargraph/source_map/clip.rb +245 -226
  181. data/lib/solargraph/source_map/data.rb +37 -34
  182. data/lib/solargraph/source_map/mapper.rb +286 -259
  183. data/lib/solargraph/source_map.rb +224 -212
  184. data/lib/solargraph/type_checker/problem.rb +34 -32
  185. data/lib/solargraph/type_checker/rules.rb +157 -84
  186. data/lib/solargraph/type_checker.rb +888 -814
  187. data/lib/solargraph/version.rb +5 -5
  188. data/lib/solargraph/workspace/config.rb +258 -255
  189. data/lib/solargraph/workspace/gemspecs.rb +367 -0
  190. data/lib/solargraph/workspace/require_paths.rb +98 -97
  191. data/lib/solargraph/workspace.rb +242 -220
  192. data/lib/solargraph/yard_map/helpers.rb +49 -44
  193. data/lib/solargraph/yard_map/mapper/to_method.rb +136 -130
  194. data/lib/solargraph/yard_map/mapper/to_namespace.rb +32 -31
  195. data/lib/solargraph/yard_map/mapper.rb +84 -79
  196. data/lib/solargraph/yard_map.rb +17 -18
  197. data/lib/solargraph/yard_tags.rb +20 -20
  198. data/lib/solargraph/yardoc.rb +90 -87
  199. data/lib/solargraph.rb +128 -105
  200. data/rbs/fills/rubygems/0/dependency.rbs +193 -0
  201. data/rbs/fills/tuple/tuple.rbs +28 -0
  202. data/rbs/shims/ast/0/node.rbs +5 -0
  203. data/rbs/shims/diff-lcs/1.5/diff-lcs.rbs +11 -0
  204. data/rbs_collection.yaml +1 -1
  205. data/solargraph.gemspec +37 -35
  206. metadata +52 -51
  207. data/lib/solargraph/type_checker/checks.rb +0 -124
  208. data/lib/solargraph/type_checker/param_def.rb +0 -37
  209. data/lib/solargraph/yard_map/to_method.rb +0 -89
  210. data/sig/shims/ast/0/node.rbs +0 -5
  211. /data/{sig → rbs}/shims/ast/2.4/.rbs_meta.yaml +0 -0
  212. /data/{sig → rbs}/shims/ast/2.4/ast.rbs +0 -0
  213. /data/{sig → rbs}/shims/parser/3.2.0.1/builders/default.rbs +0 -0
  214. /data/{sig → rbs}/shims/parser/3.2.0.1/manifest.yaml +0 -0
  215. /data/{sig → rbs}/shims/parser/3.2.0.1/parser.rbs +0 -0
  216. /data/{sig → rbs}/shims/parser/3.2.0.1/polyfill.rbs +0 -0
  217. /data/{sig → rbs}/shims/thor/1.2.0.1/.rbs_meta.yaml +0 -0
  218. /data/{sig → rbs}/shims/thor/1.2.0.1/manifest.yaml +0 -0
  219. /data/{sig → rbs}/shims/thor/1.2.0.1/thor.rbs +0 -0
@@ -1,163 +1,207 @@
1
- # frozen_string_literal: true
2
-
3
- require 'digest'
4
- require 'pathname'
5
- require 'rbs'
6
-
7
- module Solargraph
8
- class RbsMap
9
- autoload :Conversions, 'solargraph/rbs_map/conversions'
10
- autoload :CoreMap, 'solargraph/rbs_map/core_map'
11
- autoload :CoreFills, 'solargraph/rbs_map/core_fills'
12
- autoload :StdlibMap, 'solargraph/rbs_map/stdlib_map'
13
-
14
- include Logging
15
-
16
- # @type [Hash{String => RbsMap}]
17
- @@rbs_maps_hash = {}
18
-
19
- attr_reader :library
20
-
21
- attr_reader :rbs_collection_paths
22
-
23
- attr_reader :rbs_collection_config_path
24
-
25
- # @param library [String]
26
- # @param version [String, nil]
27
- # @param rbs_collection_config_path [String, Pathname, nil]
28
- # @param rbs_collection_paths [Array<Pathname, String>]
29
- def initialize library, version = nil, rbs_collection_config_path: nil, rbs_collection_paths: []
30
- if rbs_collection_config_path.nil? && !rbs_collection_paths.empty?
31
- raise 'Please provide rbs_collection_config_path if you provide rbs_collection_paths'
32
- end
33
- @library = library
34
- @version = version
35
- @rbs_collection_config_path = rbs_collection_config_path
36
- @rbs_collection_paths = rbs_collection_paths
37
- add_library loader, library, version
38
- end
39
-
40
- # @return [RBS::EnvironmentLoader]
41
- def loader
42
- @loader ||= RBS::EnvironmentLoader.new(core_root: nil, repository: repository)
43
- end
44
-
45
- # @return [String] representing the version of the RBS info fetched
46
- # for the given library. Must change when the RBS info is
47
- # updated upstream for the same library and version. May change
48
- # if the config for where information comes form changes.
49
- def cache_key
50
- @hextdigest ||= begin
51
- # @type [String, nil]
52
- data = nil
53
- if rbs_collection_config_path
54
- lockfile_path = RBS::Collection::Config.to_lockfile_path(Pathname.new(rbs_collection_config_path))
55
- if lockfile_path.exist?
56
- collection_config = RBS::Collection::Config.from_path lockfile_path
57
- gem_config = collection_config.gem(library)
58
- data = gem_config&.to_s
59
- end
60
- end
61
- if data.nil? || data.empty?
62
- if resolved?
63
- # definitely came from the gem itself and not elsewhere -
64
- # only one version per gem
65
- 'gem-export'
66
- else
67
- 'unresolved'
68
- end
69
- else
70
- Digest::SHA1.hexdigest(data)
71
- end
72
- end
73
- end
74
-
75
- # @param gemspec [Gem::Specification, Bundler::LazySpecification]
76
- # @param rbs_collection_path [String, Pathname, nil]
77
- # @param rbs_collection_config_path [String, Pathname, nil]
78
- # @return [RbsMap]
79
- def self.from_gemspec gemspec, rbs_collection_path, rbs_collection_config_path
80
- rbs_map = RbsMap.new(gemspec.name, gemspec.version,
81
- rbs_collection_paths: [rbs_collection_path].compact,
82
- rbs_collection_config_path: rbs_collection_config_path)
83
- return rbs_map if rbs_map.resolved?
84
-
85
- # try any version of the gem in the collection
86
- RbsMap.new(gemspec.name, nil,
87
- rbs_collection_paths: [rbs_collection_path].compact,
88
- rbs_collection_config_path: rbs_collection_config_path)
89
- end
90
-
91
- # @return [Array<Pin::Base>]
92
- def pins
93
- @pins ||= resolved? ? conversions.pins : []
94
- end
95
-
96
- # @generic T
97
- # @param path [String]
98
- # @param klass [Class<generic<T>>]
99
- # @return [generic<T>, nil]
100
- def path_pin path, klass = Pin::Base
101
- pin = pins.find { |p| p.path == path }
102
- pin if pin&.is_a?(klass)
103
- end
104
-
105
- # @param path [String]
106
- # @return [Array<Pin::Base>]
107
- def path_pins path
108
- pins.select { |p| p.path == path }
109
- end
110
-
111
- def resolved?
112
- @resolved
113
- end
114
-
115
- # @return [RBS::Repository]
116
- def repository
117
- @repository ||= RBS::Repository.new(no_stdlib: false).tap do |repo|
118
- @rbs_collection_paths.each do |dir|
119
- dir_path = Pathname.new(dir)
120
- repo.add(dir_path) if dir_path.exist? && dir_path.directory?
121
- end
122
- end
123
- end
124
-
125
- # @param library [String]
126
- # @return [RbsMap]
127
- def self.load library
128
- @@rbs_maps_hash[library] ||= RbsMap.new(library)
129
- end
130
-
131
- private
132
-
133
- # @return [RBS::EnvironmentLoader]
134
- def loader
135
- @loader ||= RBS::EnvironmentLoader.new(core_root: nil, repository: repository)
136
- end
137
-
138
- # @return [Conversions]
139
- def conversions
140
- @conversions ||= Conversions.new(loader: loader)
141
- end
142
-
143
- # @param loader [RBS::EnvironmentLoader]
144
- # @param library [String]
145
- # @param version [String, nil]
146
- # @return [Boolean] true if adding the library succeeded
147
- def add_library loader, library, version
148
- @resolved = if loader.has_library?(library: library, version: version)
149
- loader.add library: library, version: version
150
- logger.debug { "#{short_name} successfully loaded library #{library}:#{version}" }
151
- true
152
- else
153
- logger.info { "#{short_name} did not find data for library #{library}:#{version}" }
154
- false
155
- end
156
- end
157
-
158
- # @return [String]
159
- def short_name
160
- self.class.name.split('::').last
161
- end
162
- end
163
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'digest'
4
+ require 'pathname'
5
+ require 'rbs'
6
+
7
+ module Solargraph
8
+ class RbsMap
9
+ autoload :Conversions, 'solargraph/rbs_map/conversions'
10
+ autoload :CoreMap, 'solargraph/rbs_map/core_map'
11
+ autoload :CoreFills, 'solargraph/rbs_map/core_fills'
12
+ autoload :StdlibMap, 'solargraph/rbs_map/stdlib_map'
13
+
14
+ include Logging
15
+
16
+ # @type [Hash{String => RbsMap}]
17
+ @@rbs_maps_hash = {}
18
+
19
+ attr_reader :library, :rbs_collection_paths, :rbs_collection_config_path
20
+
21
+ # @param library [String]
22
+ # @param version [String, nil]
23
+ # @param rbs_collection_config_path [String, Pathname, nil]
24
+ # @param rbs_collection_paths [Array<Pathname, String>]
25
+ # @param out [StringIO, IO, nil] where to log messages
26
+ def initialize library, version = nil, rbs_collection_config_path: nil, rbs_collection_paths: [], out: $stderr
27
+ if rbs_collection_config_path.nil? && !rbs_collection_paths.empty?
28
+ raise 'Please provide rbs_collection_config_path if you provide rbs_collection_paths'
29
+ end
30
+ @library = library
31
+ @version = version
32
+ @rbs_collection_config_path = rbs_collection_config_path
33
+ @rbs_collection_paths = rbs_collection_paths
34
+ add_library loader, library, version
35
+ end
36
+
37
+ CACHE_KEY_GEM_EXPORT = 'gem-export'
38
+ CACHE_KEY_UNRESOLVED = 'unresolved'
39
+ CACHE_KEY_STDLIB = 'stdlib'
40
+ CACHE_KEY_LOCAL = 'local'
41
+
42
+ # @param cache_key [String, nil]
43
+ # @return [String, nil] a description of the source of the RBS info
44
+ def self.rbs_source_desc cache_key
45
+ case cache_key
46
+ when CACHE_KEY_GEM_EXPORT
47
+ 'RBS gem export'
48
+ when CACHE_KEY_UNRESOLVED
49
+ nil
50
+ when CACHE_KEY_STDLIB
51
+ 'RBS standard library'
52
+ when CACHE_KEY_LOCAL
53
+ 'local RBS shims'
54
+ else
55
+ 'RBS collection'
56
+ end
57
+ end
58
+
59
+ # @return [RBS::EnvironmentLoader]
60
+ def loader
61
+ @loader ||= RBS::EnvironmentLoader.new(core_root: nil, repository: repository)
62
+ end
63
+
64
+ # @return [String] representing the version of the RBS info fetched
65
+ # for the given library. Must change when the RBS info is
66
+ # updated upstream for the same library and version. May change
67
+ # if the config for where information comes form changes.
68
+ def cache_key
69
+ return CACHE_KEY_UNRESOLVED unless resolved?
70
+
71
+ @cache_key ||= begin
72
+ # @type [String, nil]
73
+ data = nil
74
+ # @type gem_config [nil, Hash{String => Hash{String => String}}]
75
+ gem_config = nil
76
+ if rbs_collection_config_path
77
+ # @sg-ignore rbs_collection_config_path is not nil here
78
+ lockfile_path = RBS::Collection::Config.to_lockfile_path(Pathname.new(rbs_collection_config_path))
79
+ if lockfile_path.exist?
80
+ collection_config = RBS::Collection::Config.from_path lockfile_path
81
+ gem_config = collection_config.gem(library)
82
+ data = gem_config&.to_s
83
+ end
84
+ end
85
+ if gem_config.nil?
86
+ CACHE_KEY_STDLIB
87
+ else
88
+ # @type [String]
89
+ source = gem_config.dig('source', 'type')
90
+ case source
91
+ when 'rubygems'
92
+ CACHE_KEY_GEM_EXPORT
93
+ when 'local'
94
+ CACHE_KEY_LOCAL
95
+ when 'stdlib'
96
+ CACHE_KEY_STDLIB
97
+ else
98
+ Digest::SHA1.hexdigest(data || '')
99
+ end
100
+ end
101
+ end
102
+ end
103
+
104
+ # @param gemspec [Gem::Specification, Bundler::LazySpecification]
105
+ # @param rbs_collection_path [String, Pathname, nil]
106
+ # @param rbs_collection_config_path [String, Pathname, nil]
107
+ # @return [RbsMap]
108
+ def self.from_gemspec gemspec, rbs_collection_path, rbs_collection_config_path
109
+ # prefers stdlib RBS if available
110
+ rbs_map = RbsMap::StdlibMap.new(gemspec.name)
111
+ return rbs_map if rbs_map.resolved?
112
+
113
+ rbs_map = RbsMap.new(gemspec.name, gemspec.version,
114
+ rbs_collection_paths: [rbs_collection_path].compact,
115
+ rbs_collection_config_path: rbs_collection_config_path)
116
+ return rbs_map if rbs_map.resolved?
117
+
118
+ # try any version of the gem in the collection
119
+ RbsMap.new(gemspec.name, nil,
120
+ rbs_collection_paths: [rbs_collection_path].compact,
121
+ rbs_collection_config_path: rbs_collection_config_path)
122
+ end
123
+
124
+ # @param out [IO, nil] where to log messages
125
+ # @return [Array<Pin::Base>]
126
+ def pins out: $stderr
127
+ @pins ||= if resolved?
128
+ conversions.pins
129
+ else
130
+ []
131
+ end
132
+ end
133
+
134
+ # @generic T
135
+ # @param path [String]
136
+ # @param klass [Class<generic<T>>]
137
+ #
138
+ # @sg-ignore Need to be able to resolve generics based on a
139
+ # Class<generic<T>> param
140
+ # @return [generic<T>, nil]
141
+ def path_pin path, klass = Pin::Base
142
+ pin = pins.find { |p| p.path == path }
143
+ pin if pin.is_a?(klass)
144
+ end
145
+
146
+ # @param path [String]
147
+ # @return [Array<Pin::Base>]
148
+ def path_pins path
149
+ pins.select { |p| p.path == path }
150
+ end
151
+
152
+ def resolved?
153
+ @resolved
154
+ end
155
+
156
+ # @return [RBS::Repository]
157
+ def repository
158
+ @repository ||= RBS::Repository.new(no_stdlib: false).tap do |repo|
159
+ @rbs_collection_paths.each do |dir|
160
+ dir_path = Pathname.new(dir)
161
+ repo.add(dir_path) if dir_path.exist? && dir_path.directory?
162
+ end
163
+ end
164
+ end
165
+
166
+ # @param library [String]
167
+ # @return [RbsMap]
168
+ def self.load library
169
+ @@rbs_maps_hash[library] ||= RbsMap.new(library)
170
+ end
171
+
172
+ private
173
+
174
+ # @return [Conversions]
175
+ def conversions
176
+ @conversions ||= Conversions.new(loader: loader)
177
+ end
178
+
179
+ def resolve_dependencies?
180
+ # we need to resolve dependencies via gemfile.lock manually for
181
+ # YARD regardless, so use same mechanism here so we don't
182
+ # duplicate work generating pins from dependencies
183
+ false
184
+ end
185
+
186
+ # @param loader [RBS::EnvironmentLoader]
187
+ # @param library [String]
188
+ # @param version [String, nil] the version of the library to load, or nil for any
189
+ # @param out [StringIO, IO, nil] where to log messages
190
+ # @return [Boolean] true if adding the library succeeded
191
+ def add_library loader, library, version, out: $stderr
192
+ @resolved = if loader.has_library?(library: library, version: version)
193
+ loader.add library: library, version: version, resolve_dependencies: resolve_dependencies?
194
+ logger.debug { "#{short_name} successfully loaded library #{library}:#{version}" }
195
+ true
196
+ else
197
+ logger.info { "#{short_name} did not find data for library #{library}:#{version}" }
198
+ false
199
+ end
200
+ end
201
+
202
+ # @return [String]
203
+ def short_name
204
+ self.class.name.split('::').last
205
+ end
206
+ end
207
+ end
@@ -1,16 +1,16 @@
1
- # frozen_string_literal: true
2
-
3
- require 'socket'
4
-
5
- module Solargraph
6
- module ServerMethods
7
- # @return [Integer]
8
- def available_port
9
- socket = Socket.new(:INET, :STREAM, 0)
10
- socket.bind(Addrinfo.tcp("127.0.0.1", 0))
11
- port = socket.local_address.ip_port
12
- socket.close
13
- port
14
- end
15
- end
16
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'socket'
4
+
5
+ module Solargraph
6
+ module ServerMethods
7
+ # @return [Integer]
8
+ def available_port
9
+ socket = Socket.new(:INET, :STREAM, 0)
10
+ socket.bind(Addrinfo.tcp('127.0.0.1', 0))
11
+ port = socket.local_address.ip_port
12
+ socket.close
13
+ port
14
+ end
15
+ end
16
+ end