steep 0.14.0 → 0.16.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (211) hide show
  1. checksums.yaml +4 -4
  2. data/.gitmodules +0 -3
  3. data/CHANGELOG.md +25 -0
  4. data/Rakefile +0 -13
  5. data/bin/setup +0 -2
  6. data/bin/smoke_runner.rb +0 -1
  7. data/exe/steep +0 -1
  8. data/lib/steep.rb +18 -2
  9. data/lib/steep/annotation_parser.rb +4 -4
  10. data/lib/steep/ast/buffer.rb +11 -7
  11. data/lib/steep/ast/builtin.rb +8 -0
  12. data/lib/steep/ast/types/factory.rb +55 -55
  13. data/lib/steep/cli.rb +16 -1
  14. data/lib/steep/drivers/annotations.rb +1 -1
  15. data/lib/steep/drivers/check.rb +20 -4
  16. data/lib/steep/drivers/langserver.rb +13 -457
  17. data/lib/steep/drivers/utils/driver_helper.rb +1 -1
  18. data/lib/steep/drivers/vendor.rb +2 -2
  19. data/lib/steep/drivers/watch.rb +97 -85
  20. data/lib/steep/drivers/worker.rb +51 -0
  21. data/lib/steep/project.rb +9 -5
  22. data/lib/steep/project/completion_provider.rb +9 -13
  23. data/lib/steep/project/dsl.rb +14 -0
  24. data/lib/steep/project/file.rb +43 -46
  25. data/lib/steep/project/hover_content.rb +17 -8
  26. data/lib/steep/project/options.rb +25 -3
  27. data/lib/steep/project/target.rb +40 -24
  28. data/lib/steep/server/base_worker.rb +56 -0
  29. data/lib/steep/server/code_worker.rb +151 -0
  30. data/lib/steep/server/interaction_worker.rb +281 -0
  31. data/lib/steep/server/master.rb +196 -0
  32. data/lib/steep/server/signature_worker.rb +148 -0
  33. data/lib/steep/server/utils.rb +36 -0
  34. data/lib/steep/server/worker_process.rb +62 -0
  35. data/lib/steep/signature/errors.rb +1 -1
  36. data/lib/steep/signature/validator.rb +13 -13
  37. data/lib/steep/source.rb +1 -1
  38. data/lib/steep/type_construction.rb +996 -726
  39. data/lib/steep/type_inference/constant_env.rb +3 -11
  40. data/lib/steep/type_inference/context.rb +8 -3
  41. data/lib/steep/type_inference/context_array.rb +111 -0
  42. data/lib/steep/type_inference/local_variable_type_env.rb +226 -0
  43. data/lib/steep/type_inference/logic.rb +130 -0
  44. data/lib/steep/type_inference/type_env.rb +5 -69
  45. data/lib/steep/typing.rb +79 -22
  46. data/lib/steep/version.rb +1 -1
  47. data/smoke/alias/Steepfile +1 -0
  48. data/smoke/and/Steepfile +1 -0
  49. data/smoke/array/Steepfile +1 -0
  50. data/smoke/array/b.rb +0 -2
  51. data/smoke/block/Steepfile +1 -0
  52. data/smoke/case/Steepfile +1 -0
  53. data/smoke/class/Steepfile +1 -0
  54. data/smoke/const/Steepfile +1 -0
  55. data/smoke/dstr/Steepfile +1 -0
  56. data/smoke/ensure/Steepfile +1 -0
  57. data/smoke/enumerator/Steepfile +1 -0
  58. data/smoke/extension/Steepfile +1 -0
  59. data/smoke/extension/c.rb +1 -0
  60. data/smoke/hash/Steepfile +1 -0
  61. data/smoke/hello/Steepfile +1 -0
  62. data/smoke/if/Steepfile +1 -0
  63. data/smoke/if/a.rb +1 -1
  64. data/smoke/implements/Steepfile +1 -0
  65. data/smoke/initialize/Steepfile +1 -0
  66. data/smoke/integer/Steepfile +1 -0
  67. data/smoke/interface/Steepfile +1 -0
  68. data/smoke/kwbegin/Steepfile +1 -0
  69. data/smoke/lambda/Steepfile +1 -0
  70. data/smoke/literal/Steepfile +1 -0
  71. data/smoke/map/Steepfile +1 -0
  72. data/smoke/method/Steepfile +1 -0
  73. data/smoke/module/Steepfile +1 -0
  74. data/smoke/regexp/Steepfile +1 -0
  75. data/smoke/regression/Steepfile +1 -0
  76. data/smoke/rescue/Steepfile +1 -0
  77. data/smoke/rescue/a.rb +1 -1
  78. data/smoke/self/Steepfile +1 -0
  79. data/smoke/skip/Steepfile +1 -0
  80. data/smoke/stdout/Steepfile +1 -0
  81. data/smoke/super/Steepfile +1 -0
  82. data/smoke/type_case/Steepfile +1 -0
  83. data/smoke/yield/Steepfile +1 -0
  84. data/steep.gemspec +7 -8
  85. metadata +26 -141
  86. data/exe/rbs +0 -3
  87. data/exe/ruby-signature +0 -3
  88. data/vendor/ruby-signature/.github/workflows/ruby.yml +0 -27
  89. data/vendor/ruby-signature/.gitignore +0 -12
  90. data/vendor/ruby-signature/.rubocop.yml +0 -15
  91. data/vendor/ruby-signature/BSDL +0 -22
  92. data/vendor/ruby-signature/COPYING +0 -56
  93. data/vendor/ruby-signature/Gemfile +0 -6
  94. data/vendor/ruby-signature/README.md +0 -93
  95. data/vendor/ruby-signature/Rakefile +0 -67
  96. data/vendor/ruby-signature/bin/annotate-with-rdoc +0 -156
  97. data/vendor/ruby-signature/bin/console +0 -14
  98. data/vendor/ruby-signature/bin/query-rdoc +0 -103
  99. data/vendor/ruby-signature/bin/setup +0 -10
  100. data/vendor/ruby-signature/bin/sort +0 -88
  101. data/vendor/ruby-signature/bin/test_runner.rb +0 -17
  102. data/vendor/ruby-signature/docs/CONTRIBUTING.md +0 -97
  103. data/vendor/ruby-signature/docs/sigs.md +0 -148
  104. data/vendor/ruby-signature/docs/stdlib.md +0 -152
  105. data/vendor/ruby-signature/docs/syntax.md +0 -528
  106. data/vendor/ruby-signature/exe/rbs +0 -3
  107. data/vendor/ruby-signature/exe/ruby-signature +0 -7
  108. data/vendor/ruby-signature/lib/ruby/signature.rb +0 -64
  109. data/vendor/ruby-signature/lib/ruby/signature/ast/annotation.rb +0 -29
  110. data/vendor/ruby-signature/lib/ruby/signature/ast/comment.rb +0 -29
  111. data/vendor/ruby-signature/lib/ruby/signature/ast/declarations.rb +0 -391
  112. data/vendor/ruby-signature/lib/ruby/signature/ast/members.rb +0 -364
  113. data/vendor/ruby-signature/lib/ruby/signature/buffer.rb +0 -52
  114. data/vendor/ruby-signature/lib/ruby/signature/builtin_names.rb +0 -54
  115. data/vendor/ruby-signature/lib/ruby/signature/cli.rb +0 -555
  116. data/vendor/ruby-signature/lib/ruby/signature/constant.rb +0 -28
  117. data/vendor/ruby-signature/lib/ruby/signature/constant_table.rb +0 -152
  118. data/vendor/ruby-signature/lib/ruby/signature/definition.rb +0 -172
  119. data/vendor/ruby-signature/lib/ruby/signature/definition_builder.rb +0 -921
  120. data/vendor/ruby-signature/lib/ruby/signature/environment.rb +0 -283
  121. data/vendor/ruby-signature/lib/ruby/signature/environment_loader.rb +0 -138
  122. data/vendor/ruby-signature/lib/ruby/signature/environment_walker.rb +0 -126
  123. data/vendor/ruby-signature/lib/ruby/signature/errors.rb +0 -189
  124. data/vendor/ruby-signature/lib/ruby/signature/location.rb +0 -104
  125. data/vendor/ruby-signature/lib/ruby/signature/method_type.rb +0 -125
  126. data/vendor/ruby-signature/lib/ruby/signature/namespace.rb +0 -93
  127. data/vendor/ruby-signature/lib/ruby/signature/parser.y +0 -1344
  128. data/vendor/ruby-signature/lib/ruby/signature/prototype/rb.rb +0 -444
  129. data/vendor/ruby-signature/lib/ruby/signature/prototype/rbi.rb +0 -579
  130. data/vendor/ruby-signature/lib/ruby/signature/prototype/runtime.rb +0 -383
  131. data/vendor/ruby-signature/lib/ruby/signature/substitution.rb +0 -48
  132. data/vendor/ruby-signature/lib/ruby/signature/test.rb +0 -28
  133. data/vendor/ruby-signature/lib/ruby/signature/test/errors.rb +0 -63
  134. data/vendor/ruby-signature/lib/ruby/signature/test/hook.rb +0 -290
  135. data/vendor/ruby-signature/lib/ruby/signature/test/setup.rb +0 -58
  136. data/vendor/ruby-signature/lib/ruby/signature/test/spy.rb +0 -327
  137. data/vendor/ruby-signature/lib/ruby/signature/test/test_helper.rb +0 -185
  138. data/vendor/ruby-signature/lib/ruby/signature/test/type_check.rb +0 -256
  139. data/vendor/ruby-signature/lib/ruby/signature/type_name.rb +0 -72
  140. data/vendor/ruby-signature/lib/ruby/signature/types.rb +0 -932
  141. data/vendor/ruby-signature/lib/ruby/signature/variance_calculator.rb +0 -140
  142. data/vendor/ruby-signature/lib/ruby/signature/vendorer.rb +0 -49
  143. data/vendor/ruby-signature/lib/ruby/signature/version.rb +0 -5
  144. data/vendor/ruby-signature/lib/ruby/signature/writer.rb +0 -271
  145. data/vendor/ruby-signature/ruby-signature.gemspec +0 -45
  146. data/vendor/ruby-signature/stdlib/abbrev/abbrev.rbs +0 -3
  147. data/vendor/ruby-signature/stdlib/base64/base64.rbs +0 -15
  148. data/vendor/ruby-signature/stdlib/builtin/array.rbs +0 -1997
  149. data/vendor/ruby-signature/stdlib/builtin/basic_object.rbs +0 -280
  150. data/vendor/ruby-signature/stdlib/builtin/binding.rbs +0 -177
  151. data/vendor/ruby-signature/stdlib/builtin/builtin.rbs +0 -35
  152. data/vendor/ruby-signature/stdlib/builtin/class.rbs +0 -145
  153. data/vendor/ruby-signature/stdlib/builtin/comparable.rbs +0 -116
  154. data/vendor/ruby-signature/stdlib/builtin/complex.rbs +0 -400
  155. data/vendor/ruby-signature/stdlib/builtin/constants.rbs +0 -37
  156. data/vendor/ruby-signature/stdlib/builtin/data.rbs +0 -5
  157. data/vendor/ruby-signature/stdlib/builtin/deprecated.rbs +0 -2
  158. data/vendor/ruby-signature/stdlib/builtin/dir.rbs +0 -419
  159. data/vendor/ruby-signature/stdlib/builtin/encoding.rbs +0 -606
  160. data/vendor/ruby-signature/stdlib/builtin/enumerable.rbs +0 -404
  161. data/vendor/ruby-signature/stdlib/builtin/enumerator.rbs +0 -260
  162. data/vendor/ruby-signature/stdlib/builtin/errno.rbs +0 -781
  163. data/vendor/ruby-signature/stdlib/builtin/errors.rbs +0 -582
  164. data/vendor/ruby-signature/stdlib/builtin/exception.rbs +0 -193
  165. data/vendor/ruby-signature/stdlib/builtin/false_class.rbs +0 -40
  166. data/vendor/ruby-signature/stdlib/builtin/fiber.rbs +0 -68
  167. data/vendor/ruby-signature/stdlib/builtin/fiber_error.rbs +0 -12
  168. data/vendor/ruby-signature/stdlib/builtin/file.rbs +0 -476
  169. data/vendor/ruby-signature/stdlib/builtin/file_test.rbs +0 -59
  170. data/vendor/ruby-signature/stdlib/builtin/float.rbs +0 -696
  171. data/vendor/ruby-signature/stdlib/builtin/gc.rbs +0 -121
  172. data/vendor/ruby-signature/stdlib/builtin/hash.rbs +0 -1029
  173. data/vendor/ruby-signature/stdlib/builtin/integer.rbs +0 -710
  174. data/vendor/ruby-signature/stdlib/builtin/io.rbs +0 -683
  175. data/vendor/ruby-signature/stdlib/builtin/kernel.rbs +0 -574
  176. data/vendor/ruby-signature/stdlib/builtin/marshal.rbs +0 -135
  177. data/vendor/ruby-signature/stdlib/builtin/match_data.rbs +0 -271
  178. data/vendor/ruby-signature/stdlib/builtin/math.rbs +0 -66
  179. data/vendor/ruby-signature/stdlib/builtin/method.rbs +0 -182
  180. data/vendor/ruby-signature/stdlib/builtin/module.rbs +0 -248
  181. data/vendor/ruby-signature/stdlib/builtin/nil_class.rbs +0 -82
  182. data/vendor/ruby-signature/stdlib/builtin/numeric.rbs +0 -409
  183. data/vendor/ruby-signature/stdlib/builtin/object.rbs +0 -824
  184. data/vendor/ruby-signature/stdlib/builtin/proc.rbs +0 -426
  185. data/vendor/ruby-signature/stdlib/builtin/process.rbs +0 -354
  186. data/vendor/ruby-signature/stdlib/builtin/random.rbs +0 -93
  187. data/vendor/ruby-signature/stdlib/builtin/range.rbs +0 -226
  188. data/vendor/ruby-signature/stdlib/builtin/rational.rbs +0 -424
  189. data/vendor/ruby-signature/stdlib/builtin/rb_config.rbs +0 -10
  190. data/vendor/ruby-signature/stdlib/builtin/regexp.rbs +0 -1083
  191. data/vendor/ruby-signature/stdlib/builtin/ruby_vm.rbs +0 -14
  192. data/vendor/ruby-signature/stdlib/builtin/signal.rbs +0 -55
  193. data/vendor/ruby-signature/stdlib/builtin/string.rbs +0 -1894
  194. data/vendor/ruby-signature/stdlib/builtin/string_io.rbs +0 -13
  195. data/vendor/ruby-signature/stdlib/builtin/struct.rbs +0 -40
  196. data/vendor/ruby-signature/stdlib/builtin/symbol.rbs +0 -230
  197. data/vendor/ruby-signature/stdlib/builtin/thread.rbs +0 -1112
  198. data/vendor/ruby-signature/stdlib/builtin/thread_group.rbs +0 -23
  199. data/vendor/ruby-signature/stdlib/builtin/time.rbs +0 -739
  200. data/vendor/ruby-signature/stdlib/builtin/trace_point.rbs +0 -91
  201. data/vendor/ruby-signature/stdlib/builtin/true_class.rbs +0 -46
  202. data/vendor/ruby-signature/stdlib/builtin/unbound_method.rbs +0 -159
  203. data/vendor/ruby-signature/stdlib/builtin/warning.rbs +0 -17
  204. data/vendor/ruby-signature/stdlib/erb/erb.rbs +0 -18
  205. data/vendor/ruby-signature/stdlib/find/find.rbs +0 -44
  206. data/vendor/ruby-signature/stdlib/pathname/pathname.rbs +0 -21
  207. data/vendor/ruby-signature/stdlib/prime/integer-extension.rbs +0 -23
  208. data/vendor/ruby-signature/stdlib/prime/prime.rbs +0 -188
  209. data/vendor/ruby-signature/stdlib/securerandom/securerandom.rbs +0 -9
  210. data/vendor/ruby-signature/stdlib/set/set.rbs +0 -77
  211. data/vendor/ruby-signature/stdlib/tmpdir/tmpdir.rbs +0 -53
@@ -1,140 +0,0 @@
1
- module Ruby
2
- module Signature
3
- class VarianceCalculator
4
- class Result
5
- attr_reader :result
6
-
7
- def initialize(variables:)
8
- @result = {}
9
- variables.each do |x|
10
- result[x] = :unused
11
- end
12
- end
13
-
14
- def covariant(x)
15
- case result[x]
16
- when :unused
17
- result[x] = :covariant
18
- when :contravariant
19
- result[x] = :invariant
20
- end
21
- end
22
-
23
- def contravariant(x)
24
- case result[x]
25
- when :unused
26
- result[x] = :contravariant
27
- when :covariant
28
- result[x] = :invariant
29
- end
30
- end
31
-
32
- def invariant(x)
33
- result[x] = :invariant
34
- end
35
-
36
- def each(&block)
37
- result.each(&block)
38
- end
39
-
40
- def include?(name)
41
- result.key?(name)
42
- end
43
-
44
- def compatible?(var, with_annotation:)
45
- variance = result[var]
46
-
47
- case
48
- when variance == :unused
49
- true
50
- when with_annotation == :invariant
51
- true
52
- when variance == with_annotation
53
- true
54
- else
55
- false
56
- end
57
- end
58
- end
59
-
60
- attr_reader :builder
61
-
62
- def initialize(builder:)
63
- @builder = builder
64
- end
65
-
66
- def env
67
- builder.env
68
- end
69
-
70
- def in_method_type(method_type:, variables:)
71
- result = Result.new(variables: variables)
72
-
73
- method_type.type.each_param do |param|
74
- type(param.type, result: result, context: :contravariant)
75
- end
76
-
77
- if method_type.block
78
- method_type.block.type.each_param do |param|
79
- type(param.type, result: result, context: :covariant)
80
- end
81
- type(method_type.block.type.return_type, result: result, context: :contravariant)
82
- end
83
-
84
- type(method_type.type.return_type, result: result, context: :covariant)
85
-
86
- result
87
- end
88
-
89
- def in_inherit(name:, args:, variables:)
90
- type = Types::ClassInstance.new(name: name, args: args, location: nil)
91
-
92
- Result.new(variables: variables).tap do |result|
93
- type(type, result: result, context: :covariant)
94
- end
95
- end
96
-
97
- def type(type, result:, context:)
98
- case type
99
- when Types::Variable
100
- if result.include?(type.name)
101
- case context
102
- when :covariant
103
- result.covariant(type.name)
104
- when :contravariant
105
- result.contravariant(type.name)
106
- when :invariant
107
- result.invariant(type.name)
108
- end
109
- end
110
- when Types::ClassInstance, Types::Interface
111
- decl = env.find_class(type.name)
112
- type.args.each.with_index do |ty, i|
113
- var = decl.type_params.params[i]
114
- case var.variance
115
- when :invariant
116
- type(ty, result: result, context: :invariant)
117
- when :covariant
118
- type(ty, result: result, context: context)
119
- when :contravariant
120
- con = case context
121
- when :invariant
122
- :invariant
123
- when :covariant
124
- :contravariant
125
- when :contravariant
126
- :covariant
127
- end
128
- type(ty, result: result, context: con)
129
- end
130
- end
131
- when Types::Tuple, Types::Record, Types::Union, Types::Intersection
132
- # Covariant types
133
- type.each_type do |ty|
134
- type(ty, result: result, context: context)
135
- end
136
- end
137
- end
138
- end
139
- end
140
- end
@@ -1,49 +0,0 @@
1
- module Ruby
2
- module Signature
3
- class Vendorer
4
- attr_reader :vendor_dir
5
-
6
- def initialize(vendor_dir:)
7
- @vendor_dir = vendor_dir
8
- end
9
-
10
- def ensure_dir
11
- unless vendor_dir.directory?
12
- vendor_dir.mkpath
13
- end
14
-
15
- yield
16
- end
17
-
18
- def clean!
19
- ensure_dir do
20
- Signature.logger.info "Cleaning vendor root: #{vendor_dir}..."
21
- vendor_dir.rmtree
22
- end
23
- end
24
-
25
- def stdlib!()
26
- ensure_dir do
27
- Signature.logger.info "Vendoring stdlib: #{EnvironmentLoader::STDLIB_ROOT} => #{vendor_dir + "stdlib"}..."
28
- FileUtils.copy_entry EnvironmentLoader::STDLIB_ROOT, vendor_dir + "stdlib"
29
- end
30
- end
31
-
32
- def gem!(name, version)
33
- ensure_dir do
34
- sig_path = EnvironmentLoader.gem_sig_path(name, version)
35
- Signature.logger.debug "Checking gem signature path: name=#{name}, version=#{version}, path=#{sig_path}"
36
-
37
- if sig_path&.directory?
38
- gems_dir = vendor_dir + "gems"
39
- gems_dir.mkpath unless gems_dir.directory?
40
-
41
- gem_dir = gems_dir + name
42
- Signature.logger.info "Vendoring gem(#{name}:#{version}): #{sig_path} => #{gem_dir}..."
43
- FileUtils.copy_entry sig_path, gem_dir
44
- end
45
- end
46
- end
47
- end
48
- end
49
- end
@@ -1,5 +0,0 @@
1
- module Ruby
2
- module Signature
3
- VERSION = "0.1.0"
4
- end
5
- end
@@ -1,271 +0,0 @@
1
- module Ruby
2
- module Signature
3
- class Writer
4
- attr_reader :out
5
-
6
- def initialize(out:)
7
- @out = out
8
- end
9
-
10
- def write_annotation(annotations, level:)
11
- prefix = " " * level
12
-
13
- annotations.each do |annotation|
14
- string = annotation.string
15
- case
16
- when string !~ /\}/
17
- out.puts "#{prefix}%a{#{string}}"
18
- when string !~ /\)/
19
- out.puts "#{prefix}%a(#{string})"
20
- when string !~ /\]/
21
- out.puts "#{prefix}%a[#{string}]"
22
- when string !~ /\>/
23
- out.puts "#{prefix}%a<#{string}>"
24
- when string !~ /\|/
25
- out.puts "#{prefix}%a|#{string}|"
26
- end
27
- end
28
- end
29
-
30
- def write_comment(comment, level:)
31
- if comment
32
- prefix = " " * level
33
- comment.string.lines.each do |line|
34
- line = " #{line}" unless line.chomp.empty?
35
- out.puts "#{prefix}##{line}"
36
- end
37
- end
38
- end
39
-
40
- def write(decls)
41
- [nil, *decls].each_cons(2) do |prev, decl|
42
- preserve_empty_line(prev, decl)
43
- write_decl decl
44
- end
45
- end
46
-
47
- def write_decl(decl)
48
- case decl
49
- when AST::Declarations::Class
50
- super_class = if decl.super_class
51
- " < #{name_and_args(decl.super_class.name, decl.super_class.args)}"
52
- end
53
- write_comment decl.comment, level: 0
54
- write_annotation decl.annotations, level: 0
55
- out.puts "class #{name_and_params(decl.name, decl.type_params)}#{super_class}"
56
-
57
- [nil, *decl.members].each_cons(2) do |prev, member|
58
- preserve_empty_line prev, member
59
- write_member member
60
- end
61
-
62
- out.puts "end"
63
-
64
- when AST::Declarations::Module
65
- self_type = if decl.self_type
66
- " : #{decl.self_type}"
67
- end
68
-
69
- write_comment decl.comment, level: 0
70
- write_annotation decl.annotations, level: 0
71
- out.puts "module #{name_and_params(decl.name, decl.type_params)}#{self_type}"
72
- decl.members.each.with_index do |member, index|
73
- if index > 0
74
- out.puts
75
- end
76
- write_member member
77
- end
78
- out.puts "end"
79
- when AST::Declarations::Constant
80
- write_comment decl.comment, level: 0
81
- out.puts "#{decl.name}: #{decl.type}"
82
-
83
- when AST::Declarations::Global
84
- write_comment decl.comment, level: 0
85
- out.puts "#{decl.name}: #{decl.type}"
86
-
87
- when AST::Declarations::Alias
88
- write_comment decl.comment, level: 0
89
- write_annotation decl.annotations, level: 0
90
- out.puts "type #{decl.name} = #{decl.type}"
91
-
92
- when AST::Declarations::Interface
93
- write_comment decl.comment, level: 0
94
- write_annotation decl.annotations, level: 0
95
- out.puts "interface #{name_and_params(decl.name, decl.type_params)}"
96
- decl.members.each.with_index do |member, index|
97
- if index > 0
98
- out.puts
99
- end
100
- write_member member
101
- end
102
- out.puts "end"
103
-
104
- when AST::Declarations::Extension
105
- write_comment decl.comment, level: 0
106
- write_annotation decl.annotations, level: 0
107
- out.puts "extension #{name_and_args(decl.name, decl.type_params)} (#{decl.extension_name})"
108
- decl.members.each.with_index do |member, index|
109
- if index > 0
110
- out.puts
111
- end
112
- write_member member
113
- end
114
- out.puts "end"
115
- end
116
- end
117
-
118
- def name_and_params(name, params)
119
- if params.empty?
120
- "#{name}"
121
- else
122
- ps = params.each.map do |param|
123
- s = ""
124
- if param.skip_validation
125
- s << "unchecked "
126
- end
127
- case param.variance
128
- when :invariant
129
- # nop
130
- when :covariant
131
- s << "out "
132
- when :contravariant
133
- s << "in "
134
- end
135
- s + param.name.to_s
136
- end
137
-
138
- "#{name}[#{ps.join(", ")}]"
139
- end
140
- end
141
-
142
- def name_and_args(name, args)
143
- if name && args
144
- if args.empty?
145
- "#{name}"
146
- else
147
- "#{name}[#{args.join(", ")}]"
148
- end
149
- end
150
- end
151
-
152
- def write_member(member)
153
- case member
154
- when AST::Members::Include
155
- write_comment member.comment, level: 2
156
- write_annotation member.annotations, level: 2
157
- out.puts " include #{name_and_args(member.name, member.args)}"
158
- when AST::Members::Extend
159
- write_comment member.comment, level: 2
160
- write_annotation member.annotations, level: 2
161
- out.puts " extend #{name_and_args(member.name, member.args)}"
162
- when AST::Members::Prepend
163
- write_comment member.comment, level: 2
164
- write_annotation member.annotations, level: 2
165
- out.puts " prepend #{name_and_args(member.name, member.args)}"
166
- when AST::Members::AttrAccessor
167
- write_comment member.comment, level: 2
168
- write_annotation member.annotations, level: 2
169
- out.puts " #{attribute(:accessor, member)}"
170
- when AST::Members::AttrReader
171
- write_comment member.comment, level: 2
172
- write_annotation member.annotations, level: 2
173
- out.puts " #{attribute(:reader, member)}"
174
- when AST::Members::AttrWriter
175
- write_comment member.comment, level: 2
176
- write_annotation member.annotations, level: 2
177
- out.puts " #{attribute(:writer, member)}"
178
- when AST::Members::Public
179
- out.puts " public"
180
- when AST::Members::Private
181
- out.puts " private"
182
- when AST::Members::Alias
183
- write_comment member.comment, level: 2
184
- write_annotation member.annotations, level: 2
185
- new_name = member.singleton? ? "self.#{member.new_name}" : member.new_name
186
- old_name = member.singleton? ? "self.#{member.old_name}" : member.old_name
187
- out.puts " alias #{new_name} #{old_name}"
188
- when AST::Members::InstanceVariable
189
- write_comment member.comment, level: 2
190
- out.puts " #{member.name}: #{member.type}"
191
- when AST::Members::ClassInstanceVariable
192
- write_comment member.comment, level: 2
193
- out.puts " self.#{member.name}: #{member.type}"
194
- when AST::Members::ClassVariable
195
- write_comment member.comment, level: 2
196
- out.puts " #{member.name}: #{member.type}"
197
- when AST::Members::MethodDefinition
198
- write_comment member.comment, level: 2
199
- write_annotation member.annotations, level: 2
200
- write_def member
201
- end
202
- end
203
-
204
- def method_name(name)
205
- s = name.to_s
206
-
207
- if /\A#{Parser::KEYWORDS_RE}\z/.match?(s)
208
- "`#{s}`"
209
- else
210
- s
211
- end
212
- end
213
-
214
- def write_def(member)
215
- name = case member.kind
216
- when :instance
217
- "#{method_name(member.name)}"
218
- when :singleton_instance
219
- "self?.#{method_name(member.name)}"
220
- when :singleton
221
- "self.#{method_name(member.name)}"
222
- end
223
-
224
- attrs = member.attributes.empty? ? "" : member.attributes.join(" ") + " "
225
- prefix = " #{attrs}def #{name}:"
226
- padding = " " * (prefix.size-1)
227
-
228
- out.print prefix
229
-
230
- member.types.each.with_index do |type, index|
231
- if index > 0
232
- out.print padding
233
- out.print "|"
234
- end
235
- out.puts " #{type}"
236
- end
237
- end
238
-
239
- def attribute(kind, attr)
240
- var = case attr.ivar_name
241
- when nil
242
- ""
243
- when false
244
- "()"
245
- else
246
- "(#{attr.ivar_name})"
247
- end
248
- "attr_#{kind} #{attr.name}#{var}: #{attr.type}"
249
- end
250
-
251
- def preserve_empty_line(prev, decl)
252
- return unless prev
253
-
254
- decl = decl.comment if decl.respond_to?(:comment) && decl.comment
255
-
256
- # When the signature is not constructed by the parser,
257
- # it always inserts an empty line.
258
- if !prev.location || !decl.location
259
- out.puts
260
- return
261
- end
262
-
263
- prev_end_line = prev.location.end_line
264
- start_line = decl.location.start_line
265
- if start_line - prev_end_line > 1
266
- out.puts
267
- end
268
- end
269
- end
270
- end
271
- end