steep 1.4.0.dev.2 → 1.4.0.dev.4

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 +1 -2
  3. data/Gemfile +1 -1
  4. data/Gemfile.lock +9 -11
  5. data/Gemfile.steep +1 -2
  6. data/Gemfile.steep.lock +11 -14
  7. data/README.md +7 -1
  8. data/Steepfile +0 -3
  9. data/bin/rbs +0 -1
  10. data/guides/README.md +5 -0
  11. data/guides/src/gem-rbs-collection/gem-rbs-collection.md +143 -0
  12. data/guides/src/getting-started/getting-started.md +164 -0
  13. data/guides/src/nil-optional/nil-optional.md +195 -0
  14. data/lib/steep/diagnostic/ruby.rb +80 -6
  15. data/lib/steep/drivers/check.rb +4 -4
  16. data/lib/steep/interface/block.rb +10 -0
  17. data/lib/steep/interface/builder.rb +3 -3
  18. data/lib/steep/method_name.rb +8 -0
  19. data/lib/steep/module_helper.rb +13 -11
  20. data/lib/steep/path_helper.rb +4 -0
  21. data/lib/steep/server/interaction_worker.rb +197 -230
  22. data/lib/steep/server/lsp_formatter.rb +308 -154
  23. data/lib/steep/server/master.rb +4 -1
  24. data/lib/steep/services/completion_provider.rb +140 -103
  25. data/lib/steep/services/hover_provider/rbs.rb +37 -32
  26. data/lib/steep/services/signature_help_provider.rb +108 -0
  27. data/lib/steep/services/type_name_completion.rb +165 -0
  28. data/lib/steep/source.rb +1 -0
  29. data/lib/steep/type_construction.rb +460 -266
  30. data/lib/steep/type_inference/block_params.rb +13 -0
  31. data/lib/steep/type_inference/context.rb +3 -3
  32. data/lib/steep/type_inference/method_call.rb +1 -1
  33. data/lib/steep/type_inference/method_params.rb +42 -16
  34. data/lib/steep/type_inference/send_args.rb +80 -51
  35. data/lib/steep/type_inference/type_env.rb +12 -4
  36. data/lib/steep/version.rb +1 -1
  37. data/lib/steep.rb +2 -0
  38. data/rbs_collection.steep.lock.yaml +0 -28
  39. data/rbs_collection.steep.yaml +10 -9
  40. data/sample/Steepfile +2 -0
  41. data/sample/lib/conference.rb +12 -0
  42. data/sample/sig/conference.rbs +5 -0
  43. data/sig/shims/language-server_protocol.rbs +277 -0
  44. data/sig/shims/parser/nodes.rbs +37 -0
  45. data/sig/shims/parser.rbs +4 -0
  46. data/sig/shims/string.rbs +4 -0
  47. data/sig/steep/ast/types/factory.rbs +10 -8
  48. data/sig/steep/diagnostic/lsp_formatter.rbs +1 -1
  49. data/sig/steep/diagnostic/ruby.rbs +38 -2
  50. data/sig/steep/drivers/check.rbs +1 -1
  51. data/sig/steep/drivers/checkfile.rbs +1 -1
  52. data/sig/steep/drivers/diagnostic_printer.rbs +1 -1
  53. data/sig/steep/drivers/watch.rbs +1 -1
  54. data/sig/steep/index/signature_symbol_provider.rbs +1 -1
  55. data/sig/steep/interface/block.rbs +2 -0
  56. data/sig/steep/interface/builder.rbs +5 -3
  57. data/sig/steep/interface/method_type.rbs +5 -3
  58. data/sig/steep/method_name.rbs +5 -1
  59. data/sig/steep/module_helper.rbs +9 -0
  60. data/sig/steep/path_helper.rbs +3 -1
  61. data/sig/steep/server/base_worker.rbs +1 -1
  62. data/sig/steep/server/interaction_worker.rbs +52 -17
  63. data/sig/steep/server/lsp_formatter.rbs +43 -18
  64. data/sig/steep/server/master.rbs +1 -1
  65. data/sig/steep/server/type_check_worker.rbs +7 -5
  66. data/sig/steep/server/worker_process.rbs +6 -4
  67. data/sig/steep/services/completion_provider.rbs +106 -28
  68. data/sig/steep/services/hover_provider/rbs.rbs +13 -9
  69. data/sig/steep/services/signature_help_provider.rbs +39 -0
  70. data/sig/steep/services/type_name_completion.rbs +122 -0
  71. data/sig/steep/type_construction.rbs +99 -30
  72. data/sig/steep/type_inference/block_params.rbs +4 -0
  73. data/sig/steep/type_inference/context.rbs +70 -22
  74. data/sig/steep/type_inference/method_call.rbs +1 -1
  75. data/sig/steep/type_inference/method_params.rbs +43 -24
  76. data/sig/steep/type_inference/multiple_assignment.rbs +1 -1
  77. data/sig/steep/type_inference/send_args.rbs +19 -5
  78. data/sig/steep/typing.rbs +8 -3
  79. data/smoke/diagnostics/test_expectations.yml +1 -0
  80. data/steep.gemspec +0 -1
  81. metadata +12 -16
@@ -328,6 +328,19 @@ module Steep
328
328
  end
329
329
  end
330
330
 
331
+ def each_single_param()
332
+ each do |param|
333
+ case param
334
+ when Param
335
+ yield param
336
+ when MultipleParam
337
+ param.each_param do |p|
338
+ yield p
339
+ end
340
+ end
341
+ end
342
+ end
343
+
331
344
  def self.from_multiple(node, annotations)
332
345
  # @type var params: Array[Param | MultipleParam]
333
346
  params = []
@@ -6,16 +6,16 @@ module Steep
6
6
  attr_reader :method
7
7
  attr_reader :method_type
8
8
  attr_reader :return_type
9
- attr_reader :constructor
10
9
  attr_reader :super_method
10
+ attr_reader :forward_arg_type
11
11
 
12
- def initialize(name:, method:, method_type:, return_type:, constructor:, super_method:)
12
+ def initialize(name:, method:, method_type:, return_type:, super_method:, forward_arg_type:)
13
13
  @name = name
14
14
  @method = method
15
15
  @return_type = return_type
16
16
  @method_type = method_type
17
- @constructor = constructor
18
17
  @super_method = super_method
18
+ @forward_arg_type = forward_arg_type
19
19
  end
20
20
 
21
21
  def block_type
@@ -1,6 +1,6 @@
1
1
  module Steep
2
2
  module TypeInference
3
- class MethodCall
3
+ module MethodCall
4
4
  class MethodDecl
5
5
  attr_reader :method_name
6
6
  attr_reader :method_def
@@ -143,24 +143,34 @@ module Steep
143
143
  attr_reader :method_type
144
144
  attr_reader :params
145
145
  attr_reader :errors
146
+ attr_reader :forward_arg_type
146
147
 
147
- def initialize(args:, method_type:)
148
+ def initialize(args:, method_type:, forward_arg_type:)
148
149
  @args = args
149
150
  @method_type = method_type
150
151
  @params = {}
151
152
  @errors = []
153
+ @forward_arg_type = forward_arg_type
152
154
  end
153
155
 
154
156
  def [](name)
155
157
  params[name] or raise "Unknown variable name: #{name}"
156
158
  end
157
159
 
160
+ def param?(name)
161
+ params.key?(name)
162
+ end
163
+
158
164
  def size
159
165
  params.size
160
166
  end
161
167
 
162
168
  def each_param(&block)
163
- params.each_value(&block)
169
+ if block
170
+ params.each_value(&block)
171
+ else
172
+ params.each_value
173
+ end
164
174
  end
165
175
 
166
176
  def each
@@ -173,7 +183,12 @@ module Steep
173
183
  end
174
184
  end
175
185
 
186
+ def update(forward_arg_type: self.forward_arg_type)
187
+ MethodParams.new(args: args, method_type: method_type, forward_arg_type: forward_arg_type)
188
+ end
189
+
176
190
  def self.empty(node:)
191
+ # @type var args_node: ::Parser::AST::Node
177
192
  args_node =
178
193
  case node.type
179
194
  when :def
@@ -184,9 +199,10 @@ module Steep
184
199
  raise
185
200
  end
186
201
 
187
- params = new(args: args_node.children, method_type: nil)
202
+ params = new(args: args_node.children, method_type: nil, forward_arg_type: nil)
188
203
 
189
204
  args_node.children.each do |arg|
205
+ # @type var arg: ::Parser::AST::Node
190
206
  case arg.type
191
207
  when :arg, :optarg
192
208
  name = arg.children[0]
@@ -210,6 +226,7 @@ module Steep
210
226
  end
211
227
 
212
228
  def self.build(node:, method_type:)
229
+ # @type var args_node: ::Parser::AST::Node
213
230
  args_node =
214
231
  case node.type
215
232
  when :def
@@ -219,17 +236,17 @@ module Steep
219
236
  else
220
237
  raise
221
238
  end
222
- original = args_node.children
239
+ original = args_node.children #: Array[Parser::AST::Node]
223
240
  args = original.dup
224
241
 
225
- instance = new(args: original, method_type: method_type)
242
+ instance = new(args: original, method_type: method_type, forward_arg_type: nil)
226
243
 
227
244
  positional_params = method_type.type.params.positional_params
228
245
 
229
246
  loop do
230
- arg = args.first
247
+ arg = args.first or break
231
248
 
232
- case arg&.type
249
+ case arg.type
233
250
  when :arg
234
251
  name = arg.children[0]
235
252
  param = positional_params&.head
@@ -300,9 +317,14 @@ module Steep
300
317
  args.shift
301
318
  end
302
319
 
303
- if (arg = args.first)&.type == :restarg
320
+ if (arg = args.first) && arg.type == :forward_arg
321
+ forward_params = method_type.type.params.update(positional_params: positional_params)
322
+ return instance.update(forward_arg_type: [forward_params, method_type.block])
323
+ end
324
+
325
+ if (arg = args.first) && arg.type == :restarg
304
326
  name = arg.children[0]
305
- rest_types = []
327
+ rest_types = [] #: Array[AST::Types::t]
306
328
  has_error = false
307
329
 
308
330
  loop do
@@ -325,7 +347,11 @@ module Steep
325
347
  break
326
348
  end
327
349
 
328
- positional_params = positional_params.tail
350
+ if positional_params
351
+ positional_params = positional_params.tail
352
+ else
353
+ raise "Fatal error"
354
+ end
329
355
  end
330
356
 
331
357
  type = rest_types.empty? ? nil : AST::Types::Union.build(types: rest_types)
@@ -348,9 +374,9 @@ module Steep
348
374
  keywords = keyword_params.keywords
349
375
 
350
376
  loop do
351
- arg = args.first
377
+ arg = args.first or break
352
378
 
353
- case arg&.type
379
+ case arg.type
354
380
  when :kwarg
355
381
  name = arg.children[0]
356
382
 
@@ -421,9 +447,9 @@ module Steep
421
447
  args.shift
422
448
  end
423
449
 
424
- if (arg = args.first)&.type == :kwrestarg
450
+ if (arg = args.first) && arg.type == :kwrestarg
425
451
  name = arg.children[0]
426
- rest_types = []
452
+ rest_types = [] #: Array[AST::Types::t]
427
453
  has_error = false
428
454
 
429
455
  keywords.each do |keyword|
@@ -460,8 +486,8 @@ module Steep
460
486
  end
461
487
  end
462
488
 
463
- if (arg = args.first)&.type == :blockarg
464
- name = arg.children[0]
489
+ if (arg = args.first) && arg.type == :blockarg
490
+ name = arg.children[0] #: Symbol
465
491
 
466
492
  if method_type.block
467
493
  instance.params[name] = BlockParameter.new(
@@ -101,6 +101,9 @@ module Steep
101
101
 
102
102
  def next()
103
103
  case
104
+ when node && node.type == :forwarded_args
105
+ # If the node is a `:forwarded_args`, abort
106
+ nil
104
107
  when !node && param.is_a?(Interface::Function::Params::PositionalParams::Required)
105
108
  [
106
109
  MissingArg.new(params: positional_params),
@@ -410,8 +413,8 @@ module Steep
410
413
  when type = keyword_type(key)
411
414
  consumed_keys << key
412
415
  types << type
413
- when rest_type
414
- types << rest_type
416
+ when type = rest_type()
417
+ types << type
415
418
  else
416
419
  unexpected_keyword = key
417
420
  end
@@ -483,6 +486,15 @@ module Steep
483
486
  end
484
487
  end
485
488
 
489
+ class ForwardedArgs
490
+ attr_reader :node, :params
491
+
492
+ def initialize(node:, params:)
493
+ @node = node
494
+ @params = params
495
+ end
496
+ end
497
+
486
498
  attr_reader :node
487
499
  attr_reader :arguments
488
500
  attr_reader :type
@@ -499,6 +511,8 @@ module Steep
499
511
  type.type.params
500
512
  when AST::Types::Proc
501
513
  type.type.params
514
+ else
515
+ raise
502
516
  end
503
517
  end
504
518
 
@@ -526,14 +540,20 @@ module Steep
526
540
  end
527
541
 
528
542
  def positional_arg
529
- args = if keyword_params.empty?
530
- arguments.take_while {|node| node.type != :block_pass }
531
- else
532
- arguments.take_while {|node| node.type != :kwargs && node.type != :block_pass }
533
- end
543
+ args =
544
+ if keyword_params.empty?
545
+ arguments.take_while {|node| node.type != :block_pass }
546
+ else
547
+ arguments.take_while {|node| node.type != :kwargs && node.type != :block_pass }
548
+ end
549
+
534
550
  PositionalArgs.new(args: args, index: 0, positional_params: positional_params)
535
551
  end
536
552
 
553
+ def forwarded_args_node
554
+ arguments.find {|node| node.type == :forwarded_args }
555
+ end
556
+
537
557
  def keyword_args
538
558
  KeywordArgs.new(
539
559
  kwarg_nodes: kwargs_node&.children || [],
@@ -549,7 +569,9 @@ module Steep
549
569
 
550
570
  def each
551
571
  if block_given?
552
- errors = []
572
+ errors = [] #: Array[PositionalArgs::error_arg | KeywordArgs::error_arg]
573
+
574
+ last_positional_args = positional_arg
553
575
 
554
576
  positional_arg.tap do |args|
555
577
  while (value, args = args.next())
@@ -591,66 +613,73 @@ module Steep
591
613
  when PositionalArgs::UnexpectedArg, PositionalArgs::MissingArg
592
614
  errors << value
593
615
  end
616
+
617
+ last_positional_args = args
594
618
  end
595
619
  end
596
620
 
597
- keyword_args.tap do |args|
598
- while (a, args = args.next)
599
- case a
600
- when KeywordArgs::MissingKeyword
601
- errors << a
602
- when KeywordArgs::UnexpectedKeyword
603
- errors << a
604
- end
605
-
606
- yield a
607
-
608
- case a
609
- when KeywordArgs::SplatArg
610
- case type = a.type
611
- when nil
612
- raise
613
- when AST::Types::Record
614
- # @type var keys: Array[Symbol]
615
- keys = _ = type.elements.keys
616
- ts, args = args.consume_keys(keys, node: a.node)
621
+ if fag = forwarded_args_node
622
+ forward_params = Interface::Function::Params.new(
623
+ positional_params: last_positional_args.positional_params,
624
+ keyword_params: keyword_params
625
+ )
617
626
 
618
- case ts
619
- when KeywordArgs::UnexpectedKeyword
620
- yield ts
621
- errors << ts
622
- when Array
623
- record = AST::Types::Record.new(elements: Hash[keys.zip(ts)])
624
- yield KeywordArgs::ArgTypePairs.new(pairs: [[a.node, record]])
625
- end
626
- else
627
- args = args.update(index: args.index + 1)
627
+ forwarded_args = ForwardedArgs.new(node: fag, params: forward_params)
628
+ else
629
+ keyword_args.tap do |args|
630
+ while (a, args = args.next)
631
+ case a
632
+ when KeywordArgs::MissingKeyword
633
+ errors << a
634
+ when KeywordArgs::UnexpectedKeyword
635
+ errors << a
636
+ end
628
637
 
629
- if args.rest_type
630
- type = AST::Builtin::Hash.instance_type(AST::Builtin::Symbol.instance_type, args.possible_value_type)
631
- yield KeywordArgs::ArgTypePairs.new(pairs: [[a.node, type]])
638
+ yield a
639
+
640
+ case a
641
+ when KeywordArgs::SplatArg
642
+ case type = a.type
643
+ when nil
644
+ raise
645
+ when AST::Types::Record
646
+ # @type var keys: Array[Symbol]
647
+ keys = _ = type.elements.keys
648
+ ts, args = args.consume_keys(keys, node: a.node)
649
+
650
+ case ts
651
+ when KeywordArgs::UnexpectedKeyword
652
+ yield ts
653
+ errors << ts
654
+ when Array
655
+ pairs = keys.zip(ts) #: Array[[Symbol, AST::Types::t]]
656
+ record = AST::Types::Record.new(elements: Hash[pairs])
657
+ yield KeywordArgs::ArgTypePairs.new(pairs: [[a.node, record]])
658
+ end
632
659
  else
633
- yield KeywordArgs::UnexpectedKeyword.new(keyword: nil, node: a.node)
660
+ args = args.update(index: args.index + 1)
661
+
662
+ if args.rest_type
663
+ type = AST::Builtin::Hash.instance_type(AST::Builtin::Symbol.instance_type, args.possible_value_type)
664
+ yield KeywordArgs::ArgTypePairs.new(pairs: [[a.node, type]])
665
+ else
666
+ yield KeywordArgs::UnexpectedKeyword.new(keyword: nil, node: a.node)
667
+ end
634
668
  end
635
669
  end
636
670
  end
637
671
  end
638
672
  end
639
673
 
640
- # pass = block_pass_arg
641
- # if pass.node
642
- # yield pass
643
- # end
644
-
645
- diagnostics = []
674
+ diagnostics = [] #: Array[Diagnostic::Ruby::Base]
646
675
 
647
- missing_keywords = []
676
+ missing_keywords = [] #: Array[Symbol]
648
677
  errors.each do |error|
649
678
  case error
650
679
  when KeywordArgs::UnexpectedKeyword
651
680
  diagnostics << Diagnostic::Ruby::UnexpectedKeywordArgument.new(node: error.node, params: params)
652
681
  when KeywordArgs::MissingKeyword
653
- missing_keywords.push(*error.keywords)
682
+ missing_keywords.push(*error.keywords.to_a)
654
683
  when PositionalArgs::UnexpectedArg
655
684
  diagnostics << Diagnostic::Ruby::UnexpectedPositionalArgument.new(node: error.node, params: params)
656
685
  when PositionalArgs::MissingArg
@@ -662,7 +691,7 @@ module Steep
662
691
  diagnostics << Diagnostic::Ruby::InsufficientKeywordArguments.new(node: node, params: params, missing_keywords: missing_keywords)
663
692
  end
664
693
 
665
- diagnostics
694
+ [forwarded_args, diagnostics]
666
695
  else
667
696
  enum_for :each
668
697
  end
@@ -242,12 +242,14 @@ module Steep
242
242
 
243
243
  common_pure_nodes = envs
244
244
  .map {|env| Set.new(env.pure_method_calls.each_key) }
245
- .inject(Set.new(pure_method_calls.each_key)) {|s1, s2| s1.intersection(s2) }
245
+ .inject {|s1, s2| s1.intersection(s2) } || Set[]
246
246
 
247
247
  pure_call_updates = common_pure_nodes.each_with_object({}) do |node, hash|
248
248
  pairs = envs.map {|env| env.pure_method_calls[node] }
249
- refined_type = AST::Types::Union.build(types: pairs.map {|pair| pair[1] || pair[0].return_type })
250
- call, _ = (pure_method_calls[node] or raise)
249
+ refined_type = AST::Types::Union.build(types: pairs.map {|call, type| type || call.return_type })
250
+
251
+ # Any *pure_method_call* can be used because it's *pure*
252
+ (call, _ = envs[0].pure_method_calls[node]) or raise
251
253
 
252
254
  hash[node] = [call, refined_type]
253
255
  end
@@ -308,7 +310,13 @@ module Steep
308
310
  end
309
311
 
310
312
  def local_variable_name?(name)
311
- name.start_with?(/[a-z_]/) && name != :_ && name != :__skip__ && name != :__any__
313
+ # Ruby constants start with Uppercase_Letter or Titlecase_Letter in the unicode property.
314
+ # If name start with `@`, it is instance variable or class instance variable.
315
+ # If name start with `$`, it is global variable.
316
+ return false if name.start_with?(/[\p{Uppercase_Letter}\p{Titlecase_Letter}@$]/)
317
+ return false if TypeConstruction::SPECIAL_LVAR_NAMES.include?(name)
318
+
319
+ true
312
320
  end
313
321
 
314
322
  def local_variable_name!(name)
data/lib/steep/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Steep
2
- VERSION = "1.4.0.dev.2"
2
+ VERSION = "1.4.0.dev.4"
3
3
  end
data/lib/steep.rb CHANGED
@@ -105,7 +105,9 @@ require "steep/services/type_check_service"
105
105
  require "steep/services/hover_provider/singleton_methods"
106
106
  require "steep/services/hover_provider/ruby"
107
107
  require "steep/services/hover_provider/rbs"
108
+ require "steep/services/type_name_completion"
108
109
  require "steep/services/completion_provider"
110
+ require "steep/services/signature_help_provider"
109
111
  require "steep/services/stats_calculator"
110
112
  require "steep/services/file_loader"
111
113
  require "steep/services/goto_service"
@@ -15,14 +15,6 @@ gems:
15
15
  revision: c42c09528dd99252db98f0744181a6de54ec2f55
16
16
  remote: https://github.com/ruby/gem_rbs_collection.git
17
17
  repo_dir: gems
18
- - name: ast
19
- version: '2.4'
20
- source:
21
- type: git
22
- name: ruby/gem_rbs_collection
23
- revision: c42c09528dd99252db98f0744181a6de54ec2f55
24
- remote: https://github.com/ruby/gem_rbs_collection.git
25
- repo_dir: gems
26
18
  - name: concurrent-ruby
27
19
  version: '1.1'
28
20
  source:
@@ -39,10 +31,6 @@ gems:
39
31
  version: '0'
40
32
  source:
41
33
  type: stdlib
42
- - name: dbm
43
- version: '0'
44
- source:
45
- type: stdlib
46
34
  - name: fileutils
47
35
  version: '0'
48
36
  source:
@@ -87,18 +75,6 @@ gems:
87
75
  version: '0'
88
76
  source:
89
77
  type: stdlib
90
- - name: optparse
91
- version: '0'
92
- source:
93
- type: stdlib
94
- - name: parallel
95
- version: '1.20'
96
- source:
97
- type: git
98
- name: ruby/gem_rbs_collection
99
- revision: c42c09528dd99252db98f0744181a6de54ec2f55
100
- remote: https://github.com/ruby/gem_rbs_collection.git
101
- repo_dir: gems
102
78
  - name: pathname
103
79
  version: '0'
104
80
  source:
@@ -115,10 +91,6 @@ gems:
115
91
  version: '0'
116
92
  source:
117
93
  type: stdlib
118
- - name: set
119
- version: '0'
120
- source:
121
- type: stdlib
122
94
  - name: singleton
123
95
  version: '0'
124
96
  source:
@@ -9,14 +9,15 @@ sources:
9
9
  path: .gem_rbs_collection
10
10
 
11
11
  gems:
12
- # Skip loading rbs gem's RBS.
13
- # It's unnecessary if you don't use rbs as a library.
14
- - name: steep
15
- ignore: true
16
- - name: set
17
- - name: rbs
18
- ignore: true
19
12
  - name: with_steep_types
20
13
  ignore: true
21
- - name: dbm
22
- - name: optparse
14
+ - name: activesupport
15
+ - name: rainbow
16
+ - name: listen
17
+ - name: json
18
+ - name: logger
19
+ - name: fileutils
20
+ - name: strscan
21
+ - name: csv
22
+ - name: pathname
23
+ - name: securerandom
data/sample/Steepfile CHANGED
@@ -5,6 +5,8 @@ target :lib do
5
5
 
6
6
  check "lib" # Directory name
7
7
 
8
+ library "rbs"
9
+
8
10
  # configure_code_diagnostics(D::Ruby.strict) # `strict` diagnostics setting
9
11
  # configure_code_diagnostics(D::Ruby.lenient) # `lenient` diagnostics setting
10
12
  # configure_code_diagnostics do |hash| # You can setup everything yourself
@@ -20,3 +20,15 @@ Konference.new()
20
20
  # @type var foo: Konference
21
21
 
22
22
  foo = Conference.new
23
+
24
+ class Conference12
25
+ class Integer
26
+
27
+ end
28
+ end
29
+
30
+ class HogeHoge
31
+ def foo(...)
32
+ bar(self, ...).to_s
33
+ end
34
+ end
@@ -35,3 +35,8 @@ type foo = [Conference, Konference]
35
35
 
36
36
  type b = ::Foo::OBH
37
37
 
38
+ class HogeHoge
39
+ def foo: (Integer, bar: String) -> String
40
+
41
+ def bar: (Object, Integer, bar: String, ?baz: Integer) { () -> Integer } -> Integer
42
+ end