rbs 4.0.0.dev.4 → 4.0.0.dev.5

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 (223) hide show
  1. checksums.yaml +4 -4
  2. data/.github/dependabot.yml +14 -14
  3. data/.github/workflows/bundle-update.yml +60 -0
  4. data/.github/workflows/c-check.yml +11 -8
  5. data/.github/workflows/comments.yml +3 -3
  6. data/.github/workflows/dependabot.yml +1 -1
  7. data/.github/workflows/ruby.yml +17 -34
  8. data/.github/workflows/typecheck.yml +2 -2
  9. data/.github/workflows/valgrind.yml +42 -0
  10. data/.github/workflows/windows.yml +2 -2
  11. data/.rubocop.yml +1 -1
  12. data/README.md +1 -1
  13. data/Rakefile +32 -5
  14. data/config.yml +46 -0
  15. data/core/array.rbs +96 -46
  16. data/core/binding.rbs +0 -2
  17. data/core/builtin.rbs +2 -2
  18. data/core/comparable.rbs +13 -6
  19. data/core/complex.rbs +55 -41
  20. data/core/dir.rbs +4 -4
  21. data/core/encoding.rbs +7 -10
  22. data/core/enumerable.rbs +90 -3
  23. data/core/enumerator/arithmetic_sequence.rbs +70 -0
  24. data/core/enumerator.rbs +63 -1
  25. data/core/errno.rbs +8 -0
  26. data/core/errors.rbs +28 -1
  27. data/core/exception.rbs +2 -2
  28. data/core/fiber.rbs +40 -20
  29. data/core/file.rbs +108 -78
  30. data/core/file_test.rbs +1 -1
  31. data/core/float.rbs +225 -69
  32. data/core/gc.rbs +417 -281
  33. data/core/hash.rbs +1023 -727
  34. data/core/integer.rbs +104 -110
  35. data/core/io/buffer.rbs +21 -10
  36. data/core/io/wait.rbs +11 -33
  37. data/core/io.rbs +82 -19
  38. data/core/kernel.rbs +70 -59
  39. data/core/marshal.rbs +1 -1
  40. data/core/match_data.rbs +1 -1
  41. data/core/math.rbs +42 -3
  42. data/core/method.rbs +63 -27
  43. data/core/module.rbs +103 -26
  44. data/core/nil_class.rbs +3 -3
  45. data/core/numeric.rbs +43 -35
  46. data/core/object.rbs +3 -3
  47. data/core/object_space.rbs +21 -15
  48. data/core/pathname.rbs +1272 -0
  49. data/core/proc.rbs +30 -25
  50. data/core/process.rbs +4 -2
  51. data/core/ractor.rbs +361 -509
  52. data/core/random.rbs +17 -0
  53. data/core/range.rbs +113 -16
  54. data/core/rational.rbs +56 -85
  55. data/core/rbs/unnamed/argf.rbs +2 -2
  56. data/core/rbs/unnamed/env_class.rbs +1 -1
  57. data/core/rbs/unnamed/random.rbs +4 -113
  58. data/core/regexp.rbs +25 -20
  59. data/core/ruby.rbs +53 -0
  60. data/core/ruby_vm.rbs +6 -4
  61. data/core/rubygems/errors.rbs +3 -70
  62. data/core/rubygems/rubygems.rbs +11 -79
  63. data/core/rubygems/version.rbs +2 -3
  64. data/core/set.rbs +488 -359
  65. data/core/signal.rbs +24 -14
  66. data/core/string.rbs +3171 -1241
  67. data/core/struct.rbs +1 -1
  68. data/core/symbol.rbs +17 -11
  69. data/core/thread.rbs +95 -33
  70. data/core/time.rbs +35 -9
  71. data/core/trace_point.rbs +7 -4
  72. data/core/unbound_method.rbs +14 -6
  73. data/docs/aliases.md +79 -0
  74. data/docs/collection.md +2 -2
  75. data/docs/encoding.md +56 -0
  76. data/docs/gem.md +0 -1
  77. data/docs/inline.md +470 -0
  78. data/docs/sigs.md +3 -3
  79. data/docs/syntax.md +33 -4
  80. data/docs/type_fingerprint.md +21 -0
  81. data/exe/rbs +1 -1
  82. data/ext/rbs_extension/ast_translation.c +77 -3
  83. data/ext/rbs_extension/ast_translation.h +3 -0
  84. data/ext/rbs_extension/class_constants.c +8 -2
  85. data/ext/rbs_extension/class_constants.h +4 -0
  86. data/ext/rbs_extension/extconf.rb +5 -1
  87. data/ext/rbs_extension/legacy_location.c +5 -5
  88. data/ext/rbs_extension/main.c +37 -20
  89. data/include/rbs/ast.h +85 -38
  90. data/include/rbs/defines.h +27 -0
  91. data/include/rbs/lexer.h +30 -11
  92. data/include/rbs/parser.h +6 -6
  93. data/include/rbs/string.h +0 -2
  94. data/include/rbs/util/rbs_allocator.h +34 -13
  95. data/include/rbs/util/rbs_assert.h +12 -1
  96. data/include/rbs/util/rbs_encoding.h +2 -0
  97. data/include/rbs/util/rbs_unescape.h +2 -1
  98. data/lib/rbs/ast/annotation.rb +1 -1
  99. data/lib/rbs/ast/comment.rb +1 -1
  100. data/lib/rbs/ast/declarations.rb +10 -10
  101. data/lib/rbs/ast/members.rb +14 -14
  102. data/lib/rbs/ast/ruby/annotations.rb +137 -0
  103. data/lib/rbs/ast/ruby/comment_block.rb +24 -0
  104. data/lib/rbs/ast/ruby/declarations.rb +198 -3
  105. data/lib/rbs/ast/ruby/helpers/constant_helper.rb +4 -0
  106. data/lib/rbs/ast/ruby/members.rb +159 -1
  107. data/lib/rbs/ast/type_param.rb +24 -4
  108. data/lib/rbs/buffer.rb +20 -15
  109. data/lib/rbs/cli/diff.rb +16 -15
  110. data/lib/rbs/cli/validate.rb +38 -51
  111. data/lib/rbs/cli.rb +52 -19
  112. data/lib/rbs/collection/config/lockfile_generator.rb +8 -0
  113. data/lib/rbs/collection/sources/git.rb +1 -0
  114. data/lib/rbs/definition.rb +1 -1
  115. data/lib/rbs/definition_builder/ancestor_builder.rb +62 -9
  116. data/lib/rbs/definition_builder/method_builder.rb +20 -0
  117. data/lib/rbs/definition_builder.rb +91 -2
  118. data/lib/rbs/diff.rb +7 -1
  119. data/lib/rbs/environment.rb +227 -74
  120. data/lib/rbs/environment_loader.rb +0 -6
  121. data/lib/rbs/errors.rb +27 -7
  122. data/lib/rbs/inline_parser.rb +341 -5
  123. data/lib/rbs/location_aux.rb +1 -1
  124. data/lib/rbs/locator.rb +5 -1
  125. data/lib/rbs/method_type.rb +5 -3
  126. data/lib/rbs/parser_aux.rb +2 -2
  127. data/lib/rbs/prototype/rb.rb +2 -2
  128. data/lib/rbs/prototype/rbi.rb +2 -0
  129. data/lib/rbs/prototype/runtime.rb +8 -0
  130. data/lib/rbs/resolver/constant_resolver.rb +2 -2
  131. data/lib/rbs/resolver/type_name_resolver.rb +116 -38
  132. data/lib/rbs/subtractor.rb +3 -1
  133. data/lib/rbs/test/type_check.rb +16 -2
  134. data/lib/rbs/type_name.rb +1 -1
  135. data/lib/rbs/types.rb +27 -27
  136. data/lib/rbs/validator.rb +2 -2
  137. data/lib/rbs/version.rb +1 -1
  138. data/lib/rbs.rb +1 -1
  139. data/lib/rdoc/discover.rb +1 -1
  140. data/lib/rdoc_plugin/parser.rb +1 -1
  141. data/rbs.gemspec +3 -2
  142. data/schema/typeParam.json +17 -1
  143. data/sig/ast/ruby/annotations.rbs +124 -0
  144. data/sig/ast/ruby/comment_block.rbs +8 -0
  145. data/sig/ast/ruby/declarations.rbs +102 -4
  146. data/sig/ast/ruby/members.rbs +87 -1
  147. data/sig/cli/diff.rbs +5 -11
  148. data/sig/cli/validate.rbs +13 -4
  149. data/sig/cli.rbs +18 -18
  150. data/sig/definition.rbs +6 -1
  151. data/sig/environment.rbs +70 -12
  152. data/sig/errors.rbs +13 -6
  153. data/sig/inline_parser.rbs +39 -2
  154. data/sig/locator.rbs +0 -2
  155. data/sig/manifest.yaml +0 -1
  156. data/sig/method_builder.rbs +3 -1
  157. data/sig/method_types.rbs +1 -1
  158. data/sig/parser.rbs +16 -2
  159. data/sig/resolver/type_name_resolver.rbs +35 -7
  160. data/sig/source.rbs +3 -3
  161. data/sig/type_param.rbs +13 -8
  162. data/sig/types.rbs +4 -4
  163. data/src/ast.c +80 -1
  164. data/src/lexer.c +1392 -1313
  165. data/src/lexer.re +3 -0
  166. data/src/lexstate.c +58 -37
  167. data/src/location.c +4 -4
  168. data/src/parser.c +412 -145
  169. data/src/string.c +0 -48
  170. data/src/util/rbs_allocator.c +89 -71
  171. data/src/util/rbs_assert.c +1 -1
  172. data/src/util/rbs_buffer.c +2 -2
  173. data/src/util/rbs_constant_pool.c +10 -10
  174. data/src/util/rbs_encoding.c +4 -8
  175. data/src/util/rbs_unescape.c +56 -20
  176. data/stdlib/bigdecimal/0/big_decimal.rbs +100 -82
  177. data/stdlib/bigdecimal-math/0/big_math.rbs +169 -8
  178. data/stdlib/cgi/0/core.rbs +9 -393
  179. data/stdlib/cgi/0/manifest.yaml +1 -0
  180. data/stdlib/cgi-escape/0/escape.rbs +171 -0
  181. data/stdlib/coverage/0/coverage.rbs +3 -1
  182. data/stdlib/date/0/date.rbs +67 -59
  183. data/stdlib/date/0/date_time.rbs +1 -1
  184. data/stdlib/delegate/0/delegator.rbs +10 -7
  185. data/stdlib/digest/0/digest.rbs +110 -0
  186. data/stdlib/erb/0/erb.rbs +737 -347
  187. data/stdlib/fileutils/0/fileutils.rbs +20 -14
  188. data/stdlib/forwardable/0/forwardable.rbs +3 -0
  189. data/stdlib/json/0/json.rbs +82 -28
  190. data/stdlib/net-http/0/net-http.rbs +3 -0
  191. data/stdlib/objspace/0/objspace.rbs +9 -27
  192. data/stdlib/open-uri/0/open-uri.rbs +40 -0
  193. data/stdlib/open3/0/open3.rbs +459 -1
  194. data/stdlib/openssl/0/openssl.rbs +331 -228
  195. data/stdlib/optparse/0/optparse.rbs +8 -3
  196. data/stdlib/pathname/0/pathname.rbs +9 -1379
  197. data/stdlib/psych/0/psych.rbs +4 -4
  198. data/stdlib/random-formatter/0/random-formatter.rbs +277 -0
  199. data/stdlib/rdoc/0/code_object.rbs +2 -1
  200. data/stdlib/rdoc/0/parser.rbs +1 -1
  201. data/stdlib/rdoc/0/rdoc.rbs +1 -1
  202. data/stdlib/rdoc/0/store.rbs +1 -1
  203. data/stdlib/resolv/0/resolv.rbs +25 -68
  204. data/stdlib/ripper/0/ripper.rbs +2 -2
  205. data/stdlib/securerandom/0/manifest.yaml +2 -0
  206. data/stdlib/securerandom/0/securerandom.rbs +6 -19
  207. data/stdlib/singleton/0/singleton.rbs +3 -0
  208. data/stdlib/socket/0/socket.rbs +13 -1
  209. data/stdlib/socket/0/tcp_socket.rbs +10 -2
  210. data/stdlib/stringio/0/stringio.rbs +1176 -85
  211. data/stdlib/strscan/0/string_scanner.rbs +31 -31
  212. data/stdlib/tempfile/0/tempfile.rbs +3 -3
  213. data/stdlib/time/0/time.rbs +1 -1
  214. data/stdlib/timeout/0/timeout.rbs +63 -7
  215. data/stdlib/tsort/0/cyclic.rbs +3 -0
  216. data/stdlib/uri/0/common.rbs +16 -2
  217. data/stdlib/uri/0/file.rbs +1 -1
  218. data/stdlib/uri/0/generic.rbs +24 -16
  219. data/stdlib/uri/0/rfc2396_parser.rbs +6 -7
  220. data/stdlib/zlib/0/gzip_reader.rbs +2 -2
  221. data/stdlib/zlib/0/gzip_writer.rbs +1 -1
  222. data/stdlib/zlib/0/zstream.rbs +1 -0
  223. metadata +30 -4
@@ -149,6 +149,8 @@ module RBS
149
149
  member: member,
150
150
  accessibility: :public
151
151
  )
152
+ when AST::Ruby::Members::AttrReaderMember, AST::Ruby::Members::AttrWriterMember, AST::Ruby::Members::AttrAccessorMember
153
+ build_ruby_attribute(methods, type, member: member, accessibility: :public)
152
154
  end
153
155
  end
154
156
  end
@@ -227,6 +229,24 @@ module RBS
227
229
  end
228
230
  end
229
231
 
232
+ def build_ruby_attribute(methods, type, member:, accessibility:)
233
+ member.names.each do |name|
234
+ if member.is_a?(AST::Ruby::Members::AttrReaderMember) || member.is_a?(AST::Ruby::Members::AttrAccessorMember)
235
+ defn = methods.methods[name] ||= Methods::Definition.empty(type: type, name: name)
236
+
237
+ defn.accessibilities << accessibility
238
+ defn.originals << member
239
+ end
240
+
241
+ if member.is_a?(AST::Ruby::Members::AttrWriterMember) || member.is_a?(AST::Ruby::Members::AttrAccessorMember)
242
+ defn = methods.methods[:"#{name}="] ||= Methods::Definition.empty(type: type, name: :"#{name}=")
243
+
244
+ defn.accessibilities << accessibility
245
+ defn.originals << member
246
+ end
247
+ end
248
+ end
249
+
230
250
  def build_method(methods, type, member:, accessibility:)
231
251
  defn = methods.methods[member.name] ||= Methods::Definition.empty(type: type, name: member.name)
232
252
 
@@ -151,6 +151,29 @@ module RBS
151
151
  end
152
152
  end
153
153
 
154
+ when AST::Ruby::Members::AttrReaderMember, AST::Ruby::Members::AttrWriterMember, AST::Ruby::Members::AttrAccessorMember
155
+ member.names.each do |name|
156
+ ivar_name = :"@#{name}"
157
+ attr_type = member.type || Types::Bases::Any.new(location: nil)
158
+
159
+ insert_variable(
160
+ type_name,
161
+ definition.instance_variables,
162
+ name: ivar_name,
163
+ type: attr_type,
164
+ source: member
165
+ )
166
+ end
167
+
168
+ when AST::Ruby::Members::InstanceVariableMember
169
+ insert_variable(
170
+ type_name,
171
+ definition.instance_variables,
172
+ name: member.name,
173
+ type: member.type,
174
+ source: member
175
+ )
176
+
154
177
  when AST::Members::InstanceVariable
155
178
  insert_variable(
156
179
  type_name,
@@ -551,6 +574,7 @@ module RBS
551
574
  declared_in: type_name,
552
575
  source: source
553
576
  )
577
+
554
578
  validate_variable(variables[name])
555
579
  end
556
580
 
@@ -561,7 +585,15 @@ module RBS
561
585
  variables = [] #: Array[Definition::Variable]
562
586
  tmp_var = var
563
587
  while tmp_var
564
- variables << tmp_var if tmp_var.source.is_a?(AST::Members::Var)
588
+ case tmp_var.source
589
+ when AST::Members::AttrReader, AST::Members::AttrWriter, AST::Members::AttrAccessor
590
+ # nop
591
+ when AST::Ruby::Members::AttrReaderMember, AST::Ruby::Members::AttrWriterMember, AST::Ruby::Members::AttrAccessorMember
592
+ # nop
593
+ else
594
+ variables << tmp_var
595
+ end
596
+
565
597
  tmp_var = tmp_var.parent_variable
566
598
  end
567
599
 
@@ -579,6 +611,10 @@ module RBS
579
611
  if r.source.instance_of?(AST::Members::ClassInstanceVariable) && l.declared_in == r.declared_in
580
612
  raise ClassInstanceVariableDuplicationError.new(type_name: l.declared_in, variable_name: l.source.name, location: l.source.location)
581
613
  end
614
+ when AST::Ruby::Members::InstanceVariableMember
615
+ if l.declared_in == r.declared_in
616
+ raise InstanceVariableDuplicationError.new(type_name: l.declared_in, variable_name: l.source.name, location: l.source.location)
617
+ end
582
618
  end
583
619
  end
584
620
 
@@ -606,7 +642,7 @@ module RBS
606
642
 
607
643
  methods.each do |method|
608
644
  if interface_method_duplicates.include?(method.name)
609
- member.is_a?(AST::Members::Include) || member.is_a?(AST::Members::Extend) or raise
645
+ (member.is_a?(AST::Members::Include) || member.is_a?(AST::Members::Extend)) or raise
610
646
 
611
647
  raise DuplicatedInterfaceMethodDefinitionError.new(
612
648
  type: definition.self_type,
@@ -766,6 +802,59 @@ module RBS
766
802
  )
767
803
 
768
804
  method_definition.annotations.replace(original.annotations)
805
+ when AST::Ruby::Members::AttrReaderMember, AST::Ruby::Members::AttrWriterMember, AST::Ruby::Members::AttrAccessorMember
806
+ if duplicated_method = methods[method.name]
807
+ raise DuplicatedMethodDefinitionError.new(
808
+ type: definition.self_type,
809
+ method_name: method.name,
810
+ members: [*duplicated_method.members, original]
811
+ )
812
+ end
813
+
814
+ attr_type = original.type || Types::Bases::Any.new(location: nil)
815
+ method_type =
816
+ if method.name.to_s.end_with?("=")
817
+ # setter
818
+ MethodType.new(
819
+ type_params: [],
820
+ type: Types::Function.empty(attr_type).update(
821
+ required_positionals: [
822
+ Types::Function::Param.new(type: attr_type, name: method.name.to_s.chomp("=").to_sym)
823
+ ]
824
+ ),
825
+ block: nil,
826
+ location: original.location
827
+ )
828
+ else
829
+ # getter
830
+ MethodType.new(
831
+ type_params: [],
832
+ type: Types::Function.empty(attr_type),
833
+ block: nil,
834
+ location: original.location
835
+ )
836
+ end
837
+
838
+ if implemented_in
839
+ super_method = existing_method
840
+ end
841
+
842
+ method_definition = Definition::Method.new(
843
+ super_method: super_method,
844
+ defs: [
845
+ Definition::Method::TypeDef.new(
846
+ type: method_type,
847
+ member: original,
848
+ defined_in: defined_in,
849
+ implemented_in: implemented_in
850
+ )
851
+ ],
852
+ accessibility: method.accessibility,
853
+ alias_of: nil,
854
+ alias_member: nil
855
+ )
856
+
857
+ method_definition.annotations.replace([])
769
858
  when AST::Ruby::Members::DefMember
770
859
  if duplicated_method = methods[method.name]
771
860
  raise DuplicatedMethodDefinitionError.new(
data/lib/rbs/diff.rb CHANGED
@@ -104,7 +104,13 @@ module RBS
104
104
  detail_to_s = @detail ? "[#{definition_method.defined_in} #{definition_method.accessibility}] " : ""
105
105
  if definition_method.alias_of
106
106
  first_def = definition_method.alias_of.defs.first #: Definition::Method::TypeDef
107
- "#{detail_to_s}alias #{prefix}#{key} #{prefix}#{first_def.member.name}"
107
+ member_name = case first_def.member
108
+ when AST::Members::Base
109
+ first_def.member.name
110
+ else
111
+ raise
112
+ end
113
+ "#{detail_to_s}alias #{prefix}#{key} #{prefix}#{member_name}"
108
114
  else
109
115
  "#{detail_to_s}def #{prefix}#{key}: #{definition_method.method_types.join(" | ")}"
110
116
  end
@@ -122,21 +122,17 @@ module RBS
122
122
  end
123
123
  end
124
124
 
125
- def class_entry(type_name)
126
- case
127
- when (class_entry = class_decls[type_name]).is_a?(ClassEntry)
128
- class_entry
129
- when (class_alias = class_alias_decls[type_name]).is_a?(ClassAliasEntry)
130
- class_alias
125
+ def class_entry(type_name, normalized: false)
126
+ case entry = constant_entry(type_name, normalized: normalized || false)
127
+ when ClassEntry, ClassAliasEntry
128
+ entry
131
129
  end
132
130
  end
133
131
 
134
- def module_entry(type_name)
135
- case
136
- when (module_entry = class_decls[type_name]).is_a?(ModuleEntry)
137
- module_entry
138
- when (module_alias = class_alias_decls[type_name]).is_a?(ModuleAliasEntry)
139
- module_alias
132
+ def module_entry(type_name, normalized: false)
133
+ case entry = constant_entry(type_name, normalized: normalized || false)
134
+ when ModuleEntry, ModuleAliasEntry
135
+ entry
140
136
  end
141
137
  end
142
138
 
@@ -152,26 +148,40 @@ module RBS
152
148
  end
153
149
 
154
150
  def normalized_module_entry(type_name)
155
- if name = normalize_module_name?(type_name)
156
- case entry = module_entry(name)
157
- when ModuleEntry, nil
158
- entry
159
- when ModuleAliasEntry
160
- raise
161
- end
162
- end
151
+ module_entry(type_name, normalized: true)
163
152
  end
164
153
 
165
- def module_class_entry(type_name)
166
- class_entry(type_name) || module_entry(type_name)
154
+ def module_class_entry(type_name, normalized: false)
155
+ entry = constant_entry(type_name, normalized: normalized || false)
156
+ if entry.is_a?(ConstantEntry)
157
+ nil
158
+ else
159
+ entry
160
+ end
167
161
  end
168
162
 
169
163
  def normalized_module_class_entry(type_name)
170
- normalized_class_entry(type_name) || normalized_module_entry(type_name)
164
+ module_class_entry(type_name, normalized: true)
171
165
  end
172
166
 
173
- def constant_entry(type_name)
174
- class_entry(type_name) || module_entry(type_name) || constant_decls[type_name]
167
+ def constant_entry(type_name, normalized: false)
168
+ if normalized
169
+ if normalized_name = normalize_module_name?(type_name)
170
+ class_decls.fetch(normalized_name, nil)
171
+ else
172
+ # The type_name may be declared with constant declaration
173
+ unless type_name.namespace.empty?
174
+ parent = type_name.namespace.to_type_name
175
+ normalized_parent = normalize_module_name?(parent) or return
176
+ constant_name = TypeName.new(name: type_name.name, namespace: normalized_parent.to_namespace)
177
+ constant_decls.fetch(constant_name, nil)
178
+ end
179
+ end
180
+ else
181
+ class_decls.fetch(type_name, nil) ||
182
+ class_alias_decls.fetch(type_name, nil) ||
183
+ constant_decls.fetch(type_name, nil)
184
+ end
175
185
  end
176
186
 
177
187
  def normalize_type_name?(name)
@@ -206,6 +216,10 @@ module RBS
206
216
  end
207
217
  end
208
218
 
219
+ def normalize_type_name(name)
220
+ normalize_type_name?(name) || name
221
+ end
222
+
209
223
  def normalized_type_name?(type_name)
210
224
  case
211
225
  when type_name.interface?
@@ -220,53 +234,44 @@ module RBS
220
234
  end
221
235
 
222
236
  def normalized_type_name!(name)
223
- normalized_type_name?(name) or raise "Normalized type name is expected but given `#{name}`, which is normalized to `#{normalize_type_name?(name)}`"
237
+ normalized_type_name?(name) or raise "Normalized type name is expected but given `#{name}`"
224
238
  name
225
239
  end
226
240
 
227
- def normalize_type_name(name)
228
- normalize_type_name?(name) || name
229
- end
230
-
231
- def normalize_module_name(name)
232
- normalize_module_name?(name) or name
233
- end
234
-
235
241
  def normalize_module_name?(name)
236
242
  raise "Class/module name is expected: #{name}" unless name.class?
237
243
  name = name.absolute! unless name.absolute?
238
244
 
239
- if @normalize_module_name_cache.key?(name)
240
- return @normalize_module_name_cache[name]
245
+ original_name = name
246
+
247
+ if @normalize_module_name_cache.key?(original_name)
248
+ return @normalize_module_name_cache[original_name]
241
249
  end
242
250
 
243
- unless name.namespace.empty?
244
- parent = name.namespace.to_type_name
245
- if normalized_parent = normalize_module_name?(parent)
246
- type_name = TypeName.new(namespace: normalized_parent.to_namespace, name: name.name)
247
- else
248
- @normalize_module_name_cache[name] = nil
249
- return
251
+ if alias_entry = class_alias_decls.fetch(name, nil)
252
+ unless alias_entry.decl.old_name.absolute?
253
+ # Having relative old_name means the type name resolution was failed.
254
+ # Run TypeNameResolver for failure reason
255
+ resolver = Resolver::TypeNameResolver.build(self)
256
+ name = resolver.resolve_namespace(name, context: nil)
257
+ @normalize_module_name_cache[original_name] = name
258
+ return name
250
259
  end
251
- else
252
- type_name = name
253
- end
254
260
 
255
- @normalize_module_name_cache[name] = false
261
+ name = alias_entry.decl.old_name
262
+ end
256
263
 
257
- entry = constant_entry(type_name)
264
+ if class_decls.key?(name)
265
+ @normalize_module_name_cache[original_name] = name
266
+ end
267
+ end
258
268
 
259
- normalized_type_name =
260
- case entry
261
- when ClassEntry, ModuleEntry
262
- type_name
263
- when ClassAliasEntry, ModuleAliasEntry
264
- normalize_module_name?(entry.decl.old_name)
265
- else
266
- nil
267
- end
269
+ def normalize_module_name(name)
270
+ normalize_module_name?(name) || name
271
+ end
268
272
 
269
- @normalize_module_name_cache[name] = normalized_type_name
273
+ def normalize_module_name!(name)
274
+ normalize_module_name?(name) or raise "Module name `#{name}` cannot be normalized"
270
275
  end
271
276
 
272
277
  def insert_rbs_decl(decl, context:, namespace:)
@@ -378,11 +383,10 @@ module RBS
378
383
  if entry.is_a?(ModuleEntry)
379
384
  raise DuplicatedDeclarationError.new(name, decl, *entry.each_decl.to_a)
380
385
  end
386
+ else
387
+ entry = class_decls[name] = ClassEntry.new(name)
381
388
  end
382
389
 
383
- entry = ClassEntry.new(name)
384
- class_decls[name] = entry
385
-
386
390
  entry << [context, decl]
387
391
 
388
392
  inner_context = [context, name] #: Resolver::context
@@ -400,17 +404,51 @@ module RBS
400
404
  if entry.is_a?(ClassEntry)
401
405
  raise DuplicatedDeclarationError.new(name, decl, *entry.each_decl.to_a)
402
406
  end
407
+ else
408
+ entry = class_decls[name] = ModuleEntry.new(name)
403
409
  end
404
410
 
405
- entry = ModuleEntry.new(name)
406
- class_decls[name] = entry
407
-
408
411
  entry << [context, decl]
409
412
 
410
413
  inner_context = [context, name] #: Resolver::context
411
414
  decl.each_decl do |member|
412
415
  insert_ruby_decl(member, context: inner_context, namespace: name.to_namespace)
413
416
  end
417
+
418
+ when AST::Ruby::Declarations::ConstantDecl
419
+ name = decl.constant_name.with_prefix(namespace)
420
+
421
+ if entry = constant_entry(name)
422
+ case entry
423
+ when ClassAliasEntry, ModuleAliasEntry, ConstantEntry
424
+ raise DuplicatedDeclarationError.new(name, decl, entry.decl)
425
+ when ClassEntry, ModuleEntry
426
+ raise DuplicatedDeclarationError.new(name, decl, *entry.each_decl.to_a)
427
+ end
428
+ end
429
+
430
+ constant_decls[name] = ConstantEntry.new(name: name, decl: decl, context: context)
431
+
432
+ when AST::Ruby::Declarations::ClassModuleAliasDecl
433
+ name = decl.new_name.with_prefix(namespace)
434
+
435
+ if entry = constant_entry(name)
436
+ case entry
437
+ when ClassAliasEntry, ModuleAliasEntry, ConstantEntry
438
+ raise DuplicatedDeclarationError.new(name, decl, entry.decl)
439
+ when ClassEntry, ModuleEntry
440
+ raise DuplicatedDeclarationError.new(name, decl, *entry.each_decl.to_a)
441
+ end
442
+ end
443
+
444
+ case decl.annotation
445
+ when AST::Ruby::Annotations::ClassAliasAnnotation
446
+ class_alias_decls[name] = ClassAliasEntry.new(name: name, decl: decl, context: context)
447
+ when AST::Ruby::Annotations::ModuleAliasAnnotation
448
+ class_alias_decls[name] = ModuleAliasEntry.new(name: name, decl: decl, context: context)
449
+ end
450
+ else
451
+ raise "Unknown Ruby declaration type: #{decl.class}"
414
452
  end
415
453
  end
416
454
 
@@ -482,7 +520,7 @@ module RBS
482
520
  end
483
521
 
484
522
  def resolve_type_names(only: nil)
485
- resolver = Resolver::TypeNameResolver.new(self)
523
+ resolver = Resolver::TypeNameResolver.build(self)
486
524
  env = Environment.new
487
525
 
488
526
  table = UseMap::Table.new()
@@ -495,7 +533,7 @@ module RBS
495
533
  each_rbs_source do |source|
496
534
  resolve = source.directives.find { _1.is_a?(AST::Directives::ResolveTypeNames) } #: AST::Directives::ResolveTypeNames?
497
535
  if !resolve || resolve.value
498
- _, decls = resolve_signature(resolver, table, source.directives, source.declarations)
536
+ _, decls = resolve_signature(resolver, table, source.directives, source.declarations, only: only)
499
537
  else
500
538
  decls = source.declarations
501
539
  end
@@ -504,7 +542,15 @@ module RBS
504
542
 
505
543
  each_ruby_source do |source|
506
544
  decls = source.declarations.map do |decl|
507
- resolve_ruby_decl(resolver, decl, context: nil, prefix: Namespace.root)
545
+ if only
546
+ if only.include?(decl)
547
+ resolve_ruby_decl(resolver, decl, context: nil, prefix: Namespace.root)
548
+ else
549
+ decl
550
+ end
551
+ else
552
+ resolve_ruby_decl(resolver, decl, context: nil, prefix: Namespace.root)
553
+ end
508
554
  end
509
555
 
510
556
  env.add_source(Source::Ruby.new(source.buffer, source.prism_result, decls, source.diagnostics))
@@ -671,7 +717,16 @@ module RBS
671
717
  inner_context = [context, full_name] #: Resolver::context
672
718
  inner_prefix = full_name.to_namespace
673
719
 
674
- AST::Ruby::Declarations::ClassDecl.new(decl.buffer, full_name, decl.node).tap do |resolved|
720
+ super_class = decl.super_class&.yield_self do |super_class|
721
+ AST::Ruby::Declarations::ClassDecl::SuperClass.new(
722
+ super_class.type_name_location,
723
+ super_class.operator_location,
724
+ absolute_type_name(resolver, nil, super_class.name, context: context),
725
+ super_class.type_annotation&.map_type_name {|name, _, _| absolute_type_name(resolver, nil, name, context: context) }
726
+ )
727
+ end
728
+
729
+ AST::Ruby::Declarations::ClassDecl.new(decl.buffer, full_name, decl.node, super_class).tap do |resolved|
675
730
  decl.members.each do |member|
676
731
  case member
677
732
  when AST::Ruby::Declarations::Base
@@ -694,12 +749,39 @@ module RBS
694
749
  case member
695
750
  when AST::Ruby::Declarations::Base
696
751
  resolved.members << resolve_ruby_decl(resolver, member, context: inner_context, prefix: inner_prefix)
752
+ when AST::Ruby::Members::Base
753
+ resolved.members << resolve_ruby_member(resolver, member, context: inner_context)
697
754
  else
698
755
  raise "Unknown member type: #{member.class}"
699
756
  end
700
757
  end
701
758
  end
702
759
 
760
+ when AST::Ruby::Declarations::ConstantDecl
761
+ full_name = decl.constant_name.with_prefix(prefix)
762
+
763
+ AST::Ruby::Declarations::ConstantDecl.new(
764
+ decl.buffer,
765
+ full_name,
766
+ decl.node,
767
+ decl.leading_comment,
768
+ decl.type_annotation&.map_type_name {|name, _, _| absolute_type_name(resolver, nil, name, context: context) }
769
+ )
770
+
771
+ when AST::Ruby::Declarations::ClassModuleAliasDecl
772
+ full_name = decl.new_name.with_prefix(prefix)
773
+ resolved_annotation = decl.annotation.map_type_name {|name, _, _| absolute_type_name(resolver, nil, name, context: context) }
774
+ resolved_infered_name = decl.infered_old_name&.yield_self {|name| absolute_type_name(resolver, nil, name, context: context) }
775
+
776
+ AST::Ruby::Declarations::ClassModuleAliasDecl.new(
777
+ decl.buffer,
778
+ decl.node,
779
+ full_name,
780
+ resolved_infered_name,
781
+ decl.leading_comment,
782
+ resolved_annotation
783
+ )
784
+
703
785
  else
704
786
  raise "Unknown declaration type: #{decl.class}"
705
787
  end
@@ -712,7 +794,65 @@ module RBS
712
794
  member.buffer,
713
795
  member.name,
714
796
  member.node,
715
- member.method_type.map_type_name {|name, _, _| absolute_type_name(resolver, nil, name, context: context) }
797
+ member.method_type.map_type_name {|name, _, _| absolute_type_name(resolver, nil, name, context: context) },
798
+ member.leading_comment
799
+ )
800
+ when AST::Ruby::Members::IncludeMember
801
+ resolved_annotation = member.annotation&.map_type_name {|name, _, _| absolute_type_name(resolver, nil, name, context: context) }
802
+ AST::Ruby::Members::IncludeMember.new(
803
+ member.buffer,
804
+ member.node,
805
+ absolute_type_name(resolver, nil, member.module_name, context: context),
806
+ resolved_annotation
807
+ )
808
+ when AST::Ruby::Members::ExtendMember
809
+ resolved_annotation = member.annotation&.map_type_name {|name, _, _| absolute_type_name(resolver, nil, name, context: context) }
810
+ AST::Ruby::Members::ExtendMember.new(
811
+ member.buffer,
812
+ member.node,
813
+ absolute_type_name(resolver, nil, member.module_name, context: context),
814
+ resolved_annotation
815
+ )
816
+ when AST::Ruby::Members::PrependMember
817
+ resolved_annotation = member.annotation&.map_type_name {|name, _, _| absolute_type_name(resolver, nil, name, context: context) }
818
+ AST::Ruby::Members::PrependMember.new(
819
+ member.buffer,
820
+ member.node,
821
+ absolute_type_name(resolver, nil, member.module_name, context: context),
822
+ resolved_annotation
823
+ )
824
+ when AST::Ruby::Members::AttrReaderMember
825
+ resolved_type_annotation = member.type_annotation&.map_type_name {|name, _, _| absolute_type_name(resolver, nil, name, context: context) }
826
+ AST::Ruby::Members::AttrReaderMember.new(
827
+ member.buffer,
828
+ member.node,
829
+ member.name_nodes,
830
+ member.leading_comment,
831
+ resolved_type_annotation
832
+ )
833
+ when AST::Ruby::Members::AttrWriterMember
834
+ resolved_type_annotation = member.type_annotation&.map_type_name {|name, _, _| absolute_type_name(resolver, nil, name, context: context) }
835
+ AST::Ruby::Members::AttrWriterMember.new(
836
+ member.buffer,
837
+ member.node,
838
+ member.name_nodes,
839
+ member.leading_comment,
840
+ resolved_type_annotation
841
+ )
842
+ when AST::Ruby::Members::AttrAccessorMember
843
+ resolved_type_annotation = member.type_annotation&.map_type_name {|name, _, _| absolute_type_name(resolver, nil, name, context: context) }
844
+ AST::Ruby::Members::AttrAccessorMember.new(
845
+ member.buffer,
846
+ member.node,
847
+ member.name_nodes,
848
+ member.leading_comment,
849
+ resolved_type_annotation
850
+ )
851
+ when AST::Ruby::Members::InstanceVariableMember
852
+ resolved_annotation = member.annotation.map_type_name {|name| absolute_type_name(resolver, nil, name, context: context) }
853
+ AST::Ruby::Members::InstanceVariableMember.new(
854
+ member.buffer,
855
+ resolved_annotation
716
856
  )
717
857
  else
718
858
  raise "Unknown member type: #{member.class}"
@@ -845,7 +985,7 @@ module RBS
845
985
  end
846
986
 
847
987
  def inspect
848
- ivars = %i[@declarations @class_decls @class_alias_decls @interface_decls @type_alias_decls @constant_decls @global_decls]
988
+ ivars = %i[@sources @class_decls @class_alias_decls @interface_decls @type_alias_decls @constant_decls @global_decls]
849
989
  "\#<RBS::Environment #{ivars.map { |iv| "#{iv}=(#{instance_variable_get(iv).size} items)"}.join(' ')}>"
850
990
  end
851
991
 
@@ -853,12 +993,25 @@ module RBS
853
993
  sources.map(&:buffer)
854
994
  end
855
995
 
856
- def unload(buffers)
857
- env = Environment.new
858
- bufs = buffers.to_set
996
+ def unload(paths)
997
+ ps = Set[]
998
+ paths.each do |path|
999
+ if path.is_a?(Buffer)
1000
+ ps << path.name
1001
+ else
1002
+ ps << path
1003
+ end
1004
+ end
1005
+
1006
+ env = Environment.new()
859
1007
 
860
1008
  each_rbs_source do |source|
861
- next if bufs.include?(source.buffer)
1009
+ next if ps.include?(source.buffer.name)
1010
+ env.add_source(source)
1011
+ end
1012
+
1013
+ each_ruby_source do |source|
1014
+ next if ps.include?(source.buffer.name)
862
1015
  env.add_source(source)
863
1016
  end
864
1017
 
@@ -50,12 +50,6 @@ module RBS
50
50
  when path
51
51
  dirs << path
52
52
  when library
53
- case library
54
- when 'rubygems', 'set'
55
- RBS.logger.warn "`#{library}` has been moved to core library, so it is always loaded. Remove explicit loading `#{library}`"
56
- return
57
- end
58
-
59
53
  if libs.add?(Library.new(name: library, version: version)) && resolve_dependencies
60
54
  resolve_dependencies(library: library, version: version)
61
55
  end