steep 1.7.0.dev.3 → 1.7.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/CHANGELOG.md +43 -0
- data/README.md +18 -0
- data/doc/narrowing.md +1 -1
- data/doc/shape.md +176 -0
- data/guides/src/gem-rbs-collection/gem-rbs-collection.md +7 -24
- data/lib/steep/ast/types/factory.rb +27 -18
- data/lib/steep/ast/types/proc.rb +14 -9
- data/lib/steep/interface/block.rb +1 -1
- data/lib/steep/interface/builder.rb +1 -0
- data/lib/steep/interface/function.rb +14 -6
- data/lib/steep/interface/method_type.rb +15 -7
- data/lib/steep/project/pattern.rb +1 -2
- data/lib/steep/rake_task.rb +132 -0
- data/lib/steep/server/interaction_worker.rb +6 -0
- data/lib/steep/server/lsp_formatter.rb +2 -0
- data/lib/steep/services/completion_provider.rb +1 -1
- data/lib/steep/services/file_loader.rb +15 -20
- data/lib/steep/services/signature_help_provider.rb +11 -9
- data/lib/steep/signature/validator.rb +1 -1
- data/lib/steep/subtyping/check.rb +15 -6
- data/lib/steep/subtyping/variable_variance.rb +3 -3
- data/lib/steep/type_construction.rb +186 -149
- data/lib/steep/type_inference/block_params.rb +1 -1
- data/lib/steep/type_inference/logic_type_interpreter.rb +2 -1
- data/lib/steep/type_inference/method_params.rb +16 -0
- data/lib/steep/type_inference/send_args.rb +5 -2
- data/lib/steep/version.rb +1 -1
- data/steep.gemspec +5 -2
- metadata +7 -145
- data/.github/dependabot.yml +0 -28
- data/.github/workflows/ruby-windows.yml +0 -35
- data/.github/workflows/ruby.yml +0 -32
- data/.vscode/steep-shared.code-snippets +0 -41
- data/Gemfile +0 -14
- data/Gemfile.lock +0 -104
- data/Gemfile.steep +0 -0
- data/gemfile_steep/Gemfile +0 -3
- data/gemfile_steep/Gemfile.lock +0 -77
- data/rbs_collection.steep.lock.yaml +0 -108
- data/rbs_collection.steep.yaml +0 -23
- data/sig/shims/bundler.rbs +0 -3
- data/sig/shims/concurrent-ruby.rbs +0 -39
- data/sig/shims/exception.rbs +0 -4
- data/sig/shims/language-server_protocol.rbs +0 -450
- data/sig/shims/parser/comment.rbs +0 -33
- data/sig/shims/parser/nodes.rbs +0 -252
- data/sig/shims/parser/source/map.rbs +0 -146
- data/sig/shims/parser/source/range.rbs +0 -237
- data/sig/shims/parser.rbs +0 -69
- data/sig/shims/string.rbs +0 -4
- data/sig/shims/tagged_logging.rbs +0 -6
- data/sig/shims/yaml.rbs +0 -4
- data/sig/steep/annotation_parser.rbs +0 -60
- data/sig/steep/ast/annotation/collection.rbs +0 -78
- data/sig/steep/ast/annotation.rbs +0 -121
- data/sig/steep/ast/builtin.rbs +0 -69
- data/sig/steep/ast/ignore.rbs +0 -66
- data/sig/steep/ast/node/type_application.rbs +0 -31
- data/sig/steep/ast/node/type_assertion.rbs +0 -32
- data/sig/steep/ast/types/any.rbs +0 -29
- data/sig/steep/ast/types/boolean.rbs +0 -31
- data/sig/steep/ast/types/bot.rbs +0 -29
- data/sig/steep/ast/types/class.rbs +0 -33
- data/sig/steep/ast/types/factory.rbs +0 -110
- data/sig/steep/ast/types/helper.rbs +0 -24
- data/sig/steep/ast/types/instance.rbs +0 -33
- data/sig/steep/ast/types/intersection.rbs +0 -40
- data/sig/steep/ast/types/literal.rbs +0 -35
- data/sig/steep/ast/types/logic.rbs +0 -83
- data/sig/steep/ast/types/name.rbs +0 -84
- data/sig/steep/ast/types/nil.rbs +0 -31
- data/sig/steep/ast/types/proc.rbs +0 -53
- data/sig/steep/ast/types/record.rbs +0 -39
- data/sig/steep/ast/types/self.rbs +0 -33
- data/sig/steep/ast/types/top.rbs +0 -29
- data/sig/steep/ast/types/tuple.rbs +0 -37
- data/sig/steep/ast/types/union.rbs +0 -40
- data/sig/steep/ast/types/var.rbs +0 -42
- data/sig/steep/ast/types/void.rbs +0 -29
- data/sig/steep/ast/types.rbs +0 -16
- data/sig/steep/cli.rbs +0 -55
- data/sig/steep/diagnostic/deprecated/else_on_exhaustive_case.rbs +0 -13
- data/sig/steep/diagnostic/deprecated/unknown_constant_assigned.rbs +0 -15
- data/sig/steep/diagnostic/helper.rbs +0 -15
- data/sig/steep/diagnostic/lsp_formatter.rbs +0 -36
- data/sig/steep/diagnostic/ruby.rbs +0 -703
- data/sig/steep/diagnostic/signature.rbs +0 -252
- data/sig/steep/drivers/annotations.rbs +0 -17
- data/sig/steep/drivers/check.rbs +0 -33
- data/sig/steep/drivers/checkfile.rbs +0 -27
- data/sig/steep/drivers/diagnostic_printer.rbs +0 -25
- data/sig/steep/drivers/init.rbs +0 -19
- data/sig/steep/drivers/langserver.rbs +0 -36
- data/sig/steep/drivers/print_project.rbs +0 -15
- data/sig/steep/drivers/stats.rbs +0 -47
- data/sig/steep/drivers/utils/driver_helper.rbs +0 -25
- data/sig/steep/drivers/utils/jobs_option.rbs +0 -19
- data/sig/steep/drivers/validate.rbs +0 -15
- data/sig/steep/drivers/vendor.rbs +0 -19
- data/sig/steep/drivers/watch.rbs +0 -27
- data/sig/steep/drivers/worker.rbs +0 -29
- data/sig/steep/equatable.rbs +0 -11
- data/sig/steep/expectations.rbs +0 -72
- data/sig/steep/index/rbs_index.rbs +0 -141
- data/sig/steep/index/signature_symbol_provider.rbs +0 -41
- data/sig/steep/index/source_index.rbs +0 -63
- data/sig/steep/interface/block.rbs +0 -41
- data/sig/steep/interface/builder.rbs +0 -152
- data/sig/steep/interface/function.rbs +0 -270
- data/sig/steep/interface/method_type.rbs +0 -105
- data/sig/steep/interface/shape.rbs +0 -80
- data/sig/steep/interface/substitution.rbs +0 -51
- data/sig/steep/interface/type_param.rbs +0 -43
- data/sig/steep/method_name.rbs +0 -30
- data/sig/steep/module_helper.rbs +0 -16
- data/sig/steep/node_helper.rbs +0 -91
- data/sig/steep/path_helper.rbs +0 -15
- data/sig/steep/project/dsl.rbs +0 -108
- data/sig/steep/project/options.rbs +0 -47
- data/sig/steep/project/pattern.rbs +0 -47
- data/sig/steep/project/target.rbs +0 -25
- data/sig/steep/project.rbs +0 -26
- data/sig/steep/range_extension.rbs +0 -7
- data/sig/steep/server/base_worker.rbs +0 -49
- data/sig/steep/server/change_buffer.rbs +0 -38
- data/sig/steep/server/delay_queue.rbs +0 -37
- data/sig/steep/server/interaction_worker.rbs +0 -90
- data/sig/steep/server/lsp_formatter.rbs +0 -63
- data/sig/steep/server/master.rbs +0 -299
- data/sig/steep/server/type_check_worker.rbs +0 -141
- data/sig/steep/server/worker_process.rbs +0 -97
- data/sig/steep/services/completion_provider.rbs +0 -264
- data/sig/steep/services/content_change.rbs +0 -37
- data/sig/steep/services/file_loader.rbs +0 -21
- data/sig/steep/services/goto_service.rbs +0 -106
- data/sig/steep/services/hover_provider/rbs.rbs +0 -47
- data/sig/steep/services/hover_provider/ruby.rbs +0 -127
- data/sig/steep/services/hover_provider/singleton_methods.rbs +0 -11
- data/sig/steep/services/path_assignment.rbs +0 -21
- data/sig/steep/services/signature_help_provider.rbs +0 -51
- data/sig/steep/services/signature_service.rbs +0 -156
- data/sig/steep/services/stats_calculator.rbs +0 -41
- data/sig/steep/services/type_check_service.rbs +0 -112
- data/sig/steep/services/type_name_completion.rbs +0 -135
- data/sig/steep/signature/validator.rbs +0 -85
- data/sig/steep/source/ignore_ranges.rbs +0 -38
- data/sig/steep/source.rbs +0 -105
- data/sig/steep/subtyping/cache.rbs +0 -17
- data/sig/steep/subtyping/check.rbs +0 -131
- data/sig/steep/subtyping/constraints.rbs +0 -111
- data/sig/steep/subtyping/relation.rbs +0 -63
- data/sig/steep/subtyping/result.rbs +0 -179
- data/sig/steep/subtyping/variable_variance.rbs +0 -25
- data/sig/steep/thread_waiter.rbs +0 -13
- data/sig/steep/type_construction.rbs +0 -542
- data/sig/steep/type_inference/block_params.rbs +0 -170
- data/sig/steep/type_inference/case_when.rbs +0 -130
- data/sig/steep/type_inference/constant_env.rbs +0 -29
- data/sig/steep/type_inference/context.rbs +0 -216
- data/sig/steep/type_inference/context_array.rbs +0 -38
- data/sig/steep/type_inference/logic_type_interpreter.rbs +0 -108
- data/sig/steep/type_inference/method_call.rbs +0 -124
- data/sig/steep/type_inference/method_params.rbs +0 -127
- data/sig/steep/type_inference/multiple_assignment.rbs +0 -76
- data/sig/steep/type_inference/send_args.rbs +0 -243
- data/sig/steep/type_inference/type_env.rbs +0 -160
- data/sig/steep/type_inference/type_env_builder.rbs +0 -81
- data/sig/steep/typing.rbs +0 -75
- data/sig/steep.rbs +0 -45
|
@@ -1,542 +0,0 @@
|
|
|
1
|
-
use Steep::AST::Types
|
|
2
|
-
|
|
3
|
-
module Steep
|
|
4
|
-
class TypeConstruction
|
|
5
|
-
class Pair
|
|
6
|
-
attr_reader type: AST::Types::t
|
|
7
|
-
|
|
8
|
-
attr_reader constr: TypeConstruction
|
|
9
|
-
|
|
10
|
-
def initialize: (type: AST::Types::t, constr: TypeConstruction) -> void
|
|
11
|
-
|
|
12
|
-
def with: (?type: AST::Types::t, ?constr: TypeConstruction) -> Pair
|
|
13
|
-
|
|
14
|
-
def +: (Pair other) -> Pair
|
|
15
|
-
|
|
16
|
-
def context: () -> TypeInference::Context
|
|
17
|
-
|
|
18
|
-
def to_ary: () -> [AST::Types::t, TypeConstruction, TypeInference::Context]
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
SPECIAL_LVAR_NAMES: Set[Symbol]
|
|
22
|
-
|
|
23
|
-
include NodeHelper
|
|
24
|
-
|
|
25
|
-
include ModuleHelper
|
|
26
|
-
|
|
27
|
-
attr_reader checker: Subtyping::Check
|
|
28
|
-
|
|
29
|
-
attr_reader source: Source
|
|
30
|
-
|
|
31
|
-
attr_reader annotations: AST::Annotation::Collection
|
|
32
|
-
|
|
33
|
-
attr_reader typing: Typing
|
|
34
|
-
|
|
35
|
-
attr_reader context: TypeInference::Context
|
|
36
|
-
|
|
37
|
-
%a{pure} def module_context: () -> TypeInference::Context::ModuleContext
|
|
38
|
-
|
|
39
|
-
# `method_context` is `nil` outside of any `def` syntax
|
|
40
|
-
#
|
|
41
|
-
%a{pure} def method_context: () -> TypeInference::Context::MethodContext?
|
|
42
|
-
|
|
43
|
-
def method_context!: () -> TypeInference::Context::MethodContext
|
|
44
|
-
|
|
45
|
-
%a{pure} def block_context: () -> TypeInference::Context::BlockContext?
|
|
46
|
-
|
|
47
|
-
def block_context!: () -> TypeInference::Context::BlockContext
|
|
48
|
-
|
|
49
|
-
%a{pure} def break_context: () -> TypeInference::Context::BreakContext?
|
|
50
|
-
|
|
51
|
-
%a{pure} def self_type: () -> AST::Types::t
|
|
52
|
-
|
|
53
|
-
%a{pure} def variable_context: () -> TypeInference::Context::TypeVariableContext
|
|
54
|
-
|
|
55
|
-
def initialize: (checker: untyped, source: untyped, annotations: untyped, typing: untyped, context: untyped) -> void
|
|
56
|
-
|
|
57
|
-
def with_new_typing: (Typing typing) -> TypeConstruction
|
|
58
|
-
|
|
59
|
-
def with_updated_context: (?type_env: TypeInference::TypeEnv) -> TypeConstruction
|
|
60
|
-
|
|
61
|
-
def with: (?annotations: untyped, ?context: TypeInference::Context, ?typing: untyped) -> TypeConstruction
|
|
62
|
-
|
|
63
|
-
def update_context: () { (TypeInference::Context) -> TypeInference::Context } -> TypeConstruction
|
|
64
|
-
|
|
65
|
-
def update_type_env: () { (TypeInference::TypeEnv) -> TypeInference::TypeEnv } -> TypeConstruction
|
|
66
|
-
|
|
67
|
-
def check_relation: (sub_type: AST::Types::t, super_type: AST::Types::t, ?constraints: Subtyping::Constraints) -> Subtyping::Result::t
|
|
68
|
-
|
|
69
|
-
# This is a variation of `#check_relation` method.
|
|
70
|
-
# It checks if given subtyping relation `sub_type <: super_type` holds or not, and returns truthy when *doesn't* hold.
|
|
71
|
-
#
|
|
72
|
-
# * Returns `nil` if holds
|
|
73
|
-
# * Returns subclass of `Result::Base` if the subtyping doesn't hold
|
|
74
|
-
#
|
|
75
|
-
# This allow you writing a subtyping check as:
|
|
76
|
-
#
|
|
77
|
-
# ```ruby
|
|
78
|
-
# if relation = no_subtyping?(sub_type: type1, super_type: type2)
|
|
79
|
-
# # Implement error reporting
|
|
80
|
-
# end
|
|
81
|
-
# ```
|
|
82
|
-
#
|
|
83
|
-
def no_subtyping?: (sub_type: AST::Types::t, super_type: AST::Types::t, ?constraints: Subtyping::Constraints) -> Subtyping::Result::Base?
|
|
84
|
-
|
|
85
|
-
def for_new_method: (Symbol method_name, Parser::AST::Node node, args: Array[Parser::AST::Node], self_type: untyped, definition: RBS::Definition?) -> TypeConstruction
|
|
86
|
-
|
|
87
|
-
def with_method_constr: (untyped method_name, untyped node, args: untyped, self_type: untyped, definition: untyped) { (untyped) -> untyped } -> untyped
|
|
88
|
-
|
|
89
|
-
def implement_module: (module_name: RBS::TypeName, annotations: AST::Annotation::Collection, ?super_name: RBS::TypeName?) -> AST::Annotation::Implements::Module?
|
|
90
|
-
|
|
91
|
-
def default_module_context: (AST::Annotation::Implements::Module? implement_module_name, nesting: RBS::Resolver::context) -> TypeInference::Context::ModuleContext
|
|
92
|
-
|
|
93
|
-
def for_module: (untyped node, untyped new_module_name) -> untyped
|
|
94
|
-
|
|
95
|
-
def with_module_constr: (untyped node, untyped module_name) { (untyped) -> untyped } -> untyped
|
|
96
|
-
|
|
97
|
-
def for_class: (untyped node, untyped new_class_name, untyped super_class_name) -> untyped
|
|
98
|
-
|
|
99
|
-
def with_class_constr: (untyped node, untyped new_class_name, untyped super_class_name) { (untyped) -> untyped } -> untyped
|
|
100
|
-
|
|
101
|
-
def with_sclass_constr: [A] (Parser::AST::Node node, AST::Types::t `type`) { (TypeConstruction?) -> A } -> A
|
|
102
|
-
|
|
103
|
-
# Returns one-level _meta_ type from given type
|
|
104
|
-
#
|
|
105
|
-
# * Returns singleton type of the type name if instance type is given
|
|
106
|
-
# * Returns `::Class` if singleton type is given
|
|
107
|
-
# * Returns `nil` otherwise
|
|
108
|
-
#
|
|
109
|
-
def meta_type: (AST::Types::t) -> AST::Types::t?
|
|
110
|
-
|
|
111
|
-
def for_sclass: (Parser::AST::Node node, AST::Types::t `type`) -> TypeConstruction?
|
|
112
|
-
|
|
113
|
-
def for_branch: (Parser::AST::Node node, ?break_context: TypeInference::Context::BreakContext?) -> TypeConstruction
|
|
114
|
-
|
|
115
|
-
def add_typing: (Parser::AST::Node node, type: AST::Types::t, ?constr: TypeConstruction) -> Pair
|
|
116
|
-
|
|
117
|
-
def add_call: (untyped call) -> untyped
|
|
118
|
-
|
|
119
|
-
def synthesize: (Parser::AST::Node node, ?hint: AST::Types::t?, ?condition: bool) -> Pair
|
|
120
|
-
|
|
121
|
-
def check: (Parser::AST::Node node, AST::Types::t `type`, ?constraints: Subtyping::Constraints) { (AST::Types::t, AST::Types::t, Subtyping::Result::t) -> void } -> Pair
|
|
122
|
-
|
|
123
|
-
def masgn_lhs?: (untyped lhs) -> untyped
|
|
124
|
-
|
|
125
|
-
def lvasgn: (Parser::AST::Node node, AST::Types::t) -> Pair
|
|
126
|
-
|
|
127
|
-
def ivasgn: (Parser::AST::Node node, AST::Types::t rhs_type) -> Pair
|
|
128
|
-
|
|
129
|
-
def gvasgn: (Parser::AST::Node node, AST::Types::t rhs_type) -> Pair
|
|
130
|
-
|
|
131
|
-
def type_masgn: (Parser::AST::Node node) -> Pair
|
|
132
|
-
|
|
133
|
-
def type_masgn_type: (Parser::AST::Node mlhs_node, AST::Types::t? rhs_type, masgn: TypeInference::MultipleAssignment, optional: bool) -> TypeConstruction?
|
|
134
|
-
|
|
135
|
-
def constant_typename: (Parser::AST::Node parent, Symbol name) -> RBS::TypeName?
|
|
136
|
-
|
|
137
|
-
# Synthesize a constant declaration -- :cdecl, :class, or :module
|
|
138
|
-
#
|
|
139
|
-
# * `node` is the node that references a constant
|
|
140
|
-
# * `parent_node` is the parent (namespace) of a constant reference
|
|
141
|
-
# * `constant_name` is the name of constant
|
|
142
|
-
#
|
|
143
|
-
# Yields a block that is expected to add an error, or it reports Diagnostic::Ruby::UnknownConstant if not given.
|
|
144
|
-
#
|
|
145
|
-
# Returns a tuple of
|
|
146
|
-
#
|
|
147
|
-
# * The type of the constant
|
|
148
|
-
# * TypeConstruction instance after the evaluation
|
|
149
|
-
# * The full name of the constant
|
|
150
|
-
#
|
|
151
|
-
def synthesize_constant_decl: (Parser::AST::Node? node, Parser::AST::Node? parent_node, Symbol constant_name) ?{ () -> void } -> [AST::Types::t, TypeConstruction, RBS::TypeName?]
|
|
152
|
-
|
|
153
|
-
# Synthesize a constant reference
|
|
154
|
-
#
|
|
155
|
-
# * `node` is the node that references a constant
|
|
156
|
-
# * `parent_node` is the parent (namespace) of a constant reference
|
|
157
|
-
# * `constant_name` is the name of constant
|
|
158
|
-
#
|
|
159
|
-
# Yields a block that is expected to add an error, or it reports Diagnostic::Ruby::UnknownConstant if not given.
|
|
160
|
-
#
|
|
161
|
-
# Returns a tuple of
|
|
162
|
-
#
|
|
163
|
-
# * The type of the constant
|
|
164
|
-
# * TypeConstruction instance after the evaluation
|
|
165
|
-
# * The full name of the constant
|
|
166
|
-
#
|
|
167
|
-
def synthesize_constant: (Parser::AST::Node? node, Parser::AST::Node? parent_node, Symbol constant_name) ?{ () -> void } -> [AST::Types::t, TypeConstruction, RBS::TypeName?]
|
|
168
|
-
|
|
169
|
-
# Returns a proc type if given type is a two clause union with the proc type and `nil`
|
|
170
|
-
#
|
|
171
|
-
def optional_proc?: (AST::Types::t) -> AST::Types::Proc?
|
|
172
|
-
|
|
173
|
-
def type_lambda: (Parser::AST::Node & Parser::AST::_BlockNode node, params_node: Parser::AST::Node, body_node: Parser::AST::Node?, type_hint: AST::Types::t?) -> Pair
|
|
174
|
-
|
|
175
|
-
def synthesize_children: (Parser::AST::Node node, ?skips: Array[Parser::AST::Node?]) -> TypeConstruction
|
|
176
|
-
|
|
177
|
-
# Synthesize `:send`, `:csend`, `:block`, and `:numblock` node
|
|
178
|
-
#
|
|
179
|
-
def synthesize_sendish: (Parser::AST::Node sendish, hint: AST::Types::t?, tapp: AST::Node::TypeApplication?) -> Pair
|
|
180
|
-
|
|
181
|
-
# The entrypoint to type check method calls, which may be with blocks
|
|
182
|
-
#
|
|
183
|
-
# * `send_node` can be `:send`, `:super`, or `:zsuper`
|
|
184
|
-
# * `node` can be `:send`, `:block`, `:super`, or `:zsuper`
|
|
185
|
-
# * Specify `unwrap` keyword `true` to type check safe-navigation-operator, that unwraps the type of reeiver automatically and make the return type optional
|
|
186
|
-
#
|
|
187
|
-
def type_send: (
|
|
188
|
-
Parser::AST::Node node,
|
|
189
|
-
send_node: Parser::AST::Node,
|
|
190
|
-
block_params: Parser::AST::Node?,
|
|
191
|
-
block_body: Parser::AST::Node?,
|
|
192
|
-
?unwrap: bool,
|
|
193
|
-
tapp: AST::Node::TypeApplication?,
|
|
194
|
-
hint: Types::t?
|
|
195
|
-
) -> Pair
|
|
196
|
-
|
|
197
|
-
# The second step to type check method calls, which handles type refinements on *pure* calls
|
|
198
|
-
#
|
|
199
|
-
# * It receives `interface` keyword, that is the shape of the receiver type
|
|
200
|
-
# * It receives `arguments` keyword, that is an array of argument nodes
|
|
201
|
-
#
|
|
202
|
-
def type_send_interface: (
|
|
203
|
-
Parser::AST::Node node,
|
|
204
|
-
interface: Interface::Shape,
|
|
205
|
-
receiver: Parser::AST::Node?,
|
|
206
|
-
receiver_type: AST::Types::t,
|
|
207
|
-
method_name: Symbol,
|
|
208
|
-
arguments: Array[Parser::AST::Node],
|
|
209
|
-
block_params: Parser::AST::Node?,
|
|
210
|
-
block_body: Parser::AST::Node?,
|
|
211
|
-
tapp: AST::Node::TypeApplication?,
|
|
212
|
-
hint: Types::t?
|
|
213
|
-
) -> Pair
|
|
214
|
-
|
|
215
|
-
# The third step to type check method calls, which tries all of the overlods defined for the method
|
|
216
|
-
#
|
|
217
|
-
# * It receives the `Shape::Entry` object that represents an method entry of a shape
|
|
218
|
-
# * Returns `nil` when it cannot find suitable one from more than one overloads
|
|
219
|
-
# * It means the type checker can report only *no suitable overlod detected for this args* 😫
|
|
220
|
-
#
|
|
221
|
-
def type_method_call: (
|
|
222
|
-
Parser::AST::Node node,
|
|
223
|
-
method_name: Symbol,
|
|
224
|
-
receiver_type: AST::Types::t,
|
|
225
|
-
method: Interface::Shape::Entry,
|
|
226
|
-
arguments: Array[Parser::AST::Node],
|
|
227
|
-
block_params: Parser::AST::Node?,
|
|
228
|
-
block_body: Parser::AST::Node?,
|
|
229
|
-
tapp: AST::Node::TypeApplication?,
|
|
230
|
-
hint: Types::t?
|
|
231
|
-
) -> [TypeInference::MethodCall::t, TypeConstruction]?
|
|
232
|
-
|
|
233
|
-
# The core to type check method calls, which implements type checking arguments including blocks and type inference
|
|
234
|
-
#
|
|
235
|
-
# * `receiver_type` and `method_name` are only used for error reporting
|
|
236
|
-
#
|
|
237
|
-
def try_method_type: (
|
|
238
|
-
Parser::AST::Node node,
|
|
239
|
-
receiver_type: AST::Types::t,
|
|
240
|
-
method_name: Symbol,
|
|
241
|
-
method_type: Interface::MethodType,
|
|
242
|
-
arguments: Array[Parser::AST::Node],
|
|
243
|
-
block_params: Parser::AST::Node?,
|
|
244
|
-
block_body: Parser::AST::Node?,
|
|
245
|
-
tapp: AST::Node::TypeApplication?,
|
|
246
|
-
hint: Types::t?
|
|
247
|
-
) -> [TypeInference::MethodCall::t, TypeConstruction]
|
|
248
|
-
|
|
249
|
-
# Extra step to type check method calls, which implements custom typing rules based on the methods
|
|
250
|
-
#
|
|
251
|
-
# * Returns `nil` if the `method_type` object is not associated to a method with custom typing rules
|
|
252
|
-
#
|
|
253
|
-
def try_special_method: (
|
|
254
|
-
Parser::AST::Node node,
|
|
255
|
-
receiver_type: AST::Types::t,
|
|
256
|
-
method_name: Symbol,
|
|
257
|
-
method_type: Interface::MethodType,
|
|
258
|
-
arguments: Array[Parser::AST::Node],
|
|
259
|
-
block_params: Parser::AST::Node?,
|
|
260
|
-
block_body: Parser::AST::Node?,
|
|
261
|
-
hint: Types::t?
|
|
262
|
-
) -> [TypeInference::MethodCall::t, TypeConstruction]?
|
|
263
|
-
|
|
264
|
-
def builder_config: () -> Interface::Builder::Config
|
|
265
|
-
|
|
266
|
-
# Calculates the shape (interface) of an type
|
|
267
|
-
#
|
|
268
|
-
# * Returns `nil` if the type cannot be translated to a shape
|
|
269
|
-
# * Returns Shape::Entry instead of Shape when `method_name` is given
|
|
270
|
-
#
|
|
271
|
-
def calculate_interface: (AST::Types::t `type`, private: bool) -> Interface::Shape?
|
|
272
|
-
| (AST::Types::t `type`, Symbol method_name, private: bool) -> Interface::Shape::Entry?
|
|
273
|
-
|
|
274
|
-
def expand_self: (AST::Types::t `type`) -> AST::Types::t
|
|
275
|
-
|
|
276
|
-
SPECIAL_METHOD_NAMES: Hash[Symbol, Set[method_name]]
|
|
277
|
-
|
|
278
|
-
KNOWN_PURE_METHODS: Set[method_name]
|
|
279
|
-
|
|
280
|
-
def inspect: () -> ::String
|
|
281
|
-
|
|
282
|
-
def with_child_typing: [A] (range: Range[Integer]) { (TypeConstruction) -> A } -> A
|
|
283
|
-
| (range: Range[Integer]) -> TypeConstruction
|
|
284
|
-
|
|
285
|
-
# Bypass :splat and :kwsplat
|
|
286
|
-
def bypass_splat: (untyped node) { (untyped) -> untyped } -> untyped
|
|
287
|
-
|
|
288
|
-
# Solve a constraint in the block and return a substitution if succeeds.
|
|
289
|
-
#
|
|
290
|
-
# * When the constraint has a solution, `#apply_solution` returns a tuple of substituted `MethodType`, `true`, and the substitution.
|
|
291
|
-
# * When the constraint doesn't have a solution, `#apply_solution` returns a tuple of the original `MethodType`, `false`, and empty substitution.
|
|
292
|
-
#
|
|
293
|
-
def apply_solution: (
|
|
294
|
-
Array[Diagnostic::Ruby::Base] errors,
|
|
295
|
-
node: Parser::AST::Node,
|
|
296
|
-
method_type: Interface::MethodType
|
|
297
|
-
) {
|
|
298
|
-
() -> Interface::Substitution
|
|
299
|
-
} -> [Interface::MethodType, bool, Interface::Substitution]
|
|
300
|
-
|
|
301
|
-
def eliminate_vars: (untyped `type`, untyped variables, ?to: untyped) -> untyped
|
|
302
|
-
|
|
303
|
-
# Type check arguments
|
|
304
|
-
#
|
|
305
|
-
# * Receives the `method_name` of a method that is being called
|
|
306
|
-
# * `method_name` is `nil` if it type checks arguments of block or proc
|
|
307
|
-
#
|
|
308
|
-
def type_check_args: (
|
|
309
|
-
Symbol | nil,
|
|
310
|
-
TypeInference::SendArgs,
|
|
311
|
-
Subtyping::Constraints,
|
|
312
|
-
Array[Diagnostic::Ruby::Base]
|
|
313
|
-
) -> TypeConstruction
|
|
314
|
-
|
|
315
|
-
# Type check arguments without known method type
|
|
316
|
-
#
|
|
317
|
-
# This handles `:splat` nodes and `:kwargs` node that appears as an argument.
|
|
318
|
-
#
|
|
319
|
-
def type_check_untyped_args: (Array[Parser::AST::Node] arguments) -> TypeConstruction
|
|
320
|
-
|
|
321
|
-
def type_check_argument: (Parser::AST::Node node, type: AST::Types::t, constraints: Subtyping::Constraints, errors: Array[Diagnostic::Ruby::Base], ?report_node: Parser::AST::Node) -> Pair
|
|
322
|
-
|
|
323
|
-
def type_block_without_hint: (node: Parser::AST::Node & Parser::AST::_BlockNode, block_annotations: AST::Annotation::Collection, block_params: TypeInference::BlockParams?, block_body: Parser::AST::Node?) ?{ (Diagnostic::Ruby::Base) -> void } -> void
|
|
324
|
-
|
|
325
|
-
def set_up_block_mlhs_params_env: (
|
|
326
|
-
Parser::AST::Node mlhs_node,
|
|
327
|
-
AST::Types::t type,
|
|
328
|
-
Hash[Symbol?, AST::Types::t]
|
|
329
|
-
) { (Parser::AST::Node error_mlhs_node, AST::Types::t type) -> void } -> void
|
|
330
|
-
|
|
331
|
-
# Returns a Pair of
|
|
332
|
-
#
|
|
333
|
-
# * TypeConstruction to type check the block, and
|
|
334
|
-
# * Set of local variable names to unpin after type checking the block
|
|
335
|
-
#
|
|
336
|
-
# ### Arguments
|
|
337
|
-
#
|
|
338
|
-
# * `body_node` Block body node
|
|
339
|
-
# * `block_params` BlockParams object
|
|
340
|
-
# * `block_param_hint` Type hint of the block parameters
|
|
341
|
-
# * `block_type_hint` Type hint of the block body
|
|
342
|
-
# * `block_block_hint` Type hint of the block that will be given to the block
|
|
343
|
-
# * `block_annotations` Annotations given to the block body
|
|
344
|
-
# * `node_type_hint` Type hint of block call node
|
|
345
|
-
#
|
|
346
|
-
def for_block: (
|
|
347
|
-
Parser::AST::Node? body_node,
|
|
348
|
-
block_params: TypeInference::BlockParams,
|
|
349
|
-
block_param_hint: Interface::Function::Params?,
|
|
350
|
-
block_type_hint: AST::Types::t?,
|
|
351
|
-
block_block_hint: Interface::Block?,
|
|
352
|
-
block_annotations: AST::Annotation::Collection,
|
|
353
|
-
node_type_hint: AST::Types::t?,
|
|
354
|
-
block_self_hint: AST::Types::t?
|
|
355
|
-
) -> TypeConstruction
|
|
356
|
-
|
|
357
|
-
# Synthesize the block body and returns the type of the body
|
|
358
|
-
#
|
|
359
|
-
# The constructor can be safely discarded because it cannot change anything outer than block.
|
|
360
|
-
#
|
|
361
|
-
def synthesize_block: (
|
|
362
|
-
node: Parser::AST::Node & Parser::AST::_BlockNode,
|
|
363
|
-
block_type_hint: AST::Types::t?,
|
|
364
|
-
block_body: Parser::AST::Node?
|
|
365
|
-
) -> AST::Types::t
|
|
366
|
-
|
|
367
|
-
%a{pure} def nesting: () -> RBS::Resolver::context
|
|
368
|
-
|
|
369
|
-
def absolute_name: (untyped name) -> untyped
|
|
370
|
-
|
|
371
|
-
def union_type: (*AST::Types::t? types) -> AST::Types::t
|
|
372
|
-
|
|
373
|
-
# Returns union type of given types
|
|
374
|
-
#
|
|
375
|
-
# If one of the types is a subtype of another type, the _subtype_ will be ignored.
|
|
376
|
-
#
|
|
377
|
-
# ```ruby
|
|
378
|
-
# union_type(`String`, `Object`) # => `Object`
|
|
379
|
-
# union_type(`String`, `Integer`) # => `String | Integer`
|
|
380
|
-
# ```
|
|
381
|
-
#
|
|
382
|
-
def union_type_unify: (*AST::Types::t types) -> AST::Types::t
|
|
383
|
-
|
|
384
|
-
# Translate a union of tuple types to a tuple of union types
|
|
385
|
-
#
|
|
386
|
-
# * ([A, B] | [C, D, E]) => [A | C, B | D, E?]
|
|
387
|
-
#
|
|
388
|
-
# Returns `nil` if the translation cannot apply.
|
|
389
|
-
#
|
|
390
|
-
def union_of_tuple_to_tuple_of_union: (AST::Types::Union) -> AST::Types::Tuple?
|
|
391
|
-
|
|
392
|
-
def validate_method_definitions: (Parser::AST::Node node, AST::Annotation::Implements::Module module_name) -> void
|
|
393
|
-
|
|
394
|
-
def fallback_to_any: (Parser::AST::Node node) ?{ () -> Diagnostic::Ruby::Base } -> Pair
|
|
395
|
-
|
|
396
|
-
# Return `true` if `node` is `self.class`
|
|
397
|
-
def self_class?: (Parser::AST::Node node) -> bool
|
|
398
|
-
|
|
399
|
-
# Returns `true` if the given `node` is a `class` or `module` declaration that only contains module/class definitions
|
|
400
|
-
#
|
|
401
|
-
def namespace_module?: (Parser::AST::Node node) -> bool
|
|
402
|
-
|
|
403
|
-
def type_any_rec: (Parser::AST::Node node, ?only_children: bool) -> Pair
|
|
404
|
-
|
|
405
|
-
def unwrap: (AST::Types::t `type`) -> AST::Types::t
|
|
406
|
-
|
|
407
|
-
# Returns `nil` if `type` is recursive
|
|
408
|
-
#
|
|
409
|
-
# See `Factory#deep_expand_alias`.
|
|
410
|
-
#
|
|
411
|
-
def deep_expand_alias: (AST::Types::t `type`) -> AST::Types::t?
|
|
412
|
-
|
|
413
|
-
# `A | B | ... | Z` => `[A, B, ..., Z]`
|
|
414
|
-
def flatten_union: (AST::Types::t) -> Array[AST::Types::t]
|
|
415
|
-
|
|
416
|
-
def select_flatten_types: (AST::Types::t) { (AST::Types::t) -> boolish } -> Array[AST::Types::t]
|
|
417
|
-
|
|
418
|
-
def partition_flatten_types: (AST::Types::t) { (AST::Types::t) -> boolish } -> [Array[AST::Types::t], Array[AST::Types::t]]
|
|
419
|
-
|
|
420
|
-
def flatten_array_elements: (AST::Types::t) -> Array[AST::Types::t]
|
|
421
|
-
|
|
422
|
-
def expand_alias: (AST::Types::t `type`) -> AST::Types::t
|
|
423
|
-
| [A] (AST::Types::t) { (AST::Types::t) -> A } -> A
|
|
424
|
-
|
|
425
|
-
def test_literal_type: (untyped literal, untyped hint) -> (untyped | nil)
|
|
426
|
-
|
|
427
|
-
def to_instance_type: (untyped `type`, ?args: untyped?) -> untyped
|
|
428
|
-
|
|
429
|
-
# Synthesize the type of a node, assuming it has tuple type when possible
|
|
430
|
-
#
|
|
431
|
-
# * Try `#try_tuple_type` if applicable, or
|
|
432
|
-
# * Run the normal `#synthesize` else
|
|
433
|
-
#
|
|
434
|
-
def try_tuple_type!: (Parser::AST::Node node, ?hint: AST::Types::t?) -> Pair
|
|
435
|
-
|
|
436
|
-
# Try to give `array_node` a tuple type
|
|
437
|
-
#
|
|
438
|
-
# * If `hint` is given, the array element would receive a hint of element of `hint` type.
|
|
439
|
-
# * If `hint` it not given, `array_node` is assumed to have a tuple type, but no assumption on element types.
|
|
440
|
-
#
|
|
441
|
-
# Returns `nil` when `array_node` includes `*` (splat) node.
|
|
442
|
-
#
|
|
443
|
-
# ```ruby
|
|
444
|
-
# try_tuple_type(`[1, 2]`, nil) # => `[Integer, Integer, Integer]`
|
|
445
|
-
# try_tuple_type(`[1]`, `[Integer, Integer]`) # => `[Integer]`
|
|
446
|
-
# try_tuple_type(`[1, 2]`, `[Integer]`) # => `[Integer, Integer]`
|
|
447
|
-
# try_tuple_type(`[1, *]`, `[Integer]`) # => nil
|
|
448
|
-
# ```
|
|
449
|
-
#
|
|
450
|
-
# Note that `typing` will be updated even when it returns `nil`.
|
|
451
|
-
# You probably should try `with_new_typing` to make the result _atomic_.
|
|
452
|
-
#
|
|
453
|
-
def try_tuple_type: (Parser::AST::Node array_node, AST::Types::Tuple? hint) -> Pair?
|
|
454
|
-
|
|
455
|
-
# Try to convert an object of `type` with zero-arity method `method`.
|
|
456
|
-
#
|
|
457
|
-
# Returns `nil` when
|
|
458
|
-
#
|
|
459
|
-
# 1. The `type` cannot be converted to an interface, or
|
|
460
|
-
# 2. There is no that `conversion` method defined
|
|
461
|
-
#
|
|
462
|
-
# ```ruby
|
|
463
|
-
# try_convert(`::Object`, :to_s) # Returns `::String`
|
|
464
|
-
# try_convert(`::String`, :to_ary) # Returns nil
|
|
465
|
-
# ```
|
|
466
|
-
#
|
|
467
|
-
def try_convert: (AST::Types::t `type`, Symbol method) -> AST::Types::t?
|
|
468
|
-
|
|
469
|
-
# Try to convert an object of `type` to an Array-ish
|
|
470
|
-
#
|
|
471
|
-
# * `untyped` is arrayish
|
|
472
|
-
#
|
|
473
|
-
def try_convert_to_array: (AST::Types::t) -> AST::Types::t?
|
|
474
|
-
|
|
475
|
-
# Returns a type if given type is arrayish
|
|
476
|
-
#
|
|
477
|
-
# * Aliases will be unfolded to arrayish type
|
|
478
|
-
# * Returns `nil` if given type is not arrayish
|
|
479
|
-
# * `untyped` is arrayish if `untyped_is:` is `true` (defaults to `false`)
|
|
480
|
-
#
|
|
481
|
-
def arrayish_type?: (AST::Types::t, ?untyped_is: bool) -> AST::Types::t?
|
|
482
|
-
|
|
483
|
-
# Returns the type is given type is a subtype of Array
|
|
484
|
-
def semantically_arrayish_type?: (AST::Types::t) -> AST::Types::t?
|
|
485
|
-
|
|
486
|
-
# Give an array node a type with hint
|
|
487
|
-
#
|
|
488
|
-
def try_array_type: (Parser::AST::Node node, AST::Types::Name::Instance? hint) -> Pair
|
|
489
|
-
|
|
490
|
-
# Returns a record type if `hash_node` can have a record type.
|
|
491
|
-
#
|
|
492
|
-
# You can give a hint through `record_type` by passing a `AST::Types::Record` object.
|
|
493
|
-
# If you pass `nil`, then we know the type is expected to be a record, but the detail is not given.
|
|
494
|
-
#
|
|
495
|
-
# Returns `nil` when the `hash_node` cannot have a record type.
|
|
496
|
-
#
|
|
497
|
-
def type_hash_record: (Parser::AST::Node hash_node, AST::Types::Record? record_type) -> Pair?
|
|
498
|
-
|
|
499
|
-
# Give hash_node a type based on hint.
|
|
500
|
-
#
|
|
501
|
-
# * When hint is Record type, it may have record type.
|
|
502
|
-
# * When hint is union type, it tries recursively with the union cases.
|
|
503
|
-
# * Otherwise, it tries to be a hash instance.
|
|
504
|
-
#
|
|
505
|
-
def type_hash: (Parser::AST::Node hash_node, hint: AST::Types::t?) -> Pair
|
|
506
|
-
|
|
507
|
-
# Returns the first one from elements of `types` that returns a type `t` where `t <: hint`.
|
|
508
|
-
#
|
|
509
|
-
def pick_one_of: (Array[AST::Types::t] types, range: untyped) { (AST::Types::t hint, TypeConstruction) -> Pair? } -> Pair?
|
|
510
|
-
|
|
511
|
-
# *Commit* the transaction (current typing) and returns a `TypeConstruction` with saved typing
|
|
512
|
-
#
|
|
513
|
-
# ```ruby
|
|
514
|
-
# transaction = typing.new_child(range) {|child| constr.with_new_typing(child) }
|
|
515
|
-
#
|
|
516
|
-
# # Do something that may fail
|
|
517
|
-
#
|
|
518
|
-
# if succeeded
|
|
519
|
-
# # Commit the may-fail operation
|
|
520
|
-
# constr = transaction.save_typing()
|
|
521
|
-
# else
|
|
522
|
-
# # Abort the transaction
|
|
523
|
-
# end
|
|
524
|
-
# ```
|
|
525
|
-
def save_typing: () -> TypeConstruction
|
|
526
|
-
|
|
527
|
-
# Returns `true` if a method call can be identified as _pure_:
|
|
528
|
-
#
|
|
529
|
-
# * The `node` is not a call with block,
|
|
530
|
-
# * It always calls _pure_ method,
|
|
531
|
-
# * The `receiver` is _pure_, and
|
|
532
|
-
# * All of the arguments are _pure_
|
|
533
|
-
#
|
|
534
|
-
def pure_send?: (TypeInference::MethodCall::Typed call, Parser::AST::Node? receiver, Array[Parser::AST::Node] arguments) -> bool
|
|
535
|
-
|
|
536
|
-
def type_name: (AST::Types::t) -> RBS::TypeName?
|
|
537
|
-
|
|
538
|
-
def singleton_type: (AST::Types::t) -> AST::Types::t?
|
|
539
|
-
|
|
540
|
-
def instance_type: (AST::Types::t) -> AST::Types::t?
|
|
541
|
-
end
|
|
542
|
-
end
|