solargraph 0.59.0.dev.1 → 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/.github/workflows/plugins.yml +4 -1
- data/.github/workflows/rspec.yml +3 -14
- data/.gitignore +1 -0
- data/.rubocop.yml +32 -5
- data/.rubocop_todo.yml +37 -931
- data/CHANGELOG.md +7 -1
- data/Gemfile +3 -1
- data/Rakefile +25 -23
- data/bin/solargraph +2 -1
- data/lib/solargraph/api_map/index.rb +5 -11
- data/lib/solargraph/api_map/source_to_yard.rb +9 -8
- data/lib/solargraph/api_map/store.rb +22 -20
- data/lib/solargraph/api_map.rb +50 -37
- data/lib/solargraph/bench.rb +44 -45
- data/lib/solargraph/complex_type/type_methods.rb +12 -15
- data/lib/solargraph/complex_type/unique_type.rb +54 -43
- data/lib/solargraph/complex_type.rb +69 -61
- data/lib/solargraph/convention/data_definition/data_assignment_node.rb +61 -61
- data/lib/solargraph/convention/data_definition/data_definition_node.rb +4 -4
- data/lib/solargraph/convention/data_definition.rb +1 -1
- 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 +1 -1
- data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +3 -3
- data/lib/solargraph/convention/struct_definition.rb +3 -3
- 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/rubocop.rb +10 -10
- data/lib/solargraph/diagnostics/rubocop_helpers.rb +3 -3
- data/lib/solargraph/diagnostics/type_check.rb +10 -10
- data/lib/solargraph/diagnostics/update_errors.rb +37 -41
- data/lib/solargraph/doc_map.rb +9 -10
- data/lib/solargraph/equality.rb +3 -3
- data/lib/solargraph/gem_pins.rb +7 -5
- data/lib/solargraph/language_server/error_codes.rb +20 -20
- data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
- data/lib/solargraph/language_server/host/dispatch.rb +2 -3
- data/lib/solargraph/language_server/host/message_worker.rb +2 -2
- data/lib/solargraph/language_server/host/sources.rb +1 -1
- data/lib/solargraph/language_server/host.rb +24 -21
- 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 +10 -11
- 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 +8 -8
- data/lib/solargraph/language_server/message/text_document/definition.rb +41 -34
- 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 -21
- data/lib/solargraph/language_server/message/text_document/formatting.rb +6 -6
- data/lib/solargraph/language_server/message/text_document/hover.rb +3 -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 +2 -2
- data/lib/solargraph/language_server/message/text_document/type_definition.rb +25 -19
- 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 -19
- 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 +28 -33
- data/lib/solargraph/location.rb +10 -12
- data/lib/solargraph/logging.rb +4 -4
- data/lib/solargraph/page.rb +92 -92
- data/lib/solargraph/parser/comment_ripper.rb +12 -4
- data/lib/solargraph/parser/flow_sensitive_typing.rb +32 -42
- data/lib/solargraph/parser/node_processor/base.rb +4 -4
- data/lib/solargraph/parser/node_processor.rb +1 -1
- data/lib/solargraph/parser/parser_gem/class_methods.rb +4 -4
- data/lib/solargraph/parser/parser_gem/flawed_builder.rb +19 -19
- data/lib/solargraph/parser/parser_gem/node_chainer.rb +20 -20
- data/lib/solargraph/parser/parser_gem/node_methods.rb +66 -65
- data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +12 -12
- data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +1 -1
- data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +3 -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 +3 -3
- data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +2 -1
- data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +1 -1
- data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +3 -5
- data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +118 -112
- data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +29 -29
- data/lib/solargraph/parser/parser_gem/node_processors/when_node.rb +1 -1
- data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +1 -1
- data/lib/solargraph/parser/parser_gem.rb +14 -12
- data/lib/solargraph/parser/snippet.rb +2 -0
- data/lib/solargraph/parser.rb +25 -23
- data/lib/solargraph/pin/base.rb +78 -64
- data/lib/solargraph/pin/base_variable.rb +28 -71
- data/lib/solargraph/pin/block.rb +3 -2
- data/lib/solargraph/pin/breakable.rb +2 -0
- data/lib/solargraph/pin/callable.rb +23 -26
- data/lib/solargraph/pin/closure.rb +5 -4
- data/lib/solargraph/pin/common.rb +5 -2
- data/lib/solargraph/pin/compound_statement.rb +3 -3
- data/lib/solargraph/pin/constant.rb +43 -45
- data/lib/solargraph/pin/conversions.rb +9 -4
- data/lib/solargraph/pin/delegated_method.rb +4 -4
- data/lib/solargraph/pin/documenting.rb +3 -2
- data/lib/solargraph/pin/local_variable.rb +4 -4
- data/lib/solargraph/pin/method.rb +71 -70
- data/lib/solargraph/pin/namespace.rb +13 -12
- data/lib/solargraph/pin/parameter.rb +28 -27
- data/lib/solargraph/pin/proxy_type.rb +2 -0
- data/lib/solargraph/pin/reference.rb +17 -0
- data/lib/solargraph/pin/search.rb +2 -2
- data/lib/solargraph/pin/signature.rb +9 -14
- data/lib/solargraph/pin/symbol.rb +1 -0
- data/lib/solargraph/pin/until.rb +1 -3
- data/lib/solargraph/pin/while.rb +1 -3
- data/lib/solargraph/pin_cache.rb +16 -19
- data/lib/solargraph/position.rb +35 -17
- data/lib/solargraph/range.rb +10 -9
- data/lib/solargraph/rbs_map/conversions.rb +312 -206
- data/lib/solargraph/rbs_map/core_fills.rb +91 -84
- data/lib/solargraph/rbs_map/stdlib_map.rb +0 -1
- data/lib/solargraph/rbs_map.rb +3 -12
- data/lib/solargraph/server_methods.rb +16 -16
- data/lib/solargraph/shell.rb +63 -53
- data/lib/solargraph/source/chain/array.rb +39 -37
- data/lib/solargraph/source/chain/call.rb +49 -44
- data/lib/solargraph/source/chain/class_variable.rb +13 -13
- data/lib/solargraph/source/chain/constant.rb +3 -1
- data/lib/solargraph/source/chain/global_variable.rb +13 -13
- data/lib/solargraph/source/chain/hash.rb +8 -6
- data/lib/solargraph/source/chain/if.rb +11 -10
- data/lib/solargraph/source/chain/instance_variable.rb +3 -1
- data/lib/solargraph/source/chain/link.rb +99 -109
- data/lib/solargraph/source/chain/literal.rb +4 -6
- data/lib/solargraph/source/chain/or.rb +2 -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 +24 -16
- data/lib/solargraph/source/change.rb +3 -3
- data/lib/solargraph/source/cursor.rb +18 -18
- data/lib/solargraph/source/encoding_fixes.rb +6 -7
- data/lib/solargraph/source/source_chainer.rb +46 -32
- data/lib/solargraph/source/updater.rb +1 -1
- data/lib/solargraph/source.rb +27 -29
- data/lib/solargraph/source_map/clip.rb +38 -30
- data/lib/solargraph/source_map/mapper.rb +52 -46
- data/lib/solargraph/source_map.rb +8 -4
- data/lib/solargraph/type_checker/rules.rb +8 -8
- data/lib/solargraph/type_checker.rb +95 -101
- data/lib/solargraph/version.rb +1 -1
- data/lib/solargraph/workspace/config.rb +10 -9
- data/lib/solargraph/workspace/gemspecs.rb +1 -1
- data/lib/solargraph/workspace.rb +21 -44
- data/lib/solargraph/yard_map/helpers.rb +6 -2
- data/lib/solargraph/yard_map/mapper/to_method.rb +8 -6
- data/lib/solargraph/yard_map/mapper/to_namespace.rb +1 -1
- data/lib/solargraph/yard_map/mapper.rb +12 -12
- data/lib/solargraph/yard_tags.rb +20 -20
- data/lib/solargraph.rb +5 -5
- data/solargraph.gemspec +35 -34
- metadata +28 -28
data/lib/solargraph/bench.rb
CHANGED
|
@@ -1,45 +1,44 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
#
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
# @param
|
|
21
|
-
# @param
|
|
22
|
-
# @param
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
@
|
|
26
|
-
@
|
|
27
|
-
@
|
|
28
|
-
|
|
29
|
-
.
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
# @return [Hash{String => SourceMap}]
|
|
34
|
-
def source_map_hash
|
|
35
|
-
# @todo Work around #to_h bug in current Ruby head (3.5) with #map#to_h
|
|
36
|
-
@source_map_hash ||= source_maps.
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
# A container of source maps and workspace data to be cataloged in an ApiMap.
|
|
5
|
+
#
|
|
6
|
+
class Bench
|
|
7
|
+
# @return [Set<SourceMap>]
|
|
8
|
+
attr_reader :source_maps
|
|
9
|
+
|
|
10
|
+
# @return [Workspace]
|
|
11
|
+
attr_reader :workspace
|
|
12
|
+
|
|
13
|
+
# @return [SourceMap]
|
|
14
|
+
attr_reader :live_map
|
|
15
|
+
|
|
16
|
+
# @return [Set<String>]
|
|
17
|
+
attr_reader :external_requires
|
|
18
|
+
|
|
19
|
+
# @param source_maps [Array<SourceMap>, Set<SourceMap>]
|
|
20
|
+
# @param workspace [Workspace]
|
|
21
|
+
# @param live_map [SourceMap, nil]
|
|
22
|
+
# @param external_requires [Array<String>, Set<String>]
|
|
23
|
+
def initialize source_maps: [], workspace: Workspace.new, live_map: nil, external_requires: []
|
|
24
|
+
@source_maps = source_maps.to_set
|
|
25
|
+
@workspace = workspace
|
|
26
|
+
@live_map = live_map
|
|
27
|
+
@external_requires = external_requires.reject { |path| workspace.would_require?(path) }
|
|
28
|
+
.compact
|
|
29
|
+
.to_set
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# @sg-ignore flow sensitive typing needs better handling of ||= on lvars
|
|
33
|
+
# @return [Hash{String => SourceMap}]
|
|
34
|
+
def source_map_hash
|
|
35
|
+
# @todo Work around #to_h bug in current Ruby head (3.5) with #map#to_h
|
|
36
|
+
@source_map_hash ||= source_maps.to_h { |s| [s.filename, s] }
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# @return [Set<SourceMap>]
|
|
40
|
+
def icebox
|
|
41
|
+
@icebox ||= (source_maps - [live_map])
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -54,11 +54,11 @@ module Solargraph
|
|
|
54
54
|
|
|
55
55
|
# @return [Boolean]
|
|
56
56
|
def nil_type?
|
|
57
|
-
@nil_type ||=
|
|
57
|
+
@nil_type ||= name.casecmp('nil').zero?
|
|
58
58
|
end
|
|
59
59
|
|
|
60
60
|
def tuple?
|
|
61
|
-
@
|
|
61
|
+
@tuple ||= (name == 'Tuple') || (name == 'Array' && subtypes.length >= 1 && fixed_parameters?)
|
|
62
62
|
end
|
|
63
63
|
|
|
64
64
|
def void?
|
|
@@ -87,7 +87,7 @@ module Solargraph
|
|
|
87
87
|
|
|
88
88
|
# @param generics_to_erase [Enumerable<String>]
|
|
89
89
|
# @return [self]
|
|
90
|
-
def erase_generics
|
|
90
|
+
def erase_generics generics_to_erase
|
|
91
91
|
transform do |type|
|
|
92
92
|
if type.name == ComplexType::GENERIC_TAG_NAME
|
|
93
93
|
if type.all_params.length == 1 && generics_to_erase.include?(type.all_params.first.to_s)
|
|
@@ -142,7 +142,7 @@ module Solargraph
|
|
|
142
142
|
@namespace ||= lambda do
|
|
143
143
|
return 'Object' if duck_type?
|
|
144
144
|
return 'NilClass' if nil_type?
|
|
145
|
-
|
|
145
|
+
%w[Class Module].include?(name) && !subtypes.empty? ? subtypes.first.name : name
|
|
146
146
|
end.call
|
|
147
147
|
end
|
|
148
148
|
|
|
@@ -150,7 +150,7 @@ module Solargraph
|
|
|
150
150
|
def namespace_type
|
|
151
151
|
return ComplexType.parse('::Object') if duck_type?
|
|
152
152
|
return ComplexType.parse('::NilClass') if nil_type?
|
|
153
|
-
return subtypes.first if
|
|
153
|
+
return subtypes.first if %w[Class Module].include?(name) && !subtypes.empty?
|
|
154
154
|
self
|
|
155
155
|
end
|
|
156
156
|
|
|
@@ -177,30 +177,27 @@ module Solargraph
|
|
|
177
177
|
end
|
|
178
178
|
|
|
179
179
|
# @return [String]
|
|
180
|
-
def generate_substring_from
|
|
180
|
+
def generate_substring_from &to_str
|
|
181
181
|
key_types_str = key_types.map(&to_str).join(', ')
|
|
182
182
|
subtypes_str = subtypes.map(&to_str).join(', ')
|
|
183
|
-
if key_types.none?(&:defined?) && subtypes.none?(&:defined?)
|
|
184
|
-
|
|
185
|
-
elsif key_types.empty? && subtypes.empty?
|
|
183
|
+
if (key_types.none?(&:defined?) && subtypes.none?(&:defined?)) ||
|
|
184
|
+
(key_types.empty? && subtypes.empty?)
|
|
186
185
|
''
|
|
187
186
|
elsif hash_parameters?
|
|
188
187
|
"{#{key_types_str} => #{subtypes_str}}"
|
|
189
188
|
elsif fixed_parameters?
|
|
190
189
|
"(#{subtypes_str})"
|
|
190
|
+
elsif name == 'Hash'
|
|
191
|
+
"<#{key_types_str}, #{subtypes_str}>"
|
|
191
192
|
else
|
|
192
|
-
|
|
193
|
-
"<#{key_types_str}, #{subtypes_str}>"
|
|
194
|
-
else
|
|
195
|
-
"<#{key_types_str}#{subtypes_str}>"
|
|
196
|
-
end
|
|
193
|
+
"<#{key_types_str}#{subtypes_str}>"
|
|
197
194
|
end
|
|
198
195
|
end
|
|
199
196
|
|
|
200
197
|
# @return [::Symbol] :class or :instance
|
|
201
198
|
def scope
|
|
202
199
|
@scope ||= :instance if duck_type? || nil_type?
|
|
203
|
-
@scope ||=
|
|
200
|
+
@scope ||= %w[Class Module].include?(name) && !subtypes.empty? ? :class : :instance
|
|
204
201
|
end
|
|
205
202
|
|
|
206
203
|
# @param other [Object]
|
|
@@ -11,10 +11,6 @@ module Solargraph
|
|
|
11
11
|
|
|
12
12
|
attr_reader :all_params, :subtypes, :key_types
|
|
13
13
|
|
|
14
|
-
protected def equality_fields
|
|
15
|
-
[@name, @all_params, @subtypes, @key_types]
|
|
16
|
-
end
|
|
17
|
-
|
|
18
14
|
# Create a UniqueType with the specified name and an optional substring.
|
|
19
15
|
# The substring is the parameter section of a parametrized type, e.g.,
|
|
20
16
|
# for the type `Array<String>`, the name is `Array` and the substring is
|
|
@@ -25,11 +21,9 @@ module Solargraph
|
|
|
25
21
|
# @param make_rooted [Boolean, nil]
|
|
26
22
|
# @return [UniqueType]
|
|
27
23
|
def self.parse name, substring = '', make_rooted: nil
|
|
28
|
-
if name.start_with?(':::')
|
|
29
|
-
raise ComplexTypeError, "Illegal prefix: #{name}"
|
|
30
|
-
end
|
|
24
|
+
raise ComplexTypeError, "Illegal prefix: #{name}" if name.start_with?(':::')
|
|
31
25
|
if name.start_with?('::')
|
|
32
|
-
name = name[2
|
|
26
|
+
name = name[2..]
|
|
33
27
|
rooted = true
|
|
34
28
|
elsif !can_root_name?(name)
|
|
35
29
|
rooted = true
|
|
@@ -48,13 +42,17 @@ module Solargraph
|
|
|
48
42
|
# @sg-ignore Need to add nil check here
|
|
49
43
|
parameters_type = PARAMETERS_TYPE_BY_STARTING_TAG.fetch(substring[0])
|
|
50
44
|
if parameters_type == :hash
|
|
51
|
-
|
|
45
|
+
unless !subs.is_a?(ComplexType) && (subs.length == 2) && !subs[0].is_a?(UniqueType) && !subs[1].is_a?(UniqueType)
|
|
46
|
+
raise ComplexTypeError,
|
|
47
|
+
"Bad hash type: name=#{name}, substring=#{substring}"
|
|
48
|
+
end
|
|
52
49
|
key_types.concat(subs[0].map { |u| ComplexType.new([u]) })
|
|
53
50
|
subtypes.concat(subs[1].map { |u| ComplexType.new([u]) })
|
|
54
51
|
elsif parameters_type == :list && name == 'Hash'
|
|
55
52
|
# Treat Hash<A, B> as Hash{A => B}
|
|
56
53
|
if subs.length != 2
|
|
57
|
-
raise ComplexTypeError,
|
|
54
|
+
raise ComplexTypeError,
|
|
55
|
+
"Bad hash type: name=#{name}, substring=#{substring} - must have exactly two parameters"
|
|
58
56
|
end
|
|
59
57
|
key_types.concat(subs[0].map { |u| ComplexType.new([u]) })
|
|
60
58
|
subtypes.concat(subs[1].map { |u| ComplexType.new([u]) })
|
|
@@ -71,9 +69,9 @@ module Solargraph
|
|
|
71
69
|
# @param subtypes [Array<ComplexType>]
|
|
72
70
|
# @param rooted [Boolean]
|
|
73
71
|
# @param parameters_type [Symbol, nil]
|
|
74
|
-
def initialize
|
|
75
|
-
if parameters_type.nil?
|
|
76
|
-
raise
|
|
72
|
+
def initialize name, key_types = [], subtypes = [], rooted:, parameters_type: nil
|
|
73
|
+
if parameters_type.nil? && !(key_types.empty? && subtypes.empty?)
|
|
74
|
+
raise 'You must supply parameters_type if you provide parameters'
|
|
77
75
|
end
|
|
78
76
|
raise "Please remove leading :: and set rooted instead - #{name.inspect}" if name.start_with?('::')
|
|
79
77
|
@name = name
|
|
@@ -95,7 +93,7 @@ module Solargraph
|
|
|
95
93
|
# @todo use api_map to establish number of generics in type;
|
|
96
94
|
# if only one is allowed but multiple are passed in, treat
|
|
97
95
|
# those as implicit unions
|
|
98
|
-
[
|
|
96
|
+
%w[Hash Array Set _ToAry Enumerable _Each].include?(name) && parameters_type != :fixed
|
|
99
97
|
end
|
|
100
98
|
|
|
101
99
|
def to_s
|
|
@@ -175,7 +173,7 @@ module Solargraph
|
|
|
175
173
|
# | `false`
|
|
176
174
|
return name if name.empty?
|
|
177
175
|
return 'NilClass' if name == 'nil'
|
|
178
|
-
return 'Boolean' if [
|
|
176
|
+
return 'Boolean' if %w[true false].include?(name)
|
|
179
177
|
return 'Symbol' if name[0] == ':'
|
|
180
178
|
# @sg-ignore Need to add nil check here
|
|
181
179
|
return 'String' if ['"', "'"].include?(name[0])
|
|
@@ -183,7 +181,7 @@ module Solargraph
|
|
|
183
181
|
name
|
|
184
182
|
end
|
|
185
183
|
|
|
186
|
-
def eql?
|
|
184
|
+
def eql? other
|
|
187
185
|
self.class == other.class &&
|
|
188
186
|
# @sg-ignore flow sensitive typing should support .class == .class
|
|
189
187
|
@name == other.name &&
|
|
@@ -199,7 +197,7 @@ module Solargraph
|
|
|
199
197
|
@parameters_type == other.parameters_type
|
|
200
198
|
end
|
|
201
199
|
|
|
202
|
-
def ==
|
|
200
|
+
def == other
|
|
203
201
|
eql?(other)
|
|
204
202
|
end
|
|
205
203
|
|
|
@@ -231,7 +229,7 @@ module Solargraph
|
|
|
231
229
|
# covariant
|
|
232
230
|
# contravariant?: Proc - can be changed, so we can pass
|
|
233
231
|
# in less specific super types
|
|
234
|
-
if [
|
|
232
|
+
if %w[Hash Tuple Array Set Enumerable].include?(name) && fixed_parameters?
|
|
235
233
|
:covariant
|
|
236
234
|
else
|
|
237
235
|
default
|
|
@@ -244,7 +242,7 @@ module Solargraph
|
|
|
244
242
|
end
|
|
245
243
|
|
|
246
244
|
# @param other [UniqueType]
|
|
247
|
-
def erased_version_of?
|
|
245
|
+
def erased_version_of? other
|
|
248
246
|
name == other.name && (all_params.empty? || all_params.all?(&:undefined?))
|
|
249
247
|
end
|
|
250
248
|
|
|
@@ -253,8 +251,8 @@ module Solargraph
|
|
|
253
251
|
# @param situation [:method_call, :assignment, :return_type]
|
|
254
252
|
# @param rules [Array<:allow_subtype_skew, :allow_empty_params, :allow_reverse_match, :allow_any_match, :allow_undefined, :allow_unresolved_generic>]
|
|
255
253
|
# @param variance [:invariant, :covariant, :contravariant]
|
|
256
|
-
def conforms_to?
|
|
257
|
-
variance: erased_variance(situation)
|
|
254
|
+
def conforms_to? api_map, expected, situation, rules = [],
|
|
255
|
+
variance: erased_variance(situation)
|
|
258
256
|
return true if undefined? && rules.include?(:allow_undefined)
|
|
259
257
|
|
|
260
258
|
# @todo teach this to validate duck types as inferred type
|
|
@@ -315,9 +313,9 @@ module Solargraph
|
|
|
315
313
|
'nil'
|
|
316
314
|
elsif name == GENERIC_TAG_NAME
|
|
317
315
|
all_params.first&.name
|
|
318
|
-
elsif [
|
|
316
|
+
elsif %w[Class Module].include?(name)
|
|
319
317
|
rbs_name
|
|
320
|
-
elsif [
|
|
318
|
+
elsif %w[Tuple Array].include?(name) && fixed_parameters?
|
|
321
319
|
# tuples don't have a name; they're just [foo, bar, baz].
|
|
322
320
|
if substring == '()'
|
|
323
321
|
# but there are no zero element tuples, so we go with an array
|
|
@@ -342,7 +340,7 @@ module Solargraph
|
|
|
342
340
|
|
|
343
341
|
# @param types [Array<UniqueType, ComplexType>]
|
|
344
342
|
# @return [String]
|
|
345
|
-
def rbs_union
|
|
343
|
+
def rbs_union types
|
|
346
344
|
if types.length == 1
|
|
347
345
|
types.first.to_rbs
|
|
348
346
|
else
|
|
@@ -397,7 +395,8 @@ module Solargraph
|
|
|
397
395
|
end
|
|
398
396
|
if new_binding
|
|
399
397
|
resolved_generic_values.transform_values! do |complex_type|
|
|
400
|
-
complex_type.resolve_generics_from_context(generics_to_resolve, nil,
|
|
398
|
+
complex_type.resolve_generics_from_context(generics_to_resolve, nil,
|
|
399
|
+
resolved_generic_values: resolved_generic_values)
|
|
401
400
|
end
|
|
402
401
|
end
|
|
403
402
|
# @sg-ignore flow sensitive typing needs to eliminate literal from union with [:bar].include?(foo)
|
|
@@ -405,8 +404,10 @@ module Solargraph
|
|
|
405
404
|
end
|
|
406
405
|
|
|
407
406
|
# @todo typechecking should complain when the method being called has no @yieldparam tag
|
|
408
|
-
new_key_types = resolve_param_generics_from_context(generics_to_resolve, context_type, resolved_generic_values,
|
|
409
|
-
|
|
407
|
+
new_key_types = resolve_param_generics_from_context(generics_to_resolve, context_type, resolved_generic_values,
|
|
408
|
+
&:key_types)
|
|
409
|
+
new_subtypes = resolve_param_generics_from_context(generics_to_resolve, context_type, resolved_generic_values,
|
|
410
|
+
&:subtypes)
|
|
410
411
|
recreate(new_key_types: new_key_types, new_subtypes: new_subtypes)
|
|
411
412
|
end
|
|
412
413
|
|
|
@@ -415,7 +416,7 @@ module Solargraph
|
|
|
415
416
|
# @param resolved_generic_values [Hash{String => ComplexType}]
|
|
416
417
|
# @yieldreturn [Array<ComplexType>]
|
|
417
418
|
# @return [Array<ComplexType>]
|
|
418
|
-
def resolve_param_generics_from_context
|
|
419
|
+
def resolve_param_generics_from_context generics_to_resolve, context_type, resolved_generic_values
|
|
419
420
|
types = yield self
|
|
420
421
|
types.each_with_index.flat_map do |ct, i|
|
|
421
422
|
ct.items.flat_map do |ut|
|
|
@@ -423,10 +424,12 @@ module Solargraph
|
|
|
423
424
|
if context_params && context_params[i]
|
|
424
425
|
type_arg = context_params[i]
|
|
425
426
|
type_arg.map do |new_unique_context_type|
|
|
426
|
-
ut.resolve_generics_from_context generics_to_resolve, new_unique_context_type,
|
|
427
|
+
ut.resolve_generics_from_context generics_to_resolve, new_unique_context_type,
|
|
428
|
+
resolved_generic_values: resolved_generic_values
|
|
427
429
|
end
|
|
428
430
|
else
|
|
429
|
-
ut.resolve_generics_from_context generics_to_resolve, nil,
|
|
431
|
+
ut.resolve_generics_from_context generics_to_resolve, nil,
|
|
432
|
+
resolved_generic_values: resolved_generic_values
|
|
430
433
|
end
|
|
431
434
|
end
|
|
432
435
|
end
|
|
@@ -448,7 +451,7 @@ module Solargraph
|
|
|
448
451
|
idx = definitions.generics.index(generic_name)
|
|
449
452
|
next t if idx.nil?
|
|
450
453
|
if context_type.parameters_type == :hash
|
|
451
|
-
if idx
|
|
454
|
+
if idx.zero?
|
|
452
455
|
next ComplexType.new(context_type.key_types)
|
|
453
456
|
elsif idx == 1
|
|
454
457
|
next ComplexType.new(context_type.subtypes)
|
|
@@ -456,7 +459,7 @@ module Solargraph
|
|
|
456
459
|
next ComplexType::UNDEFINED
|
|
457
460
|
end
|
|
458
461
|
elsif context_type.all?(&:implicit_union?)
|
|
459
|
-
if idx
|
|
462
|
+
if idx.zero? && !context_type.all_params.empty?
|
|
460
463
|
ComplexType.new(context_type.all_params)
|
|
461
464
|
else
|
|
462
465
|
ComplexType::UNDEFINED
|
|
@@ -482,7 +485,7 @@ module Solargraph
|
|
|
482
485
|
# @yieldreturn [self]
|
|
483
486
|
# @return [Enumerable<self>]
|
|
484
487
|
def each &block
|
|
485
|
-
[self].each
|
|
488
|
+
[self].each(&block)
|
|
486
489
|
end
|
|
487
490
|
|
|
488
491
|
# @return [Array<UniqueType>]
|
|
@@ -493,10 +496,10 @@ module Solargraph
|
|
|
493
496
|
# @param new_name [String, nil]
|
|
494
497
|
# @param make_rooted [Boolean, nil]
|
|
495
498
|
# @param new_key_types [Array<ComplexType>, nil]
|
|
496
|
-
# @param
|
|
499
|
+
# @param make_rooted [Boolean, nil]
|
|
497
500
|
# @param new_subtypes [Array<ComplexType>, nil]
|
|
498
501
|
# @return [self]
|
|
499
|
-
def recreate
|
|
502
|
+
def recreate new_name: nil, make_rooted: nil, new_key_types: nil, new_subtypes: nil
|
|
500
503
|
raise "Please remove leading :: and set rooted instead - #{new_name}" if new_name&.start_with?('::')
|
|
501
504
|
|
|
502
505
|
new_name ||= name
|
|
@@ -530,8 +533,10 @@ module Solargraph
|
|
|
530
533
|
# @yieldparam t [UniqueType]
|
|
531
534
|
# @yieldreturn [self]
|
|
532
535
|
# @return [self]
|
|
533
|
-
def transform
|
|
534
|
-
|
|
536
|
+
def transform new_name = nil, &transform_type
|
|
537
|
+
if new_name&.start_with?('::')
|
|
538
|
+
raise "Please remove leading :: and set rooted with recreate() instead - #{new_name}"
|
|
539
|
+
end
|
|
535
540
|
if name == ComplexType::GENERIC_TAG_NAME
|
|
536
541
|
# doesn't make sense to manipulate the name of the generic
|
|
537
542
|
new_key_types = @key_types
|
|
@@ -540,14 +545,15 @@ module Solargraph
|
|
|
540
545
|
new_key_types = @key_types.flat_map { |ct| ct.items.map { |ut| ut.transform(&transform_type) } }
|
|
541
546
|
new_subtypes = @subtypes.flat_map { |ct| ct.items.map { |ut| ut.transform(&transform_type) } }
|
|
542
547
|
end
|
|
543
|
-
new_type = recreate(new_name: new_name || name, new_key_types: new_key_types, new_subtypes: new_subtypes,
|
|
548
|
+
new_type = recreate(new_name: new_name || name, new_key_types: new_key_types, new_subtypes: new_subtypes,
|
|
549
|
+
make_rooted: @rooted)
|
|
544
550
|
yield new_type
|
|
545
551
|
end
|
|
546
552
|
|
|
547
553
|
# Generate a ComplexType that fully qualifies this type's namespaces.
|
|
548
554
|
#
|
|
549
555
|
# @param api_map [ApiMap] The ApiMap that performs qualification
|
|
550
|
-
# @param
|
|
556
|
+
# @param gates [Array<String>] The namespaces from which to resolve names
|
|
551
557
|
# @return [self, ComplexType, UniqueType] The generated ComplexType
|
|
552
558
|
def qualify api_map, *gates
|
|
553
559
|
transform do |t|
|
|
@@ -585,7 +591,7 @@ module Solargraph
|
|
|
585
591
|
# @return [ComplexType]
|
|
586
592
|
def reduce_class_type
|
|
587
593
|
new_items = items.flat_map do |type|
|
|
588
|
-
next type unless [
|
|
594
|
+
next type unless %w[Module Class].include?(type.name)
|
|
589
595
|
next type if type.all_params.empty?
|
|
590
596
|
|
|
591
597
|
type.all_params
|
|
@@ -603,12 +609,12 @@ module Solargraph
|
|
|
603
609
|
end
|
|
604
610
|
|
|
605
611
|
# @param name_to_check [String]
|
|
606
|
-
def can_root_name?
|
|
612
|
+
def can_root_name? name_to_check = name
|
|
607
613
|
self.class.can_root_name?(name_to_check)
|
|
608
614
|
end
|
|
609
615
|
|
|
610
616
|
# @param name [String]
|
|
611
|
-
def self.can_root_name?
|
|
617
|
+
def self.can_root_name? name
|
|
612
618
|
# name is not lowercase
|
|
613
619
|
!name.empty? && name != name.downcase
|
|
614
620
|
end
|
|
@@ -625,8 +631,13 @@ module Solargraph
|
|
|
625
631
|
'::NilClass' => UniqueType::NIL
|
|
626
632
|
}.freeze
|
|
627
633
|
|
|
628
|
-
|
|
629
634
|
include Logging
|
|
635
|
+
|
|
636
|
+
protected
|
|
637
|
+
|
|
638
|
+
def equality_fields
|
|
639
|
+
[@name, @all_params, @subtypes, @key_types]
|
|
640
|
+
end
|
|
630
641
|
end
|
|
631
642
|
end
|
|
632
643
|
end
|