rbs 2.8.4 → 3.0.0.dev.2
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 +0 -3
- data/Gemfile +1 -1
- data/Gemfile.lock +17 -17
- data/README.md +1 -0
- data/Rakefile +66 -0
- data/core/array.rbs +1 -1
- data/core/builtin.rbs +1 -1
- data/core/hash.rbs +1 -1
- data/core/module.rbs +1 -1
- data/ext/rbs_extension/constants.c +18 -2
- data/ext/rbs_extension/constants.h +9 -1
- data/ext/rbs_extension/lexer.c +834 -777
- data/ext/rbs_extension/lexer.h +3 -1
- data/ext/rbs_extension/lexer.re +3 -1
- data/ext/rbs_extension/lexstate.c +4 -2
- data/ext/rbs_extension/parser.c +287 -57
- data/ext/rbs_extension/ruby_objs.c +71 -5
- data/ext/rbs_extension/ruby_objs.h +9 -2
- data/lib/rbs/annotate/rdoc_annotator.rb +1 -1
- data/lib/rbs/ast/declarations.rb +49 -2
- data/lib/rbs/ast/directives.rb +39 -0
- data/lib/rbs/ast/members.rb +49 -15
- data/lib/rbs/cli.rb +38 -19
- data/lib/rbs/collection/config/lockfile.rb +115 -0
- data/lib/rbs/collection/config/lockfile_generator.rb +99 -53
- data/lib/rbs/collection/config.rb +12 -40
- data/lib/rbs/collection/installer.rb +9 -13
- data/lib/rbs/collection/sources/base.rb +2 -2
- data/lib/rbs/collection/sources/git.rb +135 -62
- data/lib/rbs/collection/sources/rubygems.rb +10 -12
- data/lib/rbs/collection/sources/stdlib.rb +10 -13
- data/lib/rbs/collection/sources.rb +7 -1
- data/lib/rbs/collection.rb +1 -0
- data/lib/rbs/definition.rb +1 -1
- data/lib/rbs/definition_builder/ancestor_builder.rb +24 -8
- data/lib/rbs/definition_builder/method_builder.rb +3 -3
- data/lib/rbs/definition_builder.rb +456 -579
- data/lib/rbs/environment/use_map.rb +77 -0
- data/lib/rbs/environment.rb +356 -85
- data/lib/rbs/environment_loader.rb +20 -17
- data/lib/rbs/environment_walker.rb +1 -1
- data/lib/rbs/errors.rb +34 -37
- data/lib/rbs/locator.rb +3 -3
- data/lib/rbs/parser_aux.rb +8 -6
- data/lib/rbs/prototype/helpers.rb +29 -13
- data/lib/rbs/prototype/node_usage.rb +99 -0
- data/lib/rbs/prototype/rb.rb +3 -2
- data/lib/rbs/prototype/rbi.rb +6 -4
- data/lib/rbs/prototype/runtime.rb +25 -12
- data/lib/rbs/resolver/constant_resolver.rb +23 -7
- data/lib/rbs/resolver/type_name_resolver.rb +2 -1
- data/lib/rbs/sorter.rb +3 -3
- data/lib/rbs/substitution.rb +19 -0
- data/lib/rbs/test/setup.rb +1 -1
- data/lib/rbs/type_alias_dependency.rb +1 -1
- data/lib/rbs/type_alias_regularity.rb +3 -3
- data/lib/rbs/types.rb +1 -5
- data/lib/rbs/validator.rb +25 -3
- data/lib/rbs/variance_calculator.rb +2 -2
- data/lib/rbs/version.rb +1 -1
- data/lib/rbs/writer.rb +54 -19
- data/lib/rbs.rb +3 -2
- data/lib/rdoc_plugin/parser.rb +3 -3
- data/schema/members.json +15 -10
- data/sig/ancestor_graph.rbs +22 -2
- data/sig/collection/config/lockfile.rbs +80 -0
- data/sig/collection/config/lockfile_generator.rbs +53 -0
- data/sig/collection/config.rbs +5 -48
- data/sig/collection/installer.rbs +1 -1
- data/sig/collection/sources.rbs +76 -33
- data/sig/constant.rbs +1 -1
- data/sig/declarations.rbs +36 -3
- data/sig/definition.rbs +1 -1
- data/sig/definition_builder.rbs +94 -82
- data/sig/directives.rbs +61 -0
- data/sig/environment.rbs +150 -28
- data/sig/environment_loader.rbs +2 -2
- data/sig/errors.rbs +42 -0
- data/sig/members.rbs +31 -7
- data/sig/parser.rbs +8 -15
- data/sig/prototype/node_usage.rbs +20 -0
- data/sig/resolver/constant_resolver.rbs +1 -2
- data/sig/shims/bundler.rbs +31 -0
- data/sig/shims/rubygems.rbs +15 -0
- data/sig/shims.rbs +0 -22
- data/sig/substitution.rbs +6 -0
- data/sig/use_map.rbs +35 -0
- data/sig/validator.rbs +12 -5
- data/sig/writer.rbs +6 -2
- metadata +16 -9
- data/lib/rbs/constant_table.rb +0 -167
- data/lib/rbs/type_name_resolver.rb +0 -67
- data/sig/constant_table.rbs +0 -30
- data/sig/type_name_resolver.rbs +0 -26
@@ -60,25 +60,26 @@ module RBS
|
|
60
60
|
|
61
61
|
def resolve_dependencies(library:, version:)
|
62
62
|
[Collection::Sources::Rubygems.instance, Collection::Sources::Stdlib.instance].each do |source|
|
63
|
-
|
64
|
-
gem = { 'name' => library, 'version' => version }
|
65
|
-
next unless source.has?(gem)
|
63
|
+
next unless source.has?(library, version)
|
66
64
|
|
67
|
-
|
68
|
-
|
65
|
+
unless version
|
66
|
+
version = source.versions(library).last or raise
|
67
|
+
end
|
68
|
+
|
69
|
+
source.dependencies_of(library, version)&.each do |dep|
|
69
70
|
add(library: dep['name'], version: nil)
|
70
71
|
end
|
71
72
|
return
|
72
73
|
end
|
73
74
|
end
|
74
75
|
|
75
|
-
def add_collection(
|
76
|
-
|
76
|
+
def add_collection(lockfile)
|
77
|
+
lockfile.check_rbs_availability!
|
77
78
|
|
78
|
-
repository.add(
|
79
|
+
repository.add(lockfile.fullpath)
|
79
80
|
|
80
|
-
|
81
|
-
add(library: gem[
|
81
|
+
lockfile.gems.each_value do |gem|
|
82
|
+
add(library: gem[:name], version: gem[:version], resolve_dependencies: false)
|
82
83
|
end
|
83
84
|
end
|
84
85
|
|
@@ -94,9 +95,11 @@ module RBS
|
|
94
95
|
# @type var loaded: Array[[AST::Declarations::t, Pathname, source]]
|
95
96
|
loaded = []
|
96
97
|
|
97
|
-
|
98
|
-
|
99
|
-
|
98
|
+
each_signature do |source, path, buffer, decls, dirs|
|
99
|
+
decls.each do |decl|
|
100
|
+
loaded << [decl, path, source]
|
101
|
+
end
|
102
|
+
env.add_signature(buffer: buffer, directives: dirs, decls: decls)
|
100
103
|
end
|
101
104
|
|
102
105
|
loaded
|
@@ -147,7 +150,7 @@ module RBS
|
|
147
150
|
end
|
148
151
|
end
|
149
152
|
|
150
|
-
def
|
153
|
+
def each_signature
|
151
154
|
files = Set[]
|
152
155
|
|
153
156
|
each_dir do |source, dir|
|
@@ -159,9 +162,9 @@ module RBS
|
|
159
162
|
files << path
|
160
163
|
buffer = Buffer.new(name: path.to_s, content: path.read(encoding: "UTF-8"))
|
161
164
|
|
162
|
-
Parser.parse_signature(buffer)
|
163
|
-
|
164
|
-
|
165
|
+
_, dirs, decls = Parser.parse_signature(buffer)
|
166
|
+
|
167
|
+
yield source, path, buffer, decls, dirs
|
165
168
|
end
|
166
169
|
end
|
167
170
|
end
|
@@ -36,7 +36,7 @@ module RBS
|
|
36
36
|
env.interface_decls.each_key do |type_name|
|
37
37
|
yield TypeNameNode.new(type_name: type_name)
|
38
38
|
end
|
39
|
-
env.
|
39
|
+
env.type_alias_decls.each_key do |type_name|
|
40
40
|
yield TypeNameNode.new(type_name: type_name)
|
41
41
|
end
|
42
42
|
end
|
data/lib/rbs/errors.rb
CHANGED
@@ -119,19 +119,7 @@ module RBS
|
|
119
119
|
end
|
120
120
|
|
121
121
|
def self.check!(type_name, env:, location:)
|
122
|
-
|
123
|
-
when type_name.class?
|
124
|
-
env.class_decls
|
125
|
-
when type_name.alias?
|
126
|
-
env.alias_decls
|
127
|
-
when type_name.interface?
|
128
|
-
env.interface_decls
|
129
|
-
else
|
130
|
-
raise
|
131
|
-
end
|
132
|
-
|
133
|
-
dic.key?(type_name) or raise new(type_name: type_name, location: location)
|
134
|
-
|
122
|
+
env.type_name?(type_name) or raise new(type_name: type_name, location: location)
|
135
123
|
type_name
|
136
124
|
end
|
137
125
|
end
|
@@ -148,7 +136,7 @@ module RBS
|
|
148
136
|
end
|
149
137
|
|
150
138
|
def self.check!(type_name, env:, location:)
|
151
|
-
if
|
139
|
+
if env.module_name?(type_name)
|
152
140
|
return
|
153
141
|
end
|
154
142
|
|
@@ -166,7 +154,7 @@ module RBS
|
|
166
154
|
end
|
167
155
|
|
168
156
|
def self.check!(super_decl, env:)
|
169
|
-
return if env.
|
157
|
+
return if env.class_decl?(super_decl.name) || env.class_alias?(super_decl.name)
|
170
158
|
|
171
159
|
raise new(super_decl)
|
172
160
|
end
|
@@ -186,16 +174,7 @@ module RBS
|
|
186
174
|
def self.check!(self_type, env:)
|
187
175
|
type_name = self_type.name
|
188
176
|
|
189
|
-
|
190
|
-
when type_name.class?
|
191
|
-
env.class_decls
|
192
|
-
when type_name.interface?
|
193
|
-
env.interface_decls
|
194
|
-
else
|
195
|
-
raise
|
196
|
-
end
|
197
|
-
|
198
|
-
dic.key?(type_name) or raise new(type_name: type_name, location: self_type.location)
|
177
|
+
(env.module_name?(type_name) || env.interface_name?(type_name)) or raise new(type_name: type_name, location: self_type.location)
|
199
178
|
end
|
200
179
|
end
|
201
180
|
|
@@ -215,16 +194,7 @@ module RBS
|
|
215
194
|
end
|
216
195
|
|
217
196
|
def self.check!(type_name, env:, member:)
|
218
|
-
|
219
|
-
when type_name.class?
|
220
|
-
env.class_decls
|
221
|
-
when type_name.interface?
|
222
|
-
env.interface_decls
|
223
|
-
else
|
224
|
-
raise
|
225
|
-
end
|
226
|
-
|
227
|
-
dic.key?(type_name) or raise new(type_name: type_name, member: member)
|
197
|
+
(env.module_name?(type_name) || env.interface_name?(type_name)) or raise new(type_name: type_name, member: member)
|
228
198
|
end
|
229
199
|
end
|
230
200
|
|
@@ -416,8 +386,7 @@ module RBS
|
|
416
386
|
end
|
417
387
|
|
418
388
|
def self.check!(type_name:, env:, member:)
|
419
|
-
|
420
|
-
when Environment::ClassEntry
|
389
|
+
if env.class_decl?(member.name)
|
421
390
|
raise new(type_name: type_name, member: member)
|
422
391
|
end
|
423
392
|
end
|
@@ -478,4 +447,32 @@ module RBS
|
|
478
447
|
super "#{Location.to_string(location)}: Cyclic type parameter bound is prohibited"
|
479
448
|
end
|
480
449
|
end
|
450
|
+
|
451
|
+
class InconsistentClassModuleAliasError < BaseError
|
452
|
+
attr_reader :alias_entry
|
453
|
+
|
454
|
+
def initialize(entry)
|
455
|
+
@alias_entry = entry
|
456
|
+
|
457
|
+
expected_kind, actual_kind =
|
458
|
+
case entry
|
459
|
+
when Environment::ModuleAliasEntry
|
460
|
+
["module", "class"]
|
461
|
+
when Environment::ClassAliasEntry
|
462
|
+
["class", "module"]
|
463
|
+
end
|
464
|
+
|
465
|
+
super "#{Location.to_string(entry.decl.location&.[](:old_name))}: A #{expected_kind} `#{entry.decl.new_name}` cannot be an alias of a #{actual_kind} `#{entry.decl.old_name}`"
|
466
|
+
end
|
467
|
+
end
|
468
|
+
|
469
|
+
class CyclicClassAliasDefinitionError < BaseError
|
470
|
+
attr_reader :alias_entry
|
471
|
+
|
472
|
+
def initialize(entry)
|
473
|
+
@alias_entry = entry
|
474
|
+
|
475
|
+
super "#{Location.to_string(entry.decl.location&.[](:old_name))}: A #{alias_entry.decl.new_name} is a cyclic definition"
|
476
|
+
end
|
477
|
+
end
|
481
478
|
end
|
data/lib/rbs/locator.rb
CHANGED
@@ -95,7 +95,7 @@ module RBS
|
|
95
95
|
when AST::Declarations::Constant, AST::Declarations::Global
|
96
96
|
find_in_type(pos, array: array, type: decl.type) and return true
|
97
97
|
|
98
|
-
when AST::Declarations::
|
98
|
+
when AST::Declarations::TypeAlias
|
99
99
|
find_in_type(pos, array: array, type: decl.type) and return true
|
100
100
|
end
|
101
101
|
|
@@ -113,8 +113,8 @@ module RBS
|
|
113
113
|
|
114
114
|
case member
|
115
115
|
when AST::Members::MethodDefinition
|
116
|
-
member.
|
117
|
-
find_in_method_type(pos, array: array, method_type: method_type) and return true
|
116
|
+
member.overloads.each do |overload|
|
117
|
+
find_in_method_type(pos, array: array, method_type: overload.method_type) and return true
|
118
118
|
end
|
119
119
|
when AST::Members::InstanceVariable, AST::Members::ClassInstanceVariable, AST::Members::ClassVariable
|
120
120
|
find_in_type(pos, array: array, type: member.type) and return true
|
data/lib/rbs/parser_aux.rb
CHANGED
@@ -2,19 +2,21 @@
|
|
2
2
|
|
3
3
|
module RBS
|
4
4
|
class Parser
|
5
|
-
def self.parse_type(source,
|
5
|
+
def self.parse_type(source, range: 0..., variables: [])
|
6
6
|
buf = buffer(source)
|
7
|
-
_parse_type(buf, range
|
7
|
+
_parse_type(buf, range.begin || 0, range.end || buf.last_position, variables)
|
8
8
|
end
|
9
9
|
|
10
|
-
def self.parse_method_type(source,
|
10
|
+
def self.parse_method_type(source, range: 0..., variables: [])
|
11
11
|
buf = buffer(source)
|
12
|
-
_parse_method_type(buf, range
|
12
|
+
_parse_method_type(buf, range.begin || 0, range.end || buf.last_position, variables)
|
13
13
|
end
|
14
14
|
|
15
|
-
def self.parse_signature(source
|
15
|
+
def self.parse_signature(source)
|
16
16
|
buf = buffer(source)
|
17
|
-
_parse_signature(buf, buf.last_position)
|
17
|
+
dirs, decls = _parse_signature(buf, buf.last_position)
|
18
|
+
|
19
|
+
[buf, dirs, decls]
|
18
20
|
end
|
19
21
|
|
20
22
|
def self.buffer(source)
|
@@ -7,27 +7,43 @@ module RBS
|
|
7
7
|
|
8
8
|
def block_from_body(node)
|
9
9
|
_, args_node, body_node = node.children
|
10
|
+
_pre_num, _pre_init, _opt, _first_post, _post_num, _post_init, _rest, _kw, _kwrest, block_var = args_from_node(args_node)
|
10
11
|
|
11
|
-
|
12
|
+
# @type var body_node: node?
|
13
|
+
if body_node
|
14
|
+
yields = any_node?(body_node) {|n| n.type == :YIELD }
|
15
|
+
end
|
16
|
+
|
17
|
+
if yields || block_var
|
18
|
+
required = true
|
19
|
+
|
20
|
+
if body_node
|
21
|
+
if any_node?(body_node) {|n| n.type == :FCALL && n.children[0] == :block_given? && !n.children[1] }
|
22
|
+
required = false
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
if _rest == :* && block_var == :&
|
27
|
+
# ... is given
|
28
|
+
required = false
|
29
|
+
end
|
12
30
|
|
13
|
-
|
31
|
+
if block_var
|
32
|
+
if body_node
|
33
|
+
usage = NodeUsage.new(body_node)
|
34
|
+
if usage.each_conditional_node.any? {|n| n.type == :LVAR && n.children[0] == block_var }
|
35
|
+
required = false
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
14
39
|
|
15
|
-
if block
|
16
40
|
method_block = Types::Block.new(
|
17
|
-
required:
|
41
|
+
required: required,
|
18
42
|
type: Types::Function.empty(untyped),
|
19
43
|
self_type: nil
|
20
44
|
)
|
21
|
-
end
|
22
|
-
|
23
|
-
if body_node
|
24
|
-
if (yields = any_node?(body_node) {|n| n.type == :YIELD })
|
25
|
-
method_block = Types::Block.new(
|
26
|
-
required: true,
|
27
|
-
type: Types::Function.empty(untyped),
|
28
|
-
self_type: nil
|
29
|
-
)
|
30
45
|
|
46
|
+
if yields
|
31
47
|
yields.each do |yield_node|
|
32
48
|
array_content = yield_node.children[0]&.children&.compact || []
|
33
49
|
|
@@ -0,0 +1,99 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RBS
|
4
|
+
module Prototype
|
5
|
+
class NodeUsage
|
6
|
+
include Helpers
|
7
|
+
|
8
|
+
attr_reader :conditional_nodes
|
9
|
+
|
10
|
+
def initialize(node)
|
11
|
+
@node = node
|
12
|
+
@conditional_nodes = Set[].compare_by_identity
|
13
|
+
|
14
|
+
calculate(node, conditional: false)
|
15
|
+
end
|
16
|
+
|
17
|
+
def each_conditional_node(&block)
|
18
|
+
if block
|
19
|
+
conditional_nodes.each(&block)
|
20
|
+
else
|
21
|
+
conditional_nodes.each
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def calculate(node, conditional:)
|
26
|
+
if conditional
|
27
|
+
conditional_nodes << node
|
28
|
+
end
|
29
|
+
|
30
|
+
case node.type
|
31
|
+
when :IF, :UNLESS
|
32
|
+
cond_node, true_node, false_node = node.children
|
33
|
+
calculate(cond_node, conditional: true)
|
34
|
+
calculate(true_node, conditional: conditional) if true_node
|
35
|
+
calculate(false_node, conditional: conditional) if false_node
|
36
|
+
when :AND, :OR
|
37
|
+
left, right = node.children
|
38
|
+
calculate(left, conditional: true)
|
39
|
+
calculate(right, conditional: conditional)
|
40
|
+
when :QCALL
|
41
|
+
receiver, _, args = node.children
|
42
|
+
calculate(receiver, conditional: true)
|
43
|
+
calculate(args, conditional: false) if args
|
44
|
+
when :WHILE
|
45
|
+
cond, body = node.children
|
46
|
+
calculate(cond, conditional: true)
|
47
|
+
calculate(body, conditional: false) if body
|
48
|
+
when :OP_ASGN_OR, :OP_ASGN_AND
|
49
|
+
var, _, asgn = node.children
|
50
|
+
calculate(var, conditional: true)
|
51
|
+
calculate(asgn, conditional: conditional)
|
52
|
+
when :LASGN, :IASGN, :GASGN
|
53
|
+
_, lhs = node.children
|
54
|
+
calculate(lhs, conditional: conditional) if lhs
|
55
|
+
when :MASGN
|
56
|
+
lhs, _ = node.children
|
57
|
+
calculate(lhs, conditional: conditional)
|
58
|
+
when :CDECL
|
59
|
+
if node.children.size == 2
|
60
|
+
_, lhs = node.children
|
61
|
+
calculate(lhs, conditional: conditional)
|
62
|
+
else
|
63
|
+
const, _, lhs = node.children
|
64
|
+
calculate(const, conditional: false)
|
65
|
+
calculate(lhs, conditional: conditional)
|
66
|
+
end
|
67
|
+
when :SCOPE
|
68
|
+
_, _, body = node.children
|
69
|
+
calculate(body, conditional: conditional)
|
70
|
+
when :CASE2
|
71
|
+
_, *branches = node.children
|
72
|
+
branches.each do |branch|
|
73
|
+
if branch.type == :WHEN
|
74
|
+
list, body = branch.children
|
75
|
+
list.children.each do |child|
|
76
|
+
if child
|
77
|
+
calculate(child, conditional: true)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
calculate(body, conditional: conditional)
|
81
|
+
else
|
82
|
+
calculate(branch, conditional: conditional)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
when :BLOCK
|
86
|
+
*nodes, last = node.children
|
87
|
+
nodes.each do |no|
|
88
|
+
calculate(no, conditional: false)
|
89
|
+
end
|
90
|
+
calculate(last, conditional: conditional) if last
|
91
|
+
else
|
92
|
+
each_child(node) do |child|
|
93
|
+
calculate(child, conditional: false)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
data/lib/rbs/prototype/rb.rb
CHANGED
@@ -186,10 +186,11 @@ module RBS
|
|
186
186
|
name: def_name,
|
187
187
|
location: nil,
|
188
188
|
annotations: [],
|
189
|
-
types:
|
189
|
+
overloads: types.map {|type| AST::Members::MethodDefinition::Overload.new(annotations: [], method_type: type )},
|
190
190
|
kind: kind,
|
191
191
|
comment: comments[node.first_lineno - 1],
|
192
|
-
|
192
|
+
overloading: false,
|
193
|
+
visibility: nil
|
193
194
|
)
|
194
195
|
|
195
196
|
decls.push member unless decls.include?(member)
|
data/lib/rbs/prototype/rbi.rb
CHANGED
@@ -185,10 +185,11 @@ module RBS
|
|
185
185
|
name: node.children[1],
|
186
186
|
location: nil,
|
187
187
|
annotations: [],
|
188
|
-
types:
|
188
|
+
overloads: types.map {|type| AST::Members::MethodDefinition::Overload.new(annotations: [], method_type: type) },
|
189
189
|
kind: :singleton,
|
190
190
|
comment: comment,
|
191
|
-
|
191
|
+
overloading: false,
|
192
|
+
visibility: nil
|
192
193
|
)
|
193
194
|
end
|
194
195
|
|
@@ -205,10 +206,11 @@ module RBS
|
|
205
206
|
name: node.children[0],
|
206
207
|
location: nil,
|
207
208
|
annotations: [],
|
208
|
-
types:
|
209
|
+
overloads: types.map {|type| AST::Members::MethodDefinition::Overload.new(annotations: [], method_type: type) },
|
209
210
|
kind: :instance,
|
210
211
|
comment: comment,
|
211
|
-
|
212
|
+
overloading: false,
|
213
|
+
visibility: nil
|
212
214
|
)
|
213
215
|
end
|
214
216
|
|
@@ -187,18 +187,22 @@ module RBS
|
|
187
187
|
if method
|
188
188
|
members << AST::Members::MethodDefinition.new(
|
189
189
|
name: method_name,
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
190
|
+
overloads: method.method_types.map {|type|
|
191
|
+
AST::Members::MethodDefinition::Overload.new(
|
192
|
+
annotations: [],
|
193
|
+
method_type: type.update.tap do |ty|
|
194
|
+
def ty.to_s
|
195
|
+
location.source
|
196
|
+
end
|
194
197
|
end
|
195
|
-
|
198
|
+
)
|
196
199
|
},
|
197
200
|
kind: kind,
|
198
201
|
location: nil,
|
199
202
|
comment: method.comments[0],
|
200
203
|
annotations: method.annotations,
|
201
|
-
|
204
|
+
overloading: false,
|
205
|
+
visibility: nil
|
202
206
|
)
|
203
207
|
return
|
204
208
|
end
|
@@ -231,12 +235,15 @@ module RBS
|
|
231
235
|
|
232
236
|
members << AST::Members::MethodDefinition.new(
|
233
237
|
name: method.name,
|
234
|
-
|
238
|
+
overloads: [
|
239
|
+
AST::Members::MethodDefinition::Overload.new(annotations: [], method_type: method_type(method))
|
240
|
+
],
|
235
241
|
kind: :singleton,
|
236
242
|
location: nil,
|
237
243
|
comment: nil,
|
238
244
|
annotations: [],
|
239
|
-
|
245
|
+
overloading: false,
|
246
|
+
visibility: nil
|
240
247
|
)
|
241
248
|
end
|
242
249
|
else
|
@@ -264,12 +271,15 @@ module RBS
|
|
264
271
|
|
265
272
|
members << AST::Members::MethodDefinition.new(
|
266
273
|
name: method.name,
|
267
|
-
|
274
|
+
overloads: [
|
275
|
+
AST::Members::MethodDefinition::Overload.new(annotations: [], method_type: method_type(method))
|
276
|
+
],
|
268
277
|
kind: :instance,
|
269
278
|
location: nil,
|
270
279
|
comment: nil,
|
271
280
|
annotations: [],
|
272
|
-
|
281
|
+
overloading: false,
|
282
|
+
visibility: nil
|
273
283
|
)
|
274
284
|
end
|
275
285
|
else
|
@@ -298,12 +308,15 @@ module RBS
|
|
298
308
|
|
299
309
|
members << AST::Members::MethodDefinition.new(
|
300
310
|
name: method.name,
|
301
|
-
|
311
|
+
overloads: [
|
312
|
+
AST::Members::MethodDefinition::Overload.new(annotations: [], method_type: method_type(method))
|
313
|
+
],
|
302
314
|
kind: :instance,
|
303
315
|
location: nil,
|
304
316
|
comment: nil,
|
305
317
|
annotations: [],
|
306
|
-
|
318
|
+
overloading: false,
|
319
|
+
visibility: nil
|
307
320
|
)
|
308
321
|
end
|
309
322
|
else
|
@@ -18,20 +18,33 @@ module RBS
|
|
18
18
|
end
|
19
19
|
|
20
20
|
environment.class_decls.each do |name, entry|
|
21
|
+
constant = constant_of_module(name, entry)
|
22
|
+
|
21
23
|
unless name.namespace.empty?
|
22
24
|
parent = name.namespace.to_type_name
|
23
|
-
|
24
25
|
table = children_table[parent] or raise
|
25
|
-
constant = constant_of_module(name, entry)
|
26
26
|
else
|
27
27
|
table = toplevel
|
28
|
-
constant = constant_of_module(name, entry)
|
29
28
|
end
|
30
29
|
|
31
30
|
table[name.name] = constant
|
32
31
|
constants_table[name] = constant
|
33
32
|
end
|
34
33
|
|
34
|
+
environment.class_alias_decls.each do |name, entry|
|
35
|
+
normalized_entry = environment.normalized_module_class_entry(name) or next
|
36
|
+
constant = constant_of_module(name, normalized_entry)
|
37
|
+
|
38
|
+
# Insert class/module aliases into `children_table` and `toplevel` table
|
39
|
+
unless name.namespace.empty?
|
40
|
+
normalized_parent = environment.normalize_module_name?(name.namespace.to_type_name) or raise
|
41
|
+
table = children_table[normalized_parent] or raise
|
42
|
+
table[name.name] = constant
|
43
|
+
else
|
44
|
+
toplevel[name.name] = constant
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
35
48
|
environment.constant_decls.each do |name, entry|
|
36
49
|
unless name.namespace.empty?
|
37
50
|
parent = name.namespace.to_type_name
|
@@ -97,6 +110,8 @@ module RBS
|
|
97
110
|
end
|
98
111
|
|
99
112
|
def children(module_name)
|
113
|
+
module_name = builder.env.normalize_module_name(module_name)
|
114
|
+
|
100
115
|
unless child_constants_cache.key?(module_name)
|
101
116
|
load_child_constants(module_name)
|
102
117
|
end
|
@@ -113,6 +128,7 @@ module RBS
|
|
113
128
|
else
|
114
129
|
constants_from_ancestors(BuiltinNames::Object.name, constants: consts)
|
115
130
|
end
|
131
|
+
|
116
132
|
constants_from_context(context, constants: consts) or return
|
117
133
|
constants_itself(context, constants: consts)
|
118
134
|
|
@@ -151,7 +167,7 @@ module RBS
|
|
151
167
|
constants_from_context(parent, constants: constants) or return false
|
152
168
|
|
153
169
|
if last
|
154
|
-
consts = table.children(last) or return false
|
170
|
+
consts = table.children(builder.env.normalize_module_name(last)) or return false
|
155
171
|
constants.merge!(consts)
|
156
172
|
end
|
157
173
|
end
|
@@ -160,14 +176,14 @@ module RBS
|
|
160
176
|
end
|
161
177
|
|
162
178
|
def constants_from_ancestors(module_name, constants:)
|
163
|
-
entry = builder.env.
|
179
|
+
entry = builder.env.normalized_module_class_entry(module_name) or raise
|
164
180
|
|
165
|
-
if entry.is_a?(Environment::ModuleEntry)
|
181
|
+
if entry.is_a?(Environment::ClassEntry) || entry.is_a?(Environment::ModuleEntry)
|
166
182
|
constants.merge!(table.children(BuiltinNames::Object.name) || raise)
|
167
183
|
constants.merge!(table.toplevel)
|
168
184
|
end
|
169
185
|
|
170
|
-
builder.ancestor_builder.instance_ancestors(
|
186
|
+
builder.ancestor_builder.instance_ancestors(entry.name).ancestors.reverse_each do |ancestor|
|
171
187
|
if ancestor.is_a?(Definition::Ancestor::Instance)
|
172
188
|
case ancestor.source
|
173
189
|
when AST::Members::Include, :super, nil
|
@@ -12,7 +12,8 @@ module RBS
|
|
12
12
|
|
13
13
|
all_names.merge(env.class_decls.keys)
|
14
14
|
all_names.merge(env.interface_decls.keys)
|
15
|
-
all_names.merge(env.
|
15
|
+
all_names.merge(env.type_alias_decls.keys)
|
16
|
+
all_names.merge(env.class_alias_decls.keys)
|
16
17
|
end
|
17
18
|
|
18
19
|
def try_cache(query)
|
data/lib/rbs/sorter.rb
CHANGED
@@ -15,7 +15,7 @@ module RBS
|
|
15
15
|
stdout.puts "Opening #{path}..."
|
16
16
|
|
17
17
|
buffer = Buffer.new(name: path, content: path.read)
|
18
|
-
sigs = Parser.parse_signature(buffer)
|
18
|
+
_, _, sigs = Parser.parse_signature(buffer)
|
19
19
|
|
20
20
|
sigs.each do |m|
|
21
21
|
sort_decl! m
|
@@ -30,7 +30,7 @@ module RBS
|
|
30
30
|
|
31
31
|
def group(member)
|
32
32
|
case member
|
33
|
-
when Declarations::
|
33
|
+
when Declarations::TypeAlias
|
34
34
|
-3
|
35
35
|
when Declarations::Constant
|
36
36
|
-2
|
@@ -100,7 +100,7 @@ module RBS
|
|
100
100
|
member.new_name.to_s
|
101
101
|
when Declarations::Constant
|
102
102
|
member.name.to_s
|
103
|
-
when Declarations::
|
103
|
+
when Declarations::TypeAlias
|
104
104
|
member.name.to_s
|
105
105
|
when Declarations::Class, Declarations::Module
|
106
106
|
member.name.to_s
|
data/lib/rbs/substitution.rb
CHANGED
@@ -50,6 +50,8 @@ module RBS
|
|
50
50
|
end
|
51
51
|
end
|
52
52
|
|
53
|
+
alias [] apply
|
54
|
+
|
53
55
|
def without(*vars)
|
54
56
|
Substitution.new.tap do |subst|
|
55
57
|
subst.mapping.merge!(mapping)
|
@@ -60,5 +62,22 @@ module RBS
|
|
60
62
|
subst.instance_type = self.instance_type
|
61
63
|
end
|
62
64
|
end
|
65
|
+
|
66
|
+
def +(other)
|
67
|
+
return self if other.empty?
|
68
|
+
return other if self.empty?
|
69
|
+
|
70
|
+
Substitution.new.tap do |subst|
|
71
|
+
subst.mapping.merge!(mapping)
|
72
|
+
|
73
|
+
other.mapping.each do |var, type|
|
74
|
+
if mapping.key?(var)
|
75
|
+
subst.add(from: var, to: self[type])
|
76
|
+
else
|
77
|
+
subst.add(from: var, to: type)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
63
82
|
end
|
64
83
|
end
|