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,170 +0,0 @@
|
|
|
1
|
-
module Steep
|
|
2
|
-
module TypeInference
|
|
3
|
-
# Block parameters have the following differences from method parameters:
|
|
4
|
-
#
|
|
5
|
-
# * Allows arity mismatch
|
|
6
|
-
# * Distributing array-ish argument to parameters
|
|
7
|
-
# * Allows _multiple_ parameter assignments
|
|
8
|
-
#
|
|
9
|
-
# ### Allows arity mismatch
|
|
10
|
-
#
|
|
11
|
-
# (TBD)
|
|
12
|
-
#
|
|
13
|
-
# ### Distributing array-ish argument to parameters
|
|
14
|
-
#
|
|
15
|
-
# A block can receive an array(-ish) argument as follows:
|
|
16
|
-
# Assume `yield [1,2,3]` evaluates to call the block.
|
|
17
|
-
#
|
|
18
|
-
# 1. With one parameter `{|x| ... }` (`x` is `[1, 2, 3]`)
|
|
19
|
-
# 2. With several parameters (splatting) `{|x, y, z| ... }` (`x` is `1`, ...)
|
|
20
|
-
#
|
|
21
|
-
# The splatting applies only when one argument that is an array-ish is yielded.
|
|
22
|
-
#
|
|
23
|
-
# Because we have another rule which allows parameter omission, Ruby has another rule to avoid ambiguity.
|
|
24
|
-
#
|
|
25
|
-
# 3. One parameter with trailing comma splats `{|x,| ... }` (`x` is `1`)
|
|
26
|
-
#
|
|
27
|
-
# The parser has `:procarg0` node for case 1 and `arg` nodes for other cases.
|
|
28
|
-
#
|
|
29
|
-
# ### Allows _multiple_ parameter assignments
|
|
30
|
-
#
|
|
31
|
-
class BlockParams
|
|
32
|
-
# Param object represents a block parameter
|
|
33
|
-
#
|
|
34
|
-
# * `var` is name of the parameter
|
|
35
|
-
# * `type` is the type of the parameter, if given through inline annotation
|
|
36
|
-
# * `value` is the default value node
|
|
37
|
-
# * `node` is the node of the parameter
|
|
38
|
-
#
|
|
39
|
-
class Param
|
|
40
|
-
attr_reader var: Symbol?
|
|
41
|
-
|
|
42
|
-
attr_reader type: AST::Types::t?
|
|
43
|
-
|
|
44
|
-
attr_reader value: Parser::AST::Node?
|
|
45
|
-
|
|
46
|
-
attr_reader node: Parser::AST::Node
|
|
47
|
-
|
|
48
|
-
def initialize: (var: Symbol?, type: AST::Types::t?, value: Parser::AST::Node?, node: Parser::AST::Node) -> void
|
|
49
|
-
|
|
50
|
-
def ==: (untyped other) -> bool
|
|
51
|
-
|
|
52
|
-
alias eql? ==
|
|
53
|
-
|
|
54
|
-
def hash: () -> Integer
|
|
55
|
-
|
|
56
|
-
def each_param: () { (Param) -> void } -> void
|
|
57
|
-
| () -> Enumerator[Param, void]
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
# MultipleParam object represents a _multiple_ block parameter
|
|
61
|
-
#
|
|
62
|
-
# ```ruby
|
|
63
|
-
# foo do |(x, y)|
|
|
64
|
-
# # ^^^^^^ This is the multiple block parameter
|
|
65
|
-
# end
|
|
66
|
-
# ```
|
|
67
|
-
#
|
|
68
|
-
# * `#node` is `:mlhs` node or `:procarg0` node
|
|
69
|
-
# * Param objects in `#params` don't have `value` because of Ruby syntax rule
|
|
70
|
-
#
|
|
71
|
-
class MultipleParam
|
|
72
|
-
attr_reader node: Parser::AST::Node
|
|
73
|
-
|
|
74
|
-
attr_reader params: Array[Param | MultipleParam]
|
|
75
|
-
|
|
76
|
-
def initialize: (node: Parser::AST::Node, params: Array[Param | MultipleParam]) -> void
|
|
77
|
-
|
|
78
|
-
def ==: (untyped other) -> bool
|
|
79
|
-
|
|
80
|
-
alias eql? ==
|
|
81
|
-
|
|
82
|
-
def hash: () -> Integer
|
|
83
|
-
|
|
84
|
-
# Returns a hash table that associates variables to its type annotation
|
|
85
|
-
#
|
|
86
|
-
def variable_types: () -> Hash[Symbol, AST::Types::t?]
|
|
87
|
-
|
|
88
|
-
# Yields Param objects in `self` and it's `params` recursively
|
|
89
|
-
#
|
|
90
|
-
def each_param: () { (Param) -> void } -> void
|
|
91
|
-
| () -> Enumerator[Param, void]
|
|
92
|
-
|
|
93
|
-
# Type that is constructed from `#params` type annotations
|
|
94
|
-
#
|
|
95
|
-
# Returns `nil` any part of the params is left un-annotated.
|
|
96
|
-
#
|
|
97
|
-
def type: () -> AST::Types::t?
|
|
98
|
-
end
|
|
99
|
-
|
|
100
|
-
attr_reader leading_params: Array[Param | MultipleParam]
|
|
101
|
-
|
|
102
|
-
attr_reader optional_params: Array[Param]
|
|
103
|
-
|
|
104
|
-
attr_reader rest_param: Param?
|
|
105
|
-
|
|
106
|
-
attr_reader trailing_params: Array[Param | MultipleParam]
|
|
107
|
-
|
|
108
|
-
attr_reader block_param: Param?
|
|
109
|
-
|
|
110
|
-
def initialize: (
|
|
111
|
-
leading_params: Array[Param | MultipleParam],
|
|
112
|
-
optional_params: Array[Param],
|
|
113
|
-
rest_param: Param?,
|
|
114
|
-
trailing_params: Array[Param | MultipleParam],
|
|
115
|
-
block_param: Param?
|
|
116
|
-
) -> void
|
|
117
|
-
|
|
118
|
-
def params: () -> Array[Param | MultipleParam]
|
|
119
|
-
|
|
120
|
-
def self.from_node: (Parser::AST::Node node, annotations: AST::Annotation::Collection) -> BlockParams
|
|
121
|
-
|
|
122
|
-
def self.from_multiple: (Parser::AST::Node node, AST::Annotation::Collection) -> MultipleParam
|
|
123
|
-
|
|
124
|
-
def params_type: (?hint: Interface::Function::Params?) -> Interface::Function::Params
|
|
125
|
-
|
|
126
|
-
def params_type0: (hint: nil) -> Interface::Function::Params
|
|
127
|
-
| (hint: Interface::Function::Params?) -> Interface::Function::Params?
|
|
128
|
-
|
|
129
|
-
def zip: (
|
|
130
|
-
Interface::Function::Params params_type,
|
|
131
|
-
Interface::Block? block,
|
|
132
|
-
factory: AST::Types::Factory
|
|
133
|
-
) -> Array[[Param | MultipleParam, AST::Types::t]]
|
|
134
|
-
|
|
135
|
-
# Returns true if given possible block yields are subject to auto expand/splat
|
|
136
|
-
#
|
|
137
|
-
# ```rbs
|
|
138
|
-
# { (Array[String]) -> void } # Array[String]
|
|
139
|
-
# { ([Integer, String]) -> void } # [Integer, String]
|
|
140
|
-
# { (String) -> void } # nil
|
|
141
|
-
# ```
|
|
142
|
-
#
|
|
143
|
-
def expandable_params?: (Interface::Function::Params params_type, AST::Types::Factory) -> AST::Types::t?
|
|
144
|
-
|
|
145
|
-
# Returns true if the block is defined to expand/splat automatically
|
|
146
|
-
#
|
|
147
|
-
# ```ruby
|
|
148
|
-
# foo {|x, y| ... } # true (has multiple parameters)
|
|
149
|
-
# foo {|x, *x| ... } # true (has normal and rest parameters)
|
|
150
|
-
# foo {|x,| ... } # true s(:arg, :x) (has one parameter with trailing comma)
|
|
151
|
-
# foo {|x| ... } # false s(:procarg0, s(:arg :x))
|
|
152
|
-
# ```
|
|
153
|
-
#
|
|
154
|
-
def expandable?: () -> bool
|
|
155
|
-
|
|
156
|
-
def each: () { (Param | MultipleParam) -> void } -> void
|
|
157
|
-
| () -> Enumerator[Param | MultipleParam, void]
|
|
158
|
-
|
|
159
|
-
# Yields `Param` recursively
|
|
160
|
-
#
|
|
161
|
-
def each_single_param: () { (Param) -> void } -> void
|
|
162
|
-
|
|
163
|
-
# Returns true if the parameter is single `untyped`
|
|
164
|
-
#
|
|
165
|
-
# This will automatically distribute `untyped` on block parameters.
|
|
166
|
-
#
|
|
167
|
-
def untyped_args?: (Interface::Function::Params) -> bool
|
|
168
|
-
end
|
|
169
|
-
end
|
|
170
|
-
end
|
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
use Parser::AST::Node
|
|
2
|
-
use Steep::TypeConstruction::Pair, Steep::TypeInference::LogicTypeInterpreter::Result
|
|
3
|
-
use Steep::NodeHelper::condition_loc, Steep::NodeHelper::keyword_loc
|
|
4
|
-
|
|
5
|
-
module Steep
|
|
6
|
-
module TypeInference
|
|
7
|
-
class CaseWhen
|
|
8
|
-
class WhenPatterns
|
|
9
|
-
include NodeHelper
|
|
10
|
-
|
|
11
|
-
attr_reader logic: LogicTypeInterpreter
|
|
12
|
-
|
|
13
|
-
attr_reader initial_constr: TypeConstruction
|
|
14
|
-
|
|
15
|
-
# True if the `when` clause is unreachable
|
|
16
|
-
attr_reader unreachable_clause: bool
|
|
17
|
-
|
|
18
|
-
@assignment_node: Node
|
|
19
|
-
|
|
20
|
-
attr_reader pattern_results: Array[[Node, Result, Result]]
|
|
21
|
-
|
|
22
|
-
def initialize: (LogicTypeInterpreter logic, TypeConstruction initial_constr, bool unreachable, Node assignment_node) -> void
|
|
23
|
-
|
|
24
|
-
def add_pattern: (Node pattern) { (Node, TypeConstruction, bool) -> Pair } -> void
|
|
25
|
-
|
|
26
|
-
# The result for body of the when-clause
|
|
27
|
-
#
|
|
28
|
-
# Raises an error when no patern is registered.
|
|
29
|
-
#
|
|
30
|
-
def body_result: () { (TypeEnv) -> TypeEnv? } -> [TypeConstruction, bool]
|
|
31
|
-
|
|
32
|
-
# The result for next when-clause
|
|
33
|
-
#
|
|
34
|
-
# Raises an error when no patern is registered.
|
|
35
|
-
#
|
|
36
|
-
def falsy_result: () -> [TypeConstruction, bool]
|
|
37
|
-
|
|
38
|
-
# The result for incoming pattern
|
|
39
|
-
def latest_result: () -> [TypeConstruction, bool]
|
|
40
|
-
|
|
41
|
-
# Returns new object equivalent to @assignment_node
|
|
42
|
-
def assignment_node: () -> Node
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
type when_result = [
|
|
46
|
-
Result, # Type of the body of the when-clause
|
|
47
|
-
Result # Result for the case the when-clause doesn't match
|
|
48
|
-
]
|
|
49
|
-
|
|
50
|
-
include NodeHelper
|
|
51
|
-
extend NodeHelper
|
|
52
|
-
|
|
53
|
-
# The location of `#node`
|
|
54
|
-
attr_reader location: condition_loc
|
|
55
|
-
|
|
56
|
-
# `case` node
|
|
57
|
-
attr_reader node: Node
|
|
58
|
-
|
|
59
|
-
attr_reader condition_node: Node
|
|
60
|
-
|
|
61
|
-
attr_reader when_nodes: Array[Node]
|
|
62
|
-
|
|
63
|
-
attr_reader else_node: Node?
|
|
64
|
-
|
|
65
|
-
attr_reader logic: LogicTypeInterpreter
|
|
66
|
-
|
|
67
|
-
attr_reader clause_results: Array[when_result]
|
|
68
|
-
|
|
69
|
-
attr_reader else_result: Pair?
|
|
70
|
-
|
|
71
|
-
# Fresh local variable name that contains the value of `#condition_node`
|
|
72
|
-
attr_reader var_name: Symbol
|
|
73
|
-
|
|
74
|
-
# `lvasgn` node that propagates the value of `#condition_node` to local variables
|
|
75
|
-
attr_reader assignment_node: Node
|
|
76
|
-
|
|
77
|
-
# A node that points to the value of `#condition_node`
|
|
78
|
-
#
|
|
79
|
-
# `nil` if it is an local variable.
|
|
80
|
-
#
|
|
81
|
-
attr_reader value_node: Node?
|
|
82
|
-
|
|
83
|
-
# The result of the type checking of `#condition_node`
|
|
84
|
-
#
|
|
85
|
-
attr_reader initial_constr: TypeConstruction
|
|
86
|
-
|
|
87
|
-
# The public API
|
|
88
|
-
#
|
|
89
|
-
# It type checks given `case` node with condition node, and records types and errors of sub nodes.
|
|
90
|
-
#
|
|
91
|
-
def self.type_check: (TypeConstruction, Node, LogicTypeInterpreter, hint: AST::Types::t?, condition: bool) -> [Array[AST::Types::t], Array[TypeEnv]]
|
|
92
|
-
|
|
93
|
-
def initialize: (Node, LogicTypeInterpreter) { (Node) -> Pair } -> void
|
|
94
|
-
|
|
95
|
-
def when_clauses: () { (WhenPatterns, Array[Node], Node?, keyword_loc) -> when_result } -> void
|
|
96
|
-
|
|
97
|
-
def else_clause: () { (Node, TypeConstruction) -> Pair } -> void
|
|
98
|
-
|
|
99
|
-
def result: () -> [Array[AST::Types::t], Array[TypeEnv]]
|
|
100
|
-
|
|
101
|
-
# Assign type of `value_node`
|
|
102
|
-
def propagate_value_node_type: (TypeEnv) -> TypeEnv?
|
|
103
|
-
|
|
104
|
-
# Returns `true` is `else` keyword is given
|
|
105
|
-
#
|
|
106
|
-
# `else_node` may be `nil` because body expression might be omitted.
|
|
107
|
-
#
|
|
108
|
-
# ```ruby
|
|
109
|
-
# case x
|
|
110
|
-
# when 1
|
|
111
|
-
# else
|
|
112
|
-
# # The body expression is omitted, but the branch is given.
|
|
113
|
-
# end
|
|
114
|
-
# ```
|
|
115
|
-
#
|
|
116
|
-
def has_else_clause?: () -> Parser::Source::Range?
|
|
117
|
-
|
|
118
|
-
# def typing: () -> Typing
|
|
119
|
-
|
|
120
|
-
# Extract assignments
|
|
121
|
-
#
|
|
122
|
-
# Returns a pair of the node that represents the value and assignment.
|
|
123
|
-
#
|
|
124
|
-
def rewrite_condition_node: (Symbol, Node) ->[Node?, Node]
|
|
125
|
-
|
|
126
|
-
# TypeConstruction for incoming clause
|
|
127
|
-
def latest_result: () -> [TypeConstruction, bool]
|
|
128
|
-
end
|
|
129
|
-
end
|
|
130
|
-
end
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
module Steep
|
|
2
|
-
module TypeInference
|
|
3
|
-
class ConstantEnv
|
|
4
|
-
type constant_tuple = [untyped, RBS::TypeName, RBS::Constant::constant_entry]
|
|
5
|
-
|
|
6
|
-
attr_reader context: RBS::Resolver::context
|
|
7
|
-
|
|
8
|
-
attr_reader factory: AST::Types::Factory
|
|
9
|
-
|
|
10
|
-
attr_reader resolver: RBS::Resolver::ConstantResolver
|
|
11
|
-
|
|
12
|
-
def initialize: (factory: AST::Types::Factory, context: RBS::Resolver::context, resolver: RBS::Resolver::ConstantResolver) -> void
|
|
13
|
-
|
|
14
|
-
def resolve: (Symbol name) -> constant_tuple?
|
|
15
|
-
|
|
16
|
-
def toplevel: (Symbol name) -> constant_tuple?
|
|
17
|
-
|
|
18
|
-
def constants: () -> Hash[Symbol, constant_tuple]
|
|
19
|
-
|
|
20
|
-
def resolve_child: (RBS::TypeName module_name, Symbol constant_name) -> constant_tuple?
|
|
21
|
-
|
|
22
|
-
def children: (RBS::TypeName module_name) -> Hash[Symbol, constant_tuple]
|
|
23
|
-
|
|
24
|
-
def decompose_constant!: (RBS::Constant? constant) -> constant_tuple
|
|
25
|
-
|
|
26
|
-
def decompose_constant: (RBS::Constant? constant) -> constant_tuple?
|
|
27
|
-
end
|
|
28
|
-
end
|
|
29
|
-
end
|
|
@@ -1,216 +0,0 @@
|
|
|
1
|
-
use Steep::Interface::Function::Params, Steep::Interface::Block
|
|
2
|
-
|
|
3
|
-
module Steep
|
|
4
|
-
module TypeInference
|
|
5
|
-
# Type checking context
|
|
6
|
-
class Context
|
|
7
|
-
# Information about the method which the body is being type checked
|
|
8
|
-
#
|
|
9
|
-
class MethodContext
|
|
10
|
-
# Name of the method
|
|
11
|
-
attr_reader name: Symbol
|
|
12
|
-
|
|
13
|
-
# `nil` when RBS doesn't have the corresponding method definition
|
|
14
|
-
attr_reader method: RBS::Definition::Method?
|
|
15
|
-
|
|
16
|
-
# `nil` when no method type is given
|
|
17
|
-
attr_reader method_type: Interface::MethodType?
|
|
18
|
-
|
|
19
|
-
# Falls back to `untyped`
|
|
20
|
-
attr_reader return_type: AST::Types::t
|
|
21
|
-
|
|
22
|
-
# The *super* method if identified
|
|
23
|
-
attr_reader super_method: RBS::Definition::Method?
|
|
24
|
-
|
|
25
|
-
# The type of forwarding params when `...` is given
|
|
26
|
-
attr_reader forward_arg_type: [Params, Block?]?
|
|
27
|
-
|
|
28
|
-
def initialize: (
|
|
29
|
-
name: Symbol,
|
|
30
|
-
method: RBS::Definition::Method?,
|
|
31
|
-
method_type: Interface::MethodType?,
|
|
32
|
-
return_type: AST::Types::t,
|
|
33
|
-
super_method: RBS::Definition::Method?,
|
|
34
|
-
forward_arg_type: [Params, Block?]?
|
|
35
|
-
) -> void
|
|
36
|
-
|
|
37
|
-
# Type of the block of the current method type
|
|
38
|
-
def block_type: () -> Interface::Block?
|
|
39
|
-
|
|
40
|
-
# Returns `true` if the method is a setter -- ends with `=`
|
|
41
|
-
#
|
|
42
|
-
def attribute_setter?: () -> bool
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
# Information about the block which the body is being type checked
|
|
46
|
-
#
|
|
47
|
-
class BlockContext
|
|
48
|
-
# The type of block itself
|
|
49
|
-
#
|
|
50
|
-
# Returns `nil` if no type is specified.
|
|
51
|
-
#
|
|
52
|
-
attr_reader body_type: AST::Types::t?
|
|
53
|
-
|
|
54
|
-
def initialize: (body_type: AST::Types::t?) -> void
|
|
55
|
-
|
|
56
|
-
def subst: (Interface::Substitution) -> BlockContext
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
# Context about the `break` syntax
|
|
60
|
-
class BreakContext
|
|
61
|
-
# Type of arguments to `break` statement
|
|
62
|
-
#
|
|
63
|
-
attr_reader break_type: AST::Types::t
|
|
64
|
-
|
|
65
|
-
# Type of arguments to `next` statement
|
|
66
|
-
#
|
|
67
|
-
# `nil` means the passed value will be ignored.
|
|
68
|
-
#
|
|
69
|
-
attr_reader next_type: AST::Types::t?
|
|
70
|
-
|
|
71
|
-
def initialize: (break_type: AST::Types::t, next_type: AST::Types::t?) -> void
|
|
72
|
-
|
|
73
|
-
def subst: (Interface::Substitution) -> BreakContext
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
# Information about the module which the body is being type checked
|
|
77
|
-
#
|
|
78
|
-
class ModuleContext
|
|
79
|
-
# The type of an instance of current module
|
|
80
|
-
attr_reader instance_type: AST::Types::t
|
|
81
|
-
|
|
82
|
-
# The type of singleton of current module
|
|
83
|
-
attr_reader module_type: AST::Types::t
|
|
84
|
-
|
|
85
|
-
# The set of name of instance methods that is defined in the `module`/`class` statement
|
|
86
|
-
attr_reader defined_instance_methods: Set[Symbol]
|
|
87
|
-
|
|
88
|
-
# The set of name of singleton methods that is defined in the `module`/`class` statement
|
|
89
|
-
attr_reader defined_module_methods: Set[Symbol]
|
|
90
|
-
|
|
91
|
-
# The nesting of current module
|
|
92
|
-
#
|
|
93
|
-
# Cannot be `nil`.
|
|
94
|
-
#
|
|
95
|
-
attr_reader nesting: RBS::Resolver::context
|
|
96
|
-
|
|
97
|
-
# The name that is given to `@implements` annotation
|
|
98
|
-
#
|
|
99
|
-
# `nil` when no `@implements` annotation is given.
|
|
100
|
-
#
|
|
101
|
-
attr_reader implement_name: AST::Annotation::Implements::Module?
|
|
102
|
-
|
|
103
|
-
# The name of the class/module.
|
|
104
|
-
attr_reader class_name: RBS::TypeName
|
|
105
|
-
|
|
106
|
-
# The definition of the instance of the module
|
|
107
|
-
attr_reader instance_definition: RBS::Definition?
|
|
108
|
-
|
|
109
|
-
# The definition of the singleton of the module
|
|
110
|
-
attr_reader module_definition: RBS::Definition?
|
|
111
|
-
|
|
112
|
-
@class_variables: Hash[Symbol, RBS::Types::t]?
|
|
113
|
-
|
|
114
|
-
def initialize: (
|
|
115
|
-
instance_type: AST::Types::t,
|
|
116
|
-
module_type: AST::Types::t,
|
|
117
|
-
implement_name: AST::Annotation::Implements::Module?,
|
|
118
|
-
class_name: RBS::TypeName,
|
|
119
|
-
nesting: RBS::Resolver::context,
|
|
120
|
-
?instance_definition: RBS::Definition?,
|
|
121
|
-
?module_definition: RBS::Definition?
|
|
122
|
-
) -> void
|
|
123
|
-
|
|
124
|
-
# Returns a hash from the name of a class variable to its type
|
|
125
|
-
%a{pure} def class_variables: () -> Hash[Symbol, RBS::Types::t]?
|
|
126
|
-
|
|
127
|
-
def update: (
|
|
128
|
-
?instance_type: AST::Types::t,
|
|
129
|
-
?module_type: AST::Types::t,
|
|
130
|
-
?implement_name: AST::Annotation::Implements::Module?,
|
|
131
|
-
?class_name: RBS::TypeName,
|
|
132
|
-
?instance_definition: RBS::Definition?,
|
|
133
|
-
?module_definition: RBS::Definition?,
|
|
134
|
-
?nesting: RBS::Resolver::context
|
|
135
|
-
) -> ModuleContext
|
|
136
|
-
end
|
|
137
|
-
|
|
138
|
-
# Information about the free type variables
|
|
139
|
-
#
|
|
140
|
-
class TypeVariableContext
|
|
141
|
-
attr_reader table: Hash[Symbol, Interface::TypeParam]
|
|
142
|
-
|
|
143
|
-
attr_reader type_params: Array[Interface::TypeParam]
|
|
144
|
-
|
|
145
|
-
def initialize: (Array[Interface::TypeParam] type_params, ?parent_context: TypeVariableContext?) -> void
|
|
146
|
-
|
|
147
|
-
# Returns the upper bound of a type variable
|
|
148
|
-
def []: (Symbol name) -> AST::Types::t?
|
|
149
|
-
|
|
150
|
-
@upper_bounds: Hash[Symbol, AST::Types::t]?
|
|
151
|
-
|
|
152
|
-
def upper_bounds: () -> Hash[Symbol, AST::Types::t]
|
|
153
|
-
|
|
154
|
-
def self.empty: () -> TypeVariableContext
|
|
155
|
-
end
|
|
156
|
-
|
|
157
|
-
# The caller where a method is called from
|
|
158
|
-
attr_reader call_context: MethodCall::context
|
|
159
|
-
|
|
160
|
-
# MethodContext for current execution point
|
|
161
|
-
#
|
|
162
|
-
# `nil` when not in any method definition.
|
|
163
|
-
#
|
|
164
|
-
attr_reader method_context: MethodContext?
|
|
165
|
-
|
|
166
|
-
# BlockContext for current execution point
|
|
167
|
-
#
|
|
168
|
-
# `nil` when not in iterator block.
|
|
169
|
-
#
|
|
170
|
-
attr_reader block_context: BlockContext?
|
|
171
|
-
|
|
172
|
-
# BreakContext for current execution point
|
|
173
|
-
#
|
|
174
|
-
# `nil` if `break` is not allowed.
|
|
175
|
-
#
|
|
176
|
-
attr_reader break_context: BreakContext?
|
|
177
|
-
|
|
178
|
-
# ModuleContext for current execution point
|
|
179
|
-
attr_reader module_context: ModuleContext
|
|
180
|
-
|
|
181
|
-
# The type of `self`
|
|
182
|
-
#
|
|
183
|
-
attr_reader self_type: AST::Types::t
|
|
184
|
-
|
|
185
|
-
attr_reader type_env: TypeEnv
|
|
186
|
-
|
|
187
|
-
attr_reader variable_context: TypeVariableContext
|
|
188
|
-
|
|
189
|
-
def initialize: (
|
|
190
|
-
method_context: MethodContext?,
|
|
191
|
-
block_context: BlockContext?,
|
|
192
|
-
break_context: BreakContext?,
|
|
193
|
-
module_context: ModuleContext,
|
|
194
|
-
self_type: AST::Types::t,
|
|
195
|
-
type_env: TypeEnv,
|
|
196
|
-
call_context: MethodCall::context,
|
|
197
|
-
variable_context: TypeVariableContext
|
|
198
|
-
) -> void
|
|
199
|
-
|
|
200
|
-
def with: (
|
|
201
|
-
?method_context: MethodContext?,
|
|
202
|
-
?block_context: BlockContext?,
|
|
203
|
-
?break_context: BreakContext?,
|
|
204
|
-
?module_context: ModuleContext,
|
|
205
|
-
?self_type: AST::Types::t,
|
|
206
|
-
?type_env: TypeEnv,
|
|
207
|
-
?call_context: MethodCall::context,
|
|
208
|
-
?variable_context: TypeVariableContext
|
|
209
|
-
) -> Context
|
|
210
|
-
|
|
211
|
-
def factory: () -> AST::Types::Factory
|
|
212
|
-
|
|
213
|
-
def env: () -> RBS::Environment
|
|
214
|
-
end
|
|
215
|
-
end
|
|
216
|
-
end
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
module Steep
|
|
2
|
-
module TypeInference
|
|
3
|
-
class ContextArray
|
|
4
|
-
class Entry
|
|
5
|
-
attr_reader range: Range[Integer]
|
|
6
|
-
|
|
7
|
-
attr_reader context: Context
|
|
8
|
-
|
|
9
|
-
attr_reader sub_entries: Set[Entry]
|
|
10
|
-
|
|
11
|
-
def initialize: (range: Range[Integer], context: Context) -> void
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
attr_reader buffer: RBS::Buffer
|
|
15
|
-
|
|
16
|
-
attr_reader root: Entry
|
|
17
|
-
|
|
18
|
-
def initialize: (buffer: RBS::Buffer, context: Context, ?range: Range[Integer]) -> void
|
|
19
|
-
|
|
20
|
-
def range: () -> Range[Integer]
|
|
21
|
-
|
|
22
|
-
def self.from_source: (source: Source, ?range: Range[Integer]?, context: Context) -> ContextArray
|
|
23
|
-
|
|
24
|
-
def insert_context: (Range[Integer] range, context: Context, ?entry: Entry) -> void
|
|
25
|
-
|
|
26
|
-
def each_entry: () { (Entry) -> void } -> void
|
|
27
|
-
| () -> Enumerator[Entry, void]
|
|
28
|
-
|
|
29
|
-
def context_at: (Integer index, ?entry: Entry) -> Context?
|
|
30
|
-
|
|
31
|
-
def []: (Integer index) -> Context?
|
|
32
|
-
|
|
33
|
-
def at: (line: Integer, column: Integer) -> Context?
|
|
34
|
-
|
|
35
|
-
def merge: (ContextArray subtree) -> void
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
end
|
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
module Steep
|
|
2
|
-
module TypeInference
|
|
3
|
-
class LogicTypeInterpreter
|
|
4
|
-
class Result
|
|
5
|
-
attr_reader env: TypeEnv
|
|
6
|
-
|
|
7
|
-
attr_reader type: AST::Types::t
|
|
8
|
-
|
|
9
|
-
attr_accessor unreachable: bool
|
|
10
|
-
|
|
11
|
-
def initialize: (env: TypeEnv, type: AST::Types::t, unreachable: bool) -> void
|
|
12
|
-
|
|
13
|
-
def update_env: () { () -> TypeEnv } -> Result
|
|
14
|
-
|
|
15
|
-
def update_type: { () -> AST::Types::t } -> Result
|
|
16
|
-
|
|
17
|
-
# Make the instance unreachable, and returns self
|
|
18
|
-
#
|
|
19
|
-
def unreachable!: () -> self
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
TRUE: AST::Types::Literal
|
|
23
|
-
|
|
24
|
-
FALSE: AST::Types::Literal
|
|
25
|
-
|
|
26
|
-
BOOL: AST::Types::Boolean
|
|
27
|
-
|
|
28
|
-
BOT: AST::Types::Bot
|
|
29
|
-
|
|
30
|
-
UNTYPED: AST::Types::Any
|
|
31
|
-
|
|
32
|
-
attr_reader subtyping: Subtyping::Check
|
|
33
|
-
|
|
34
|
-
attr_reader typing: Typing
|
|
35
|
-
|
|
36
|
-
attr_reader factory (): AST::Types::Factory
|
|
37
|
-
|
|
38
|
-
attr_reader config: Interface::Builder::Config
|
|
39
|
-
|
|
40
|
-
def initialize: (subtyping: Subtyping::Check, typing: Typing, config: Interface::Builder::Config) -> void
|
|
41
|
-
|
|
42
|
-
def eval: (env: TypeEnv, node: Parser::AST::Node) -> [Result, Result]
|
|
43
|
-
|
|
44
|
-
def evaluate_node: (env: TypeEnv, node: Parser::AST::Node, ?type: AST::Types::t) -> [Result, Result]
|
|
45
|
-
|
|
46
|
-
def evaluate_method_call: (env: TypeEnv, type: AST::Types::Logic::Base, receiver: Parser::AST::Node?, arguments: Array[Parser::AST::Node]) -> [Result, Result]?
|
|
47
|
-
|
|
48
|
-
# Apply type refinement to `node` as `truthy_type` and `falsy_type`.
|
|
49
|
-
#
|
|
50
|
-
# This is done by top-down manner.
|
|
51
|
-
#
|
|
52
|
-
# Assignes given two types to the node when:
|
|
53
|
-
#
|
|
54
|
-
# * `node` is a `lvar`
|
|
55
|
-
# * `node` is a `lvasgn`
|
|
56
|
-
# * `node` is a _pure_ method call
|
|
57
|
-
#
|
|
58
|
-
def refine_node_type: (env: TypeEnv, node: Parser::AST::Node, truthy_type: AST::Types::t, falsy_type: AST::Types::t) -> [TypeEnv, TypeEnv]
|
|
59
|
-
|
|
60
|
-
# Returns a pair of a node and set of local variable names.
|
|
61
|
-
#
|
|
62
|
-
# * The returned node is called _value node_ that is a node the value of given `node` can be taken from
|
|
63
|
-
# * The local variable names are local variables that have the same value of the _value node_.
|
|
64
|
-
#
|
|
65
|
-
# ```ruby
|
|
66
|
-
# a = 123 # `123` is the _value node_
|
|
67
|
-
# # :a is included in the set because `a` has the same value of _value node_
|
|
68
|
-
#
|
|
69
|
-
# c = b = a # `a` is the _value node_, a set of { :b, :c } will be returned
|
|
70
|
-
# ```
|
|
71
|
-
#
|
|
72
|
-
def decompose_value: (Parser::AST::Node node) -> [Parser::AST::Node, Set[Symbol]]
|
|
73
|
-
|
|
74
|
-
private
|
|
75
|
-
|
|
76
|
-
# Assign local variables included in the assignment node and masgn node
|
|
77
|
-
#
|
|
78
|
-
def evaluate_assignment: (Parser::AST::Node node, TypeEnv env, AST::Types::t rhs_type) -> TypeEnv
|
|
79
|
-
|
|
80
|
-
def guess_type_from_method: (Parser::AST::Node node) -> (AST::Types::Logic::ReceiverIsArg | AST::Types::Logic::ReceiverIsNil | AST::Types::Logic::Not | AST::Types::Logic::ArgIsReceiver | nil)
|
|
81
|
-
|
|
82
|
-
# Decompose to given type to truthy and falsy types.
|
|
83
|
-
#
|
|
84
|
-
# This directly corresponds to case-when syntax with literals:
|
|
85
|
-
#
|
|
86
|
-
# ```ruby
|
|
87
|
-
# case x
|
|
88
|
-
# when nil # value_node == {nil}, arg_type = type_of({x})
|
|
89
|
-
# ...
|
|
90
|
-
# when 123 # value_node == {nil}, arg_type = type_of({x})
|
|
91
|
-
# ...
|
|
92
|
-
# end
|
|
93
|
-
# ```
|
|
94
|
-
#
|
|
95
|
-
def literal_var_type_case_select: (Parser::AST::Node value_node, AST::Types::t arg_type) -> [Array[AST::Types::t], Array[AST::Types::t]]?
|
|
96
|
-
|
|
97
|
-
def type_case_select: (AST::Types::t `type`, RBS::TypeName klass) -> [AST::Types::t?, AST::Types::t?]
|
|
98
|
-
|
|
99
|
-
def type_case_select0: (AST::Types::t `type`, RBS::TypeName klass) -> [Array[AST::Types::t], Array[AST::Types::t]]
|
|
100
|
-
|
|
101
|
-
def try_convert: (AST::Types::t, Symbol) -> AST::Types::t?
|
|
102
|
-
|
|
103
|
-
def no_subtyping?: (sub_type: AST::Types::t, super_type: AST::Types::t) -> Subtyping::Result::t?
|
|
104
|
-
|
|
105
|
-
def subtyping?: (sub_type: AST::Types::t, super_type: AST::Types::t) -> bool
|
|
106
|
-
end
|
|
107
|
-
end
|
|
108
|
-
end
|