solargraph 0.58.3 → 0.60.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/.github/workflows/linting.yml +12 -5
- data/.github/workflows/plugins.yml +54 -34
- data/.github/workflows/rspec.yml +18 -28
- data/.github/workflows/typecheck.yml +6 -3
- data/.rubocop.yml +39 -6
- data/.rubocop_todo.yml +53 -966
- data/CHANGELOG.md +35 -0
- data/Gemfile +6 -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 +12 -3
- data/lib/solargraph/api_map/index.rb +42 -20
- data/lib/solargraph/api_map/source_to_yard.rb +22 -9
- data/lib/solargraph/api_map/store.rb +61 -36
- data/lib/solargraph/api_map.rb +192 -78
- data/lib/solargraph/bench.rb +2 -3
- data/lib/solargraph/complex_type/conformance.rb +176 -0
- data/lib/solargraph/complex_type/type_methods.rb +31 -18
- data/lib/solargraph/complex_type/unique_type.rb +225 -63
- data/lib/solargraph/complex_type.rb +177 -59
- data/lib/solargraph/convention/active_support_concern.rb +111 -111
- data/lib/solargraph/convention/base.rb +50 -50
- data/lib/solargraph/convention/data_definition/data_assignment_node.rb +1 -1
- 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 +1 -1
- data/lib/solargraph/convention/gemspec.rb +1 -1
- data/lib/solargraph/convention/rakefile.rb +1 -1
- 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 +2 -2
- data/lib/solargraph/converters/dd.rb +2 -0
- data/lib/solargraph/converters/dl.rb +2 -0
- data/lib/solargraph/converters/dt.rb +2 -0
- data/lib/solargraph/converters/misc.rb +2 -0
- 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 +4 -8
- data/lib/solargraph/diagnostics.rb +55 -55
- data/lib/solargraph/doc_map.rb +39 -39
- data/lib/solargraph/environ.rb +52 -52
- data/lib/solargraph/equality.rb +4 -4
- data/lib/solargraph/gem_pins.rb +4 -15
- data/lib/solargraph/language_server/error_codes.rb +10 -10
- 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 +35 -28
- data/lib/solargraph/language_server/message/base.rb +1 -1
- data/lib/solargraph/language_server/message/client/register_capability.rb +1 -3
- data/lib/solargraph/language_server/message/completion_item/resolve.rb +6 -8
- 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 +7 -7
- data/lib/solargraph/language_server/message/extended/download_core.rb +2 -1
- data/lib/solargraph/language_server/message/extended/environment.rb +25 -25
- data/lib/solargraph/language_server/message/extended/search.rb +1 -1
- data/lib/solargraph/language_server/message/initialize.rb +20 -14
- data/lib/solargraph/language_server/message/initialized.rb +28 -28
- 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 +17 -10
- 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 +13 -6
- data/lib/solargraph/language_server/message/text_document/references.rb +17 -10
- data/lib/solargraph/language_server/message/text_document/rename.rb +20 -13
- 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/text_document.rb +28 -28
- data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +34 -28
- data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +38 -30
- data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +23 -17
- data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +27 -17
- data/lib/solargraph/language_server/message.rb +1 -1
- data/lib/solargraph/language_server/progress.rb +143 -143
- data/lib/solargraph/language_server/request.rb +4 -2
- data/lib/solargraph/language_server/transport/adapter.rb +68 -68
- data/lib/solargraph/language_server/transport/data_reader.rb +11 -13
- data/lib/solargraph/language_server/uri_helpers.rb +2 -2
- data/lib/solargraph/language_server.rb +20 -20
- data/lib/solargraph/library.rb +57 -38
- data/lib/solargraph/location.rb +17 -14
- data/lib/solargraph/logging.rb +22 -4
- data/lib/solargraph/page.rb +1 -1
- data/lib/solargraph/parser/comment_ripper.rb +19 -4
- data/lib/solargraph/parser/flow_sensitive_typing.rb +324 -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 +30 -14
- data/lib/solargraph/parser/parser_gem/flawed_builder.rb +1 -1
- data/lib/solargraph/parser/parser_gem/node_chainer.rb +51 -25
- data/lib/solargraph/parser/parser_gem/node_methods.rb +222 -72
- data/lib/solargraph/parser/parser_gem/node_processors/alias_node.rb +24 -24
- 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 +11 -12
- data/lib/solargraph/parser/parser_gem/node_processors/casgn_node.rb +36 -36
- data/lib/solargraph/parser/parser_gem/node_processors/cvasgn_node.rb +24 -24
- data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +10 -3
- data/lib/solargraph/parser/parser_gem/node_processors/defs_node.rb +9 -8
- data/lib/solargraph/parser/parser_gem/node_processors/gvasgn_node.rb +24 -24
- 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/namespace_node.rb +64 -40
- 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/sym_node.rb +20 -20
- data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +1 -1
- 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 +2 -0
- data/lib/solargraph/parser/region.rb +9 -3
- data/lib/solargraph/parser/snippet.rb +3 -1
- data/lib/solargraph/parser.rb +2 -0
- data/lib/solargraph/pin/base.rb +156 -84
- 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 +67 -23
- data/lib/solargraph/pin/closure.rb +7 -10
- data/lib/solargraph/pin/common.rb +36 -6
- data/lib/solargraph/pin/compound_statement.rb +55 -0
- data/lib/solargraph/pin/constant.rb +3 -5
- 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 +205 -111
- data/lib/solargraph/pin/method_alias.rb +8 -0
- data/lib/solargraph/pin/namespace.rb +19 -12
- data/lib/solargraph/pin/parameter.rb +102 -36
- data/lib/solargraph/pin/proxy_type.rb +4 -1
- data/lib/solargraph/pin/reference/override.rb +1 -1
- data/lib/solargraph/pin/reference/require.rb +14 -14
- data/lib/solargraph/pin/reference/superclass.rb +2 -0
- data/lib/solargraph/pin/reference/type_alias.rb +16 -0
- data/lib/solargraph/pin/reference.rb +20 -0
- data/lib/solargraph/pin/search.rb +8 -7
- data/lib/solargraph/pin/signature.rb +15 -12
- data/lib/solargraph/pin/singleton.rb +11 -11
- 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 +22 -19
- data/lib/solargraph/position.rb +17 -10
- data/lib/solargraph/range.rb +16 -15
- data/lib/solargraph/rbs_map/conversions.rb +278 -191
- data/lib/solargraph/rbs_map/core_fills.rb +18 -11
- 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 +76 -32
- data/lib/solargraph/rbs_translator.rb +206 -0
- data/lib/solargraph/server_methods.rb +1 -1
- data/lib/solargraph/shell.rb +330 -71
- data/lib/solargraph/source/chain/array.rb +3 -12
- data/lib/solargraph/source/chain/block_symbol.rb +13 -13
- data/lib/solargraph/source/chain/block_variable.rb +13 -13
- data/lib/solargraph/source/chain/call.rb +91 -119
- data/lib/solargraph/source/chain/class_variable.rb +1 -1
- data/lib/solargraph/source/chain/constant.rb +5 -1
- data/lib/solargraph/source/chain/global_variable.rb +1 -1
- data/lib/solargraph/source/chain/hash.rb +8 -5
- data/lib/solargraph/source/chain/head.rb +19 -19
- 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 +12 -22
- data/lib/solargraph/source/chain/literal.rb +22 -15
- data/lib/solargraph/source/chain/or.rb +10 -4
- data/lib/solargraph/source/chain/q_call.rb +2 -0
- data/lib/solargraph/source/chain/variable.rb +3 -1
- data/lib/solargraph/source/chain/z_super.rb +1 -3
- data/lib/solargraph/source/chain.rb +51 -38
- data/lib/solargraph/source/change.rb +12 -5
- data/lib/solargraph/source/cursor.rb +33 -18
- 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 +54 -30
- data/lib/solargraph/source_map/data.rb +4 -1
- data/lib/solargraph/source_map/mapper.rb +28 -131
- data/lib/solargraph/source_map.rb +35 -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 +196 -122
- data/lib/solargraph/version.rb +19 -1
- data/lib/solargraph/workspace/config.rb +14 -11
- data/lib/solargraph/workspace/gemspecs.rb +367 -0
- data/lib/solargraph/workspace/require_paths.rb +1 -0
- data/lib/solargraph/workspace.rb +50 -28
- data/lib/solargraph/yard_map/cache.rb +25 -25
- data/lib/solargraph/yard_map/directives/attribute_directive.rb +65 -0
- data/lib/solargraph/yard_map/directives/domain_directive.rb +30 -0
- data/lib/solargraph/yard_map/directives/method_directive.rb +51 -0
- data/lib/solargraph/yard_map/directives/override_directive.rb +30 -0
- data/lib/solargraph/yard_map/directives/parse_directive.rb +53 -0
- data/lib/solargraph/yard_map/directives/visibility_directive.rb +70 -0
- data/lib/solargraph/yard_map/directives.rb +35 -0
- data/lib/solargraph/yard_map/helpers.rb +8 -3
- data/lib/solargraph/yard_map/macro.rb +113 -0
- data/lib/solargraph/yard_map/mapper/to_constant.rb +28 -28
- 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 +31 -8
- data/lib/solargraph/yard_map.rb +19 -18
- data/lib/solargraph/yard_tags.rb +2 -2
- data/lib/solargraph/yardoc.rb +7 -4
- data/lib/solargraph.rb +34 -10
- data/rbs/fills/rubygems/0/dependency.rbs +193 -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 +38 -35
- metadata +64 -42
- 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/rbs/fills/tuple/tuple.rbs +0 -149
|
@@ -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)
|
|
@@ -37,18 +37,15 @@ module Solargraph
|
|
|
37
37
|
|
|
38
38
|
private
|
|
39
39
|
|
|
40
|
-
# @return [Hash{String => RBS::AST::Declarations::TypeAlias}]
|
|
41
|
-
def type_aliases
|
|
42
|
-
@type_aliases ||= {}
|
|
43
|
-
end
|
|
44
|
-
|
|
45
40
|
# @param loader [RBS::EnvironmentLoader]
|
|
41
|
+
#
|
|
46
42
|
# @return [void]
|
|
47
|
-
def load_environment_to_pins
|
|
43
|
+
def load_environment_to_pins loader
|
|
48
44
|
environment = RBS::Environment.from_loader(loader).resolve_type_names
|
|
49
|
-
cursor = pins.length
|
|
50
45
|
if environment.declarations.empty?
|
|
51
|
-
Solargraph.logger.info
|
|
46
|
+
Solargraph.logger.info 'No RBS declarations found in environment for core_root ' \
|
|
47
|
+
"#{loader.core_root.inspect}, libraries #{loader.libs} and " \
|
|
48
|
+
"directories #{loader.dirs}"
|
|
52
49
|
return
|
|
53
50
|
end
|
|
54
51
|
environment.declarations.each { |decl| convert_decl_to_pin(decl, Solargraph::Pin::ROOT_PIN) }
|
|
@@ -60,22 +57,61 @@ module Solargraph
|
|
|
60
57
|
def convert_decl_to_pin decl, closure
|
|
61
58
|
case decl
|
|
62
59
|
when RBS::AST::Declarations::Class
|
|
60
|
+
# @sg-ignore flow sensitive typing should support case/when
|
|
61
|
+
unless closure.name == '' || decl.name.absolute?
|
|
62
|
+
Solargraph.assert_or_log(:rbs_closure, "Ignoring closure #{closure.inspect} on class #{decl.inspect}")
|
|
63
|
+
end
|
|
63
64
|
class_decl_to_pin decl
|
|
64
65
|
when RBS::AST::Declarations::Interface
|
|
65
|
-
#
|
|
66
|
-
|
|
66
|
+
# @sg-ignore flow sensitive typing should support case/when
|
|
67
|
+
unless closure.name == '' || decl.name.absolute?
|
|
68
|
+
Solargraph.assert_or_log(:rbs_closure, "Ignoring closure #{closure.inspect} on interface #{decl.inspect}")
|
|
69
|
+
end
|
|
70
|
+
interface_decl_to_pin decl
|
|
67
71
|
when RBS::AST::Declarations::TypeAlias
|
|
68
|
-
# @sg-ignore
|
|
69
|
-
|
|
72
|
+
# @sg-ignore flow sensitive typing should support case/when
|
|
73
|
+
unless closure.name == '' || decl.name.absolute?
|
|
74
|
+
Solargraph.assert_or_log(:rbs_closure,
|
|
75
|
+
# @sg-ignore flow sensitive typing should support case/when
|
|
76
|
+
"Ignoring closure #{closure.inspect} on alias type name #{decl.name}")
|
|
77
|
+
end
|
|
78
|
+
pins.push(
|
|
79
|
+
# @sg-ignore Wrong argument type for Solargraph::Pin::Reference::TypeAlias.new: return_type expected Solargraph::ComplexType, received Solargraph::ComplexType::UniqueType, Solargraph::ComplexType
|
|
80
|
+
Solargraph::Pin::Reference::TypeAlias.new(
|
|
81
|
+
# @sg-ignore Unresolved calls to name, type, type_location; return_type type mismatch
|
|
82
|
+
name: ComplexType.try_parse(decl.name.to_s).to_s, return_type: RbsTranslator.to_complex_type(decl.type).force_rooted, closure: closure, source: :rbs, type_location: location_decl_to_pin_location(decl.location)
|
|
83
|
+
)
|
|
84
|
+
)
|
|
70
85
|
when RBS::AST::Declarations::Module
|
|
86
|
+
# @sg-ignore flow sensitive typing should support case/when
|
|
87
|
+
unless closure.name == '' || decl.name.absolute?
|
|
88
|
+
Solargraph.assert_or_log(:rbs_closure,
|
|
89
|
+
# @sg-ignore flow sensitive typing should support case/when
|
|
90
|
+
"Ignoring closure #{closure.inspect} on alias type name #{decl.name}")
|
|
91
|
+
end
|
|
71
92
|
module_decl_to_pin decl
|
|
72
93
|
when RBS::AST::Declarations::Constant
|
|
94
|
+
# @sg-ignore flow sensitive typing should support case/when
|
|
95
|
+
unless closure.name == '' || decl.name.absolute?
|
|
96
|
+
Solargraph.assert_or_log(:rbs_closure, "Ignoring closure #{closure.inspect} on constant #{decl.inspect}")
|
|
97
|
+
end
|
|
73
98
|
constant_decl_to_pin decl
|
|
74
99
|
when RBS::AST::Declarations::ClassAlias
|
|
100
|
+
# @sg-ignore flow sensitive typing should support case/when
|
|
101
|
+
unless closure.name == '' || decl.new_name.absolute?
|
|
102
|
+
Solargraph.assert_or_log(:rbs_closure, "Ignoring closure #{closure.inspect} on class alias #{decl.inspect}")
|
|
103
|
+
end
|
|
75
104
|
class_alias_decl_to_pin decl
|
|
76
105
|
when RBS::AST::Declarations::ModuleAlias
|
|
106
|
+
unless closure.name == ''
|
|
107
|
+
Solargraph.assert_or_log(:rbs_closure,
|
|
108
|
+
"Ignoring closure #{closure.inspect} on module alias #{decl.inspect}")
|
|
109
|
+
end
|
|
77
110
|
module_alias_decl_to_pin decl
|
|
78
111
|
when RBS::AST::Declarations::Global
|
|
112
|
+
unless closure.name == ''
|
|
113
|
+
Solargraph.assert_or_log(:rbs_closure, "Ignoring closure #{closure.inspect} on global decl #{decl.inspect}")
|
|
114
|
+
end
|
|
79
115
|
global_decl_to_pin decl
|
|
80
116
|
else
|
|
81
117
|
Solargraph.logger.warn "Skipping declaration #{decl.class}"
|
|
@@ -86,7 +122,62 @@ module Solargraph
|
|
|
86
122
|
# @param module_pin [Pin::Namespace]
|
|
87
123
|
# @return [void]
|
|
88
124
|
def convert_self_types_to_pins decl, module_pin
|
|
89
|
-
decl.self_types.each { |self_type|
|
|
125
|
+
decl.self_types.each { |self_type| convert_self_type_to_pins(self_type, module_pin) }
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
# @type [Hash{String => String}]
|
|
129
|
+
RBS_TO_CLASS = {
|
|
130
|
+
'bool' => 'Boolean',
|
|
131
|
+
'string' => 'String',
|
|
132
|
+
'int' => 'Integer'
|
|
133
|
+
}.freeze
|
|
134
|
+
private_constant :RBS_TO_CLASS
|
|
135
|
+
|
|
136
|
+
# rooted names (namespaces) use the prefix of :: when they are
|
|
137
|
+
# relative to the root namespace, or not if they are relative to
|
|
138
|
+
# the current namespace.
|
|
139
|
+
#
|
|
140
|
+
# @param type_name [RBS::TypeName]
|
|
141
|
+
#
|
|
142
|
+
# @return [String]
|
|
143
|
+
def rooted_name type_name
|
|
144
|
+
name = type_name.to_s
|
|
145
|
+
RBS_TO_CLASS.fetch(name, name)
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
# fqns names are implicitly fully qualified - they are relative
|
|
149
|
+
# to the root namespace and are not prefixed with ::
|
|
150
|
+
#
|
|
151
|
+
# @param type_name [RBS::TypeName]
|
|
152
|
+
#
|
|
153
|
+
# @return [String]
|
|
154
|
+
def fqns type_name
|
|
155
|
+
unless type_name.absolute?
|
|
156
|
+
Solargraph.assert_or_log(:rbs_fqns, "Received unexpected unqualified type name: #{type_name}")
|
|
157
|
+
end
|
|
158
|
+
ns = type_name.relative!.to_s
|
|
159
|
+
RBS_TO_CLASS.fetch(ns, ns)
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
# @param type_name [RBS::TypeName]
|
|
163
|
+
# @param type_args [Enumerable<RBS::Types::Bases::Base>]
|
|
164
|
+
# @return [ComplexType::UniqueType]
|
|
165
|
+
def build_type type_name, type_args = []
|
|
166
|
+
# we use .absolute? below to tell the type object what to
|
|
167
|
+
# expect
|
|
168
|
+
rbs_name = type_name.relative!.to_s
|
|
169
|
+
base = RBS_TO_CLASS.fetch(rbs_name, rbs_name)
|
|
170
|
+
|
|
171
|
+
params = type_args.map { |a| RbsTranslator.to_complex_type(a) }
|
|
172
|
+
# @todo Tuples are in flux
|
|
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]
|
|
@@ -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,34 @@ 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
277
|
if param.default_type
|
|
163
|
-
|
|
164
|
-
generic_defaults[param.name.to_s] =
|
|
278
|
+
complex_type = RbsTranslator.to_complex_type(param.default_type).force_rooted
|
|
279
|
+
generic_defaults[param.name.to_s] = complex_type
|
|
165
280
|
end
|
|
166
281
|
end
|
|
167
|
-
|
|
282
|
+
|
|
283
|
+
class_name = fqns(decl.name)
|
|
284
|
+
|
|
285
|
+
generics = type_parameter_names(decl)
|
|
286
|
+
|
|
168
287
|
class_pin = Solargraph::Pin::Namespace.new(
|
|
169
288
|
type: :class,
|
|
170
289
|
name: class_name,
|
|
@@ -187,7 +306,7 @@ module Solargraph
|
|
|
187
306
|
type_location: location_decl_to_pin_location(decl.super_class.location),
|
|
188
307
|
closure: class_pin,
|
|
189
308
|
generic_values: generic_values,
|
|
190
|
-
name:
|
|
309
|
+
name: type.rooted_name, # reference pins use rooted names
|
|
191
310
|
source: :rbs
|
|
192
311
|
)
|
|
193
312
|
end
|
|
@@ -196,16 +315,15 @@ module Solargraph
|
|
|
196
315
|
end
|
|
197
316
|
|
|
198
317
|
# @param decl [RBS::AST::Declarations::Interface]
|
|
199
|
-
# @param closure [Pin::Closure]
|
|
200
318
|
# @return [void]
|
|
201
|
-
def interface_decl_to_pin decl
|
|
319
|
+
def interface_decl_to_pin decl
|
|
202
320
|
class_pin = Solargraph::Pin::Namespace.new(
|
|
203
321
|
type: :module,
|
|
204
322
|
type_location: location_decl_to_pin_location(decl.location),
|
|
205
323
|
name: decl.name.relative!.to_s,
|
|
206
324
|
closure: Solargraph::Pin::ROOT_PIN,
|
|
207
325
|
comments: decl.comment&.string,
|
|
208
|
-
generics: decl
|
|
326
|
+
generics: type_parameter_names(decl),
|
|
209
327
|
# HACK: Using :hidden to keep interfaces from appearing in
|
|
210
328
|
# autocompletion
|
|
211
329
|
visibility: :hidden,
|
|
@@ -225,41 +343,50 @@ module Solargraph
|
|
|
225
343
|
type_location: location_decl_to_pin_location(decl.location),
|
|
226
344
|
closure: Solargraph::Pin::ROOT_PIN,
|
|
227
345
|
comments: decl.comment&.string,
|
|
228
|
-
generics: decl
|
|
346
|
+
generics: type_parameter_names(decl),
|
|
229
347
|
source: :rbs
|
|
230
348
|
)
|
|
231
349
|
pins.push module_pin
|
|
232
350
|
convert_self_types_to_pins decl, module_pin
|
|
233
351
|
convert_members_to_pins decl, module_pin
|
|
234
352
|
|
|
353
|
+
raise "Invalid type for module declaration: #{module_pin.class}" unless module_pin.is_a?(Pin::Namespace)
|
|
354
|
+
|
|
235
355
|
add_mixins decl, module_pin.closure
|
|
236
356
|
end
|
|
237
357
|
|
|
238
|
-
# @param
|
|
239
|
-
# @param
|
|
240
|
-
# @param comments [String]
|
|
241
|
-
# @param decl [RBS::AST::Declarations::ClassAlias,
|
|
242
|
-
#
|
|
358
|
+
# @param fqns [String]
|
|
359
|
+
# @param type [ComplexType, ComplexType::UniqueType]
|
|
360
|
+
# @param comments [String, nil]
|
|
361
|
+
# @param decl [RBS::AST::Declarations::ClassAlias,
|
|
362
|
+
# RBS::AST::Declarations::Constant,
|
|
363
|
+
# RBS::AST::Declarations::ModuleAlias]
|
|
364
|
+
# @param base [String, nil] Optional conversion of tag to
|
|
365
|
+
# base<tag> - valid values are Class and Module
|
|
243
366
|
#
|
|
244
367
|
# @return [Solargraph::Pin::Constant]
|
|
245
|
-
def create_constant
|
|
246
|
-
parts =
|
|
368
|
+
def create_constant fqns, type, comments, decl, base = nil
|
|
369
|
+
parts = fqns.split('::')
|
|
247
370
|
if parts.length > 1
|
|
248
|
-
|
|
371
|
+
fqns = parts.last
|
|
372
|
+
# @sg-ignore Need to add nil check here
|
|
249
373
|
closure = pins.select { |pin| pin && pin.path == parts[0..-2].join('::') }.first
|
|
250
374
|
else
|
|
251
|
-
|
|
375
|
+
fqns = parts.first
|
|
252
376
|
closure = Solargraph::Pin::ROOT_PIN
|
|
253
377
|
end
|
|
254
378
|
constant_pin = Solargraph::Pin::Constant.new(
|
|
255
|
-
name:
|
|
379
|
+
name: fqns,
|
|
256
380
|
closure: closure,
|
|
257
381
|
type_location: location_decl_to_pin_location(decl.location),
|
|
258
382
|
comments: comments,
|
|
259
383
|
source: :rbs
|
|
260
384
|
)
|
|
261
|
-
|
|
262
|
-
rooted_tag =
|
|
385
|
+
rooted_tag = type.rooted_tags
|
|
386
|
+
rooted_tag = "#{base}<#{rooted_tag}>" if base
|
|
387
|
+
# @todo alt version
|
|
388
|
+
# tag = "#{base}<#{tag}>" if base
|
|
389
|
+
# rooted_tag = ComplexType.parse(tag).force_rooted.rooted_tags
|
|
263
390
|
constant_pin.docstring.add_tag(YARD::Tags::Tag.new(:return, '', rooted_tag))
|
|
264
391
|
constant_pin
|
|
265
392
|
end
|
|
@@ -268,26 +395,25 @@ module Solargraph
|
|
|
268
395
|
# @return [void]
|
|
269
396
|
def class_alias_decl_to_pin decl
|
|
270
397
|
# 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')
|
|
398
|
+
new_name = fqns(decl.new_name)
|
|
399
|
+
old_type = build_type(decl.old_name)
|
|
400
|
+
pins.push create_constant(new_name, old_type, decl.comment&.string, decl, '::Class')
|
|
275
401
|
end
|
|
276
402
|
|
|
277
403
|
# @param decl [RBS::AST::Declarations::ModuleAlias]
|
|
278
404
|
# @return [void]
|
|
279
405
|
def module_alias_decl_to_pin decl
|
|
280
406
|
# See https://www.rubydoc.info/gems/rbs/3.4.3/RBS/AST/Declarations/ModuleAlias
|
|
281
|
-
new_name = decl.new_name
|
|
282
|
-
|
|
407
|
+
new_name = fqns(decl.new_name)
|
|
408
|
+
old_type = build_type(decl.old_name)
|
|
283
409
|
|
|
284
|
-
pins.push create_constant(new_name,
|
|
410
|
+
pins.push create_constant(new_name, old_type, decl.comment&.string, decl, '::Module')
|
|
285
411
|
end
|
|
286
412
|
|
|
287
413
|
# @param decl [RBS::AST::Declarations::Constant]
|
|
288
414
|
# @return [void]
|
|
289
415
|
def constant_decl_to_pin decl
|
|
290
|
-
tag =
|
|
416
|
+
tag = RbsTranslator.to_complex_type(decl.type)
|
|
291
417
|
pins.push create_constant(decl.name.relative!.to_s, tag, decl.comment&.string, decl)
|
|
292
418
|
end
|
|
293
419
|
|
|
@@ -303,12 +429,11 @@ module Solargraph
|
|
|
303
429
|
type_location: location_decl_to_pin_location(decl.location),
|
|
304
430
|
source: :rbs
|
|
305
431
|
)
|
|
306
|
-
rooted_tag =
|
|
432
|
+
rooted_tag = RbsTranslator.to_complex_type(decl.type).force_rooted.rooted_tags
|
|
307
433
|
pin.docstring.add_tag(YARD::Tags::Tag.new(:type, '', rooted_tag))
|
|
308
434
|
pins.push pin
|
|
309
435
|
end
|
|
310
436
|
|
|
311
|
-
|
|
312
437
|
# Visibility overrides that will allow the Solargraph project
|
|
313
438
|
# and plugins to pass typechecking using SOLARGRAPH_ASSERTS=on,
|
|
314
439
|
# so that we can detect any regressions/issues elsewhere in the
|
|
@@ -324,42 +449,47 @@ module Solargraph
|
|
|
324
449
|
# allow that to be extended via .solargraph.yml
|
|
325
450
|
# @type [Hash{Array(String, Symbol, String) => Symbol}
|
|
326
451
|
VISIBILITY_OVERRIDE = {
|
|
327
|
-
[
|
|
452
|
+
['Rails::Engine', :instance, 'run_tasks_blocks'] => :protected,
|
|
328
453
|
# Should have been marked as both instance and class method in module -e.g., 'module_function'
|
|
329
|
-
[
|
|
454
|
+
['Kernel', :instance, 'pretty_inspect'] => :private,
|
|
330
455
|
# marked incorrectly in RBS
|
|
331
|
-
[
|
|
332
|
-
[
|
|
333
|
-
[
|
|
334
|
-
[
|
|
335
|
-
[
|
|
336
|
-
[
|
|
337
|
-
[
|
|
338
|
-
[
|
|
339
|
-
[
|
|
340
|
-
[
|
|
341
|
-
[
|
|
342
|
-
[
|
|
343
|
-
[
|
|
344
|
-
[
|
|
345
|
-
[
|
|
346
|
-
[
|
|
347
|
-
[
|
|
348
|
-
}
|
|
349
|
-
|
|
350
|
-
|
|
456
|
+
['WEBrick::HTTPUtils::FormData', :instance, 'next_data'] => :protected,
|
|
457
|
+
['Rails::Command', :class, 'command_type'] => :private,
|
|
458
|
+
['Rails::Command', :class, 'lookup_paths'] => :private,
|
|
459
|
+
['Rails::Command', :class, 'file_lookup_paths'] => :private,
|
|
460
|
+
['Rails::Railtie', :instance, 'run_console_blocks'] => :protected,
|
|
461
|
+
['Rails::Railtie', :instance, 'run_generators_blocks'] => :protected,
|
|
462
|
+
['Rails::Railtie', :instance, 'run_runner_blocks'] => :protected,
|
|
463
|
+
['Rails::Railtie', :instance, 'run_tasks_blocks'] => :protected,
|
|
464
|
+
['ActionController::Base', :instance, '_protected_ivars'] => :private,
|
|
465
|
+
['ActionView::Template', :instance, 'method_name'] => :public,
|
|
466
|
+
['Module', :instance, 'ruby2_keywords'] => :private,
|
|
467
|
+
['Nokogiri::XML::Node', :instance, 'coerce'] => :protected,
|
|
468
|
+
['Nokogiri::XML::Document', :class, 'empty_doc?'] => :private,
|
|
469
|
+
['Nokogiri::Decorators::Slop', :instance, 'respond_to_missing?'] => :public,
|
|
470
|
+
['RuboCop::Cop::RangeHelp', :instance, 'source_range'] => :private,
|
|
471
|
+
['AST::Node', :instance, 'original_dup'] => :private,
|
|
472
|
+
['Rainbow::Presenter', :instance, 'wrap_with_sgr'] => :private
|
|
473
|
+
}.freeze
|
|
474
|
+
private_constant :VISIBILITY_OVERRIDE
|
|
475
|
+
|
|
476
|
+
# @param decl [RBS::AST::Members::MethodDefinition, RBS::AST::Members::AttrReader,
|
|
477
|
+
# RBS::AST::Members::AttrWriter, RBS::AST::Members::AttrAccessor]
|
|
351
478
|
# @param closure [Pin::Closure]
|
|
352
479
|
# @param context [Context]
|
|
353
480
|
# @param scope [Symbol] :instance or :class
|
|
354
481
|
# @param name [String] The name of the method
|
|
355
|
-
# @sg-ignore
|
|
356
482
|
# @return [Symbol]
|
|
357
|
-
|
|
483
|
+
# @sg-ignore Declared return type ::Symbol does not match inferred type
|
|
484
|
+
# ::Symbol, :public, :private, nil for Solargraph::RbsMap::Conversions#calculate_method_visibility
|
|
485
|
+
def calculate_method_visibility decl, context, closure, scope, name
|
|
358
486
|
override_key = [closure.path, scope, name]
|
|
359
487
|
visibility = VISIBILITY_OVERRIDE[override_key]
|
|
360
488
|
simple_override_key = [closure.path, scope]
|
|
361
489
|
visibility ||= VISIBILITY_OVERRIDE[simple_override_key]
|
|
362
|
-
|
|
490
|
+
if closure.path == 'Kernel' && Kernel.private_method_defined?(decl.name, false)
|
|
491
|
+
visibility ||= :private
|
|
492
|
+
end
|
|
363
493
|
if decl.kind == :singleton_instance
|
|
364
494
|
# this is a 'module function'
|
|
365
495
|
visibility ||= :private
|
|
@@ -379,7 +509,9 @@ module Solargraph
|
|
|
379
509
|
# having different type params / orders - we may need to match
|
|
380
510
|
# this data model and have generics live in signatures to
|
|
381
511
|
# handle those correctly
|
|
382
|
-
generics = decl.overloads.map(&:method_type).
|
|
512
|
+
generics = decl.overloads.map(&:method_type).map do |method_type|
|
|
513
|
+
type_parameter_names method_type
|
|
514
|
+
end
|
|
383
515
|
|
|
384
516
|
if decl.instance?
|
|
385
517
|
name = decl.name.to_s
|
|
@@ -427,13 +559,15 @@ module Solargraph
|
|
|
427
559
|
# @param pin [Pin::Method]
|
|
428
560
|
# @return [void]
|
|
429
561
|
def method_def_to_sigs decl, pin
|
|
430
|
-
#
|
|
562
|
+
# rubocop:disable Style/SafeNavigationChainLength
|
|
563
|
+
implicit_nil = decl.overloads.first&.annotations&.map(&:string)&.include?('implicitly-returns-nil') || false
|
|
564
|
+
# rubocop:enable Style/SafeNavigationChainLength # @param overload [RBS::AST::Members::MethodDefinition::Overload]
|
|
431
565
|
decl.overloads.map do |overload|
|
|
432
566
|
type_location = location_decl_to_pin_location(overload.method_type.location)
|
|
433
567
|
generics = overload.method_type.type_params.map(&:name).map(&:to_s)
|
|
434
|
-
signature_parameters, signature_return_type = parts_of_function(overload.method_type, pin)
|
|
568
|
+
signature_parameters, signature_return_type = parts_of_function(overload.method_type, pin, implicit_nil)
|
|
435
569
|
block = if overload.method_type.block
|
|
436
|
-
block_parameters, block_return_type = parts_of_function(overload.method_type.block, pin)
|
|
570
|
+
block_parameters, block_return_type = parts_of_function(overload.method_type.block, pin, implicit_nil)
|
|
437
571
|
Pin::Signature.new(generics: generics, parameters: block_parameters, return_type: block_return_type, source: :rbs,
|
|
438
572
|
type_location: type_location, closure: pin)
|
|
439
573
|
end
|
|
@@ -453,85 +587,100 @@ module Solargraph
|
|
|
453
587
|
Location.new(location.name.to_s, range)
|
|
454
588
|
end
|
|
455
589
|
|
|
456
|
-
# @param type [RBS::MethodType,RBS::Types::Block]
|
|
590
|
+
# @param type [RBS::MethodType, RBS::Types::Block]
|
|
457
591
|
# @param pin [Pin::Method]
|
|
592
|
+
# @param implicit_nil [Boolean]
|
|
458
593
|
# @return [Array(Array<Pin::Parameter>, ComplexType)]
|
|
459
|
-
def parts_of_function type, pin
|
|
594
|
+
def parts_of_function type, pin, implicit_nil
|
|
460
595
|
type_location = pin.type_location
|
|
461
596
|
if defined?(RBS::Types::UntypedFunction) && type.type.is_a?(RBS::Types::UntypedFunction)
|
|
462
597
|
return [
|
|
463
|
-
[Solargraph::Pin::Parameter.new(decl: :restarg, name: 'arg', closure: pin, source: :rbs,
|
|
464
|
-
|
|
598
|
+
[Solargraph::Pin::Parameter.new(decl: :restarg, name: 'arg', closure: pin, source: :rbs,
|
|
599
|
+
type_location: type_location)],
|
|
600
|
+
method_type_to_type(type, implicit_nil)
|
|
465
601
|
]
|
|
466
602
|
end
|
|
467
603
|
|
|
468
604
|
parameters = []
|
|
469
605
|
arg_num = -1
|
|
470
606
|
type.type.required_positionals.each do |param|
|
|
471
|
-
# @sg-ignore
|
|
607
|
+
# @sg-ignore Unresolved call to name
|
|
472
608
|
name = param.name ? param.name.to_s : "arg_#{arg_num += 1}"
|
|
473
|
-
|
|
474
|
-
|
|
609
|
+
parameters.push Solargraph::Pin::Parameter.new(decl: :arg, name: name, closure: pin,
|
|
610
|
+
# @sg-ignore RBS generic type understanding issue
|
|
611
|
+
return_type: other_type_to_type(param.type),
|
|
612
|
+
source: :rbs, type_location: type_location)
|
|
475
613
|
end
|
|
476
614
|
type.type.optional_positionals.each do |param|
|
|
477
|
-
# @sg-ignore
|
|
615
|
+
# @sg-ignore Unresolved call to name
|
|
478
616
|
name = param.name ? param.name.to_s : "arg_#{arg_num += 1}"
|
|
479
617
|
parameters.push Solargraph::Pin::Parameter.new(decl: :optarg, name: name, closure: pin,
|
|
480
618
|
# @sg-ignore RBS generic type understanding issue
|
|
481
|
-
return_type:
|
|
619
|
+
return_type: other_type_to_type(param.type),
|
|
482
620
|
type_location: type_location,
|
|
483
621
|
source: :rbs)
|
|
484
622
|
end
|
|
485
623
|
if type.type.rest_positionals
|
|
486
624
|
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))
|
|
625
|
+
inner_rest_positional_type = other_type_to_type(type.type.rest_positionals.type)
|
|
489
626
|
rest_positional_type = ComplexType::UniqueType.new('Array',
|
|
490
627
|
[],
|
|
491
628
|
[inner_rest_positional_type],
|
|
492
629
|
rooted: true, parameters_type: :list)
|
|
493
630
|
parameters.push Solargraph::Pin::Parameter.new(decl: :restarg, name: name, closure: pin,
|
|
494
631
|
source: :rbs, type_location: type_location,
|
|
495
|
-
return_type: rest_positional_type
|
|
632
|
+
return_type: rest_positional_type)
|
|
496
633
|
end
|
|
497
634
|
type.type.trailing_positionals.each do |param|
|
|
498
|
-
# @sg-ignore
|
|
635
|
+
# @sg-ignore Unresolved call to name
|
|
499
636
|
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,
|
|
637
|
+
parameters.push Solargraph::Pin::Parameter.new(decl: :arg, name: name, closure: pin, source: :rbs,
|
|
638
|
+
type_location: type_location)
|
|
501
639
|
end
|
|
502
640
|
type.type.required_keywords.each do |orig, param|
|
|
503
|
-
# @sg-ignore
|
|
641
|
+
# @sg-ignore Unresolved call to to_s
|
|
504
642
|
name = orig ? orig.to_s : "arg_#{arg_num += 1}"
|
|
505
643
|
parameters.push Solargraph::Pin::Parameter.new(decl: :kwarg, name: name, closure: pin,
|
|
506
644
|
# @sg-ignore RBS generic type understanding issue
|
|
507
|
-
return_type:
|
|
645
|
+
return_type: other_type_to_type(param.type),
|
|
508
646
|
source: :rbs, type_location: type_location)
|
|
509
647
|
end
|
|
510
648
|
type.type.optional_keywords.each do |orig, param|
|
|
511
|
-
# @sg-ignore
|
|
649
|
+
# @sg-ignore Unresolved call to to_s
|
|
512
650
|
name = orig ? orig.to_s : "arg_#{arg_num += 1}"
|
|
513
651
|
parameters.push Solargraph::Pin::Parameter.new(decl: :kwoptarg, name: name, closure: pin,
|
|
514
652
|
# @sg-ignore RBS generic type understanding issue
|
|
515
|
-
return_type:
|
|
653
|
+
return_type: other_type_to_type(param.type),
|
|
516
654
|
type_location: type_location,
|
|
517
655
|
source: :rbs)
|
|
518
656
|
end
|
|
519
657
|
if type.type.rest_keywords
|
|
520
658
|
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,
|
|
659
|
+
parameters.push Solargraph::Pin::Parameter.new(decl: :kwrestarg,
|
|
660
|
+
name: type.type.rest_keywords.name.to_s, closure: pin,
|
|
522
661
|
source: :rbs, type_location: type_location)
|
|
523
662
|
end
|
|
524
663
|
|
|
525
|
-
|
|
526
|
-
return_type = ComplexType.try_parse(rooted_tag).force_rooted
|
|
664
|
+
return_type = method_type_to_type(type, implicit_nil)
|
|
527
665
|
[parameters, return_type]
|
|
528
666
|
end
|
|
529
667
|
|
|
668
|
+
# @param type [RBS::MethodType,RBS::Types::Block]
|
|
669
|
+
# @param pin [Pin::Method]
|
|
670
|
+
# @param implicit_nil [Boolean]
|
|
671
|
+
# @return [Array(Array<Pin::Parameter>, ComplexType)]
|
|
672
|
+
def parts_of_function type, pin, implicit_nil
|
|
673
|
+
[
|
|
674
|
+
RbsTranslator.to_parameter_pins(type, pin, pin.parameter_names),
|
|
675
|
+
extract_method_type_return_type(type, implicit_nil).force_rooted
|
|
676
|
+
]
|
|
677
|
+
end
|
|
678
|
+
|
|
530
679
|
# @param decl [RBS::AST::Members::AttrReader,RBS::AST::Members::AttrAccessor]
|
|
531
680
|
# @param closure [Pin::Namespace]
|
|
532
681
|
# @param context [Context]
|
|
533
682
|
# @return [void]
|
|
534
|
-
def attr_reader_to_pin
|
|
683
|
+
def attr_reader_to_pin decl, closure, context
|
|
535
684
|
name = decl.name.to_s
|
|
536
685
|
final_scope = decl.kind == :instance ? :instance : :class
|
|
537
686
|
visibility = calculate_method_visibility(decl, context, closure, final_scope, name)
|
|
@@ -545,9 +694,11 @@ module Solargraph
|
|
|
545
694
|
visibility: visibility,
|
|
546
695
|
source: :rbs
|
|
547
696
|
)
|
|
548
|
-
rooted_tag =
|
|
697
|
+
rooted_tag = RbsTranslator.to_complex_type(decl.type).force_rooted.rooted_tags
|
|
549
698
|
pin.docstring.add_tag(YARD::Tags::Tag.new(:return, '', rooted_tag))
|
|
550
|
-
logger.debug
|
|
699
|
+
logger.debug do
|
|
700
|
+
"Conversions#attr_reader_to_pin(name=#{name.inspect}, visibility=#{visibility.inspect}) => #{pin.inspect}"
|
|
701
|
+
end
|
|
551
702
|
pins.push pin
|
|
552
703
|
end
|
|
553
704
|
|
|
@@ -555,9 +706,9 @@ module Solargraph
|
|
|
555
706
|
# @param closure [Pin::Namespace]
|
|
556
707
|
# @param context [Context]
|
|
557
708
|
# @return [void]
|
|
558
|
-
def attr_writer_to_pin
|
|
709
|
+
def attr_writer_to_pin decl, closure, context
|
|
559
710
|
final_scope = decl.kind == :instance ? :instance : :class
|
|
560
|
-
name = "#{decl.name
|
|
711
|
+
name = "#{decl.name}="
|
|
561
712
|
visibility = calculate_method_visibility(decl, context, closure, final_scope, name)
|
|
562
713
|
type_location = location_decl_to_pin_location(decl.location)
|
|
563
714
|
pin = Solargraph::Pin::Method.new(
|
|
@@ -574,12 +725,12 @@ module Solargraph
|
|
|
574
725
|
pin.parameters <<
|
|
575
726
|
Solargraph::Pin::Parameter.new(
|
|
576
727
|
name: 'value',
|
|
577
|
-
return_type:
|
|
728
|
+
return_type: RbsTranslator.to_complex_type(decl.type).force_rooted,
|
|
578
729
|
source: :rbs,
|
|
579
730
|
closure: pin,
|
|
580
731
|
type_location: type_location
|
|
581
732
|
)
|
|
582
|
-
rooted_tag =
|
|
733
|
+
rooted_tag = RbsTranslator.to_complex_type(decl.type).force_rooted.rooted_tags
|
|
583
734
|
pin.docstring.add_tag(YARD::Tags::Tag.new(:return, '', rooted_tag))
|
|
584
735
|
pins.push pin
|
|
585
736
|
end
|
|
@@ -588,7 +739,7 @@ module Solargraph
|
|
|
588
739
|
# @param closure [Pin::Namespace]
|
|
589
740
|
# @param context [Context]
|
|
590
741
|
# @return [void]
|
|
591
|
-
def attr_accessor_to_pin
|
|
742
|
+
def attr_accessor_to_pin decl, closure, context
|
|
592
743
|
attr_reader_to_pin(decl, closure, context)
|
|
593
744
|
attr_writer_to_pin(decl, closure, context)
|
|
594
745
|
end
|
|
@@ -596,7 +747,7 @@ module Solargraph
|
|
|
596
747
|
# @param decl [RBS::AST::Members::InstanceVariable]
|
|
597
748
|
# @param closure [Pin::Namespace]
|
|
598
749
|
# @return [void]
|
|
599
|
-
def ivar_to_pin
|
|
750
|
+
def ivar_to_pin decl, closure
|
|
600
751
|
pin = Solargraph::Pin::InstanceVariable.new(
|
|
601
752
|
name: decl.name.to_s,
|
|
602
753
|
closure: closure,
|
|
@@ -604,7 +755,7 @@ module Solargraph
|
|
|
604
755
|
comments: decl.comment&.string,
|
|
605
756
|
source: :rbs
|
|
606
757
|
)
|
|
607
|
-
rooted_tag =
|
|
758
|
+
rooted_tag = RbsTranslator.to_complex_type(decl.type).force_rooted.rooted_tags
|
|
608
759
|
pin.docstring.add_tag(YARD::Tags::Tag.new(:type, '', rooted_tag))
|
|
609
760
|
pins.push pin
|
|
610
761
|
end
|
|
@@ -612,7 +763,7 @@ module Solargraph
|
|
|
612
763
|
# @param decl [RBS::AST::Members::ClassVariable]
|
|
613
764
|
# @param closure [Pin::Namespace]
|
|
614
765
|
# @return [void]
|
|
615
|
-
def cvar_to_pin
|
|
766
|
+
def cvar_to_pin decl, closure
|
|
616
767
|
name = decl.name.to_s
|
|
617
768
|
pin = Solargraph::Pin::ClassVariable.new(
|
|
618
769
|
name: name,
|
|
@@ -621,7 +772,7 @@ module Solargraph
|
|
|
621
772
|
type_location: location_decl_to_pin_location(decl.location),
|
|
622
773
|
source: :rbs
|
|
623
774
|
)
|
|
624
|
-
rooted_tag =
|
|
775
|
+
rooted_tag = RbsTranslator.to_complex_type(decl.type).force_rooted.rooted_tags
|
|
625
776
|
pin.docstring.add_tag(YARD::Tags::Tag.new(:type, '', rooted_tag))
|
|
626
777
|
pins.push pin
|
|
627
778
|
end
|
|
@@ -629,7 +780,7 @@ module Solargraph
|
|
|
629
780
|
# @param decl [RBS::AST::Members::ClassInstanceVariable]
|
|
630
781
|
# @param closure [Pin::Namespace]
|
|
631
782
|
# @return [void]
|
|
632
|
-
def civar_to_pin
|
|
783
|
+
def civar_to_pin decl, closure
|
|
633
784
|
name = decl.name.to_s
|
|
634
785
|
pin = Solargraph::Pin::InstanceVariable.new(
|
|
635
786
|
name: name,
|
|
@@ -638,7 +789,7 @@ module Solargraph
|
|
|
638
789
|
type_location: location_decl_to_pin_location(decl.location),
|
|
639
790
|
source: :rbs
|
|
640
791
|
)
|
|
641
|
-
rooted_tag =
|
|
792
|
+
rooted_tag = RbsTranslator.to_complex_type(decl.type).force_rooted.rooted_tags
|
|
642
793
|
pin.docstring.add_tag(YARD::Tags::Tag.new(:type, '', rooted_tag))
|
|
643
794
|
pins.push pin
|
|
644
795
|
end
|
|
@@ -662,6 +813,8 @@ module Solargraph
|
|
|
662
813
|
# @param closure [Pin::Namespace]
|
|
663
814
|
# @return [void]
|
|
664
815
|
def prepend_to_pin decl, closure
|
|
816
|
+
type = build_type(decl.name, decl.args)
|
|
817
|
+
generic_values = type.all_params.map(&:rooted_tags)
|
|
665
818
|
pins.push Solargraph::Pin::Reference::Prepend.new(
|
|
666
819
|
name: decl.name.relative!.to_s,
|
|
667
820
|
type_location: location_decl_to_pin_location(decl.location),
|
|
@@ -674,6 +827,8 @@ module Solargraph
|
|
|
674
827
|
# @param closure [Pin::Namespace]
|
|
675
828
|
# @return [void]
|
|
676
829
|
def extend_to_pin decl, closure
|
|
830
|
+
type = build_type(decl.name, decl.args)
|
|
831
|
+
generic_values = type.all_params.map(&:rooted_tags)
|
|
677
832
|
pins.push Solargraph::Pin::Reference::Extend.new(
|
|
678
833
|
name: decl.name.relative!.to_s,
|
|
679
834
|
type_location: location_decl_to_pin_location(decl.location),
|
|
@@ -693,7 +848,7 @@ module Solargraph
|
|
|
693
848
|
original: decl.old_name.to_s,
|
|
694
849
|
closure: closure,
|
|
695
850
|
scope: final_scope,
|
|
696
|
-
source: :rbs
|
|
851
|
+
source: :rbs
|
|
697
852
|
)
|
|
698
853
|
end
|
|
699
854
|
|
|
@@ -704,15 +859,18 @@ module Solargraph
|
|
|
704
859
|
'untyped' => '',
|
|
705
860
|
'NilClass' => 'nil'
|
|
706
861
|
}
|
|
862
|
+
private_constant :RBS_TO_YARD_TYPE
|
|
707
863
|
|
|
864
|
+
# Extract a ComplexType from a MethodType's return type.
|
|
865
|
+
#
|
|
866
|
+
# This method will convert type aliases to concrete types.
|
|
867
|
+
#
|
|
708
868
|
# @param type [RBS::MethodType]
|
|
709
|
-
# @return [
|
|
710
|
-
def
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
other_type_to_tag type.type.return_type
|
|
715
|
-
end
|
|
869
|
+
# @return [ComplexType]
|
|
870
|
+
def extract_method_type_return_type type, implicit_nil
|
|
871
|
+
tag = RbsTranslator.to_complex_type(type.type.return_type)
|
|
872
|
+
return ComplexType.parse("#{tag}, nil") if tag && implicit_nil
|
|
873
|
+
tag
|
|
716
874
|
end
|
|
717
875
|
|
|
718
876
|
# @param type_name [RBS::TypeName]
|
|
@@ -720,9 +878,7 @@ module Solargraph
|
|
|
720
878
|
# @return [ComplexType::UniqueType]
|
|
721
879
|
def build_type(type_name, type_args = [])
|
|
722
880
|
base = RBS_TO_YARD_TYPE[type_name.relative!.to_s] || type_name.relative!.to_s
|
|
723
|
-
params = type_args.map { |
|
|
724
|
-
ComplexType.try_parse(t).force_rooted
|
|
725
|
-
end
|
|
881
|
+
params = type_args.map { |arg| RbsTranslator.to_complex_type(arg).force_rooted }
|
|
726
882
|
if base == 'Hash' && params.length == 2
|
|
727
883
|
ComplexType::UniqueType.new(base, [params.first], [params.last], rooted: true, parameters_type: :hash)
|
|
728
884
|
else
|
|
@@ -730,80 +886,11 @@ module Solargraph
|
|
|
730
886
|
end
|
|
731
887
|
end
|
|
732
888
|
|
|
733
|
-
# @param type_name [RBS::TypeName]
|
|
734
|
-
# @param type_args [Enumerable<RBS::Types::Bases::Base>]
|
|
735
|
-
# @return [String]
|
|
736
|
-
def type_tag(type_name, type_args = [])
|
|
737
|
-
build_type(type_name, type_args).tags
|
|
738
|
-
end
|
|
739
|
-
|
|
740
|
-
# @param type [RBS::Types::Bases::Base]
|
|
741
|
-
# @return [String]
|
|
742
|
-
def other_type_to_tag type
|
|
743
|
-
if type.is_a?(RBS::Types::Optional)
|
|
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)
|
|
756
|
-
# @todo Better record support
|
|
757
|
-
'Hash'
|
|
758
|
-
elsif type.is_a?(RBS::Types::Bases::Nil)
|
|
759
|
-
'nil'
|
|
760
|
-
elsif type.is_a?(RBS::Types::Bases::Self)
|
|
761
|
-
'self'
|
|
762
|
-
elsif type.is_a?(RBS::Types::Bases::Void)
|
|
763
|
-
'void'
|
|
764
|
-
elsif type.is_a?(RBS::Types::Variable)
|
|
765
|
-
"#{Solargraph::ComplexType::GENERIC_TAG_NAME}<#{type.name}>"
|
|
766
|
-
elsif type.is_a?(RBS::Types::ClassInstance) #&& !type.args.empty?
|
|
767
|
-
type_tag(type.name, type.args)
|
|
768
|
-
elsif type.is_a?(RBS::Types::Bases::Instance)
|
|
769
|
-
'self'
|
|
770
|
-
elsif type.is_a?(RBS::Types::Bases::Top)
|
|
771
|
-
# top is the most super superclass
|
|
772
|
-
'BasicObject'
|
|
773
|
-
elsif type.is_a?(RBS::Types::Bases::Bottom)
|
|
774
|
-
# bottom is used in contexts where nothing will ever return
|
|
775
|
-
# - e.g., it could be the return type of 'exit()' or 'raise'
|
|
776
|
-
#
|
|
777
|
-
# @todo define a specific bottom type and use it to
|
|
778
|
-
# determine dead code
|
|
779
|
-
'undefined'
|
|
780
|
-
elsif type.is_a?(RBS::Types::Intersection)
|
|
781
|
-
type.types.map { |member| other_type_to_tag(member) }.join(', ')
|
|
782
|
-
elsif type.is_a?(RBS::Types::Proc)
|
|
783
|
-
'Proc'
|
|
784
|
-
elsif type.is_a?(RBS::Types::Alias)
|
|
785
|
-
# type-level alias use - e.g., 'bool' in "type bool = true | false"
|
|
786
|
-
# @todo ensure these get resolved after processing all aliases
|
|
787
|
-
# @todo handle recursive aliases
|
|
788
|
-
type_tag(type.name, type.args)
|
|
789
|
-
elsif type.is_a?(RBS::Types::Interface)
|
|
790
|
-
# represents a mix-in module which can be considered a
|
|
791
|
-
# subtype of a consumer of it
|
|
792
|
-
type_tag(type.name, type.args)
|
|
793
|
-
elsif type.is_a?(RBS::Types::ClassSingleton)
|
|
794
|
-
# e.g., singleton(String)
|
|
795
|
-
type_tag(type.name)
|
|
796
|
-
else
|
|
797
|
-
Solargraph.logger.warn "Unrecognized RBS type: #{type.class} at #{type.location}"
|
|
798
|
-
'undefined'
|
|
799
|
-
end
|
|
800
|
-
end
|
|
801
|
-
|
|
802
889
|
# @param decl [RBS::AST::Declarations::Class, RBS::AST::Declarations::Module]
|
|
803
|
-
# @param namespace [Pin::Namespace]
|
|
890
|
+
# @param namespace [Pin::Namespace, nil]
|
|
804
891
|
# @return [void]
|
|
805
892
|
def add_mixins decl, namespace
|
|
806
|
-
# @param mixin [RBS::AST::Members::Include, RBS::AST::Members::
|
|
893
|
+
# @param mixin [RBS::AST::Members::Include, RBS::AST::Members::Extend, RBS::AST::Members::Prepend]
|
|
807
894
|
decl.each_mixin do |mixin|
|
|
808
895
|
# @todo are we handling prepend correctly?
|
|
809
896
|
klass = mixin.is_a?(RBS::AST::Members::Include) ? Pin::Reference::Include : Pin::Reference::Extend
|