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
|
@@ -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
|
|
@@ -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?
|
|
@@ -73,9 +73,21 @@ module Solargraph
|
|
|
73
73
|
name == 'undefined'
|
|
74
74
|
end
|
|
75
75
|
|
|
76
|
+
# Variance of the type ignoring any type parameters
|
|
77
|
+
# @return [Symbol]
|
|
78
|
+
# @param situation [Symbol] The situation in which the variance is being considered.
|
|
79
|
+
def erased_variance situation = :method_call
|
|
80
|
+
# :nocov:
|
|
81
|
+
unless %i[method_call return_type assignment].include?(situation)
|
|
82
|
+
raise "Unknown situation: #{situation.inspect}"
|
|
83
|
+
end
|
|
84
|
+
# :nocov:
|
|
85
|
+
:covariant
|
|
86
|
+
end
|
|
87
|
+
|
|
76
88
|
# @param generics_to_erase [Enumerable<String>]
|
|
77
89
|
# @return [self]
|
|
78
|
-
def erase_generics
|
|
90
|
+
def erase_generics generics_to_erase
|
|
79
91
|
transform do |type|
|
|
80
92
|
if type.name == ComplexType::GENERIC_TAG_NAME
|
|
81
93
|
if type.all_params.length == 1 && generics_to_erase.include?(type.all_params.first.to_s)
|
|
@@ -130,7 +142,7 @@ module Solargraph
|
|
|
130
142
|
@namespace ||= lambda do
|
|
131
143
|
return 'Object' if duck_type?
|
|
132
144
|
return 'NilClass' if nil_type?
|
|
133
|
-
|
|
145
|
+
%w[Class Module].include?(name) && !subtypes.empty? ? subtypes.first.name : name
|
|
134
146
|
end.call
|
|
135
147
|
end
|
|
136
148
|
|
|
@@ -138,7 +150,7 @@ module Solargraph
|
|
|
138
150
|
def namespace_type
|
|
139
151
|
return ComplexType.parse('::Object') if duck_type?
|
|
140
152
|
return ComplexType.parse('::NilClass') if nil_type?
|
|
141
|
-
return subtypes.first if
|
|
153
|
+
return subtypes.first if %w[Class Module].include?(name) && !subtypes.empty?
|
|
142
154
|
self
|
|
143
155
|
end
|
|
144
156
|
|
|
@@ -165,36 +177,33 @@ module Solargraph
|
|
|
165
177
|
end
|
|
166
178
|
|
|
167
179
|
# @return [String]
|
|
168
|
-
def generate_substring_from
|
|
180
|
+
def generate_substring_from &to_str
|
|
169
181
|
key_types_str = key_types.map(&to_str).join(', ')
|
|
170
182
|
subtypes_str = subtypes.map(&to_str).join(', ')
|
|
171
|
-
if key_types.none?(&:defined?) && subtypes.none?(&:defined?)
|
|
172
|
-
|
|
173
|
-
elsif key_types.empty? && subtypes.empty?
|
|
183
|
+
if (key_types.none?(&:defined?) && subtypes.none?(&:defined?)) ||
|
|
184
|
+
(key_types.empty? && subtypes.empty?)
|
|
174
185
|
''
|
|
175
186
|
elsif hash_parameters?
|
|
176
187
|
"{#{key_types_str} => #{subtypes_str}}"
|
|
177
188
|
elsif fixed_parameters?
|
|
178
189
|
"(#{subtypes_str})"
|
|
190
|
+
elsif name == 'Hash'
|
|
191
|
+
"<#{key_types_str}, #{subtypes_str}>"
|
|
179
192
|
else
|
|
180
|
-
|
|
181
|
-
"<#{key_types_str}, #{subtypes_str}>"
|
|
182
|
-
else
|
|
183
|
-
"<#{key_types_str}#{subtypes_str}>"
|
|
184
|
-
end
|
|
193
|
+
"<#{key_types_str}#{subtypes_str}>"
|
|
185
194
|
end
|
|
186
195
|
end
|
|
187
196
|
|
|
188
197
|
# @return [::Symbol] :class or :instance
|
|
189
198
|
def scope
|
|
190
199
|
@scope ||= :instance if duck_type? || nil_type?
|
|
191
|
-
@scope ||=
|
|
200
|
+
@scope ||= %w[Class Module].include?(name) && !subtypes.empty? ? :class : :instance
|
|
192
201
|
end
|
|
193
202
|
|
|
194
203
|
# @param other [Object]
|
|
195
204
|
def == other
|
|
196
205
|
return false unless self.class == other.class
|
|
197
|
-
# @sg-ignore
|
|
206
|
+
# @sg-ignore flow sensitive typing should support .class == .class
|
|
198
207
|
tag == other.tag
|
|
199
208
|
end
|
|
200
209
|
|
|
@@ -218,7 +227,9 @@ module Solargraph
|
|
|
218
227
|
end
|
|
219
228
|
|
|
220
229
|
# @yieldparam [UniqueType]
|
|
221
|
-
# @return [
|
|
230
|
+
# @return [void]
|
|
231
|
+
# @overload each_unique_type()
|
|
232
|
+
# @return [Enumerator<UniqueType>]
|
|
222
233
|
def each_unique_type &block
|
|
223
234
|
return enum_for(__method__) unless block_given?
|
|
224
235
|
yield self
|