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.
- checksums.yaml +4 -4
- data/.envrc +3 -0
- data/.github/workflows/linting.yml +4 -5
- data/.github/workflows/plugins.yml +41 -34
- data/.github/workflows/rspec.yml +44 -23
- data/.github/workflows/typecheck.yml +2 -2
- data/.rubocop.yml +32 -5
- data/.rubocop_todo.yml +50 -966
- data/Gemfile +3 -1
- data/README.md +3 -3
- data/Rakefile +26 -23
- data/bin/solargraph +2 -1
- data/lib/solargraph/api_map/cache.rb +3 -3
- data/lib/solargraph/api_map/constants.rb +13 -3
- data/lib/solargraph/api_map/index.rb +23 -18
- data/lib/solargraph/api_map/source_to_yard.rb +22 -9
- data/lib/solargraph/api_map/store.rb +33 -28
- data/lib/solargraph/api_map.rb +150 -82
- data/lib/solargraph/bench.rb +44 -45
- data/lib/solargraph/complex_type/conformance.rb +176 -0
- data/lib/solargraph/complex_type/type_methods.rb +28 -17
- data/lib/solargraph/complex_type/unique_type.rb +218 -57
- data/lib/solargraph/complex_type.rb +170 -57
- data/lib/solargraph/convention/data_definition/data_assignment_node.rb +61 -61
- data/lib/solargraph/convention/data_definition/data_definition_node.rb +7 -5
- data/lib/solargraph/convention/data_definition.rb +5 -2
- data/lib/solargraph/convention/gemfile.rb +15 -15
- data/lib/solargraph/convention/gemspec.rb +23 -23
- data/lib/solargraph/convention/rakefile.rb +17 -17
- data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +2 -1
- data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +4 -3
- data/lib/solargraph/convention/struct_definition.rb +8 -4
- data/lib/solargraph/convention.rb +78 -78
- data/lib/solargraph/converters/dd.rb +19 -17
- data/lib/solargraph/converters/dl.rb +17 -15
- data/lib/solargraph/converters/dt.rb +17 -15
- data/lib/solargraph/converters/misc.rb +3 -1
- data/lib/solargraph/diagnostics/require_not_found.rb +1 -0
- data/lib/solargraph/diagnostics/rubocop.rb +11 -10
- data/lib/solargraph/diagnostics/rubocop_helpers.rb +5 -3
- data/lib/solargraph/diagnostics/type_check.rb +11 -10
- data/lib/solargraph/diagnostics/update_errors.rb +37 -41
- data/lib/solargraph/doc_map.rb +133 -373
- data/lib/solargraph/equality.rb +4 -4
- data/lib/solargraph/gem_pins.rb +21 -20
- data/lib/solargraph/language_server/error_codes.rb +20 -20
- data/lib/solargraph/language_server/host/diagnoser.rb +1 -1
- data/lib/solargraph/language_server/host/dispatch.rb +3 -3
- data/lib/solargraph/language_server/host/message_worker.rb +4 -3
- data/lib/solargraph/language_server/host/sources.rb +2 -1
- data/lib/solargraph/language_server/host.rb +30 -22
- data/lib/solargraph/language_server/message/base.rb +97 -97
- data/lib/solargraph/language_server/message/client/register_capability.rb +13 -15
- data/lib/solargraph/language_server/message/completion_item/resolve.rb +58 -60
- data/lib/solargraph/language_server/message/extended/check_gem_version.rb +12 -18
- data/lib/solargraph/language_server/message/extended/document.rb +1 -0
- data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -32
- data/lib/solargraph/language_server/message/extended/download_core.rb +20 -19
- data/lib/solargraph/language_server/message/extended/search.rb +20 -20
- data/lib/solargraph/language_server/message/initialize.rb +197 -191
- data/lib/solargraph/language_server/message/text_document/completion.rb +10 -8
- data/lib/solargraph/language_server/message/text_document/definition.rb +41 -32
- data/lib/solargraph/language_server/message/text_document/document_highlight.rb +23 -16
- data/lib/solargraph/language_server/message/text_document/document_symbol.rb +29 -19
- data/lib/solargraph/language_server/message/text_document/formatting.rb +8 -6
- data/lib/solargraph/language_server/message/text_document/hover.rb +5 -5
- data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +18 -11
- data/lib/solargraph/language_server/message/text_document/references.rb +23 -16
- data/lib/solargraph/language_server/message/text_document/rename.rb +26 -19
- data/lib/solargraph/language_server/message/text_document/signature_help.rb +3 -2
- data/lib/solargraph/language_server/message/text_document/type_definition.rb +25 -17
- data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +41 -35
- data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +48 -40
- data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +32 -26
- data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +27 -17
- data/lib/solargraph/language_server/message.rb +94 -94
- data/lib/solargraph/language_server/request.rb +29 -27
- data/lib/solargraph/language_server/transport/data_reader.rb +72 -74
- data/lib/solargraph/language_server/uri_helpers.rb +49 -49
- data/lib/solargraph/library.rb +85 -44
- data/lib/solargraph/location.rb +17 -14
- data/lib/solargraph/logging.rb +24 -4
- data/lib/solargraph/page.rb +92 -92
- data/lib/solargraph/parser/comment_ripper.rb +19 -4
- data/lib/solargraph/parser/flow_sensitive_typing.rb +326 -108
- data/lib/solargraph/parser/node_processor/base.rb +34 -4
- data/lib/solargraph/parser/node_processor.rb +8 -7
- data/lib/solargraph/parser/parser_gem/class_methods.rb +32 -14
- data/lib/solargraph/parser/parser_gem/flawed_builder.rb +19 -19
- data/lib/solargraph/parser/parser_gem/node_chainer.rb +50 -25
- data/lib/solargraph/parser/parser_gem/node_methods.rb +91 -70
- data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +4 -4
- data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +13 -11
- data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +9 -0
- data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +12 -12
- data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +10 -3
- data/lib/solargraph/parser/parser_gem/node_processors/defs_node.rb +38 -37
- data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +36 -6
- data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +5 -3
- data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +1 -0
- data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +3 -1
- data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +3 -3
- data/lib/solargraph/parser/parser_gem/node_processors/or_node.rb +22 -0
- data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +1 -1
- data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +2 -1
- data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +4 -5
- data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +124 -113
- data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +29 -29
- data/lib/solargraph/parser/parser_gem/node_processors/when_node.rb +23 -0
- data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +6 -2
- data/lib/solargraph/parser/parser_gem/node_processors.rb +4 -0
- data/lib/solargraph/parser/parser_gem.rb +14 -12
- data/lib/solargraph/parser/region.rb +9 -3
- data/lib/solargraph/parser/snippet.rb +3 -1
- data/lib/solargraph/parser.rb +25 -23
- data/lib/solargraph/pin/base.rb +126 -80
- data/lib/solargraph/pin/base_variable.rb +273 -24
- data/lib/solargraph/pin/block.rb +29 -6
- data/lib/solargraph/pin/breakable.rb +7 -1
- data/lib/solargraph/pin/callable.rb +65 -21
- data/lib/solargraph/pin/closure.rb +7 -10
- data/lib/solargraph/pin/common.rb +24 -6
- data/lib/solargraph/pin/compound_statement.rb +55 -0
- data/lib/solargraph/pin/constant.rb +43 -45
- data/lib/solargraph/pin/conversions.rb +10 -4
- data/lib/solargraph/pin/delegated_method.rb +19 -8
- data/lib/solargraph/pin/documenting.rb +4 -2
- data/lib/solargraph/pin/instance_variable.rb +5 -1
- data/lib/solargraph/pin/keyword.rb +0 -4
- data/lib/solargraph/pin/local_variable.rb +15 -59
- data/lib/solargraph/pin/method.rb +153 -104
- data/lib/solargraph/pin/method_alias.rb +8 -0
- data/lib/solargraph/pin/namespace.rb +19 -12
- data/lib/solargraph/pin/parameter.rb +100 -36
- data/lib/solargraph/pin/proxy_type.rb +4 -1
- data/lib/solargraph/pin/reference/override.rb +1 -1
- data/lib/solargraph/pin/reference/superclass.rb +2 -0
- data/lib/solargraph/pin/reference.rb +19 -0
- data/lib/solargraph/pin/search.rb +3 -2
- data/lib/solargraph/pin/signature.rb +15 -12
- data/lib/solargraph/pin/symbol.rb +2 -1
- data/lib/solargraph/pin/until.rb +2 -4
- data/lib/solargraph/pin/while.rb +2 -4
- data/lib/solargraph/pin.rb +2 -0
- data/lib/solargraph/pin_cache.rb +490 -73
- data/lib/solargraph/position.rb +14 -10
- data/lib/solargraph/range.rb +16 -15
- data/lib/solargraph/rbs_map/conversions.rb +343 -214
- data/lib/solargraph/rbs_map/core_fills.rb +91 -84
- data/lib/solargraph/rbs_map/core_map.rb +24 -17
- data/lib/solargraph/rbs_map/stdlib_map.rb +33 -5
- data/lib/solargraph/rbs_map.rb +77 -32
- data/lib/solargraph/server_methods.rb +16 -16
- data/lib/solargraph/shell.rb +128 -73
- data/lib/solargraph/source/chain/array.rb +39 -37
- data/lib/solargraph/source/chain/call.rb +96 -56
- data/lib/solargraph/source/chain/class_variable.rb +13 -13
- data/lib/solargraph/source/chain/constant.rb +5 -1
- data/lib/solargraph/source/chain/global_variable.rb +13 -13
- data/lib/solargraph/source/chain/hash.rb +8 -5
- data/lib/solargraph/source/chain/if.rb +12 -10
- data/lib/solargraph/source/chain/instance_variable.rb +24 -1
- data/lib/solargraph/source/chain/link.rb +99 -109
- data/lib/solargraph/source/chain/literal.rb +9 -6
- data/lib/solargraph/source/chain/or.rb +10 -4
- data/lib/solargraph/source/chain/q_call.rb +13 -11
- data/lib/solargraph/source/chain/variable.rb +15 -13
- data/lib/solargraph/source/chain/z_super.rb +28 -30
- data/lib/solargraph/source/chain.rb +49 -38
- data/lib/solargraph/source/change.rb +12 -5
- data/lib/solargraph/source/cursor.rb +23 -17
- data/lib/solargraph/source/encoding_fixes.rb +6 -7
- data/lib/solargraph/source/source_chainer.rb +56 -32
- data/lib/solargraph/source/updater.rb +5 -1
- data/lib/solargraph/source.rb +59 -35
- data/lib/solargraph/source_map/clip.rb +48 -29
- data/lib/solargraph/source_map/data.rb +4 -1
- data/lib/solargraph/source_map/mapper.rb +71 -42
- data/lib/solargraph/source_map.rb +21 -9
- data/lib/solargraph/type_checker/problem.rb +3 -1
- data/lib/solargraph/type_checker/rules.rb +81 -8
- data/lib/solargraph/type_checker.rb +195 -120
- data/lib/solargraph/version.rb +1 -1
- data/lib/solargraph/workspace/config.rb +13 -10
- data/lib/solargraph/workspace/gemspecs.rb +367 -0
- data/lib/solargraph/workspace/require_paths.rb +1 -0
- data/lib/solargraph/workspace.rb +149 -30
- data/lib/solargraph/yard_map/helpers.rb +8 -3
- data/lib/solargraph/yard_map/mapper/to_method.rb +13 -7
- data/lib/solargraph/yard_map/mapper/to_namespace.rb +2 -1
- data/lib/solargraph/yard_map/mapper.rb +13 -8
- data/lib/solargraph/yard_tags.rb +20 -20
- data/lib/solargraph/yardoc.rb +33 -23
- data/lib/solargraph.rb +29 -8
- data/rbs/fills/rubygems/0/dependency.rbs +193 -0
- data/rbs/fills/tuple/tuple.rbs +28 -0
- data/rbs/shims/ast/0/node.rbs +1 -1
- data/rbs/shims/diff-lcs/1.5/diff-lcs.rbs +11 -0
- data/solargraph.gemspec +36 -34
- metadata +38 -33
- data/lib/solargraph/type_checker/checks.rb +0 -124
- data/lib/solargraph/type_checker/param_def.rb +0 -37
- 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',
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
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
|
-
|
|
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
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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
|
-
|
|
30
|
-
|
|
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
|
-
|
|
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
|
-
|
|
38
|
-
@pins.replace processed
|
|
47
|
+
PinCache.serialize_core new_pins
|
|
39
48
|
|
|
40
|
-
|
|
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
|
-
|
|
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
|
-
|
|
24
|
-
super
|
|
26
|
+
elsif self.class.source.has? library, nil
|
|
27
|
+
super(library, out: out)
|
|
25
28
|
unless resolved?
|
|
26
29
|
@pins = []
|
|
27
|
-
logger.
|
|
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
|
data/lib/solargraph/rbs_map.rb
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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
|
-
|
|
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?
|
|
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
|
|
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
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
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(
|
|
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
|