rbs 3.0.4 → 3.1.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/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.
|