rbs 0.19.0 → 0.20.0
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.
- checksums.yaml +4 -4
 - data/CHANGELOG.md +8 -0
 - data/core/hash.rbs +1 -3
 - data/core/time.rbs +0 -12
 - data/lib/rbs/ast/members.rb +9 -3
 - data/lib/rbs/definition_builder.rb +80 -61
 - data/lib/rbs/environment.rb +3 -0
 - data/lib/rbs/method_type.rb +1 -31
 - data/lib/rbs/parser.rb +966 -906
 - data/lib/rbs/parser.y +95 -55
 - data/lib/rbs/prototype/rb.rb +13 -2
 - data/lib/rbs/prototype/rbi.rb +5 -5
 - data/lib/rbs/prototype/runtime.rb +1 -1
 - data/lib/rbs/test/hook.rb +5 -2
 - data/lib/rbs/types.rb +63 -6
 - data/lib/rbs/version.rb +1 -1
 - data/lib/rbs/writer.rb +9 -1
 - data/schema/members.json +5 -1
 - data/sig/definition_builder.rbs +3 -0
 - data/sig/members.rbs +4 -1
 - data/sig/method_types.rbs +3 -16
 - data/sig/types.rbs +17 -1
 - data/stdlib/dbm/0/dbm.rbs +0 -2
 - data/stdlib/tsort/0/tsort.rbs +8 -0
 - data/steep/Gemfile.lock +7 -7
 - metadata +3 -3
 
    
        data/lib/rbs/parser.y
    CHANGED
    
    | 
         @@ -20,7 +20,7 @@ class RBS::Parser 
     | 
|
| 
       20 
20 
     | 
    
         
             
              nonassoc kARROW
         
     | 
| 
       21 
21 
     | 
    
         
             
              preclow
         
     | 
| 
       22 
22 
     | 
    
         | 
| 
       23 
     | 
    
         
            -
              expect  
     | 
| 
      
 23 
     | 
    
         
            +
              expect 5
         
     | 
| 
       24 
24 
     | 
    
         | 
| 
       25 
25 
     | 
    
         
             
            rule
         
     | 
| 
       26 
26 
     | 
    
         | 
| 
         @@ -202,57 +202,67 @@ rule 
     | 
|
| 
       202 
202 
     | 
    
         
             
                | alias_member
         
     | 
| 
       203 
203 
     | 
    
         
             
                | signature
         
     | 
| 
       204 
204 
     | 
    
         | 
| 
      
 205 
     | 
    
         
            +
              attribute_kind:
         
     | 
| 
      
 206 
     | 
    
         
            +
                  { result = :instance }
         
     | 
| 
      
 207 
     | 
    
         
            +
                | kSELF kDOT { result = :singleton }
         
     | 
| 
      
 208 
     | 
    
         
            +
             
     | 
| 
       205 
209 
     | 
    
         
             
              attribute_member:
         
     | 
| 
       206 
     | 
    
         
            -
                  annotations kATTRREADER keyword type {
         
     | 
| 
       207 
     | 
    
         
            -
                    location = val[1].location + val[ 
     | 
| 
       208 
     | 
    
         
            -
                    result = Members::AttrReader.new(name: val[ 
     | 
| 
      
 210 
     | 
    
         
            +
                  annotations kATTRREADER attribute_kind keyword type {
         
     | 
| 
      
 211 
     | 
    
         
            +
                    location = val[1].location + val[4].location
         
     | 
| 
      
 212 
     | 
    
         
            +
                    result = Members::AttrReader.new(name: val[3].value,
         
     | 
| 
       209 
213 
     | 
    
         
             
                                                     ivar_name: nil,
         
     | 
| 
       210 
     | 
    
         
            -
                                                     type: val[ 
     | 
| 
      
 214 
     | 
    
         
            +
                                                     type: val[4],
         
     | 
| 
      
 215 
     | 
    
         
            +
                                                     kind: val[2],
         
     | 
| 
       211 
216 
     | 
    
         
             
                                                     annotations: val[0],
         
     | 
| 
       212 
217 
     | 
    
         
             
                                                     location: location,
         
     | 
| 
       213 
218 
     | 
    
         
             
                                                     comment: leading_comment(val[0].first&.location || location))
         
     | 
| 
       214 
219 
     | 
    
         
             
                  }
         
     | 
| 
       215 
     | 
    
         
            -
                | annotations kATTRREADER method_name attr_var_opt kCOLON type {
         
     | 
| 
       216 
     | 
    
         
            -
                    location = val[1].location + val[ 
     | 
| 
       217 
     | 
    
         
            -
                    result = Members::AttrReader.new(name: val[ 
     | 
| 
       218 
     | 
    
         
            -
                                                     ivar_name: val[ 
     | 
| 
       219 
     | 
    
         
            -
                                                     type: val[ 
     | 
| 
      
 220 
     | 
    
         
            +
                | annotations kATTRREADER attribute_kind method_name attr_var_opt kCOLON type {
         
     | 
| 
      
 221 
     | 
    
         
            +
                    location = val[1].location + val[6].location
         
     | 
| 
      
 222 
     | 
    
         
            +
                    result = Members::AttrReader.new(name: val[3].value.to_sym,
         
     | 
| 
      
 223 
     | 
    
         
            +
                                                     ivar_name: val[4],
         
     | 
| 
      
 224 
     | 
    
         
            +
                                                     type: val[6],
         
     | 
| 
      
 225 
     | 
    
         
            +
                                                     kind: val[2],
         
     | 
| 
       220 
226 
     | 
    
         
             
                                                     annotations: val[0],
         
     | 
| 
       221 
227 
     | 
    
         
             
                                                     location: location,
         
     | 
| 
       222 
228 
     | 
    
         
             
                                                     comment: leading_comment(val[0].first&.location || location))
         
     | 
| 
       223 
229 
     | 
    
         
             
                  }
         
     | 
| 
       224 
     | 
    
         
            -
                | annotations kATTRWRITER keyword type {
         
     | 
| 
       225 
     | 
    
         
            -
                    location = val[1].location + val[ 
     | 
| 
       226 
     | 
    
         
            -
                    result = Members::AttrWriter.new(name: val[ 
     | 
| 
      
 230 
     | 
    
         
            +
                | annotations kATTRWRITER attribute_kind keyword type {
         
     | 
| 
      
 231 
     | 
    
         
            +
                    location = val[1].location + val[4].location
         
     | 
| 
      
 232 
     | 
    
         
            +
                    result = Members::AttrWriter.new(name: val[3].value,
         
     | 
| 
       227 
233 
     | 
    
         
             
                                                     ivar_name: nil,
         
     | 
| 
       228 
     | 
    
         
            -
                                                      
     | 
| 
      
 234 
     | 
    
         
            +
                                                     kind: val[2],
         
     | 
| 
      
 235 
     | 
    
         
            +
                                                     type: val[4],
         
     | 
| 
       229 
236 
     | 
    
         
             
                                                     annotations: val[0],
         
     | 
| 
       230 
237 
     | 
    
         
             
                                                     location: location,
         
     | 
| 
       231 
238 
     | 
    
         
             
                                                     comment: leading_comment(val[0].first&.location || location))
         
     | 
| 
       232 
239 
     | 
    
         
             
                  }
         
     | 
| 
       233 
     | 
    
         
            -
                | annotations kATTRWRITER method_name attr_var_opt kCOLON type {
         
     | 
| 
       234 
     | 
    
         
            -
                    location = val[1].location + val[ 
     | 
| 
       235 
     | 
    
         
            -
                    result = Members::AttrWriter.new(name: val[ 
     | 
| 
       236 
     | 
    
         
            -
                                                     ivar_name: val[ 
     | 
| 
       237 
     | 
    
         
            -
                                                      
     | 
| 
      
 240 
     | 
    
         
            +
                | annotations kATTRWRITER attribute_kind method_name attr_var_opt kCOLON type {
         
     | 
| 
      
 241 
     | 
    
         
            +
                    location = val[1].location + val[6].location
         
     | 
| 
      
 242 
     | 
    
         
            +
                    result = Members::AttrWriter.new(name: val[3].value.to_sym,
         
     | 
| 
      
 243 
     | 
    
         
            +
                                                     ivar_name: val[4],
         
     | 
| 
      
 244 
     | 
    
         
            +
                                                     kind: val[2],
         
     | 
| 
      
 245 
     | 
    
         
            +
                                                     type: val[6],
         
     | 
| 
       238 
246 
     | 
    
         
             
                                                     annotations: val[0],
         
     | 
| 
       239 
247 
     | 
    
         
             
                                                     location: location,
         
     | 
| 
       240 
248 
     | 
    
         
             
                                                     comment: leading_comment(val[0].first&.location || location))
         
     | 
| 
       241 
249 
     | 
    
         
             
                  }
         
     | 
| 
       242 
     | 
    
         
            -
                | annotations kATTRACCESSOR keyword type {
         
     | 
| 
       243 
     | 
    
         
            -
                    location = val[1].location + val[ 
     | 
| 
       244 
     | 
    
         
            -
                    result = Members::AttrAccessor.new(name: val[ 
     | 
| 
      
 250 
     | 
    
         
            +
                | annotations kATTRACCESSOR attribute_kind keyword type {
         
     | 
| 
      
 251 
     | 
    
         
            +
                    location = val[1].location + val[4].location
         
     | 
| 
      
 252 
     | 
    
         
            +
                    result = Members::AttrAccessor.new(name: val[3].value,
         
     | 
| 
       245 
253 
     | 
    
         
             
                                                       ivar_name: nil,
         
     | 
| 
       246 
     | 
    
         
            -
                                                        
     | 
| 
      
 254 
     | 
    
         
            +
                                                       kind: val[2],
         
     | 
| 
      
 255 
     | 
    
         
            +
                                                       type: val[4],
         
     | 
| 
       247 
256 
     | 
    
         
             
                                                       annotations: val[0],
         
     | 
| 
       248 
257 
     | 
    
         
             
                                                       location: location,
         
     | 
| 
       249 
258 
     | 
    
         
             
                                                       comment: leading_comment(val[0].first&.location || location))
         
     | 
| 
       250 
259 
     | 
    
         
             
                  }
         
     | 
| 
       251 
     | 
    
         
            -
                | annotations kATTRACCESSOR method_name attr_var_opt kCOLON type {
         
     | 
| 
       252 
     | 
    
         
            -
                    location = val[1].location + val[ 
     | 
| 
       253 
     | 
    
         
            -
                    result = Members::AttrAccessor.new(name: val[ 
     | 
| 
       254 
     | 
    
         
            -
                                                       ivar_name: val[ 
     | 
| 
       255 
     | 
    
         
            -
                                                        
     | 
| 
      
 260 
     | 
    
         
            +
                | annotations kATTRACCESSOR attribute_kind method_name attr_var_opt kCOLON type {
         
     | 
| 
      
 261 
     | 
    
         
            +
                    location = val[1].location + val[6].location
         
     | 
| 
      
 262 
     | 
    
         
            +
                    result = Members::AttrAccessor.new(name: val[3].value.to_sym,
         
     | 
| 
      
 263 
     | 
    
         
            +
                                                       ivar_name: val[4],
         
     | 
| 
      
 264 
     | 
    
         
            +
                                                       kind: val[2],
         
     | 
| 
      
 265 
     | 
    
         
            +
                                                       type: val[6],
         
     | 
| 
       256 
266 
     | 
    
         
             
                                                       annotations: val[0],
         
     | 
| 
       257 
267 
     | 
    
         
             
                                                       location: location,
         
     | 
| 
       258 
268 
     | 
    
         
             
                                                       comment: leading_comment(val[0].first&.location || location))
         
     | 
| 
         @@ -474,26 +484,13 @@ rule 
     | 
|
| 
       474 
484 
     | 
    
         
             
                  }
         
     | 
| 
       475 
485 
     | 
    
         | 
| 
       476 
486 
     | 
    
         
             
              method_type:
         
     | 
| 
       477 
     | 
    
         
            -
                  start_merged_scope type_params  
     | 
| 
      
 487 
     | 
    
         
            +
                  start_merged_scope type_params proc_type {
         
     | 
| 
       478 
488 
     | 
    
         
             
                    reset_variable_scope
         
     | 
| 
       479 
489 
     | 
    
         | 
| 
       480 
     | 
    
         
            -
                    location = (val[1] || val[2] 
     | 
| 
      
 490 
     | 
    
         
            +
                    location = (val[1] || val[2]).location + val[2].location
         
     | 
| 
       481 
491 
     | 
    
         
             
                    type_params = val[1]&.value || []
         
     | 
| 
       482 
492 
     | 
    
         | 
| 
       483 
     | 
    
         
            -
                     
     | 
| 
       484 
     | 
    
         
            -
             
     | 
| 
       485 
     | 
    
         
            -
                    type = Types::Function.new(
         
     | 
| 
       486 
     | 
    
         
            -
                      required_positionals: params[0],
         
     | 
| 
       487 
     | 
    
         
            -
                      optional_positionals: params[1],
         
     | 
| 
       488 
     | 
    
         
            -
                      rest_positionals: params[2],
         
     | 
| 
       489 
     | 
    
         
            -
                      trailing_positionals: params[3],
         
     | 
| 
       490 
     | 
    
         
            -
                      required_keywords: params[4],
         
     | 
| 
       491 
     | 
    
         
            -
                      optional_keywords: params[5],
         
     | 
| 
       492 
     | 
    
         
            -
                      rest_keywords: params[6],
         
     | 
| 
       493 
     | 
    
         
            -
                      return_type: val[5]
         
     | 
| 
       494 
     | 
    
         
            -
                    )
         
     | 
| 
       495 
     | 
    
         
            -
             
     | 
| 
       496 
     | 
    
         
            -
                    block = val[3]&.value
         
     | 
| 
      
 493 
     | 
    
         
            +
                    type, block = val[2].value
         
     | 
| 
       497 
494 
     | 
    
         | 
| 
       498 
495 
     | 
    
         
             
                    result = MethodType.new(type_params: type_params,
         
     | 
| 
       499 
496 
     | 
    
         
             
                                            type: type,
         
     | 
| 
         @@ -507,14 +504,13 @@ rule 
     | 
|
| 
       507 
504 
     | 
    
         
             
                    result = LocatedValue.new(value: val[1], location: val[0].location + val[2].location)
         
     | 
| 
       508 
505 
     | 
    
         
             
                  }
         
     | 
| 
       509 
506 
     | 
    
         | 
| 
       510 
     | 
    
         
            -
               
     | 
| 
       511 
     | 
    
         
            -
                   
     | 
| 
       512 
     | 
    
         
            -
             
     | 
| 
       513 
     | 
    
         
            -
                    block = MethodType::Block.new(type: val[1].value, required: true)
         
     | 
| 
      
 507 
     | 
    
         
            +
              block:
         
     | 
| 
      
 508 
     | 
    
         
            +
                  kLBRACE simple_function_type kRBRACE {
         
     | 
| 
      
 509 
     | 
    
         
            +
                    block = Types::Block.new(type: val[1].value, required: true)
         
     | 
| 
       514 
510 
     | 
    
         
             
                    result = LocatedValue.new(value: block, location: val[0].location + val[2].location)
         
     | 
| 
       515 
511 
     | 
    
         
             
                  }
         
     | 
| 
       516 
     | 
    
         
            -
                | kQUESTION kLBRACE  
     | 
| 
       517 
     | 
    
         
            -
                    block =  
     | 
| 
      
 512 
     | 
    
         
            +
                | kQUESTION kLBRACE simple_function_type kRBRACE {
         
     | 
| 
      
 513 
     | 
    
         
            +
                    block = Types::Block.new(type: val[2].value, required: false)
         
     | 
| 
       518 
514 
     | 
    
         
             
                    result = LocatedValue.new(value: block, location: val[0].location + val[3].location)
         
     | 
| 
       519 
515 
     | 
    
         
             
                  }
         
     | 
| 
       520 
516 
     | 
    
         | 
| 
         @@ -797,8 +793,9 @@ rule 
     | 
|
| 
       797 
793 
     | 
    
         
             
                    result = Types::ClassSingleton.new(name: val[2].value,
         
     | 
| 
       798 
794 
     | 
    
         
             
                                                       location: val[0].location + val[3].location)
         
     | 
| 
       799 
795 
     | 
    
         
             
                  }
         
     | 
| 
       800 
     | 
    
         
            -
                | kHAT  
     | 
| 
       801 
     | 
    
         
            -
                     
     | 
| 
      
 796 
     | 
    
         
            +
                | kHAT proc_type {
         
     | 
| 
      
 797 
     | 
    
         
            +
                    type, block = val[1].value
         
     | 
| 
      
 798 
     | 
    
         
            +
                    result = Types::Proc.new(type: type, block: block, location: val[0].location + val[1].location)
         
     | 
| 
       802 
799 
     | 
    
         
             
                  }
         
     | 
| 
       803 
800 
     | 
    
         
             
                | simple_type kQUESTION {
         
     | 
| 
       804 
801 
     | 
    
         
             
                    result = Types::Optional.new(type: val[0], location: val[0].location + val[1].location)
         
     | 
| 
         @@ -851,7 +848,32 @@ rule 
     | 
|
| 
       851 
848 
     | 
    
         | 
| 
       852 
849 
     | 
    
         
             
              keyword: tLKEYWORD | tUKEYWORD | tLKEYWORD_Q_E | tUKEYWORD_Q_E
         
     | 
| 
       853 
850 
     | 
    
         | 
| 
       854 
     | 
    
         
            -
               
     | 
| 
      
 851 
     | 
    
         
            +
              proc_type:
         
     | 
| 
      
 852 
     | 
    
         
            +
                  params_opt block kARROW simple_type {
         
     | 
| 
      
 853 
     | 
    
         
            +
                    location = (val[0] || val[1] || val[2]).location + val[3].location
         
     | 
| 
      
 854 
     | 
    
         
            +
             
     | 
| 
      
 855 
     | 
    
         
            +
                    params = val[0]&.value || [[], [], nil, [], {}, {}, nil]
         
     | 
| 
      
 856 
     | 
    
         
            +
             
     | 
| 
      
 857 
     | 
    
         
            +
                    type = Types::Function.new(
         
     | 
| 
      
 858 
     | 
    
         
            +
                      required_positionals: params[0],
         
     | 
| 
      
 859 
     | 
    
         
            +
                      optional_positionals: params[1],
         
     | 
| 
      
 860 
     | 
    
         
            +
                      rest_positionals: params[2],
         
     | 
| 
      
 861 
     | 
    
         
            +
                      trailing_positionals: params[3],
         
     | 
| 
      
 862 
     | 
    
         
            +
                      required_keywords: params[4],
         
     | 
| 
      
 863 
     | 
    
         
            +
                      optional_keywords: params[5],
         
     | 
| 
      
 864 
     | 
    
         
            +
                      rest_keywords: params[6],
         
     | 
| 
      
 865 
     | 
    
         
            +
                      return_type: val[3]
         
     | 
| 
      
 866 
     | 
    
         
            +
                    )
         
     | 
| 
      
 867 
     | 
    
         
            +
             
     | 
| 
      
 868 
     | 
    
         
            +
                    block = val[1].value
         
     | 
| 
      
 869 
     | 
    
         
            +
             
     | 
| 
      
 870 
     | 
    
         
            +
                    result = LocatedValue.new(value: [type, block], location: location)
         
     | 
| 
      
 871 
     | 
    
         
            +
                  }
         
     | 
| 
      
 872 
     | 
    
         
            +
                | simple_function_type {
         
     | 
| 
      
 873 
     | 
    
         
            +
                    result = LocatedValue.new(value: [val[0].value, nil], location: val[0].location)
         
     | 
| 
      
 874 
     | 
    
         
            +
                  }
         
     | 
| 
      
 875 
     | 
    
         
            +
             
     | 
| 
      
 876 
     | 
    
         
            +
              simple_function_type:
         
     | 
| 
       855 
877 
     | 
    
         
             
                  kLPAREN params kRPAREN kARROW simple_type {
         
     | 
| 
       856 
878 
     | 
    
         
             
                    location = val[0].location + val[4].location
         
     | 
| 
       857 
879 
     | 
    
         
             
                    type = Types::Function.new(
         
     | 
| 
         @@ -883,7 +905,7 @@ rule 
     | 
|
| 
       883 
905 
     | 
    
         
             
                    result = LocatedValue.new(value: type, location: location)
         
     | 
| 
       884 
906 
     | 
    
         
             
                  }
         
     | 
| 
       885 
907 
     | 
    
         | 
| 
       886 
     | 
    
         
            -
             
     | 
| 
      
 908 
     | 
    
         
            +
              params:
         
     | 
| 
       887 
909 
     | 
    
         
             
                  required_positional kCOMMA params {
         
     | 
| 
       888 
910 
     | 
    
         
             
                    result = val[2]
         
     | 
| 
       889 
911 
     | 
    
         
             
                    result[0].unshift(val[0])
         
     | 
| 
         @@ -1294,6 +1316,10 @@ ANNOTATION_RE = Regexp.union(/%a\{.*?\}/, 
     | 
|
| 
       1294 
1316 
     | 
    
         
             
                                         /%a\(.*?\)/,
         
     | 
| 
       1295 
1317 
     | 
    
         
             
                                         /%a\<.*?\>/,
         
     | 
| 
       1296 
1318 
     | 
    
         
             
                                         /%a\|.*?\|/)
         
     | 
| 
      
 1319 
     | 
    
         
            +
             
     | 
| 
      
 1320 
     | 
    
         
            +
            escape_sequences = %w[a b e f n r s t v "].map { |l| "\\\\#{l}" }
         
     | 
| 
      
 1321 
     | 
    
         
            +
            DBL_QUOTE_STR_ESCAPE_SEQUENCES_RE = /(#{escape_sequences.join("|")})/
         
     | 
| 
      
 1322 
     | 
    
         
            +
             
     | 
| 
       1297 
1323 
     | 
    
         
             
            def next_token
         
     | 
| 
       1298 
1324 
     | 
    
         
             
              if @type
         
     | 
| 
       1299 
1325 
     | 
    
         
             
                type = @type
         
     | 
| 
         @@ -1373,7 +1399,21 @@ def next_token 
     | 
|
| 
       1373 
1399 
     | 
    
         
             
              when input.scan(/[a-z_]\w*\b/)
         
     | 
| 
       1374 
1400 
     | 
    
         
             
                new_token(:tLIDENT)
         
     | 
| 
       1375 
1401 
     | 
    
         
             
              when input.scan(/"(\\"|[^"])*"/)
         
     | 
| 
       1376 
     | 
    
         
            -
                s = input.matched.yield_self {|s| s[1, s.length - 2] } 
     | 
| 
      
 1402 
     | 
    
         
            +
                s = input.matched.yield_self {|s| s[1, s.length - 2] }
         
     | 
| 
      
 1403 
     | 
    
         
            +
                                 .gsub(DBL_QUOTE_STR_ESCAPE_SEQUENCES_RE) do |match|
         
     | 
| 
      
 1404 
     | 
    
         
            +
                                   case match
         
     | 
| 
      
 1405 
     | 
    
         
            +
                                   when '\\a' then "\a"
         
     | 
| 
      
 1406 
     | 
    
         
            +
                                   when '\\b' then "\b"
         
     | 
| 
      
 1407 
     | 
    
         
            +
                                   when '\\e' then "\e"
         
     | 
| 
      
 1408 
     | 
    
         
            +
                                   when '\\f' then "\f"
         
     | 
| 
      
 1409 
     | 
    
         
            +
                                   when '\\n' then "\n"
         
     | 
| 
      
 1410 
     | 
    
         
            +
                                   when '\\r' then "\r"
         
     | 
| 
      
 1411 
     | 
    
         
            +
                                   when '\\s' then "\s"
         
     | 
| 
      
 1412 
     | 
    
         
            +
                                   when '\\t' then "\t"
         
     | 
| 
      
 1413 
     | 
    
         
            +
                                   when '\\v' then "\v"
         
     | 
| 
      
 1414 
     | 
    
         
            +
                                   when '\\"' then '"'
         
     | 
| 
      
 1415 
     | 
    
         
            +
                                   end
         
     | 
| 
      
 1416 
     | 
    
         
            +
                                 end
         
     | 
| 
       1377 
1417 
     | 
    
         
             
                new_token(:tSTRING, s)
         
     | 
| 
       1378 
1418 
     | 
    
         
             
              when input.scan(/'(\\'|[^'])*'/)
         
     | 
| 
       1379 
1419 
     | 
    
         
             
                s = input.matched.yield_self {|s| s[1, s.length - 2] }.gsub(/\\'/, "'")
         
     | 
    
        data/lib/rbs/prototype/rb.rb
    CHANGED
    
    | 
         @@ -15,6 +15,14 @@ module RBS 
     | 
|
| 
       15 
15 
     | 
    
         
             
                        :instance
         
     | 
| 
       16 
16 
     | 
    
         
             
                      end
         
     | 
| 
       17 
17 
     | 
    
         
             
                    end
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                    def attribute_kind
         
     | 
| 
      
 20 
     | 
    
         
            +
                      if singleton
         
     | 
| 
      
 21 
     | 
    
         
            +
                        :singleton
         
     | 
| 
      
 22 
     | 
    
         
            +
                      else
         
     | 
| 
      
 23 
     | 
    
         
            +
                        :instance
         
     | 
| 
      
 24 
     | 
    
         
            +
                      end
         
     | 
| 
      
 25 
     | 
    
         
            +
                    end
         
     | 
| 
       18 
26 
     | 
    
         
             
                  end
         
     | 
| 
       19 
27 
     | 
    
         | 
| 
       20 
28 
     | 
    
         
             
                  attr_reader :source_decls
         
     | 
| 
         @@ -202,6 +210,7 @@ module RBS 
     | 
|
| 
       202 
210 
     | 
    
         
             
                              name: name,
         
     | 
| 
       203 
211 
     | 
    
         
             
                              ivar_name: nil,
         
     | 
| 
       204 
212 
     | 
    
         
             
                              type: Types::Bases::Any.new(location: nil),
         
     | 
| 
      
 213 
     | 
    
         
            +
                              kind: context.attribute_kind,
         
     | 
| 
       205 
214 
     | 
    
         
             
                              location: nil,
         
     | 
| 
       206 
215 
     | 
    
         
             
                              comment: comments[node.first_lineno - 1],
         
     | 
| 
       207 
216 
     | 
    
         
             
                              annotations: []
         
     | 
| 
         @@ -215,6 +224,7 @@ module RBS 
     | 
|
| 
       215 
224 
     | 
    
         
             
                              name: name,
         
     | 
| 
       216 
225 
     | 
    
         
             
                              ivar_name: nil,
         
     | 
| 
       217 
226 
     | 
    
         
             
                              type: Types::Bases::Any.new(location: nil),
         
     | 
| 
      
 227 
     | 
    
         
            +
                              kind: context.attribute_kind,
         
     | 
| 
       218 
228 
     | 
    
         
             
                              location: nil,
         
     | 
| 
       219 
229 
     | 
    
         
             
                              comment: comments[node.first_lineno - 1],
         
     | 
| 
       220 
230 
     | 
    
         
             
                              annotations: []
         
     | 
| 
         @@ -228,6 +238,7 @@ module RBS 
     | 
|
| 
       228 
238 
     | 
    
         
             
                              name: name,
         
     | 
| 
       229 
239 
     | 
    
         
             
                              ivar_name: nil,
         
     | 
| 
       230 
240 
     | 
    
         
             
                              type: Types::Bases::Any.new(location: nil),
         
     | 
| 
      
 241 
     | 
    
         
            +
                              kind: context.attribute_kind,
         
     | 
| 
       231 
242 
     | 
    
         
             
                              location: nil,
         
     | 
| 
       232 
243 
     | 
    
         
             
                              comment: comments[node.first_lineno - 1],
         
     | 
| 
       233 
244 
     | 
    
         
             
                              annotations: []
         
     | 
| 
         @@ -549,7 +560,7 @@ module RBS 
     | 
|
| 
       549 
560 
     | 
    
         
             
                    method_block = nil
         
     | 
| 
       550 
561 
     | 
    
         | 
| 
       551 
562 
     | 
    
         
             
                    if block
         
     | 
| 
       552 
     | 
    
         
            -
                      method_block =  
     | 
| 
      
 563 
     | 
    
         
            +
                      method_block = Types::Block.new(
         
     | 
| 
       553 
564 
     | 
    
         
             
                        required: true,
         
     | 
| 
       554 
565 
     | 
    
         
             
                        type: Types::Function.empty(untyped)
         
     | 
| 
       555 
566 
     | 
    
         
             
                      )
         
     | 
| 
         @@ -557,7 +568,7 @@ module RBS 
     | 
|
| 
       557 
568 
     | 
    
         | 
| 
       558 
569 
     | 
    
         
             
                    if body_node
         
     | 
| 
       559 
570 
     | 
    
         
             
                      if (yields = any_node?(body_node) {|n| n.type == :YIELD })
         
     | 
| 
       560 
     | 
    
         
            -
                        method_block =  
     | 
| 
      
 571 
     | 
    
         
            +
                        method_block = Types::Block.new(
         
     | 
| 
       561 
572 
     | 
    
         
             
                          required: true,
         
     | 
| 
       562 
573 
     | 
    
         
             
                          type: Types::Function.empty(untyped)
         
     | 
| 
       563 
574 
     | 
    
         
             
                        )
         
     | 
    
        data/lib/rbs/prototype/rbi.rb
    CHANGED
    
    | 
         @@ -387,19 +387,19 @@ module RBS 
     | 
|
| 
       387 
387 
     | 
    
         
             
                    if block
         
     | 
| 
       388 
388 
     | 
    
         
             
                      if (type = vars[block])
         
     | 
| 
       389 
389 
     | 
    
         
             
                        if type.is_a?(Types::Proc)
         
     | 
| 
       390 
     | 
    
         
            -
                          method_block =  
     | 
| 
      
 390 
     | 
    
         
            +
                          method_block = Types::Block.new(required: true, type: type.type)
         
     | 
| 
       391 
391 
     | 
    
         
             
                        elsif type.is_a?(Types::Bases::Any)
         
     | 
| 
       392 
     | 
    
         
            -
                          method_block =  
     | 
| 
      
 392 
     | 
    
         
            +
                          method_block = Types::Block.new(
         
     | 
| 
       393 
393 
     | 
    
         
             
                            required: true,
         
     | 
| 
       394 
394 
     | 
    
         
             
                            type: Types::Function.empty(Types::Bases::Any.new(location: nil))
         
     | 
| 
       395 
395 
     | 
    
         
             
                          )
         
     | 
| 
       396 
396 
     | 
    
         
             
                        # Handle an optional block like `T.nilable(T.proc.void)`.
         
     | 
| 
       397 
397 
     | 
    
         
             
                        elsif type.is_a?(Types::Optional) && type.type.is_a?(Types::Proc)
         
     | 
| 
       398 
     | 
    
         
            -
                          method_block =  
     | 
| 
      
 398 
     | 
    
         
            +
                          method_block = Types::Block.new(required: false, type: type.type.type)
         
     | 
| 
       399 
399 
     | 
    
         
             
                        else
         
     | 
| 
       400 
400 
     | 
    
         
             
                          STDERR.puts "Unexpected block type: #{type}"
         
     | 
| 
       401 
401 
     | 
    
         
             
                          PP.pp args_node, STDERR
         
     | 
| 
       402 
     | 
    
         
            -
                          method_block =  
     | 
| 
      
 402 
     | 
    
         
            +
                          method_block = Types::Block.new(
         
     | 
| 
       403 
403 
     | 
    
         
             
                            required: true,
         
     | 
| 
       404 
404 
     | 
    
         
             
                            type: Types::Function.empty(Types::Bases::Any.new(location: nil))
         
     | 
| 
       405 
405 
     | 
    
         
             
                          )
         
     | 
| 
         @@ -485,7 +485,7 @@ module RBS 
     | 
|
| 
       485 
485 
     | 
    
         
             
                      Types::Tuple.new(types: types, location: nil)
         
     | 
| 
       486 
486 
     | 
    
         
             
                    else
         
     | 
| 
       487 
487 
     | 
    
         
             
                      if proc_type?(type_node)
         
     | 
| 
       488 
     | 
    
         
            -
                        Types::Proc.new(type: method_type(nil, type_node, variables: variables).type, location: nil)
         
     | 
| 
      
 488 
     | 
    
         
            +
                        Types::Proc.new(type: method_type(nil, type_node, variables: variables).type, block: nil, location: nil)
         
     | 
| 
       489 
489 
     | 
    
         
             
                      else
         
     | 
| 
       490 
490 
     | 
    
         
             
                        STDERR.puts "Unexpected type_node:"
         
     | 
| 
       491 
491 
     | 
    
         
             
                        PP.pp type_node, STDERR
         
     | 
| 
         @@ -103,7 +103,7 @@ module RBS 
     | 
|
| 
       103 
103 
     | 
    
         
             
                      when :keyrest
         
     | 
| 
       104 
104 
     | 
    
         
             
                        rest_keywords = Types::Function::Param.new(name: nil, type: untyped)
         
     | 
| 
       105 
105 
     | 
    
         
             
                      when :block
         
     | 
| 
       106 
     | 
    
         
            -
                        block =  
     | 
| 
      
 106 
     | 
    
         
            +
                        block = Types::Block.new(
         
     | 
| 
       107 
107 
     | 
    
         
             
                          type: Types::Function.empty(untyped).update(rest_positionals: Types::Function::Param.new(name: nil, type: untyped)),
         
     | 
| 
       108 
108 
     | 
    
         
             
                          required: true
         
     | 
| 
       109 
109 
     | 
    
         
             
                        )
         
     | 
    
        data/lib/rbs/test/hook.rb
    CHANGED
    
    | 
         @@ -81,7 +81,8 @@ def #{with_name}(*args, &block) 
     | 
|
| 
       81 
81 
     | 
    
         | 
| 
       82 
82 
     | 
    
         
             
                if block_given?
         
     | 
| 
       83 
83 
     | 
    
         
             
                  receiver = self
         
     | 
| 
       84 
     | 
    
         
            -
             
     | 
| 
      
 84 
     | 
    
         
            +
             
     | 
| 
      
 85 
     | 
    
         
            +
                  wrapped_block = proc do |*block_args|
         
     | 
| 
       85 
86 
     | 
    
         
             
                    return_from_block = false
         
     | 
| 
       86 
87 
     | 
    
         | 
| 
       87 
88 
     | 
    
         
             
                    begin
         
     | 
| 
         @@ -117,7 +118,9 @@ def #{with_name}(*args, &block) 
     | 
|
| 
       117 
118 
     | 
    
         
             
                    end
         
     | 
| 
       118 
119 
     | 
    
         | 
| 
       119 
120 
     | 
    
         
             
                    block_result
         
     | 
| 
       120 
     | 
    
         
            -
                  end
         
     | 
| 
      
 121 
     | 
    
         
            +
                  end.ruby2_keywords
         
     | 
| 
      
 122 
     | 
    
         
            +
             
     | 
| 
      
 123 
     | 
    
         
            +
                  result = __send__(:"#{without_name}", *args, &wrapped_block)
         
     | 
| 
       121 
124 
     | 
    
         
             
                else
         
     | 
| 
       122 
125 
     | 
    
         
             
                  result = __send__(:"#{without_name}", *args)
         
     | 
| 
       123 
126 
     | 
    
         
             
                end
         
     | 
    
        data/lib/rbs/types.rb
    CHANGED
    
    | 
         @@ -947,44 +947,100 @@ module RBS 
     | 
|
| 
       947 
947 
     | 
    
         
             
                  end
         
     | 
| 
       948 
948 
     | 
    
         
             
                end
         
     | 
| 
       949 
949 
     | 
    
         | 
| 
      
 950 
     | 
    
         
            +
                class Block
         
     | 
| 
      
 951 
     | 
    
         
            +
                  attr_reader :type
         
     | 
| 
      
 952 
     | 
    
         
            +
                  attr_reader :required
         
     | 
| 
      
 953 
     | 
    
         
            +
             
     | 
| 
      
 954 
     | 
    
         
            +
                  def initialize(type:, required:)
         
     | 
| 
      
 955 
     | 
    
         
            +
                    @type = type
         
     | 
| 
      
 956 
     | 
    
         
            +
                    @required = required
         
     | 
| 
      
 957 
     | 
    
         
            +
                  end
         
     | 
| 
      
 958 
     | 
    
         
            +
             
     | 
| 
      
 959 
     | 
    
         
            +
                  def ==(other)
         
     | 
| 
      
 960 
     | 
    
         
            +
                    other.is_a?(Block) &&
         
     | 
| 
      
 961 
     | 
    
         
            +
                      other.type == type &&
         
     | 
| 
      
 962 
     | 
    
         
            +
                      other.required == required
         
     | 
| 
      
 963 
     | 
    
         
            +
                  end
         
     | 
| 
      
 964 
     | 
    
         
            +
             
     | 
| 
      
 965 
     | 
    
         
            +
                  def to_json(*a)
         
     | 
| 
      
 966 
     | 
    
         
            +
                    {
         
     | 
| 
      
 967 
     | 
    
         
            +
                      type: type,
         
     | 
| 
      
 968 
     | 
    
         
            +
                      required: required
         
     | 
| 
      
 969 
     | 
    
         
            +
                    }.to_json(*a)
         
     | 
| 
      
 970 
     | 
    
         
            +
                  end
         
     | 
| 
      
 971 
     | 
    
         
            +
             
     | 
| 
      
 972 
     | 
    
         
            +
                  def sub(s)
         
     | 
| 
      
 973 
     | 
    
         
            +
                    self.class.new(
         
     | 
| 
      
 974 
     | 
    
         
            +
                      type: type.sub(s),
         
     | 
| 
      
 975 
     | 
    
         
            +
                      required: required
         
     | 
| 
      
 976 
     | 
    
         
            +
                    )
         
     | 
| 
      
 977 
     | 
    
         
            +
                  end
         
     | 
| 
      
 978 
     | 
    
         
            +
             
     | 
| 
      
 979 
     | 
    
         
            +
                  def map_type(&block)
         
     | 
| 
      
 980 
     | 
    
         
            +
                    Block.new(
         
     | 
| 
      
 981 
     | 
    
         
            +
                      required: required,
         
     | 
| 
      
 982 
     | 
    
         
            +
                      type: type.map_type(&block)
         
     | 
| 
      
 983 
     | 
    
         
            +
                    )
         
     | 
| 
      
 984 
     | 
    
         
            +
                  end
         
     | 
| 
      
 985 
     | 
    
         
            +
                end
         
     | 
| 
      
 986 
     | 
    
         
            +
             
     | 
| 
       950 
987 
     | 
    
         
             
                class Proc
         
     | 
| 
       951 
988 
     | 
    
         
             
                  attr_reader :type
         
     | 
| 
      
 989 
     | 
    
         
            +
                  attr_reader :block
         
     | 
| 
       952 
990 
     | 
    
         
             
                  attr_reader :location
         
     | 
| 
       953 
991 
     | 
    
         | 
| 
       954 
     | 
    
         
            -
                  def initialize(location:, type:)
         
     | 
| 
      
 992 
     | 
    
         
            +
                  def initialize(location:, type:, block:)
         
     | 
| 
       955 
993 
     | 
    
         
             
                    @type = type
         
     | 
| 
      
 994 
     | 
    
         
            +
                    @block = block
         
     | 
| 
       956 
995 
     | 
    
         
             
                    @location = location
         
     | 
| 
       957 
996 
     | 
    
         
             
                  end
         
     | 
| 
       958 
997 
     | 
    
         | 
| 
       959 
998 
     | 
    
         
             
                  def ==(other)
         
     | 
| 
       960 
     | 
    
         
            -
                    other.is_a?(Proc) && other.type == type
         
     | 
| 
      
 999 
     | 
    
         
            +
                    other.is_a?(Proc) && other.type == type && other.block == block
         
     | 
| 
       961 
1000 
     | 
    
         
             
                  end
         
     | 
| 
       962 
1001 
     | 
    
         | 
| 
       963 
1002 
     | 
    
         
             
                  alias eql? ==
         
     | 
| 
       964 
1003 
     | 
    
         | 
| 
       965 
1004 
     | 
    
         
             
                  def hash
         
     | 
| 
       966 
     | 
    
         
            -
                    self.class.hash ^ type.hash
         
     | 
| 
      
 1005 
     | 
    
         
            +
                    self.class.hash ^ type.hash ^ block.hash
         
     | 
| 
       967 
1006 
     | 
    
         
             
                  end
         
     | 
| 
       968 
1007 
     | 
    
         | 
| 
       969 
1008 
     | 
    
         
             
                  def free_variables(set = Set[])
         
     | 
| 
       970 
1009 
     | 
    
         
             
                    type.free_variables(set)
         
     | 
| 
      
 1010 
     | 
    
         
            +
                    block&.type&.free_variables(set)
         
     | 
| 
      
 1011 
     | 
    
         
            +
                    set
         
     | 
| 
       971 
1012 
     | 
    
         
             
                  end
         
     | 
| 
       972 
1013 
     | 
    
         | 
| 
       973 
1014 
     | 
    
         
             
                  def to_json(*a)
         
     | 
| 
       974 
     | 
    
         
            -
                    { 
     | 
| 
      
 1015 
     | 
    
         
            +
                    {
         
     | 
| 
      
 1016 
     | 
    
         
            +
                      class: :proc,
         
     | 
| 
      
 1017 
     | 
    
         
            +
                      type: type,
         
     | 
| 
      
 1018 
     | 
    
         
            +
                      block: block,
         
     | 
| 
      
 1019 
     | 
    
         
            +
                      location: location
         
     | 
| 
      
 1020 
     | 
    
         
            +
                    }.to_json(*a)
         
     | 
| 
       975 
1021 
     | 
    
         
             
                  end
         
     | 
| 
       976 
1022 
     | 
    
         | 
| 
       977 
1023 
     | 
    
         
             
                  def sub(s)
         
     | 
| 
       978 
     | 
    
         
            -
                    self.class.new(type: type.sub(s), location: location)
         
     | 
| 
      
 1024 
     | 
    
         
            +
                    self.class.new(type: type.sub(s), block: block&.sub(s), location: location)
         
     | 
| 
       979 
1025 
     | 
    
         
             
                  end
         
     | 
| 
       980 
1026 
     | 
    
         | 
| 
       981 
1027 
     | 
    
         
             
                  def to_s(level = 0)
         
     | 
| 
       982 
     | 
    
         
            -
                     
     | 
| 
      
 1028 
     | 
    
         
            +
                    case
         
     | 
| 
      
 1029 
     | 
    
         
            +
                    when b = block
         
     | 
| 
      
 1030 
     | 
    
         
            +
                      if b.required
         
     | 
| 
      
 1031 
     | 
    
         
            +
                        "^(#{type.param_to_s}) { (#{b.type.param_to_s}) -> #{b.type.return_to_s} } -> #{type.return_to_s}"
         
     | 
| 
      
 1032 
     | 
    
         
            +
                      else
         
     | 
| 
      
 1033 
     | 
    
         
            +
                        "^(#{type.param_to_s}) ?{ (#{b.type.param_to_s}) -> #{b.type.return_to_s} } -> #{type.return_to_s}"
         
     | 
| 
      
 1034 
     | 
    
         
            +
                      end
         
     | 
| 
      
 1035 
     | 
    
         
            +
                    else
         
     | 
| 
      
 1036 
     | 
    
         
            +
                      "^(#{type.param_to_s}) -> #{type.return_to_s}"
         
     | 
| 
      
 1037 
     | 
    
         
            +
                    end
         
     | 
| 
       983 
1038 
     | 
    
         
             
                  end
         
     | 
| 
       984 
1039 
     | 
    
         | 
| 
       985 
1040 
     | 
    
         
             
                  def each_type(&block)
         
     | 
| 
       986 
1041 
     | 
    
         
             
                    if block
         
     | 
| 
       987 
1042 
     | 
    
         
             
                      type.each_type(&block)
         
     | 
| 
      
 1043 
     | 
    
         
            +
                      self.block&.type&.each_type(&block)
         
     | 
| 
       988 
1044 
     | 
    
         
             
                    else
         
     | 
| 
       989 
1045 
     | 
    
         
             
                      enum_for :each_type
         
     | 
| 
       990 
1046 
     | 
    
         
             
                    end
         
     | 
| 
         @@ -993,6 +1049,7 @@ module RBS 
     | 
|
| 
       993 
1049 
     | 
    
         
             
                  def map_type_name(&block)
         
     | 
| 
       994 
1050 
     | 
    
         
             
                    Proc.new(
         
     | 
| 
       995 
1051 
     | 
    
         
             
                      type: type.map_type_name(&block),
         
     | 
| 
      
 1052 
     | 
    
         
            +
                      block: self.block&.map_type {|type| type.map_type_name(&block) },
         
     | 
| 
       996 
1053 
     | 
    
         
             
                      location: location
         
     | 
| 
       997 
1054 
     | 
    
         
             
                    )
         
     | 
| 
       998 
1055 
     | 
    
         
             
                  end
         
     |