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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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