steep 0.6.0 → 0.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 +10 -0
- data/lib/steep/interface/builder.rb +4 -4
- data/lib/steep/parser.rb +528 -504
- data/lib/steep/parser.y +14 -5
- data/lib/steep/subtyping/check.rb +10 -16
- data/lib/steep/type_construction.rb +59 -160
- data/lib/steep/version.rb +1 -1
- data/stdlib/builtin.rbi +5 -0
- metadata +2 -2
data/lib/steep/parser.y
CHANGED
@@ -667,6 +667,15 @@ rule
|
|
667
667
|
type: val[2]
|
668
668
|
)
|
669
669
|
}
|
670
|
+
| kAT_TYPE tCOLON type
|
671
|
+
{
|
672
|
+
loc = val.first.location + val.last.location
|
673
|
+
result = AST::Signature::Members::Ivar.new(
|
674
|
+
location: loc,
|
675
|
+
name: :"@type",
|
676
|
+
type: val[2]
|
677
|
+
)
|
678
|
+
}
|
670
679
|
|
671
680
|
instance_method_member: kDEF method_annotations method_name tCOLON method_type_union
|
672
681
|
{
|
@@ -918,7 +927,7 @@ rule
|
|
918
927
|
name: val[2].value,
|
919
928
|
type: val[4])
|
920
929
|
}
|
921
|
-
| kAT_TYPE kMETHOD
|
930
|
+
| kAT_TYPE kMETHOD method_name tCOLON method_type
|
922
931
|
{
|
923
932
|
loc = val.first.location + val.last.location
|
924
933
|
result = AST::Annotation::MethodType.new(location: loc,
|
@@ -1212,10 +1221,6 @@ def next_token
|
|
1212
1221
|
new_token(:kNOCONSTRUCTOR, :noconstructor)
|
1213
1222
|
when input.scan(/\$\w+\b/)
|
1214
1223
|
new_token(:tGVAR, input.matched.to_sym)
|
1215
|
-
when input.scan(/::([A-Z]\w*::)*[A-Z]\w*/)
|
1216
|
-
new_token(:tQUALIFIED_MODULE_NAME, Names::Module.parse(input.matched))
|
1217
|
-
when input.scan(/([A-Z]\w*::)+[A-Z]\w*/)
|
1218
|
-
new_token(:tQUALIFIED_MODULE_NAME, Names::Module.parse(input.matched))
|
1219
1224
|
when input.scan(/::([A-Z]\w*::)*_\w+/)
|
1220
1225
|
new_token(:tQUALIFIED_INTERFACE_NAME, Names::Interface.parse(input.matched))
|
1221
1226
|
when input.scan(/([A-Z]\w*::)+_\w+/)
|
@@ -1224,6 +1229,10 @@ def next_token
|
|
1224
1229
|
new_token(:tQUALIFIED_ALIAS_NAME, Names::Alias.parse(input.matched))
|
1225
1230
|
when input.scan(/([A-Z]\w*::)+[a-z]\w*/)
|
1226
1231
|
new_token(:tQUALIFIED_ALIAS_NAME, Names::Alias.parse(input.matched))
|
1232
|
+
when input.scan(/::([A-Z]\w*::)*[A-Z]\w*/)
|
1233
|
+
new_token(:tQUALIFIED_MODULE_NAME, Names::Module.parse(input.matched))
|
1234
|
+
when input.scan(/([A-Z]\w*::)+[A-Z]\w*/)
|
1235
|
+
new_token(:tQUALIFIED_MODULE_NAME, Names::Module.parse(input.matched))
|
1227
1236
|
when input.scan(/[A-Z]\w*/)
|
1228
1237
|
new_token(:tUIDENT, input.matched.to_sym)
|
1229
1238
|
when input.scan(/_\w+/)
|
@@ -147,23 +147,17 @@ module Steep
|
|
147
147
|
results.find(&:failure?)
|
148
148
|
end
|
149
149
|
|
150
|
-
when relation.super_type.is_a?(AST::Types::Var)
|
151
|
-
|
152
|
-
|
153
|
-
success(constraints: constraints)
|
154
|
-
else
|
155
|
-
failure(error: Result::Failure::UnknownPairError.new(relation: relation),
|
156
|
-
trace: trace)
|
157
|
-
end
|
150
|
+
when relation.super_type.is_a?(AST::Types::Var) && constraints.unknown?(relation.super_type.name)
|
151
|
+
constraints.add(relation.super_type.name, sub_type: relation.sub_type)
|
152
|
+
success(constraints: constraints)
|
158
153
|
|
159
|
-
when relation.sub_type.is_a?(AST::Types::Var)
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
end
|
154
|
+
when relation.sub_type.is_a?(AST::Types::Var) && constraints.unknown?(relation.sub_type.name)
|
155
|
+
constraints.add(relation.sub_type.name, super_type: relation.super_type)
|
156
|
+
success(constraints: constraints)
|
157
|
+
|
158
|
+
when relation.super_type.is_a?(AST::Types::Var) || relation.sub_type.is_a?(AST::Types::Var)
|
159
|
+
failure(error: Result::Failure::UnknownPairError.new(relation: relation),
|
160
|
+
trace: trace)
|
167
161
|
|
168
162
|
when relation.sub_type.is_a?(AST::Types::Name::Base) && relation.super_type.is_a?(AST::Types::Name::Base)
|
169
163
|
if (pairs = extract_nominal_pairs(relation))
|
@@ -1129,10 +1129,19 @@ module Steep
|
|
1129
1129
|
when :array
|
1130
1130
|
yield_self do
|
1131
1131
|
if node.children.empty?
|
1132
|
-
unless hint
|
1133
|
-
|
1134
|
-
|
1135
|
-
|
1132
|
+
typing.add_error Errors::FallbackAny.new(node: node) unless hint
|
1133
|
+
|
1134
|
+
array_type = if hint
|
1135
|
+
relation = Subtyping::Relation.new(
|
1136
|
+
sub_type: AST::Builtin::Array.instance_type(AST::Builtin.any_type),
|
1137
|
+
super_type: hint
|
1138
|
+
)
|
1139
|
+
if checker.check(relation, constraints: Subtyping::Constraints.empty).success?
|
1140
|
+
hint
|
1141
|
+
end
|
1142
|
+
end
|
1143
|
+
|
1144
|
+
typing.add_typing(node, array_type || AST::Builtin::Array.instance_type(AST::Builtin.any_type))
|
1136
1145
|
else
|
1137
1146
|
is_tuple = nil
|
1138
1147
|
|
@@ -1749,46 +1758,49 @@ module Steep
|
|
1749
1758
|
receiver_type = unwrap(receiver_type)
|
1750
1759
|
end
|
1751
1760
|
|
1752
|
-
case receiver_type
|
1753
|
-
|
1754
|
-
|
1761
|
+
return_type = case receiver_type
|
1762
|
+
when AST::Types::Any
|
1763
|
+
typing.add_typing node, AST::Builtin.any_type
|
1755
1764
|
|
1756
|
-
|
1757
|
-
|
1765
|
+
when nil
|
1766
|
+
fallback_to_any node
|
1758
1767
|
|
1759
|
-
|
1760
|
-
|
1761
|
-
|
1762
|
-
|
1763
|
-
|
1764
|
-
|
1765
|
-
|
1766
|
-
|
1767
|
-
|
1768
|
-
|
1769
|
-
|
1770
|
-
|
1771
|
-
|
1772
|
-
|
1773
|
-
|
1774
|
-
|
1775
|
-
|
1776
|
-
|
1777
|
-
|
1778
|
-
|
1779
|
-
|
1780
|
-
|
1781
|
-
|
1782
|
-
|
1783
|
-
|
1784
|
-
|
1785
|
-
|
1786
|
-
|
1787
|
-
|
1788
|
-
|
1789
|
-
|
1790
|
-
|
1791
|
-
|
1768
|
+
else
|
1769
|
+
begin
|
1770
|
+
interface = checker.resolve(receiver_type)
|
1771
|
+
|
1772
|
+
method = interface.methods[method_name]
|
1773
|
+
|
1774
|
+
if method
|
1775
|
+
args = TypeInference::SendArgs.from_nodes(arguments)
|
1776
|
+
return_type_or_error = type_method_call(node,
|
1777
|
+
method: method,
|
1778
|
+
args: args,
|
1779
|
+
block_params: block_params,
|
1780
|
+
block_body: block_body,
|
1781
|
+
receiver_type: receiver_type)
|
1782
|
+
|
1783
|
+
if return_type_or_error.is_a?(Errors::Base)
|
1784
|
+
fallback_to_any node do
|
1785
|
+
return_type_or_error
|
1786
|
+
end
|
1787
|
+
else
|
1788
|
+
typing.add_typing node, return_type_or_error
|
1789
|
+
end
|
1790
|
+
else
|
1791
|
+
fallback_to_any node do
|
1792
|
+
Errors::NoMethod.new(node: node, method: method_name, type: receiver_type)
|
1793
|
+
end
|
1794
|
+
end
|
1795
|
+
rescue Subtyping::Check::CannotResolveError
|
1796
|
+
fallback_to_any node do
|
1797
|
+
Errors::NoMethod.new(node: node, method: method_name, type: receiver_type)
|
1798
|
+
end
|
1799
|
+
end
|
1800
|
+
end
|
1801
|
+
|
1802
|
+
case return_type
|
1803
|
+
when nil, Errors::Base
|
1792
1804
|
arguments.each do |arg|
|
1793
1805
|
unless typing.has_type?(arg)
|
1794
1806
|
if arg.type == :splat
|
@@ -1814,6 +1826,8 @@ module Steep
|
|
1814
1826
|
for_block.synthesize(block_body)
|
1815
1827
|
end
|
1816
1828
|
end
|
1829
|
+
else
|
1830
|
+
return_type
|
1817
1831
|
end
|
1818
1832
|
end
|
1819
1833
|
|
@@ -1932,6 +1946,8 @@ module Steep
|
|
1932
1946
|
occurence = Subtyping::VariableOccurence.from_method_type(method_type)
|
1933
1947
|
|
1934
1948
|
arg_pairs.each do |(arg_node, param_type)|
|
1949
|
+
param_type = param_type.subst(instantiation)
|
1950
|
+
|
1935
1951
|
arg_type = if arg_node.type == :splat
|
1936
1952
|
type = construction.synthesize(arg_node.children[0])
|
1937
1953
|
child_typing.add_typing(arg_node, type)
|
@@ -1941,7 +1957,7 @@ module Steep
|
|
1941
1957
|
|
1942
1958
|
relation = Subtyping::Relation.new(
|
1943
1959
|
sub_type: arg_type,
|
1944
|
-
super_type: param_type
|
1960
|
+
super_type: param_type
|
1945
1961
|
)
|
1946
1962
|
|
1947
1963
|
checker.check(relation, constraints: constraints).else do |result|
|
@@ -2167,123 +2183,6 @@ module Steep
|
|
2167
2183
|
end
|
2168
2184
|
end
|
2169
2185
|
|
2170
|
-
def test_args(params:, arguments:)
|
2171
|
-
params.each_missing_argument arguments do |_|
|
2172
|
-
return nil
|
2173
|
-
end
|
2174
|
-
|
2175
|
-
params.each_extra_argument arguments do |_|
|
2176
|
-
return nil
|
2177
|
-
end
|
2178
|
-
|
2179
|
-
params.each_missing_keyword arguments do |_|
|
2180
|
-
return nil
|
2181
|
-
end
|
2182
|
-
|
2183
|
-
params.each_extra_keyword arguments do |_|
|
2184
|
-
return nil
|
2185
|
-
end
|
2186
|
-
|
2187
|
-
self.class.argument_typing_pairs(params: params, arguments: arguments.dup)
|
2188
|
-
end
|
2189
|
-
|
2190
|
-
def applicable_args?(params:, arguments:)
|
2191
|
-
params.each_missing_argument arguments do |_|
|
2192
|
-
return false
|
2193
|
-
end
|
2194
|
-
|
2195
|
-
params.each_extra_argument arguments do |_|
|
2196
|
-
return false
|
2197
|
-
end
|
2198
|
-
|
2199
|
-
params.each_missing_keyword arguments do |_|
|
2200
|
-
return false
|
2201
|
-
end
|
2202
|
-
|
2203
|
-
params.each_extra_keyword arguments do |_|
|
2204
|
-
return false
|
2205
|
-
end
|
2206
|
-
|
2207
|
-
all_args = arguments.dup
|
2208
|
-
|
2209
|
-
self.class.argument_typing_pairs(params: params, arguments: arguments.dup).each do |(param_type, argument)|
|
2210
|
-
all_args.delete_if {|a| a.equal?(argument) }
|
2211
|
-
|
2212
|
-
check(argument, param_type) do |_, _|
|
2213
|
-
return false
|
2214
|
-
end
|
2215
|
-
end
|
2216
|
-
|
2217
|
-
all_args.each do |arg|
|
2218
|
-
synthesize(arg)
|
2219
|
-
end
|
2220
|
-
|
2221
|
-
true
|
2222
|
-
end
|
2223
|
-
|
2224
|
-
def self.block_param_typing_pairs(param_types: , param_nodes:)
|
2225
|
-
pairs = []
|
2226
|
-
|
2227
|
-
param_types.required.each.with_index do |type, index|
|
2228
|
-
if (param = param_nodes[index])
|
2229
|
-
pairs << [param, type]
|
2230
|
-
end
|
2231
|
-
end
|
2232
|
-
|
2233
|
-
pairs
|
2234
|
-
end
|
2235
|
-
|
2236
|
-
def self.argument_typing_pairs(params:, arguments:)
|
2237
|
-
keywords = {}
|
2238
|
-
unless params.required_keywords.empty? && params.optional_keywords.empty? && !params.rest_keywords
|
2239
|
-
# has keyword args
|
2240
|
-
last_arg = arguments.last
|
2241
|
-
if last_arg&.type == :hash
|
2242
|
-
arguments.pop
|
2243
|
-
|
2244
|
-
last_arg.children.each do |elem|
|
2245
|
-
case elem.type
|
2246
|
-
when :pair
|
2247
|
-
key, value = elem.children
|
2248
|
-
if key.type == :sym
|
2249
|
-
name = key.children[0]
|
2250
|
-
|
2251
|
-
keywords[name] = value
|
2252
|
-
end
|
2253
|
-
end
|
2254
|
-
end
|
2255
|
-
end
|
2256
|
-
end
|
2257
|
-
|
2258
|
-
pairs = []
|
2259
|
-
|
2260
|
-
params.flat_unnamed_params.each do |param_type|
|
2261
|
-
arg = arguments.shift
|
2262
|
-
pairs << [param_type.last, arg] if arg
|
2263
|
-
end
|
2264
|
-
|
2265
|
-
if params.rest
|
2266
|
-
arguments.each do |arg|
|
2267
|
-
pairs << [params.rest, arg]
|
2268
|
-
end
|
2269
|
-
end
|
2270
|
-
|
2271
|
-
params.flat_keywords.each do |name, type|
|
2272
|
-
arg = keywords.delete(name)
|
2273
|
-
if arg
|
2274
|
-
pairs << [type, arg]
|
2275
|
-
end
|
2276
|
-
end
|
2277
|
-
|
2278
|
-
if params.rest_keywords
|
2279
|
-
keywords.each_value do |arg|
|
2280
|
-
pairs << [params.rest_keywords, arg]
|
2281
|
-
end
|
2282
|
-
end
|
2283
|
-
|
2284
|
-
pairs
|
2285
|
-
end
|
2286
|
-
|
2287
2186
|
def self.parameter_types(nodes, type)
|
2288
2187
|
nodes = nodes.dup
|
2289
2188
|
|
data/lib/steep/version.rb
CHANGED
data/stdlib/builtin.rbi
CHANGED
@@ -26,6 +26,10 @@ class Object < BasicObject
|
|
26
26
|
def !: -> bool
|
27
27
|
def Array: (any) -> Array<any>
|
28
28
|
def Hash: (any) -> Hash<any, any>
|
29
|
+
def instance_eval: <'x> { (self) -> 'x } -> 'x
|
30
|
+
| (String, ?String, ?Integer) -> any
|
31
|
+
def define_singleton_method: (Symbol | String, any) -> Symbol
|
32
|
+
| (Symbol) { (*any) -> any } -> Symbol
|
29
33
|
end
|
30
34
|
|
31
35
|
class Module
|
@@ -234,6 +238,7 @@ class Hash<'key, 'value>
|
|
234
238
|
| -> Enumerator<['key, 'value], self>
|
235
239
|
def key?: ('key) -> bool
|
236
240
|
def merge: (Hash<'key, 'value>) -> Hash<'key, 'value>
|
241
|
+
def delete: ('key) -> 'value?
|
237
242
|
|
238
243
|
include Enumerable<['key, 'value], self>
|
239
244
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: steep
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Soutaro Matsumoto
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-09-
|
11
|
+
date: 2018-09-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|