rbs 1.8.1 → 2.0.0.pre1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +51 -4
- data/docs/collection.md +23 -1
- data/docs/syntax.md +94 -41
- data/ext/rbs_extension/constants.c +2 -6
- data/ext/rbs_extension/constants.h +1 -2
- data/ext/rbs_extension/parser.c +212 -178
- data/ext/rbs_extension/parserstate.c +6 -2
- data/ext/rbs_extension/parserstate.h +10 -0
- data/ext/rbs_extension/ruby_objs.c +9 -11
- data/ext/rbs_extension/ruby_objs.h +1 -2
- data/lib/rbs/ast/declarations.rb +0 -97
- data/lib/rbs/ast/type_param.rb +134 -0
- data/lib/rbs/cli.rb +32 -4
- data/lib/rbs/collection/config/lockfile_generator.rb +26 -18
- data/lib/rbs/collection/sources/git.rb +9 -0
- data/lib/rbs/collection/sources/rubygems.rb +7 -0
- data/lib/rbs/collection/sources/stdlib.rb +6 -0
- data/lib/rbs/definition.rb +9 -0
- data/lib/rbs/definition_builder.rb +20 -14
- data/lib/rbs/environment.rb +32 -9
- data/lib/rbs/environment_loader.rb +0 -2
- data/lib/rbs/errors.rb +20 -7
- data/lib/rbs/location_aux.rb +2 -0
- data/lib/rbs/method_type.rb +29 -6
- data/lib/rbs/prototype/rb.rb +3 -3
- data/lib/rbs/prototype/rbi.rb +8 -6
- data/lib/rbs/prototype/runtime.rb +4 -4
- data/lib/rbs/types.rb +89 -0
- data/lib/rbs/validator.rb +56 -1
- data/lib/rbs/variance_calculator.rb +9 -8
- data/lib/rbs/version.rb +1 -1
- data/lib/rbs/writer.rb +1 -13
- data/lib/rbs.rb +1 -0
- data/schema/decls.json +16 -55
- data/schema/methodType.json +1 -1
- data/schema/typeParam.json +36 -0
- data/sig/collection/collections.rbs +9 -0
- data/sig/collection/config.rbs +2 -2
- data/sig/declarations.rbs +8 -58
- data/sig/definition.rbs +11 -1
- data/sig/definition_builder.rbs +1 -1
- data/sig/environment.rbs +7 -1
- data/sig/errors.rbs +19 -4
- data/sig/location.rbs +3 -1
- data/sig/locator.rbs +1 -1
- data/sig/method_types.rbs +25 -4
- data/sig/type_param.rbs +74 -0
- data/sig/types.rbs +27 -1
- data/sig/validator.rbs +31 -2
- data/sig/variance_calculator.rbs +1 -1
- data/sig/writer.rbs +1 -1
- data/stdlib/bigdecimal-math/0/manifest.yaml +2 -0
- data/stdlib/csv/0/manifest.yaml +2 -0
- data/stdlib/logger/0/manifest.yaml +2 -0
- data/stdlib/net-http/0/manifest.yaml +2 -0
- data/stdlib/openssl/0/manifest.yaml +2 -0
- data/stdlib/prime/0/manifest.yaml +2 -0
- data/stdlib/resolv/0/manifest.yaml +3 -0
- data/stdlib/uri/0/common.rbs +10 -5
- data/stdlib/uri/0/ftp.rbs +10 -0
- data/stdlib/uri/0/mailto.rbs +5 -0
- data/stdlib/uri/0/ws.rbs +10 -0
- data/stdlib/uri/0/wss.rbs +7 -0
- data/stdlib/yaml/0/manifest.yaml +3 -0
- metadata +19 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: df2f2f119ca85f630c640b201ebf9ce72322db96223de2fb1d4ba77df68aee59
|
4
|
+
data.tar.gz: 82943e12963a10f2a4dbd30096fe40fb90ee4b23d6239bd515526a39d2af3b97
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9dbd99091da5e5d116a5bb428383c3e63e8b8ee4207ea859e177577b33a1d1dc3d312bb31f03fcda61d90993b4a9ab1ccab69855e7ecb8e986f9696a638c618d
|
7
|
+
data.tar.gz: dc05caaa25da531bbe353eb0294fbe016a90039eef12a040f2c5b07f409683c9fbc6c3406beba8c8d76f25f5b0ed7bbc3501967cc84fcc000a2e49fda85e84a3
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,53 @@
|
|
2
2
|
|
3
3
|
## master
|
4
4
|
|
5
|
+
## 2.0.0 (pre1)
|
6
|
+
|
7
|
+
### Bounded Generics
|
8
|
+
|
9
|
+
RBS 2.0 ships with _bounded generics_, which improves the expressiveness of the language by adding new syntax to define the constraint on type parameters.
|
10
|
+
|
11
|
+
```rbs
|
12
|
+
class PrettyPrint[T < _Output]
|
13
|
+
interface _Output
|
14
|
+
def <<: (String) -> void
|
15
|
+
end
|
16
|
+
|
17
|
+
attr_reader output: T
|
18
|
+
|
19
|
+
def initialize: (T output) -> void
|
20
|
+
end
|
21
|
+
```
|
22
|
+
|
23
|
+
This is the motivating example I found in the [prettyprint library](https://github.com/ruby/prettyprint).
|
24
|
+
The `#initialize` receives a object of type `T` and it must have `#<<` method.
|
25
|
+
This is defined with `< _Output` syntax in the example.
|
26
|
+
It means _`T` has to be compatible with `_Output` interface._
|
27
|
+
`PrettyPrint[String]` is okay, but `PrettyPrint[Integer]` is a type error.
|
28
|
+
|
29
|
+
See [the PR for details](https://github.com/ruby/rbs/pull/844).
|
30
|
+
|
31
|
+
`manifest.yaml` allows declaring the dependencies from your gems to standard libraries explicitly.
|
32
|
+
|
33
|
+
This version contains a bug fix, which potentially breaks the compatibility with older versions.
|
34
|
+
The super class names in class definitions are now resolved in _outer_ context.
|
35
|
+
It was an incompatibility with Ruby and [this PR](https://github.com/ruby/rbs/pull/856) fixed the problem.
|
36
|
+
|
37
|
+
### Signature updates
|
38
|
+
|
39
|
+
* uri ([\#846](https://github.com/ruby/rbs/pull/846), [\#852](https://github.com/ruby/rbs/pull/852), [\#851](https://github.com/ruby/rbs/pull/851), [\#850](https://github.com/ruby/rbs/pull/850))
|
40
|
+
|
41
|
+
### Language updates
|
42
|
+
|
43
|
+
* Bounded generics ([\#844](https://github.com/ruby/rbs/pull/844))
|
44
|
+
* Resolve super type names in outer context ([\#856](https://github.com/ruby/rbs/pull/856))
|
45
|
+
|
46
|
+
### Library changes
|
47
|
+
|
48
|
+
* Add `manifest.yaml` for collection to specify stdlib dependencies ([\#808](https://github.com/ruby/rbs/pull/808))
|
49
|
+
* Remove experimental warning of `rbs collection` ([\#855](https://github.com/ruby/rbs/pull/855))
|
50
|
+
* Add the utility `#map_type` methods ([\#841](https://github.com/ruby/rbs/pull/841))
|
51
|
+
|
5
52
|
## 1.8.1 (2021-12-13)
|
6
53
|
|
7
54
|
### Library changes
|
@@ -11,7 +58,7 @@
|
|
11
58
|
|
12
59
|
## 1.8.0 (2021-12-02)
|
13
60
|
|
14
|
-
RBS 1.8.0 ships with a language feature
|
61
|
+
RBS 1.8.0 ships with a language feature enhancement, _generic type alias_.
|
15
62
|
You can define a type alias with type parameters now.
|
16
63
|
|
17
64
|
```rbs
|
@@ -52,7 +99,7 @@ You can find the detail in the [PR](https://github.com/ruby/rbs/pull/823).
|
|
52
99
|
This version replaces `RBS::Parser` implementation from pure Ruby code based on [Racc](https://github.com/ruby/racc) to C extension.
|
53
100
|
It improves the RBS file parsing performance up to 5 times faster. :rocket:
|
54
101
|
|
55
|
-
* There are some
|
102
|
+
* There are some incompatibilities to drop obsolete syntax rules: `super` keyword and `any` type are no longer supported.
|
56
103
|
* [re2c](https://github.com/skvadrik/re2c) is used to generate lexical generator.
|
57
104
|
|
58
105
|
When you want to change the parser/lexer, change the files under `ext/rbs_extension` directory and run `rake compile` to compile the extension.
|
@@ -165,7 +212,7 @@ This release includes feature enhancements including recursive `type` definition
|
|
165
212
|
|
166
213
|
### Library changes
|
167
214
|
|
168
|
-
* Add
|
215
|
+
* Add Recursive type alias definition validation ([\#719](https://github.com/ruby/rbs/pull/719))
|
169
216
|
* Generate included modules with complete name ([\#731](https://github.com/ruby/rbs/pull/731))
|
170
217
|
* Fix `rbs-prototype-rb` error when multi assign with const ([\#740](https://github.com/ruby/rbs/pull/740))
|
171
218
|
|
@@ -193,7 +240,7 @@ This release is to fix a bug introduced by parser update in 1.3.0.
|
|
193
240
|
|
194
241
|
### Summary
|
195
242
|
|
196
|
-
RBS 1.3.0 includes bug
|
243
|
+
RBS 1.3.0 includes bug fixes of the parser and class/module definition validations.
|
197
244
|
|
198
245
|
### Signature updates
|
199
246
|
|
data/docs/collection.md
CHANGED
@@ -7,7 +7,6 @@
|
|
7
7
|
* `git(1)`
|
8
8
|
* `Gemfile.lock`
|
9
9
|
|
10
|
-
|
11
10
|
## Usage
|
12
11
|
|
13
12
|
### Setup
|
@@ -65,9 +64,13 @@ Finally the third party RBSs are available! `rbs` commands, such as `rbs validat
|
|
65
64
|
|
66
65
|
## Configuration
|
67
66
|
|
67
|
+
### `rbs_collection.yaml`
|
68
|
+
|
68
69
|
Configure `rbs collection` with editing `rbs_collection.yaml`.
|
69
70
|
|
70
71
|
```yaml
|
72
|
+
# rbs_collection.yaml
|
73
|
+
|
71
74
|
# Download sources.
|
72
75
|
# You can add own collection git repository.
|
73
76
|
sources:
|
@@ -92,6 +95,25 @@ gems:
|
|
92
95
|
ignore: true
|
93
96
|
```
|
94
97
|
|
98
|
+
### `manifest.yaml`
|
99
|
+
|
100
|
+
If you are a gem maintainer, you can write `manifest.yaml`.
|
101
|
+
You need to put the file if the gem has implicit dependencies, which don't appear in `Gemfile.lock`. You have to write standard libraries' dependencies in most cases.
|
102
|
+
For example:
|
103
|
+
|
104
|
+
```yaml
|
105
|
+
# manifest.yaml
|
106
|
+
|
107
|
+
dependencies:
|
108
|
+
# If your gem depends on pathname but the gemspec doesn't include pathname,
|
109
|
+
# you need to write the following.
|
110
|
+
- name: pathname
|
111
|
+
```
|
112
|
+
|
113
|
+
If the gem's RBS is managed with [ruby/gem_rbs_collection](https://github.com/ruby/gem_rbs_collection), put it as `gems/GEM_NAME/VERSION/manifest.yaml`. For example, `gems/activesupport/6.0/manifest.yaml`.
|
114
|
+
If the gem's RBS is included in the gem package, put it as `sig/manifest.yaml`.
|
115
|
+
|
116
|
+
|
95
117
|
## Files / Directories
|
96
118
|
|
97
119
|
* `rbs_collection.yaml`
|
data/docs/syntax.md
CHANGED
@@ -288,12 +288,12 @@ _method-member_ ::= `def` _method-name_ `:` _method-types_ # Instance
|
|
288
288
|
| `def self.` _method-name_ `:` _method-types_ # Singleton method
|
289
289
|
| `def self?.` _method-name_ `:` _method-types_ # Singleton and instance method
|
290
290
|
|
291
|
-
_method-types_ ::=
|
292
|
-
|
|
293
|
-
| `...`
|
291
|
+
_method-types_ ::= _method-type-parameters_ _method-type_ # Single method type
|
292
|
+
| _method-type-parameters_ _method-type_ `|` _method-types_ # Overloading types
|
293
|
+
| `...` # Overloading for duplicate definitions
|
294
294
|
|
295
|
-
|
296
|
-
|
295
|
+
_method-type-parameters_ ::= # Empty
|
296
|
+
| `[` _type-variable_ `,` ... `]`
|
297
297
|
|
298
298
|
_attribute-member_ ::= _attribute-type_ _method-name_ `:` _type_ # Attribute
|
299
299
|
| _attribute-type_ _method-name_ `(` _ivar-name_ `) :` _type_ # Attribute with variable name specification
|
@@ -443,48 +443,13 @@ _const-name_ ::= _namespace_ /[A-Z]\w*/
|
|
443
443
|
_global-name_ ::= /$[a-zA-Z]\w+/ | ...
|
444
444
|
|
445
445
|
_module-type-parameters_ ::= # Empty
|
446
|
-
| `[` _module-type-parameter_ `,`
|
447
|
-
|
448
|
-
_module-type-parameter_ ::= _check_ _variance_ _type-variable_
|
449
|
-
_variance_ ::= `out` | `in`
|
450
|
-
_check_ ::= # Empty
|
451
|
-
| `unchecked`
|
446
|
+
| `[` _module-type-parameter_ `,` ... `]`
|
452
447
|
```
|
453
448
|
|
454
449
|
### Class declaration
|
455
450
|
|
456
451
|
Class declaration can have type parameters and superclass. When you omit superclass, `::Object` is assumed.
|
457
452
|
|
458
|
-
```
|
459
|
-
class Ref[A] < Object
|
460
|
-
attr_reader value: A
|
461
|
-
def initialize: (value: A) -> void
|
462
|
-
end
|
463
|
-
```
|
464
|
-
|
465
|
-
For classes with type parameters, you may specify if they are "invariant" (default), "covariant" (`out`) or "contravariant" (`in`). See [this definition of covariance and contravariance](https://en.wikipedia.org/wiki/Covariance_and_contravariance_(computer_science)).
|
466
|
-
|
467
|
-
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:
|
468
|
-
|
469
|
-
```
|
470
|
-
class Array[out T]
|
471
|
-
# etc.
|
472
|
-
end
|
473
|
-
```
|
474
|
-
|
475
|
-
There's a limitation with this is for mutable objects (like arrays): a mutation could invalidate this.
|
476
|
-
If an array of String is passed to a method as an array of Objects, and that method adds an Integer to the array, the promise is broken.
|
477
|
-
|
478
|
-
In those cases, one must use the `unchecked` keyword:
|
479
|
-
|
480
|
-
```
|
481
|
-
class Array[unchecked out T]
|
482
|
-
# etc.
|
483
|
-
end
|
484
|
-
```
|
485
|
-
|
486
|
-
This is how `Array` is actually defined in RBS.
|
487
|
-
|
488
453
|
### Module declaration
|
489
454
|
|
490
455
|
Module declaration takes optional _self type_ parameter, which defines a constraint about a class when the module is mixed.
|
@@ -555,6 +520,94 @@ You can declare a global variable.
|
|
555
520
|
$LOAD_PATH: Array[String]
|
556
521
|
```
|
557
522
|
|
523
|
+
### Generics
|
524
|
+
|
525
|
+
```md
|
526
|
+
_module-type-parameter_ ::= _generics-unchecked_ _generics-variance_ _type-variable_ _generics-bound_
|
527
|
+
|
528
|
+
_method-type-param_ ::= _type-variable_ _generics-bound_
|
529
|
+
|
530
|
+
_generics-bound_ ::= (No type bound)
|
531
|
+
| `<` _bound-type_ (The generics parameter is bounded)
|
532
|
+
|
533
|
+
_bound-type_ ::= _class-name_ _type-arguments_ (Class instance type)
|
534
|
+
| _interface-name_ _type-arguments_ (Interface type)
|
535
|
+
| `singleton(` _class-name_ `)` (Class singleton type)
|
536
|
+
|
537
|
+
_generics-variance_ ::= (Invariant)
|
538
|
+
| `out` (Covariant)
|
539
|
+
| `in` (Contravariant)
|
540
|
+
|
541
|
+
_generics-unchecked_ ::= (Empty)
|
542
|
+
| `unchecked` (Skips variance annotation validation)
|
543
|
+
```
|
544
|
+
|
545
|
+
RBS allows class/module/interface/type alias definitions and methods to be generic.
|
546
|
+
|
547
|
+
```rbs
|
548
|
+
# Simple generic class definition
|
549
|
+
class Stack[T]
|
550
|
+
def push: (T) -> void
|
551
|
+
|
552
|
+
def pop: () -> T
|
553
|
+
end
|
554
|
+
```
|
555
|
+
|
556
|
+
For classes with type parameters, you may specify if they are "invariant" (default), "covariant" (`out`) or "contravariant" (`in`). See [this definition of covariance and contravariance](https://en.wikipedia.org/wiki/Covariance_and_contravariance_(computer_science)).
|
557
|
+
|
558
|
+
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:
|
559
|
+
|
560
|
+
```
|
561
|
+
# The `T` type parameter is covariant.
|
562
|
+
class Array[out T]
|
563
|
+
# etc.
|
564
|
+
end
|
565
|
+
```
|
566
|
+
|
567
|
+
There's a limitation with this is for mutable objects (like arrays): a mutation could invalidate this.
|
568
|
+
If an array of `String` is passed to a method as an array of `Objects`, and that method adds an Integer to the array, the promise is broken.
|
569
|
+
|
570
|
+
In those cases, one must use the `unchecked` keyword:
|
571
|
+
|
572
|
+
```rbs
|
573
|
+
# Skips the validation of variance of the type parameter `T`.
|
574
|
+
# The type safety prohibits `out` type parameters to appear at _negative_ position (== method parameter), but we want `Array` to have it.
|
575
|
+
class Array[unchecked out T]
|
576
|
+
def include?: (T) -> bool
|
577
|
+
end
|
578
|
+
```
|
579
|
+
|
580
|
+
This is how `Array` is actually defined in RBS.
|
581
|
+
|
582
|
+
Note that RBS doesn't allow specifying variance related annotations to generic method types.
|
583
|
+
|
584
|
+
```rbs
|
585
|
+
class Foo
|
586
|
+
def bar: [out T] () -> T # Syntax error
|
587
|
+
end
|
588
|
+
```
|
589
|
+
|
590
|
+
You can also specify the _upper bound_ of the type parameter.
|
591
|
+
|
592
|
+
```rbs
|
593
|
+
class PrettyPrint[T < _Output]
|
594
|
+
interface _Output
|
595
|
+
def <<: (String) -> void
|
596
|
+
end
|
597
|
+
|
598
|
+
attr_reader output: T
|
599
|
+
end
|
600
|
+
```
|
601
|
+
|
602
|
+
If a type parameter has an upper bound, the type parameter must be instantiated with types that is a subclass of the upper bound.
|
603
|
+
|
604
|
+
```rbs
|
605
|
+
type str_printer = PrettyPrint[String] # OK
|
606
|
+
type int_printer = PrettyPrint[Integer] # Type error
|
607
|
+
```
|
608
|
+
|
609
|
+
The upper bound must be one of a class instance type, interface type, or class singleton type.
|
610
|
+
|
558
611
|
### Comments
|
559
612
|
|
560
613
|
You can write single line comments. Comments must be on their own line. Comments can lead with whitespace.
|
@@ -6,12 +6,10 @@ VALUE RBS;
|
|
6
6
|
VALUE RBS_AST;
|
7
7
|
VALUE RBS_AST_Comment;
|
8
8
|
VALUE RBS_AST_Annotation;
|
9
|
+
VALUE RBS_AST_TypeParam;
|
9
10
|
|
10
11
|
VALUE RBS_AST_Declarations;
|
11
12
|
|
12
|
-
VALUE RBS_AST_Declarations_ModuleTypeParams;
|
13
|
-
VALUE RBS_AST_Declarations_ModuleTypeParams_TypeParam;
|
14
|
-
|
15
13
|
VALUE RBS_AST_Declarations_Alias;
|
16
14
|
VALUE RBS_AST_Declarations_Constant;
|
17
15
|
VALUE RBS_AST_Declarations_Global;
|
@@ -77,12 +75,10 @@ void rbs__init_constants() {
|
|
77
75
|
RBS_AST = rb_const_get(RBS, rb_intern("AST"));
|
78
76
|
RBS_AST_Comment = rb_const_get(RBS_AST, rb_intern("Comment"));
|
79
77
|
RBS_AST_Annotation = rb_const_get(RBS_AST, rb_intern("Annotation"));
|
78
|
+
RBS_AST_TypeParam = rb_const_get(RBS_AST, rb_intern("TypeParam"));
|
80
79
|
|
81
80
|
RBS_AST_Declarations = rb_const_get(RBS_AST, rb_intern("Declarations"));
|
82
81
|
|
83
|
-
RBS_AST_Declarations_ModuleTypeParams = rb_const_get(RBS_AST_Declarations, rb_intern("ModuleTypeParams"));
|
84
|
-
RBS_AST_Declarations_ModuleTypeParams_TypeParam = rb_const_get(RBS_AST_Declarations_ModuleTypeParams, rb_intern("TypeParam"));
|
85
|
-
|
86
82
|
RBS_AST_Declarations_Alias = rb_const_get(RBS_AST_Declarations, rb_intern("Alias"));
|
87
83
|
RBS_AST_Declarations_Constant = rb_const_get(RBS_AST_Declarations, rb_intern("Constant"));
|
88
84
|
RBS_AST_Declarations_Global = rb_const_get(RBS_AST_Declarations, rb_intern("Global"));
|
@@ -6,6 +6,7 @@ extern VALUE RBS;
|
|
6
6
|
extern VALUE RBS_AST;
|
7
7
|
extern VALUE RBS_AST_Annotation;
|
8
8
|
extern VALUE RBS_AST_Comment;
|
9
|
+
extern VALUE RBS_AST_TypeParam;
|
9
10
|
|
10
11
|
extern VALUE RBS_AST_Declarations;
|
11
12
|
extern VALUE RBS_AST_Declarations_Alias;
|
@@ -16,8 +17,6 @@ extern VALUE RBS_AST_Declarations_Global;
|
|
16
17
|
extern VALUE RBS_AST_Declarations_Interface;
|
17
18
|
extern VALUE RBS_AST_Declarations_Module_Self;
|
18
19
|
extern VALUE RBS_AST_Declarations_Module;
|
19
|
-
extern VALUE RBS_AST_Declarations_ModuleTypeParams_TypeParam;
|
20
|
-
extern VALUE RBS_AST_Declarations_ModuleTypeParams;
|
21
20
|
|
22
21
|
extern VALUE RBS_AST_Members;
|
23
22
|
extern VALUE RBS_AST_Members_Alias;
|