rbs 3.2.2 → 3.3.0.pre.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.
Files changed (125) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/comments.yml +1 -1
  3. data/.github/workflows/ruby.yml +7 -2
  4. data/CHANGELOG.md +85 -0
  5. data/Gemfile.lock +14 -14
  6. data/README.md +11 -2
  7. data/Rakefile +10 -7
  8. data/Steepfile +7 -7
  9. data/core/basic_object.rbs +7 -7
  10. data/core/binding.rbs +3 -3
  11. data/core/builtin.rbs +171 -5
  12. data/core/constants.rbs +17 -17
  13. data/core/dir.rbs +3 -3
  14. data/core/encoding.rbs +434 -628
  15. data/core/enumerator.rbs +37 -0
  16. data/core/exception.rbs +11 -11
  17. data/core/false_class.rbs +5 -11
  18. data/core/fiber.rbs +3 -3
  19. data/core/file_test.rbs +28 -26
  20. data/core/kernel.rbs +900 -21
  21. data/core/marshal.rbs +24 -14
  22. data/core/match_data.rbs +8 -8
  23. data/core/math.rbs +57 -53
  24. data/core/method.rbs +3 -1
  25. data/core/module.rbs +38 -36
  26. data/core/nil_class.rbs +7 -13
  27. data/core/object.rbs +3 -966
  28. data/core/process.rbs +3 -3
  29. data/core/ractor.rbs +2 -2
  30. data/core/rb_config.rbs +64 -43
  31. data/core/regexp.rbs +3 -3
  32. data/core/signal.rbs +10 -4
  33. data/core/struct.rbs +1 -1
  34. data/core/thread.rbs +7 -7
  35. data/core/thread_group.rbs +9 -9
  36. data/core/true_class.rbs +5 -11
  37. data/core/unbound_method.rbs +56 -7
  38. data/core/warning.rbs +33 -0
  39. data/docs/collection.md +56 -6
  40. data/docs/data_and_struct.md +57 -0
  41. data/docs/stdlib.md +61 -2
  42. data/docs/syntax.md +123 -2
  43. data/ext/rbs_extension/lexer.c +624 -569
  44. data/ext/rbs_extension/lexer.h +1 -0
  45. data/ext/rbs_extension/lexer.re +1 -0
  46. data/ext/rbs_extension/lexstate.c +1 -0
  47. data/ext/rbs_extension/parser.c +6 -0
  48. data/goodcheck.yml +2 -2
  49. data/lib/rbs/annotate/formatter.rb +13 -3
  50. data/lib/rbs/annotate/rdoc_source.rb +10 -1
  51. data/lib/rbs/cli/colored_io.rb +48 -0
  52. data/lib/rbs/cli/diff.rb +80 -0
  53. data/lib/rbs/cli.rb +151 -16
  54. data/lib/rbs/collection/config/lockfile.rb +0 -25
  55. data/lib/rbs/collection/config/lockfile_generator.rb +0 -6
  56. data/lib/rbs/collection/installer.rb +1 -1
  57. data/lib/rbs/collection/sources/git.rb +6 -4
  58. data/lib/rbs/collection/sources/local.rb +7 -5
  59. data/lib/rbs/diff.rb +104 -0
  60. data/lib/rbs/environment.rb +1 -1
  61. data/lib/rbs/method_type.rb +23 -0
  62. data/lib/rbs/prototype/rb.rb +2 -9
  63. data/lib/rbs/prototype/runtime/helpers.rb +59 -0
  64. data/lib/rbs/prototype/runtime/value_object_generator.rb +236 -0
  65. data/lib/rbs/prototype/runtime.rb +234 -150
  66. data/lib/rbs/sorter.rb +144 -117
  67. data/lib/rbs/test/guaranteed.rb +31 -0
  68. data/lib/rbs/test/type_check.rb +4 -4
  69. data/lib/rbs/test.rb +3 -0
  70. data/lib/rbs/types.rb +184 -3
  71. data/lib/rbs/version.rb +1 -1
  72. data/lib/rbs/writer.rb +4 -4
  73. data/lib/rbs.rb +1 -0
  74. data/rbs.gemspec +1 -0
  75. data/sig/annotate/formatter.rbs +2 -2
  76. data/sig/annotate/rdoc_annotater.rbs +1 -1
  77. data/sig/cli/colored_io.rbs +15 -0
  78. data/sig/cli/diff.rbs +21 -0
  79. data/sig/cli.rbs +2 -0
  80. data/sig/collection/config/lockfile.rbs +0 -6
  81. data/sig/diff.rbs +23 -0
  82. data/sig/errors.rbs +1 -5
  83. data/sig/method_types.rbs +6 -0
  84. data/sig/prototype/runtime.rbs +108 -0
  85. data/sig/rdoc/rbs.rbs +4 -0
  86. data/sig/shims/bundler.rbs +5 -0
  87. data/sig/sorter.rbs +23 -5
  88. data/sig/types.rbs +29 -0
  89. data/stdlib/benchmark/0/benchmark.rbs +1 -1
  90. data/stdlib/cgi/0/core.rbs +2 -2
  91. data/stdlib/did_you_mean/0/did_you_mean.rbs +2 -2
  92. data/stdlib/digest/0/digest.rbs +1 -1
  93. data/stdlib/fileutils/0/fileutils.rbs +1 -1
  94. data/stdlib/forwardable/0/forwardable.rbs +4 -4
  95. data/stdlib/io-console/0/io-console.rbs +1 -1
  96. data/stdlib/json/0/json.rbs +37 -0
  97. data/stdlib/logger/0/logger.rbs +2 -2
  98. data/stdlib/net-http/0/manifest.yaml +1 -1
  99. data/stdlib/net-http/0/net-http.rbs +16 -63
  100. data/stdlib/net-protocol/0/manifest.yaml +2 -0
  101. data/stdlib/net-protocol/0/net-protocol.rbs +56 -0
  102. data/stdlib/openssl/0/openssl.rbs +1 -1
  103. data/stdlib/pp/0/manifest.yaml +2 -0
  104. data/stdlib/pp/0/pp.rbs +301 -0
  105. data/stdlib/{yaml → psych}/0/dbm.rbs +3 -3
  106. data/stdlib/psych/0/manifest.yaml +3 -0
  107. data/stdlib/psych/0/psych.rbs +391 -0
  108. data/stdlib/{yaml → psych}/0/store.rbs +2 -2
  109. data/stdlib/rdoc/0/code_object.rbs +55 -0
  110. data/stdlib/rdoc/0/comment.rbs +60 -0
  111. data/stdlib/rdoc/0/context.rbs +153 -0
  112. data/stdlib/rdoc/0/markup.rbs +119 -0
  113. data/stdlib/rdoc/0/parser.rbs +56 -0
  114. data/stdlib/rdoc/0/rdoc.rbs +0 -372
  115. data/stdlib/rdoc/0/ri.rbs +17 -0
  116. data/stdlib/rdoc/0/store.rbs +48 -0
  117. data/stdlib/rdoc/0/top_level.rbs +97 -0
  118. data/stdlib/socket/0/basic_socket.rbs +1 -1
  119. data/stdlib/socket/0/socket.rbs +1 -1
  120. data/stdlib/uri/0/common.rbs +1 -1
  121. data/stdlib/yaml/0/manifest.yaml +1 -2
  122. data/stdlib/yaml/0/yaml.rbs +1 -199
  123. metadata +46 -9
  124. data/sig/shims/pp.rbs +0 -3
  125. data/sig/shims.rbs +0 -47
data/lib/rbs/sorter.rb CHANGED
@@ -28,140 +28,167 @@ module RBS
28
28
  end
29
29
  end
30
30
 
31
- def group(member)
32
- case member
33
- when Declarations::TypeAlias
34
- -3
35
- when Declarations::Constant
36
- -2
37
- when Declarations::Class, Declarations::Module, Declarations::Interface
38
- -1
39
- when Members::Include
40
- 0.0
41
- when Members::Prepend
42
- 0.2
43
- when Members::Extend
44
- 0.4
45
- when Members::ClassVariable
46
- 1
47
- when Members::ClassInstanceVariable
48
- 2
49
- when Members::InstanceVariable
50
- 3
51
- when Members::AttrAccessor, Members::AttrWriter, Members::AttrReader
52
- if member.kind == :singleton
53
- 5.0
54
- else
55
- 6.0
56
- end
57
- when Members::MethodDefinition
58
- case member.kind
59
- when :singleton_instance
60
- 4
61
- when :singleton
62
- if member.name == :new
63
- 5.2
64
- elsif member.visibility == :public
65
- 5.4
66
- else
67
- 5.6
68
- end
69
- else
70
- if member.name == :initialize
71
- 6.2
72
- elsif member.visibility == :public
73
- 6.4
74
- else
75
- 6.6
76
- end
77
- end
78
- when Members::Alias
79
- if member.singleton?
80
- 5.4
81
- else
82
- 6.4
83
- end
84
- else
85
- raise
86
- end
87
- end
88
-
89
- def key(member)
90
- case member
91
- when Members::Include, Members::Extend, Members::Prepend
92
- member.name.to_s
93
- when Members::ClassVariable, Members::ClassInstanceVariable, Members::InstanceVariable
94
- member.name.to_s
95
- when Members::AttrAccessor, Members::AttrWriter, Members::AttrReader
96
- member.name.to_s
97
- when Members::MethodDefinition
98
- member.name.to_s
99
- when Members::Alias
100
- member.new_name.to_s
101
- when Declarations::Constant
102
- member.name.to_s
103
- when Declarations::TypeAlias
104
- member.name.to_s
105
- when Declarations::Class, Declarations::Module, Declarations::Interface
106
- member.name.to_s
107
- else
108
- raise
109
- end
110
- end
111
-
112
31
  def sort_decl!(decl)
113
32
  case decl
114
33
  when Declarations::Class, Declarations::Module, Declarations::Interface
34
+ partitioned = {
35
+ type_alias_decls: [],
36
+ constant_decls: [],
37
+ class_decls: [],
38
+ mixin_includes: [],
39
+ mixin_prepends: [],
40
+ mixin_extends: [],
41
+ class_variables: [],
42
+ class_instance_variables: [],
43
+ instance_variables: [],
44
+ singleton_attributes: [],
45
+ instance_attributes: [],
46
+ module_functions: [],
47
+ singleton_new_methods: [],
48
+ public_singleton_methods: [],
49
+ private_singleton_methods: [],
50
+ instance_initialize_methods: [],
51
+ public_instance_methods: [],
52
+ private_instance_methods: [],
53
+ } #: partitioned
54
+
115
55
  decl.members.each { |m| sort_decl! m }
116
56
 
117
- current_visibility = :public
118
- decl.members.map! do |m|
119
- case m
57
+ visibility_annotated_members = [] #: Array[member]
58
+
59
+ decl.members.inject(:public) do |current_visibility, member| #$ AST::Members::visibility
60
+ case member
120
61
  when Members::Public
121
- current_visibility = :public
122
- nil
62
+ :public
123
63
  when Members::Private
124
- current_visibility = :private
125
- nil
64
+ :private
126
65
  when Members::MethodDefinition, Members::AttrReader, Members::AttrWriter, Members::AttrAccessor
127
- m.update(visibility: m.visibility || current_visibility)
66
+ visibility_annotated_members << member.update(visibility: member.visibility || current_visibility)
67
+ current_visibility
128
68
  else
129
- m
69
+ visibility_annotated_members << member
70
+ current_visibility
130
71
  end
131
72
  end
132
- decl.members.compact!
133
-
134
- decl.members.sort! do |m1, m2|
135
- group1 = group(m1)
136
- group2 = group(m2)
137
73
 
138
- if group1 == group2
139
- key(m1) <=> key(m2)
140
- else
141
- group1 <=> group2
142
- end
143
- end
144
-
145
- current_visibility = :public
146
- decl.members.map! do |m|
147
- case m
148
- when Members::MethodDefinition, Members::AttrReader, Members::AttrWriter, Members::AttrAccessor
149
- new = m.update(visibility: nil)
150
- cur = current_visibility
151
- current_visibility = m.visibility
152
- if cur != m.visibility
153
- [
154
- m.visibility == :public ? Members::Public.new(location: nil) : Members::Private.new(location: nil),
155
- new
156
- ]
74
+ visibility_annotated_members.each do |member|
75
+ case member
76
+ when Declarations::TypeAlias
77
+ partitioned[:type_alias_decls] << member
78
+ when Declarations::Constant
79
+ partitioned[:constant_decls] << member
80
+ when Declarations::Class, Declarations::Module, Declarations::Interface
81
+ partitioned[:class_decls] << member
82
+ when Members::Include
83
+ partitioned[:mixin_includes] << member
84
+ when Members::Prepend
85
+ partitioned[:mixin_prepends] << member
86
+ when Members::Extend
87
+ partitioned[:mixin_extends] << member
88
+ when Members::ClassVariable
89
+ partitioned[:class_variables] << member
90
+ when Members::ClassInstanceVariable
91
+ partitioned[:class_instance_variables] << member
92
+ when Members::InstanceVariable
93
+ partitioned[:instance_variables] << member
94
+ when Members::AttrAccessor, Members::AttrWriter, Members::AttrReader
95
+ if member.kind == :singleton
96
+ partitioned[:singleton_attributes] << member.update(visibility: nil)
97
+ else
98
+ partitioned[:instance_attributes] << member.update(visibility: nil)
99
+ end
100
+ when Members::MethodDefinition
101
+ case member.kind
102
+ when :singleton_instance
103
+ partitioned[:module_functions] << member.update(visibility: nil)
104
+ when :singleton
105
+ if member.name == :new
106
+ partitioned[:singleton_new_methods] << member.update(visibility: nil)
107
+ elsif member.visibility == :public
108
+ partitioned[:public_singleton_methods] << member.update(visibility: nil)
109
+ else
110
+ partitioned[:private_singleton_methods] << member.update(visibility: nil)
111
+ end
157
112
  else
158
- new
113
+ if member.name == :initialize
114
+ partitioned[:instance_initialize_methods] << member.update(visibility: nil)
115
+ elsif member.visibility == :public
116
+ partitioned[:public_instance_methods] << member.update(visibility: nil)
117
+ else
118
+ partitioned[:private_instance_methods] << member.update(visibility: nil)
119
+ end
159
120
  end
121
+ when Members::Alias
122
+ if member.singleton?
123
+ partitioned[:public_singleton_methods] << member
124
+ else
125
+ partitioned[:public_instance_methods] << member
126
+ end
127
+ when Members::Public, Members::Private
128
+ raise
160
129
  else
161
- m
130
+ partitioned[:other_decls] << member
162
131
  end
163
132
  end
164
- decl.members.flatten!
133
+
134
+ partitioned[:type_alias_decls].sort_by! {|decl| decl.name.to_s }
135
+ partitioned[:constant_decls].sort_by! {|decl| decl.name.to_s }
136
+ partitioned[:class_decls].sort_by! {|decl| decl.name.to_s }
137
+ partitioned[:mixin_includes].sort_by! {|decl| decl.name.to_s }
138
+ partitioned[:mixin_prepends].sort_by! {|decl| decl.name.to_s }
139
+ partitioned[:mixin_extends].sort_by! {|decl| decl.name.to_s }
140
+ partitioned[:class_variables].sort_by! {|decl| decl.name.to_s }
141
+ partitioned[:class_instance_variables].sort_by! {|decl| decl.name.to_s }
142
+ partitioned[:instance_variables].sort_by! {|decl| decl.name.to_s }
143
+ partitioned[:singleton_attributes].sort_by! {|decl| decl.name.to_s }
144
+ partitioned[:instance_attributes].sort_by! {|decl| decl.name.to_s }
145
+ partitioned[:module_functions].sort_by! {|decl| decl.name.to_s }
146
+ partitioned[:public_singleton_methods].sort_by! {|decl| decl.is_a?(Members::MethodDefinition) ? decl.name.to_s : decl.new_name.to_s }
147
+ partitioned[:private_singleton_methods].sort_by! {|decl| decl.name.to_s }
148
+ partitioned[:public_instance_methods].sort_by! {|decl| decl.is_a?(Members::MethodDefinition) ? decl.name.to_s : decl.new_name.to_s }
149
+ partitioned[:private_instance_methods].sort_by! {|decl| decl.name.to_s }
150
+
151
+ members = [] #: Array[member]
152
+ members.push(*partitioned[:type_alias_decls])
153
+ members.push(*partitioned[:constant_decls])
154
+ members.push(*partitioned[:class_decls])
155
+ members.push(*partitioned[:mixin_includes])
156
+ members.push(*partitioned[:mixin_prepends])
157
+ members.push(*partitioned[:mixin_extends])
158
+ members.push(*partitioned[:class_variables])
159
+ members.push(*partitioned[:class_instance_variables])
160
+ members.push(*partitioned[:instance_variables])
161
+ members.push(*partitioned[:module_functions])
162
+ members.push(*partitioned[:singleton_attributes])
163
+
164
+ current_visibility = :public #: AST::Members::visibility
165
+
166
+ members.push(*partitioned[:singleton_new_methods])
167
+ members.push(*partitioned[:public_singleton_methods])
168
+
169
+ if !partitioned[:private_singleton_methods].empty?
170
+ current_visibility = :private
171
+ members.push Members::Private.new(location: nil)
172
+ end
173
+ members.push(*partitioned[:private_singleton_methods])
174
+
175
+ if current_visibility == :private && !partitioned[:public_instance_methods].empty?
176
+ current_visibility = :public
177
+ members.push Members::Public.new(location: nil)
178
+ end
179
+ members.push(*partitioned[:instance_attributes])
180
+ members.push(*partitioned[:instance_initialize_methods])
181
+ members.push(*partitioned[:public_instance_methods])
182
+
183
+ if current_visibility == :public && !partitioned[:private_instance_methods].empty?
184
+ current_visibility = :private
185
+ members.push Members::Private.new(location: nil)
186
+ end
187
+ members.push(*partitioned[:private_instance_methods])
188
+
189
+ members.push(*partitioned[:other_decls])
190
+
191
+ decl.members.replace(_ = members)
165
192
  end
166
193
  end
167
194
  end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RBS
4
+ module Test
5
+ module Guaranteed
6
+ module Inspect
7
+ EQUAL = ::BasicObject.instance_method(:equal?)
8
+ INSPECT = ::Kernel.instance_method(:inspect)
9
+ private_constant :EQUAL, :INSPECT
10
+
11
+ module_function def guaranteed_inspect(obj)
12
+ obj.inspect
13
+ rescue NoMethodError => err
14
+ raise unless err.name == :inspect && EQUAL.bind_call(obj, err.receiver)
15
+ INSPECT.bind_call(obj)
16
+ end
17
+
18
+ def inspect
19
+ string = "<#{self.class.name}:"
20
+
21
+ instance_variables.each_with_index do |variable, index|
22
+ string.concat ', ' unless index.zero?
23
+ string.concat "#{variable}: #{guaranteed_inspect(variable)}"
24
+ end
25
+
26
+ string.concat '>'
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -136,7 +136,7 @@ module RBS
136
136
  end
137
137
 
138
138
  def keyword?(value)
139
- value.is_a?(Hash) && value.keys.all? {|key| key.is_a?(Symbol) }
139
+ Hash === value && value.each_key.all?(Symbol)
140
140
  end
141
141
 
142
142
  def zip_args(args, fun, &block)
@@ -302,7 +302,7 @@ module RBS
302
302
  val.is_a?(singleton_class)
303
303
  when Types::Interface
304
304
  methods = Set.new(Test.call(val, METHODS))
305
- if (definition = builder.build_interface(type.name))
305
+ if (definition = builder.build_interface(type.name.absolute!))
306
306
  definition.methods.each_key.all? do |method_name|
307
307
  methods.member?(method_name)
308
308
  end
@@ -310,7 +310,7 @@ module RBS
310
310
  when Types::Variable
311
311
  true
312
312
  when Types::Literal
313
- val == type.literal
313
+ type.literal == val
314
314
  when Types::Union
315
315
  type.types.any? {|type| value(val, type) }
316
316
  when Types::Intersection
@@ -318,7 +318,7 @@ module RBS
318
318
  when Types::Optional
319
319
  Test.call(val, IS_AP, ::NilClass) || value(val, type.type)
320
320
  when Types::Alias
321
- value(val, builder.expand_alias(type.name))
321
+ value(val, builder.expand_alias2(type.name.absolute!, type.args))
322
322
  when Types::Tuple
323
323
  Test.call(val, IS_AP, ::Array) &&
324
324
  type.types.map.with_index {|ty, index| value(val[index], ty) }.all?
data/lib/rbs/test.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "securerandom"
4
+ require "rbs/test/guaranteed"
4
5
  require "rbs/test/observer"
5
6
  require "rbs/test/spy"
6
7
  require "rbs/test/errors"
@@ -23,6 +24,8 @@ module RBS
23
24
  METHODS = Kernel.instance_method(:methods)
24
25
 
25
26
  class ArgumentsReturn
27
+ include Guaranteed::Inspect
28
+
26
29
  attr_reader :arguments
27
30
  attr_reader :exit_value
28
31
  attr_reader :exit_type
data/lib/rbs/types.rb CHANGED
@@ -73,7 +73,7 @@ module RBS
73
73
  when Types::Bases::Void
74
74
  'void'
75
75
  when Types::Bases::Any
76
- 'untyped'
76
+ raise
77
77
  when Types::Bases::Nil
78
78
  'nil'
79
79
  when Types::Bases::Top
@@ -90,11 +90,32 @@ module RBS
90
90
  raise "Unexpected base type: #{inspect}"
91
91
  end
92
92
  end
93
+
94
+ def has_self_type?
95
+ self.is_a?(Types::Bases::Self)
96
+ end
97
+
98
+ def has_classish_type?
99
+ self.is_a?(Bases::Instance) || self.is_a?(Bases::Class)
100
+ end
101
+
102
+ def with_nonreturn_void?
103
+ self.is_a?(Bases::Void)
104
+ end
93
105
  end
94
106
 
95
107
  class Bool < Base; end
96
108
  class Void < Base; end
97
- class Any < Base; end
109
+ class Any < Base
110
+ def to_s(level=0)
111
+ @string || "untyped"
112
+ end
113
+
114
+ def todo!
115
+ @string = '__todo__'
116
+ self
117
+ end
118
+ end
98
119
  class Nil < Base; end
99
120
  class Top < Base; end
100
121
  class Bottom < Base; end
@@ -162,6 +183,18 @@ module RBS
162
183
  end
163
184
 
164
185
  include EmptyEachType
186
+
187
+ def has_self_type?
188
+ false
189
+ end
190
+
191
+ def has_classish_type?
192
+ false
193
+ end
194
+
195
+ def with_nonreturn_void?
196
+ false
197
+ end
165
198
  end
166
199
 
167
200
  class ClassSingleton
@@ -202,6 +235,18 @@ module RBS
202
235
  location: location
203
236
  )
204
237
  end
238
+
239
+ def has_self_type?
240
+ false
241
+ end
242
+
243
+ def has_classish_type?
244
+ false
245
+ end
246
+
247
+ def with_nonreturn_void?
248
+ false
249
+ end
205
250
  end
206
251
 
207
252
  module Application
@@ -241,6 +286,25 @@ module RBS
241
286
  enum_for :each_type
242
287
  end
243
288
  end
289
+
290
+ def has_self_type?
291
+ each_type.any? {|type| type.has_self_type? }
292
+ end
293
+
294
+ def has_classish_type?
295
+ each_type.any? {|type| type.has_classish_type? }
296
+ end
297
+
298
+ def with_nonreturn_void?
299
+ each_type.any? do |type|
300
+ if type.is_a?(Bases::Void)
301
+ # `void` in immediate generics parameter is allowed
302
+ false
303
+ else
304
+ type.with_nonreturn_void?
305
+ end
306
+ end
307
+ end
244
308
  end
245
309
 
246
310
  class Interface
@@ -436,6 +500,18 @@ module RBS
436
500
  enum_for :map_type
437
501
  end
438
502
  end
503
+
504
+ def has_self_type?
505
+ each_type.any? {|type| type.has_self_type? }
506
+ end
507
+
508
+ def has_classish_type?
509
+ each_type.any? {|type| type.has_classish_type? }
510
+ end
511
+
512
+ def with_nonreturn_void?
513
+ each_type.any? {|type| type.with_nonreturn_void? }
514
+ end
439
515
  end
440
516
 
441
517
  class Record
@@ -478,7 +554,7 @@ module RBS
478
554
  return "{ }" if self.fields.empty?
479
555
 
480
556
  fields = self.fields.map do |key, type|
481
- if key.is_a?(Symbol) && key.match?(/\A[A-Za-z_][A-Za-z_]*\z/)
557
+ if key.is_a?(Symbol) && key.match?(/\A[A-Za-z_][A-Za-z_0-9]*\z/)
482
558
  "#{key}: #{type}"
483
559
  else
484
560
  "#{key.inspect} => #{type}"
@@ -512,6 +588,18 @@ module RBS
512
588
  enum_for :map_type
513
589
  end
514
590
  end
591
+
592
+ def has_self_type?
593
+ each_type.any? {|type| type.has_self_type? }
594
+ end
595
+
596
+ def has_classish_type?
597
+ each_type.any? {|type| type.has_classish_type? }
598
+ end
599
+
600
+ def with_nonreturn_void?
601
+ each_type.any? {|type| type.with_nonreturn_void? }
602
+ end
515
603
  end
516
604
 
517
605
  class Optional
@@ -552,6 +640,8 @@ module RBS
552
640
  when Symbol
553
641
  return "#{type.to_s(1)} ?"
554
642
  end
643
+ when RBS::Types::Proc
644
+ return "(#{type.to_s(1)})?"
555
645
  end
556
646
 
557
647
  "#{type.to_s(1)}?"
@@ -582,6 +672,18 @@ module RBS
582
672
  enum_for :map_type
583
673
  end
584
674
  end
675
+
676
+ def has_self_type?
677
+ each_type.any? {|type| type.has_self_type? }
678
+ end
679
+
680
+ def has_classish_type?
681
+ each_type.any? {|type| type.has_classish_type? }
682
+ end
683
+
684
+ def with_nonreturn_void?
685
+ each_type.any? {|type| type.with_nonreturn_void? }
686
+ end
585
687
  end
586
688
 
587
689
  class Union
@@ -650,6 +752,18 @@ module RBS
650
752
  location: location
651
753
  )
652
754
  end
755
+
756
+ def has_self_type?
757
+ each_type.any? {|type| type.has_self_type? }
758
+ end
759
+
760
+ def has_classish_type?
761
+ each_type.any? {|type| type.has_classish_type? }
762
+ end
763
+
764
+ def with_nonreturn_void?
765
+ each_type.any? {|type| type.with_nonreturn_void? }
766
+ end
653
767
  end
654
768
 
655
769
  class Intersection
@@ -719,6 +833,18 @@ module RBS
719
833
  location: location
720
834
  )
721
835
  end
836
+
837
+ def has_self_type?
838
+ each_type.any? {|type| type.has_self_type? }
839
+ end
840
+
841
+ def has_classish_type?
842
+ each_type.any? {|type| type.has_classish_type? }
843
+ end
844
+
845
+ def with_nonreturn_void?
846
+ each_type.any? {|type| type.with_nonreturn_void? }
847
+ end
722
848
  end
723
849
 
724
850
  class Function
@@ -1029,6 +1155,26 @@ module RBS
1029
1155
  false
1030
1156
  end
1031
1157
  end
1158
+
1159
+ def has_self_type?
1160
+ each_type.any? {|type| type.has_self_type? }
1161
+ end
1162
+
1163
+ def has_classish_type?
1164
+ each_type.any? {|type| type.has_classish_type? }
1165
+ end
1166
+
1167
+ def with_nonreturn_void?
1168
+ if each_param.any? {|param| param.type.with_nonreturn_void? }
1169
+ true
1170
+ else
1171
+ if return_type.is_a?(Bases::Void)
1172
+ false
1173
+ else
1174
+ return_type.with_nonreturn_void?
1175
+ end
1176
+ end
1177
+ end
1032
1178
  end
1033
1179
 
1034
1180
  class Block
@@ -1155,6 +1301,9 @@ module RBS
1155
1301
  if block
1156
1302
  type.each_type(&block)
1157
1303
  self.block&.type&.each_type(&block)
1304
+ if self_type = self.block&.self_type
1305
+ yield self_type
1306
+ end
1158
1307
  else
1159
1308
  enum_for :each_type
1160
1309
  end
@@ -1181,6 +1330,26 @@ module RBS
1181
1330
  enum_for :map_type
1182
1331
  end
1183
1332
  end
1333
+
1334
+ def has_self_type?
1335
+ each_type.any? {|type| type.has_self_type? }
1336
+ end
1337
+
1338
+ def has_classish_type?
1339
+ each_type.any? {|type| type.has_classish_type? }
1340
+ end
1341
+
1342
+ def with_nonreturn_void?
1343
+ if type.with_nonreturn_void?
1344
+ true
1345
+ else
1346
+ if block = block()
1347
+ block.type.with_nonreturn_void? || block.self_type&.with_nonreturn_void? || false
1348
+ else
1349
+ false
1350
+ end
1351
+ end
1352
+ end
1184
1353
  end
1185
1354
 
1186
1355
  class Literal
@@ -1214,6 +1383,18 @@ module RBS
1214
1383
  def to_s(level = 0)
1215
1384
  literal.inspect
1216
1385
  end
1386
+
1387
+ def has_self_type?
1388
+ false
1389
+ end
1390
+
1391
+ def has_classish_type?
1392
+ false
1393
+ end
1394
+
1395
+ def with_nonreturn_void?
1396
+ false
1397
+ end
1217
1398
  end
1218
1399
  end
1219
1400
  end
data/lib/rbs/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RBS
4
- VERSION = "3.2.2"
4
+ VERSION = "3.3.0.pre.1"
5
5
  end
data/lib/rbs/writer.rb CHANGED
@@ -107,7 +107,7 @@ module RBS
107
107
  "#{clause.namespace}*"
108
108
  end
109
109
  end
110
-
110
+
111
111
  puts "use #{clauses.join(", ")}"
112
112
  end
113
113
 
@@ -264,8 +264,8 @@ module RBS
264
264
  when AST::Members::Alias
265
265
  write_comment member.comment
266
266
  write_annotation member.annotations
267
- new_name = member.singleton? ? "self.#{member.new_name}" : member.new_name
268
- old_name = member.singleton? ? "self.#{member.old_name}" : member.old_name
267
+ new_name = member.singleton? ? "self.#{method_name(member.new_name)}" : method_name(member.new_name)
268
+ old_name = member.singleton? ? "self.#{method_name(member.old_name)}" : method_name(member.old_name)
269
269
  puts "alias #{new_name} #{old_name}"
270
270
  when AST::Members::InstanceVariable
271
271
  write_comment member.comment
@@ -385,7 +385,7 @@ module RBS
385
385
  ""
386
386
  end
387
387
 
388
- "#{visibility}attr_#{kind} #{receiver}#{attr.name}#{var}: #{attr.type}"
388
+ "#{visibility}attr_#{kind} #{receiver}#{method_name(attr.name)}#{var}: #{attr.type}"
389
389
  end
390
390
 
391
391
  def preserve_empty_line(prev, decl)