rbs 3.1.3 → 3.2.0.pre.1
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/.github/workflows/ruby.yml +0 -6
- data/CHANGELOG.md +68 -0
- data/Gemfile +0 -6
- data/Gemfile.lock +12 -21
- data/README.md +1 -1
- data/Rakefile +44 -0
- data/Steepfile +3 -3
- data/core/array.rbs +0 -8
- data/core/builtin.rbs +28 -8
- data/core/constants.rbs +13 -5
- data/core/exception.rbs +1 -1
- data/core/global_variables.rbs +27 -27
- data/core/io.rbs +163 -172
- data/core/kernel.rbs +7 -4
- data/core/module.rbs +34 -32
- data/core/object.rbs +2 -2
- data/core/string_io.rbs +9 -0
- data/core/thread.rbs +25 -1
- data/core/time.rbs +3 -3
- data/docs/CONTRIBUTING.md +1 -1
- data/docs/rbs_by_example.md +16 -35
- data/docs/repo.md +1 -1
- data/docs/sigs.md +7 -7
- data/docs/stdlib.md +2 -3
- data/docs/syntax.md +40 -40
- data/lib/rbs/cli.rb +15 -4
- data/lib/rbs/collection/installer.rb +5 -2
- data/lib/rbs/collection/sources/stdlib.rb +5 -1
- data/lib/rbs/errors.rb +8 -1
- data/lib/rbs/file_finder.rb +1 -1
- data/lib/rbs/prototype/rb.rb +64 -6
- data/lib/rbs/prototype/rbi.rb +2 -6
- data/lib/rbs/prototype/runtime.rb +29 -8
- data/lib/rbs/subtractor.rb +17 -0
- data/lib/rbs/type_name.rb +4 -4
- data/lib/rbs/version.rb +1 -1
- data/rbs.gemspec +1 -1
- data/schema/decls.json +1 -1
- data/sig/errors.rbs +54 -0
- data/sig/parser.rbs +2 -2
- data/sig/prototype/rb.rbs +9 -1
- data/sig/subtractor.rbs +4 -0
- data/stdlib/logger/0/logger.rbs +1 -1
- data/stdlib/observable/0/observable.rbs +219 -0
- data/stdlib/uri/0/common.rbs +24 -0
- data/stdlib/zlib/0/buf_error.rbs +79 -0
- data/stdlib/zlib/0/data_error.rbs +79 -0
- data/stdlib/zlib/0/deflate.rbs +276 -0
- data/stdlib/zlib/0/error.rbs +89 -0
- data/stdlib/zlib/0/gzip_file/crc_error.rbs +115 -0
- data/stdlib/zlib/0/gzip_file/error.rbs +128 -0
- data/stdlib/zlib/0/gzip_file/length_error.rbs +115 -0
- data/stdlib/zlib/0/gzip_file/no_footer.rbs +114 -0
- data/stdlib/zlib/0/gzip_file.rbs +228 -0
- data/stdlib/zlib/0/gzip_reader.rbs +362 -0
- data/stdlib/zlib/0/gzip_writer.rbs +237 -0
- data/stdlib/zlib/0/inflate.rbs +249 -0
- data/stdlib/zlib/0/mem_error.rbs +79 -0
- data/stdlib/zlib/0/need_dict.rbs +82 -0
- data/stdlib/zlib/0/stream_end.rbs +80 -0
- data/stdlib/zlib/0/stream_error.rbs +80 -0
- data/stdlib/zlib/0/version_error.rbs +80 -0
- data/stdlib/zlib/0/zstream.rbs +270 -0
- metadata +24 -8
- data/stdlib/prime/0/integer-extension.rbs +0 -41
- data/stdlib/prime/0/manifest.yaml +0 -2
- data/stdlib/prime/0/prime.rbs +0 -372
data/docs/syntax.md
CHANGED
@@ -51,7 +51,7 @@ _proc_ ::= _parameters?_ _self-type-binding?_ _block?_ `->` _type_
|
|
51
51
|
|
52
52
|
Class instance type denotes _an instance of a class_.
|
53
53
|
|
54
|
-
```
|
54
|
+
```rbs
|
55
55
|
Integer # Instance of Integer class
|
56
56
|
::Integer # Instance of ::Integer class
|
57
57
|
Hash[Symbol, String] # Instance of Hash class with type application of Symbol and String
|
@@ -61,7 +61,7 @@ Hash[Symbol, String] # Instance of Hash class with type application of S
|
|
61
61
|
|
62
62
|
Interface type denotes _type of a value which can be a subtype of the interface_.
|
63
63
|
|
64
|
-
```
|
64
|
+
```rbs
|
65
65
|
_ToS # _ToS interface
|
66
66
|
::MyApp::_Each[String] # Interface name with namespace and type application
|
67
67
|
```
|
@@ -72,7 +72,7 @@ Alias type denotes an alias declared with _alias declaration_.
|
|
72
72
|
|
73
73
|
The name of type aliases starts with lowercase `[a-z]`.
|
74
74
|
|
75
|
-
```
|
75
|
+
```rbs
|
76
76
|
name
|
77
77
|
::JSON::t # Alias name with namespace
|
78
78
|
list[Integer] # Type alias can be generic
|
@@ -82,7 +82,7 @@ list[Integer] # Type alias can be generic
|
|
82
82
|
|
83
83
|
Class singleton type denotes _the type of a singleton object of a class_.
|
84
84
|
|
85
|
-
```
|
85
|
+
```rbs
|
86
86
|
singleton(String)
|
87
87
|
singleton(::Hash) # Class singleton type cannot be parametrized.
|
88
88
|
```
|
@@ -91,7 +91,7 @@ singleton(::Hash) # Class singleton type cannot be parametrized.
|
|
91
91
|
|
92
92
|
Literal type denotes _a type with only one value of the literal_.
|
93
93
|
|
94
|
-
```
|
94
|
+
```rbs
|
95
95
|
123 # Integer
|
96
96
|
"hello world" # A string
|
97
97
|
:to_s # A symbol
|
@@ -102,7 +102,7 @@ true # true or false
|
|
102
102
|
|
103
103
|
Union type denotes _a type of one of the given types_.
|
104
104
|
|
105
|
-
```
|
105
|
+
```rbs
|
106
106
|
Integer | String # Integer or String
|
107
107
|
Array[Integer | String] # Array of Integer or String
|
108
108
|
```
|
@@ -111,7 +111,7 @@ Array[Integer | String] # Array of Integer or String
|
|
111
111
|
|
112
112
|
Intersection type denotes _a type of all of the given types_.
|
113
113
|
|
114
|
-
```
|
114
|
+
```rbs
|
115
115
|
_Reader & _Writer # _Reader and _Writer
|
116
116
|
```
|
117
117
|
|
@@ -121,7 +121,7 @@ Note that `&` has higher precedence than `|` that `A & B | C` is `(A & B) | C`.
|
|
121
121
|
|
122
122
|
Optional type denotes _a type of value or nil_.
|
123
123
|
|
124
|
-
```
|
124
|
+
```rbs
|
125
125
|
Integer?
|
126
126
|
Array[Integer?]
|
127
127
|
```
|
@@ -130,7 +130,7 @@ Array[Integer?]
|
|
130
130
|
|
131
131
|
Records are `Hash` objects, fixed set of keys, and heterogeneous.
|
132
132
|
|
133
|
-
```
|
133
|
+
```rbs
|
134
134
|
{ id: Integer, name: String } # Hash object like `{ id: 31, name: String }`
|
135
135
|
```
|
136
136
|
|
@@ -138,7 +138,7 @@ Records are `Hash` objects, fixed set of keys, and heterogeneous.
|
|
138
138
|
|
139
139
|
Tuples are `Array` objects, fixed size and heterogeneous.
|
140
140
|
|
141
|
-
```
|
141
|
+
```rbs
|
142
142
|
[ ] # Empty like `[]`
|
143
143
|
[String] # Single string like `["hi"]`
|
144
144
|
[Integer, Integer] # Pair of integers like `[1, 2]`
|
@@ -149,7 +149,7 @@ Tuples are `Array` objects, fixed size and heterogeneous.
|
|
149
149
|
|
150
150
|
### Type variable
|
151
151
|
|
152
|
-
```
|
152
|
+
```rbs
|
153
153
|
U
|
154
154
|
T
|
155
155
|
S
|
@@ -159,7 +159,7 @@ Elem
|
|
159
159
|
Type variables cannot be distinguished from _class instance types_.
|
160
160
|
They are scoped in _class/module/interface/alias declaration_ or _generic method types_.
|
161
161
|
|
162
|
-
```
|
162
|
+
```rbs
|
163
163
|
class Ref[T] # Object is scoped in the class declaration.
|
164
164
|
@value: T # Type variable `T`
|
165
165
|
def map: [X] { (T) -> X } -> Ref[X] # X is a type variable scoped in the method type.
|
@@ -193,7 +193,7 @@ It is an alias of `top` type, and you can use `boolish` if we want to allow any
|
|
193
193
|
|
194
194
|
We can see an example at the definition of `Enumerable#find`:
|
195
195
|
|
196
|
-
```
|
196
|
+
```rbs
|
197
197
|
module Enumerable[Elem, Return]
|
198
198
|
def find: () { (Elem) -> boolish } -> Elem?
|
199
199
|
end
|
@@ -201,7 +201,7 @@ end
|
|
201
201
|
|
202
202
|
We want to write something like:
|
203
203
|
|
204
|
-
```
|
204
|
+
```ruby
|
205
205
|
array.find {|x| x && x.some_test? } # The block will return (bool | nil)
|
206
206
|
```
|
207
207
|
|
@@ -218,7 +218,7 @@ They are all equivalent for the type system; they are all _top type_.
|
|
218
218
|
|
219
219
|
Proc type denotes type of procedures, `Proc` instances.
|
220
220
|
|
221
|
-
```
|
221
|
+
```rbs
|
222
222
|
^(Integer) -> String # A procedure with an `Integer` parameter and returns `String`
|
223
223
|
^(?String, size: Integer) -> bool # A procedure with `String` optional parameter, `size` keyword of `Integer`, and returns `bool`
|
224
224
|
```
|
@@ -266,7 +266,7 @@ Variable name can be used for documentation.
|
|
266
266
|
|
267
267
|
#### Examples
|
268
268
|
|
269
|
-
```
|
269
|
+
```rbs
|
270
270
|
# Two required positional `Integer` parameters, and returns `String`
|
271
271
|
(Integer, Integer) -> String
|
272
272
|
|
@@ -359,7 +359,7 @@ _method-name_ ::= ...
|
|
359
359
|
|
360
360
|
An instance variable definition consists of the name of an instance variable and its type.
|
361
361
|
|
362
|
-
```
|
362
|
+
```rbs
|
363
363
|
@name: String
|
364
364
|
@value: Hash[Symbol, Key]
|
365
365
|
```
|
@@ -370,7 +370,7 @@ Method definition has several syntax variations.
|
|
370
370
|
|
371
371
|
You can write `self.` or `self?.` before the name of the method to specify the kind of method: instance, singleton, or module function.
|
372
372
|
|
373
|
-
```
|
373
|
+
```rbs
|
374
374
|
def to_s: () -> String # Defines a instance method
|
375
375
|
def self.new: () -> AnObject # Defines singleton method
|
376
376
|
def self?.sqrt: (Numeric) -> Numeric # self? is for `module_function`s
|
@@ -380,7 +380,7 @@ def self?.sqrt: (Numeric) -> Numeric # self? is for `module_function`s
|
|
380
380
|
|
381
381
|
The method type can be connected with `|`s to define an overloaded method.
|
382
382
|
|
383
|
-
```
|
383
|
+
```rbs
|
384
384
|
def +: (Float) -> Float
|
385
385
|
| (Integer) -> Integer
|
386
386
|
| (Numeric) -> Numeric
|
@@ -388,7 +388,7 @@ def +: (Float) -> Float
|
|
388
388
|
|
389
389
|
Overloaded method can have `...` to overload an existing method. It is useful for monkey-patching.
|
390
390
|
|
391
|
-
```
|
391
|
+
```rbs
|
392
392
|
def +: (Float) -> Float
|
393
393
|
def +: (BigDecimal) -> BigDecimal
|
394
394
|
| ...
|
@@ -396,14 +396,14 @@ def +: (BigDecimal) -> BigDecimal
|
|
396
396
|
|
397
397
|
You need extra parentheses on return type to avoid ambiguity.
|
398
398
|
|
399
|
-
```
|
399
|
+
```rbs
|
400
400
|
def +: (Float | Integer) -> (Float | Integer)
|
401
401
|
| (Numeric) -> Numeric
|
402
402
|
```
|
403
403
|
|
404
404
|
Adding `public` and `private` modifier changes the visibility of the method.
|
405
405
|
|
406
|
-
```
|
406
|
+
```rbs
|
407
407
|
private def puts: (*untyped) -> void # Defines private instance method
|
408
408
|
|
409
409
|
public def self.puts: (*untyped) -> void # Defines public singleton method
|
@@ -417,7 +417,7 @@ Attribute definitions help to define methods and instance variables based on the
|
|
417
417
|
|
418
418
|
You can specify the name of instance variable using `(@some_name)` syntax and also omit the instance variable definition by specifying `()`.
|
419
419
|
|
420
|
-
```
|
420
|
+
```rbs
|
421
421
|
# Defines `id` method and `@id` instance variable.
|
422
422
|
attr_reader id: Integer
|
423
423
|
# @id: Integer
|
@@ -436,7 +436,7 @@ attr_accessor people (): Array[Person]
|
|
436
436
|
|
437
437
|
Attribute definitions can have the `public` and `private` modifiers like method definitions:
|
438
438
|
|
439
|
-
```
|
439
|
+
```rbs
|
440
440
|
private attr_accessor id: Integer
|
441
441
|
|
442
442
|
private attr_reader self.name: String
|
@@ -446,7 +446,7 @@ private attr_reader self.name: String
|
|
446
446
|
|
447
447
|
You can define mixins between class and modules.
|
448
448
|
|
449
|
-
```
|
449
|
+
```rbs
|
450
450
|
include Kernel
|
451
451
|
include Enumerable[String, void]
|
452
452
|
extend ActiveSupport::Concern
|
@@ -454,7 +454,7 @@ extend ActiveSupport::Concern
|
|
454
454
|
|
455
455
|
You can also `include` or `extend` an interface.
|
456
456
|
|
457
|
-
```
|
457
|
+
```rbs
|
458
458
|
include _Hashing
|
459
459
|
extend _LikeString
|
460
460
|
```
|
@@ -465,7 +465,7 @@ This allows importing `def`s from the interface to help developer implementing a
|
|
465
465
|
|
466
466
|
You can define an alias between methods.
|
467
467
|
|
468
|
-
```
|
468
|
+
```rbs
|
469
469
|
def map: [X] () { (String) -> X } -> Array[X]
|
470
470
|
alias collect map # `#collect` has the same type with `map`
|
471
471
|
```
|
@@ -548,7 +548,7 @@ Class declaration can have type parameters and superclass. When you omit supercl
|
|
548
548
|
|
549
549
|
Module declaration takes optional _self type_ parameter, which defines a constraint about a class when the module is mixed.
|
550
550
|
|
551
|
-
```
|
551
|
+
```rbs
|
552
552
|
interface _Each[A, B]
|
553
553
|
def each: { (A) -> void } -> B
|
554
554
|
end
|
@@ -572,7 +572,7 @@ class Bar = Array
|
|
572
572
|
|
573
573
|
The syntax defines a class and the definition is equivalent to the right-hand-side.
|
574
574
|
|
575
|
-
```
|
575
|
+
```rbs
|
576
576
|
class Baz < Bar[String] # Class alias can be inherited
|
577
577
|
include Foo # Module alias can be included
|
578
578
|
end
|
@@ -590,7 +590,7 @@ end
|
|
590
590
|
|
591
591
|
Interface declaration can have parameters but allows only a few of the members.
|
592
592
|
|
593
|
-
```
|
593
|
+
```rbs
|
594
594
|
interface _Hashing
|
595
595
|
def hash: () -> Integer
|
596
596
|
def eql?: (untyped) -> bool
|
@@ -602,7 +602,7 @@ There are several limitations which are not described in the grammar.
|
|
602
602
|
1. Interface cannot `include` modules
|
603
603
|
2. Interface cannot have singleton method definitions
|
604
604
|
|
605
|
-
```
|
605
|
+
```rbs
|
606
606
|
interface _Foo
|
607
607
|
include Bar # Error: cannot include modules
|
608
608
|
def self.new: () -> Foo # Error: cannot include singleton method definitions
|
@@ -613,14 +613,14 @@ end
|
|
613
613
|
|
614
614
|
You can declare an alias of types.
|
615
615
|
|
616
|
-
```
|
616
|
+
```rbs
|
617
617
|
type subject = Attendee | Speaker
|
618
618
|
type JSON::t = Integer | TrueClass | FalseClass | String | Hash[Symbol, t] | Array[t]
|
619
619
|
```
|
620
620
|
|
621
621
|
Type alias can be generic like class, module, and interface.
|
622
622
|
|
623
|
-
```
|
623
|
+
```rbs
|
624
624
|
type list[out T] = [T, list[T]] | nil
|
625
625
|
```
|
626
626
|
|
@@ -628,7 +628,7 @@ type list[out T] = [T, list[T]] | nil
|
|
628
628
|
|
629
629
|
You can declare a constant.
|
630
630
|
|
631
|
-
```
|
631
|
+
```rbs
|
632
632
|
Person::DefaultEmailAddress: String
|
633
633
|
```
|
634
634
|
|
@@ -636,13 +636,13 @@ Person::DefaultEmailAddress: String
|
|
636
636
|
|
637
637
|
You can declare a global variable.
|
638
638
|
|
639
|
-
```
|
639
|
+
```rbs
|
640
640
|
$LOAD_PATH: Array[String]
|
641
641
|
```
|
642
642
|
|
643
643
|
### Generics
|
644
644
|
|
645
|
-
```
|
645
|
+
```markdown
|
646
646
|
_module-type-parameter_ ::= _generics-unchecked_ _generics-variance_ _type-variable_ _generics-bound_
|
647
647
|
|
648
648
|
_method-type-param_ ::= _type-variable_ _generics-bound_
|
@@ -677,7 +677,7 @@ For classes with type parameters, you may specify if they are "invariant" (defau
|
|
677
677
|
|
678
678
|
For example, an `Array` of `String` can almost be considered to be an `Array` of `Object`, but not the reverse, so we can think of:
|
679
679
|
|
680
|
-
```
|
680
|
+
```rbs
|
681
681
|
# The `T` type parameter is covariant.
|
682
682
|
class Array[out T]
|
683
683
|
# etc.
|
@@ -732,7 +732,7 @@ The upper bound must be one of a class instance type, interface type, or class s
|
|
732
732
|
|
733
733
|
Directives are placed at the top of a file and provides per-file-basis features.
|
734
734
|
|
735
|
-
```
|
735
|
+
```markdown
|
736
736
|
_use-directive_ ::= `use` _use-clauses_
|
737
737
|
|
738
738
|
_use-clauses_ ::= _use-clause_ `,` ... `,` _use-clause_
|
@@ -745,7 +745,7 @@ _use-clause_ ::= _type-name_ # Single use clause
|
|
745
745
|
The *use directive* defines relative type names that is an alias of other type names.
|
746
746
|
We can use the simple type names if it is declared with *use*.
|
747
747
|
|
748
|
-
```
|
748
|
+
```rbs
|
749
749
|
use RBS::Namespace # => Defines `Namespace`
|
750
750
|
use RBS::TypeName as TN # => Defines `TN`
|
751
751
|
use RBS::AST::* # => Defines modules under `::RBS::AST::` namespace
|
@@ -755,7 +755,7 @@ use RBS::AST::* # => Defines modules under `::RBS::AST::` namespace
|
|
755
755
|
|
756
756
|
You can write single line comments. Comments must be on their own line. Comments can lead with whitespace.
|
757
757
|
|
758
|
-
```
|
758
|
+
```rbs
|
759
759
|
# This if interface Foo
|
760
760
|
# Usage of Foo is bar
|
761
761
|
interface _Foo
|
data/lib/rbs/cli.rb
CHANGED
@@ -645,6 +645,7 @@ EOU
|
|
645
645
|
relative_libs = []
|
646
646
|
merge = false
|
647
647
|
owners_included = []
|
648
|
+
outline = false
|
648
649
|
|
649
650
|
OptionParser.new do |opts|
|
650
651
|
opts.banner = <<EOU
|
@@ -657,7 +658,7 @@ Examples:
|
|
657
658
|
|
658
659
|
$ rbs prototype runtime String
|
659
660
|
$ rbs prototype runtime --require set Set
|
660
|
-
$ rbs prototype runtime -R lib/rbs RBS::*
|
661
|
+
$ rbs prototype runtime -R lib/rbs RBS RBS::*
|
661
662
|
|
662
663
|
Options:
|
663
664
|
EOU
|
@@ -673,6 +674,9 @@ EOU
|
|
673
674
|
opts.on("--method-owner CLASS", "Generate method prototypes if the owner of the method is [CLASS]") do |klass|
|
674
675
|
owners_included << klass
|
675
676
|
end
|
677
|
+
opts.on("--outline", "Generates only module/class/constant declaration (no method definition)") do
|
678
|
+
outline = true
|
679
|
+
end
|
676
680
|
end.parse!(args)
|
677
681
|
|
678
682
|
loader = options.loader()
|
@@ -686,7 +690,10 @@ EOU
|
|
686
690
|
eval("require_relative(lib)", binding, "rbs")
|
687
691
|
end
|
688
692
|
|
689
|
-
|
693
|
+
runtime = Prototype::Runtime.new(patterns: args, env: env, merge: merge, owners_included: owners_included)
|
694
|
+
runtime.outline = outline
|
695
|
+
|
696
|
+
decls = runtime.decls
|
690
697
|
|
691
698
|
writer = Writer.new(out: stdout)
|
692
699
|
writer.write decls
|
@@ -961,7 +968,7 @@ Options:
|
|
961
968
|
Parser.public_send(parse_method, buf, require_eof: true)
|
962
969
|
end
|
963
970
|
rescue RBS::ParsingError => ex
|
964
|
-
stdout.
|
971
|
+
stdout.print ex.detailed_message(highlight: true)
|
965
972
|
syntax_error = true
|
966
973
|
end
|
967
974
|
|
@@ -1241,7 +1248,11 @@ EOB
|
|
1241
1248
|
w.write(subtracted)
|
1242
1249
|
|
1243
1250
|
if write_to_file
|
1244
|
-
|
1251
|
+
if io.string.empty?
|
1252
|
+
rbs_path.delete
|
1253
|
+
else
|
1254
|
+
rbs_path.write(io.string)
|
1255
|
+
end
|
1245
1256
|
else
|
1246
1257
|
stdout.puts(io.string)
|
1247
1258
|
end
|
@@ -14,7 +14,10 @@ module RBS
|
|
14
14
|
def install_from_lockfile
|
15
15
|
install_to = lockfile.fullpath
|
16
16
|
install_to.mkpath
|
17
|
-
lockfile.gems.
|
17
|
+
selected = lockfile.gems.select do |name, gem|
|
18
|
+
gem[:source].has?(name, gem[:version])
|
19
|
+
end
|
20
|
+
selected.each_value do |gem|
|
18
21
|
gem[:source].install(
|
19
22
|
dest: install_to,
|
20
23
|
name: gem[:name],
|
@@ -22,7 +25,7 @@ module RBS
|
|
22
25
|
stdout: stdout
|
23
26
|
)
|
24
27
|
end
|
25
|
-
stdout.puts "It's done! #{
|
28
|
+
stdout.puts "It's done! #{selected.size} gems' RBSs now installed."
|
26
29
|
end
|
27
30
|
end
|
28
31
|
end
|
@@ -27,7 +27,11 @@ module RBS
|
|
27
27
|
end
|
28
28
|
|
29
29
|
def manifest_of(name, version)
|
30
|
-
|
30
|
+
unless path = lookup(name, version)
|
31
|
+
RBS.logger.warn "`#{name}` is specified in rbs_collection.lock.yaml. But it is not found in #{REPO.dirs.join(",")}"
|
32
|
+
return
|
33
|
+
end
|
34
|
+
manifest_path = path.join('manifest.yaml')
|
31
35
|
YAML.safe_load(manifest_path.read) if manifest_path.exist?
|
32
36
|
end
|
33
37
|
|
data/lib/rbs/errors.rb
CHANGED
@@ -22,7 +22,14 @@ module RBS
|
|
22
22
|
|
23
23
|
module DetailedMessageable
|
24
24
|
def detailed_message(highlight: false, **)
|
25
|
-
msg =
|
25
|
+
msg = if Exception.method_defined?(:detailed_message)
|
26
|
+
super
|
27
|
+
else
|
28
|
+
# Failback to `#message` in Ruby 3.1 or earlier
|
29
|
+
"#{message} (#{self.class.name})"
|
30
|
+
end
|
31
|
+
|
32
|
+
return msg unless location
|
26
33
|
|
27
34
|
# Support only one line
|
28
35
|
return msg unless location.start_line == location.end_line
|
data/lib/rbs/file_finder.rb
CHANGED
@@ -5,7 +5,7 @@ module RBS
|
|
5
5
|
module_function
|
6
6
|
|
7
7
|
def self.each_file(path, immediate:, skip_hidden:, &block)
|
8
|
-
return enum_for(__method__, path, immediate: immediate, skip_hidden: skip_hidden) unless block
|
8
|
+
return enum_for((__method__ or raise), path, immediate: immediate, skip_hidden: skip_hidden) unless block
|
9
9
|
|
10
10
|
case
|
11
11
|
when path.file?
|
data/lib/rbs/prototype/rb.rb
CHANGED
@@ -5,11 +5,11 @@ module RBS
|
|
5
5
|
class RB
|
6
6
|
include Helpers
|
7
7
|
|
8
|
-
Context = _ = Struct.new(:module_function, :singleton, :namespace, keyword_init: true) do
|
8
|
+
Context = _ = Struct.new(:module_function, :singleton, :namespace, :in_def, keyword_init: true) do
|
9
9
|
# @implements Context
|
10
10
|
|
11
11
|
def self.initial(namespace: Namespace.root)
|
12
|
-
self.new(module_function: false, singleton: false, namespace: namespace)
|
12
|
+
self.new(module_function: false, singleton: false, namespace: namespace, in_def: false)
|
13
13
|
end
|
14
14
|
|
15
15
|
def method_kind
|
@@ -29,6 +29,14 @@ module RBS
|
|
29
29
|
:instance
|
30
30
|
end
|
31
31
|
end
|
32
|
+
|
33
|
+
def enter_namespace(namespace)
|
34
|
+
Context.initial(namespace: self.namespace + namespace)
|
35
|
+
end
|
36
|
+
|
37
|
+
def update(module_function: self.module_function, singleton: self.singleton, in_def: self.in_def)
|
38
|
+
Context.new(module_function: module_function, singleton: singleton, namespace: namespace, in_def: in_def)
|
39
|
+
end
|
32
40
|
end
|
33
41
|
|
34
42
|
attr_reader :source_decls
|
@@ -121,11 +129,12 @@ module RBS
|
|
121
129
|
|
122
130
|
decls.push kls
|
123
131
|
|
124
|
-
new_ctx =
|
132
|
+
new_ctx = context.enter_namespace(kls.name.to_namespace)
|
125
133
|
each_node class_body do |child|
|
126
134
|
process child, decls: kls.members, comments: comments, context: new_ctx
|
127
135
|
end
|
128
136
|
remove_unnecessary_accessibility_methods! kls.members
|
137
|
+
sort_members! kls.members
|
129
138
|
|
130
139
|
when :MODULE
|
131
140
|
module_name, *module_body = node.children
|
@@ -142,11 +151,12 @@ module RBS
|
|
142
151
|
|
143
152
|
decls.push mod
|
144
153
|
|
145
|
-
new_ctx =
|
154
|
+
new_ctx = context.enter_namespace(mod.name.to_namespace)
|
146
155
|
each_node module_body do |child|
|
147
156
|
process child, decls: mod.members, comments: comments, context: new_ctx
|
148
157
|
end
|
149
158
|
remove_unnecessary_accessibility_methods! mod.members
|
159
|
+
sort_members! mod.members
|
150
160
|
|
151
161
|
when :SCLASS
|
152
162
|
this, body = node.children
|
@@ -195,6 +205,11 @@ module RBS
|
|
195
205
|
|
196
206
|
decls.push member unless decls.include?(member)
|
197
207
|
|
208
|
+
new_ctx = context.update(singleton: kind == :singleton, in_def: true)
|
209
|
+
each_node def_body.children do |child|
|
210
|
+
process child, decls: decls, comments: comments, context: new_ctx
|
211
|
+
end
|
212
|
+
|
198
213
|
when :ALIAS
|
199
214
|
new_name, old_name = node.children.map { |c| literal_to_symbol(c) }
|
200
215
|
member = AST::Members::Alias.new(
|
@@ -306,7 +321,7 @@ module RBS
|
|
306
321
|
if args.empty?
|
307
322
|
context.module_function = true
|
308
323
|
else
|
309
|
-
module_func_context = context.
|
324
|
+
module_func_context = context.update(module_function: true)
|
310
325
|
args.each do |arg|
|
311
326
|
if arg && (name = literal_to_symbol(arg))
|
312
327
|
if (i, defn = find_def_index_by_name(decls, name))
|
@@ -377,6 +392,39 @@ module RBS
|
|
377
392
|
comment: comments[node.first_lineno - 1]
|
378
393
|
)
|
379
394
|
|
395
|
+
when :IASGN
|
396
|
+
case [context.singleton, context.in_def]
|
397
|
+
when [true, true], [false, false]
|
398
|
+
member = AST::Members::ClassInstanceVariable.new(
|
399
|
+
name: node.children.first,
|
400
|
+
type: Types::Bases::Any.new(location: nil),
|
401
|
+
location: nil,
|
402
|
+
comment: comments[node.first_lineno - 1]
|
403
|
+
)
|
404
|
+
when [false, true]
|
405
|
+
member = AST::Members::InstanceVariable.new(
|
406
|
+
name: node.children.first,
|
407
|
+
type: Types::Bases::Any.new(location: nil),
|
408
|
+
location: nil,
|
409
|
+
comment: comments[node.first_lineno - 1]
|
410
|
+
)
|
411
|
+
when [true, false]
|
412
|
+
# The variable is for the singleton class of the class object.
|
413
|
+
# RBS does not have a way to represent it. So we ignore it.
|
414
|
+
else
|
415
|
+
raise 'unreachable'
|
416
|
+
end
|
417
|
+
|
418
|
+
decls.push member if member && !decls.include?(member)
|
419
|
+
|
420
|
+
when :CVASGN
|
421
|
+
member = AST::Members::ClassVariable.new(
|
422
|
+
name: node.children.first,
|
423
|
+
type: Types::Bases::Any.new(location: nil),
|
424
|
+
location: nil,
|
425
|
+
comment: comments[node.first_lineno - 1]
|
426
|
+
)
|
427
|
+
decls.push member unless decls.include?(member)
|
380
428
|
else
|
381
429
|
process_children(node, decls: decls, comments: comments, context: context)
|
382
430
|
end
|
@@ -413,7 +461,7 @@ module RBS
|
|
413
461
|
when :SELF
|
414
462
|
context.namespace.to_type_name
|
415
463
|
when :CONST, :COLON2, :COLON3
|
416
|
-
const_to_name!(node)
|
464
|
+
const_to_name!(node) rescue nil
|
417
465
|
end
|
418
466
|
end
|
419
467
|
end
|
@@ -743,6 +791,16 @@ module RBS
|
|
743
791
|
]
|
744
792
|
end
|
745
793
|
end
|
794
|
+
|
795
|
+
def sort_members!(decls)
|
796
|
+
i = 0
|
797
|
+
orders = {
|
798
|
+
AST::Members::ClassVariable => -3,
|
799
|
+
AST::Members::ClassInstanceVariable => -2,
|
800
|
+
AST::Members::InstanceVariable => -1,
|
801
|
+
}
|
802
|
+
decls.sort_by! { |decl| [orders.fetch(decl.class, 0), i += 1] }
|
803
|
+
end
|
746
804
|
end
|
747
805
|
end
|
748
806
|
end
|
data/lib/rbs/prototype/rbi.rb
CHANGED
@@ -479,7 +479,7 @@ module RBS
|
|
479
479
|
else
|
480
480
|
Types::ClassInstance.new(name: const_to_name(type_node), args: [], location: nil)
|
481
481
|
end
|
482
|
-
when type_node.type == :COLON2
|
482
|
+
when type_node.type == :COLON2 || type_node.type == :COLON3
|
483
483
|
Types::ClassInstance.new(name: const_to_name(type_node), args: [], location: nil)
|
484
484
|
when call_node?(type_node, name: :[], receiver: -> (_) { true })
|
485
485
|
# The type_node represents a type application
|
@@ -553,11 +553,7 @@ module RBS
|
|
553
553
|
TypeName.new(name: node.children[0], namespace: Namespace.empty)
|
554
554
|
when :COLON2
|
555
555
|
if node.children[0]
|
556
|
-
|
557
|
-
namespace = Namespace.root
|
558
|
-
else
|
559
|
-
namespace = const_to_name(node.children[0]).to_namespace
|
560
|
-
end
|
556
|
+
namespace = const_to_name(node.children[0]).to_namespace
|
561
557
|
else
|
562
558
|
namespace = Namespace.empty
|
563
559
|
end
|