rbs 2.1.0 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.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
|