rbs 2.1.0 → 2.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/comments.yml +34 -0
- data/CHANGELOG.md +45 -0
- data/Rakefile +52 -21
- data/core/encoding.rbs +742 -0
- data/core/file.rbs +1 -3
- data/core/kernel.rbs +5 -3
- data/docs/syntax.md +54 -11
- data/ext/rbs_extension/extconf.rb +1 -0
- data/ext/rbs_extension/lexer.h +5 -0
- data/ext/rbs_extension/lexstate.c +6 -0
- data/ext/rbs_extension/parser.c +85 -10
- data/ext/rbs_extension/ruby_objs.c +4 -2
- data/ext/rbs_extension/ruby_objs.h +2 -2
- data/goodcheck.yml +0 -11
- data/lib/rbs/annotate/rdoc_annotator.rb +2 -2
- data/lib/rbs/ast/members.rb +21 -13
- data/lib/rbs/buffer.rb +17 -11
- data/lib/rbs/cli.rb +5 -2
- data/lib/rbs/definition_builder/method_builder.rb +28 -16
- data/lib/rbs/definition_builder.rb +1 -1
- data/lib/rbs/environment.rb +8 -4
- data/lib/rbs/namespace.rb +1 -1
- data/lib/rbs/type_name.rb +1 -1
- data/lib/rbs/types.rb +1 -1
- data/lib/rbs/validator.rb +2 -0
- data/lib/rbs/version.rb +1 -1
- data/lib/rbs/writer.rb +54 -4
- data/lib/rbs.rb +0 -2
- data/schema/typeParam.json +3 -3
- data/sig/annotate/rdoc_annotater.rbs +1 -1
- data/sig/buffer.rbs +6 -2
- data/sig/members.rbs +24 -18
- data/sig/method_builder.rbs +5 -4
- data/sig/writer.rbs +79 -2
- data/stdlib/net-http/0/manifest.yaml +1 -0
- data/stdlib/net-http/0/net-http.rbs +21 -0
- data/stdlib/uri/0/generic.rbs +2 -2
- data/stdlib/uri/0/http.rbs +35 -0
- metadata +3 -3
- data/sig/char_scanner.rbs +0 -9
data/core/file.rbs
CHANGED
@@ -1492,7 +1492,7 @@ class File::Stat < Object
|
|
1492
1492
|
# Create a File::Stat object for the given file name (raising an exception if
|
1493
1493
|
# the file doesn't exist).
|
1494
1494
|
#
|
1495
|
-
def initialize: (String file) ->
|
1495
|
+
def initialize: (String file) -> void
|
1496
1496
|
|
1497
1497
|
# <!--
|
1498
1498
|
# rdoc-file=file.c
|
@@ -1826,8 +1826,6 @@ class File::Stat < Object
|
|
1826
1826
|
#
|
1827
1827
|
def rdev_minor: () -> Integer
|
1828
1828
|
|
1829
|
-
def read: (?int? length, ?string outbuf) -> String?
|
1830
|
-
|
1831
1829
|
# <!--
|
1832
1830
|
# rdoc-file=file.c
|
1833
1831
|
# - stat.readable? -> true or false
|
data/core/kernel.rbs
CHANGED
@@ -275,8 +275,6 @@
|
|
275
275
|
#
|
276
276
|
%a{annotate:rdoc:source:from=object.c}
|
277
277
|
module Kernel : BasicObject
|
278
|
-
private
|
279
|
-
|
280
278
|
# <!--
|
281
279
|
# rdoc-file=vm_backtrace.c
|
282
280
|
# - caller(start=1, length=nil) -> array or nil
|
@@ -1986,7 +1984,11 @@ module Kernel : BasicObject
|
|
1986
1984
|
# Time.new #=> 2008-03-08 19:56:22 +0900
|
1987
1985
|
#
|
1988
1986
|
def self?.sleep: () -> bot
|
1989
|
-
| (
|
1987
|
+
| ((Integer | Float | _Divmod) duration) -> Integer
|
1988
|
+
|
1989
|
+
interface _Divmod
|
1990
|
+
def divmod: (Numeric) -> [ Numeric, Numeric ]
|
1991
|
+
end
|
1990
1992
|
|
1991
1993
|
# <!--
|
1992
1994
|
# rdoc-file=io.c
|
data/docs/syntax.md
CHANGED
@@ -279,13 +279,12 @@ _member_ ::= _ivar-member_ # Ivar definition
|
|
279
279
|
| _extend-member_ # Mixin (extend)
|
280
280
|
| _prepend-member_ # Mixin (prepend)
|
281
281
|
| _alias-member_ # Alias
|
282
|
-
|
|
283
|
-
| `private` # Private
|
282
|
+
| _visibility-member_ # Visibility member
|
284
283
|
|
285
284
|
_ivar-member_ ::= _ivar-name_ `:` _type_
|
286
285
|
|
287
|
-
_method-member_ ::= `def` _method-name_ `:` _method-types_ # Instance method
|
288
|
-
| `def self.` _method-name_ `:` _method-types_ # Singleton method
|
286
|
+
_method-member_ ::= _visibility_ `def` _method-name_ `:` _method-types_ # Instance method
|
287
|
+
| _visibility_ `def self.` _method-name_ `:` _method-types_ # Singleton method
|
289
288
|
| `def self?.` _method-name_ `:` _method-types_ # Singleton and instance method
|
290
289
|
|
291
290
|
_method-types_ ::= _method-type-parameters_ _method-type_ # Single method type
|
@@ -295,9 +294,11 @@ _method-types_ ::= _method-type-parameters_ _method-type_
|
|
295
294
|
_method-type-parameters_ ::= # Empty
|
296
295
|
| `[` _type-variable_ `,` ... `]`
|
297
296
|
|
298
|
-
_attribute-member_ ::= _attribute-type_ _method-name_ `:` _type_ # Attribute
|
299
|
-
| _attribute-type_ _method-name_ `(` _ivar-name_ `) :` _type_ # Attribute with variable name specification
|
300
|
-
| _attribute-type_ _method-name_ `() :` _type_ # Attribute without variable
|
297
|
+
_attribute-member_ ::= _visibility_ _attribute-type_ _method-name_ `:` _type_ # Attribute
|
298
|
+
| _visibility_ _attribute-type_ _method-name_ `(` _ivar-name_ `) :` _type_ # Attribute with variable name specification
|
299
|
+
| _visibility_ _attribute-type_ _method-name_ `() :` _type_ # Attribute without variable
|
300
|
+
|
301
|
+
_visibility_ ::= `public` | `private`
|
301
302
|
|
302
303
|
_attribute-type_ ::= `attr_reader` | `attr_writer` | `attr_accessor`
|
303
304
|
|
@@ -310,6 +311,8 @@ _prepend-member_ ::= `prepend` _class-name_ _type-arguments_
|
|
310
311
|
_alias-member_ ::= `alias` _method-name_ _method-name_
|
311
312
|
| `alias self.` _method-name_ `self.` _method-name_
|
312
313
|
|
314
|
+
_visibility-member_ ::= _visibility_
|
315
|
+
|
313
316
|
_ivar-name_ ::= /@\w+/
|
314
317
|
_method-name_ ::= ...
|
315
318
|
| /`[^`]+`/
|
@@ -328,7 +331,7 @@ An instance variable definition consists of the name of an instance variable and
|
|
328
331
|
|
329
332
|
Method definition has several syntax variations.
|
330
333
|
|
331
|
-
You can write `self.` or `self?.` before the name of the method to specify the kind of method: instance, singleton, or
|
334
|
+
You can write `self.` or `self?.` before the name of the method to specify the kind of method: instance, singleton, or module function.
|
332
335
|
|
333
336
|
```
|
334
337
|
def to_s: () -> String # Defines a instance method
|
@@ -336,6 +339,8 @@ def self.new: () -> AnObject # Defines singleton method
|
|
336
339
|
def self?.sqrt: (Numeric) -> Numeric # self? is for `module_function`s
|
337
340
|
```
|
338
341
|
|
342
|
+
`self?` method definition adds two methods: a public singleton method and a private instance method, which is equivalent to `module_function` in Ruby.
|
343
|
+
|
339
344
|
The method type can be connected with `|`s to define an overloaded method.
|
340
345
|
|
341
346
|
```
|
@@ -351,6 +356,16 @@ def +: (Float | Integer) -> (Float | Integer)
|
|
351
356
|
| (Numeric) -> Numeric
|
352
357
|
```
|
353
358
|
|
359
|
+
Adding `public` and `private` modifier changes the visibility of the method.
|
360
|
+
|
361
|
+
```
|
362
|
+
private def puts: (*untyped) -> void # Defines private instance method
|
363
|
+
|
364
|
+
public def self.puts: (*untyped) -> void # Defines public singleton method
|
365
|
+
|
366
|
+
public def self?.puts: (*untyped) -> void # 🚨🚨🚨 Error: `?.` has own visibility semantics (== `module_function`) 🚨🚨🚨
|
367
|
+
```
|
368
|
+
|
354
369
|
### Attribute definition
|
355
370
|
|
356
371
|
Attribute definitions help to define methods and instance variables based on the convention of `attr_reader`, `attr_writer` and `attr_accessor` methods in Ruby.
|
@@ -374,6 +389,14 @@ attr_accessor people (): Array[Person]
|
|
374
389
|
# def people=: (Array[Person]) -> Array[Person]
|
375
390
|
```
|
376
391
|
|
392
|
+
Attribute definitions can have the `public` and `private` modifiers like method definitions:
|
393
|
+
|
394
|
+
```
|
395
|
+
private attr_accessor id: Integer
|
396
|
+
|
397
|
+
private attr_reader self.name: String
|
398
|
+
```
|
399
|
+
|
377
400
|
### Mixin (include), Mixin (extend), Mixin (prepend)
|
378
401
|
|
379
402
|
You can define mixins between class and modules.
|
@@ -402,11 +425,31 @@ def map: [X] () { (String) -> X } -> Array[X]
|
|
402
425
|
alias collect map # `#collect` has the same type with `map`
|
403
426
|
```
|
404
427
|
|
405
|
-
###
|
428
|
+
### Visibility member
|
429
|
+
|
430
|
+
Visibility member allows specifying the default visibility of instance methods and instance attributes.
|
431
|
+
|
432
|
+
```rbs
|
433
|
+
public
|
434
|
+
|
435
|
+
def foo: () -> void # public instance method
|
436
|
+
|
437
|
+
attr_reader name: String # public instance attribute
|
438
|
+
|
439
|
+
private
|
406
440
|
|
407
|
-
|
441
|
+
def bar: () -> void # private instance method
|
408
442
|
|
409
|
-
|
443
|
+
attr_reader email: String # private instance attribute
|
444
|
+
```
|
445
|
+
|
446
|
+
The visibility _modifiers_ overwrite the default visibility per member bases.
|
447
|
+
|
448
|
+
The visibility member requires a new line `\n` after the token.
|
449
|
+
|
450
|
+
```rbs
|
451
|
+
private alias foo bar # Syntax error
|
452
|
+
```
|
410
453
|
|
411
454
|
## Declarations
|
412
455
|
|
data/ext/rbs_extension/lexer.h
CHANGED
@@ -134,6 +134,12 @@ void skip(lexstate *state) {
|
|
134
134
|
}
|
135
135
|
}
|
136
136
|
|
137
|
+
void skipn(lexstate *state, size_t size) {
|
138
|
+
for (size_t i = 0; i < size; i ++) {
|
139
|
+
skip(state);
|
140
|
+
}
|
141
|
+
}
|
142
|
+
|
137
143
|
char *peek_token(lexstate *state, token tok) {
|
138
144
|
return RSTRING_PTR(state->string) + tok.range.start.byte_pos;
|
139
145
|
}
|
data/ext/rbs_extension/parser.c
CHANGED
@@ -1430,6 +1430,8 @@ InstanceSingletonKind parse_instance_singleton_kind(parserstate *state, bool all
|
|
1430
1430
|
|
1431
1431
|
/**
|
1432
1432
|
* def_member ::= {kDEF} method_name `:` <method_types>
|
1433
|
+
* | {kPRIVATE2} kDEF method_name `:` <method_types>
|
1434
|
+
* | {kPUBLIC2} kDEF method_name `:` <method_types>
|
1433
1435
|
*
|
1434
1436
|
* method_types ::= {} <method_type>
|
1435
1437
|
* | {} <`...`>
|
@@ -1440,30 +1442,61 @@ InstanceSingletonKind parse_instance_singleton_kind(parserstate *state, bool all
|
|
1440
1442
|
* */
|
1441
1443
|
VALUE parse_member_def(parserstate *state, bool instance_only, bool accept_overload, position comment_pos, VALUE annotations) {
|
1442
1444
|
range member_range;
|
1445
|
+
range visibility_range;
|
1443
1446
|
range keyword_range;
|
1444
1447
|
range name_range;
|
1445
1448
|
range kind_range;
|
1446
1449
|
range overload_range = NULL_RANGE;
|
1447
1450
|
|
1448
|
-
|
1449
|
-
member_range.start = keyword_range.start;
|
1451
|
+
VALUE visibility;
|
1450
1452
|
|
1451
|
-
|
1453
|
+
member_range.start = state->current_token.range.start;
|
1454
|
+
comment_pos = nonnull_pos_or(comment_pos, member_range.start);
|
1452
1455
|
VALUE comment = get_comment(state, comment_pos.line);
|
1453
1456
|
|
1457
|
+
switch (state->current_token.type)
|
1458
|
+
{
|
1459
|
+
case kPRIVATE:
|
1460
|
+
visibility_range = state->current_token.range;
|
1461
|
+
visibility = ID2SYM(rb_intern("private"));
|
1462
|
+
member_range.start = visibility_range.start;
|
1463
|
+
parser_advance(state);
|
1464
|
+
break;
|
1465
|
+
case kPUBLIC:
|
1466
|
+
visibility_range = state->current_token.range;
|
1467
|
+
visibility = ID2SYM(rb_intern("public"));
|
1468
|
+
member_range.start = visibility_range.start;
|
1469
|
+
parser_advance(state);
|
1470
|
+
break;
|
1471
|
+
default:
|
1472
|
+
visibility_range = NULL_RANGE;
|
1473
|
+
visibility = Qnil;
|
1474
|
+
break;
|
1475
|
+
}
|
1476
|
+
|
1477
|
+
keyword_range = state->current_token.range;
|
1478
|
+
|
1454
1479
|
InstanceSingletonKind kind;
|
1455
1480
|
if (instance_only) {
|
1456
1481
|
kind_range = NULL_RANGE;
|
1457
1482
|
kind = INSTANCE_KIND;
|
1458
1483
|
} else {
|
1459
|
-
kind = parse_instance_singleton_kind(state,
|
1484
|
+
kind = parse_instance_singleton_kind(state, NIL_P(visibility), &kind_range);
|
1460
1485
|
}
|
1461
1486
|
|
1462
1487
|
VALUE name = parse_method_name(state, &name_range);
|
1463
1488
|
VALUE method_types = rb_ary_new();
|
1464
1489
|
VALUE overload = Qfalse;
|
1465
1490
|
|
1466
|
-
|
1491
|
+
if (state->next_token.type == pDOT && RB_SYM2ID(name) == rb_intern("self?")) {
|
1492
|
+
raise_syntax_error(
|
1493
|
+
state,
|
1494
|
+
state->next_token,
|
1495
|
+
"`self?` method cannot have visibility"
|
1496
|
+
);
|
1497
|
+
} else {
|
1498
|
+
parser_advance_assert(state, pCOLON);
|
1499
|
+
}
|
1467
1500
|
|
1468
1501
|
parser_push_typevar_table(state, kind != INSTANCE_KIND);
|
1469
1502
|
|
@@ -1533,6 +1566,7 @@ VALUE parse_member_def(parserstate *state, bool instance_only, bool accept_overl
|
|
1533
1566
|
rbs_loc_add_required_child(loc, rb_intern("name"), name_range);
|
1534
1567
|
rbs_loc_add_optional_child(loc, rb_intern("kind"), kind_range);
|
1535
1568
|
rbs_loc_add_optional_child(loc, rb_intern("overload"), overload_range);
|
1569
|
+
rbs_loc_add_optional_child(loc, rb_intern("visibility"), visibility_range);
|
1536
1570
|
|
1537
1571
|
return rbs_ast_members_method_definition(
|
1538
1572
|
name,
|
@@ -1541,7 +1575,8 @@ VALUE parse_member_def(parserstate *state, bool instance_only, bool accept_overl
|
|
1541
1575
|
annotations,
|
1542
1576
|
location,
|
1543
1577
|
comment,
|
1544
|
-
overload
|
1578
|
+
overload,
|
1579
|
+
visibility
|
1545
1580
|
);
|
1546
1581
|
}
|
1547
1582
|
|
@@ -1839,10 +1874,14 @@ VALUE parse_visibility_member(parserstate *state, VALUE annotations) {
|
|
1839
1874
|
|
1840
1875
|
/*
|
1841
1876
|
attribute_member ::= {attr_keyword} attr_name attr_var `:` <type>
|
1877
|
+
| {visibility} attr_keyword attr_name attr_var `:` <type>
|
1842
1878
|
| {attr_keyword} `self` `.` attr_name attr_var `:` <type>
|
1879
|
+
| {visibility} attr_keyword `self` `.` attr_name attr_var `:` <type>
|
1843
1880
|
|
1844
1881
|
attr_keyword ::= `attr_reader` | `attr_writer` | `attr_accessor`
|
1845
1882
|
|
1883
|
+
visibility ::= `public` | `private`
|
1884
|
+
|
1846
1885
|
attr_var ::= # empty
|
1847
1886
|
| `(` tAIDENT `)` # Ivar name
|
1848
1887
|
| `(` `)` # No variable
|
@@ -1850,7 +1889,7 @@ VALUE parse_visibility_member(parserstate *state, VALUE annotations) {
|
|
1850
1889
|
VALUE parse_attribute_member(parserstate *state, position comment_pos, VALUE annotations) {
|
1851
1890
|
range member_range;
|
1852
1891
|
range keyword_range, name_range, colon_range;
|
1853
|
-
range kind_range = NULL_RANGE, ivar_range = NULL_RANGE, ivar_name_range = NULL_RANGE;
|
1892
|
+
range kind_range = NULL_RANGE, ivar_range = NULL_RANGE, ivar_name_range = NULL_RANGE, visibility_range = NULL_RANGE;
|
1854
1893
|
|
1855
1894
|
InstanceSingletonKind is_kind;
|
1856
1895
|
VALUE klass;
|
@@ -1860,12 +1899,31 @@ VALUE parse_attribute_member(parserstate *state, position comment_pos, VALUE ann
|
|
1860
1899
|
VALUE type;
|
1861
1900
|
VALUE comment;
|
1862
1901
|
VALUE location;
|
1902
|
+
VALUE visibility;
|
1863
1903
|
rbs_loc *loc;
|
1864
1904
|
|
1865
1905
|
member_range.start = state->current_token.range.start;
|
1866
1906
|
comment_pos = nonnull_pos_or(comment_pos, member_range.start);
|
1867
1907
|
comment = get_comment(state, comment_pos.line);
|
1868
1908
|
|
1909
|
+
switch (state->current_token.type)
|
1910
|
+
{
|
1911
|
+
case kPRIVATE:
|
1912
|
+
visibility = ID2SYM(rb_intern("private"));
|
1913
|
+
visibility_range = state->current_token.range;
|
1914
|
+
parser_advance(state);
|
1915
|
+
break;
|
1916
|
+
case kPUBLIC:
|
1917
|
+
visibility = ID2SYM(rb_intern("public"));
|
1918
|
+
visibility_range = state->current_token.range;
|
1919
|
+
parser_advance(state);
|
1920
|
+
break;
|
1921
|
+
default:
|
1922
|
+
visibility = Qnil;
|
1923
|
+
visibility_range = NULL_RANGE;
|
1924
|
+
break;
|
1925
|
+
}
|
1926
|
+
|
1869
1927
|
keyword_range = state->current_token.range;
|
1870
1928
|
switch (state->current_token.type)
|
1871
1929
|
{
|
@@ -1924,6 +1982,7 @@ VALUE parse_attribute_member(parserstate *state, position comment_pos, VALUE ann
|
|
1924
1982
|
rbs_loc_add_optional_child(loc, rb_intern("kind"), kind_range);
|
1925
1983
|
rbs_loc_add_optional_child(loc, rb_intern("ivar"), ivar_range);
|
1926
1984
|
rbs_loc_add_optional_child(loc, rb_intern("ivar_name"), ivar_name_range);
|
1985
|
+
rbs_loc_add_optional_child(loc, rb_intern("visibility"), visibility_range);
|
1927
1986
|
|
1928
1987
|
return rbs_ast_members_attribute(
|
1929
1988
|
klass,
|
@@ -1933,7 +1992,8 @@ VALUE parse_attribute_member(parserstate *state, position comment_pos, VALUE ann
|
|
1933
1992
|
kind,
|
1934
1993
|
annotations,
|
1935
1994
|
location,
|
1936
|
-
comment
|
1995
|
+
comment,
|
1996
|
+
visibility
|
1937
1997
|
);
|
1938
1998
|
}
|
1939
1999
|
|
@@ -2113,7 +2173,6 @@ VALUE parse_module_members(parserstate *state) {
|
|
2113
2173
|
member = parse_alias_member(state, false, annot_pos, annotations);
|
2114
2174
|
break;
|
2115
2175
|
|
2116
|
-
|
2117
2176
|
case tAIDENT:
|
2118
2177
|
case tA2IDENT:
|
2119
2178
|
case kSELF:
|
@@ -2128,7 +2187,23 @@ VALUE parse_module_members(parserstate *state) {
|
|
2128
2187
|
|
2129
2188
|
case kPUBLIC:
|
2130
2189
|
case kPRIVATE:
|
2131
|
-
|
2190
|
+
if (state->next_token.range.start.line == state->current_token.range.start.line) {
|
2191
|
+
switch (state->next_token.type)
|
2192
|
+
{
|
2193
|
+
case kDEF:
|
2194
|
+
member = parse_member_def(state, false, true, annot_pos, annotations);
|
2195
|
+
break;
|
2196
|
+
case kATTRREADER:
|
2197
|
+
case kATTRWRITER:
|
2198
|
+
case kATTRACCESSOR:
|
2199
|
+
member = parse_attribute_member(state, annot_pos, annotations);
|
2200
|
+
break;
|
2201
|
+
default:
|
2202
|
+
raise_syntax_error(state, state->next_token, "method or attribute definition is expected after visibility modifier");
|
2203
|
+
}
|
2204
|
+
} else {
|
2205
|
+
member = parse_visibility_member(state, annotations);
|
2206
|
+
}
|
2132
2207
|
break;
|
2133
2208
|
|
2134
2209
|
default:
|
@@ -400,7 +400,7 @@ VALUE rbs_ast_decl_module(VALUE name, VALUE type_params, VALUE self_types, VALUE
|
|
400
400
|
);
|
401
401
|
}
|
402
402
|
|
403
|
-
VALUE rbs_ast_members_method_definition(VALUE name, VALUE kind, VALUE types, VALUE annotations, VALUE location, VALUE comment, VALUE overload) {
|
403
|
+
VALUE rbs_ast_members_method_definition(VALUE name, VALUE kind, VALUE types, VALUE annotations, VALUE location, VALUE comment, VALUE overload, VALUE visibility) {
|
404
404
|
VALUE args = rb_hash_new();
|
405
405
|
rb_hash_aset(args, ID2SYM(rb_intern("name")), name);
|
406
406
|
rb_hash_aset(args, ID2SYM(rb_intern("kind")), kind);
|
@@ -409,6 +409,7 @@ VALUE rbs_ast_members_method_definition(VALUE name, VALUE kind, VALUE types, VAL
|
|
409
409
|
rb_hash_aset(args, ID2SYM(rb_intern("location")), location);
|
410
410
|
rb_hash_aset(args, ID2SYM(rb_intern("comment")), comment);
|
411
411
|
rb_hash_aset(args, ID2SYM(rb_intern("overload")), overload);
|
412
|
+
rb_hash_aset(args, ID2SYM(rb_intern("visibility")), visibility);
|
412
413
|
|
413
414
|
return CLASS_NEW_INSTANCE(
|
414
415
|
RBS_AST_Members_MethodDefinition,
|
@@ -446,7 +447,7 @@ VALUE rbs_ast_members_mixin(VALUE klass, VALUE name, VALUE module_args, VALUE an
|
|
446
447
|
);
|
447
448
|
}
|
448
449
|
|
449
|
-
VALUE rbs_ast_members_attribute(VALUE klass, VALUE name, VALUE type, VALUE ivar_name, VALUE kind, VALUE annotations, VALUE location, VALUE comment) {
|
450
|
+
VALUE rbs_ast_members_attribute(VALUE klass, VALUE name, VALUE type, VALUE ivar_name, VALUE kind, VALUE annotations, VALUE location, VALUE comment, VALUE visibility) {
|
450
451
|
VALUE args = rb_hash_new();
|
451
452
|
rb_hash_aset(args, ID2SYM(rb_intern("name")), name);
|
452
453
|
rb_hash_aset(args, ID2SYM(rb_intern("type")), type);
|
@@ -455,6 +456,7 @@ VALUE rbs_ast_members_attribute(VALUE klass, VALUE name, VALUE type, VALUE ivar_
|
|
455
456
|
rb_hash_aset(args, ID2SYM(rb_intern("annotations")), annotations);
|
456
457
|
rb_hash_aset(args, ID2SYM(rb_intern("location")), location);
|
457
458
|
rb_hash_aset(args, ID2SYM(rb_intern("comment")), comment);
|
459
|
+
rb_hash_aset(args, ID2SYM(rb_intern("visibility")), visibility);
|
458
460
|
|
459
461
|
return CLASS_NEW_INSTANCE(
|
460
462
|
klass,
|
@@ -16,8 +16,8 @@ VALUE rbs_ast_decl_interface(VALUE name, VALUE type_params, VALUE members, VALUE
|
|
16
16
|
VALUE rbs_ast_decl_module_self(VALUE name, VALUE args, VALUE location);
|
17
17
|
VALUE rbs_ast_decl_module(VALUE name, VALUE type_params, VALUE self_types, VALUE members, VALUE annotations, VALUE location, VALUE comment);
|
18
18
|
VALUE rbs_ast_members_alias(VALUE new_name, VALUE old_name, VALUE kind, VALUE annotations, VALUE location, VALUE comment);
|
19
|
-
VALUE rbs_ast_members_attribute(VALUE klass, VALUE name, VALUE type, VALUE ivar_name, VALUE kind, VALUE annotations, VALUE location, VALUE comment);
|
20
|
-
VALUE rbs_ast_members_method_definition(VALUE name, VALUE kind, VALUE types, VALUE annotations, VALUE location, VALUE comment, VALUE overload);
|
19
|
+
VALUE rbs_ast_members_attribute(VALUE klass, VALUE name, VALUE type, VALUE ivar_name, VALUE kind, VALUE annotations, VALUE location, VALUE comment, VALUE visibility);
|
20
|
+
VALUE rbs_ast_members_method_definition(VALUE name, VALUE kind, VALUE types, VALUE annotations, VALUE location, VALUE comment, VALUE overload, VALUE visibility);
|
21
21
|
VALUE rbs_ast_members_mixin(VALUE klass, VALUE name, VALUE args, VALUE annotations, VALUE location, VALUE comment);
|
22
22
|
VALUE rbs_ast_members_variable(VALUE klass, VALUE name, VALUE type, VALUE location, VALUE comment);
|
23
23
|
VALUE rbs_ast_members_visibility(VALUE klass, VALUE location);
|
data/goodcheck.yml
CHANGED
@@ -1,15 +1,4 @@
|
|
1
1
|
rules:
|
2
|
-
- id: rbs.no_mark
|
3
|
-
pattern: 💪👽🚨
|
4
|
-
message: Do you forget to delete `arglists` section?
|
5
|
-
glob:
|
6
|
-
- "{core,stdlib}/**/*.rbs"
|
7
|
-
fail:
|
8
|
-
- |
|
9
|
-
# arglists 💪👽🚨 << Delete this section
|
10
|
-
# File.absolute_path?(file_name) -> true or false
|
11
|
-
#
|
12
|
-
|
13
2
|
- id: rbs.no_arg
|
14
3
|
pattern:
|
15
4
|
regexp: arg\d+
|
@@ -11,7 +11,7 @@ module RBS
|
|
11
11
|
@include_filename = true
|
12
12
|
end
|
13
13
|
|
14
|
-
def annotate_file(path)
|
14
|
+
def annotate_file(path, preserve:)
|
15
15
|
content = path.read()
|
16
16
|
|
17
17
|
decls = Parser.parse_signature(content)
|
@@ -19,7 +19,7 @@ module RBS
|
|
19
19
|
annotate_decls(decls)
|
20
20
|
|
21
21
|
path.open("w") do |io|
|
22
|
-
Writer.new(out: io).write(decls)
|
22
|
+
Writer.new(out: io).preserve!(preserve: preserve).write(decls)
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
data/lib/rbs/ast/members.rb
CHANGED
@@ -12,8 +12,9 @@ module RBS
|
|
12
12
|
attr_reader :location
|
13
13
|
attr_reader :comment
|
14
14
|
attr_reader :overload
|
15
|
+
attr_reader :visibility
|
15
16
|
|
16
|
-
def initialize(name:, kind:, types:, annotations:, location:, comment:, overload:)
|
17
|
+
def initialize(name:, kind:, types:, annotations:, location:, comment:, overload:, visibility: nil)
|
17
18
|
@name = name
|
18
19
|
@kind = kind
|
19
20
|
@types = types
|
@@ -21,6 +22,7 @@ module RBS
|
|
21
22
|
@location = location
|
22
23
|
@comment = comment
|
23
24
|
@overload = overload ? true : false
|
25
|
+
@visibility = visibility
|
24
26
|
end
|
25
27
|
|
26
28
|
def ==(other)
|
@@ -28,13 +30,14 @@ module RBS
|
|
28
30
|
other.name == name &&
|
29
31
|
other.kind == kind &&
|
30
32
|
other.types == types &&
|
31
|
-
other.overload == overload
|
33
|
+
other.overload == overload &&
|
34
|
+
other.visibility == visibility
|
32
35
|
end
|
33
36
|
|
34
37
|
alias eql? ==
|
35
38
|
|
36
39
|
def hash
|
37
|
-
|
40
|
+
name.hash ^ kind.hash ^ types.hash ^ overload.hash
|
38
41
|
end
|
39
42
|
|
40
43
|
def instance?
|
@@ -49,7 +52,7 @@ module RBS
|
|
49
52
|
overload
|
50
53
|
end
|
51
54
|
|
52
|
-
def update(name: self.name, kind: self.kind, types: self.types, annotations: self.annotations, location: self.location, comment: self.comment, overload: self.overload)
|
55
|
+
def update(name: self.name, kind: self.kind, types: self.types, annotations: self.annotations, location: self.location, comment: self.comment, overload: self.overload, visibility: self.visibility)
|
53
56
|
self.class.new(
|
54
57
|
name: name,
|
55
58
|
kind: kind,
|
@@ -57,7 +60,8 @@ module RBS
|
|
57
60
|
annotations: annotations,
|
58
61
|
location: location,
|
59
62
|
comment: comment,
|
60
|
-
overload: overload
|
63
|
+
overload: overload,
|
64
|
+
visibility: visibility
|
61
65
|
)
|
62
66
|
end
|
63
67
|
|
@@ -94,7 +98,7 @@ module RBS
|
|
94
98
|
alias eql? ==
|
95
99
|
|
96
100
|
def hash
|
97
|
-
|
101
|
+
name.hash ^ type.hash
|
98
102
|
end
|
99
103
|
end
|
100
104
|
|
@@ -164,7 +168,7 @@ module RBS
|
|
164
168
|
end
|
165
169
|
|
166
170
|
def hash
|
167
|
-
|
171
|
+
name.hash ^ args.hash
|
168
172
|
end
|
169
173
|
end
|
170
174
|
|
@@ -221,8 +225,9 @@ module RBS
|
|
221
225
|
attr_reader :annotations
|
222
226
|
attr_reader :location
|
223
227
|
attr_reader :comment
|
228
|
+
attr_reader :visibility
|
224
229
|
|
225
|
-
def initialize(name:, type:, ivar_name:, kind:, annotations:, location:, comment:)
|
230
|
+
def initialize(name:, type:, ivar_name:, kind:, annotations:, location:, comment:, visibility: nil)
|
226
231
|
@name = name
|
227
232
|
@type = type
|
228
233
|
@ivar_name = ivar_name
|
@@ -230,6 +235,7 @@ module RBS
|
|
230
235
|
@location = location
|
231
236
|
@comment = comment
|
232
237
|
@kind = kind
|
238
|
+
@visibility = visibility
|
233
239
|
end
|
234
240
|
|
235
241
|
def ==(other)
|
@@ -237,16 +243,17 @@ module RBS
|
|
237
243
|
other.name == name &&
|
238
244
|
other.type == type &&
|
239
245
|
other.ivar_name == ivar_name &&
|
240
|
-
other.kind == kind
|
246
|
+
other.kind == kind &&
|
247
|
+
other.visibility == visibility
|
241
248
|
end
|
242
249
|
|
243
250
|
alias eql? ==
|
244
251
|
|
245
252
|
def hash
|
246
|
-
|
253
|
+
name.hash ^ type.hash ^ ivar_name.hash ^ kind.hash ^ visibility.hash
|
247
254
|
end
|
248
255
|
|
249
|
-
def update(name: self.name, type: self.type, ivar_name: self.ivar_name, kind: self.kind, annotations: self.annotations, location: self.location, comment: self.comment)
|
256
|
+
def update(name: self.name, type: self.type, ivar_name: self.ivar_name, kind: self.kind, annotations: self.annotations, location: self.location, comment: self.comment, visibility: self.visibility)
|
250
257
|
klass = _ = self.class
|
251
258
|
klass.new(
|
252
259
|
name: name,
|
@@ -255,7 +262,8 @@ module RBS
|
|
255
262
|
kind: kind,
|
256
263
|
annotations: annotations,
|
257
264
|
location: location,
|
258
|
-
comment: comment
|
265
|
+
comment: comment,
|
266
|
+
visibility: visibility
|
259
267
|
)
|
260
268
|
end
|
261
269
|
end
|
@@ -372,7 +380,7 @@ module RBS
|
|
372
380
|
alias eql? ==
|
373
381
|
|
374
382
|
def hash
|
375
|
-
|
383
|
+
new_name.hash ^ old_name.hash ^ kind.hash
|
376
384
|
end
|
377
385
|
|
378
386
|
def to_json(state = _ = nil)
|
data/lib/rbs/buffer.rb
CHANGED
@@ -2,23 +2,29 @@ module RBS
|
|
2
2
|
class Buffer
|
3
3
|
attr_reader :name
|
4
4
|
attr_reader :content
|
5
|
-
attr_reader :lines
|
6
|
-
attr_reader :ranges
|
7
5
|
|
8
6
|
def initialize(name:, content:)
|
9
7
|
@name = name
|
10
8
|
@content = content
|
9
|
+
end
|
11
10
|
|
12
|
-
|
11
|
+
def lines
|
12
|
+
@lines ||= content.lines
|
13
|
+
end
|
13
14
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
15
|
+
def ranges
|
16
|
+
@ranges ||=
|
17
|
+
begin
|
18
|
+
@ranges = []
|
19
|
+
offset = 0
|
20
|
+
lines.each do |line|
|
21
|
+
size = line.size
|
22
|
+
range = offset...(offset+size)
|
23
|
+
@ranges << range
|
24
|
+
offset += size
|
25
|
+
end
|
26
|
+
@ranges
|
27
|
+
end
|
22
28
|
end
|
23
29
|
|
24
30
|
def pos_to_loc(pos)
|
data/lib/rbs/cli.rb
CHANGED
@@ -797,6 +797,8 @@ Examples:
|
|
797
797
|
source = RBS::Annotate::RDocSource.new()
|
798
798
|
annotator = RBS::Annotate::RDocAnnotator.new(source: source)
|
799
799
|
|
800
|
+
preserve = true
|
801
|
+
|
800
802
|
OptionParser.new do |opts|
|
801
803
|
opts.banner = <<-EOB
|
802
804
|
Usage: rbs annotate [options...] [files...]
|
@@ -817,6 +819,7 @@ Options:
|
|
817
819
|
opts.on("-d", "--dir DIRNAME", "Load RDoc from DIRNAME") {|d| source.extra_dirs << Pathname(d) }
|
818
820
|
opts.on("--[no-]arglists", "Generate arglists section (defaults to true)") {|b| annotator.include_arg_lists = b }
|
819
821
|
opts.on("--[no-]filename", "Include source file name in the documentation (defaults to true)") {|b| annotator.include_filename = b }
|
822
|
+
opts.on("--[no-]preserve", "Try preserve the format of the original file (defaults to true)") {|b| preserve = b }
|
820
823
|
end.parse!(args)
|
821
824
|
|
822
825
|
source.load()
|
@@ -826,11 +829,11 @@ Options:
|
|
826
829
|
if path.directory?
|
827
830
|
Pathname.glob((path + "**/*.rbs").to_s).each do |path|
|
828
831
|
stdout.puts "Processing #{path}..."
|
829
|
-
annotator.annotate_file(path)
|
832
|
+
annotator.annotate_file(path, preserve: preserve)
|
830
833
|
end
|
831
834
|
else
|
832
835
|
stdout.puts "Processing #{path}..."
|
833
|
-
annotator.annotate_file(path)
|
836
|
+
annotator.annotate_file(path, preserve: preserve)
|
834
837
|
end
|
835
838
|
end
|
836
839
|
end
|