rbs 2.7.0 → 2.8.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/CHANGELOG.md +29 -0
- data/Gemfile.lock +18 -18
- data/Steepfile +2 -4
- data/core/io/buffer.rbs +15 -0
- data/core/io.rbs +6 -0
- data/docs/syntax.md +77 -32
- data/docs/tools.md +16 -0
- data/ext/rbs_extension/lexer.h +2 -0
- data/ext/rbs_extension/lexstate.c +9 -3
- data/ext/rbs_extension/parser.c +28 -11
- data/ext/rbs_extension/parserstate.c +7 -3
- data/ext/rbs_extension/parserstate.h +1 -1
- data/lib/rbs/cli.rb +4 -3
- data/lib/rbs/collection/config/lockfile_generator.rb +28 -2
- data/lib/rbs/collection/config.rb +21 -0
- data/lib/rbs/definition_builder/ancestor_builder.rb +6 -0
- data/lib/rbs/errors.rb +21 -1
- data/lib/rbs/parser_aux.rb +9 -6
- data/lib/rbs/version.rb +1 -1
- data/sig/collection/config.rbs +8 -0
- data/sig/errors.rbs +14 -0
- data/sig/manifest.yaml +0 -1
- data/sig/parser.rbs +41 -11
- data/stdlib/ipaddr/0/ipaddr.rbs +15 -0
- data/stdlib/socket/0/addrinfo.rbs +2 -1
- data/stdlib/socket/0/constants.rbs +2295 -0
- data/stdlib/socket/0/socket.rbs +899 -8
- data/stdlib/socket/0/socket_error.rbs +5 -0
- data/stdlib/yaml/0/dbm.rbs +1 -49
- data/stdlib/yaml/0/yaml.rbs +171 -0
- data/steep/Gemfile.lock +21 -9
- metadata +8 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a1d6bcfbb96db1bd762270824620e4a430057521398fdef7d8543cceaaaab127
|
4
|
+
data.tar.gz: 4616fee00017d88cb942fa34f25dee2bd1959ba83bf3f8eedf7f57770792d2e0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9bfb3f1cb6ed463fbc9d78181b6fdd683bbb476adfdbda4ef7a1009d8c225ee96f7f5d958dbba3d2f5b461f2253ad0d27e68072653efde251886550cf64973c3
|
7
|
+
data.tar.gz: bb8b7a2984b4211d8bbb19d213b999f78caa9e676fef3584da29b49a18639362f2884233337e1c5aedad01ce495055085ae080df81f696ce135de1220638d34a
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,35 @@
|
|
2
2
|
|
3
3
|
## master
|
4
4
|
|
5
|
+
## 2.8.0.pre.1 (2022-11-17)
|
6
|
+
|
7
|
+
### Signature updates
|
8
|
+
|
9
|
+
* `IO` ([#1132](https://github.com/ruby/rbs/pull/1132))
|
10
|
+
* `IO::Buffer` ([#1137](https://github.com/ruby/rbs/pull/1137))
|
11
|
+
* `IPAddr` ([#1131](https://github.com/ruby/rbs/pull/1131), [#1151](https://github.com/ruby/rbs/pull/1151))
|
12
|
+
* `Socket` ([#1133](https://github.com/ruby/rbs/pull/1133), [#1134](https://github.com/ruby/rbs/pull/1134), [#1151](https://github.com/ruby/rbs/pull/1151))
|
13
|
+
* `Yaml` ([#1141](https://github.com/ruby/rbs/pull/1141))
|
14
|
+
|
15
|
+
### Library changes
|
16
|
+
|
17
|
+
* Make type/method-type parser more flexible about input position ([#1140](https://github.com/ruby/rbs/pull/1140))
|
18
|
+
* Raise an error if a class definition inherits a module ([#1152](https://github.com/ruby/rbs/pull/1152))
|
19
|
+
* Fix SEGV when parse with invalid content ([#1146](https://github.com/ruby/rbs/pull/1146))
|
20
|
+
|
21
|
+
#### rbs collection
|
22
|
+
|
23
|
+
* Support to call collection command in child dir ([#1025](https://github.com/ruby/rbs/pull/1025), [#1135](https://github.com/ruby/rbs/pull/1135))
|
24
|
+
|
25
|
+
### Miscellaneous
|
26
|
+
|
27
|
+
* Remove `rubygems` from `rbs`’s manifest ([#1150](https://github.com/ruby/rbs/pull/1150))
|
28
|
+
* Use `untyped` instead of `any` in `syntax.md` ([#1147](https://github.com/ruby/rbs/pull/1147))
|
29
|
+
* Fix typo and grammatical mistakes in "Generics" section of `syntax.md` ([#1127](https://github.com/ruby/rbs/pull/1127))
|
30
|
+
* Add a doc that describes tools related to RBS ([#1125](https://github.com/ruby/rbs/pull/1125))
|
31
|
+
* Add self-type-bindings to `syntax.md` ([#1123](https://github.com/ruby/rbs/pull/1123))
|
32
|
+
* Add documentation for `...` in `syntax.md` ([#1120](https://github.com/ruby/rbs/pull/1120))
|
33
|
+
|
5
34
|
## 2.7.0 (2022-10-07)
|
6
35
|
|
7
36
|
### Signature updates
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
rbs (2.
|
4
|
+
rbs (2.8.0.pre.1)
|
5
5
|
|
6
6
|
PATH
|
7
7
|
remote: test/assets/test-gem
|
@@ -47,32 +47,32 @@ GEM
|
|
47
47
|
rake
|
48
48
|
rdoc (6.4.0)
|
49
49
|
psych (>= 4.0.0)
|
50
|
-
regexp_parser (2.
|
50
|
+
regexp_parser (2.6.0)
|
51
51
|
rexml (3.2.5)
|
52
|
-
rspec (3.
|
53
|
-
rspec-core (~> 3.
|
54
|
-
rspec-expectations (~> 3.
|
55
|
-
rspec-mocks (~> 3.
|
56
|
-
rspec-core (3.
|
57
|
-
rspec-support (~> 3.
|
58
|
-
rspec-expectations (3.
|
52
|
+
rspec (3.12.0)
|
53
|
+
rspec-core (~> 3.12.0)
|
54
|
+
rspec-expectations (~> 3.12.0)
|
55
|
+
rspec-mocks (~> 3.12.0)
|
56
|
+
rspec-core (3.12.0)
|
57
|
+
rspec-support (~> 3.12.0)
|
58
|
+
rspec-expectations (3.12.0)
|
59
59
|
diff-lcs (>= 1.2.0, < 2.0)
|
60
|
-
rspec-support (~> 3.
|
61
|
-
rspec-mocks (3.
|
60
|
+
rspec-support (~> 3.12.0)
|
61
|
+
rspec-mocks (3.12.0)
|
62
62
|
diff-lcs (>= 1.2.0, < 2.0)
|
63
|
-
rspec-support (~> 3.
|
64
|
-
rspec-support (3.
|
65
|
-
rubocop (1.
|
63
|
+
rspec-support (~> 3.12.0)
|
64
|
+
rspec-support (3.12.0)
|
65
|
+
rubocop (1.38.0)
|
66
66
|
json (~> 2.3)
|
67
67
|
parallel (~> 1.10)
|
68
68
|
parser (>= 3.1.2.1)
|
69
69
|
rainbow (>= 2.2.2, < 4.0)
|
70
70
|
regexp_parser (>= 1.8, < 3.0)
|
71
71
|
rexml (>= 3.2.5, < 4.0)
|
72
|
-
rubocop-ast (>= 1.
|
72
|
+
rubocop-ast (>= 1.23.0, < 2.0)
|
73
73
|
ruby-progressbar (~> 1.7)
|
74
74
|
unicode-display_width (>= 1.4.0, < 3.0)
|
75
|
-
rubocop-ast (1.
|
75
|
+
rubocop-ast (1.23.0)
|
76
76
|
parser (>= 3.1.1.0)
|
77
77
|
rubocop-rubycw (0.1.6)
|
78
78
|
rubocop (~> 1.0)
|
@@ -80,13 +80,13 @@ GEM
|
|
80
80
|
rake (>= 0.8.1)
|
81
81
|
ruby-progressbar (1.11.0)
|
82
82
|
singleton (0.1.1)
|
83
|
-
stackprof (0.2.
|
83
|
+
stackprof (0.2.22)
|
84
84
|
stringio (3.0.2)
|
85
85
|
strong_json (2.1.2)
|
86
86
|
tempfile (0.1.2)
|
87
87
|
test-unit (3.5.5)
|
88
88
|
power_assert
|
89
|
-
unicode-display_width (2.
|
89
|
+
unicode-display_width (2.3.0)
|
90
90
|
|
91
91
|
PLATFORMS
|
92
92
|
ruby
|
data/Steepfile
CHANGED
@@ -9,14 +9,12 @@ target :lib do
|
|
9
9
|
"lib/rbs/test.rb"
|
10
10
|
)
|
11
11
|
|
12
|
-
library "set", "pathname", "json", "logger", "monitor", "tsort", "uri", '
|
12
|
+
library "set", "pathname", "json", "logger", "monitor", "tsort", "uri", 'dbm', 'pstore', 'singleton', 'shellwords', 'fileutils', 'find', 'digest'
|
13
|
+
signature 'stdlib/yaml/0'
|
13
14
|
signature "stdlib/strscan/0/"
|
14
15
|
signature "stdlib/optparse/0/"
|
15
16
|
signature "stdlib/rdoc/0/"
|
16
17
|
|
17
|
-
# Please remove the following line after releasing #1107
|
18
|
-
signature "core/rubygems/"
|
19
|
-
|
20
18
|
configure_code_diagnostics do |config|
|
21
19
|
config[D::Ruby::MethodDefinitionMissing] = :hint
|
22
20
|
config[D::Ruby::ElseOnExhaustiveCase] = :hint
|
data/core/io/buffer.rbs
CHANGED
@@ -706,5 +706,20 @@ class IO
|
|
706
706
|
PRIVATE: Integer
|
707
707
|
|
708
708
|
READONLY: Integer
|
709
|
+
|
710
|
+
class LockedError < RuntimeError
|
711
|
+
end
|
712
|
+
|
713
|
+
class AllocationError < RuntimeError
|
714
|
+
end
|
715
|
+
|
716
|
+
class AccessError < RuntimeError
|
717
|
+
end
|
718
|
+
|
719
|
+
class InvalidatedError < RuntimeError
|
720
|
+
end
|
721
|
+
|
722
|
+
class MaskError < ArgumentError
|
723
|
+
end
|
709
724
|
end
|
710
725
|
end
|
data/core/io.rbs
CHANGED
@@ -2984,6 +2984,12 @@ IO::TRUNC: Integer
|
|
2984
2984
|
|
2985
2985
|
IO::WRONLY: Integer
|
2986
2986
|
|
2987
|
+
IO::READABLE: Integer
|
2988
|
+
|
2989
|
+
IO::WRITABLE: Integer
|
2990
|
+
|
2991
|
+
IO::PRIORITY: Integer
|
2992
|
+
|
2987
2993
|
# <!-- rdoc-file=io.c -->
|
2988
2994
|
# exception to wait for reading by EAGAIN. see IO.select.
|
2989
2995
|
#
|
data/docs/syntax.md
CHANGED
@@ -3,18 +3,17 @@
|
|
3
3
|
## Types
|
4
4
|
|
5
5
|
```markdown
|
6
|
-
_type_ ::= _class-name_ _type-arguments_
|
7
|
-
| _interface-name_ _type-arguments_
|
8
|
-
| _alias-name_ _type-arguments_
|
9
|
-
| `singleton(` _class-name_ `)`
|
10
|
-
| _literal_
|
11
|
-
| _type_ `|` _type_
|
12
|
-
| _type_ `&` _type_
|
13
|
-
| _type_ `?`
|
14
|
-
| `{` _record-name_ `:` _type_ `,` etc. `}`
|
15
|
-
| `[]` | `[` _type_ `,` etc. `]`
|
16
|
-
| _type-variable_
|
17
|
-
| `^(` _parameters_ `) ->` _type_ (Proc type)
|
6
|
+
_type_ ::= _class-name_ _type-arguments_ (Class instance type)
|
7
|
+
| _interface-name_ _type-arguments_ (Interface type)
|
8
|
+
| _alias-name_ _type-arguments_ (Alias type)
|
9
|
+
| `singleton(` _class-name_ `)` (Class singleton type)
|
10
|
+
| _literal_ (Literal type)
|
11
|
+
| _type_ `|` _type_ (Union type)
|
12
|
+
| _type_ `&` _type_ (Intersection type)
|
13
|
+
| _type_ `?` (Optional type)
|
14
|
+
| `{` _record-name_ `:` _type_ `,` etc. `}` (Record type)
|
15
|
+
| `[]` | `[` _type_ `,` etc. `]` (Tuples)
|
16
|
+
| _type-variable_ (Type variables)
|
18
17
|
| `self`
|
19
18
|
| `instance`
|
20
19
|
| `class`
|
@@ -24,6 +23,7 @@ _type_ ::= _class-name_ _type-arguments_ (Class instance type)
|
|
24
23
|
| `top`
|
25
24
|
| `bot`
|
26
25
|
| `void`
|
26
|
+
| _proc_ (Proc type)
|
27
27
|
|
28
28
|
_class-name_ ::= _namespace_ /[A-Z]\w*/
|
29
29
|
_interface-name_ ::= _namespace_ /_[A-Z]\w*/
|
@@ -43,6 +43,8 @@ _literal_ ::= _string-literal_
|
|
43
43
|
| _integer-literal_
|
44
44
|
| `true`
|
45
45
|
| `false`
|
46
|
+
|
47
|
+
_proc_ ::= _parameters?_ _self-type-binding?_ _block?_ `->` _type_
|
46
48
|
```
|
47
49
|
|
48
50
|
### Class instance type
|
@@ -164,15 +166,6 @@ class Ref[T] # Object is scoped in the class declaration.
|
|
164
166
|
end
|
165
167
|
```
|
166
168
|
|
167
|
-
### Proc type
|
168
|
-
|
169
|
-
Proc type denotes type of procedures, `Proc` instances.
|
170
|
-
|
171
|
-
```
|
172
|
-
^(Integer) -> String # A procedure with an `Integer` parameter and returns `String`
|
173
|
-
^(?String, size: Integer) -> bool # A procedure with `String` optional parameter, `size` keyword of `Integer`, and returns `bool`
|
174
|
-
```
|
175
|
-
|
176
169
|
### Base types
|
177
170
|
|
178
171
|
`self` denotes the type of receiver. The type is used to model the open recursion via `self`.
|
@@ -221,14 +214,28 @@ They are all equivalent for the type system; they are all _top type_.
|
|
221
214
|
|
222
215
|
`void` tells developers a hint that _the value should not be used_. `boolish` implies the value is used as a truth value. `top` is anything else.
|
223
216
|
|
224
|
-
|
217
|
+
### Proc type
|
218
|
+
|
219
|
+
Proc type denotes type of procedures, `Proc` instances.
|
220
|
+
|
221
|
+
```
|
222
|
+
^(Integer) -> String # A procedure with an `Integer` parameter and returns `String`
|
223
|
+
^(?String, size: Integer) -> bool # A procedure with `String` optional parameter, `size` keyword of `Integer`, and returns `bool`
|
224
|
+
```
|
225
|
+
|
226
|
+
See the next section for details.
|
227
|
+
|
228
|
+
## Method Types and Proc Types
|
225
229
|
|
226
230
|
```markdown
|
227
|
-
_method-type_ ::=
|
228
|
-
|
229
|
-
|
231
|
+
_method-type_ ::= _parameters?_ _block?_ `->` _type_ # Method type
|
232
|
+
|
233
|
+
_proc_ ::= `^` _parameters?_ _self-type-binding?_ _block?_ `->` _type_ # Proc type
|
230
234
|
|
231
|
-
|
235
|
+
_parameters?_ ::= (Empty)
|
236
|
+
| _parameters_ (Parameters)
|
237
|
+
|
238
|
+
_parameters_ ::= `(` _required-positionals_ _optional-positionals_ _rest-positional_ _trailing-positionals_ _keywords_ `)`
|
232
239
|
|
233
240
|
_parameter_ ::= _type_ _var-name_ # Parameter with var name
|
234
241
|
| _type_ # Parameter without var name
|
@@ -243,6 +250,13 @@ _keywords_ ::= # Empty
|
|
243
250
|
| `?` _keyword_ `:` _parameter_ `,` _keywords_ # Optional keyword
|
244
251
|
|
245
252
|
_var-name_ ::= /[a-z]\w*/
|
253
|
+
|
254
|
+
_self-type-binding?_ = (Empty)
|
255
|
+
| `[` `self` `:` _type_ `]` (Self type binding)
|
256
|
+
|
257
|
+
_block?_ = (No block)
|
258
|
+
| `{` _parameters_ _self-type-binding?_ `->` _type_ `}` (Block)
|
259
|
+
| `?` `{` _parameters_ _self-type-binding?_ `->` _type_ `}` (Optional block)
|
246
260
|
```
|
247
261
|
|
248
262
|
### Parameters
|
@@ -250,7 +264,7 @@ _var-name_ ::= /[a-z]\w*/
|
|
250
264
|
A parameter can be a type or a pair of type and variable name.
|
251
265
|
Variable name can be used for documentation.
|
252
266
|
|
253
|
-
|
267
|
+
#### Examples
|
254
268
|
|
255
269
|
```
|
256
270
|
# Two required positional `Integer` parameters, and returns `String`
|
@@ -269,6 +283,29 @@ Variable name can be used for documentation.
|
|
269
283
|
(size: Integer sz, ?name: String, ?created_at: Time?) -> void
|
270
284
|
```
|
271
285
|
|
286
|
+
### Self type binding
|
287
|
+
|
288
|
+
Self type binding represents the type of methods that uses `#instance_eval`, which replaces the value of `self` inside blocks.
|
289
|
+
|
290
|
+
```ruby
|
291
|
+
123.instance_eval do
|
292
|
+
self + 1 # self is `123` here
|
293
|
+
end
|
294
|
+
```
|
295
|
+
|
296
|
+
Proc types and blocks can have self type bindings.
|
297
|
+
|
298
|
+
```rbs
|
299
|
+
^(Integer) [self: String] -> void # Proc type with self type binding
|
300
|
+
^(Integer) [self: String] { (Symbol) [self: bool] -> void } -> void # Proc type with self type binding of `String` and a block with self type binding of `bool`
|
301
|
+
```
|
302
|
+
|
303
|
+
Method type can have blocks with self type bindings.
|
304
|
+
|
305
|
+
```rbs
|
306
|
+
() { (Integer) [self: String] -> void } -> void # A method type with block with self type binding
|
307
|
+
```
|
308
|
+
|
272
309
|
## Members
|
273
310
|
|
274
311
|
```markdown
|
@@ -349,6 +386,14 @@ def +: (Float) -> Float
|
|
349
386
|
| (Numeric) -> Numeric
|
350
387
|
```
|
351
388
|
|
389
|
+
Overloaded method can have `...` to overload an existing method. It is useful for monkey-patching.
|
390
|
+
|
391
|
+
```
|
392
|
+
def +: (Float) -> Float
|
393
|
+
def +: (BigDecimal) -> BigDecimal
|
394
|
+
| ...
|
395
|
+
```
|
396
|
+
|
352
397
|
You need extra parentheses on return type to avoid ambiguity.
|
353
398
|
|
354
399
|
```
|
@@ -516,7 +561,7 @@ Interface declaration can have parameters but allows only a few of the members.
|
|
516
561
|
```
|
517
562
|
interface _Hashing
|
518
563
|
def hash: () -> Integer
|
519
|
-
def eql?: (
|
564
|
+
def eql?: (untyped) -> bool
|
520
565
|
end
|
521
566
|
```
|
522
567
|
|
@@ -574,8 +619,8 @@ _generics-bound_ ::= (No type bound)
|
|
574
619
|
| `<` _bound-type_ (The generics parameter is bounded)
|
575
620
|
|
576
621
|
_bound-type_ ::= _class-name_ _type-arguments_ (Class instance type)
|
577
|
-
|
578
|
-
|
622
|
+
| _interface-name_ _type-arguments_ (Interface type)
|
623
|
+
| `singleton(` _class-name_ `)` (Class singleton type)
|
579
624
|
|
580
625
|
_generics-variance_ ::= (Invariant)
|
581
626
|
| `out` (Covariant)
|
@@ -607,8 +652,8 @@ class Array[out T]
|
|
607
652
|
end
|
608
653
|
```
|
609
654
|
|
610
|
-
There's a limitation with this
|
611
|
-
If an
|
655
|
+
There's a limitation with this for mutable objects (like arrays): a mutation could invalidate this.
|
656
|
+
If an `Array` of `String` is passed to a method as an `Array` of `Object`, and that method adds an `Integer` to the `Array`, the promise is broken.
|
612
657
|
|
613
658
|
In those cases, one must use the `unchecked` keyword:
|
614
659
|
|
data/docs/tools.md
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
# Tools
|
2
|
+
|
3
|
+
This documentation describes major tools related to RBS. They are listed alphabetically.
|
4
|
+
|
5
|
+
## Type Checkers
|
6
|
+
|
7
|
+
* [Steep](https://github.com/soutaro/steep) is a static type checker based on RBS. You can use it as a language server integrated with an editor or IDE and run it from the command line.
|
8
|
+
* [TypeProf](https://github.com/ruby/typeprof)
|
9
|
+
|
10
|
+
## Editor integrations
|
11
|
+
|
12
|
+
* Emacs: [rbs-mode](https://github.com/ybiquitous/rbs-mode)
|
13
|
+
* RubyMine: [It supports RBS by default](https://www.jetbrains.com/help/ruby/rbs.html)
|
14
|
+
* Sublime Text: [sublime-rbs-plugin](https://github.com/soutaro/sublime-rbs-plugin)
|
15
|
+
* Vim: [rbs.vim](https://github.com/pocke/rbs.vim)
|
16
|
+
* Visual Studio Code: [vscode-rbs-syntax](https://github.com/soutaro/vscode-rbs-syntax)
|
data/ext/rbs_extension/lexer.h
CHANGED
@@ -119,6 +119,8 @@ typedef struct {
|
|
119
119
|
* */
|
120
120
|
typedef struct {
|
121
121
|
VALUE string;
|
122
|
+
int start_pos; /* The character position that defines the start of the input */
|
123
|
+
int end_pos; /* The character position that defines the end of the input */
|
122
124
|
position current; /* The current position */
|
123
125
|
position start; /* The start position of the current token */
|
124
126
|
bool first_token_of_line; /* This flag is used for tLINECOMMENT */
|
@@ -100,9 +100,14 @@ int token_bytes(token tok) {
|
|
100
100
|
}
|
101
101
|
|
102
102
|
unsigned int peek(lexstate *state) {
|
103
|
-
|
104
|
-
|
105
|
-
|
103
|
+
if (state->current.char_pos == state->end_pos) {
|
104
|
+
state->last_char = '\0';
|
105
|
+
return 0;
|
106
|
+
} else {
|
107
|
+
unsigned int c = rb_enc_mbc_to_codepoint(RSTRING_PTR(state->string) + state->current.byte_pos, RSTRING_END(state->string), rb_enc_get(state->string));
|
108
|
+
state->last_char = c;
|
109
|
+
return c;
|
110
|
+
}
|
106
111
|
}
|
107
112
|
|
108
113
|
token next_token(lexstate *state, enum TokenType type) {
|
@@ -137,6 +142,7 @@ void skip(lexstate *state) {
|
|
137
142
|
|
138
143
|
void skipn(lexstate *state, size_t size) {
|
139
144
|
for (size_t i = 0; i < size; i ++) {
|
145
|
+
peek(state);
|
140
146
|
skip(state);
|
141
147
|
}
|
142
148
|
}
|
data/ext/rbs_extension/parser.c
CHANGED
@@ -2502,12 +2502,19 @@ VALUE parse_signature(parserstate *state) {
|
|
2502
2502
|
}
|
2503
2503
|
|
2504
2504
|
static VALUE
|
2505
|
-
rbsparser_parse_type(VALUE self, VALUE buffer, VALUE
|
2505
|
+
rbsparser_parse_type(VALUE self, VALUE buffer, VALUE start_pos, VALUE end_pos, VALUE variables, VALUE requires_eof)
|
2506
2506
|
{
|
2507
|
-
parserstate *parser = alloc_parser(buffer, FIX2INT(
|
2507
|
+
parserstate *parser = alloc_parser(buffer, FIX2INT(start_pos), FIX2INT(end_pos), variables);
|
2508
|
+
|
2509
|
+
if (parser->next_token.type == pEOF) {
|
2510
|
+
return Qnil;
|
2511
|
+
}
|
2508
2512
|
|
2509
2513
|
VALUE type = parse_type(parser);
|
2510
|
-
|
2514
|
+
|
2515
|
+
if (RTEST(requires_eof)) {
|
2516
|
+
parser_advance_assert(parser, pEOF);
|
2517
|
+
}
|
2511
2518
|
|
2512
2519
|
free_parser(parser);
|
2513
2520
|
|
@@ -2515,19 +2522,29 @@ rbsparser_parse_type(VALUE self, VALUE buffer, VALUE line, VALUE column, VALUE v
|
|
2515
2522
|
}
|
2516
2523
|
|
2517
2524
|
static VALUE
|
2518
|
-
rbsparser_parse_method_type(VALUE self, VALUE buffer, VALUE
|
2525
|
+
rbsparser_parse_method_type(VALUE self, VALUE buffer, VALUE start_pos, VALUE end_pos, VALUE variables, VALUE requires_eof)
|
2519
2526
|
{
|
2520
|
-
parserstate *parser = alloc_parser(buffer, FIX2INT(
|
2527
|
+
parserstate *parser = alloc_parser(buffer, FIX2INT(start_pos), FIX2INT(end_pos), variables);
|
2528
|
+
|
2529
|
+
if (parser->next_token.type == pEOF) {
|
2530
|
+
return Qnil;
|
2531
|
+
}
|
2532
|
+
|
2521
2533
|
VALUE method_type = parse_method_type(parser);
|
2522
|
-
|
2534
|
+
|
2535
|
+
if (RTEST(requires_eof)) {
|
2536
|
+
parser_advance_assert(parser, pEOF);
|
2537
|
+
}
|
2538
|
+
|
2539
|
+
free_parser(parser);
|
2523
2540
|
|
2524
2541
|
return method_type;
|
2525
2542
|
}
|
2526
2543
|
|
2527
2544
|
static VALUE
|
2528
|
-
rbsparser_parse_signature(VALUE self, VALUE buffer, VALUE
|
2545
|
+
rbsparser_parse_signature(VALUE self, VALUE buffer, VALUE end_pos)
|
2529
2546
|
{
|
2530
|
-
parserstate *parser = alloc_parser(buffer,
|
2547
|
+
parserstate *parser = alloc_parser(buffer, 0, FIX2INT(end_pos), Qnil);
|
2531
2548
|
VALUE signature = parse_signature(parser);
|
2532
2549
|
free_parser(parser);
|
2533
2550
|
|
@@ -2536,7 +2553,7 @@ rbsparser_parse_signature(VALUE self, VALUE buffer, VALUE line, VALUE column)
|
|
2536
2553
|
|
2537
2554
|
void rbs__init_parser(void) {
|
2538
2555
|
RBS_Parser = rb_define_class_under(RBS, "Parser", rb_cObject);
|
2539
|
-
rb_define_singleton_method(RBS_Parser, "_parse_type", rbsparser_parse_type,
|
2540
|
-
rb_define_singleton_method(RBS_Parser, "_parse_method_type", rbsparser_parse_method_type,
|
2541
|
-
rb_define_singleton_method(RBS_Parser, "_parse_signature", rbsparser_parse_signature,
|
2556
|
+
rb_define_singleton_method(RBS_Parser, "_parse_type", rbsparser_parse_type, 5);
|
2557
|
+
rb_define_singleton_method(RBS_Parser, "_parse_method_type", rbsparser_parse_method_type, 5);
|
2558
|
+
rb_define_singleton_method(RBS_Parser, "_parse_signature", rbsparser_parse_signature, 2);
|
2542
2559
|
}
|
@@ -272,13 +272,17 @@ VALUE comment_to_ruby(comment *com, VALUE buffer) {
|
|
272
272
|
);
|
273
273
|
}
|
274
274
|
|
275
|
-
parserstate *alloc_parser(VALUE buffer, int
|
275
|
+
parserstate *alloc_parser(VALUE buffer, int start_pos, int end_pos, VALUE variables) {
|
276
276
|
VALUE string = rb_funcall(buffer, rb_intern("content"), 0);
|
277
277
|
|
278
|
+
StringValue(string);
|
279
|
+
|
278
280
|
lexstate *lexer = calloc(1, sizeof(lexstate));
|
279
281
|
lexer->string = string;
|
280
|
-
lexer->current.line =
|
281
|
-
lexer->
|
282
|
+
lexer->current.line = 1;
|
283
|
+
lexer->start_pos = start_pos;
|
284
|
+
lexer->end_pos = end_pos;
|
285
|
+
skipn(lexer, start_pos);
|
282
286
|
lexer->start = lexer->current;
|
283
287
|
lexer->first_token_of_line = lexer->current.column == 0;
|
284
288
|
|
@@ -101,7 +101,7 @@ bool parser_typevar_member(parserstate *state, ID id);
|
|
101
101
|
* alloc_parser(buffer, 3, 5, Qnil) // New parserstate without variables
|
102
102
|
* ```
|
103
103
|
* */
|
104
|
-
parserstate *alloc_parser(VALUE buffer, int
|
104
|
+
parserstate *alloc_parser(VALUE buffer, int start_pos, int end_pos, VALUE variables);
|
105
105
|
void free_parser(parserstate *parser);
|
106
106
|
/**
|
107
107
|
* Advance one token.
|
data/lib/rbs/cli.rb
CHANGED
@@ -19,7 +19,7 @@ module RBS
|
|
19
19
|
|
20
20
|
@libs = []
|
21
21
|
@dirs = []
|
22
|
-
@config_path = Collection::Config::PATH
|
22
|
+
@config_path = Collection::Config.find_config_path || Collection::Config::PATH
|
23
23
|
end
|
24
24
|
|
25
25
|
def loader
|
@@ -1034,16 +1034,17 @@ EOB
|
|
1034
1034
|
opts.order args.drop(1), into: params
|
1035
1035
|
config_path = options.config_path or raise
|
1036
1036
|
lock_path = Collection::Config.to_lockfile_path(config_path)
|
1037
|
+
gemfile_lock_path = Bundler.default_lockfile
|
1037
1038
|
|
1038
1039
|
case args[0]
|
1039
1040
|
when 'install'
|
1040
1041
|
unless params[:frozen]
|
1041
|
-
Collection::Config.generate_lockfile(config_path: config_path, gemfile_lock_path:
|
1042
|
+
Collection::Config.generate_lockfile(config_path: config_path, gemfile_lock_path: gemfile_lock_path)
|
1042
1043
|
end
|
1043
1044
|
Collection::Installer.new(lockfile_path: lock_path, stdout: stdout).install_from_lockfile
|
1044
1045
|
when 'update'
|
1045
1046
|
# TODO: Be aware of argv to update only specified gem
|
1046
|
-
Collection::Config.generate_lockfile(config_path: config_path, gemfile_lock_path:
|
1047
|
+
Collection::Config.generate_lockfile(config_path: config_path, gemfile_lock_path: gemfile_lock_path, with_lockfile: false)
|
1047
1048
|
Collection::Installer.new(lockfile_path: lock_path, stdout: stdout).install_from_lockfile
|
1048
1049
|
when 'init'
|
1049
1050
|
if config_path.exist?
|
@@ -2,10 +2,24 @@
|
|
2
2
|
|
3
3
|
module RBS
|
4
4
|
module Collection
|
5
|
-
|
6
|
-
# This class represent the configration file.
|
7
5
|
class Config
|
8
6
|
class LockfileGenerator
|
7
|
+
class GemfileLockMismatchError < StandardError
|
8
|
+
def initialize(expected:, actual:)
|
9
|
+
@expected = expected
|
10
|
+
@actual = actual
|
11
|
+
end
|
12
|
+
|
13
|
+
def message
|
14
|
+
<<~MESSAGE
|
15
|
+
RBS Collection loads a different Gemfile.lock from before.
|
16
|
+
The Gemfile.lock must be the same as that is recorded in rbs_collection.lock.yaml.
|
17
|
+
Expected Gemfile.lock: #{@expected}
|
18
|
+
Actual Gemfile.lock: #{@actual}
|
19
|
+
MESSAGE
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
9
23
|
attr_reader :config, :lock, :gemfile_lock, :lock_path
|
10
24
|
|
11
25
|
def self.generate(config_path:, gemfile_lock_path:, with_lockfile: true)
|
@@ -18,6 +32,10 @@ module RBS
|
|
18
32
|
@lock = Config.from_path(lock_path) if lock_path.exist? && with_lockfile
|
19
33
|
@gemfile_lock = Bundler::LockfileParser.new(gemfile_lock_path.read)
|
20
34
|
@gem_queue = []
|
35
|
+
|
36
|
+
validate_gemfile_lock_path!(lock: lock, gemfile_lock_path: gemfile_lock_path)
|
37
|
+
|
38
|
+
config.gemfile_lock_path = gemfile_lock_path
|
21
39
|
end
|
22
40
|
|
23
41
|
def generate
|
@@ -38,6 +56,14 @@ module RBS
|
|
38
56
|
config
|
39
57
|
end
|
40
58
|
|
59
|
+
private def validate_gemfile_lock_path!(lock:, gemfile_lock_path:)
|
60
|
+
return unless lock
|
61
|
+
return unless lock.gemfile_lock_path
|
62
|
+
return if lock.gemfile_lock_path == gemfile_lock_path
|
63
|
+
|
64
|
+
raise GemfileLockMismatchError.new(expected: lock.gemfile_lock_path, actual: gemfile_lock_path)
|
65
|
+
end
|
66
|
+
|
41
67
|
private def assign_gem(name:, version:)
|
42
68
|
# @type var locked: gem_entry?
|
43
69
|
locked = lock&.gem(name)
|
@@ -16,6 +16,17 @@ module RBS
|
|
16
16
|
|
17
17
|
PATH = Pathname('rbs_collection.yaml')
|
18
18
|
|
19
|
+
def self.find_config_path
|
20
|
+
current = Pathname.pwd
|
21
|
+
|
22
|
+
loop do
|
23
|
+
config_path = current.join(PATH)
|
24
|
+
return config_path if config_path.exist?
|
25
|
+
current = current.join('..')
|
26
|
+
return nil if current.root?
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
19
30
|
# Generate a rbs lockfile from Gemfile.lock to `config_path`.
|
20
31
|
# If `with_lockfile` is true, it respects existing rbs lockfile.
|
21
32
|
def self.generate_lockfile(config_path:, gemfile_lock_path:, with_lockfile: true)
|
@@ -69,6 +80,16 @@ module RBS
|
|
69
80
|
@data['gems'] ||= []
|
70
81
|
end
|
71
82
|
|
83
|
+
def gemfile_lock_path=(path)
|
84
|
+
@data['gemfile_lock_path'] = path.relative_path_from(@config_path.dirname).to_s
|
85
|
+
end
|
86
|
+
|
87
|
+
def gemfile_lock_path
|
88
|
+
path = @data['gemfile_lock_path']
|
89
|
+
return unless path
|
90
|
+
@config_path.dirname.join path
|
91
|
+
end
|
92
|
+
|
72
93
|
# It raises an error when there are non-available libraries
|
73
94
|
def check_rbs_availability!
|
74
95
|
raise CollectionNotAvailable unless repo_path.exist?
|
@@ -211,6 +211,9 @@ module RBS
|
|
211
211
|
end
|
212
212
|
|
213
213
|
NoSuperclassFoundError.check!(super_name, env: env, location: primary.decl.location)
|
214
|
+
if super_class
|
215
|
+
InheritModuleError.check!(super_class, env: env)
|
216
|
+
end
|
214
217
|
|
215
218
|
ancestors = OneAncestors.class_instance(
|
216
219
|
type_name: type_name,
|
@@ -268,6 +271,9 @@ module RBS
|
|
268
271
|
end
|
269
272
|
|
270
273
|
NoSuperclassFoundError.check!(super_name, env: env, location: primary.decl.location)
|
274
|
+
if super_class
|
275
|
+
InheritModuleError.check!(super_class, env: env)
|
276
|
+
end
|
271
277
|
|
272
278
|
ancestors = OneAncestors.singleton(
|
273
279
|
type_name: type_name,
|