rbs 3.2.2 → 3.3.0.pre.1

Sign up to get free protection for your applications and to get access to all the features.
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)