rbs 3.0.0.dev.1 → 3.0.0.dev.3

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.
Files changed (165) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/comments.yml +2 -1
  3. data/.github/workflows/ruby.yml +4 -3
  4. data/CHANGELOG.md +28 -0
  5. data/Gemfile.lock +12 -12
  6. data/README.md +1 -0
  7. data/Rakefile +77 -3
  8. data/Steepfile +1 -1
  9. data/core/array.rbs +574 -424
  10. data/core/basic_object.rbs +11 -39
  11. data/core/binding.rbs +1 -1
  12. data/core/builtin.rbs +9 -1
  13. data/core/class.rbs +37 -0
  14. data/core/comparable.rbs +7 -18
  15. data/core/complex.rbs +2 -2
  16. data/core/data.rbs +419 -0
  17. data/core/dir.rbs +52 -104
  18. data/core/encoding.rbs +22 -181
  19. data/core/enumerable.rbs +212 -175
  20. data/core/enumerator/product.rbs +96 -0
  21. data/core/enumerator.rbs +57 -8
  22. data/core/errors.rbs +8 -2
  23. data/core/exception.rbs +41 -0
  24. data/core/fiber.rbs +95 -12
  25. data/core/file.rbs +840 -275
  26. data/core/file_test.rbs +34 -19
  27. data/core/float.rbs +40 -96
  28. data/core/gc.rbs +15 -3
  29. data/core/hash.rbs +114 -176
  30. data/core/integer.rbs +85 -145
  31. data/core/io/buffer.rbs +187 -60
  32. data/core/io/wait.rbs +28 -16
  33. data/core/io.rbs +1859 -1389
  34. data/core/kernel.rbs +525 -961
  35. data/core/match_data.rbs +306 -142
  36. data/core/math.rbs +506 -234
  37. data/core/method.rbs +0 -24
  38. data/core/module.rbs +111 -18
  39. data/core/nil_class.rbs +2 -0
  40. data/core/numeric.rbs +76 -144
  41. data/core/object.rbs +88 -212
  42. data/core/proc.rbs +17 -5
  43. data/core/process.rbs +22 -5
  44. data/core/ractor.rbs +1 -1
  45. data/core/random.rbs +20 -3
  46. data/core/range.rbs +91 -89
  47. data/core/rational.rbs +2 -3
  48. data/core/rbs/unnamed/argf.rbs +177 -120
  49. data/core/rbs/unnamed/env_class.rbs +89 -163
  50. data/core/rbs/unnamed/random.rbs +36 -12
  51. data/core/refinement.rbs +8 -0
  52. data/core/regexp.rbs +462 -272
  53. data/core/ruby_vm.rbs +210 -0
  54. data/{stdlib/set/0 → core}/set.rbs +43 -47
  55. data/core/string.rbs +1403 -1332
  56. data/core/string_io.rbs +191 -107
  57. data/core/struct.rbs +67 -63
  58. data/core/symbol.rbs +187 -201
  59. data/core/thread.rbs +40 -35
  60. data/core/time.rbs +902 -826
  61. data/core/trace_point.rbs +55 -6
  62. data/core/unbound_method.rbs +48 -24
  63. data/docs/collection.md +4 -0
  64. data/docs/syntax.md +55 -0
  65. data/ext/rbs_extension/constants.c +16 -2
  66. data/ext/rbs_extension/constants.h +8 -1
  67. data/ext/rbs_extension/extconf.rb +1 -1
  68. data/ext/rbs_extension/lexer.c +834 -777
  69. data/ext/rbs_extension/lexer.h +3 -1
  70. data/ext/rbs_extension/lexer.re +3 -1
  71. data/ext/rbs_extension/lexstate.c +4 -2
  72. data/ext/rbs_extension/parser.c +262 -43
  73. data/ext/rbs_extension/ruby_objs.c +56 -2
  74. data/ext/rbs_extension/ruby_objs.h +7 -1
  75. data/lib/rbs/annotate/rdoc_annotator.rb +1 -1
  76. data/lib/rbs/ast/declarations.rb +49 -2
  77. data/lib/rbs/ast/directives.rb +39 -0
  78. data/lib/rbs/cli.rb +38 -19
  79. data/lib/rbs/collection/cleaner.rb +8 -1
  80. data/lib/rbs/collection/config/lockfile.rb +3 -1
  81. data/lib/rbs/collection/config/lockfile_generator.rb +37 -30
  82. data/lib/rbs/collection/config.rb +3 -3
  83. data/lib/rbs/collection/sources/git.rb +10 -3
  84. data/lib/rbs/collection/sources/local.rb +79 -0
  85. data/lib/rbs/collection/sources.rb +8 -1
  86. data/lib/rbs/definition_builder/ancestor_builder.rb +24 -8
  87. data/lib/rbs/definition_builder.rb +8 -8
  88. data/lib/rbs/environment/use_map.rb +77 -0
  89. data/lib/rbs/environment.rb +358 -88
  90. data/lib/rbs/environment_loader.rb +12 -9
  91. data/lib/rbs/environment_walker.rb +1 -1
  92. data/lib/rbs/errors.rb +52 -37
  93. data/lib/rbs/locator.rb +27 -8
  94. data/lib/rbs/parser_aux.rb +8 -6
  95. data/lib/rbs/resolver/constant_resolver.rb +23 -7
  96. data/lib/rbs/resolver/type_name_resolver.rb +2 -1
  97. data/lib/rbs/sorter.rb +5 -5
  98. data/lib/rbs/test/setup.rb +1 -1
  99. data/lib/rbs/type_alias_dependency.rb +1 -1
  100. data/lib/rbs/type_alias_regularity.rb +3 -3
  101. data/lib/rbs/validator.rb +23 -2
  102. data/lib/rbs/variance_calculator.rb +2 -2
  103. data/lib/rbs/version.rb +1 -1
  104. data/lib/rbs/writer.rb +28 -2
  105. data/lib/rbs.rb +2 -2
  106. data/lib/rdoc_plugin/parser.rb +2 -2
  107. data/rbs.gemspec +1 -1
  108. data/sig/ancestor_graph.rbs +22 -2
  109. data/sig/collection/config/lockfile_generator.rbs +8 -10
  110. data/sig/collection/config.rbs +1 -1
  111. data/sig/collection/sources.rbs +44 -9
  112. data/sig/constant.rbs +1 -1
  113. data/sig/declarations.rbs +36 -3
  114. data/sig/definition.rbs +1 -1
  115. data/sig/definition_builder.rbs +0 -1
  116. data/sig/directives.rbs +61 -0
  117. data/sig/environment.rbs +150 -29
  118. data/sig/environment_loader.rbs +1 -1
  119. data/sig/errors.rbs +22 -1
  120. data/sig/locator.rbs +14 -2
  121. data/sig/parser.rbs +8 -15
  122. data/sig/resolver/constant_resolver.rbs +1 -2
  123. data/sig/shims/{abstract_syntax_tree.rbs → _abstract_syntax_tree.rbs} +0 -0
  124. data/sig/shims/bundler.rbs +18 -0
  125. data/sig/shims/rubygems.rbs +6 -0
  126. data/sig/use_map.rbs +35 -0
  127. data/sig/validator.rbs +12 -5
  128. data/sig/writer.rbs +4 -2
  129. data/stdlib/bigdecimal/0/big_decimal.rbs +16 -13
  130. data/stdlib/cgi/0/core.rbs +16 -0
  131. data/stdlib/coverage/0/coverage.rbs +50 -8
  132. data/stdlib/csv/0/csv.rbs +1 -1
  133. data/stdlib/date/0/date.rbs +856 -726
  134. data/stdlib/date/0/date_time.rbs +83 -210
  135. data/stdlib/erb/0/erb.rbs +13 -36
  136. data/stdlib/etc/0/etc.rbs +127 -20
  137. data/stdlib/fileutils/0/fileutils.rbs +1290 -381
  138. data/stdlib/logger/0/logger.rbs +466 -316
  139. data/stdlib/net-http/0/net-http.rbs +2211 -534
  140. data/stdlib/nkf/0/nkf.rbs +5 -5
  141. data/stdlib/objspace/0/objspace.rbs +31 -14
  142. data/stdlib/openssl/0/openssl.rbs +11 -7
  143. data/stdlib/optparse/0/optparse.rbs +20 -17
  144. data/stdlib/pathname/0/pathname.rbs +21 -4
  145. data/stdlib/pstore/0/pstore.rbs +378 -154
  146. data/stdlib/pty/0/pty.rbs +24 -8
  147. data/stdlib/ripper/0/ripper.rbs +1650 -0
  148. data/stdlib/socket/0/addrinfo.rbs +9 -15
  149. data/stdlib/socket/0/socket.rbs +36 -3
  150. data/stdlib/strscan/0/string_scanner.rbs +7 -5
  151. data/stdlib/tempfile/0/tempfile.rbs +104 -44
  152. data/stdlib/time/0/time.rbs +2 -2
  153. data/stdlib/uri/0/file.rbs +5 -0
  154. data/stdlib/uri/0/generic.rbs +2 -2
  155. data/stdlib/yaml/0/yaml.rbs +2 -2
  156. data/stdlib/zlib/0/zlib.rbs +1 -1
  157. metadata +13 -13
  158. data/core/deprecated.rbs +0 -9
  159. data/lib/rbs/constant_table.rb +0 -167
  160. data/lib/rbs/type_name_resolver.rb +0 -67
  161. data/sig/constant_table.rbs +0 -30
  162. data/sig/shims/ripper.rbs +0 -8
  163. data/sig/type_name_resolver.rbs +0 -26
  164. data/steep/Gemfile +0 -3
  165. data/steep/Gemfile.lock +0 -61
@@ -13,18 +13,18 @@ module RBS
13
13
  end
14
14
 
15
15
  attr_reader config: Config
16
- attr_reader gemfile_lock: Bundler::LockfileParser
17
16
 
18
17
  attr_reader lockfile: Lockfile
19
18
  attr_reader existing_lockfile: Lockfile?
20
19
 
21
- type gem_queue_entry = { name: String, version: String? }
20
+ attr_reader definition: Bundler::Definition
22
21
 
23
- @gem_queue: Array[gem_queue_entry]
22
+ # A hash table to look up a spec from name of the gem
23
+ attr_reader gem_hash: Hash[String, Bundler::LazySpecification]
24
24
 
25
- def self.generate: (config: Config, gemfile_lock_path: Pathname, ?with_lockfile: boolish) -> Lockfile
25
+ def self.generate: (config: Config, definition: Bundler::Definition, ?with_lockfile: boolish) -> Lockfile
26
26
 
27
- def initialize: (config: Config, gemfile_lock_path: Pathname, with_lockfile: boolish) -> void
27
+ def initialize: (config: Config, definition: Bundler::Definition, with_lockfile: boolish) -> void
28
28
 
29
29
  def generate: () -> void
30
30
 
@@ -34,14 +34,12 @@ module RBS
34
34
  #
35
35
  def validate_gemfile_lock_path!: (lock: Lockfile?, gemfile_lock_path: Pathname) -> void
36
36
 
37
- def assign_gem: (name: String, version: String?, ignored_gems: Set[String], src_data: Sources::source_entry?) -> void
37
+ # Inserts a entry to lockfile of a gem and its dependencies, if not included in `ignored_gems:`
38
+ #
39
+ def assign_gem: (name: String, version: String?, src_data: Sources::source_entry?, ignored_gems: Set[String]) -> void
38
40
 
39
41
  def assign_stdlib: (name: String, from_gem: String?) -> void
40
42
 
41
- def gemfile_lock_gems: () { (untyped) -> void } -> void
42
-
43
- def remove_ignored_gems!: () -> void
44
-
45
43
  # Find a source of a gem from ones registered in `config.sources`
46
44
  #
47
45
  # Returns `nil` if no source contains the definition of the gem.
@@ -23,7 +23,7 @@ module RBS
23
23
 
24
24
  def self.find_config_path: () -> Pathname?
25
25
 
26
- def self.generate_lockfile: (config_path: Pathname, gemfile_lock_path: Pathname, ?with_lockfile: boolish) -> [Config, Lockfile]
26
+ def self.generate_lockfile: (config_path: Pathname, definition: Bundler::Definition, ?with_lockfile: boolish) -> [Config, Lockfile]
27
27
 
28
28
  def self.from_path: (Pathname path) -> Config
29
29
 
@@ -1,8 +1,8 @@
1
1
  module RBS
2
2
  module Collection
3
3
  module Sources
4
- def self.from_config_entry: (Git::source_entry) -> Git
5
- | (source_entry) -> t
4
+ def self.from_config_entry: (Git::source_entry, base_directory: Pathname) -> Git
5
+ | (source_entry, base_directory: Pathname) -> t
6
6
 
7
7
  interface _Source
8
8
  def has?: (String name, String? version) -> boolish
@@ -13,11 +13,12 @@ module RBS
13
13
  def dependencies_of: (String name, String version) -> Array[manifest_dependency]?
14
14
  end
15
15
 
16
- type t = Git | Stdlib | Rubygems
16
+ type t = Git | Stdlib | Rubygems | Local
17
17
 
18
18
  type source_entry = Git::source_entry
19
19
  | Stdlib::source_entry
20
20
  | Rubygems::source_entry
21
+ | Local::source_entry
21
22
 
22
23
  type manifest_entry = {
23
24
  "dependencies" => Array[manifest_dependency]?,
@@ -78,28 +79,34 @@ module RBS
78
79
 
79
80
  def cp_r: (Pathname, Pathname) -> void
80
81
 
81
- # Ensure the git repository status is expected one
82
+ # Ensure the git repository exists, and
82
83
  #
83
- # * It exists, and
84
- # * The `HEAD` is the `revision`
84
+ # * When `revision` is a commit hash, the commit exists in the local repository, or
85
+ # * When `revision` is a branch name, the latest version is fetched from `origin`
86
+ #
87
+ # It may require a network connection to fetch or clone the repository from remote.
88
+ #
89
+ # * If `revision` is a commit hash and the commit doesn't exists in the local repository, it runs `git fetch`
90
+ # * If `revision` is a branch name, it runs `git fetch` once per instance
85
91
  #
86
92
  def setup!: [T] () { () -> T } -> T
87
93
  | () -> void
88
94
 
89
95
  def need_to_fetch?: (String revision) -> bool
90
96
 
97
+ # The full path of local git repository
91
98
  def git_dir: () -> Pathname
92
99
 
100
+ # The full path of `repo_dir` in the local git repository
93
101
  def gem_repo_dir: () -> Pathname
94
102
 
95
- def with_revision: [T] () { () -> T } -> T
96
-
97
103
  # Returns `true` if `revision` looks like a commit hash
98
- #
99
104
  def commit_hash?: () -> bool
100
105
 
106
+ # Executes a git command, raises an error if failed
101
107
  def git: (*String cmd, **untyped opt) -> String
102
108
 
109
+ # Executes a git command, returns `nil` if failed
103
110
  def git?: (*String cmd, **untyped opt) -> String?
104
111
 
105
112
  def sh!: (*String cmd, **untyped opt) -> String
@@ -120,6 +127,34 @@ module RBS
120
127
  def gems_versions: () -> Hash[String, Set[String]]
121
128
  end
122
129
 
130
+ class Local
131
+ include Base
132
+
133
+ type source_entry = {
134
+ 'type' => 'local',
135
+ 'path' => String,
136
+ }
137
+
138
+ attr_reader path: Pathname
139
+ attr_reader full_path: Pathname
140
+
141
+ def initialize: (path: String, base_directory: Pathname) -> void
142
+
143
+ def has?: (String name, String? version) -> boolish
144
+
145
+ def versions: (String name) -> Array[String]
146
+
147
+ def install: (dest: Pathname, name: String, version: String, stdout: CLI::_IO) -> void
148
+
149
+ def to_lockfile: () -> source_entry
150
+
151
+ def manifest_of: (String name, String version) -> manifest_entry?
152
+
153
+ private
154
+
155
+ def _install: (Pathname src, Pathname dest) -> void
156
+ end
157
+
123
158
  # signatures that are bundled in rbs gem under the stdlib/ directory
124
159
  class Stdlib
125
160
 
data/sig/constant.rbs CHANGED
@@ -2,7 +2,7 @@ module RBS
2
2
  class Constant
3
3
  type constant_entry = Environment::ClassEntry
4
4
  | Environment::ModuleEntry
5
- | Environment::SingleEntry[TypeName, AST::Declarations::Constant]
5
+ | Environment::ConstantEntry
6
6
 
7
7
  attr_reader name: TypeName
8
8
 
data/sig/declarations.rbs CHANGED
@@ -1,7 +1,7 @@
1
1
  module RBS
2
2
  module AST
3
3
  module Declarations
4
- type t = Class | Module | Interface | Constant | Global | Alias
4
+ type t = Class | Module | Interface | Constant | Global | TypeAlias | ClassAlias | ModuleAlias
5
5
 
6
6
  class Base
7
7
  end
@@ -135,7 +135,7 @@ module RBS
135
135
  include _ToJson
136
136
  end
137
137
 
138
- class Interface
138
+ class Interface < Base
139
139
  type member = Members::t
140
140
 
141
141
  # interface _Foo end
@@ -166,7 +166,7 @@ module RBS
166
166
  include _ToJson
167
167
  end
168
168
 
169
- class Alias < Base
169
+ class TypeAlias < Base
170
170
  # type loc[T] = Location[T, bot]
171
171
  # ^^^^ keyword
172
172
  # ^^^ name
@@ -223,6 +223,39 @@ module RBS
223
223
  include _HashEqual
224
224
  include _ToJson
225
225
  end
226
+
227
+ class AliasDecl < Base
228
+ # module Foo = Bar
229
+ # ^^^^^^ keyword
230
+ # ^^^ new_name
231
+ # ^ eq
232
+ # ^^^ old_name
233
+ #
234
+ # class Foo = Bar
235
+ # ^^^^^ keyword
236
+ #
237
+ type loc = Location[:keyword | :new_name | :eq | :old_name, bot]
238
+
239
+ attr_reader new_name: TypeName
240
+
241
+ attr_reader old_name: TypeName
242
+
243
+ attr_reader location: loc?
244
+
245
+ attr_reader comment: Comment?
246
+
247
+ def initialize: (new_name: TypeName, old_name: TypeName, location: loc?, comment: Comment?) -> void
248
+
249
+ include _HashEqual
250
+ end
251
+
252
+ class ClassAlias < AliasDecl
253
+ include _ToJson
254
+ end
255
+
256
+ class ModuleAlias < AliasDecl
257
+ include _ToJson
258
+ end
226
259
  end
227
260
  end
228
261
  end
data/sig/definition.rbs CHANGED
@@ -119,7 +119,7 @@ module RBS
119
119
  end
120
120
 
121
121
  type self_type = Types::ClassSingleton | Types::ClassInstance | Types::Interface
122
- type definition_entry = Environment::ModuleEntry | Environment::ClassEntry | Environment::SingleEntry[TypeName, AST::Declarations::Interface]
122
+ type definition_entry = Environment::ModuleEntry | Environment::ClassEntry | Environment::InterfaceEntry
123
123
 
124
124
  attr_reader type_name: TypeName
125
125
  attr_reader entry: definition_entry
@@ -5,7 +5,6 @@ module RBS
5
5
  #
6
6
  class DefinitionBuilder
7
7
  attr_reader env: Environment
8
- attr_reader type_name_resolver: TypeNameResolver
9
8
  attr_reader ancestor_builder: AncestorBuilder
10
9
  attr_reader method_builder: MethodBuilder
11
10
 
@@ -0,0 +1,61 @@
1
+ module RBS
2
+ module AST
3
+ module Directives
4
+ type t = Use
5
+
6
+ class Base
7
+ end
8
+
9
+ # ```
10
+ # use Foo, Foo::Bar as FBar, Foo:Baz::*
11
+ # ```
12
+ #
13
+ class Use < Base
14
+ type clause = SingleClause | WildcardClause
15
+
16
+ class SingleClause
17
+ # Foo::Bar
18
+ # ^^^^^^^^ type_name
19
+ #
20
+ # Foo::Bar as X
21
+ # ^^ keyword
22
+ # ^ new_name
23
+ #
24
+ type loc = Location[:type_name, :keyword | :new_name]
25
+
26
+ attr_reader type_name: TypeName
27
+
28
+ attr_reader new_name: Symbol?
29
+
30
+ attr_reader location: loc?
31
+
32
+ def initialize: (type_name: TypeName, new_name: Symbol?, location: loc?) -> void
33
+ end
34
+
35
+ class WildcardClause
36
+ # Foo::Bar::*
37
+ # ^^^^^^^^^^ namespace
38
+ # ^ star
39
+ #
40
+ type loc = Location[:namespace | :star, bot]
41
+
42
+ attr_reader namespace: Namespace
43
+
44
+ attr_reader location: loc?
45
+
46
+ def initialize: (namespace: Namespace, location: loc?) -> void
47
+ end
48
+
49
+ # use Foo
50
+ # ^^^ keyword
51
+ type loc = Location[:keyword, bot]
52
+
53
+ attr_reader clauses: Array[clause]
54
+
55
+ attr_reader location: loc?
56
+
57
+ def initialize: (clauses: Array[clause], location: loc?) -> void
58
+ end
59
+ end
60
+ end
61
+ end
data/sig/environment.rbs CHANGED
@@ -13,9 +13,11 @@ module RBS
13
13
  end
14
14
 
15
15
  module ContextUtil
16
- def calculate_context: (Array[_NamedDecl]) -> Array[Namespace]
16
+ def calculate_context: (Array[_NamedDecl]) -> Resolver::context
17
17
  end
18
18
 
19
+ # Name of object, it's (multiple) declarations with the outer module declarations
20
+ #
19
21
  class MultiEntry[M < _ModuleOrClass]
20
22
  class D[M < _ModuleOrClass]
21
23
  attr_reader decl: M
@@ -25,9 +27,9 @@ module RBS
25
27
 
26
28
  include ContextUtil
27
29
 
28
- @context: Array[Namespace]
30
+ @context: Resolver::context
29
31
 
30
- def context: () -> Array[Namespace]
32
+ def context: () -> Resolver::context
31
33
  end
32
34
 
33
35
  attr_reader name: TypeName
@@ -55,6 +57,8 @@ module RBS
55
57
  class ClassEntry < MultiEntry[AST::Declarations::Class]
56
58
  end
57
59
 
60
+ # Name of object, it's (single) declaration, and the outer module declarations
61
+ #
58
62
  class SingleEntry[N, D]
59
63
  attr_reader name: N
60
64
  attr_reader decl: D
@@ -64,36 +68,68 @@ module RBS
64
68
 
65
69
  include ContextUtil
66
70
 
67
- @context: Array[Namespace]
71
+ @context: Resolver::context
72
+
73
+ def context: () -> Resolver::context
74
+ end
75
+
76
+ class ModuleAliasEntry < SingleEntry[TypeName, AST::Declarations::ModuleAlias]
77
+ end
78
+
79
+ class ClassAliasEntry < SingleEntry[TypeName, AST::Declarations::ClassAlias]
80
+ end
81
+
82
+ class InterfaceEntry < SingleEntry[TypeName, AST::Declarations::Interface]
83
+ end
68
84
 
69
- def context: () -> Array[Namespace]
85
+ class TypeAliasEntry < SingleEntry[TypeName, AST::Declarations::TypeAlias]
70
86
  end
71
87
 
72
- # Top level declarations.
88
+ class ConstantEntry < SingleEntry[TypeName, AST::Declarations::Constant]
89
+ end
90
+
91
+ class GlobalEntry < SingleEntry[Symbol, AST::Declarations::Global]
92
+ end
93
+
94
+ # Top level declarations
73
95
  attr_reader declarations: Array[AST::Declarations::t]
74
96
 
97
+ # Class declarations
75
98
  attr_reader class_decls: Hash[TypeName, ModuleEntry | ClassEntry]
76
- attr_reader interface_decls: Hash[TypeName, SingleEntry[TypeName, AST::Declarations::Interface]]
77
- attr_reader alias_decls: Hash[TypeName, SingleEntry[TypeName, AST::Declarations::Alias]]
78
- attr_reader constant_decls: Hash[TypeName, SingleEntry[TypeName, AST::Declarations::Constant]]
79
- attr_reader global_decls: Hash[Symbol, SingleEntry[Symbol, AST::Declarations::Global]]
99
+
100
+ attr_reader class_alias_decls: Hash[TypeName, ModuleAliasEntry | ClassAliasEntry]
101
+
102
+ # Interface declarations
103
+ attr_reader interface_decls: Hash[TypeName, InterfaceEntry]
104
+
105
+ # Type alias declarations
106
+ attr_reader type_alias_decls: Hash[TypeName, TypeAliasEntry]
107
+
108
+ # Constant declarations
109
+ attr_reader constant_decls: Hash[TypeName, ConstantEntry]
110
+
111
+ # Global declarations
112
+ attr_reader global_decls: Hash[Symbol, GlobalEntry]
113
+
114
+ attr_reader buffer_directives: Hash[Buffer, Array[AST::Directives::t]]
80
115
 
81
116
  def initialize: () -> void
82
117
 
83
118
  def initialize_copy: (Environment) -> void
84
119
 
120
+ # Construct an environment from EnvironmentLoader
121
+ #
85
122
  def self.from_loader: (EnvironmentLoader) -> Environment
86
123
 
87
- def cache_name: [N, D] (Hash[N, SingleEntry[N, D]] cache, name: N, decl: D, outer: Array[module_decl]) -> SingleEntry[N, D]
88
-
89
- def insert_decl: (AST::Declarations::t, outer: Array[module_decl], namespace: Namespace) -> void
124
+ def add_signature: (buffer: Buffer, directives: Array[AST::Directives::t], decls: Array[AST::Declarations::t]) -> void
90
125
 
91
- # Insert a toplevel declaration into the env.
126
+ # Insert a toplevel declaration into the environment
92
127
  #
93
128
  def <<: (AST::Declarations::t decl) -> self
94
129
 
95
- # Runs generics type params validation over each class definitions.
96
- def validate_type_params: () -> void
130
+ # Insert a declaration into the environment
131
+ #
132
+ private def insert_decl: (AST::Declarations::t, outer: Array[module_decl], namespace: Namespace) -> void
97
133
 
98
134
  # Resolve all type names in the environment to absolute type names.
99
135
  # Relative type name will be left if absolute type name cannot be found.
@@ -103,29 +139,114 @@ module RBS
103
139
  #
104
140
  def resolve_type_names: (?only: Set[AST::Declarations::t]?) -> Environment
105
141
 
106
- def resolve_declaration: (TypeNameResolver resolver, AST::Declarations::t decl, outer: Array[module_decl], prefix: Namespace) -> AST::Declarations::t
142
+ def inspect: () -> String
107
143
 
108
- def resolve_member: (TypeNameResolver, AST::Members::t, context: Array[Namespace]) -> AST::Members::t
144
+ @buffers: Array[Buffer]
109
145
 
110
- def resolve_method_type: (TypeNameResolver, RBS::MethodType, context: Array[Namespace]) -> RBS::MethodType
146
+ def buffers: () -> Array[Buffer]
111
147
 
112
- def resolve_type_params: (TypeNameResolver resolver, Array[AST::TypeParam], context: Array[Namespace]) -> Array[AST::TypeParam]
148
+ def buffers_decls: () -> Hash[Buffer, Array[AST::Declarations::t]]
113
149
 
114
- def absolute_type: (TypeNameResolver, Types::t, context: Array[Namespace]) -> Types::t
150
+ # Remove declarations and directives that are loaded from `buffers`
151
+ #
152
+ def unload: (Set[Buffer] buffers) -> Environment
115
153
 
116
- def absolute_type_name: (TypeNameResolver, TypeName, context: Array[Namespace]) -> TypeName
154
+ # Returns true if an interface with the type name is defined
155
+ #
156
+ def interface_name?: (TypeName) -> bool
117
157
 
118
- def inspect: () -> String
158
+ # Returns true if a type alias with the type name is defined
159
+ #
160
+ def type_alias_name?: (TypeName) -> bool
119
161
 
120
- @buffers: Array[Buffer]
162
+ # Returns true if a module or class with the type name is defined
163
+ #
164
+ def module_name?: (TypeName) -> bool
121
165
 
122
- def buffers: () -> Array[Buffer]
166
+ # Returns true if the type name is defined
167
+ #
168
+ def type_name?: (TypeName) -> bool
123
169
 
124
- def buffers_decls: () -> Hash[Buffer, Array[AST::Declarations::t]]
170
+ # Returns if a constant of the name is defined
171
+ #
172
+ def constant_name?: (TypeName) -> bool
173
+
174
+ # Returns true if the type name is defined by constant declaration
175
+ #
176
+ def constant_decl?: (TypeName) -> bool
177
+
178
+ # Returns true if the type name is defined by class declaration
179
+ #
180
+ def class_decl?: (TypeName) -> bool
181
+
182
+ # Returns true if the type name is defined by module declaration
183
+ #
184
+ def module_decl?: (TypeName) -> bool
185
+
186
+ # Returns true if the type name is a module alias
187
+ #
188
+ def module_alias?: (TypeName) -> bool
189
+
190
+ # Returns true if the type name is a class alias
191
+ def class_alias?: (TypeName) -> bool
192
+
193
+ def class_entry: (TypeName) -> (ClassEntry | ClassAliasEntry | nil)
194
+
195
+ # Returns ClassEntry if the class definition is found, normalized in case of alias
196
+ #
197
+ def normalized_class_entry: (TypeName) -> ClassEntry?
198
+
199
+ def module_entry: (TypeName) -> (ModuleEntry | ModuleAliasEntry | nil)
200
+
201
+ # Returns ModuleEntry if the module definition is found, normalized in case of alias
202
+ #
203
+ def normalized_module_entry: (TypeName) -> ModuleEntry?
204
+
205
+ def constant_entry: (TypeName) -> (ClassEntry | ClassAliasEntry | ModuleEntry | ModuleAliasEntry | ConstantEntry | nil)
206
+
207
+ def module_class_entry: (TypeName) -> (ClassEntry | ClassAliasEntry | ModuleEntry | ModuleAliasEntry | nil)
125
208
 
126
- # Construct new environment without declarations tested `true` by block.
127
- # Construction of new environment is done with `<<` so that nested declarations will work well.
209
+ def normalized_module_class_entry: (TypeName) -> (ClassEntry | ModuleEntry | nil)
210
+
211
+ @normalize_module_name_cache: Hash[TypeName, TypeName | false | nil]
212
+
213
+ # Returns the original module name that is defined with `module` declaration
214
+ #
215
+ # * Calls `#absolute!` for relative module names
216
+ # * Returns `nil` if the rhs name cannot be found
217
+ # * Returns `false` if the name is cyclic
218
+ #
219
+ def normalize_module_name?: (TypeName) -> (TypeName | nil | false)
220
+
221
+ # Returns the original module name that is defined with `module` declaration
222
+ #
223
+ # * Raises an error if given type name is not module
224
+ # * Calls `#absolute!` for relative module names
225
+ # * Returns the name itself if the name cannot be normalized to a class/module
226
+ #
227
+ def normalize_module_name: (TypeName) -> TypeName
228
+
229
+ # Runs generics type params validation over each class definitions
230
+ def validate_type_params: () -> void
231
+
232
+ private
233
+
234
+ # Returns a context for inside given decls
128
235
  #
129
- def reject: () { (AST::Declarations::t) -> boolish } -> Environment
236
+ def resolver_context: (*module_decl) -> Resolver::context
237
+
238
+ def append_context: (Resolver::context, module_decl) -> Resolver::context
239
+
240
+ def resolve_declaration: (Resolver::TypeNameResolver resolver, UseMap map, AST::Declarations::t decl, outer: Array[module_decl], prefix: Namespace) -> AST::Declarations::t
241
+
242
+ def resolve_member: (Resolver::TypeNameResolver, UseMap map, AST::Members::t, context: Resolver::context) -> AST::Members::t
243
+
244
+ def resolve_method_type: (Resolver::TypeNameResolver, UseMap map, RBS::MethodType, context: Resolver::context) -> RBS::MethodType
245
+
246
+ def resolve_type_params: (Resolver::TypeNameResolver resolver, UseMap map, Array[AST::TypeParam], context: Resolver::context) -> Array[AST::TypeParam]
247
+
248
+ def absolute_type: (Resolver::TypeNameResolver, UseMap map, Types::t, context: Resolver::context) -> Types::t
249
+
250
+ def absolute_type_name: (Resolver::TypeNameResolver, UseMap map, TypeName, context: Resolver::context) -> TypeName
130
251
  end
131
252
  end
@@ -100,7 +100,7 @@ module RBS
100
100
  #
101
101
  def self.gem_sig_path: (String name, String? version) -> [Gem::Specification, Pathname]?
102
102
 
103
- def each_decl: () { (AST::Declarations::t, Buffer, source, Pathname) -> void } -> void
103
+ def each_signature: () { (source, Pathname, Buffer, Array[AST::Declarations::t], Array[AST::Directives::t]) -> void } -> void
104
104
 
105
105
  def each_dir: { (source, Pathname) -> void } -> void
106
106
 
data/sig/errors.rbs CHANGED
@@ -174,7 +174,7 @@ module RBS
174
174
  end
175
175
 
176
176
  # The *overloading* method definition cannot find *non-overloading* method definition
177
- #
177
+ #
178
178
  class InvalidOverloadMethodError < DefinitionError
179
179
  attr_reader type_name: TypeName
180
180
  attr_reader method_name: Symbol
@@ -280,4 +280,25 @@ module RBS
280
280
 
281
281
  def initialize: (type_name: TypeName, method_name: Symbol?, params: Array[AST::TypeParam], location: Location[untyped, untyped]?) -> void
282
282
  end
283
+
284
+ # A module/class alias declaration has inconsistent right-hand-side
285
+ #
286
+ # ```rbs
287
+ # module Foo = Object # Error
288
+ # class Bar = Kernel # Error
289
+ # ```
290
+ #
291
+ class InconsistentClassModuleAliasError < BaseError
292
+ attr_reader alias_entry: Environment::ModuleAliasEntry | Environment::ClassAliasEntry
293
+
294
+ def initialize: (Environment::ModuleAliasEntry | Environment::ClassAliasEntry) -> void
295
+ end
296
+
297
+ # A module/class alias declaration is cyclic
298
+ #
299
+ class CyclicClassAliasDefinitionError < BaseError
300
+ attr_reader alias_entry: Environment::ModuleAliasEntry | Environment::ClassAliasEntry
301
+
302
+ def initialize: (Environment::ModuleAliasEntry | Environment::ClassAliasEntry) -> void
303
+ end
283
304
  end
data/sig/locator.rbs CHANGED
@@ -10,14 +10,22 @@ module RBS
10
10
  | AST::TypeParam
11
11
  | AST::Declarations::Class::Super
12
12
  | AST::Declarations::Module::Self
13
+ | AST::Directives::t
14
+ | AST::Directives::Use::clause
15
+
16
+ # The buffer the location points to
17
+ #
18
+ attr_reader buffer: Buffer
13
19
 
14
20
  # Array of _top-level_ declarations.
15
21
  #
16
22
  attr_reader decls: Array[AST::Declarations::t]
17
23
 
18
- def initialize: (decls: Array[AST::Declarations::t]) -> void
24
+ # Array of directives.
25
+ #
26
+ attr_reader dirs: Array[AST::Directives::t]
19
27
 
20
- def buffer: () -> Buffer
28
+ def initialize: (buffer: Buffer, decls: Array[AST::Declarations::t], dirs: Array[AST::Directives::t]) -> void
21
29
 
22
30
  # Returns list of components.
23
31
  # Inner component comes first.
@@ -29,6 +37,10 @@ module RBS
29
37
  #
30
38
  def find2: (line: Integer, column: Integer) -> [Symbol?, Array[component]]?
31
39
 
40
+ private
41
+
42
+ def find_in_directive: (Integer pos, AST::Directives::t, Array[component]) -> bool
43
+
32
44
  def find_in_decl: (Integer pos, decl: AST::Declarations::t, array: Array[component]) -> bool
33
45
 
34
46
  def find_in_member: (Integer pos, member: AST::Members::t, array: Array[component]) -> bool