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
|
@@ -23,7 +23,7 @@ module Solargraph
|
|
|
23
23
|
end
|
|
24
24
|
|
|
25
25
|
# @param loader [RBS::EnvironmentLoader]
|
|
26
|
-
def initialize
|
|
26
|
+
def initialize loader:
|
|
27
27
|
@loader = loader
|
|
28
28
|
@pins = []
|
|
29
29
|
load_environment_to_pins(loader)
|
|
@@ -43,12 +43,14 @@ module Solargraph
|
|
|
43
43
|
end
|
|
44
44
|
|
|
45
45
|
# @param loader [RBS::EnvironmentLoader]
|
|
46
|
+
#
|
|
46
47
|
# @return [void]
|
|
47
|
-
def load_environment_to_pins
|
|
48
|
+
def load_environment_to_pins loader
|
|
48
49
|
environment = RBS::Environment.from_loader(loader).resolve_type_names
|
|
49
|
-
cursor = pins.length
|
|
50
50
|
if environment.declarations.empty?
|
|
51
|
-
Solargraph.logger.info
|
|
51
|
+
Solargraph.logger.info 'No RBS declarations found in environment for core_root ' \
|
|
52
|
+
"#{loader.core_root.inspect}, libraries #{loader.libs} and " \
|
|
53
|
+
"directories #{loader.dirs}"
|
|
52
54
|
return
|
|
53
55
|
end
|
|
54
56
|
environment.declarations.each { |decl| convert_decl_to_pin(decl, Solargraph::Pin::ROOT_PIN) }
|
|
@@ -60,22 +62,57 @@ module Solargraph
|
|
|
60
62
|
def convert_decl_to_pin decl, closure
|
|
61
63
|
case decl
|
|
62
64
|
when RBS::AST::Declarations::Class
|
|
65
|
+
# @sg-ignore flow sensitive typing should support case/when
|
|
66
|
+
unless closure.name == '' || decl.name.absolute?
|
|
67
|
+
Solargraph.assert_or_log(:rbs_closure, "Ignoring closure #{closure.inspect} on class #{decl.inspect}")
|
|
68
|
+
end
|
|
63
69
|
class_decl_to_pin decl
|
|
64
70
|
when RBS::AST::Declarations::Interface
|
|
71
|
+
# @sg-ignore flow sensitive typing should support case/when
|
|
72
|
+
unless closure.name == '' || decl.name.absolute?
|
|
73
|
+
Solargraph.assert_or_log(:rbs_closure, "Ignoring closure #{closure.inspect} on interface #{decl.inspect}")
|
|
74
|
+
end
|
|
65
75
|
# STDERR.puts "Skipping interface #{decl.name.relative!}"
|
|
66
|
-
interface_decl_to_pin decl
|
|
76
|
+
interface_decl_to_pin decl
|
|
67
77
|
when RBS::AST::Declarations::TypeAlias
|
|
68
|
-
# @sg-ignore
|
|
78
|
+
# @sg-ignore flow sensitive typing should support case/when
|
|
79
|
+
unless closure.name == '' || decl.name.absolute?
|
|
80
|
+
Solargraph.assert_or_log(:rbs_closure,
|
|
81
|
+
# @sg-ignore flow sensitive typing should support case/when
|
|
82
|
+
"Ignoring closure #{closure.inspect} on alias type name #{decl.name}")
|
|
83
|
+
end
|
|
84
|
+
# @sg-ignore flow sensitive typing should support case/when
|
|
69
85
|
type_aliases[decl.name.to_s] = decl
|
|
70
86
|
when RBS::AST::Declarations::Module
|
|
87
|
+
# @sg-ignore flow sensitive typing should support case/when
|
|
88
|
+
unless closure.name == '' || decl.name.absolute?
|
|
89
|
+
Solargraph.assert_or_log(:rbs_closure,
|
|
90
|
+
# @sg-ignore flow sensitive typing should support case/when
|
|
91
|
+
"Ignoring closure #{closure.inspect} on alias type name #{decl.name}")
|
|
92
|
+
end
|
|
71
93
|
module_decl_to_pin decl
|
|
72
94
|
when RBS::AST::Declarations::Constant
|
|
95
|
+
# @sg-ignore flow sensitive typing should support case/when
|
|
96
|
+
unless closure.name == '' || decl.name.absolute?
|
|
97
|
+
Solargraph.assert_or_log(:rbs_closure, "Ignoring closure #{closure.inspect} on constant #{decl.inspect}")
|
|
98
|
+
end
|
|
73
99
|
constant_decl_to_pin decl
|
|
74
100
|
when RBS::AST::Declarations::ClassAlias
|
|
101
|
+
# @sg-ignore flow sensitive typing should support case/when
|
|
102
|
+
unless closure.name == '' || decl.new_name.absolute?
|
|
103
|
+
Solargraph.assert_or_log(:rbs_closure, "Ignoring closure #{closure.inspect} on class alias #{decl.inspect}")
|
|
104
|
+
end
|
|
75
105
|
class_alias_decl_to_pin decl
|
|
76
106
|
when RBS::AST::Declarations::ModuleAlias
|
|
107
|
+
unless closure.name == ''
|
|
108
|
+
Solargraph.assert_or_log(:rbs_closure,
|
|
109
|
+
"Ignoring closure #{closure.inspect} on module alias #{decl.inspect}")
|
|
110
|
+
end
|
|
77
111
|
module_alias_decl_to_pin decl
|
|
78
112
|
when RBS::AST::Declarations::Global
|
|
113
|
+
unless closure.name == ''
|
|
114
|
+
Solargraph.assert_or_log(:rbs_closure, "Ignoring closure #{closure.inspect} on global decl #{decl.inspect}")
|
|
115
|
+
end
|
|
79
116
|
global_decl_to_pin decl
|
|
80
117
|
else
|
|
81
118
|
Solargraph.logger.warn "Skipping declaration #{decl.class}"
|
|
@@ -86,7 +123,61 @@ module Solargraph
|
|
|
86
123
|
# @param module_pin [Pin::Namespace]
|
|
87
124
|
# @return [void]
|
|
88
125
|
def convert_self_types_to_pins decl, module_pin
|
|
89
|
-
decl.self_types.each { |self_type|
|
|
126
|
+
decl.self_types.each { |self_type| convert_self_type_to_pins(self_type, module_pin) }
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
# @type [Hash{String => String}]
|
|
130
|
+
RBS_TO_CLASS = {
|
|
131
|
+
'bool' => 'Boolean',
|
|
132
|
+
'string' => 'String',
|
|
133
|
+
'int' => 'Integer'
|
|
134
|
+
}.freeze
|
|
135
|
+
private_constant :RBS_TO_CLASS
|
|
136
|
+
|
|
137
|
+
# rooted names (namespaces) use the prefix of :: when they are
|
|
138
|
+
# relative to the root namespace, or not if they are relative to
|
|
139
|
+
# the current namespace.
|
|
140
|
+
#
|
|
141
|
+
# @param type_name [RBS::TypeName]
|
|
142
|
+
#
|
|
143
|
+
# @return [String]
|
|
144
|
+
def rooted_name type_name
|
|
145
|
+
name = type_name.to_s
|
|
146
|
+
RBS_TO_CLASS.fetch(name, name)
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
# fqns names are implicitly fully qualified - they are relative
|
|
150
|
+
# to the root namespace and are not prefixed with ::
|
|
151
|
+
#
|
|
152
|
+
# @param type_name [RBS::TypeName]
|
|
153
|
+
#
|
|
154
|
+
# @return [String]
|
|
155
|
+
def fqns type_name
|
|
156
|
+
unless type_name.absolute?
|
|
157
|
+
Solargraph.assert_or_log(:rbs_fqns, "Received unexpected unqualified type name: #{type_name}")
|
|
158
|
+
end
|
|
159
|
+
ns = type_name.relative!.to_s
|
|
160
|
+
RBS_TO_CLASS.fetch(ns, ns)
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
# @param type_name [RBS::TypeName]
|
|
164
|
+
# @param type_args [Enumerable<RBS::Types::Bases::Base>]
|
|
165
|
+
# @return [ComplexType::UniqueType]
|
|
166
|
+
def build_type type_name, type_args = []
|
|
167
|
+
# we use .absolute? below to tell the type object what to
|
|
168
|
+
# expect
|
|
169
|
+
rbs_name = type_name.relative!.to_s
|
|
170
|
+
base = RBS_TO_CLASS.fetch(rbs_name, rbs_name)
|
|
171
|
+
|
|
172
|
+
params = type_args.map { |a| other_type_to_type(a) }
|
|
173
|
+
# tuples have their own class and are handled in other_type_to_type
|
|
174
|
+
if base == 'Hash' && params.length == 2
|
|
175
|
+
ComplexType::UniqueType.new(base, [params.first], [params.last], rooted: type_name.absolute?,
|
|
176
|
+
parameters_type: :hash)
|
|
177
|
+
else
|
|
178
|
+
ComplexType::UniqueType.new(base, [], params.reject(&:undefined?), rooted: type_name.absolute?,
|
|
179
|
+
parameters_type: :list)
|
|
180
|
+
end
|
|
90
181
|
end
|
|
91
182
|
|
|
92
183
|
# @param decl [RBS::AST::Declarations::Module::Self]
|
|
@@ -94,9 +185,9 @@ module Solargraph
|
|
|
94
185
|
# @return [void]
|
|
95
186
|
def convert_self_type_to_pins decl, closure
|
|
96
187
|
type = build_type(decl.name, decl.args)
|
|
97
|
-
generic_values = type.all_params.map(&:
|
|
188
|
+
generic_values = type.all_params.map(&:rooted_tags)
|
|
98
189
|
include_pin = Solargraph::Pin::Reference::Include.new(
|
|
99
|
-
name:
|
|
190
|
+
name: type.name,
|
|
100
191
|
type_location: location_decl_to_pin_location(decl.location),
|
|
101
192
|
generic_values: generic_values,
|
|
102
193
|
closure: closure,
|
|
@@ -120,32 +211,44 @@ module Solargraph
|
|
|
120
211
|
def convert_member_to_pin member, closure, context
|
|
121
212
|
case member
|
|
122
213
|
when RBS::AST::Members::MethodDefinition
|
|
214
|
+
# @sg-ignore flow based typing needs to understand case when class pattern
|
|
123
215
|
method_def_to_pin(member, closure, context)
|
|
124
216
|
when RBS::AST::Members::AttrReader
|
|
217
|
+
# @sg-ignore flow based typing needs to understand case when class pattern
|
|
125
218
|
attr_reader_to_pin(member, closure, context)
|
|
126
219
|
when RBS::AST::Members::AttrWriter
|
|
220
|
+
# @sg-ignore flow based typing needs to understand case when class pattern
|
|
127
221
|
attr_writer_to_pin(member, closure, context)
|
|
128
222
|
when RBS::AST::Members::AttrAccessor
|
|
223
|
+
# @sg-ignore flow based typing needs to understand case when class pattern
|
|
129
224
|
attr_accessor_to_pin(member, closure, context)
|
|
130
225
|
when RBS::AST::Members::Include
|
|
226
|
+
# @sg-ignore flow based typing needs to understand case when class pattern
|
|
131
227
|
include_to_pin(member, closure)
|
|
132
228
|
when RBS::AST::Members::Prepend
|
|
229
|
+
# @sg-ignore flow based typing needs to understand case when class pattern
|
|
133
230
|
prepend_to_pin(member, closure)
|
|
134
231
|
when RBS::AST::Members::Extend
|
|
232
|
+
# @sg-ignore flow based typing needs to understand case when class pattern
|
|
135
233
|
extend_to_pin(member, closure)
|
|
136
234
|
when RBS::AST::Members::Alias
|
|
235
|
+
# @sg-ignore flow based typing needs to understand case when class pattern
|
|
137
236
|
alias_to_pin(member, closure)
|
|
138
237
|
when RBS::AST::Members::ClassInstanceVariable
|
|
238
|
+
# @sg-ignore flow based typing needs to understand case when class pattern
|
|
139
239
|
civar_to_pin(member, closure)
|
|
140
240
|
when RBS::AST::Members::ClassVariable
|
|
241
|
+
# @sg-ignore flow based typing needs to understand case when class pattern
|
|
141
242
|
cvar_to_pin(member, closure)
|
|
142
243
|
when RBS::AST::Members::InstanceVariable
|
|
244
|
+
# @sg-ignore flow based typing needs to understand case when class pattern
|
|
143
245
|
ivar_to_pin(member, closure)
|
|
144
246
|
when RBS::AST::Members::Public
|
|
145
247
|
return Context.new(:public)
|
|
146
248
|
when RBS::AST::Members::Private
|
|
147
249
|
return Context.new(:private)
|
|
148
250
|
when RBS::AST::Declarations::Base
|
|
251
|
+
# @sg-ignore flow based typing needs to understand case when class pattern
|
|
149
252
|
convert_decl_to_pin(member, closure)
|
|
150
253
|
else
|
|
151
254
|
Solargraph.logger.warn "Skipping member type #{member.class}"
|
|
@@ -153,18 +256,31 @@ module Solargraph
|
|
|
153
256
|
context
|
|
154
257
|
end
|
|
155
258
|
|
|
259
|
+
# Pull the name of type variables for a generic - not the
|
|
260
|
+
# values, the names (e.g., T, U, V). As such, "rooting" isn't a
|
|
261
|
+
# thing, these are all in the global namespace.
|
|
262
|
+
#
|
|
263
|
+
# @param decl [RBS::AST::Declarations::Class, RBS::AST::Declarations::Interface,
|
|
264
|
+
# RBS::AST::Declarations::Module, RBS::MethodType]
|
|
265
|
+
#
|
|
266
|
+
# @return [Array<String>]
|
|
267
|
+
def type_parameter_names decl
|
|
268
|
+
decl.type_params.map(&:name).map(&:to_s)
|
|
269
|
+
end
|
|
270
|
+
|
|
156
271
|
# @param decl [RBS::AST::Declarations::Class]
|
|
157
272
|
# @return [void]
|
|
158
273
|
def class_decl_to_pin decl
|
|
159
|
-
|
|
274
|
+
# @type [Hash{String => ComplexType, ComplexType::UniqueType}]
|
|
160
275
|
generic_defaults = {}
|
|
161
276
|
decl.type_params.each do |param|
|
|
162
|
-
if param.default_type
|
|
163
|
-
tag = other_type_to_tag param.default_type
|
|
164
|
-
generic_defaults[param.name.to_s] = ComplexType.parse(tag).force_rooted
|
|
165
|
-
end
|
|
277
|
+
generic_defaults[param.name.to_s] = other_type_to_type param.default_type if param.default_type
|
|
166
278
|
end
|
|
167
|
-
|
|
279
|
+
|
|
280
|
+
class_name = fqns(decl.name)
|
|
281
|
+
|
|
282
|
+
generics = type_parameter_names(decl)
|
|
283
|
+
|
|
168
284
|
class_pin = Solargraph::Pin::Namespace.new(
|
|
169
285
|
type: :class,
|
|
170
286
|
name: class_name,
|
|
@@ -181,13 +297,12 @@ module Solargraph
|
|
|
181
297
|
pins.push class_pin
|
|
182
298
|
if decl.super_class
|
|
183
299
|
type = build_type(decl.super_class.name, decl.super_class.args)
|
|
184
|
-
generic_values = type.all_params.map(&:
|
|
185
|
-
superclass_name = decl.super_class.name.to_s
|
|
300
|
+
generic_values = type.all_params.map(&:rooted_tags)
|
|
186
301
|
pins.push Solargraph::Pin::Reference::Superclass.new(
|
|
187
302
|
type_location: location_decl_to_pin_location(decl.super_class.location),
|
|
188
303
|
closure: class_pin,
|
|
189
304
|
generic_values: generic_values,
|
|
190
|
-
name:
|
|
305
|
+
name: type.rooted_name, # reference pins use rooted names
|
|
191
306
|
source: :rbs
|
|
192
307
|
)
|
|
193
308
|
end
|
|
@@ -196,16 +311,15 @@ module Solargraph
|
|
|
196
311
|
end
|
|
197
312
|
|
|
198
313
|
# @param decl [RBS::AST::Declarations::Interface]
|
|
199
|
-
# @param closure [Pin::Closure]
|
|
200
314
|
# @return [void]
|
|
201
|
-
def interface_decl_to_pin decl
|
|
315
|
+
def interface_decl_to_pin decl
|
|
202
316
|
class_pin = Solargraph::Pin::Namespace.new(
|
|
203
317
|
type: :module,
|
|
204
318
|
type_location: location_decl_to_pin_location(decl.location),
|
|
205
|
-
name: decl.name
|
|
319
|
+
name: fqns(decl.name),
|
|
206
320
|
closure: Solargraph::Pin::ROOT_PIN,
|
|
207
321
|
comments: decl.comment&.string,
|
|
208
|
-
generics: decl
|
|
322
|
+
generics: type_parameter_names(decl),
|
|
209
323
|
# HACK: Using :hidden to keep interfaces from appearing in
|
|
210
324
|
# autocompletion
|
|
211
325
|
visibility: :hidden,
|
|
@@ -221,45 +335,51 @@ module Solargraph
|
|
|
221
335
|
def module_decl_to_pin decl
|
|
222
336
|
module_pin = Solargraph::Pin::Namespace.new(
|
|
223
337
|
type: :module,
|
|
224
|
-
name: decl.name
|
|
338
|
+
name: fqns(decl.name),
|
|
225
339
|
type_location: location_decl_to_pin_location(decl.location),
|
|
226
340
|
closure: Solargraph::Pin::ROOT_PIN,
|
|
227
341
|
comments: decl.comment&.string,
|
|
228
|
-
generics: decl
|
|
342
|
+
generics: type_parameter_names(decl),
|
|
229
343
|
source: :rbs
|
|
230
344
|
)
|
|
231
345
|
pins.push module_pin
|
|
232
346
|
convert_self_types_to_pins decl, module_pin
|
|
233
347
|
convert_members_to_pins decl, module_pin
|
|
234
348
|
|
|
349
|
+
raise "Invalid type for module declaration: #{module_pin.class}" unless module_pin.is_a?(Pin::Namespace)
|
|
350
|
+
|
|
235
351
|
add_mixins decl, module_pin.closure
|
|
236
352
|
end
|
|
237
353
|
|
|
238
|
-
# @param
|
|
239
|
-
# @param
|
|
240
|
-
# @param comments [String]
|
|
241
|
-
# @param decl [RBS::AST::Declarations::ClassAlias,
|
|
242
|
-
#
|
|
354
|
+
# @param fqns [String]
|
|
355
|
+
# @param type [ComplexType, ComplexType::UniqueType]
|
|
356
|
+
# @param comments [String, nil]
|
|
357
|
+
# @param decl [RBS::AST::Declarations::ClassAlias,
|
|
358
|
+
# RBS::AST::Declarations::Constant,
|
|
359
|
+
# RBS::AST::Declarations::ModuleAlias]
|
|
360
|
+
# @param base [String, nil] Optional conversion of tag to
|
|
361
|
+
# base<tag> - valid values are Class and Module
|
|
243
362
|
#
|
|
244
363
|
# @return [Solargraph::Pin::Constant]
|
|
245
|
-
def create_constant
|
|
246
|
-
parts =
|
|
364
|
+
def create_constant fqns, type, comments, decl, base = nil
|
|
365
|
+
parts = fqns.split('::')
|
|
247
366
|
if parts.length > 1
|
|
248
|
-
|
|
367
|
+
fqns = parts.last
|
|
368
|
+
# @sg-ignore Need to add nil check here
|
|
249
369
|
closure = pins.select { |pin| pin && pin.path == parts[0..-2].join('::') }.first
|
|
250
370
|
else
|
|
251
|
-
|
|
371
|
+
fqns = parts.first
|
|
252
372
|
closure = Solargraph::Pin::ROOT_PIN
|
|
253
373
|
end
|
|
254
374
|
constant_pin = Solargraph::Pin::Constant.new(
|
|
255
|
-
name:
|
|
375
|
+
name: fqns,
|
|
256
376
|
closure: closure,
|
|
257
377
|
type_location: location_decl_to_pin_location(decl.location),
|
|
258
378
|
comments: comments,
|
|
259
379
|
source: :rbs
|
|
260
380
|
)
|
|
261
|
-
|
|
262
|
-
rooted_tag =
|
|
381
|
+
rooted_tag = type.rooted_tags
|
|
382
|
+
rooted_tag = "#{base}<#{rooted_tag}>" if base
|
|
263
383
|
constant_pin.docstring.add_tag(YARD::Tags::Tag.new(:return, '', rooted_tag))
|
|
264
384
|
constant_pin
|
|
265
385
|
end
|
|
@@ -268,27 +388,27 @@ module Solargraph
|
|
|
268
388
|
# @return [void]
|
|
269
389
|
def class_alias_decl_to_pin decl
|
|
270
390
|
# See https://www.rubydoc.info/gems/rbs/3.4.3/RBS/AST/Declarations/ClassAlias
|
|
271
|
-
new_name = decl.new_name
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
pins.push create_constant(new_name, old_name, decl.comment&.string, decl, 'Class')
|
|
391
|
+
new_name = fqns(decl.new_name)
|
|
392
|
+
old_type = build_type(decl.old_name)
|
|
393
|
+
pins.push create_constant(new_name, old_type, decl.comment&.string, decl, '::Class')
|
|
275
394
|
end
|
|
276
395
|
|
|
277
396
|
# @param decl [RBS::AST::Declarations::ModuleAlias]
|
|
278
397
|
# @return [void]
|
|
279
398
|
def module_alias_decl_to_pin decl
|
|
280
399
|
# See https://www.rubydoc.info/gems/rbs/3.4.3/RBS/AST/Declarations/ModuleAlias
|
|
281
|
-
new_name = decl.new_name
|
|
282
|
-
|
|
400
|
+
new_name = fqns(decl.new_name)
|
|
401
|
+
old_type = build_type(decl.old_name)
|
|
283
402
|
|
|
284
|
-
pins.push create_constant(new_name,
|
|
403
|
+
pins.push create_constant(new_name, old_type, decl.comment&.string, decl, '::Module')
|
|
285
404
|
end
|
|
286
405
|
|
|
287
406
|
# @param decl [RBS::AST::Declarations::Constant]
|
|
288
407
|
# @return [void]
|
|
289
408
|
def constant_decl_to_pin decl
|
|
290
|
-
|
|
291
|
-
|
|
409
|
+
target_type = other_type_to_type(decl.type)
|
|
410
|
+
constant_name = fqns(decl.name)
|
|
411
|
+
pins.push create_constant(constant_name, target_type, decl.comment&.string, decl)
|
|
292
412
|
end
|
|
293
413
|
|
|
294
414
|
# @param decl [RBS::AST::Declarations::Global]
|
|
@@ -303,12 +423,11 @@ module Solargraph
|
|
|
303
423
|
type_location: location_decl_to_pin_location(decl.location),
|
|
304
424
|
source: :rbs
|
|
305
425
|
)
|
|
306
|
-
rooted_tag =
|
|
426
|
+
rooted_tag = other_type_to_type(decl.type).rooted_tags
|
|
307
427
|
pin.docstring.add_tag(YARD::Tags::Tag.new(:type, '', rooted_tag))
|
|
308
428
|
pins.push pin
|
|
309
429
|
end
|
|
310
430
|
|
|
311
|
-
|
|
312
431
|
# Visibility overrides that will allow the Solargraph project
|
|
313
432
|
# and plugins to pass typechecking using SOLARGRAPH_ASSERTS=on,
|
|
314
433
|
# so that we can detect any regressions/issues elsewhere in the
|
|
@@ -324,42 +443,45 @@ module Solargraph
|
|
|
324
443
|
# allow that to be extended via .solargraph.yml
|
|
325
444
|
# @type [Hash{Array(String, Symbol, String) => Symbol}
|
|
326
445
|
VISIBILITY_OVERRIDE = {
|
|
327
|
-
[
|
|
446
|
+
['Rails::Engine', :instance, 'run_tasks_blocks'] => :protected,
|
|
328
447
|
# Should have been marked as both instance and class method in module -e.g., 'module_function'
|
|
329
|
-
[
|
|
448
|
+
['Kernel', :instance, 'pretty_inspect'] => :private,
|
|
330
449
|
# marked incorrectly in RBS
|
|
331
|
-
[
|
|
332
|
-
[
|
|
333
|
-
[
|
|
334
|
-
[
|
|
335
|
-
[
|
|
336
|
-
[
|
|
337
|
-
[
|
|
338
|
-
[
|
|
339
|
-
[
|
|
340
|
-
[
|
|
341
|
-
[
|
|
342
|
-
[
|
|
343
|
-
[
|
|
344
|
-
[
|
|
345
|
-
[
|
|
346
|
-
[
|
|
347
|
-
[
|
|
348
|
-
}
|
|
349
|
-
|
|
350
|
-
|
|
450
|
+
['WEBrick::HTTPUtils::FormData', :instance, 'next_data'] => :protected,
|
|
451
|
+
['Rails::Command', :class, 'command_type'] => :private,
|
|
452
|
+
['Rails::Command', :class, 'lookup_paths'] => :private,
|
|
453
|
+
['Rails::Command', :class, 'file_lookup_paths'] => :private,
|
|
454
|
+
['Rails::Railtie', :instance, 'run_console_blocks'] => :protected,
|
|
455
|
+
['Rails::Railtie', :instance, 'run_generators_blocks'] => :protected,
|
|
456
|
+
['Rails::Railtie', :instance, 'run_runner_blocks'] => :protected,
|
|
457
|
+
['Rails::Railtie', :instance, 'run_tasks_blocks'] => :protected,
|
|
458
|
+
['ActionController::Base', :instance, '_protected_ivars'] => :private,
|
|
459
|
+
['ActionView::Template', :instance, 'method_name'] => :public,
|
|
460
|
+
['Module', :instance, 'ruby2_keywords'] => :private,
|
|
461
|
+
['Nokogiri::XML::Node', :instance, 'coerce'] => :protected,
|
|
462
|
+
['Nokogiri::XML::Document', :class, 'empty_doc?'] => :private,
|
|
463
|
+
['Nokogiri::Decorators::Slop', :instance, 'respond_to_missing?'] => :public,
|
|
464
|
+
['RuboCop::Cop::RangeHelp', :instance, 'source_range'] => :private,
|
|
465
|
+
['AST::Node', :instance, 'original_dup'] => :private,
|
|
466
|
+
['Rainbow::Presenter', :instance, 'wrap_with_sgr'] => :private
|
|
467
|
+
}.freeze
|
|
468
|
+
private_constant :VISIBILITY_OVERRIDE
|
|
469
|
+
|
|
470
|
+
# @param decl [RBS::AST::Members::MethodDefinition, RBS::AST::Members::AttrReader,
|
|
471
|
+
# RBS::AST::Members::AttrWriter, RBS::AST::Members::AttrAccessor]
|
|
351
472
|
# @param closure [Pin::Closure]
|
|
352
473
|
# @param context [Context]
|
|
353
474
|
# @param scope [Symbol] :instance or :class
|
|
354
475
|
# @param name [String] The name of the method
|
|
355
|
-
# @sg-ignore
|
|
356
476
|
# @return [Symbol]
|
|
357
|
-
def calculate_method_visibility
|
|
477
|
+
def calculate_method_visibility decl, context, closure, scope, name
|
|
358
478
|
override_key = [closure.path, scope, name]
|
|
359
479
|
visibility = VISIBILITY_OVERRIDE[override_key]
|
|
360
480
|
simple_override_key = [closure.path, scope]
|
|
361
481
|
visibility ||= VISIBILITY_OVERRIDE[simple_override_key]
|
|
362
|
-
|
|
482
|
+
if closure.path == 'Kernel' && Kernel.private_instance_methods(false).include?(decl.name)
|
|
483
|
+
visibility ||= :private
|
|
484
|
+
end
|
|
363
485
|
if decl.kind == :singleton_instance
|
|
364
486
|
# this is a 'module function'
|
|
365
487
|
visibility ||= :private
|
|
@@ -379,7 +501,9 @@ module Solargraph
|
|
|
379
501
|
# having different type params / orders - we may need to match
|
|
380
502
|
# this data model and have generics live in signatures to
|
|
381
503
|
# handle those correctly
|
|
382
|
-
generics = decl.overloads.map(&:method_type).
|
|
504
|
+
generics = decl.overloads.map(&:method_type).map do |method_type|
|
|
505
|
+
type_parameter_names method_type
|
|
506
|
+
end
|
|
383
507
|
|
|
384
508
|
if decl.instance?
|
|
385
509
|
name = decl.name.to_s
|
|
@@ -403,24 +527,23 @@ module Solargraph
|
|
|
403
527
|
pin.instance_variable_set(:@return_type, ComplexType::VOID)
|
|
404
528
|
end
|
|
405
529
|
end
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
end
|
|
530
|
+
return unless decl.singleton?
|
|
531
|
+
final_scope = :class
|
|
532
|
+
name = decl.name.to_s
|
|
533
|
+
visibility = calculate_method_visibility(decl, context, closure, final_scope, name)
|
|
534
|
+
pin = Solargraph::Pin::Method.new(
|
|
535
|
+
name: name,
|
|
536
|
+
closure: closure,
|
|
537
|
+
comments: decl.comment&.string,
|
|
538
|
+
type_location: location_decl_to_pin_location(decl.location),
|
|
539
|
+
visibility: visibility,
|
|
540
|
+
scope: final_scope,
|
|
541
|
+
signatures: [],
|
|
542
|
+
generics: generics,
|
|
543
|
+
source: :rbs
|
|
544
|
+
)
|
|
545
|
+
pin.signatures.concat method_def_to_sigs(decl, pin)
|
|
546
|
+
pins.push pin
|
|
424
547
|
end
|
|
425
548
|
|
|
426
549
|
# @param decl [RBS::AST::Members::MethodDefinition]
|
|
@@ -430,38 +553,45 @@ module Solargraph
|
|
|
430
553
|
# @param overload [RBS::AST::Members::MethodDefinition::Overload]
|
|
431
554
|
decl.overloads.map do |overload|
|
|
432
555
|
type_location = location_decl_to_pin_location(overload.method_type.location)
|
|
433
|
-
generics = overload.method_type
|
|
556
|
+
generics = type_parameter_names(overload.method_type)
|
|
434
557
|
signature_parameters, signature_return_type = parts_of_function(overload.method_type, pin)
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
558
|
+
rbs_block = overload.method_type.block
|
|
559
|
+
block = if rbs_block
|
|
560
|
+
block_parameters, block_return_type = parts_of_function(rbs_block, pin)
|
|
561
|
+
Pin::Signature.new(generics: generics, parameters: block_parameters,
|
|
562
|
+
return_type: block_return_type, source: :rbs,
|
|
438
563
|
type_location: type_location, closure: pin)
|
|
439
564
|
end
|
|
440
|
-
Pin::Signature.new(generics: generics, parameters: signature_parameters,
|
|
565
|
+
Pin::Signature.new(generics: generics, parameters: signature_parameters,
|
|
566
|
+
return_type: signature_return_type, block: block, source: :rbs,
|
|
441
567
|
type_location: type_location, closure: pin)
|
|
442
568
|
end
|
|
443
569
|
end
|
|
444
570
|
|
|
445
571
|
# @param location [RBS::Location, nil]
|
|
446
572
|
# @return [Solargraph::Location, nil]
|
|
447
|
-
def location_decl_to_pin_location
|
|
573
|
+
def location_decl_to_pin_location location
|
|
448
574
|
return nil if location&.name.nil?
|
|
449
575
|
|
|
576
|
+
# @sg-ignore flow sensitive typing should handle return nil if location&.name.nil?
|
|
450
577
|
start_pos = Position.new(location.start_line - 1, location.start_column)
|
|
578
|
+
# @sg-ignore flow sensitive typing should handle return nil if location&.name.nil?
|
|
451
579
|
end_pos = Position.new(location.end_line - 1, location.end_column)
|
|
452
580
|
range = Range.new(start_pos, end_pos)
|
|
581
|
+
# @sg-ignore flow sensitve typing should handle return nil if location&.name.nil?
|
|
453
582
|
Location.new(location.name.to_s, range)
|
|
454
583
|
end
|
|
455
584
|
|
|
456
|
-
# @param type [RBS::MethodType,RBS::Types::Block]
|
|
585
|
+
# @param type [RBS::MethodType, RBS::Types::Block]
|
|
457
586
|
# @param pin [Pin::Method]
|
|
458
587
|
# @return [Array(Array<Pin::Parameter>, ComplexType)]
|
|
459
588
|
def parts_of_function type, pin
|
|
460
589
|
type_location = pin.type_location
|
|
461
590
|
if defined?(RBS::Types::UntypedFunction) && type.type.is_a?(RBS::Types::UntypedFunction)
|
|
462
591
|
return [
|
|
463
|
-
[Solargraph::Pin::Parameter.new(decl: :restarg, name: 'arg', closure: pin, source: :rbs,
|
|
464
|
-
|
|
592
|
+
[Solargraph::Pin::Parameter.new(decl: :restarg, name: 'arg', closure: pin, source: :rbs,
|
|
593
|
+
type_location: type_location)],
|
|
594
|
+
method_type_to_type(type)
|
|
465
595
|
]
|
|
466
596
|
end
|
|
467
597
|
|
|
@@ -470,41 +600,43 @@ module Solargraph
|
|
|
470
600
|
type.type.required_positionals.each do |param|
|
|
471
601
|
# @sg-ignore RBS generic type understanding issue
|
|
472
602
|
name = param.name ? param.name.to_s : "arg_#{arg_num += 1}"
|
|
473
|
-
|
|
474
|
-
|
|
603
|
+
parameters.push Solargraph::Pin::Parameter.new(decl: :arg, name: name, closure: pin,
|
|
604
|
+
# @sg-ignore RBS generic type understanding issue
|
|
605
|
+
return_type: other_type_to_type(param.type),
|
|
606
|
+
source: :rbs, type_location: type_location)
|
|
475
607
|
end
|
|
476
608
|
type.type.optional_positionals.each do |param|
|
|
477
609
|
# @sg-ignore RBS generic type understanding issue
|
|
478
610
|
name = param.name ? param.name.to_s : "arg_#{arg_num += 1}"
|
|
479
611
|
parameters.push Solargraph::Pin::Parameter.new(decl: :optarg, name: name, closure: pin,
|
|
480
612
|
# @sg-ignore RBS generic type understanding issue
|
|
481
|
-
return_type:
|
|
613
|
+
return_type: other_type_to_type(param.type),
|
|
482
614
|
type_location: type_location,
|
|
483
615
|
source: :rbs)
|
|
484
616
|
end
|
|
485
617
|
if type.type.rest_positionals
|
|
486
618
|
name = type.type.rest_positionals.name ? type.type.rest_positionals.name.to_s : "arg_#{arg_num += 1}"
|
|
487
|
-
inner_rest_positional_type =
|
|
488
|
-
ComplexType.try_parse(other_type_to_tag(type.type.rest_positionals.type))
|
|
619
|
+
inner_rest_positional_type = other_type_to_type(type.type.rest_positionals.type)
|
|
489
620
|
rest_positional_type = ComplexType::UniqueType.new('Array',
|
|
490
621
|
[],
|
|
491
622
|
[inner_rest_positional_type],
|
|
492
623
|
rooted: true, parameters_type: :list)
|
|
493
624
|
parameters.push Solargraph::Pin::Parameter.new(decl: :restarg, name: name, closure: pin,
|
|
494
625
|
source: :rbs, type_location: type_location,
|
|
495
|
-
return_type: rest_positional_type
|
|
626
|
+
return_type: rest_positional_type)
|
|
496
627
|
end
|
|
497
628
|
type.type.trailing_positionals.each do |param|
|
|
498
629
|
# @sg-ignore RBS generic type understanding issue
|
|
499
630
|
name = param.name ? param.name.to_s : "arg_#{arg_num += 1}"
|
|
500
|
-
parameters.push Solargraph::Pin::Parameter.new(decl: :arg, name: name, closure: pin, source: :rbs,
|
|
631
|
+
parameters.push Solargraph::Pin::Parameter.new(decl: :arg, name: name, closure: pin, source: :rbs,
|
|
632
|
+
type_location: type_location)
|
|
501
633
|
end
|
|
502
634
|
type.type.required_keywords.each do |orig, param|
|
|
503
635
|
# @sg-ignore RBS generic type understanding issue
|
|
504
636
|
name = orig ? orig.to_s : "arg_#{arg_num += 1}"
|
|
505
637
|
parameters.push Solargraph::Pin::Parameter.new(decl: :kwarg, name: name, closure: pin,
|
|
506
638
|
# @sg-ignore RBS generic type understanding issue
|
|
507
|
-
return_type:
|
|
639
|
+
return_type: other_type_to_type(param.type),
|
|
508
640
|
source: :rbs, type_location: type_location)
|
|
509
641
|
end
|
|
510
642
|
type.type.optional_keywords.each do |orig, param|
|
|
@@ -512,18 +644,18 @@ module Solargraph
|
|
|
512
644
|
name = orig ? orig.to_s : "arg_#{arg_num += 1}"
|
|
513
645
|
parameters.push Solargraph::Pin::Parameter.new(decl: :kwoptarg, name: name, closure: pin,
|
|
514
646
|
# @sg-ignore RBS generic type understanding issue
|
|
515
|
-
return_type:
|
|
647
|
+
return_type: other_type_to_type(param.type),
|
|
516
648
|
type_location: type_location,
|
|
517
649
|
source: :rbs)
|
|
518
650
|
end
|
|
519
651
|
if type.type.rest_keywords
|
|
520
652
|
name = type.type.rest_keywords.name ? type.type.rest_keywords.name.to_s : "arg_#{arg_num += 1}"
|
|
521
|
-
parameters.push Solargraph::Pin::Parameter.new(decl: :kwrestarg,
|
|
653
|
+
parameters.push Solargraph::Pin::Parameter.new(decl: :kwrestarg,
|
|
654
|
+
name: type.type.rest_keywords.name.to_s, closure: pin,
|
|
522
655
|
source: :rbs, type_location: type_location)
|
|
523
656
|
end
|
|
524
657
|
|
|
525
|
-
|
|
526
|
-
return_type = ComplexType.try_parse(rooted_tag).force_rooted
|
|
658
|
+
return_type = method_type_to_type(type)
|
|
527
659
|
[parameters, return_type]
|
|
528
660
|
end
|
|
529
661
|
|
|
@@ -531,7 +663,7 @@ module Solargraph
|
|
|
531
663
|
# @param closure [Pin::Namespace]
|
|
532
664
|
# @param context [Context]
|
|
533
665
|
# @return [void]
|
|
534
|
-
def attr_reader_to_pin
|
|
666
|
+
def attr_reader_to_pin decl, closure, context
|
|
535
667
|
name = decl.name.to_s
|
|
536
668
|
final_scope = decl.kind == :instance ? :instance : :class
|
|
537
669
|
visibility = calculate_method_visibility(decl, context, closure, final_scope, name)
|
|
@@ -545,9 +677,11 @@ module Solargraph
|
|
|
545
677
|
visibility: visibility,
|
|
546
678
|
source: :rbs
|
|
547
679
|
)
|
|
548
|
-
rooted_tag =
|
|
680
|
+
rooted_tag = other_type_to_type(decl.type).rooted_tags
|
|
549
681
|
pin.docstring.add_tag(YARD::Tags::Tag.new(:return, '', rooted_tag))
|
|
550
|
-
logger.debug
|
|
682
|
+
logger.debug do
|
|
683
|
+
"Conversions#attr_reader_to_pin(name=#{name.inspect}, visibility=#{visibility.inspect}) => #{pin.inspect}"
|
|
684
|
+
end
|
|
551
685
|
pins.push pin
|
|
552
686
|
end
|
|
553
687
|
|
|
@@ -555,9 +689,9 @@ module Solargraph
|
|
|
555
689
|
# @param closure [Pin::Namespace]
|
|
556
690
|
# @param context [Context]
|
|
557
691
|
# @return [void]
|
|
558
|
-
def attr_writer_to_pin
|
|
692
|
+
def attr_writer_to_pin decl, closure, context
|
|
559
693
|
final_scope = decl.kind == :instance ? :instance : :class
|
|
560
|
-
name = "#{decl.name
|
|
694
|
+
name = "#{decl.name}="
|
|
561
695
|
visibility = calculate_method_visibility(decl, context, closure, final_scope, name)
|
|
562
696
|
type_location = location_decl_to_pin_location(decl.location)
|
|
563
697
|
pin = Solargraph::Pin::Method.new(
|
|
@@ -574,13 +708,13 @@ module Solargraph
|
|
|
574
708
|
pin.parameters <<
|
|
575
709
|
Solargraph::Pin::Parameter.new(
|
|
576
710
|
name: 'value',
|
|
577
|
-
return_type:
|
|
711
|
+
return_type: other_type_to_type(decl.type),
|
|
578
712
|
source: :rbs,
|
|
579
713
|
closure: pin,
|
|
580
714
|
type_location: type_location
|
|
581
715
|
)
|
|
582
|
-
|
|
583
|
-
pin.docstring.add_tag(YARD::Tags::Tag.new(:return, '',
|
|
716
|
+
rooted_tags = other_type_to_type(decl.type).rooted_tags
|
|
717
|
+
pin.docstring.add_tag(YARD::Tags::Tag.new(:return, '', rooted_tags))
|
|
584
718
|
pins.push pin
|
|
585
719
|
end
|
|
586
720
|
|
|
@@ -588,7 +722,7 @@ module Solargraph
|
|
|
588
722
|
# @param closure [Pin::Namespace]
|
|
589
723
|
# @param context [Context]
|
|
590
724
|
# @return [void]
|
|
591
|
-
def attr_accessor_to_pin
|
|
725
|
+
def attr_accessor_to_pin decl, closure, context
|
|
592
726
|
attr_reader_to_pin(decl, closure, context)
|
|
593
727
|
attr_writer_to_pin(decl, closure, context)
|
|
594
728
|
end
|
|
@@ -596,7 +730,7 @@ module Solargraph
|
|
|
596
730
|
# @param decl [RBS::AST::Members::InstanceVariable]
|
|
597
731
|
# @param closure [Pin::Namespace]
|
|
598
732
|
# @return [void]
|
|
599
|
-
def ivar_to_pin
|
|
733
|
+
def ivar_to_pin decl, closure
|
|
600
734
|
pin = Solargraph::Pin::InstanceVariable.new(
|
|
601
735
|
name: decl.name.to_s,
|
|
602
736
|
closure: closure,
|
|
@@ -604,7 +738,7 @@ module Solargraph
|
|
|
604
738
|
comments: decl.comment&.string,
|
|
605
739
|
source: :rbs
|
|
606
740
|
)
|
|
607
|
-
rooted_tag =
|
|
741
|
+
rooted_tag = other_type_to_type(decl.type).rooted_tags
|
|
608
742
|
pin.docstring.add_tag(YARD::Tags::Tag.new(:type, '', rooted_tag))
|
|
609
743
|
pins.push pin
|
|
610
744
|
end
|
|
@@ -612,7 +746,7 @@ module Solargraph
|
|
|
612
746
|
# @param decl [RBS::AST::Members::ClassVariable]
|
|
613
747
|
# @param closure [Pin::Namespace]
|
|
614
748
|
# @return [void]
|
|
615
|
-
def cvar_to_pin
|
|
749
|
+
def cvar_to_pin decl, closure
|
|
616
750
|
name = decl.name.to_s
|
|
617
751
|
pin = Solargraph::Pin::ClassVariable.new(
|
|
618
752
|
name: name,
|
|
@@ -621,7 +755,7 @@ module Solargraph
|
|
|
621
755
|
type_location: location_decl_to_pin_location(decl.location),
|
|
622
756
|
source: :rbs
|
|
623
757
|
)
|
|
624
|
-
rooted_tag =
|
|
758
|
+
rooted_tag = other_type_to_type(decl.type).rooted_tags
|
|
625
759
|
pin.docstring.add_tag(YARD::Tags::Tag.new(:type, '', rooted_tag))
|
|
626
760
|
pins.push pin
|
|
627
761
|
end
|
|
@@ -629,7 +763,7 @@ module Solargraph
|
|
|
629
763
|
# @param decl [RBS::AST::Members::ClassInstanceVariable]
|
|
630
764
|
# @param closure [Pin::Namespace]
|
|
631
765
|
# @return [void]
|
|
632
|
-
def civar_to_pin
|
|
766
|
+
def civar_to_pin decl, closure
|
|
633
767
|
name = decl.name.to_s
|
|
634
768
|
pin = Solargraph::Pin::InstanceVariable.new(
|
|
635
769
|
name: name,
|
|
@@ -638,7 +772,7 @@ module Solargraph
|
|
|
638
772
|
type_location: location_decl_to_pin_location(decl.location),
|
|
639
773
|
source: :rbs
|
|
640
774
|
)
|
|
641
|
-
rooted_tag =
|
|
775
|
+
rooted_tag = other_type_to_type(decl.type).rooted_tags
|
|
642
776
|
pin.docstring.add_tag(YARD::Tags::Tag.new(:type, '', rooted_tag))
|
|
643
777
|
pins.push pin
|
|
644
778
|
end
|
|
@@ -648,9 +782,9 @@ module Solargraph
|
|
|
648
782
|
# @return [void]
|
|
649
783
|
def include_to_pin decl, closure
|
|
650
784
|
type = build_type(decl.name, decl.args)
|
|
651
|
-
generic_values = type.all_params.map(&:
|
|
785
|
+
generic_values = type.all_params.map(&:rooted_tags)
|
|
652
786
|
pins.push Solargraph::Pin::Reference::Include.new(
|
|
653
|
-
name:
|
|
787
|
+
name: type.rooted_name, # reference pins use rooted names
|
|
654
788
|
type_location: location_decl_to_pin_location(decl.location),
|
|
655
789
|
generic_values: generic_values,
|
|
656
790
|
closure: closure,
|
|
@@ -662,9 +796,12 @@ module Solargraph
|
|
|
662
796
|
# @param closure [Pin::Namespace]
|
|
663
797
|
# @return [void]
|
|
664
798
|
def prepend_to_pin decl, closure
|
|
799
|
+
type = build_type(decl.name, decl.args)
|
|
800
|
+
generic_values = type.all_params.map(&:rooted_tags)
|
|
665
801
|
pins.push Solargraph::Pin::Reference::Prepend.new(
|
|
666
|
-
name:
|
|
802
|
+
name: type.rooted_name, # reference pins use rooted names
|
|
667
803
|
type_location: location_decl_to_pin_location(decl.location),
|
|
804
|
+
generic_values: generic_values,
|
|
668
805
|
closure: closure,
|
|
669
806
|
source: :rbs
|
|
670
807
|
)
|
|
@@ -674,9 +811,12 @@ module Solargraph
|
|
|
674
811
|
# @param closure [Pin::Namespace]
|
|
675
812
|
# @return [void]
|
|
676
813
|
def extend_to_pin decl, closure
|
|
814
|
+
type = build_type(decl.name, decl.args)
|
|
815
|
+
generic_values = type.all_params.map(&:rooted_tags)
|
|
677
816
|
pins.push Solargraph::Pin::Reference::Extend.new(
|
|
678
|
-
name:
|
|
817
|
+
name: type.rooted_name, # reference pins use rooted names
|
|
679
818
|
type_location: location_decl_to_pin_location(decl.location),
|
|
819
|
+
generic_values: generic_values,
|
|
680
820
|
closure: closure,
|
|
681
821
|
source: :rbs
|
|
682
822
|
)
|
|
@@ -693,114 +833,103 @@ module Solargraph
|
|
|
693
833
|
original: decl.old_name.to_s,
|
|
694
834
|
closure: closure,
|
|
695
835
|
scope: final_scope,
|
|
696
|
-
source: :rbs
|
|
836
|
+
source: :rbs
|
|
697
837
|
)
|
|
698
838
|
end
|
|
699
839
|
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
'int' => 'Integer',
|
|
704
|
-
'untyped' => '',
|
|
705
|
-
'NilClass' => 'nil'
|
|
706
|
-
}
|
|
707
|
-
|
|
708
|
-
# @param type [RBS::MethodType]
|
|
709
|
-
# @return [String]
|
|
710
|
-
def method_type_to_tag type
|
|
840
|
+
# @param type [RBS::MethodType, RBS::Types::Block]
|
|
841
|
+
# @return [ComplexType, ComplexType::UniqueType]
|
|
842
|
+
def method_type_to_type type
|
|
711
843
|
if type_aliases.key?(type.type.return_type.to_s)
|
|
712
|
-
|
|
844
|
+
other_type_to_type(type_aliases[type.type.return_type.to_s].type)
|
|
713
845
|
else
|
|
714
|
-
|
|
846
|
+
other_type_to_type type.type.return_type
|
|
715
847
|
end
|
|
716
848
|
end
|
|
717
849
|
|
|
718
|
-
# @param
|
|
719
|
-
#
|
|
720
|
-
#
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
ComplexType
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
"#{other_type_to_tag(type.type)}, nil"
|
|
745
|
-
elsif type.is_a?(RBS::Types::Bases::Any)
|
|
746
|
-
'undefined'
|
|
747
|
-
elsif type.is_a?(RBS::Types::Bases::Bool)
|
|
748
|
-
'Boolean'
|
|
749
|
-
elsif type.is_a?(RBS::Types::Tuple)
|
|
750
|
-
"Array(#{type.types.map { |t| other_type_to_tag(t) }.join(', ')})"
|
|
751
|
-
elsif type.is_a?(RBS::Types::Literal)
|
|
752
|
-
type.literal.inspect
|
|
753
|
-
elsif type.is_a?(RBS::Types::Union)
|
|
754
|
-
type.types.map { |t| other_type_to_tag(t) }.join(', ')
|
|
755
|
-
elsif type.is_a?(RBS::Types::Record)
|
|
850
|
+
# @param type [RBS::Types::Bases::Base,Object] RBS type object.
|
|
851
|
+
# Note: Generally these extend from RBS::Types::Bases::Base,
|
|
852
|
+
# but not all.
|
|
853
|
+
#
|
|
854
|
+
# @return [ComplexType, ComplexType::UniqueType]
|
|
855
|
+
def other_type_to_type type
|
|
856
|
+
case type
|
|
857
|
+
when RBS::Types::Optional
|
|
858
|
+
# @sg-ignore flow based typing needs to understand case when class pattern
|
|
859
|
+
ComplexType.new([other_type_to_type(type.type),
|
|
860
|
+
ComplexType::UniqueType::NIL])
|
|
861
|
+
when RBS::Types::Bases::Any
|
|
862
|
+
ComplexType::UNDEFINED
|
|
863
|
+
when RBS::Types::Bases::Bool
|
|
864
|
+
ComplexType::BOOLEAN
|
|
865
|
+
when RBS::Types::Tuple
|
|
866
|
+
# @sg-ignore flow based typing needs to understand case when class pattern
|
|
867
|
+
tuple_types = type.types.map { |t| other_type_to_type(t) }
|
|
868
|
+
ComplexType::UniqueType.new('Array', [], tuple_types, rooted: true, parameters_type: :fixed)
|
|
869
|
+
when RBS::Types::Literal
|
|
870
|
+
# @sg-ignore flow based typing needs to understand case when class pattern
|
|
871
|
+
ComplexType.try_parse(type.literal.inspect).force_rooted
|
|
872
|
+
when RBS::Types::Union
|
|
873
|
+
# @sg-ignore flow based typing needs to understand case when class pattern
|
|
874
|
+
ComplexType.new(type.types.map { |t| other_type_to_type(t) })
|
|
875
|
+
when RBS::Types::Record
|
|
756
876
|
# @todo Better record support
|
|
757
|
-
'Hash'
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
877
|
+
ComplexType::UniqueType.new('Hash', rooted: true)
|
|
878
|
+
when RBS::Types::Bases::Nil
|
|
879
|
+
ComplexType::NIL
|
|
880
|
+
when RBS::Types::Bases::Self
|
|
881
|
+
ComplexType::SELF
|
|
882
|
+
when RBS::Types::Bases::Void
|
|
883
|
+
ComplexType::VOID
|
|
884
|
+
when RBS::Types::Variable
|
|
885
|
+
# @sg-ignore flow based typing needs to understand case when class pattern
|
|
886
|
+
ComplexType.parse("generic<#{type.name}>").force_rooted
|
|
887
|
+
when RBS::Types::ClassInstance # && !type.args.empty?
|
|
888
|
+
# @sg-ignore flow based typing needs to understand case when class pattern
|
|
889
|
+
build_type(type.name, type.args)
|
|
890
|
+
when RBS::Types::Bases::Instance
|
|
891
|
+
ComplexType::SELF
|
|
892
|
+
when RBS::Types::Bases::Top
|
|
771
893
|
# top is the most super superclass
|
|
772
|
-
'BasicObject'
|
|
773
|
-
|
|
894
|
+
ComplexType::UniqueType.new('BasicObject', rooted: true)
|
|
895
|
+
when RBS::Types::Bases::Bottom
|
|
774
896
|
# bottom is used in contexts where nothing will ever return
|
|
775
897
|
# - e.g., it could be the return type of 'exit()' or 'raise'
|
|
776
898
|
#
|
|
777
899
|
# @todo define a specific bottom type and use it to
|
|
778
900
|
# determine dead code
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
901
|
+
ComplexType::UNDEFINED
|
|
902
|
+
when RBS::Types::Intersection
|
|
903
|
+
# @sg-ignore flow based typing needs to understand case when class pattern
|
|
904
|
+
ComplexType.new(type.types.map { |member| other_type_to_type(member) })
|
|
905
|
+
when RBS::Types::Proc
|
|
906
|
+
ComplexType::UniqueType.new('Proc', rooted: true)
|
|
907
|
+
when RBS::Types::Alias
|
|
785
908
|
# type-level alias use - e.g., 'bool' in "type bool = true | false"
|
|
786
909
|
# @todo ensure these get resolved after processing all aliases
|
|
787
910
|
# @todo handle recursive aliases
|
|
788
|
-
|
|
789
|
-
|
|
911
|
+
# @sg-ignore flow based typing needs to understand case when class pattern
|
|
912
|
+
build_type(type.name, type.args)
|
|
913
|
+
when RBS::Types::Interface
|
|
790
914
|
# represents a mix-in module which can be considered a
|
|
791
915
|
# subtype of a consumer of it
|
|
792
|
-
|
|
793
|
-
|
|
916
|
+
# @sg-ignore flow based typing needs to understand case when class pattern
|
|
917
|
+
build_type(type.name, type.args)
|
|
918
|
+
when RBS::Types::ClassSingleton
|
|
794
919
|
# e.g., singleton(String)
|
|
795
|
-
|
|
920
|
+
# @sg-ignore flow based typing needs to understand case when class pattern
|
|
921
|
+
build_type(type.name)
|
|
796
922
|
else
|
|
923
|
+
# RBS doesn't provide a common base class for its type AST nodes
|
|
924
|
+
#
|
|
925
|
+
# @sg-ignore all types should include location
|
|
797
926
|
Solargraph.logger.warn "Unrecognized RBS type: #{type.class} at #{type.location}"
|
|
798
|
-
|
|
927
|
+
ComplexType::UNDEFINED
|
|
799
928
|
end
|
|
800
929
|
end
|
|
801
930
|
|
|
802
931
|
# @param decl [RBS::AST::Declarations::Class, RBS::AST::Declarations::Module]
|
|
803
|
-
# @param namespace [Pin::Namespace]
|
|
932
|
+
# @param namespace [Pin::Namespace, nil]
|
|
804
933
|
# @return [void]
|
|
805
934
|
def add_mixins decl, namespace
|
|
806
935
|
# @param mixin [RBS::AST::Members::Include, RBS::AST::Members::Members::Extend, RBS::AST::Members::Members::Prepend]
|
|
@@ -808,9 +937,9 @@ module Solargraph
|
|
|
808
937
|
# @todo are we handling prepend correctly?
|
|
809
938
|
klass = mixin.is_a?(RBS::AST::Members::Include) ? Pin::Reference::Include : Pin::Reference::Extend
|
|
810
939
|
type = build_type(mixin.name, mixin.args)
|
|
811
|
-
generic_values = type.all_params.map(&:
|
|
940
|
+
generic_values = type.all_params.map(&:rooted_tags)
|
|
812
941
|
pins.push klass.new(
|
|
813
|
-
name:
|
|
942
|
+
name: type.rooted_name, # reference pins use rooted names
|
|
814
943
|
type_location: location_decl_to_pin_location(mixin.location),
|
|
815
944
|
generic_values: generic_values,
|
|
816
945
|
closure: namespace,
|