rbs 0.2.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (81) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +7 -1
  3. data/.gitignore +1 -1
  4. data/CHANGELOG.md +35 -0
  5. data/COPYING +1 -1
  6. data/Gemfile +16 -2
  7. data/README.md +87 -48
  8. data/Rakefile +54 -22
  9. data/bin/rbs-prof +9 -0
  10. data/bin/run_in_md.rb +49 -0
  11. data/bin/test_runner.rb +0 -2
  12. data/docs/sigs.md +6 -6
  13. data/docs/stdlib.md +3 -5
  14. data/docs/syntax.md +6 -3
  15. data/goodcheck.yml +65 -0
  16. data/lib/rbs.rb +3 -0
  17. data/lib/rbs/ast/declarations.rb +115 -14
  18. data/lib/rbs/ast/members.rb +41 -17
  19. data/lib/rbs/cli.rb +301 -123
  20. data/lib/rbs/constant.rb +4 -4
  21. data/lib/rbs/constant_table.rb +64 -53
  22. data/lib/rbs/definition.rb +175 -59
  23. data/lib/rbs/definition_builder.rb +646 -603
  24. data/lib/rbs/environment.rb +352 -210
  25. data/lib/rbs/environment_walker.rb +14 -23
  26. data/lib/rbs/errors.rb +159 -3
  27. data/lib/rbs/factory.rb +14 -0
  28. data/lib/rbs/namespace.rb +18 -0
  29. data/lib/rbs/parser.y +75 -21
  30. data/lib/rbs/prototype/rb.rb +119 -117
  31. data/lib/rbs/prototype/rbi.rb +5 -3
  32. data/lib/rbs/prototype/runtime.rb +34 -7
  33. data/lib/rbs/substitution.rb +8 -1
  34. data/lib/rbs/test.rb +81 -3
  35. data/lib/rbs/test/errors.rb +1 -1
  36. data/lib/rbs/test/hook.rb +133 -259
  37. data/lib/rbs/test/observer.rb +17 -0
  38. data/lib/rbs/test/setup.rb +13 -14
  39. data/lib/rbs/test/spy.rb +0 -321
  40. data/lib/rbs/test/tester.rb +116 -0
  41. data/lib/rbs/test/type_check.rb +44 -7
  42. data/lib/rbs/type_name_resolver.rb +58 -0
  43. data/lib/rbs/types.rb +94 -2
  44. data/lib/rbs/validator.rb +51 -0
  45. data/lib/rbs/variance_calculator.rb +12 -2
  46. data/lib/rbs/version.rb +1 -1
  47. data/lib/rbs/writer.rb +127 -91
  48. data/rbs.gemspec +0 -9
  49. data/schema/annotation.json +14 -0
  50. data/schema/comment.json +26 -0
  51. data/schema/decls.json +353 -0
  52. data/schema/function.json +87 -0
  53. data/schema/location.json +56 -0
  54. data/schema/members.json +248 -0
  55. data/schema/methodType.json +44 -0
  56. data/schema/types.json +299 -0
  57. data/stdlib/benchmark/benchmark.rbs +151 -151
  58. data/stdlib/builtin/encoding.rbs +2 -0
  59. data/stdlib/builtin/enumerable.rbs +2 -2
  60. data/stdlib/builtin/enumerator.rbs +3 -1
  61. data/stdlib/builtin/fiber.rbs +5 -1
  62. data/stdlib/builtin/file.rbs +0 -3
  63. data/stdlib/builtin/io.rbs +4 -4
  64. data/stdlib/builtin/proc.rbs +1 -2
  65. data/stdlib/builtin/symbol.rbs +1 -1
  66. data/stdlib/builtin/thread.rbs +2 -2
  67. data/stdlib/csv/csv.rbs +4 -6
  68. data/stdlib/fiber/fiber.rbs +117 -0
  69. data/stdlib/json/json.rbs +1 -1
  70. data/stdlib/logger/formatter.rbs +23 -0
  71. data/stdlib/logger/log_device.rbs +39 -0
  72. data/stdlib/logger/logger.rbs +507 -0
  73. data/stdlib/logger/period.rbs +7 -0
  74. data/stdlib/logger/severity.rbs +8 -0
  75. data/stdlib/mutex_m/mutex_m.rbs +77 -0
  76. data/stdlib/pathname/pathname.rbs +6 -6
  77. data/stdlib/prime/integer-extension.rbs +1 -1
  78. data/stdlib/prime/prime.rbs +44 -44
  79. data/stdlib/tmpdir/tmpdir.rbs +1 -1
  80. metadata +26 -116
  81. data/lib/rbs/test/test_helper.rb +0 -183
@@ -4,9 +4,34 @@ module RBS
4
4
  attr_reader :self_class
5
5
  attr_reader :builder
6
6
 
7
- def initialize(self_class:, builder:)
7
+ def initialize(self_class:, builder:, sampling:)
8
8
  @self_class = self_class
9
9
  @builder = builder
10
+ @sampling = sampling
11
+ end
12
+
13
+ def overloaded_call(method, method_name, call, errors:)
14
+ es = method.method_types.map do |method_type|
15
+ es = method_call(method_name, method_type, call, errors: [])
16
+
17
+ if es.empty?
18
+ return errors
19
+ else
20
+ es
21
+ end
22
+ end
23
+
24
+ if es.size == 1
25
+ errors.push(*es[0])
26
+ else
27
+ errors << Errors::UnresolvedOverloadingError.new(
28
+ klass: self_class,
29
+ method_name: method_name,
30
+ method_types: method.method_types
31
+ )
32
+ end
33
+
34
+ errors
10
35
  end
11
36
 
12
37
  def method_call(method_name, method_type, call, errors:)
@@ -56,7 +81,7 @@ module RBS
56
81
  end
57
82
 
58
83
  def return(method_name, method_type, fun, call, errors, return_error:)
59
- unless call.exception
84
+ if call.return?
60
85
  unless value(call.return_value, fun.return_type)
61
86
  errors << return_error.new(klass: self_class,
62
87
  method_name: method_name,
@@ -151,6 +176,14 @@ module RBS
151
176
  end
152
177
  end
153
178
 
179
+ def sampling?
180
+ !!@sampling
181
+ end
182
+
183
+ def sample(array)
184
+ array.size > 100 && sampling? ? array.sample(100) : array
185
+ end
186
+
154
187
  def value(val, type)
155
188
  case type
156
189
  when Types::Bases::Any
@@ -175,9 +208,14 @@ module RBS
175
208
  klass = Object.const_get(type.name.to_s)
176
209
  case
177
210
  when klass == ::Array
178
- Test.call(val, IS_AP, klass) && val.all? {|v| value(v, type.args[0]) }
211
+ Test.call(val, IS_AP, klass) && sample(val).yield_self do |val|
212
+ val.all? {|v| value(v, type.args[0]) }
213
+ end
179
214
  when klass == ::Hash
180
- Test.call(val, IS_AP, klass) && val.all? {|k, v| value(k, type.args[0]) && value(v, type.args[1]) }
215
+ Test.call(val, IS_AP, klass) && sample(val.keys).yield_self do |keys|
216
+ values = val.values_at(*keys)
217
+ keys.all? {|key| value(key, type.args[0]) } && values.all? {|v| value(v, type.args[1]) }
218
+ end
181
219
  when klass == ::Range
182
220
  Test.call(val, IS_AP, klass) && value(val.begin, type.args[0]) && value(val.end, type.args[0])
183
221
  when klass == ::Enumerator
@@ -198,7 +236,7 @@ module RBS
198
236
  end
199
237
  end
200
238
 
201
- values.all? do |v|
239
+ sample(values).all? do |v|
202
240
  if v.size == 1
203
241
  # Only one block argument.
204
242
  value(v[0], type.args[0]) || value(v, type.args[0])
@@ -220,8 +258,7 @@ module RBS
220
258
  val == klass
221
259
  when Types::Interface
222
260
  methods = Set.new(Test.call(val, METHODS))
223
- decl = builder.env.find_class(type.name)
224
- if (definition = builder.build_interface(type.name, decl))
261
+ if (definition = builder.build_interface(type.name))
225
262
  definition.methods.each_key.all? do |method_name|
226
263
  methods.member?(method_name)
227
264
  end
@@ -0,0 +1,58 @@
1
+ module RBS
2
+ class TypeNameResolver
3
+ Query = Struct.new(:type_name, :context, keyword_init: true)
4
+
5
+ attr_reader :all_names
6
+ attr_reader :cache
7
+
8
+ def initialize()
9
+ @all_names = Set[]
10
+ @cache = {}
11
+ end
12
+
13
+ def self.from_env(env)
14
+ new.add_names(env.class_decls.keys)
15
+ .add_names(env.interface_decls.keys)
16
+ .add_names(env.alias_decls.keys)
17
+ end
18
+
19
+ def add_names(names)
20
+ all_names.merge(names)
21
+ self
22
+ end
23
+
24
+ def try_cache(query)
25
+ cache.fetch(query) do
26
+ result = yield
27
+ cache[query] = result
28
+ end
29
+ end
30
+
31
+ def resolve(type_name, context:)
32
+ if type_name.absolute?
33
+ return type_name
34
+ end
35
+
36
+ query = Query.new(type_name: type_name, context: context)
37
+ try_cache(query) do
38
+ path_head, *path_tail = type_name.to_namespace.path
39
+ name_head = TypeName.new(name: path_head, namespace: Namespace.empty)
40
+
41
+ absolute_head = context.each.find do |namespace|
42
+ full_name = name_head.with_prefix(namespace)
43
+ has_name?(full_name) and break full_name
44
+ end
45
+
46
+ if absolute_head
47
+ has_name?(Namespace.new(path: absolute_head.to_namespace.path.push(*path_tail), absolute: true).to_type_name)
48
+ end
49
+ end
50
+ end
51
+
52
+ def has_name?(full_name)
53
+ if all_names.include?(full_name)
54
+ full_name
55
+ end
56
+ end
57
+ end
58
+ end
@@ -12,6 +12,12 @@ module RBS
12
12
  end
13
13
  end
14
14
 
15
+ module NoTypeName
16
+ def map_type_name
17
+ self
18
+ end
19
+ end
20
+
15
21
  module EmptyEachType
16
22
  def each_type
17
23
  if block_given?
@@ -43,6 +49,7 @@ module RBS
43
49
  include NoFreeVariables
44
50
  include NoSubst
45
51
  include EmptyEachType
52
+ include NoTypeName
46
53
 
47
54
  def to_json(*a)
48
55
  klass = to_s.to_sym
@@ -82,7 +89,11 @@ module RBS
82
89
  class Top < Base; end
83
90
  class Bottom < Base; end
84
91
  class Self < Base; end
85
- class Instance < Base; end
92
+ class Instance < Base
93
+ def sub(s)
94
+ s.apply(self)
95
+ end
96
+ end
86
97
  class Class < Base; end
87
98
  end
88
99
 
@@ -90,6 +101,8 @@ module RBS
90
101
  attr_reader :name
91
102
  attr_reader :location
92
103
 
104
+ include NoTypeName
105
+
93
106
  def initialize(name:, location:)
94
107
  @name = name
95
108
  @location = location
@@ -174,6 +187,13 @@ module RBS
174
187
  end
175
188
 
176
189
  include EmptyEachType
190
+
191
+ def map_type_name
192
+ ClassSingleton.new(
193
+ name: yield(name, location, self),
194
+ location: location
195
+ )
196
+ end
177
197
  end
178
198
 
179
199
  module Application
@@ -235,6 +255,14 @@ module RBS
235
255
  args: args.map {|ty| ty.sub(s) },
236
256
  location: location)
237
257
  end
258
+
259
+ def map_type_name(&block)
260
+ Interface.new(
261
+ name: yield(name, location, self),
262
+ args: args.map {|type| type.map_type_name(&block) },
263
+ location: location
264
+ )
265
+ end
238
266
  end
239
267
 
240
268
  class ClassInstance
@@ -257,6 +285,14 @@ module RBS
257
285
  args: args.map {|ty| ty.sub(s) },
258
286
  location: location)
259
287
  end
288
+
289
+ def map_type_name(&block)
290
+ ClassInstance.new(
291
+ name: yield(name, location, self),
292
+ args: args.map {|type| type.map_type_name(&block) },
293
+ location: location
294
+ )
295
+ end
260
296
  end
261
297
 
262
298
  class Alias
@@ -290,6 +326,13 @@ module RBS
290
326
  end
291
327
 
292
328
  include EmptyEachType
329
+
330
+ def map_type_name
331
+ Alias.new(
332
+ name: yield(name, location, self),
333
+ location: location
334
+ )
335
+ end
293
336
  end
294
337
 
295
338
  class Tuple
@@ -343,6 +386,13 @@ module RBS
343
386
  enum_for :each_type
344
387
  end
345
388
  end
389
+
390
+ def map_type_name(&block)
391
+ Tuple.new(
392
+ types: types.map {|type| type.map_type_name(&block) },
393
+ location: location
394
+ )
395
+ end
346
396
  end
347
397
 
348
398
  class Record
@@ -401,6 +451,13 @@ module RBS
401
451
  enum_for :each_type
402
452
  end
403
453
  end
454
+
455
+ def map_type_name(&block)
456
+ Record.new(
457
+ fields: fields.transform_values {|ty| ty.map_type_name(&block) },
458
+ location: location
459
+ )
460
+ end
404
461
  end
405
462
 
406
463
  class Optional
@@ -449,6 +506,13 @@ module RBS
449
506
  enum_for :each_type
450
507
  end
451
508
  end
509
+
510
+ def map_type_name(&block)
511
+ Optional.new(
512
+ type: type.map_type_name(&block),
513
+ location: location
514
+ )
515
+ end
452
516
  end
453
517
 
454
518
  class Union
@@ -510,6 +574,13 @@ module RBS
510
574
  enum_for :map_type
511
575
  end
512
576
  end
577
+
578
+ def map_type_name(&block)
579
+ Union.new(
580
+ types: types.map {|type| type.map_type_name(&block) },
581
+ location: location
582
+ )
583
+ end
513
584
  end
514
585
 
515
586
  class Intersection
@@ -572,6 +643,13 @@ module RBS
572
643
  enum_for :map_type
573
644
  end
574
645
  end
646
+
647
+ def map_type_name(&block)
648
+ Intersection.new(
649
+ types: types.map {|type| type.map_type_name(&block) },
650
+ location: location
651
+ )
652
+ end
575
653
  end
576
654
 
577
655
  class Function
@@ -648,7 +726,7 @@ module RBS
648
726
  other.required_keywords == required_keywords &&
649
727
  other.optional_keywords == optional_keywords &&
650
728
  other.rest_keywords == rest_keywords &&
651
- return_type == return_type
729
+ other.return_type == return_type
652
730
  end
653
731
 
654
732
  alias eql? ==
@@ -710,6 +788,12 @@ module RBS
710
788
  end
711
789
  end
712
790
 
791
+ def map_type_name(&block)
792
+ map_type do |type|
793
+ type.map_type_name(&block)
794
+ end
795
+ end
796
+
713
797
  def each_type
714
798
  if block_given?
715
799
  required_positionals.each {|param| yield param.type }
@@ -899,6 +983,13 @@ module RBS
899
983
  enum_for :each_type
900
984
  end
901
985
  end
986
+
987
+ def map_type_name(&block)
988
+ Proc.new(
989
+ type: type.map_type_name(&block),
990
+ location: location
991
+ )
992
+ end
902
993
  end
903
994
 
904
995
  class Literal
@@ -923,6 +1014,7 @@ module RBS
923
1014
  include NoFreeVariables
924
1015
  include NoSubst
925
1016
  include EmptyEachType
1017
+ include NoTypeName
926
1018
 
927
1019
  def to_json(*a)
928
1020
  { class: :literal, literal: literal.inspect, location: location }.to_json(*a)
@@ -0,0 +1,51 @@
1
+ module RBS
2
+ class Validator
3
+ attr_reader :env
4
+ attr_reader :resolver
5
+
6
+ def initialize(env:, resolver:)
7
+ @env = env
8
+ @resolver = resolver
9
+ end
10
+
11
+ def absolute_type(type, context:)
12
+ type.map_type_name do |type_name, _, type|
13
+ resolver.resolve(type_name, context: context) || yield(type)
14
+ end
15
+ end
16
+
17
+ # Validates presence of the relative type, and application arity match.
18
+ def validate_type(type, context:)
19
+ case type
20
+ when Types::ClassInstance, Types::Interface
21
+ if type.name.namespace.relative?
22
+ type = absolute_type(type, context: context) do |type|
23
+ NoTypeFoundError.check!(type.name.absolute!, env: env, location: type.location)
24
+ end
25
+ end
26
+
27
+ type_params = case type
28
+ when Types::ClassInstance
29
+ env.class_decls[type.name]&.type_params
30
+ when Types::Interface
31
+ env.interface_decls[type.name]&.decl&.type_params
32
+ end
33
+
34
+ unless type_params
35
+ raise NoTypeFoundError.new(type_name: type.name, location: type.location)
36
+ end
37
+
38
+ InvalidTypeApplicationError.check!(
39
+ type_name: type.name,
40
+ args: type.args,
41
+ params: type_params.each.map(&:name),
42
+ location: type.location
43
+ )
44
+ end
45
+
46
+ type.each_type do |type|
47
+ validate_type(type, context: context)
48
+ end
49
+ end
50
+ end
51
+ end
@@ -107,9 +107,19 @@ module RBS
107
107
  end
108
108
  end
109
109
  when Types::ClassInstance, Types::Interface
110
- decl = env.find_class(type.name)
110
+ NoTypeFoundError.check!(type.name,
111
+ env: env,
112
+ location: type.location)
113
+
114
+ type_params = case type
115
+ when Types::ClassInstance
116
+ env.class_decls[type.name]&.type_params
117
+ when Types::Interface
118
+ env.interface_decls[type.name]&.decl&.type_params
119
+ end
120
+
111
121
  type.args.each.with_index do |ty, i|
112
- var = decl.type_params.params[i]
122
+ var = type_params.params[i]
113
123
  case var.variance
114
124
  when :invariant
115
125
  type(ty, result: result, context: :invariant)
@@ -1,3 +1,3 @@
1
1
  module RBS
2
- VERSION = "0.2.0"
2
+ VERSION = "0.6.0"
3
3
  end
@@ -1,37 +1,59 @@
1
1
  module RBS
2
2
  class Writer
3
3
  attr_reader :out
4
+ attr_reader :indentation
4
5
 
5
6
  def initialize(out:)
6
7
  @out = out
8
+ @indentation = []
7
9
  end
8
10
 
9
- def write_annotation(annotations, level:)
10
- prefix = " " * level
11
+ def indent(size = 2)
12
+ indentation.push(" " * size)
13
+ yield
14
+ ensure
15
+ indentation.pop
16
+ end
17
+
18
+ def prefix
19
+ indentation.join()
20
+ end
21
+
22
+ def puts(string = "")
23
+ if string.size > 0
24
+ @out.puts("#{prefix}#{string}")
25
+ else
26
+ @out.puts
27
+ end
28
+ end
11
29
 
30
+ def write_annotation(annotations)
12
31
  annotations.each do |annotation|
13
32
  string = annotation.string
14
33
  case
15
34
  when string !~ /\}/
16
- out.puts "#{prefix}%a{#{string}}"
35
+ puts "%a{#{string}}"
17
36
  when string !~ /\)/
18
- out.puts "#{prefix}%a(#{string})"
37
+ puts "%a(#{string})"
19
38
  when string !~ /\]/
20
- out.puts "#{prefix}%a[#{string}]"
39
+ puts "%a[#{string}]"
21
40
  when string !~ /\>/
22
- out.puts "#{prefix}%a<#{string}>"
41
+ puts "%a<#{string}>"
23
42
  when string !~ /\|/
24
- out.puts "#{prefix}%a|#{string}|"
43
+ puts "%a|#{string}|"
25
44
  end
26
45
  end
27
46
  end
28
47
 
29
- def write_comment(comment, level:)
48
+ def write_comment(comment)
30
49
  if comment
31
- prefix = " " * level
32
50
  comment.string.lines.each do |line|
33
- line = " #{line}" unless line.chomp.empty?
34
- out.puts "#{prefix}##{line}"
51
+ line = line.chomp
52
+ unless line.empty?
53
+ puts "# #{line}"
54
+ else
55
+ puts "#"
56
+ end
35
57
  end
36
58
  end
37
59
  end
@@ -49,68 +71,72 @@ module RBS
49
71
  super_class = if decl.super_class
50
72
  " < #{name_and_args(decl.super_class.name, decl.super_class.args)}"
51
73
  end
52
- write_comment decl.comment, level: 0
53
- write_annotation decl.annotations, level: 0
54
- out.puts "class #{name_and_params(decl.name, decl.type_params)}#{super_class}"
74
+ write_comment decl.comment
75
+ write_annotation decl.annotations
76
+ puts "class #{name_and_params(decl.name, decl.type_params)}#{super_class}"
55
77
 
56
- [nil, *decl.members].each_cons(2) do |prev, member|
57
- preserve_empty_line prev, member
58
- write_member member
78
+ indent do
79
+ [nil, *decl.members].each_cons(2) do |prev, member|
80
+ preserve_empty_line prev, member
81
+ write_member member
82
+ end
59
83
  end
60
84
 
61
- out.puts "end"
85
+ puts "end"
62
86
 
63
87
  when AST::Declarations::Module
64
- self_type = if decl.self_type
65
- " : #{decl.self_type}"
88
+ self_type = unless decl.self_types.empty?
89
+ " : #{decl.self_types.join(", ")}"
66
90
  end
67
91
 
68
- write_comment decl.comment, level: 0
69
- write_annotation decl.annotations, level: 0
70
- out.puts "module #{name_and_params(decl.name, decl.type_params)}#{self_type}"
71
- decl.members.each.with_index do |member, index|
72
- if index > 0
73
- out.puts
92
+ write_comment decl.comment
93
+ write_annotation decl.annotations
94
+
95
+ puts "module #{name_and_params(decl.name, decl.type_params)}#{self_type}"
96
+
97
+ indent do
98
+ decl.members.each.with_index do |member, index|
99
+ if index > 0
100
+ puts
101
+ end
102
+ write_member member
74
103
  end
75
- write_member member
76
104
  end
77
- out.puts "end"
105
+
106
+ puts "end"
78
107
  when AST::Declarations::Constant
79
- write_comment decl.comment, level: 0
80
- out.puts "#{decl.name}: #{decl.type}"
108
+ write_comment decl.comment
109
+ puts "#{decl.name}: #{decl.type}"
81
110
 
82
111
  when AST::Declarations::Global
83
- write_comment decl.comment, level: 0
84
- out.puts "#{decl.name}: #{decl.type}"
112
+ write_comment decl.comment
113
+ puts "#{decl.name}: #{decl.type}"
85
114
 
86
115
  when AST::Declarations::Alias
87
- write_comment decl.comment, level: 0
88
- write_annotation decl.annotations, level: 0
89
- out.puts "type #{decl.name} = #{decl.type}"
116
+ write_comment decl.comment
117
+ write_annotation decl.annotations
118
+ puts "type #{decl.name} = #{decl.type}"
90
119
 
91
120
  when AST::Declarations::Interface
92
- write_comment decl.comment, level: 0
93
- write_annotation decl.annotations, level: 0
94
- out.puts "interface #{name_and_params(decl.name, decl.type_params)}"
95
- decl.members.each.with_index do |member, index|
96
- if index > 0
97
- out.puts
121
+ write_comment decl.comment
122
+ write_annotation decl.annotations
123
+
124
+ puts "interface #{name_and_params(decl.name, decl.type_params)}"
125
+
126
+ indent do
127
+ decl.members.each.with_index do |member, index|
128
+ if index > 0
129
+ puts
130
+ end
131
+ write_member member
98
132
  end
99
- write_member member
100
133
  end
101
- out.puts "end"
134
+
135
+ puts "end"
102
136
 
103
137
  when AST::Declarations::Extension
104
- write_comment decl.comment, level: 0
105
- write_annotation decl.annotations, level: 0
106
- out.puts "extension #{name_and_args(decl.name, decl.type_params)} (#{decl.extension_name})"
107
- decl.members.each.with_index do |member, index|
108
- if index > 0
109
- out.puts
110
- end
111
- write_member member
112
- end
113
- out.puts "end"
138
+ RBS.logger.warn "Extension is ignored: #{decl.name}"
139
+
114
140
  end
115
141
  end
116
142
 
@@ -151,52 +177,54 @@ module RBS
151
177
  def write_member(member)
152
178
  case member
153
179
  when AST::Members::Include
154
- write_comment member.comment, level: 2
155
- write_annotation member.annotations, level: 2
156
- out.puts " include #{name_and_args(member.name, member.args)}"
180
+ write_comment member.comment
181
+ write_annotation member.annotations
182
+ puts "include #{name_and_args(member.name, member.args)}"
157
183
  when AST::Members::Extend
158
- write_comment member.comment, level: 2
159
- write_annotation member.annotations, level: 2
160
- out.puts " extend #{name_and_args(member.name, member.args)}"
184
+ write_comment member.comment
185
+ write_annotation member.annotations
186
+ puts "extend #{name_and_args(member.name, member.args)}"
161
187
  when AST::Members::Prepend
162
- write_comment member.comment, level: 2
163
- write_annotation member.annotations, level: 2
164
- out.puts " prepend #{name_and_args(member.name, member.args)}"
188
+ write_comment member.comment
189
+ write_annotation member.annotations
190
+ puts "prepend #{name_and_args(member.name, member.args)}"
165
191
  when AST::Members::AttrAccessor
166
- write_comment member.comment, level: 2
167
- write_annotation member.annotations, level: 2
168
- out.puts " #{attribute(:accessor, member)}"
192
+ write_comment member.comment
193
+ write_annotation member.annotations
194
+ puts "#{attribute(:accessor, member)}"
169
195
  when AST::Members::AttrReader
170
- write_comment member.comment, level: 2
171
- write_annotation member.annotations, level: 2
172
- out.puts " #{attribute(:reader, member)}"
196
+ write_comment member.comment
197
+ write_annotation member.annotations
198
+ puts "#{attribute(:reader, member)}"
173
199
  when AST::Members::AttrWriter
174
- write_comment member.comment, level: 2
175
- write_annotation member.annotations, level: 2
176
- out.puts " #{attribute(:writer, member)}"
200
+ write_comment member.comment
201
+ write_annotation member.annotations
202
+ puts "#{attribute(:writer, member)}"
177
203
  when AST::Members::Public
178
- out.puts " public"
204
+ puts "public"
179
205
  when AST::Members::Private
180
- out.puts " private"
206
+ puts "private"
181
207
  when AST::Members::Alias
182
- write_comment member.comment, level: 2
183
- write_annotation member.annotations, level: 2
208
+ write_comment member.comment
209
+ write_annotation member.annotations
184
210
  new_name = member.singleton? ? "self.#{member.new_name}" : member.new_name
185
211
  old_name = member.singleton? ? "self.#{member.old_name}" : member.old_name
186
- out.puts " alias #{new_name} #{old_name}"
212
+ puts "alias #{new_name} #{old_name}"
187
213
  when AST::Members::InstanceVariable
188
- write_comment member.comment, level: 2
189
- out.puts " #{member.name}: #{member.type}"
214
+ write_comment member.comment
215
+ puts "#{member.name}: #{member.type}"
190
216
  when AST::Members::ClassInstanceVariable
191
- write_comment member.comment, level: 2
192
- out.puts " self.#{member.name}: #{member.type}"
217
+ write_comment member.comment
218
+ puts "self.#{member.name}: #{member.type}"
193
219
  when AST::Members::ClassVariable
194
- write_comment member.comment, level: 2
195
- out.puts " #{member.name}: #{member.type}"
220
+ write_comment member.comment
221
+ puts "#{member.name}: #{member.type}"
196
222
  when AST::Members::MethodDefinition
197
- write_comment member.comment, level: 2
198
- write_annotation member.annotations, level: 2
223
+ write_comment member.comment
224
+ write_annotation member.annotations
199
225
  write_def member
226
+ else
227
+ write_decl member
200
228
  end
201
229
  end
202
230
 
@@ -220,18 +248,26 @@ module RBS
220
248
  "self.#{method_name(member.name)}"
221
249
  end
222
250
 
251
+ string = ""
252
+
223
253
  attrs = member.attributes.empty? ? "" : member.attributes.join(" ") + " "
224
- prefix = " #{attrs}def #{name}:"
254
+ overload = member.overload? ? "overload " : ""
255
+ prefix = "#{overload}#{attrs}def #{name}:"
225
256
  padding = " " * (prefix.size-1)
226
257
 
227
- out.print prefix
258
+ string << prefix
228
259
 
229
260
  member.types.each.with_index do |type, index|
230
261
  if index > 0
231
- out.print padding
232
- out.print "|"
262
+ string << padding
263
+ string << "|"
233
264
  end
234
- out.puts " #{type}"
265
+
266
+ string << " #{type}\n"
267
+ end
268
+
269
+ string.each_line do |line|
270
+ puts line.chomp
235
271
  end
236
272
  end
237
273
 
@@ -255,14 +291,14 @@ module RBS
255
291
  # When the signature is not constructed by the parser,
256
292
  # it always inserts an empty line.
257
293
  if !prev.location || !decl.location
258
- out.puts
294
+ puts
259
295
  return
260
296
  end
261
297
 
262
298
  prev_end_line = prev.location.end_line
263
299
  start_line = decl.location.start_line
264
300
  if start_line - prev_end_line > 1
265
- out.puts
301
+ puts
266
302
  end
267
303
  end
268
304
  end