rbs 0.11.0 → 0.13.1
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/.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
|