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.
- checksums.yaml +4 -4
- data/.envrc +3 -0
- data/.gitattributes +2 -0
- data/.github/workflows/linting.yml +6 -5
- data/.github/workflows/plugins.yml +48 -35
- data/.github/workflows/rspec.yml +15 -28
- data/.github/workflows/typecheck.yml +3 -2
- data/.gitignore +1 -0
- data/.rubocop.yml +38 -6
- data/.rubocop_todo.yml +53 -966
- data/CHANGELOG.md +24 -0
- data/Gemfile +3 -1
- data/README.md +3 -3
- data/Rakefile +26 -23
- data/bin/solargraph +9 -8
- data/lib/solargraph/api_map/cache.rb +110 -110
- data/lib/solargraph/api_map/constants.rb +288 -279
- data/lib/solargraph/api_map/index.rb +204 -193
- data/lib/solargraph/api_map/source_to_yard.rb +110 -97
- data/lib/solargraph/api_map/store.rb +395 -384
- data/lib/solargraph/api_map.rb +1029 -945
- data/lib/solargraph/bench.rb +44 -45
- data/lib/solargraph/complex_type/conformance.rb +176 -0
- data/lib/solargraph/complex_type/type_methods.rb +240 -228
- data/lib/solargraph/complex_type/unique_type.rb +641 -482
- data/lib/solargraph/complex_type.rb +557 -444
- data/lib/solargraph/convention/data_definition/data_assignment_node.rb +61 -61
- data/lib/solargraph/convention/data_definition/data_definition_node.rb +93 -91
- data/lib/solargraph/convention/data_definition.rb +108 -105
- 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 +62 -61
- data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +103 -102
- data/lib/solargraph/convention/struct_definition.rb +168 -164
- 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 +54 -53
- data/lib/solargraph/diagnostics/rubocop.rb +119 -118
- data/lib/solargraph/diagnostics/rubocop_helpers.rb +70 -68
- data/lib/solargraph/diagnostics/type_check.rb +56 -55
- data/lib/solargraph/diagnostics/update_errors.rb +37 -41
- data/lib/solargraph/doc_map.rb +438 -439
- data/lib/solargraph/equality.rb +34 -34
- data/lib/solargraph/gem_pins.rb +98 -98
- 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 +130 -130
- data/lib/solargraph/language_server/host/message_worker.rb +113 -112
- data/lib/solargraph/language_server/host/sources.rb +100 -99
- data/lib/solargraph/language_server/host.rb +886 -878
- 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 +108 -114
- data/lib/solargraph/language_server/message/extended/document.rb +24 -23
- 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 +58 -56
- data/lib/solargraph/language_server/message/text_document/definition.rb +49 -40
- data/lib/solargraph/language_server/message/text_document/document_highlight.rb +23 -16
- data/lib/solargraph/language_server/message/text_document/document_symbol.rb +36 -26
- data/lib/solargraph/language_server/message/text_document/formatting.rb +150 -148
- data/lib/solargraph/language_server/message/text_document/hover.rb +58 -58
- 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 +25 -24
- data/lib/solargraph/language_server/message/text_document/type_definition.rb +33 -25
- 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 +33 -23
- 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 +702 -683
- data/lib/solargraph/location.rb +85 -82
- data/lib/solargraph/logging.rb +55 -37
- data/lib/solargraph/page.rb +92 -92
- data/lib/solargraph/parser/comment_ripper.rb +84 -69
- data/lib/solargraph/parser/flow_sensitive_typing.rb +471 -255
- data/lib/solargraph/parser/node_processor/base.rb +122 -92
- data/lib/solargraph/parser/node_processor.rb +63 -62
- data/lib/solargraph/parser/parser_gem/class_methods.rb +165 -149
- data/lib/solargraph/parser/parser_gem/flawed_builder.rb +19 -19
- data/lib/solargraph/parser/parser_gem/node_chainer.rb +191 -166
- data/lib/solargraph/parser/parser_gem/node_methods.rb +507 -486
- data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +22 -22
- data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +61 -59
- data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +24 -15
- data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +45 -46
- data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +60 -53
- data/lib/solargraph/parser/parser_gem/node_processors/defs_node.rb +38 -37
- data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +53 -23
- data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +42 -40
- data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +30 -29
- data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +61 -59
- data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +98 -98
- data/lib/solargraph/parser/parser_gem/node_processors/or_node.rb +22 -0
- data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +17 -17
- data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +39 -38
- data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +51 -52
- data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +302 -291
- 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 +33 -29
- data/lib/solargraph/parser/parser_gem/node_processors.rb +74 -70
- data/lib/solargraph/parser/parser_gem.rb +14 -12
- data/lib/solargraph/parser/region.rb +75 -69
- data/lib/solargraph/parser/snippet.rb +19 -17
- data/lib/solargraph/parser.rb +25 -23
- data/lib/solargraph/pin/base.rb +773 -729
- data/lib/solargraph/pin/base_variable.rb +375 -126
- data/lib/solargraph/pin/block.rb +127 -104
- data/lib/solargraph/pin/breakable.rb +15 -9
- data/lib/solargraph/pin/callable.rb +275 -231
- data/lib/solargraph/pin/closure.rb +69 -72
- data/lib/solargraph/pin/common.rb +97 -79
- data/lib/solargraph/pin/compound_statement.rb +55 -0
- data/lib/solargraph/pin/constant.rb +43 -45
- data/lib/solargraph/pin/conversions.rb +129 -123
- data/lib/solargraph/pin/delegated_method.rb +131 -120
- data/lib/solargraph/pin/documenting.rb +116 -114
- data/lib/solargraph/pin/instance_variable.rb +38 -34
- data/lib/solargraph/pin/keyword.rb +16 -20
- data/lib/solargraph/pin/local_variable.rb +31 -75
- data/lib/solargraph/pin/method.rb +724 -672
- data/lib/solargraph/pin/method_alias.rb +42 -34
- data/lib/solargraph/pin/namespace.rb +122 -115
- data/lib/solargraph/pin/parameter.rb +339 -275
- data/lib/solargraph/pin/proxy_type.rb +42 -39
- data/lib/solargraph/pin/reference/override.rb +47 -47
- data/lib/solargraph/pin/reference/superclass.rb +17 -15
- data/lib/solargraph/pin/reference/type_alias.rb +16 -0
- data/lib/solargraph/pin/reference.rb +59 -39
- data/lib/solargraph/pin/search.rb +62 -61
- data/lib/solargraph/pin/signature.rb +64 -61
- data/lib/solargraph/pin/symbol.rb +54 -53
- data/lib/solargraph/pin/until.rb +16 -18
- data/lib/solargraph/pin/while.rb +16 -18
- data/lib/solargraph/pin.rb +46 -44
- data/lib/solargraph/pin_cache.rb +248 -245
- data/lib/solargraph/position.rb +139 -119
- data/lib/solargraph/range.rb +113 -112
- data/lib/solargraph/rbs_map/conversions.rb +952 -823
- data/lib/solargraph/rbs_map/core_fills.rb +91 -84
- data/lib/solargraph/rbs_map/core_map.rb +65 -58
- data/lib/solargraph/rbs_map/stdlib_map.rb +71 -43
- data/lib/solargraph/rbs_map.rb +207 -163
- data/lib/solargraph/server_methods.rb +16 -16
- data/lib/solargraph/shell.rb +555 -352
- data/lib/solargraph/source/chain/array.rb +39 -37
- data/lib/solargraph/source/chain/call.rb +377 -337
- data/lib/solargraph/source/chain/class_variable.rb +13 -13
- data/lib/solargraph/source/chain/constant.rb +30 -26
- data/lib/solargraph/source/chain/global_variable.rb +13 -13
- data/lib/solargraph/source/chain/hash.rb +37 -34
- data/lib/solargraph/source/chain/if.rb +30 -28
- data/lib/solargraph/source/chain/instance_variable.rb +36 -13
- data/lib/solargraph/source/chain/link.rb +99 -109
- data/lib/solargraph/source/chain/literal.rb +51 -48
- data/lib/solargraph/source/chain/or.rb +29 -23
- 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 +304 -291
- data/lib/solargraph/source/change.rb +89 -82
- data/lib/solargraph/source/cursor.rb +172 -166
- data/lib/solargraph/source/encoding_fixes.rb +22 -23
- data/lib/solargraph/source/source_chainer.rb +218 -194
- data/lib/solargraph/source/updater.rb +59 -55
- data/lib/solargraph/source.rb +522 -498
- data/lib/solargraph/source_map/clip.rb +245 -226
- data/lib/solargraph/source_map/data.rb +37 -34
- data/lib/solargraph/source_map/mapper.rb +286 -259
- data/lib/solargraph/source_map.rb +224 -212
- data/lib/solargraph/type_checker/problem.rb +34 -32
- data/lib/solargraph/type_checker/rules.rb +157 -84
- data/lib/solargraph/type_checker.rb +888 -814
- data/lib/solargraph/version.rb +5 -5
- data/lib/solargraph/workspace/config.rb +258 -255
- data/lib/solargraph/workspace/gemspecs.rb +367 -0
- data/lib/solargraph/workspace/require_paths.rb +98 -97
- data/lib/solargraph/workspace.rb +242 -220
- data/lib/solargraph/yard_map/helpers.rb +49 -44
- data/lib/solargraph/yard_map/mapper/to_method.rb +136 -130
- data/lib/solargraph/yard_map/mapper/to_namespace.rb +32 -31
- data/lib/solargraph/yard_map/mapper.rb +84 -79
- data/lib/solargraph/yard_map.rb +17 -18
- data/lib/solargraph/yard_tags.rb +20 -20
- data/lib/solargraph/yardoc.rb +90 -87
- data/lib/solargraph.rb +128 -105
- data/rbs/fills/rubygems/0/dependency.rbs +193 -0
- data/rbs/fills/tuple/tuple.rbs +28 -0
- data/rbs/shims/ast/0/node.rbs +5 -0
- data/rbs/shims/diff-lcs/1.5/diff-lcs.rbs +11 -0
- data/rbs_collection.yaml +1 -1
- data/solargraph.gemspec +37 -35
- metadata +52 -51
- 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
- data/sig/shims/ast/0/node.rbs +0 -5
- /data/{sig → rbs}/shims/ast/2.4/.rbs_meta.yaml +0 -0
- /data/{sig → rbs}/shims/ast/2.4/ast.rbs +0 -0
- /data/{sig → rbs}/shims/parser/3.2.0.1/builders/default.rbs +0 -0
- /data/{sig → rbs}/shims/parser/3.2.0.1/manifest.yaml +0 -0
- /data/{sig → rbs}/shims/parser/3.2.0.1/parser.rbs +0 -0
- /data/{sig → rbs}/shims/parser/3.2.0.1/polyfill.rbs +0 -0
- /data/{sig → rbs}/shims/thor/1.2.0.1/.rbs_meta.yaml +0 -0
- /data/{sig → rbs}/shims/thor/1.2.0.1/manifest.yaml +0 -0
- /data/{sig → rbs}/shims/thor/1.2.0.1/thor.rbs +0 -0
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
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
class ComplexType
|
|
5
|
+
# Checks whether a type can be used in a given situation
|
|
6
|
+
class Conformance
|
|
7
|
+
# @param api_map [ApiMap]
|
|
8
|
+
# @param inferred [ComplexType::UniqueType]
|
|
9
|
+
# @param expected [ComplexType::UniqueType]
|
|
10
|
+
# @param situation [:method_call, :return_type]
|
|
11
|
+
# @param rules [Array<:allow_subtype_skew, :allow_empty_params, :allow_reverse_match,
|
|
12
|
+
# :allow_any_match, :allow_undefined, :allow_unresolved_generic,
|
|
13
|
+
# :allow_unmatched_interface>]
|
|
14
|
+
# @param variance [:invariant, :covariant, :contravariant]
|
|
15
|
+
def initialize api_map, inferred, expected,
|
|
16
|
+
situation = :method_call, rules = [],
|
|
17
|
+
variance: inferred.erased_variance(situation)
|
|
18
|
+
@api_map = api_map
|
|
19
|
+
@inferred = inferred
|
|
20
|
+
@expected = expected
|
|
21
|
+
@situation = situation
|
|
22
|
+
@rules = rules
|
|
23
|
+
@variance = variance
|
|
24
|
+
# :nocov:
|
|
25
|
+
unless expected.is_a?(UniqueType)
|
|
26
|
+
# @sg-ignore This should never happen and the typechecker is angry about it
|
|
27
|
+
raise "Expected type must be a UniqueType, got #{expected.class} in #{expected.inspect}"
|
|
28
|
+
end
|
|
29
|
+
# :nocov:
|
|
30
|
+
return if inferred.is_a?(UniqueType)
|
|
31
|
+
# :nocov:
|
|
32
|
+
# @sg-ignore This should never happen and the typechecker is angry about it
|
|
33
|
+
raise "Inferred type must be a UniqueType, got #{inferred.class} in #{inferred.inspect}"
|
|
34
|
+
# :nocov:
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def conforms_to_unique_type?
|
|
38
|
+
unless expected.is_a?(UniqueType)
|
|
39
|
+
# :nocov:
|
|
40
|
+
raise "Expected type must be a UniqueType, got #{expected.class} in #{expected.inspect}"
|
|
41
|
+
# :nocov:
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
return true if ignore_interface?
|
|
45
|
+
return true if conforms_via_reverse_match?
|
|
46
|
+
|
|
47
|
+
downcast_inferred = inferred.downcast_to_literal_if_possible
|
|
48
|
+
downcast_expected = expected.downcast_to_literal_if_possible
|
|
49
|
+
if (downcast_inferred.name != inferred.name) || (downcast_expected.name != expected.name)
|
|
50
|
+
return with_new_types(downcast_inferred, downcast_expected).conforms_to_unique_type?
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
if rules.include?(:allow_subtype_skew) && !expected.all_params.empty?
|
|
54
|
+
# parameters are not considered in this case
|
|
55
|
+
return with_new_types(inferred, expected.erase_parameters).conforms_to_unique_type?
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
return with_new_types(inferred.erase_parameters, expected).conforms_to_unique_type? if only_inferred_parameters?
|
|
59
|
+
|
|
60
|
+
return conforms_via_stripped_expected_parameters? if can_strip_expected_parameters?
|
|
61
|
+
|
|
62
|
+
return true if inferred == expected
|
|
63
|
+
|
|
64
|
+
return false unless erased_type_conforms?
|
|
65
|
+
|
|
66
|
+
return true if inferred.all_params.empty? && rules.include?(:allow_empty_params)
|
|
67
|
+
|
|
68
|
+
# at this point we know the erased type is fine - time to look at parameters
|
|
69
|
+
|
|
70
|
+
# there's an implicit 'any' on the expectation parameters
|
|
71
|
+
# if there are none specified
|
|
72
|
+
return true if expected.all_params.empty?
|
|
73
|
+
|
|
74
|
+
return false unless key_types_conform?
|
|
75
|
+
|
|
76
|
+
subtypes_conform?
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
private
|
|
80
|
+
|
|
81
|
+
def only_inferred_parameters?
|
|
82
|
+
!expected.parameters? && inferred.parameters?
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def conforms_via_stripped_expected_parameters?
|
|
86
|
+
with_new_types(inferred, expected.erase_parameters).conforms_to_unique_type?
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def ignore_interface?
|
|
90
|
+
(expected.any?(&:interface?) && rules.include?(:allow_unmatched_interface)) ||
|
|
91
|
+
(inferred.interface? && rules.include?(:allow_unmatched_interface))
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def can_strip_expected_parameters?
|
|
95
|
+
expected.parameters? && !inferred.parameters? && rules.include?(:allow_empty_params)
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def conforms_via_reverse_match?
|
|
99
|
+
return false unless rules.include? :allow_reverse_match
|
|
100
|
+
|
|
101
|
+
expected.conforms_to?(api_map, inferred, situation,
|
|
102
|
+
rules - [:allow_reverse_match],
|
|
103
|
+
variance: variance)
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def erased_type_conforms?
|
|
107
|
+
case variance
|
|
108
|
+
when :invariant
|
|
109
|
+
return false unless inferred.name == expected.name
|
|
110
|
+
when :covariant
|
|
111
|
+
# covariant: we can pass in a more specific type
|
|
112
|
+
# we contain the expected mix-in, or we have a more specific type
|
|
113
|
+
return false unless api_map.type_include?(inferred.name, expected.name) ||
|
|
114
|
+
api_map.super_and_sub?(expected.name, inferred.name) ||
|
|
115
|
+
inferred.name == expected.name
|
|
116
|
+
when :contravariant
|
|
117
|
+
# contravariant: we can pass in a more general type
|
|
118
|
+
# we contain the expected mix-in, or we have a more general type
|
|
119
|
+
return false unless api_map.type_include?(inferred.name, expected.name) ||
|
|
120
|
+
api_map.super_and_sub?(inferred.name, expected.name) ||
|
|
121
|
+
inferred.name == expected.name
|
|
122
|
+
else
|
|
123
|
+
# :nocov:
|
|
124
|
+
raise "Unknown variance: #{variance.inspect}"
|
|
125
|
+
# :nocov:
|
|
126
|
+
end
|
|
127
|
+
true
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def key_types_conform?
|
|
131
|
+
return true if expected.key_types.empty?
|
|
132
|
+
|
|
133
|
+
return false if inferred.key_types.empty?
|
|
134
|
+
|
|
135
|
+
unless ComplexType.new(inferred.key_types).conforms_to?(api_map,
|
|
136
|
+
ComplexType.new(expected.key_types),
|
|
137
|
+
situation,
|
|
138
|
+
rules,
|
|
139
|
+
variance: inferred.parameter_variance(situation))
|
|
140
|
+
return false
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
true
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
def subtypes_conform?
|
|
147
|
+
return true if expected.subtypes.empty?
|
|
148
|
+
|
|
149
|
+
return true if expected.subtypes.any?(&:undefined?) && rules.include?(:allow_undefined)
|
|
150
|
+
|
|
151
|
+
return true if inferred.subtypes.any?(&:undefined?) && rules.include?(:allow_undefined)
|
|
152
|
+
|
|
153
|
+
return true if inferred.subtypes.all?(&:generic?) && rules.include?(:allow_unresolved_generic)
|
|
154
|
+
|
|
155
|
+
return true if expected.subtypes.all?(&:generic?) && rules.include?(:allow_unresolved_generic)
|
|
156
|
+
|
|
157
|
+
return false if inferred.subtypes.empty?
|
|
158
|
+
|
|
159
|
+
ComplexType.new(inferred.subtypes).conforms_to?(api_map,
|
|
160
|
+
ComplexType.new(expected.subtypes),
|
|
161
|
+
situation,
|
|
162
|
+
rules,
|
|
163
|
+
variance: inferred.parameter_variance(situation))
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
# @return [self]
|
|
167
|
+
# @param inferred [ComplexType::UniqueType]
|
|
168
|
+
# @param expected [ComplexType::UniqueType]
|
|
169
|
+
def with_new_types inferred, expected
|
|
170
|
+
self.class.new(api_map, inferred, expected, situation, rules, variance: variance)
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
attr_reader :api_map, :inferred, :expected, :situation, :rules, :variance
|
|
174
|
+
end
|
|
175
|
+
end
|
|
176
|
+
end
|