rbs 3.0.4 → 3.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +56 -0
- data/Gemfile +1 -1
- data/Gemfile.lock +23 -21
- data/Steepfile +1 -1
- data/core/file.rbs +104 -0
- data/core/gc.rbs +0 -7
- data/core/io/buffer.rbs +1 -3
- data/core/module.rbs +4 -4
- data/core/object.rbs +2 -2
- data/core/process.rbs +3 -0
- data/core/rubygems/rubygems.rbs +0 -9
- data/core/string.rbs +4 -2
- data/ext/rbs_extension/parser.c +15 -11
- data/lib/rbs/cli.rb +107 -13
- data/lib/rbs/collection/config/lockfile_generator.rb +38 -32
- data/lib/rbs/definition_builder.rb +6 -9
- data/lib/rbs/environment.rb +2 -2
- data/lib/rbs/environment_loader.rb +3 -23
- data/lib/rbs/errors.rb +59 -2
- data/lib/rbs/file_finder.rb +31 -0
- data/lib/rbs/parser_aux.rb +4 -4
- data/lib/rbs/prototype/rb.rb +2 -1
- data/lib/rbs/subtractor.rb +184 -0
- data/lib/rbs/vendorer.rb +3 -3
- data/lib/rbs/version.rb +1 -1
- data/lib/rbs/writer.rb +12 -0
- data/lib/rbs.rb +2 -0
- data/lib/rdoc/discover.rb +1 -1
- data/sig/cli.rbs +2 -0
- data/sig/collection/config/lockfile_generator.rbs +3 -1
- data/sig/environment_loader.rbs +17 -15
- data/sig/file_finder.rbs +6 -0
- data/sig/manifest.yaml +1 -0
- data/sig/parser.rbs +26 -8
- data/sig/repository.rbs +7 -5
- data/sig/shims/bundler.rbs +2 -0
- data/sig/shims/rubygems.rbs +4 -0
- data/sig/subtractor.rbs +33 -0
- data/sig/types.rbs +10 -6
- metadata +7 -3
@@ -0,0 +1,184 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RBS
|
4
|
+
class Subtractor
|
5
|
+
def initialize(minuend, subtrahend)
|
6
|
+
@minuend = minuend
|
7
|
+
@subtrahend = subtrahend
|
8
|
+
end
|
9
|
+
|
10
|
+
def call(minuend = @minuend, context: nil)
|
11
|
+
minuend.map do |decl|
|
12
|
+
case decl
|
13
|
+
when AST::Declarations::Constant
|
14
|
+
name = absolute_typename(decl.name, context: context)
|
15
|
+
decl unless @subtrahend.constant_name?(name)
|
16
|
+
when AST::Declarations::Interface
|
17
|
+
name = absolute_typename(decl.name, context: context)
|
18
|
+
decl unless @subtrahend.interface_name?(name)
|
19
|
+
when AST::Declarations::Class, AST::Declarations::Module
|
20
|
+
name = absolute_typename(decl.name, context: context)
|
21
|
+
case
|
22
|
+
when @subtrahend.class_decl?(name) && decl.is_a?(AST::Declarations::Class)
|
23
|
+
filter_members(decl, context: context)
|
24
|
+
when @subtrahend.module_decl?(name) && decl.is_a?(AST::Declarations::Module)
|
25
|
+
filter_members(decl, context: context)
|
26
|
+
when @subtrahend.constant_name?(name)
|
27
|
+
nil
|
28
|
+
else
|
29
|
+
decl
|
30
|
+
end
|
31
|
+
when AST::Declarations::Global
|
32
|
+
decl unless @subtrahend.global_decls[decl.name]
|
33
|
+
when AST::Declarations::TypeAlias
|
34
|
+
name = absolute_typename(decl.name, context: context)
|
35
|
+
decl unless @subtrahend.type_alias_decls[name]
|
36
|
+
when AST::Declarations::ClassAlias
|
37
|
+
name = absolute_typename(decl.new_name, context: context)
|
38
|
+
decl unless @subtrahend.class_alias?(name) || @subtrahend.class_decl?(name)
|
39
|
+
when AST::Declarations::ModuleAlias
|
40
|
+
name = absolute_typename(decl.new_name, context: context)
|
41
|
+
decl unless @subtrahend.module_alias?(name) || @subtrahend.module_decl?(name)
|
42
|
+
else
|
43
|
+
raise "unknwon decl: #{(_ = decl).class}"
|
44
|
+
end
|
45
|
+
end.compact
|
46
|
+
end
|
47
|
+
|
48
|
+
private def filter_members(decl, context:)
|
49
|
+
owner = absolute_typename(decl.name, context: context)
|
50
|
+
|
51
|
+
context = _ = [context, decl.name]
|
52
|
+
children = call(decl.each_decl.to_a, context: context) +
|
53
|
+
decl.each_member.reject { |m| member_exist?(owner, m, context: context) }
|
54
|
+
return nil if children.empty?
|
55
|
+
|
56
|
+
update_decl(decl, members: children)
|
57
|
+
end
|
58
|
+
|
59
|
+
private def member_exist?(owner, member, context:)
|
60
|
+
case member
|
61
|
+
when AST::Members::MethodDefinition
|
62
|
+
method_exist?(owner, member.name, member.kind)
|
63
|
+
when AST::Members::Alias
|
64
|
+
method_exist?(owner, member.new_name, member.kind)
|
65
|
+
when AST::Members::AttrReader
|
66
|
+
method_exist?(owner, member.name, member.kind)
|
67
|
+
when AST::Members::AttrWriter
|
68
|
+
method_exist?(owner, :"#{member.name}=", member.kind)
|
69
|
+
when AST::Members::AttrAccessor
|
70
|
+
# TODO: It unexpectedly removes attr_accessor even if either reader or writer does not exist in the subtrahend.
|
71
|
+
method_exist?(owner, member.name, member.kind) || method_exist?(owner, :"#{member.name}=", member.kind)
|
72
|
+
when AST::Members::InstanceVariable
|
73
|
+
ivar_exist?(owner, member.name, :instance)
|
74
|
+
when AST::Members::ClassInstanceVariable
|
75
|
+
ivar_exist?(owner, member.name, :singleton)
|
76
|
+
when AST::Members::ClassVariable
|
77
|
+
cvar_exist?(owner, member.name)
|
78
|
+
when AST::Members::Include, AST::Members::Extend, AST::Members::Prepend
|
79
|
+
mixin_exist?(owner, member, context: context)
|
80
|
+
when AST::Members::Public, AST::Members::Private
|
81
|
+
# They should not be removed even if the subtrahend has them.
|
82
|
+
false
|
83
|
+
else
|
84
|
+
raise "unknown member: #{(_ = member).class}"
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
private def method_exist?(owner, method_name, kind)
|
89
|
+
each_member(owner).any? do |m|
|
90
|
+
case m
|
91
|
+
when AST::Members::MethodDefinition
|
92
|
+
m.name == method_name && m.kind == kind
|
93
|
+
when AST::Members::Alias
|
94
|
+
m.new_name == method_name && m.kind == kind
|
95
|
+
when AST::Members::AttrReader
|
96
|
+
m.name == method_name && m.kind == kind
|
97
|
+
when AST::Members::AttrWriter
|
98
|
+
:"#{m.name}=" == method_name && m.kind == kind
|
99
|
+
when AST::Members::AttrAccessor
|
100
|
+
(m.name == method_name || :"#{m.name}=" == method_name) && m.kind == kind
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
private def ivar_exist?(owner, name, kind)
|
106
|
+
each_member(owner).any? do |m|
|
107
|
+
case m
|
108
|
+
when AST::Members::InstanceVariable
|
109
|
+
m.name == name
|
110
|
+
when AST::Members::Attribute
|
111
|
+
ivar_name = m.ivar_name == false ? nil : m.ivar_name || :"@#{m.name}"
|
112
|
+
ivar_name == name && m.kind == kind
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
private def cvar_exist?(owner, name)
|
118
|
+
each_member(owner).any? do |m|
|
119
|
+
case m
|
120
|
+
when AST::Members::ClassVariable
|
121
|
+
m.name == name
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
private def each_member(owner, &block)
|
127
|
+
return enum_for((__method__ or raise), owner) unless block
|
128
|
+
|
129
|
+
entry = @subtrahend.class_decls[owner]
|
130
|
+
return unless entry
|
131
|
+
decls = entry.decls.map { |d| d.decl }
|
132
|
+
|
133
|
+
decls.each { |d| d.members.each { |m| block.call(m) } }
|
134
|
+
end
|
135
|
+
|
136
|
+
private def mixin_exist?(owner, mixin, context:)
|
137
|
+
candidates = typename_candidates(mixin.name, context: context)
|
138
|
+
each_member(owner).any? do |m|
|
139
|
+
case m
|
140
|
+
when mixin.class
|
141
|
+
# @type var m: AST::Members::Include | AST::Members::Extend | AST::Members::Prepend
|
142
|
+
candidates.include?(m.name)
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
private def update_decl(decl, members:)
|
148
|
+
case decl
|
149
|
+
when AST::Declarations::Class
|
150
|
+
decl.class.new(name: decl.name, type_params: decl.type_params, super_class: decl.super_class,
|
151
|
+
annotations: decl.annotations, location: decl.location, comment: decl.comment,
|
152
|
+
members: members)
|
153
|
+
when AST::Declarations::Module
|
154
|
+
decl.class.new(name: decl.name, type_params: decl.type_params, self_types: decl.self_types,
|
155
|
+
annotations: decl.annotations, location: decl.location, comment: decl.comment,
|
156
|
+
members: members)
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
private def absolute_typename(name, context:)
|
161
|
+
while context
|
162
|
+
ns = context[1] or raise
|
163
|
+
name = name.with_prefix(ns.to_namespace)
|
164
|
+
context = _ = context[0]
|
165
|
+
end
|
166
|
+
name.absolute!
|
167
|
+
end
|
168
|
+
|
169
|
+
private def typename_candidates(name, context:)
|
170
|
+
ret = [name.absolute!, name.relative!]
|
171
|
+
return ret if name.absolute?
|
172
|
+
|
173
|
+
while context
|
174
|
+
ns = context[1] or raise
|
175
|
+
name = name.with_prefix(ns.to_namespace)
|
176
|
+
ret.concat [name.absolute!, name.relative!]
|
177
|
+
|
178
|
+
context = _ = context[0]
|
179
|
+
end
|
180
|
+
|
181
|
+
ret
|
182
|
+
end
|
183
|
+
end
|
184
|
+
end
|
data/lib/rbs/vendorer.rb
CHANGED
@@ -31,7 +31,7 @@ module RBS
|
|
31
31
|
|
32
32
|
if core_root = loader.core_root
|
33
33
|
RBS.logger.info "Vendoring core RBSs in #{vendor_dir + "core"}..."
|
34
|
-
|
34
|
+
FileFinder.each_file(core_root, immediate: false, skip_hidden: true) do |file_path|
|
35
35
|
paths << [file_path, Pathname("core") + file_path.relative_path_from(core_root)]
|
36
36
|
end
|
37
37
|
end
|
@@ -43,7 +43,7 @@ module RBS
|
|
43
43
|
|
44
44
|
RBS.logger.info "Vendoring #{lib.name}(#{spec.version}) RBSs in #{vendor_dir + dest_dir}..."
|
45
45
|
|
46
|
-
|
46
|
+
FileFinder.each_file(path, skip_hidden: true, immediate: false) do |file_path|
|
47
47
|
paths << [file_path, dest_dir + file_path.relative_path_from(path)]
|
48
48
|
end
|
49
49
|
|
@@ -52,7 +52,7 @@ module RBS
|
|
52
52
|
|
53
53
|
RBS.logger.info "Vendoring #{lib.name}(#{path.version}) RBSs in #{vendor_dir + dest_dir}..."
|
54
54
|
|
55
|
-
|
55
|
+
FileFinder.each_file(path.path, skip_hidden: true, immediate: false) do |file_path|
|
56
56
|
paths << [file_path, dest_dir + file_path.relative_path_from(path.path)]
|
57
57
|
end
|
58
58
|
else
|
data/lib/rbs/version.rb
CHANGED
data/lib/rbs/writer.rb
CHANGED
@@ -167,6 +167,18 @@ module RBS
|
|
167
167
|
puts "type #{name_and_params(decl.name, decl.type_params)} = #{decl.type}"
|
168
168
|
}
|
169
169
|
|
170
|
+
when AST::Declarations::ClassAlias
|
171
|
+
write_comment decl.comment
|
172
|
+
write_loc_source(decl) {
|
173
|
+
puts "class #{decl.new_name} = #{decl.old_name}"
|
174
|
+
}
|
175
|
+
|
176
|
+
when AST::Declarations::ModuleAlias
|
177
|
+
write_comment decl.comment
|
178
|
+
write_loc_source(decl) {
|
179
|
+
puts "module #{decl.new_name} = #{decl.old_name}"
|
180
|
+
}
|
181
|
+
|
170
182
|
when AST::Declarations::Interface
|
171
183
|
write_comment decl.comment
|
172
184
|
write_annotation decl.annotations
|
data/lib/rbs.rb
CHANGED
@@ -16,6 +16,7 @@ require "rbs/namespace"
|
|
16
16
|
require "rbs/type_name"
|
17
17
|
require "rbs/types"
|
18
18
|
require "rbs/method_type"
|
19
|
+
require "rbs/file_finder"
|
19
20
|
require "rbs/ast/type_param"
|
20
21
|
require "rbs/ast/directives"
|
21
22
|
require "rbs/ast/declarations"
|
@@ -46,6 +47,7 @@ require "rbs/vendorer"
|
|
46
47
|
require "rbs/validator"
|
47
48
|
require "rbs/factory"
|
48
49
|
require "rbs/repository"
|
50
|
+
require "rbs/subtractor"
|
49
51
|
require "rbs/ancestor_graph"
|
50
52
|
require "rbs/locator"
|
51
53
|
require "rbs/type_alias_dependency"
|
data/lib/rdoc/discover.rb
CHANGED
data/sig/cli.rbs
CHANGED
@@ -36,7 +36,9 @@ module RBS
|
|
36
36
|
|
37
37
|
# Inserts a entry to lockfile of a gem and its dependencies, if not included in `ignored_gems:`
|
38
38
|
#
|
39
|
-
|
39
|
+
# * If `skip:` is true, it skips adding the gem, but adds it's dependencies.
|
40
|
+
#
|
41
|
+
def assign_gem: (name: String, version: String?, src_data: Sources::source_entry?, ignored_gems: Set[String], ?skip: bool) -> void
|
40
42
|
|
41
43
|
def assign_stdlib: (name: String, from_gem: String?) -> void
|
42
44
|
|
data/sig/environment_loader.rbs
CHANGED
@@ -3,23 +3,25 @@ module RBS
|
|
3
3
|
#
|
4
4
|
# Set up your configuration through repository and `#add` method.
|
5
5
|
#
|
6
|
-
#
|
7
|
-
#
|
8
|
-
#
|
9
|
-
#
|
6
|
+
# ```ruby
|
7
|
+
# # Set up the repository to load library RBSs from.
|
8
|
+
# repo = RBS::Repository.default
|
9
|
+
# repo.add(Pathname("vendor/rbs/gem-rbs"))
|
10
|
+
# repo.add(Pathname("vendor/rbs/internal-rbs"))
|
10
11
|
#
|
11
|
-
#
|
12
|
+
# loader = RBS::EnvironmentLoader.new(repository: repo)
|
12
13
|
#
|
13
|
-
#
|
14
|
-
#
|
15
|
-
#
|
14
|
+
# # Add libraries to load RBS files.
|
15
|
+
# loader.add(library: "minitest")
|
16
|
+
# loader.add(library: "rbs", version: "1.0.0")
|
16
17
|
#
|
17
|
-
#
|
18
|
-
#
|
18
|
+
# # Add dirs to load RBS files from.
|
19
|
+
# loader.add(path: Pathname("sig"))
|
19
20
|
#
|
20
|
-
#
|
21
|
-
#
|
22
|
-
#
|
21
|
+
# # Load RBSs into an environment.
|
22
|
+
# environment = RBS::Environment.new()
|
23
|
+
# loader.load(env: environment)
|
24
|
+
# ```
|
23
25
|
#
|
24
26
|
class EnvironmentLoader
|
25
27
|
class UnknownLibraryError < StandardError
|
@@ -35,6 +37,8 @@ module RBS
|
|
35
37
|
def initialize: (name: String, version: String?) -> void
|
36
38
|
end
|
37
39
|
|
40
|
+
include FileFinder
|
41
|
+
|
38
42
|
DEFAULT_CORE_ROOT: Pathname
|
39
43
|
|
40
44
|
attr_reader core_root: Pathname?
|
@@ -103,7 +107,5 @@ module RBS
|
|
103
107
|
def each_signature: () { (source, Pathname, Buffer, Array[AST::Declarations::t], Array[AST::Directives::t]) -> void } -> void
|
104
108
|
|
105
109
|
def each_dir: { (source, Pathname) -> void } -> void
|
106
|
-
|
107
|
-
def each_file: (Pathname path, immediate: boolish, skip_hidden: boolish) { (Pathname) -> void } -> void
|
108
110
|
end
|
109
111
|
end
|
data/sig/file_finder.rbs
ADDED
data/sig/manifest.yaml
CHANGED
data/sig/parser.rbs
CHANGED
@@ -2,8 +2,7 @@ module RBS
|
|
2
2
|
class Parser
|
3
3
|
# Parse a method type and return it
|
4
4
|
#
|
5
|
-
# When `
|
6
|
-
# If no token is left in the input, it returns `nil`.
|
5
|
+
# When `range` keyword is specified, it starts parsing from the `begin` to the `endo` the range.
|
7
6
|
#
|
8
7
|
# ```ruby
|
9
8
|
# RBS::Parser.parse_method_type("() -> void") # => `() -> void`
|
@@ -12,12 +11,21 @@ module RBS
|
|
12
11
|
# RBS::Parser.parse_method_type("() -> void () -> String", range: 23...) # => nil
|
13
12
|
# ```
|
14
13
|
#
|
15
|
-
|
14
|
+
# When `require_eof` is `true`, an error is raised if more tokens are left in the input.
|
15
|
+
# (Defaults to `false`.)
|
16
|
+
#
|
17
|
+
# ```ruby
|
18
|
+
# RBS::Parser.parse_method_type("() -> void () -> String", require_eof: false) # => `() -> void`
|
19
|
+
# RBS::Parser.parse_method_type("() -> void () -> String", require_eof: true) # => Raises an error
|
20
|
+
#
|
21
|
+
# RBS::Parser.parse_method_type("", require_eof: true) # => nil
|
22
|
+
# ```
|
23
|
+
#
|
24
|
+
def self.parse_method_type: (Buffer | String, ?range: Range[Integer?], ?variables: Array[Symbol], ?require_eof: bool) -> MethodType?
|
16
25
|
|
17
26
|
# Parse a type and return it
|
18
27
|
#
|
19
|
-
# When `
|
20
|
-
# If no token is left in the input, it returns `nil`.
|
28
|
+
# When `range` keyword is specified, it starts parsing from the `begin` to the `endo` the range.
|
21
29
|
#
|
22
30
|
# ```ruby
|
23
31
|
# RBS::Parser.parse_type("String") # => `String`
|
@@ -26,7 +34,17 @@ module RBS
|
|
26
34
|
# RBS::Parser.parse_type("String Integer", pos: 14...) # => nil
|
27
35
|
# ```
|
28
36
|
#
|
29
|
-
|
37
|
+
# When `require_eof` is `true`, an error is raised if more tokens are left in the input.
|
38
|
+
# (Defaults to `false`.)
|
39
|
+
#
|
40
|
+
# ```ruby
|
41
|
+
# RBS::Parser.parse_type("String untyped", require_eof: false) # => `String`
|
42
|
+
# RBS::Parser.parse_type("String untyped", require_eof: true) # => Raises an error
|
43
|
+
#
|
44
|
+
# RBS::Parser.parse_type("", require_eof: true) # => nil
|
45
|
+
# ```
|
46
|
+
#
|
47
|
+
def self.parse_type: (Buffer | String, ?range: Range[Integer?], ?variables: Array[Symbol], ?require_eof: bool) -> Types::t?
|
30
48
|
|
31
49
|
# Parse whole RBS file and return an array of declarations
|
32
50
|
#
|
@@ -38,9 +56,9 @@ module RBS
|
|
38
56
|
|
39
57
|
def self.buffer: (String | Buffer source) -> Buffer
|
40
58
|
|
41
|
-
def self._parse_type: (Buffer, Integer start_pos, Integer end_pos, Array[Symbol] variables) -> Types::t?
|
59
|
+
def self._parse_type: (Buffer, Integer start_pos, Integer end_pos, Array[Symbol] variables, bool require_eof) -> Types::t?
|
42
60
|
|
43
|
-
def self._parse_method_type: (Buffer, Integer start_pos, Integer end_pos, Array[Symbol] variables) -> MethodType?
|
61
|
+
def self._parse_method_type: (Buffer, Integer start_pos, Integer end_pos, Array[Symbol] variables, bool require_eof) -> MethodType?
|
44
62
|
|
45
63
|
def self._parse_signature: (Buffer, Integer end_pos) -> [Array[AST::Directives::t], Array[AST::Declarations::t]]
|
46
64
|
|
data/sig/repository.rbs
CHANGED
@@ -3,12 +3,14 @@ module RBS
|
|
3
3
|
#
|
4
4
|
# A repository object can handle multiple repository roots.
|
5
5
|
#
|
6
|
-
#
|
7
|
-
#
|
8
|
-
#
|
9
|
-
#
|
6
|
+
# ```ruby
|
7
|
+
# repo = RBS::Repository.new()
|
8
|
+
# repo.add(Pathname("vendor/rbs/gem-rbs"))
|
9
|
+
# repo.add(Pathname("vendor/rbs/internal-rbs"))
|
10
|
+
# repo.add(Pathname("vendor/rbs/definitely-rbs"))
|
10
11
|
#
|
11
|
-
#
|
12
|
+
# repo.lookup("minitest", "2.1.3") # => Pathname or nil
|
13
|
+
# ```
|
12
14
|
#
|
13
15
|
# If one gem version can resolve to several directories, the last added dir wins.
|
14
16
|
#
|
data/sig/shims/bundler.rbs
CHANGED
data/sig/shims/rubygems.rbs
CHANGED
data/sig/subtractor.rbs
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
module RBS
|
2
|
+
class Subtractor
|
3
|
+
type decl_with_members = AST::Declarations::Class | AST::Declarations::Module
|
4
|
+
|
5
|
+
@minuend: Array[AST::Declarations::t]
|
6
|
+
@subtrahend: Environment
|
7
|
+
|
8
|
+
def initialize: (Array[AST::Declarations::t] minuend, Environment subtrahend) -> void
|
9
|
+
|
10
|
+
def call: (?Array[AST::Declarations::t], ?context: Resolver::context) -> Array[AST::Declarations::t]
|
11
|
+
|
12
|
+
private def filter_members: (decl_with_members, context: Resolver::context) -> decl_with_members?
|
13
|
+
|
14
|
+
private def member_exist?: (TypeName owner, AST::Members::t, context: Resolver::context) -> boolish
|
15
|
+
|
16
|
+
private def method_exist?: (TypeName owner, Symbol method_name, AST::Members::MethodDefinition::kind) -> boolish
|
17
|
+
|
18
|
+
private def ivar_exist?: (TypeName owner, Symbol ivar_name, AST::Members::Attribute::kind) -> boolish
|
19
|
+
|
20
|
+
private def cvar_exist?: (TypeName owner, Symbol cvar_name) -> boolish
|
21
|
+
|
22
|
+
private def each_member: (TypeName owner) { (AST::Members::t | AST::Declarations::t) -> void } -> void
|
23
|
+
| (TypeName owner) -> Enumerator[(AST::Members::t | AST::Declarations::t), void]
|
24
|
+
|
25
|
+
private def mixin_exist?: (TypeName owner, AST::Members::Include | AST::Members::Extend | AST::Members::Prepend, context: Resolver::context) -> boolish
|
26
|
+
|
27
|
+
private def update_decl: (decl_with_members, members: Array[AST::Declarations::t | AST::Members::t]) -> decl_with_members
|
28
|
+
|
29
|
+
private def absolute_typename: (TypeName, context: Resolver::context) -> TypeName
|
30
|
+
|
31
|
+
private def typename_candidates: (TypeName, context: Resolver::context) -> Array[TypeName]
|
32
|
+
end
|
33
|
+
end
|
data/sig/types.rbs
CHANGED
@@ -18,9 +18,11 @@ module RBS
|
|
18
18
|
# Yields all direct sub types included in the type.
|
19
19
|
# It doesn't yield the type itself.
|
20
20
|
#
|
21
|
-
#
|
22
|
-
#
|
23
|
-
#
|
21
|
+
# ```ruby
|
22
|
+
# parse("Hash[String, Array[Symbol]]").each_type do |ty|
|
23
|
+
# ... # Yields String and Array[Symbol]
|
24
|
+
# end
|
25
|
+
# ```
|
24
26
|
#
|
25
27
|
def each_type: () { (t) -> void } -> void
|
26
28
|
| () -> Enumerator[t, void]
|
@@ -32,9 +34,11 @@ module RBS
|
|
32
34
|
# Returns a String representation.
|
33
35
|
# `level` is used internally.
|
34
36
|
#
|
35
|
-
#
|
36
|
-
#
|
37
|
-
#
|
37
|
+
# ```ruby
|
38
|
+
# parse("String").to_s # => "String"
|
39
|
+
# parse("String | Integer").to_s() # => "String | Integer"
|
40
|
+
# parse("String | Integer").to_s(1) # => "(String | Integer)"
|
41
|
+
# ```
|
38
42
|
#
|
39
43
|
def to_s: (?Integer level) -> String
|
40
44
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rbs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Soutaro Matsumoto
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-07-18 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: RBS is the language for type signatures for Ruby and standard library
|
14
14
|
definitions.
|
@@ -182,6 +182,7 @@ files:
|
|
182
182
|
- lib/rbs/environment_walker.rb
|
183
183
|
- lib/rbs/errors.rb
|
184
184
|
- lib/rbs/factory.rb
|
185
|
+
- lib/rbs/file_finder.rb
|
185
186
|
- lib/rbs/location_aux.rb
|
186
187
|
- lib/rbs/locator.rb
|
187
188
|
- lib/rbs/method_type.rb
|
@@ -201,6 +202,7 @@ files:
|
|
201
202
|
- lib/rbs/resolver/type_name_resolver.rb
|
202
203
|
- lib/rbs/sorter.rb
|
203
204
|
- lib/rbs/substitution.rb
|
205
|
+
- lib/rbs/subtractor.rb
|
204
206
|
- lib/rbs/test.rb
|
205
207
|
- lib/rbs/test/errors.rb
|
206
208
|
- lib/rbs/test/hook.rb
|
@@ -259,6 +261,7 @@ files:
|
|
259
261
|
- sig/environment_walker.rbs
|
260
262
|
- sig/errors.rbs
|
261
263
|
- sig/factory.rbs
|
264
|
+
- sig/file_finder.rbs
|
262
265
|
- sig/location.rbs
|
263
266
|
- sig/locator.rbs
|
264
267
|
- sig/manifest.yaml
|
@@ -284,6 +287,7 @@ files:
|
|
284
287
|
- sig/shims/rubygems.rbs
|
285
288
|
- sig/sorter.rbs
|
286
289
|
- sig/substitution.rbs
|
290
|
+
- sig/subtractor.rbs
|
287
291
|
- sig/type_alias_dependency.rbs
|
288
292
|
- sig/type_alias_regularity.rbs
|
289
293
|
- sig/type_param.rbs
|
@@ -447,7 +451,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
447
451
|
- !ruby/object:Gem::Version
|
448
452
|
version: '0'
|
449
453
|
requirements: []
|
450
|
-
rubygems_version: 3.4.
|
454
|
+
rubygems_version: 3.4.10
|
451
455
|
signing_key:
|
452
456
|
specification_version: 4
|
453
457
|
summary: Type signature for Ruby.
|