rbs 0.11.0 → 0.13.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/ruby.yml +9 -9
- data/CHANGELOG.md +24 -0
- data/Rakefile +16 -6
- data/Steepfile +28 -0
- data/bin/steep +4 -0
- data/bin/test_runner.rb +7 -5
- data/lib/rbs/ast/comment.rb +7 -1
- data/lib/rbs/ast/declarations.rb +15 -9
- data/lib/rbs/buffer.rb +1 -1
- data/lib/rbs/cli.rb +12 -4
- data/lib/rbs/constant.rb +1 -1
- data/lib/rbs/constant_table.rb +9 -8
- data/lib/rbs/definition.rb +22 -13
- data/lib/rbs/definition_builder.rb +79 -55
- data/lib/rbs/environment.rb +28 -10
- data/lib/rbs/environment_loader.rb +12 -12
- data/lib/rbs/location.rb +1 -5
- data/lib/rbs/method_type.rb +5 -5
- data/lib/rbs/namespace.rb +14 -3
- data/lib/rbs/parser.y +0 -8
- data/lib/rbs/prototype/rb.rb +3 -4
- data/lib/rbs/prototype/rbi.rb +1 -2
- data/lib/rbs/substitution.rb +4 -3
- data/lib/rbs/type_name.rb +18 -1
- data/lib/rbs/type_name_resolver.rb +10 -3
- data/lib/rbs/types.rb +27 -21
- data/lib/rbs/variance_calculator.rb +9 -6
- data/lib/rbs/version.rb +1 -1
- data/lib/rbs/writer.rb +25 -15
- data/sig/annotation.rbs +26 -0
- data/sig/buffer.rbs +28 -0
- data/sig/builtin_names.rbs +41 -0
- data/sig/comment.rbs +26 -0
- data/sig/constant.rbs +21 -0
- data/sig/constant_table.rbs +30 -0
- data/sig/declarations.rbs +202 -0
- data/sig/definition.rbs +129 -0
- data/sig/definition_builder.rbs +94 -0
- data/sig/environment.rbs +94 -0
- data/sig/environment_loader.rbs +58 -0
- data/sig/location.rbs +52 -0
- data/sig/members.rbs +160 -0
- data/sig/method_types.rbs +40 -0
- data/sig/namespace.rbs +124 -0
- data/sig/polyfill.rbs +3 -0
- data/sig/rbs.rbs +3 -0
- data/sig/substitution.rbs +39 -0
- data/sig/type_name_resolver.rbs +24 -0
- data/sig/typename.rbs +70 -0
- data/sig/types.rbs +361 -0
- data/sig/util.rbs +13 -0
- data/sig/variance_calculator.rbs +35 -0
- data/sig/version.rbs +3 -0
- data/sig/writer.rbs +40 -0
- data/stdlib/bigdecimal/big_decimal.rbs +887 -0
- data/stdlib/bigdecimal/math/big_math.rbs +142 -0
- data/stdlib/builtin/builtin.rbs +0 -3
- data/stdlib/builtin/kernel.rbs +2 -0
- data/stdlib/builtin/math.rbs +26 -26
- data/stdlib/builtin/struct.rbs +9 -10
- data/stdlib/forwardable/forwardable.rbs +204 -0
- data/stdlib/pathname/pathname.rbs +2 -0
- data/stdlib/pty/pty.rbs +5 -29
- data/stdlib/set/set.rbs +1 -1
- data/stdlib/uri/file.rbs +167 -0
- data/stdlib/uri/generic.rbs +875 -0
- data/stdlib/uri/http.rbs +158 -0
- data/stdlib/uri/https.rbs +108 -0
- data/stdlib/uri/ldap.rbs +224 -0
- data/stdlib/uri/ldaps.rbs +108 -0
- data/steep/Gemfile +3 -0
- data/steep/Gemfile.lock +51 -0
- metadata +43 -5
@@ -9,14 +9,14 @@ module RBS
|
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
12
|
-
LibraryPath = Struct.new(:name, :path, keyword_init: true)
|
13
|
-
GemPath = Struct.new(:name, :version, :path, keyword_init: true)
|
12
|
+
LibraryPath = _ = Struct.new(:name, :path, keyword_init: true)
|
13
|
+
GemPath = _ = Struct.new(:name, :version, :path, keyword_init: true)
|
14
14
|
|
15
15
|
attr_reader :paths
|
16
16
|
attr_reader :stdlib_root
|
17
17
|
attr_reader :gem_vendor_path
|
18
18
|
|
19
|
-
STDLIB_ROOT = Pathname(__dir__) + "../../stdlib"
|
19
|
+
STDLIB_ROOT = Pathname(_ = __dir__) + "../../stdlib"
|
20
20
|
|
21
21
|
def self.gem_sig_path(name, version)
|
22
22
|
Pathname(Gem::Specification.find_by_name(name, version).gem_dir) + "sig"
|
@@ -50,22 +50,20 @@ module RBS
|
|
50
50
|
end
|
51
51
|
|
52
52
|
def self.parse_library(lib)
|
53
|
-
lib.split(/:/)
|
53
|
+
_ = lib.split(/:/)
|
54
54
|
end
|
55
55
|
|
56
56
|
def stdlib?(name)
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
path
|
61
|
-
end
|
57
|
+
path = stdlib_root + name
|
58
|
+
if path.directory?
|
59
|
+
path
|
62
60
|
end
|
63
61
|
end
|
64
62
|
|
65
63
|
def gem?(name, version)
|
66
|
-
if gem_vendor_path
|
64
|
+
if path = gem_vendor_path
|
67
65
|
# Try vendored RBS first
|
68
|
-
gem_dir =
|
66
|
+
gem_dir = path + name
|
69
67
|
if gem_dir.directory?
|
70
68
|
return gem_dir
|
71
69
|
end
|
@@ -76,7 +74,7 @@ module RBS
|
|
76
74
|
end
|
77
75
|
|
78
76
|
def each_signature(path, immediate: true, &block)
|
79
|
-
if
|
77
|
+
if block
|
80
78
|
case
|
81
79
|
when path.file?
|
82
80
|
if path.extname == ".rbs" || immediate
|
@@ -116,6 +114,7 @@ module RBS
|
|
116
114
|
|
117
115
|
def each_decl
|
118
116
|
if block_given?
|
117
|
+
# @type var signature_files: Array[[path | :stdlib, Pathname]]
|
119
118
|
signature_files = []
|
120
119
|
|
121
120
|
unless no_builtin?
|
@@ -142,6 +141,7 @@ module RBS
|
|
142
141
|
end
|
143
142
|
|
144
143
|
def load(env:)
|
144
|
+
# @type var loadeds: Array[[AST::Declarations::t, Pathname, path | :stdlib]]
|
145
145
|
loadeds = []
|
146
146
|
|
147
147
|
each_decl do |decl, buffer, file_path, lib_path|
|
data/lib/rbs/location.rb
CHANGED
@@ -43,7 +43,7 @@ module RBS
|
|
43
43
|
end
|
44
44
|
|
45
45
|
def source
|
46
|
-
@source ||= buffer.content[start_pos...end_pos]
|
46
|
+
@source ||= buffer.content[start_pos...end_pos] or raise
|
47
47
|
end
|
48
48
|
|
49
49
|
def to_s
|
@@ -73,10 +73,6 @@ module RBS
|
|
73
73
|
end
|
74
74
|
end
|
75
75
|
|
76
|
-
def self.concat(*locations)
|
77
|
-
locations.inject {|l1, l2| l1 + l2 }
|
78
|
-
end
|
79
|
-
|
80
76
|
def concat(*others)
|
81
77
|
others.each { |other| self << other }
|
82
78
|
self
|
data/lib/rbs/method_type.rb
CHANGED
@@ -93,7 +93,7 @@ module RBS
|
|
93
93
|
end
|
94
94
|
|
95
95
|
def each_type(&block)
|
96
|
-
if
|
96
|
+
if block
|
97
97
|
type.each_type(&block)
|
98
98
|
self.block&.yield_self do |b|
|
99
99
|
b.type.each_type(&block)
|
@@ -105,10 +105,10 @@ module RBS
|
|
105
105
|
|
106
106
|
def to_s
|
107
107
|
s = case
|
108
|
-
when block &&
|
109
|
-
"(#{type.param_to_s}) { (#{
|
110
|
-
when block
|
111
|
-
"(#{type.param_to_s}) ?{ (#{
|
108
|
+
when (b = block) && b.required
|
109
|
+
"(#{type.param_to_s}) { (#{b.type.param_to_s}) -> #{b.type.return_to_s} } -> #{type.return_to_s}"
|
110
|
+
when b = block
|
111
|
+
"(#{type.param_to_s}) ?{ (#{b.type.param_to_s}) -> #{b.type.return_to_s} } -> #{type.return_to_s}"
|
112
112
|
else
|
113
113
|
"(#{type.param_to_s}) -> #{type.return_to_s}"
|
114
114
|
end
|
data/lib/rbs/namespace.rb
CHANGED
@@ -63,7 +63,9 @@ module RBS
|
|
63
63
|
end
|
64
64
|
|
65
65
|
def split
|
66
|
-
|
66
|
+
last = path.last or return
|
67
|
+
parent = self.parent
|
68
|
+
[parent, last]
|
67
69
|
end
|
68
70
|
|
69
71
|
def to_s
|
@@ -77,6 +79,10 @@ module RBS
|
|
77
79
|
|
78
80
|
def to_type_name
|
79
81
|
parent, name = split
|
82
|
+
|
83
|
+
raise unless name
|
84
|
+
raise unless parent
|
85
|
+
|
80
86
|
TypeName.new(name: name, namespace: parent)
|
81
87
|
end
|
82
88
|
|
@@ -88,14 +94,13 @@ module RBS
|
|
88
94
|
end
|
89
95
|
end
|
90
96
|
|
91
|
-
|
92
97
|
def ascend
|
93
98
|
if block_given?
|
94
99
|
current = self
|
95
100
|
|
96
101
|
until current.empty?
|
97
102
|
yield current
|
98
|
-
current = current.parent
|
103
|
+
current = _ = current.parent
|
99
104
|
end
|
100
105
|
|
101
106
|
yield current
|
@@ -107,3 +112,9 @@ module RBS
|
|
107
112
|
end
|
108
113
|
end
|
109
114
|
end
|
115
|
+
|
116
|
+
module Kernel
|
117
|
+
def Namespace(name)
|
118
|
+
RBS::Namespace.parse(name)
|
119
|
+
end
|
120
|
+
end
|
data/lib/rbs/parser.y
CHANGED
@@ -435,14 +435,6 @@ rule
|
|
435
435
|
method_member:
|
436
436
|
annotations attributes overload kDEF method_kind def_name method_types {
|
437
437
|
location = val[3].location + val[6].last.location
|
438
|
-
types = val[6].map do |type|
|
439
|
-
case type
|
440
|
-
when LocatedValue
|
441
|
-
type.value
|
442
|
-
else
|
443
|
-
type
|
444
|
-
end
|
445
|
-
end
|
446
438
|
|
447
439
|
last_type = val[6].last
|
448
440
|
if last_type.is_a?(LocatedValue) && last_type.value == :dot3
|
data/lib/rbs/prototype/rb.rb
CHANGED
@@ -36,7 +36,7 @@ module RBS
|
|
36
36
|
tokens.each.with_object({}) do |token, hash|
|
37
37
|
if token[1] == :on_comment
|
38
38
|
line = token[0][0]
|
39
|
-
body = token[2][2
|
39
|
+
body = token[2][2..-1]
|
40
40
|
|
41
41
|
body = "\n" if body.empty?
|
42
42
|
|
@@ -353,7 +353,6 @@ module RBS
|
|
353
353
|
Types::Bases::Nil.new(location: nil)
|
354
354
|
when :LIT
|
355
355
|
lit = node.children[0]
|
356
|
-
name = lit.class.name
|
357
356
|
case lit
|
358
357
|
when Symbol
|
359
358
|
if lit.match?(/\A[ -~]+\z/)
|
@@ -364,7 +363,7 @@ module RBS
|
|
364
363
|
when Integer
|
365
364
|
Types::Literal.new(literal: lit, location: nil)
|
366
365
|
else
|
367
|
-
type_name = TypeName.new(name: name, namespace: Namespace.root)
|
366
|
+
type_name = TypeName.new(name: lit.class.name.to_sym, namespace: Namespace.root)
|
368
367
|
Types::ClassInstance.new(name: type_name, args: [], location: nil)
|
369
368
|
end
|
370
369
|
when :ZLIST, :ZARRAY
|
@@ -420,7 +419,7 @@ module RBS
|
|
420
419
|
|
421
420
|
types = types.map do |t|
|
422
421
|
if t.is_a?(Types::Literal)
|
423
|
-
type_name = TypeName.new(name: t.literal.class.name, namespace: Namespace.root)
|
422
|
+
type_name = TypeName.new(name: t.literal.class.name.to_sym, namespace: Namespace.root)
|
424
423
|
Types::ClassInstance.new(name: type_name, args: [], location: nil)
|
425
424
|
else
|
426
425
|
t
|
data/lib/rbs/prototype/rbi.rb
CHANGED
@@ -16,7 +16,7 @@ module RBS
|
|
16
16
|
tokens.each.with_object({}) do |token, hash|
|
17
17
|
if token[1] == :on_comment
|
18
18
|
line = token[0][0]
|
19
|
-
body = token[2][2
|
19
|
+
body = token[2][2..-1]
|
20
20
|
|
21
21
|
body = "\n" if body.empty?
|
22
22
|
|
@@ -500,7 +500,6 @@ module RBS
|
|
500
500
|
else
|
501
501
|
type_node.type == :CALL && proc_type?(type_node.children[0])
|
502
502
|
end
|
503
|
-
|
504
503
|
end
|
505
504
|
|
506
505
|
def call_node?(node, name:, receiver: -> (node) { node.type == :CONST && node.children[0] == :T }, args: -> (node) { true })
|
data/lib/rbs/substitution.rb
CHANGED
@@ -31,10 +31,11 @@ module RBS
|
|
31
31
|
def apply(ty)
|
32
32
|
case ty
|
33
33
|
when Types::Variable
|
34
|
+
# @type var ty: Types::Variable
|
34
35
|
mapping[ty.name] || ty
|
35
36
|
when Types::Bases::Instance
|
36
|
-
if instance_type
|
37
|
-
|
37
|
+
if t = instance_type
|
38
|
+
t
|
38
39
|
else
|
39
40
|
ty
|
40
41
|
end
|
@@ -44,7 +45,7 @@ module RBS
|
|
44
45
|
end
|
45
46
|
|
46
47
|
def without(*vars)
|
47
|
-
|
48
|
+
Substitution.new.tap do |subst|
|
48
49
|
subst.mapping.merge!(mapping)
|
49
50
|
vars.each do |var|
|
50
51
|
subst.mapping.delete(var)
|
data/lib/rbs/type_name.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
|
1
2
|
module RBS
|
2
3
|
class TypeName
|
3
4
|
attr_reader :namespace
|
@@ -14,13 +15,15 @@ module RBS
|
|
14
15
|
:alias
|
15
16
|
when "_"
|
16
17
|
:interface
|
18
|
+
else
|
19
|
+
raise
|
17
20
|
end
|
18
21
|
end
|
19
22
|
|
20
23
|
def ==(other)
|
21
24
|
other.is_a?(self.class) && other.namespace == namespace && other.name == name
|
22
25
|
end
|
23
|
-
|
26
|
+
|
24
27
|
alias eql? ==
|
25
28
|
|
26
29
|
def hash
|
@@ -68,3 +71,17 @@ module RBS
|
|
68
71
|
end
|
69
72
|
end
|
70
73
|
end
|
74
|
+
|
75
|
+
module Kernel
|
76
|
+
def TypeName(string)
|
77
|
+
absolute = string.start_with?("::")
|
78
|
+
|
79
|
+
*path, name = string.delete_prefix("::").split("::").map(&:to_sym)
|
80
|
+
raise unless name
|
81
|
+
|
82
|
+
RBS::TypeName.new(
|
83
|
+
name: name,
|
84
|
+
namespace: RBS::Namespace.new(path: path, absolute: absolute)
|
85
|
+
)
|
86
|
+
end
|
87
|
+
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module RBS
|
2
2
|
class TypeNameResolver
|
3
|
-
Query = Struct.new(:type_name, :context, keyword_init: true)
|
3
|
+
Query = _ = Struct.new(:type_name, :context, keyword_init: true)
|
4
4
|
|
5
5
|
attr_reader :all_names
|
6
6
|
attr_reader :cache
|
@@ -36,15 +36,22 @@ module RBS
|
|
36
36
|
query = Query.new(type_name: type_name, context: context)
|
37
37
|
try_cache(query) do
|
38
38
|
path_head, *path_tail = type_name.to_namespace.path
|
39
|
+
raise unless path_head
|
40
|
+
|
39
41
|
name_head = TypeName.new(name: path_head, namespace: Namespace.empty)
|
40
42
|
|
41
|
-
absolute_head = context.
|
43
|
+
absolute_head = context.find do |namespace|
|
44
|
+
# @type break: TypeName
|
42
45
|
full_name = name_head.with_prefix(namespace)
|
43
46
|
has_name?(full_name) and break full_name
|
44
47
|
end
|
45
48
|
|
46
|
-
|
49
|
+
case absolute_head
|
50
|
+
when TypeName
|
47
51
|
has_name?(Namespace.new(path: absolute_head.to_namespace.path.push(*path_tail), absolute: true).to_type_name)
|
52
|
+
when Namespace
|
53
|
+
# This cannot happen because the `context.find` doesn't return a Namespace.
|
54
|
+
raise
|
48
55
|
end
|
49
56
|
end
|
50
57
|
end
|
data/lib/rbs/types.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
|
1
2
|
module RBS
|
2
3
|
module Types
|
3
4
|
module NoFreeVariables
|
@@ -77,7 +78,7 @@ module RBS
|
|
77
78
|
when Types::Bases::Class
|
78
79
|
'class'
|
79
80
|
else
|
80
|
-
raise "Unexpected base type: #{
|
81
|
+
raise "Unexpected base type: #{inspect}"
|
81
82
|
end
|
82
83
|
end
|
83
84
|
end
|
@@ -138,8 +139,6 @@ module RBS
|
|
138
139
|
new(name: v, location: nil)
|
139
140
|
when Array
|
140
141
|
v.map {|x| new(name: x, location: nil) }
|
141
|
-
else
|
142
|
-
raise
|
143
142
|
end
|
144
143
|
end
|
145
144
|
|
@@ -227,7 +226,7 @@ module RBS
|
|
227
226
|
end
|
228
227
|
|
229
228
|
def each_type(&block)
|
230
|
-
if
|
229
|
+
if block
|
231
230
|
args.each(&block)
|
232
231
|
else
|
233
232
|
enum_for :each_type
|
@@ -380,7 +379,7 @@ module RBS
|
|
380
379
|
end
|
381
380
|
|
382
381
|
def each_type(&block)
|
383
|
-
if
|
382
|
+
if block
|
384
383
|
types.each(&block)
|
385
384
|
else
|
386
385
|
enum_for :each_type
|
@@ -445,7 +444,7 @@ module RBS
|
|
445
444
|
end
|
446
445
|
|
447
446
|
def each_type(&block)
|
448
|
-
if
|
447
|
+
if block
|
449
448
|
fields.each_value(&block)
|
450
449
|
else
|
451
450
|
enum_for :each_type
|
@@ -492,11 +491,15 @@ module RBS
|
|
492
491
|
end
|
493
492
|
|
494
493
|
def to_s(level = 0)
|
495
|
-
|
496
|
-
|
497
|
-
|
498
|
-
|
494
|
+
case t = type
|
495
|
+
when RBS::Types::Literal
|
496
|
+
case t.literal
|
497
|
+
when Symbol
|
498
|
+
return "#{type.to_s(1)} ?"
|
499
|
+
end
|
499
500
|
end
|
501
|
+
|
502
|
+
"#{type.to_s(1)}?"
|
500
503
|
end
|
501
504
|
|
502
505
|
def each_type
|
@@ -560,7 +563,7 @@ module RBS
|
|
560
563
|
end
|
561
564
|
|
562
565
|
def each_type(&block)
|
563
|
-
if
|
566
|
+
if block
|
564
567
|
types.each(&block)
|
565
568
|
else
|
566
569
|
enum_for :each_type
|
@@ -568,7 +571,7 @@ module RBS
|
|
568
571
|
end
|
569
572
|
|
570
573
|
def map_type(&block)
|
571
|
-
if
|
574
|
+
if block
|
572
575
|
Union.new(types: types.map(&block), location: location)
|
573
576
|
else
|
574
577
|
enum_for :map_type
|
@@ -629,7 +632,7 @@ module RBS
|
|
629
632
|
end
|
630
633
|
|
631
634
|
def each_type(&block)
|
632
|
-
if
|
635
|
+
if block
|
633
636
|
types.each(&block)
|
634
637
|
else
|
635
638
|
enum_for :each_type
|
@@ -637,7 +640,7 @@ module RBS
|
|
637
640
|
end
|
638
641
|
|
639
642
|
def map_type(&block)
|
640
|
-
if
|
643
|
+
if block
|
641
644
|
Intersection.new(types: types.map(&block), location: location)
|
642
645
|
else
|
643
646
|
enum_for :map_type
|
@@ -672,8 +675,8 @@ module RBS
|
|
672
675
|
self.class.hash ^ type.hash ^ name.hash
|
673
676
|
end
|
674
677
|
|
675
|
-
def map_type
|
676
|
-
if
|
678
|
+
def map_type(&block)
|
679
|
+
if block
|
677
680
|
Param.new(name: name, type: yield(type))
|
678
681
|
else
|
679
682
|
enum_for :map_type
|
@@ -772,7 +775,7 @@ module RBS
|
|
772
775
|
end
|
773
776
|
|
774
777
|
def map_type(&block)
|
775
|
-
if
|
778
|
+
if block
|
776
779
|
Function.new(
|
777
780
|
required_positionals: required_positionals.map {|param| param.map_type(&block) },
|
778
781
|
optional_positionals: optional_positionals.map {|param| param.map_type(&block) },
|
@@ -810,7 +813,7 @@ module RBS
|
|
810
813
|
end
|
811
814
|
|
812
815
|
def each_param(&block)
|
813
|
-
if
|
816
|
+
if block
|
814
817
|
required_positionals.each(&block)
|
815
818
|
optional_positionals.each(&block)
|
816
819
|
rest_positionals&.yield_self(&block)
|
@@ -891,7 +894,9 @@ module RBS
|
|
891
894
|
end
|
892
895
|
|
893
896
|
def param_to_s
|
897
|
+
# @type var params: Array[String]
|
894
898
|
params = []
|
899
|
+
|
895
900
|
params.push(*required_positionals.map(&:to_s))
|
896
901
|
params.push(*optional_positionals.map {|p| "?#{p}"})
|
897
902
|
params.push("*#{rest_positionals}") if rest_positionals
|
@@ -927,8 +932,9 @@ module RBS
|
|
927
932
|
def drop_tail
|
928
933
|
case
|
929
934
|
when !trailing_positionals.empty?
|
935
|
+
last = trailing_positionals.last or raise
|
930
936
|
[
|
931
|
-
|
937
|
+
last,
|
932
938
|
update(trailing_positionals: trailing_positionals.take(trailing_positionals.size - 1))
|
933
939
|
]
|
934
940
|
else
|
@@ -960,7 +966,7 @@ module RBS
|
|
960
966
|
self.class.hash ^ type.hash
|
961
967
|
end
|
962
968
|
|
963
|
-
def free_variables(set)
|
969
|
+
def free_variables(set = Set[])
|
964
970
|
type.free_variables(set)
|
965
971
|
end
|
966
972
|
|
@@ -977,7 +983,7 @@ module RBS
|
|
977
983
|
end
|
978
984
|
|
979
985
|
def each_type(&block)
|
980
|
-
if
|
986
|
+
if block
|
981
987
|
type.each_type(&block)
|
982
988
|
else
|
983
989
|
enum_for :each_type
|