solargraph 0.58.2 → 0.59.0.dev.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 (203) hide show
  1. checksums.yaml +4 -4
  2. data/.envrc +3 -0
  3. data/.github/workflows/linting.yml +4 -5
  4. data/.github/workflows/plugins.yml +41 -34
  5. data/.github/workflows/rspec.yml +44 -23
  6. data/.github/workflows/typecheck.yml +2 -2
  7. data/.rubocop.yml +32 -5
  8. data/.rubocop_todo.yml +50 -966
  9. data/Gemfile +3 -1
  10. data/README.md +3 -3
  11. data/Rakefile +26 -23
  12. data/bin/solargraph +2 -1
  13. data/lib/solargraph/api_map/cache.rb +3 -3
  14. data/lib/solargraph/api_map/constants.rb +13 -3
  15. data/lib/solargraph/api_map/index.rb +23 -18
  16. data/lib/solargraph/api_map/source_to_yard.rb +22 -9
  17. data/lib/solargraph/api_map/store.rb +33 -28
  18. data/lib/solargraph/api_map.rb +150 -82
  19. data/lib/solargraph/bench.rb +44 -45
  20. data/lib/solargraph/complex_type/conformance.rb +176 -0
  21. data/lib/solargraph/complex_type/type_methods.rb +28 -17
  22. data/lib/solargraph/complex_type/unique_type.rb +218 -57
  23. data/lib/solargraph/complex_type.rb +170 -57
  24. data/lib/solargraph/convention/data_definition/data_assignment_node.rb +61 -61
  25. data/lib/solargraph/convention/data_definition/data_definition_node.rb +7 -5
  26. data/lib/solargraph/convention/data_definition.rb +5 -2
  27. data/lib/solargraph/convention/gemfile.rb +15 -15
  28. data/lib/solargraph/convention/gemspec.rb +23 -23
  29. data/lib/solargraph/convention/rakefile.rb +17 -17
  30. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +2 -1
  31. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +4 -3
  32. data/lib/solargraph/convention/struct_definition.rb +8 -4
  33. data/lib/solargraph/convention.rb +78 -78
  34. data/lib/solargraph/converters/dd.rb +19 -17
  35. data/lib/solargraph/converters/dl.rb +17 -15
  36. data/lib/solargraph/converters/dt.rb +17 -15
  37. data/lib/solargraph/converters/misc.rb +3 -1
  38. data/lib/solargraph/diagnostics/require_not_found.rb +1 -0
  39. data/lib/solargraph/diagnostics/rubocop.rb +11 -10
  40. data/lib/solargraph/diagnostics/rubocop_helpers.rb +5 -3
  41. data/lib/solargraph/diagnostics/type_check.rb +11 -10
  42. data/lib/solargraph/diagnostics/update_errors.rb +37 -41
  43. data/lib/solargraph/doc_map.rb +133 -373
  44. data/lib/solargraph/equality.rb +4 -4
  45. data/lib/solargraph/gem_pins.rb +21 -20
  46. data/lib/solargraph/language_server/error_codes.rb +20 -20
  47. data/lib/solargraph/language_server/host/diagnoser.rb +1 -1
  48. data/lib/solargraph/language_server/host/dispatch.rb +3 -3
  49. data/lib/solargraph/language_server/host/message_worker.rb +4 -3
  50. data/lib/solargraph/language_server/host/sources.rb +2 -1
  51. data/lib/solargraph/language_server/host.rb +30 -22
  52. data/lib/solargraph/language_server/message/base.rb +97 -97
  53. data/lib/solargraph/language_server/message/client/register_capability.rb +13 -15
  54. data/lib/solargraph/language_server/message/completion_item/resolve.rb +58 -60
  55. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +12 -18
  56. data/lib/solargraph/language_server/message/extended/document.rb +1 -0
  57. data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -32
  58. data/lib/solargraph/language_server/message/extended/download_core.rb +20 -19
  59. data/lib/solargraph/language_server/message/extended/search.rb +20 -20
  60. data/lib/solargraph/language_server/message/initialize.rb +197 -191
  61. data/lib/solargraph/language_server/message/text_document/completion.rb +10 -8
  62. data/lib/solargraph/language_server/message/text_document/definition.rb +41 -32
  63. data/lib/solargraph/language_server/message/text_document/document_highlight.rb +23 -16
  64. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +29 -19
  65. data/lib/solargraph/language_server/message/text_document/formatting.rb +8 -6
  66. data/lib/solargraph/language_server/message/text_document/hover.rb +5 -5
  67. data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +18 -11
  68. data/lib/solargraph/language_server/message/text_document/references.rb +23 -16
  69. data/lib/solargraph/language_server/message/text_document/rename.rb +26 -19
  70. data/lib/solargraph/language_server/message/text_document/signature_help.rb +3 -2
  71. data/lib/solargraph/language_server/message/text_document/type_definition.rb +25 -17
  72. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +41 -35
  73. data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +48 -40
  74. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +32 -26
  75. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +27 -17
  76. data/lib/solargraph/language_server/message.rb +94 -94
  77. data/lib/solargraph/language_server/request.rb +29 -27
  78. data/lib/solargraph/language_server/transport/data_reader.rb +72 -74
  79. data/lib/solargraph/language_server/uri_helpers.rb +49 -49
  80. data/lib/solargraph/library.rb +85 -44
  81. data/lib/solargraph/location.rb +17 -14
  82. data/lib/solargraph/logging.rb +24 -4
  83. data/lib/solargraph/page.rb +92 -92
  84. data/lib/solargraph/parser/comment_ripper.rb +19 -4
  85. data/lib/solargraph/parser/flow_sensitive_typing.rb +326 -108
  86. data/lib/solargraph/parser/node_processor/base.rb +34 -4
  87. data/lib/solargraph/parser/node_processor.rb +8 -7
  88. data/lib/solargraph/parser/parser_gem/class_methods.rb +32 -14
  89. data/lib/solargraph/parser/parser_gem/flawed_builder.rb +19 -19
  90. data/lib/solargraph/parser/parser_gem/node_chainer.rb +50 -25
  91. data/lib/solargraph/parser/parser_gem/node_methods.rb +91 -70
  92. data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +4 -4
  93. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +13 -11
  94. data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +9 -0
  95. data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +12 -12
  96. data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +10 -3
  97. data/lib/solargraph/parser/parser_gem/node_processors/defs_node.rb +38 -37
  98. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +36 -6
  99. data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +5 -3
  100. data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +1 -0
  101. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +3 -1
  102. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +3 -3
  103. data/lib/solargraph/parser/parser_gem/node_processors/or_node.rb +22 -0
  104. data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +1 -1
  105. data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +2 -1
  106. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +4 -5
  107. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +124 -113
  108. data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +29 -29
  109. data/lib/solargraph/parser/parser_gem/node_processors/when_node.rb +23 -0
  110. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +6 -2
  111. data/lib/solargraph/parser/parser_gem/node_processors.rb +4 -0
  112. data/lib/solargraph/parser/parser_gem.rb +14 -12
  113. data/lib/solargraph/parser/region.rb +9 -3
  114. data/lib/solargraph/parser/snippet.rb +3 -1
  115. data/lib/solargraph/parser.rb +25 -23
  116. data/lib/solargraph/pin/base.rb +126 -80
  117. data/lib/solargraph/pin/base_variable.rb +273 -24
  118. data/lib/solargraph/pin/block.rb +29 -6
  119. data/lib/solargraph/pin/breakable.rb +7 -1
  120. data/lib/solargraph/pin/callable.rb +65 -21
  121. data/lib/solargraph/pin/closure.rb +7 -10
  122. data/lib/solargraph/pin/common.rb +24 -6
  123. data/lib/solargraph/pin/compound_statement.rb +55 -0
  124. data/lib/solargraph/pin/constant.rb +43 -45
  125. data/lib/solargraph/pin/conversions.rb +10 -4
  126. data/lib/solargraph/pin/delegated_method.rb +19 -8
  127. data/lib/solargraph/pin/documenting.rb +4 -2
  128. data/lib/solargraph/pin/instance_variable.rb +5 -1
  129. data/lib/solargraph/pin/keyword.rb +0 -4
  130. data/lib/solargraph/pin/local_variable.rb +15 -59
  131. data/lib/solargraph/pin/method.rb +153 -104
  132. data/lib/solargraph/pin/method_alias.rb +8 -0
  133. data/lib/solargraph/pin/namespace.rb +19 -12
  134. data/lib/solargraph/pin/parameter.rb +100 -36
  135. data/lib/solargraph/pin/proxy_type.rb +4 -1
  136. data/lib/solargraph/pin/reference/override.rb +1 -1
  137. data/lib/solargraph/pin/reference/superclass.rb +2 -0
  138. data/lib/solargraph/pin/reference.rb +19 -0
  139. data/lib/solargraph/pin/search.rb +3 -2
  140. data/lib/solargraph/pin/signature.rb +15 -12
  141. data/lib/solargraph/pin/symbol.rb +2 -1
  142. data/lib/solargraph/pin/until.rb +2 -4
  143. data/lib/solargraph/pin/while.rb +2 -4
  144. data/lib/solargraph/pin.rb +2 -0
  145. data/lib/solargraph/pin_cache.rb +490 -73
  146. data/lib/solargraph/position.rb +14 -10
  147. data/lib/solargraph/range.rb +16 -15
  148. data/lib/solargraph/rbs_map/conversions.rb +343 -214
  149. data/lib/solargraph/rbs_map/core_fills.rb +91 -84
  150. data/lib/solargraph/rbs_map/core_map.rb +24 -17
  151. data/lib/solargraph/rbs_map/stdlib_map.rb +33 -5
  152. data/lib/solargraph/rbs_map.rb +77 -32
  153. data/lib/solargraph/server_methods.rb +16 -16
  154. data/lib/solargraph/shell.rb +128 -73
  155. data/lib/solargraph/source/chain/array.rb +39 -37
  156. data/lib/solargraph/source/chain/call.rb +96 -56
  157. data/lib/solargraph/source/chain/class_variable.rb +13 -13
  158. data/lib/solargraph/source/chain/constant.rb +5 -1
  159. data/lib/solargraph/source/chain/global_variable.rb +13 -13
  160. data/lib/solargraph/source/chain/hash.rb +8 -5
  161. data/lib/solargraph/source/chain/if.rb +12 -10
  162. data/lib/solargraph/source/chain/instance_variable.rb +24 -1
  163. data/lib/solargraph/source/chain/link.rb +99 -109
  164. data/lib/solargraph/source/chain/literal.rb +9 -6
  165. data/lib/solargraph/source/chain/or.rb +10 -4
  166. data/lib/solargraph/source/chain/q_call.rb +13 -11
  167. data/lib/solargraph/source/chain/variable.rb +15 -13
  168. data/lib/solargraph/source/chain/z_super.rb +28 -30
  169. data/lib/solargraph/source/chain.rb +49 -38
  170. data/lib/solargraph/source/change.rb +12 -5
  171. data/lib/solargraph/source/cursor.rb +23 -17
  172. data/lib/solargraph/source/encoding_fixes.rb +6 -7
  173. data/lib/solargraph/source/source_chainer.rb +56 -32
  174. data/lib/solargraph/source/updater.rb +5 -1
  175. data/lib/solargraph/source.rb +59 -35
  176. data/lib/solargraph/source_map/clip.rb +48 -29
  177. data/lib/solargraph/source_map/data.rb +4 -1
  178. data/lib/solargraph/source_map/mapper.rb +71 -42
  179. data/lib/solargraph/source_map.rb +21 -9
  180. data/lib/solargraph/type_checker/problem.rb +3 -1
  181. data/lib/solargraph/type_checker/rules.rb +81 -8
  182. data/lib/solargraph/type_checker.rb +195 -120
  183. data/lib/solargraph/version.rb +1 -1
  184. data/lib/solargraph/workspace/config.rb +13 -10
  185. data/lib/solargraph/workspace/gemspecs.rb +367 -0
  186. data/lib/solargraph/workspace/require_paths.rb +1 -0
  187. data/lib/solargraph/workspace.rb +149 -30
  188. data/lib/solargraph/yard_map/helpers.rb +8 -3
  189. data/lib/solargraph/yard_map/mapper/to_method.rb +13 -7
  190. data/lib/solargraph/yard_map/mapper/to_namespace.rb +2 -1
  191. data/lib/solargraph/yard_map/mapper.rb +13 -8
  192. data/lib/solargraph/yard_tags.rb +20 -20
  193. data/lib/solargraph/yardoc.rb +33 -23
  194. data/lib/solargraph.rb +29 -8
  195. data/rbs/fills/rubygems/0/dependency.rbs +193 -0
  196. data/rbs/fills/tuple/tuple.rbs +28 -0
  197. data/rbs/shims/ast/0/node.rbs +1 -1
  198. data/rbs/shims/diff-lcs/1.5/diff-lcs.rbs +11 -0
  199. data/solargraph.gemspec +36 -34
  200. metadata +38 -33
  201. data/lib/solargraph/type_checker/checks.rb +0 -124
  202. data/lib/solargraph/type_checker/param_def.rb +0 -37
  203. data/lib/solargraph/yard_map/to_method.rb +0 -89
@@ -1,84 +1,91 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- class RbsMap
5
- # Override pins to fill gaps in RbsMap::CoreMap coverage
6
- #
7
- module CoreFills
8
- Override = Pin::Reference::Override
9
-
10
- KEYWORDS = [
11
- '__ENCODING__', '__LINE__', '__FILE__', 'BEGIN', 'END', 'alias', 'and',
12
- 'begin', 'break', 'case', 'class', 'def', 'defined?', 'do', 'else',
13
- 'elsif', 'end', 'ensure', 'false', 'for', 'if', 'in', 'module', 'next',
14
- 'nil', 'not', 'or', 'redo', 'rescue', 'retry', 'return', 'self', 'super',
15
- 'then', 'true', 'undef', 'unless', 'until', 'when', 'while', 'yield'
16
- ].map { |k| Pin::Keyword.new(k, source: :core_fill) }
17
-
18
- MISSING = [
19
- Solargraph::Pin::Method.new(name: 'class', scope: :instance,
20
- closure: Solargraph::Pin::Namespace.new(name: 'Object', source: :core_fill), comments: '@return [::Class<self>]',
21
- source: :core_fill)
22
- ]
23
-
24
- OVERRIDES = [
25
- Override.from_comment('BasicObject#instance_eval', '@yieldreceiver [self]',
26
- source: :core_fill),
27
- Override.from_comment('BasicObject#instance_exec', '@yieldreceiver [self]',
28
- source: :core_fill),
29
- Override.from_comment('Module#define_method', '@yieldreceiver [::Object<self>]',
30
- source: :core_fill),
31
- Override.from_comment('Module#class_eval', '@yieldreceiver [::Class<self>]',
32
- source: :core_fill),
33
- Override.from_comment('Module#class_exec', '@yieldreceiver [::Class<self>]',
34
- source: :core_fill),
35
- Override.from_comment('Module#module_eval', '@yieldreceiver [::Module<self>]',
36
- source: :core_fill),
37
- Override.from_comment('Module#module_exec', '@yieldreceiver [::Module<self>]',
38
- source: :core_fill),
39
- # RBS does not define Class with a generic, so all calls to
40
- # generic() return an 'untyped'. We can do better:
41
- Override.method_return('Class#allocate', 'self', source: :core_fill),
42
- ]
43
-
44
- # @todo I don't see any direct link in RBS to build this from -
45
- # presumably RBS is using duck typing to match interfaces
46
- # against concrete classes
47
- INCLUDES = [
48
- Solargraph::Pin::Reference::Include.new(name: '_ToAry',
49
- closure: Solargraph::Pin::Namespace.new(name: 'Array', source: :core_fill),
50
- generic_values: ['generic<Elem>'],
51
- source: :core_fill),
52
- Solargraph::Pin::Reference::Include.new(name: '_ToAry',
53
- closure: Solargraph::Pin::Namespace.new(name: 'Set', source: :core_fill),
54
- generic_values: ['generic<Elem>'],
55
- source: :core_fill),
56
- Solargraph::Pin::Reference::Include.new(name: '_Each',
57
- closure: Solargraph::Pin::Namespace.new(name: 'Array', source: :core_fill),
58
- generic_values: ['generic<Elem>'],
59
- source: :core_fill),
60
- Solargraph::Pin::Reference::Include.new(name: '_Each',
61
- closure: Solargraph::Pin::Namespace.new(name: 'Set', source: :core_fill),
62
- generic_values: ['generic<Elem>'],
63
- source: :core_fill),
64
- Solargraph::Pin::Reference::Include.new(name: '_ToS',
65
- closure: Solargraph::Pin::Namespace.new(name: 'Object', source: :core_fill),
66
- source: :core_fill),
67
- Solargraph::Pin::Reference::Include.new(name: '_ToS',
68
- closure: Solargraph::Pin::Namespace.new(name: 'String', source: :core_fill),
69
- source: :core_fill)
70
- ]
71
-
72
- # HACK: Add Errno exception classes
73
- errno = Solargraph::Pin::Namespace.new(name: 'Errno', source: :core_fill)
74
- errnos = []
75
- Errno.constants.each do |const|
76
- errnos.push Solargraph::Pin::Namespace.new(type: :class, name: const.to_s, closure: errno, source: :core_fill)
77
- errnos.push Solargraph::Pin::Reference::Superclass.new(closure: errnos.last, name: 'SystemCallError', source: :core_fill)
78
- end
79
- ERRNOS = errnos
80
-
81
- ALL = KEYWORDS + MISSING + OVERRIDES + ERRNOS + INCLUDES
82
- end
83
- end
84
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ class RbsMap
5
+ # Override pins to fill gaps in RbsMap::CoreMap coverage
6
+ #
7
+ module CoreFills
8
+ Override = Pin::Reference::Override
9
+
10
+ KEYWORDS = [
11
+ '__ENCODING__', '__LINE__', '__FILE__', 'BEGIN', 'END', 'alias', 'and',
12
+ 'begin', 'break', 'case', 'class', 'def', 'defined?', 'do', 'else',
13
+ 'elsif', 'end', 'ensure', 'false', 'for', 'if', 'in', 'module', 'next',
14
+ 'nil', 'not', 'or', 'redo', 'rescue', 'retry', 'return', 'self', 'super',
15
+ 'then', 'true', 'undef', 'unless', 'until', 'when', 'while', 'yield'
16
+ ].map { |k| Pin::Keyword.new(k, source: :core_fill) }
17
+
18
+ MISSING = [
19
+ Solargraph::Pin::Method.new(name: 'class', scope: :instance,
20
+ closure: Solargraph::Pin::Namespace.new(name: 'Object', source: :core_fill), comments: '@return [::Class<self>]',
21
+ source: :core_fill)
22
+ ].freeze
23
+
24
+ OVERRIDES = [
25
+ Override.from_comment('BasicObject#instance_eval', '@yieldreceiver [self]',
26
+ source: :core_fill),
27
+ Override.from_comment('BasicObject#instance_exec', '@yieldreceiver [self]',
28
+ source: :core_fill),
29
+ Override.from_comment('Module#define_method', '@yieldreceiver [::Object<self>]',
30
+ source: :core_fill),
31
+ Override.from_comment('Module#class_eval', '@yieldreceiver [::Class<self>]',
32
+ source: :core_fill),
33
+ Override.from_comment('Module#class_exec', '@yieldreceiver [::Class<self>]',
34
+ source: :core_fill),
35
+ Override.from_comment('Module#module_eval', '@yieldreceiver [::Module<self>]',
36
+ source: :core_fill),
37
+ Override.from_comment('Module#module_exec', '@yieldreceiver [::Module<self>]',
38
+ source: :core_fill),
39
+ # RBS does not define Class with a generic, so all calls to
40
+ # generic() return an 'untyped'. We can do better:
41
+ Override.method_return('Class#allocate', 'self', source: :core_fill)
42
+ ].freeze
43
+
44
+ # @todo I don't see any direct link in RBS to build this from -
45
+ # presumably RBS is using duck typing to match interfaces
46
+ # against concrete classes
47
+ INCLUDES = [
48
+ Solargraph::Pin::Reference::Include.new(name: '_ToAry',
49
+ closure: Solargraph::Pin::Namespace.new(name: 'Array',
50
+ source: :core_fill),
51
+ generic_values: ['generic<Elem>'],
52
+ source: :core_fill),
53
+ Solargraph::Pin::Reference::Include.new(name: '_ToAry',
54
+ closure: Solargraph::Pin::Namespace.new(name: 'Set',
55
+ source: :core_fill),
56
+ generic_values: ['generic<Elem>'],
57
+ source: :core_fill),
58
+ Solargraph::Pin::Reference::Include.new(name: '_Each',
59
+ closure: Solargraph::Pin::Namespace.new(name: 'Array',
60
+ source: :core_fill),
61
+ generic_values: ['generic<Elem>'],
62
+ source: :core_fill),
63
+ Solargraph::Pin::Reference::Include.new(name: '_Each',
64
+ closure: Solargraph::Pin::Namespace.new(name: 'Set',
65
+ source: :core_fill),
66
+ generic_values: ['generic<Elem>'],
67
+ source: :core_fill),
68
+ Solargraph::Pin::Reference::Include.new(name: '_ToS',
69
+ closure: Solargraph::Pin::Namespace.new(name: 'Object',
70
+ source: :core_fill),
71
+ source: :core_fill),
72
+ Solargraph::Pin::Reference::Include.new(name: '_ToS',
73
+ closure: Solargraph::Pin::Namespace.new(name: 'String',
74
+ source: :core_fill),
75
+ source: :core_fill)
76
+ ].freeze
77
+
78
+ # HACK: Add Errno exception classes
79
+ errno = Solargraph::Pin::Namespace.new(name: 'Errno', source: :core_fill)
80
+ errnos = []
81
+ Errno.constants.each do |const|
82
+ errnos.push Solargraph::Pin::Namespace.new(type: :class, name: const.to_s, closure: errno, source: :core_fill)
83
+ errnos.push Solargraph::Pin::Reference::Superclass.new(closure: errnos.last, name: 'SystemCallError',
84
+ source: :core_fill)
85
+ end
86
+ ERRNOS = errnos
87
+
88
+ ALL = KEYWORDS + MISSING + OVERRIDES + ERRNOS + INCLUDES
89
+ end
90
+ end
91
+ end
@@ -15,31 +15,38 @@ module Solargraph
15
15
 
16
16
  def initialize; end
17
17
 
18
+ # @param out [IO, nil] output stream for logging
18
19
  # @return [Enumerable<Pin::Base>]
19
- def pins
20
+ def pins out: $stderr
20
21
  return @pins if @pins
22
+ @pins = cache_core(out: out)
23
+ end
21
24
 
22
- @pins = []
25
+ # @param out [StringIO, IO, nil] output stream for logging
26
+ # @return [Array<Pin::Base>]
27
+ def cache_core out: $stderr
28
+ new_pins = []
23
29
  cache = PinCache.deserialize_core
24
- if cache
25
- @pins.replace cache
26
- else
27
- @pins.concat conversions.pins
30
+ return cache if cache
31
+ new_pins.concat conversions.pins
32
+
33
+ # Avoid RBS::DuplicatedDeclarationError by loading in a different EnvironmentLoader
34
+ fill_loader = RBS::EnvironmentLoader.new(core_root: nil, repository: RBS::Repository.new(no_stdlib: false))
35
+ fill_loader.add(path: Pathname(FILLS_DIRECTORY))
36
+ out&.puts 'Caching RBS pins for Ruby core'
37
+ fill_conversions = Conversions.new(loader: fill_loader)
38
+ new_pins.concat fill_conversions.pins
28
39
 
29
- # Avoid RBS::DuplicatedDeclarationError by loading in a different EnvironmentLoader
30
- fill_loader = RBS::EnvironmentLoader.new(core_root: nil, repository: RBS::Repository.new(no_stdlib: false))
31
- fill_loader.add(path: Pathname(FILLS_DIRECTORY))
32
- fill_conversions = Conversions.new(loader: fill_loader)
33
- @pins.concat fill_conversions.pins
40
+ # add some overrides
41
+ new_pins.concat RbsMap::CoreFills::ALL
34
42
 
35
- @pins.concat RbsMap::CoreFills::ALL
43
+ # process overrides, then remove any which couldn't be resolved
44
+ processed = ApiMap::Store.new(new_pins).pins.reject { |p| p.is_a?(Solargraph::Pin::Reference::Override) }
45
+ new_pins.replace processed
36
46
 
37
- processed = ApiMap::Store.new(pins).pins.reject { |p| p.is_a?(Solargraph::Pin::Reference::Override) }
38
- @pins.replace processed
47
+ PinCache.serialize_core new_pins
39
48
 
40
- PinCache.serialize_core @pins
41
- end
42
- @pins
49
+ new_pins
43
50
  end
44
51
 
45
52
  private
@@ -12,19 +12,22 @@ module Solargraph
12
12
  # @type [Hash{String => RbsMap}]
13
13
  @stdlib_maps_hash = {}
14
14
 
15
+ # @param rebuild [Boolean] build pins regardless of whether we
16
+ # have cached them already
15
17
  # @param library [String]
16
- def initialize library
18
+ # @param out [StringIO, IO, nil] where to log messages
19
+ def initialize library, rebuild: false, out: $stderr
17
20
  cached_pins = PinCache.deserialize_stdlib_require library
18
- if cached_pins
21
+ if cached_pins && !rebuild
19
22
  @pins = cached_pins
20
23
  @resolved = true
21
24
  @loaded = true
22
25
  logger.debug { "Deserialized #{cached_pins.length} cached pins for stdlib require #{library.inspect}" }
23
- else
24
- super
26
+ elsif self.class.source.has? library, nil
27
+ super(library, out: out)
25
28
  unless resolved?
26
29
  @pins = []
27
- logger.info { "Could not resolve #{library.inspect}" }
30
+ logger.debug { "StdlibMap could not resolve #{library.inspect}" }
28
31
  return
29
32
  end
30
33
  generated_pins = pins
@@ -33,6 +36,31 @@ module Solargraph
33
36
  end
34
37
  end
35
38
 
39
+ # @return [RBS::Collection::Sources::Stdlib]
40
+ def self.source
41
+ @source ||= RBS::Collection::Sources::Stdlib.instance
42
+ end
43
+
44
+ # @param name [String]
45
+ # @param version [String, nil]
46
+ # @return [Array<Hash{String => String}>, nil]
47
+ def self.stdlib_dependencies name, version = nil
48
+ if source.has?(name, version)
49
+ # @sg-ignore we are relying on undocumented behavior where
50
+ # passing version=nil gives the latest version it has
51
+ source.dependencies_of(name, version)
52
+ else
53
+ []
54
+ end
55
+ end
56
+
57
+ def resolve_dependencies?
58
+ # there are 'virtual' dependencies for stdlib gems in RBS that
59
+ # aren't represented in the actual gemspecs that we'd
60
+ # otherwise use
61
+ true
62
+ end
63
+
36
64
  # @param library [String]
37
65
  # @return [StdlibMap]
38
66
  def self.load library
@@ -16,17 +16,14 @@ module Solargraph
16
16
  # @type [Hash{String => RbsMap}]
17
17
  @@rbs_maps_hash = {}
18
18
 
19
- attr_reader :library
20
-
21
- attr_reader :rbs_collection_paths
22
-
23
- attr_reader :rbs_collection_config_path
19
+ attr_reader :library, :rbs_collection_paths, :rbs_collection_config_path
24
20
 
25
21
  # @param library [String]
26
22
  # @param version [String, nil]
27
23
  # @param rbs_collection_config_path [String, Pathname, nil]
28
24
  # @param rbs_collection_paths [Array<Pathname, String>]
29
- def initialize library, version = nil, rbs_collection_config_path: nil, rbs_collection_paths: []
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
30
27
  if rbs_collection_config_path.nil? && !rbs_collection_paths.empty?
31
28
  raise 'Please provide rbs_collection_config_path if you provide rbs_collection_paths'
32
29
  end
@@ -37,6 +34,28 @@ module Solargraph
37
34
  add_library loader, library, version
38
35
  end
39
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
+
40
59
  # @return [RBS::EnvironmentLoader]
41
60
  def loader
42
61
  @loader ||= RBS::EnvironmentLoader.new(core_root: nil, repository: repository)
@@ -47,10 +66,15 @@ module Solargraph
47
66
  # updated upstream for the same library and version. May change
48
67
  # if the config for where information comes form changes.
49
68
  def cache_key
50
- @hextdigest ||= begin
69
+ return CACHE_KEY_UNRESOLVED unless resolved?
70
+
71
+ @cache_key ||= begin
51
72
  # @type [String, nil]
52
73
  data = nil
74
+ # @type gem_config [nil, Hash{String => Hash{String => String}}]
75
+ gem_config = nil
53
76
  if rbs_collection_config_path
77
+ # @sg-ignore flow sensitive typing needs to handle attrs
54
78
  lockfile_path = RBS::Collection::Config.to_lockfile_path(Pathname.new(rbs_collection_config_path))
55
79
  if lockfile_path.exist?
56
80
  collection_config = RBS::Collection::Config.from_path lockfile_path
@@ -58,16 +82,22 @@ module Solargraph
58
82
  data = gem_config&.to_s
59
83
  end
60
84
  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'
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
66
97
  else
67
- 'unresolved'
98
+ # @sg-ignore Need to add nil check here
99
+ Digest::SHA1.hexdigest(data)
68
100
  end
69
- else
70
- Digest::SHA1.hexdigest(data)
71
101
  end
72
102
  end
73
103
  end
@@ -77,6 +107,10 @@ module Solargraph
77
107
  # @param rbs_collection_config_path [String, Pathname, nil]
78
108
  # @return [RbsMap]
79
109
  def self.from_gemspec gemspec, rbs_collection_path, rbs_collection_config_path
110
+ # prefers stdlib RBS if available
111
+ rbs_map = RbsMap::StdlibMap.new(gemspec.name)
112
+ return rbs_map if rbs_map.resolved?
113
+
80
114
  rbs_map = RbsMap.new(gemspec.name, gemspec.version,
81
115
  rbs_collection_paths: [rbs_collection_path].compact,
82
116
  rbs_collection_config_path: rbs_collection_config_path)
@@ -88,18 +122,26 @@ module Solargraph
88
122
  rbs_collection_config_path: rbs_collection_config_path)
89
123
  end
90
124
 
125
+ # @param out [IO, nil] where to log messages
91
126
  # @return [Array<Pin::Base>]
92
- def pins
93
- @pins ||= resolved? ? conversions.pins : []
127
+ def pins out: $stderr
128
+ @pins ||= if resolved?
129
+ conversions.pins
130
+ else
131
+ []
132
+ end
94
133
  end
95
134
 
96
135
  # @generic T
97
136
  # @param path [String]
98
137
  # @param klass [Class<generic<T>>]
138
+ #
139
+ # @sg-ignore Need to be able to resolve generics based on a
140
+ # Class<generic<T>> param
99
141
  # @return [generic<T>, nil]
100
142
  def path_pin path, klass = Pin::Base
101
143
  pin = pins.find { |p| p.path == path }
102
- pin if pin&.is_a?(klass)
144
+ pin if pin.is_a?(klass)
103
145
  end
104
146
 
105
147
  # @param path [String]
@@ -130,29 +172,32 @@ module Solargraph
130
172
 
131
173
  private
132
174
 
133
- # @return [RBS::EnvironmentLoader]
134
- def loader
135
- @loader ||= RBS::EnvironmentLoader.new(core_root: nil, repository: repository)
136
- end
137
-
138
175
  # @return [Conversions]
139
176
  def conversions
140
177
  @conversions ||= Conversions.new(loader: loader)
141
178
  end
142
179
 
180
+ def resolve_dependencies?
181
+ # we need to resolve dependencies via gemfile.lock manually for
182
+ # YARD regardless, so use same mechanism here so we don't
183
+ # duplicate work generating pins from dependencies
184
+ false
185
+ end
186
+
143
187
  # @param loader [RBS::EnvironmentLoader]
144
188
  # @param library [String]
145
- # @param version [String, nil]
189
+ # @param version [String, nil] the version of the library to load, or nil for any
190
+ # @param out [StringIO, IO, nil] where to log messages
146
191
  # @return [Boolean] true if adding the library succeeded
147
- def add_library loader, library, version
192
+ def add_library loader, library, version, out: $stderr
148
193
  @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
194
+ loader.add library: library, version: version, resolve_dependencies: resolve_dependencies?
195
+ logger.debug { "#{short_name} successfully loaded library #{library}:#{version}" }
196
+ true
197
+ else
198
+ logger.info { "#{short_name} did not find data for library #{library}:#{version}" }
199
+ false
200
+ end
156
201
  end
157
202
 
158
203
  # @return [String]
@@ -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