rbs 1.7.0.beta.4 → 1.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +0 -1
- data/CHANGELOG.md +58 -2
- data/Steepfile +0 -1
- data/core/array.rbs +3 -3
- data/core/binding.rbs +2 -0
- data/core/builtin.rbs +4 -0
- data/core/complex.rbs +0 -2
- data/core/enumerable.rbs +3 -3
- data/core/env.rbs +881 -0
- data/core/false_class.rbs +2 -0
- data/core/float.rbs +0 -2
- data/core/integer.rbs +0 -2
- data/core/nil_class.rbs +2 -0
- data/core/numeric.rbs +7 -0
- data/core/object.rbs +1 -1
- data/core/proc.rbs +2 -0
- data/core/rational.rbs +0 -2
- data/core/symbol.rbs +2 -0
- data/core/thread.rbs +1 -1
- data/core/true_class.rbs +2 -0
- data/core/unbound_method.rbs +13 -0
- data/docs/rbs_by_example.md +2 -2
- data/docs/syntax.md +25 -23
- data/ext/rbs_extension/parser.c +99 -95
- data/ext/rbs_extension/parserstate.c +0 -1
- data/ext/rbs_extension/rbs_extension.h +1 -1
- data/ext/rbs_extension/ruby_objs.c +8 -6
- data/ext/rbs_extension/ruby_objs.h +2 -4
- data/lib/rbs/ast/declarations.rb +6 -2
- data/lib/rbs/cli.rb +1 -1
- data/lib/rbs/collection/sources/git.rb +6 -1
- data/lib/rbs/definition_builder.rb +29 -2
- data/lib/rbs/environment.rb +1 -0
- data/lib/rbs/environment_walker.rb +4 -1
- data/lib/rbs/errors.rb +12 -0
- data/lib/rbs/prototype/helpers.rb +113 -0
- data/lib/rbs/prototype/rb.rb +2 -105
- data/lib/rbs/prototype/runtime.rb +16 -0
- data/lib/rbs/test/setup.rb +1 -0
- data/lib/rbs/type_alias_regularity.rb +115 -0
- data/lib/rbs/types.rb +11 -23
- data/lib/rbs/validator.rb +40 -7
- data/lib/rbs/variance_calculator.rb +52 -24
- data/lib/rbs/version.rb +1 -1
- data/lib/rbs/writer.rb +1 -1
- data/lib/rbs.rb +2 -0
- data/schema/decls.json +13 -1
- data/schema/types.json +8 -2
- data/sig/collection/collections.rbs +2 -0
- data/sig/declarations.rbs +9 -6
- data/sig/definition_builder.rbs +29 -0
- data/sig/environment_walker.rbs +26 -0
- data/sig/errors.rbs +10 -0
- data/sig/type_alias_regularity.rbs +92 -0
- data/sig/types.rbs +11 -8
- data/sig/validator.rbs +7 -0
- data/sig/variance_calculator.rbs +50 -0
- data/stdlib/bigdecimal/0/big_decimal.rbs +44 -0
- data/stdlib/csv/0/csv.rbs +49 -3
- data/stdlib/date/0/date.rbs +2 -2
- data/stdlib/set/0/set.rbs +3 -3
- data/steep/Gemfile.lock +10 -10
- metadata +8 -6
- data/lib/rbs/parser.y +0 -1805
- data/lib/ruby/signature.rb +0 -7
data/core/false_class.rbs
CHANGED
data/core/float.rbs
CHANGED
@@ -171,8 +171,6 @@ class Float < Numeric
|
|
171
171
|
def ceil: () -> Integer
|
172
172
|
| (int digits) -> (Integer | Float)
|
173
173
|
|
174
|
-
def clone: (?freeze: bool) -> self
|
175
|
-
|
176
174
|
# Returns an array with both `numeric` and `float` represented as Float objects.
|
177
175
|
#
|
178
176
|
# This is achieved by converting `numeric` to a Float.
|
data/core/integer.rbs
CHANGED
data/core/nil_class.rbs
CHANGED
data/core/numeric.rbs
CHANGED
@@ -416,4 +416,11 @@ class Numeric
|
|
416
416
|
# Returns `true` if `num` has a zero value.
|
417
417
|
#
|
418
418
|
def zero?: () -> bool
|
419
|
+
|
420
|
+
# Returns +self+.
|
421
|
+
#
|
422
|
+
# Raises an exception if the value for +freeze+ is neither +true+ nor +nil+.
|
423
|
+
#
|
424
|
+
# Related: Numeric#dup.
|
425
|
+
def clone: (?freeze: true?) -> self
|
419
426
|
end
|
data/core/object.rbs
CHANGED
@@ -76,7 +76,7 @@ class Object < BasicObject
|
|
76
76
|
# This method may have class-specific behavior. If so, that behavior will be
|
77
77
|
# documented under the #`initialize_copy` method of the class.
|
78
78
|
#
|
79
|
-
def clone: (?freeze: bool) -> self
|
79
|
+
def clone: (?freeze: bool?) -> self
|
80
80
|
|
81
81
|
# Defines a singleton method in the receiver. The *method* parameter can be a
|
82
82
|
# `Proc`, a `Method` or an `UnboundMethod` object. If a block is specified, it
|
data/core/proc.rbs
CHANGED
@@ -210,6 +210,8 @@
|
|
210
210
|
# {test: 1}.to_proc.call(:test) #=> 1
|
211
211
|
# %i[test many keys].map(&{test: 1}) #=> [1, nil, nil]
|
212
212
|
class Proc < Object
|
213
|
+
def clone: () -> self
|
214
|
+
|
213
215
|
# Returns the number of mandatory arguments. If the block is declared to
|
214
216
|
# take no arguments, returns 0. If the block is known to take exactly n
|
215
217
|
# arguments, returns n. If the block has optional arguments, returns -n-1,
|
data/core/rational.rbs
CHANGED
data/core/symbol.rbs
CHANGED
data/core/thread.rbs
CHANGED
@@ -554,7 +554,7 @@ class Thread < Object
|
|
554
554
|
# b = Thread.new { raise 'something went wrong' }
|
555
555
|
# b.value #=> RuntimeError: something went wrong
|
556
556
|
# ```
|
557
|
-
def value: () ->
|
557
|
+
def value: () -> untyped
|
558
558
|
|
559
559
|
# Marks a given thread as eligible for scheduling, however it may still
|
560
560
|
# remain blocked on I/O.
|
data/core/true_class.rbs
CHANGED
data/core/unbound_method.rbs
CHANGED
@@ -45,6 +45,19 @@
|
|
45
45
|
# um.bind(t).call #=> :original
|
46
46
|
#
|
47
47
|
class UnboundMethod
|
48
|
+
# Returns a clone of this method.
|
49
|
+
#
|
50
|
+
# class A
|
51
|
+
# def foo
|
52
|
+
# return "bar"
|
53
|
+
# end
|
54
|
+
# end
|
55
|
+
#
|
56
|
+
# m = A.new.method(:foo)
|
57
|
+
# m.call # => "bar"
|
58
|
+
# n = m.clone.call # => "bar"
|
59
|
+
def clone: () -> self
|
60
|
+
|
48
61
|
# Returns an indication of the number of arguments accepted by a method. Returns
|
49
62
|
# a nonnegative integer for methods that take a fixed number of arguments. For
|
50
63
|
# Ruby methods that take a variable number of arguments, returns -n-1, where n
|
data/docs/rbs_by_example.md
CHANGED
@@ -229,9 +229,9 @@ end
|
|
229
229
|
|
230
230
|
```ruby
|
231
231
|
# .rb
|
232
|
-
[1,2,3,4,5].
|
232
|
+
[1,2,3,4,5].filter {|num| num.even? }
|
233
233
|
# => [2, 4]
|
234
|
-
%w[ a b c d e f ].
|
234
|
+
%w[ a b c d e f ].filter {|v| v =~ /[aeiou]/ }
|
235
235
|
# => ["a", "e"]
|
236
236
|
[1,2,3,4,5].filter
|
237
237
|
```
|
data/docs/syntax.md
CHANGED
@@ -5,14 +5,14 @@
|
|
5
5
|
```markdown
|
6
6
|
_type_ ::= _class-name_ _type-arguments_ (Class instance type)
|
7
7
|
| _interface-name_ _type-arguments_ (Interface type)
|
8
|
+
| _alias-name_ _type-arguments_ (Alias type)
|
8
9
|
| `singleton(` _class-name_ `)` (Class singleton type)
|
9
|
-
| _alias-name_ (Alias type)
|
10
10
|
| _literal_ (Literal type)
|
11
11
|
| _type_ `|` _type_ (Union type)
|
12
12
|
| _type_ `&` _type_ (Intersection type)
|
13
13
|
| _type_ `?` (Optional type)
|
14
|
-
| `{` _record-name_ `:` _type_ `,` etc. `}`
|
15
|
-
| `[]` | `[` _type_ `,` etc. `]`
|
14
|
+
| `{` _record-name_ `:` _type_ `,` etc. `}` (Record type)
|
15
|
+
| `[]` | `[` _type_ `,` etc. `]` (Tuples)
|
16
16
|
| _type-variable_ (Type variables)
|
17
17
|
| `^(` _parameters_ `) ->` _type_ (Proc type)
|
18
18
|
| `self`
|
@@ -35,8 +35,8 @@ _namespace_ ::= (Empty namespace)
|
|
35
35
|
| `::` (Root)
|
36
36
|
| _namespace_ /[A-Z]\w*/ `::` (Namespace)
|
37
37
|
|
38
|
-
_type-arguments_ ::= (No
|
39
|
-
| `[` _type_ `,` etc. `]`
|
38
|
+
_type-arguments_ ::= (No type arguments)
|
39
|
+
| `[` _type_ `,` etc. `]` (Type arguments)
|
40
40
|
|
41
41
|
_literal_ ::= _string-literal_
|
42
42
|
| _symbol-literal_
|
@@ -64,25 +64,25 @@ _ToS # _ToS interface
|
|
64
64
|
::MyApp::_Each[String] # Interface name with namespace and type application
|
65
65
|
```
|
66
66
|
|
67
|
-
### Class singleton type
|
68
|
-
|
69
|
-
Class singleton type denotes _the type of a singleton object of a class_.
|
70
|
-
|
71
|
-
```
|
72
|
-
singleton(String)
|
73
|
-
singleton(::Hash) # Class singleton type cannot be parametrized.
|
74
|
-
```
|
75
|
-
|
76
67
|
### Alias type
|
77
68
|
|
78
69
|
Alias type denotes an alias declared with _alias declaration_.
|
79
70
|
|
80
71
|
The name of type aliases starts with lowercase `[a-z]`.
|
81
72
|
|
82
|
-
|
83
73
|
```
|
84
74
|
name
|
85
75
|
::JSON::t # Alias name with namespace
|
76
|
+
list[Integer] # Type alias can be generic
|
77
|
+
```
|
78
|
+
|
79
|
+
### Class singleton type
|
80
|
+
|
81
|
+
Class singleton type denotes _the type of a singleton object of a class_.
|
82
|
+
|
83
|
+
```
|
84
|
+
singleton(String)
|
85
|
+
singleton(::Hash) # Class singleton type cannot be parametrized.
|
86
86
|
```
|
87
87
|
|
88
88
|
### Literal type
|
@@ -110,10 +110,10 @@ Array[Integer | String] # Array of Integer or String
|
|
110
110
|
Intersection type denotes _a type of all of the given types_.
|
111
111
|
|
112
112
|
```
|
113
|
-
|
113
|
+
_Reader & _Writer # _Reader and _Writer
|
114
114
|
```
|
115
115
|
|
116
|
-
Note that `&` has higher precedence than `|` that `
|
116
|
+
Note that `&` has higher precedence than `|` that `A & B | C` is `(A & B) | C`.
|
117
117
|
|
118
118
|
### Optional type
|
119
119
|
|
@@ -155,7 +155,7 @@ Elem
|
|
155
155
|
```
|
156
156
|
|
157
157
|
Type variables cannot be distinguished from _class instance types_.
|
158
|
-
They are scoped in _class/module/interface declaration_ or _generic method types_.
|
158
|
+
They are scoped in _class/module/interface/alias declaration_ or _generic method types_.
|
159
159
|
|
160
160
|
```
|
161
161
|
class Ref[T] # Object is scoped in the class declaration.
|
@@ -289,7 +289,6 @@ _method-member_ ::= `def` _method-name_ `:` _method-types_ # Instance
|
|
289
289
|
| `def self?.` _method-name_ `:` _method-types_ # Singleton and instance method
|
290
290
|
|
291
291
|
_method-types_ ::= # Empty
|
292
|
-
| `super` # `super` overloading
|
293
292
|
| _type-parameters_ _method-type_ `|` _method-types_ # Overloading types
|
294
293
|
| `...` # Overloading for duplicate definitions
|
295
294
|
|
@@ -415,7 +414,6 @@ These work only as _statements_, not per-method specifier.
|
|
415
414
|
_decl_ ::= _class-decl_ # Class declaration
|
416
415
|
| _module-decl_ # Module declaration
|
417
416
|
| _interface-decl_ # Interface declaration
|
418
|
-
| _extension-decl_ # Extension declaration
|
419
417
|
| _type-alias-decl_ # Type alias declaration
|
420
418
|
| _const-decl_ # Constant declaration
|
421
419
|
| _global-decl_ # Global declaration
|
@@ -435,9 +433,7 @@ _interface-members_ ::= _method-member_ # Method
|
|
435
433
|
| _include-member_ # Mixin (include)
|
436
434
|
| _alias-member_ # Alias
|
437
435
|
|
438
|
-
|
439
|
-
|
440
|
-
_type-alias-decl_ ::= `type` _alias-name_ `=` _type_
|
436
|
+
_type-alias-decl_ ::= `type` _alias-name_ _module-type-parameters_ `=` _type_
|
441
437
|
|
442
438
|
_const-decl_ ::= _const-name_ `:` _type_
|
443
439
|
|
@@ -537,6 +533,12 @@ type subject = Attendee | Speaker
|
|
537
533
|
type JSON::t = Integer | TrueClass | FalseClass | String | Hash[Symbol, t] | Array[t]
|
538
534
|
```
|
539
535
|
|
536
|
+
Type alias can be generic like class, module, and interface.
|
537
|
+
|
538
|
+
```
|
539
|
+
type list[out T] = [T, list[T]] | nil
|
540
|
+
```
|
541
|
+
|
540
542
|
### Constant type declaration
|
541
543
|
|
542
544
|
You can declare a constant.
|
data/ext/rbs_extension/parser.c
CHANGED
@@ -273,7 +273,7 @@ static VALUE parse_function_param(parserstate *state) {
|
|
273
273
|
param_range.start = type_range.start;
|
274
274
|
param_range.end = name_range.end;
|
275
275
|
|
276
|
-
VALUE name =
|
276
|
+
VALUE name = rb_to_symbol(rbs_unquote_string(state, state->current_token.range, 0));
|
277
277
|
VALUE location = rbs_new_location(state->buffer, param_range);
|
278
278
|
rbs_loc *loc = rbs_check_location(location);
|
279
279
|
rbs_loc_add_optional_child(loc, rb_intern("name"), name_range);
|
@@ -815,6 +815,8 @@ static VALUE parse_simple(parserstate *state) {
|
|
815
815
|
}
|
816
816
|
case tULIDENT:
|
817
817
|
// fallthrough
|
818
|
+
case tLIDENT:
|
819
|
+
// fallthrough
|
818
820
|
case pCOLON2: {
|
819
821
|
range name_range;
|
820
822
|
range args_range;
|
@@ -857,19 +859,11 @@ static VALUE parse_simple(parserstate *state) {
|
|
857
859
|
} else if (kind == INTERFACE_NAME) {
|
858
860
|
return rbs_interface(typename, types, location);
|
859
861
|
} else if (kind == ALIAS_NAME) {
|
860
|
-
return rbs_alias(typename, location);
|
862
|
+
return rbs_alias(typename, types, location);
|
861
863
|
} else {
|
862
864
|
return Qnil;
|
863
865
|
}
|
864
866
|
}
|
865
|
-
case tLIDENT: {
|
866
|
-
VALUE location = rbs_location_current_token(state);
|
867
|
-
rbs_loc *loc = rbs_check_location(location);
|
868
|
-
rbs_loc_add_required_child(loc, rb_intern("name"), state->current_token.range);
|
869
|
-
rbs_loc_add_optional_child(loc, rb_intern("args"), NULL_RANGE);
|
870
|
-
VALUE typename = parse_type_name(state, ALIAS_NAME, NULL);
|
871
|
-
return rbs_alias(typename, location);
|
872
|
-
}
|
873
867
|
case kSINGLETON: {
|
874
868
|
range name_range;
|
875
869
|
range type_range;
|
@@ -1093,12 +1087,98 @@ VALUE parse_const_decl(parserstate *state) {
|
|
1093
1087
|
return rbs_ast_decl_constant(typename, type, location, comment);
|
1094
1088
|
}
|
1095
1089
|
|
1090
|
+
/*
|
1091
|
+
module_type_params ::= {} `[` module_type_param `,` ... <`]`>
|
1092
|
+
| {<>}
|
1093
|
+
|
1094
|
+
module_type_param ::= kUNCHECKED? (kIN|kOUT|) tUIDENT
|
1095
|
+
*/
|
1096
|
+
VALUE parse_module_type_params(parserstate *state, range *rg) {
|
1097
|
+
VALUE params = rbs_ast_decl_module_type_params();
|
1098
|
+
|
1099
|
+
if (state->next_token.type == pLBRACKET) {
|
1100
|
+
parser_advance(state);
|
1101
|
+
|
1102
|
+
rg->start = state->current_token.range.start;
|
1103
|
+
|
1104
|
+
while (true) {
|
1105
|
+
VALUE name;
|
1106
|
+
VALUE unchecked = Qfalse;
|
1107
|
+
VALUE variance = ID2SYM(rb_intern("invariant"));
|
1108
|
+
|
1109
|
+
range param_range = NULL_RANGE;
|
1110
|
+
range name_range;
|
1111
|
+
range variance_range = NULL_RANGE;
|
1112
|
+
range unchecked_range = NULL_RANGE;
|
1113
|
+
|
1114
|
+
param_range.start = state->next_token.range.start;
|
1115
|
+
|
1116
|
+
if (state->next_token.type == kUNCHECKED) {
|
1117
|
+
unchecked = Qtrue;
|
1118
|
+
parser_advance(state);
|
1119
|
+
unchecked_range = state->current_token.range;
|
1120
|
+
}
|
1121
|
+
|
1122
|
+
if (state->next_token.type == kIN || state->next_token.type == kOUT) {
|
1123
|
+
switch (state->next_token.type) {
|
1124
|
+
case kIN:
|
1125
|
+
variance = ID2SYM(rb_intern("contravariant"));
|
1126
|
+
break;
|
1127
|
+
case kOUT:
|
1128
|
+
variance = ID2SYM(rb_intern("covariant"));
|
1129
|
+
break;
|
1130
|
+
default:
|
1131
|
+
rbs_abort();
|
1132
|
+
}
|
1133
|
+
|
1134
|
+
parser_advance(state);
|
1135
|
+
variance_range = state->current_token.range;
|
1136
|
+
}
|
1137
|
+
|
1138
|
+
parser_advance_assert(state, tUIDENT);
|
1139
|
+
name_range = state->current_token.range;
|
1140
|
+
param_range.end = state->current_token.range.end;
|
1141
|
+
|
1142
|
+
ID id = INTERN_TOKEN(state, state->current_token);
|
1143
|
+
name = ID2SYM(id);
|
1144
|
+
|
1145
|
+
parser_insert_typevar(state, id);
|
1146
|
+
|
1147
|
+
VALUE location = rbs_new_location(state->buffer, param_range);
|
1148
|
+
rbs_loc *loc = rbs_check_location(location);
|
1149
|
+
rbs_loc_add_required_child(loc, rb_intern("name"), name_range);
|
1150
|
+
rbs_loc_add_optional_child(loc, rb_intern("variance"), variance_range);
|
1151
|
+
rbs_loc_add_optional_child(loc, rb_intern("unchecked"), unchecked_range);
|
1152
|
+
|
1153
|
+
VALUE param = rbs_ast_decl_module_type_params_param(name, variance, unchecked, location);
|
1154
|
+
rb_funcall(params, rb_intern("add"), 1, param);
|
1155
|
+
|
1156
|
+
if (state->next_token.type == pCOMMA) {
|
1157
|
+
parser_advance(state);
|
1158
|
+
}
|
1159
|
+
|
1160
|
+
if (state->next_token.type == pRBRACKET) {
|
1161
|
+
break;
|
1162
|
+
}
|
1163
|
+
}
|
1164
|
+
|
1165
|
+
parser_advance_assert(state, pRBRACKET);
|
1166
|
+
rg->end = state->current_token.range.end;
|
1167
|
+
} else {
|
1168
|
+
*rg = NULL_RANGE;
|
1169
|
+
}
|
1170
|
+
|
1171
|
+
return params;
|
1172
|
+
}
|
1173
|
+
|
1096
1174
|
/*
|
1097
1175
|
type_decl ::= {kTYPE} alias_name `=` <type>
|
1098
1176
|
*/
|
1099
1177
|
VALUE parse_type_decl(parserstate *state, position comment_pos, VALUE annotations) {
|
1100
1178
|
range decl_range;
|
1101
|
-
range keyword_range, name_range, eq_range;
|
1179
|
+
range keyword_range, name_range, params_range, eq_range;
|
1180
|
+
|
1181
|
+
parser_push_typevar_table(state, true);
|
1102
1182
|
|
1103
1183
|
decl_range.start = state->current_token.range.start;
|
1104
1184
|
comment_pos = nonnull_pos_or(comment_pos, decl_range.start);
|
@@ -1108,6 +1188,8 @@ VALUE parse_type_decl(parserstate *state, position comment_pos, VALUE annotation
|
|
1108
1188
|
parser_advance(state);
|
1109
1189
|
VALUE typename = parse_type_name(state, ALIAS_NAME, &name_range);
|
1110
1190
|
|
1191
|
+
VALUE type_params = parse_module_type_params(state, ¶ms_range);
|
1192
|
+
|
1111
1193
|
parser_advance_assert(state, pEQ);
|
1112
1194
|
eq_range = state->current_token.range;
|
1113
1195
|
|
@@ -1118,10 +1200,14 @@ VALUE parse_type_decl(parserstate *state, position comment_pos, VALUE annotation
|
|
1118
1200
|
rbs_loc *loc = rbs_check_location(location);
|
1119
1201
|
rbs_loc_add_required_child(loc, rb_intern("keyword"), keyword_range);
|
1120
1202
|
rbs_loc_add_required_child(loc, rb_intern("name"), name_range);
|
1203
|
+
rbs_loc_add_optional_child(loc, rb_intern("type_params"), params_range);
|
1121
1204
|
rbs_loc_add_required_child(loc, rb_intern("eq"), eq_range);
|
1122
1205
|
|
1206
|
+
parser_pop_typevar_table(state);
|
1207
|
+
|
1123
1208
|
return rbs_ast_decl_alias(
|
1124
1209
|
typename,
|
1210
|
+
type_params,
|
1125
1211
|
type,
|
1126
1212
|
annotations,
|
1127
1213
|
location,
|
@@ -1184,90 +1270,6 @@ VALUE parse_annotation(parserstate *state) {
|
|
1184
1270
|
return rbs_ast_annotation(string, location);
|
1185
1271
|
}
|
1186
1272
|
|
1187
|
-
/*
|
1188
|
-
module_type_params ::= {} `[` module_type_param `,` ... <`]`>
|
1189
|
-
| {<>}
|
1190
|
-
|
1191
|
-
module_type_param ::= kUNCHECKED? (kIN|kOUT|) tUIDENT
|
1192
|
-
*/
|
1193
|
-
VALUE parse_module_type_params(parserstate *state, range *rg) {
|
1194
|
-
VALUE params = rbs_ast_decl_module_type_params();
|
1195
|
-
|
1196
|
-
if (state->next_token.type == pLBRACKET) {
|
1197
|
-
parser_advance(state);
|
1198
|
-
|
1199
|
-
rg->start = state->current_token.range.start;
|
1200
|
-
|
1201
|
-
while (true) {
|
1202
|
-
VALUE name;
|
1203
|
-
VALUE unchecked = Qfalse;
|
1204
|
-
VALUE variance = ID2SYM(rb_intern("invariant"));
|
1205
|
-
|
1206
|
-
range param_range = NULL_RANGE;
|
1207
|
-
range name_range;
|
1208
|
-
range variance_range = NULL_RANGE;
|
1209
|
-
range unchecked_range = NULL_RANGE;
|
1210
|
-
|
1211
|
-
param_range.start = state->next_token.range.start;
|
1212
|
-
|
1213
|
-
if (state->next_token.type == kUNCHECKED) {
|
1214
|
-
unchecked = Qtrue;
|
1215
|
-
parser_advance(state);
|
1216
|
-
unchecked_range = state->current_token.range;
|
1217
|
-
}
|
1218
|
-
|
1219
|
-
if (state->next_token.type == kIN || state->next_token.type == kOUT) {
|
1220
|
-
switch (state->next_token.type) {
|
1221
|
-
case kIN:
|
1222
|
-
variance = ID2SYM(rb_intern("contravariant"));
|
1223
|
-
break;
|
1224
|
-
case kOUT:
|
1225
|
-
variance = ID2SYM(rb_intern("covariant"));
|
1226
|
-
break;
|
1227
|
-
default:
|
1228
|
-
rbs_abort();
|
1229
|
-
}
|
1230
|
-
|
1231
|
-
parser_advance(state);
|
1232
|
-
variance_range = state->current_token.range;
|
1233
|
-
}
|
1234
|
-
|
1235
|
-
parser_advance_assert(state, tUIDENT);
|
1236
|
-
name_range = state->current_token.range;
|
1237
|
-
param_range.end = state->current_token.range.end;
|
1238
|
-
|
1239
|
-
ID id = INTERN_TOKEN(state, state->current_token);
|
1240
|
-
name = ID2SYM(id);
|
1241
|
-
|
1242
|
-
parser_insert_typevar(state, id);
|
1243
|
-
|
1244
|
-
VALUE location = rbs_new_location(state->buffer, param_range);
|
1245
|
-
rbs_loc *loc = rbs_check_location(location);
|
1246
|
-
rbs_loc_add_required_child(loc, rb_intern("name"), name_range);
|
1247
|
-
rbs_loc_add_optional_child(loc, rb_intern("variance"), variance_range);
|
1248
|
-
rbs_loc_add_optional_child(loc, rb_intern("unchecked"), unchecked_range);
|
1249
|
-
|
1250
|
-
VALUE param = rbs_ast_decl_module_type_params_param(name, variance, unchecked, location);
|
1251
|
-
rb_funcall(params, rb_intern("add"), 1, param);
|
1252
|
-
|
1253
|
-
if (state->next_token.type == pCOMMA) {
|
1254
|
-
parser_advance(state);
|
1255
|
-
}
|
1256
|
-
|
1257
|
-
if (state->next_token.type == pRBRACKET) {
|
1258
|
-
break;
|
1259
|
-
}
|
1260
|
-
}
|
1261
|
-
|
1262
|
-
parser_advance_assert(state, pRBRACKET);
|
1263
|
-
rg->end = state->current_token.range.end;
|
1264
|
-
} else {
|
1265
|
-
*rg = NULL_RANGE;
|
1266
|
-
}
|
1267
|
-
|
1268
|
-
return params;
|
1269
|
-
}
|
1270
|
-
|
1271
1273
|
/*
|
1272
1274
|
annotations ::= {} annotation ... <annotation>
|
1273
1275
|
| {<>}
|
@@ -1487,6 +1489,8 @@ VALUE parse_member_def(parserstate *state, bool instance_only, bool accept_overl
|
|
1487
1489
|
case INSTANCE_SINGLETON_KIND:
|
1488
1490
|
k = ID2SYM(rb_intern("singleton_instance"));
|
1489
1491
|
break;
|
1492
|
+
default:
|
1493
|
+
rbs_abort();
|
1490
1494
|
}
|
1491
1495
|
|
1492
1496
|
VALUE location = rbs_new_location(state->buffer, member_range);
|
@@ -87,7 +87,6 @@ bool parser_typevar_member(parserstate *state, ID id) {
|
|
87
87
|
}
|
88
88
|
|
89
89
|
void print_parser(parserstate *state) {
|
90
|
-
pp(state->buffer);
|
91
90
|
printf(" current_token = %s (%d...%d)\n", token_type_str(state->current_token.type), state->current_token.range.start.char_pos, state->current_token.range.end.char_pos);
|
92
91
|
printf(" next_token = %s (%d...%d)\n", token_type_str(state->next_token.type), state->next_token.range.start.char_pos, state->next_token.range.end.char_pos);
|
93
92
|
printf(" next_token2 = %s (%d...%d)\n", token_type_str(state->next_token2.type), state->next_token2.range.start.char_pos, state->next_token2.range.end.char_pos);
|
@@ -37,4 +37,4 @@ VALUE rbs_unquote_string(parserstate *state, range rg, int offset_bytes);
|
|
37
37
|
* foo.rbs:11:21...11:25: Syntax error: {message}, token=`{tok source}` ({tok type})
|
38
38
|
* ```
|
39
39
|
* */
|
40
|
-
NORETURN(void) raise_syntax_error(parserstate *state, token tok, const char *fmt, ...);
|
40
|
+
PRINTF_ARGS(NORETURN(void) raise_syntax_error(parserstate *state, token tok, const char *fmt, ...), 3, 4);
|
@@ -70,15 +70,16 @@ VALUE rbs_class_singleton(VALUE typename, VALUE location) {
|
|
70
70
|
);
|
71
71
|
}
|
72
72
|
|
73
|
-
VALUE rbs_alias(VALUE typename, VALUE location) {
|
74
|
-
VALUE
|
75
|
-
rb_hash_aset(
|
76
|
-
rb_hash_aset(
|
73
|
+
VALUE rbs_alias(VALUE typename, VALUE args, VALUE location) {
|
74
|
+
VALUE kwargs = rb_hash_new();
|
75
|
+
rb_hash_aset(kwargs, ID2SYM(rb_intern("name")), typename);
|
76
|
+
rb_hash_aset(kwargs, ID2SYM(rb_intern("args")), args);
|
77
|
+
rb_hash_aset(kwargs, ID2SYM(rb_intern("location")), location);
|
77
78
|
|
78
79
|
return CLASS_NEW_INSTANCE(
|
79
80
|
RBS_Types_Alias,
|
80
81
|
1,
|
81
|
-
&
|
82
|
+
&kwargs
|
82
83
|
);
|
83
84
|
}
|
84
85
|
|
@@ -339,9 +340,10 @@ VALUE rbs_ast_decl_global(VALUE name, VALUE type, VALUE location, VALUE comment)
|
|
339
340
|
);
|
340
341
|
}
|
341
342
|
|
342
|
-
VALUE rbs_ast_decl_alias(VALUE name, VALUE type, VALUE annotations, VALUE location, VALUE comment) {
|
343
|
+
VALUE rbs_ast_decl_alias(VALUE name, VALUE type_params, VALUE type, VALUE annotations, VALUE location, VALUE comment) {
|
343
344
|
VALUE args = rb_hash_new();
|
344
345
|
rb_hash_aset(args, ID2SYM(rb_intern("name")), name);
|
346
|
+
rb_hash_aset(args, ID2SYM(rb_intern("type_params")), type_params);
|
345
347
|
rb_hash_aset(args, ID2SYM(rb_intern("type")), type);
|
346
348
|
rb_hash_aset(args, ID2SYM(rb_intern("annotations")), annotations);
|
347
349
|
rb_hash_aset(args, ID2SYM(rb_intern("location")), location);
|
@@ -3,10 +3,10 @@
|
|
3
3
|
|
4
4
|
#include "ruby.h"
|
5
5
|
|
6
|
-
VALUE rbs_alias(VALUE typename, VALUE location);
|
6
|
+
VALUE rbs_alias(VALUE typename, VALUE args, VALUE location);
|
7
7
|
VALUE rbs_ast_annotation(VALUE string, VALUE location);
|
8
8
|
VALUE rbs_ast_comment(VALUE string, VALUE location);
|
9
|
-
VALUE rbs_ast_decl_alias(VALUE name, VALUE type, VALUE annotations, VALUE location, VALUE comment);
|
9
|
+
VALUE rbs_ast_decl_alias(VALUE name, VALUE type_params, VALUE type, VALUE annotations, VALUE location, VALUE comment);
|
10
10
|
VALUE rbs_ast_decl_class_super(VALUE name, VALUE args, VALUE location);
|
11
11
|
VALUE rbs_ast_decl_class(VALUE name, VALUE type_params, VALUE super_class, VALUE members, VALUE annotations, VALUE location, VALUE comment);
|
12
12
|
VALUE rbs_ast_decl_constant(VALUE name, VALUE type, VALUE location, VALUE comment);
|
@@ -41,6 +41,4 @@ VALUE rbs_type_name(VALUE namespace, VALUE name);
|
|
41
41
|
VALUE rbs_union(VALUE types, VALUE location);
|
42
42
|
VALUE rbs_variable(VALUE name, VALUE location);
|
43
43
|
|
44
|
-
void pp(VALUE object);
|
45
|
-
|
46
44
|
#endif
|
data/lib/rbs/ast/declarations.rb
CHANGED
@@ -362,13 +362,15 @@ module RBS
|
|
362
362
|
|
363
363
|
class Alias < Base
|
364
364
|
attr_reader :name
|
365
|
+
attr_reader :type_params
|
365
366
|
attr_reader :type
|
366
367
|
attr_reader :annotations
|
367
368
|
attr_reader :location
|
368
369
|
attr_reader :comment
|
369
370
|
|
370
|
-
def initialize(name:, type:, annotations:, location:, comment:)
|
371
|
+
def initialize(name:, type_params:, type:, annotations:, location:, comment:)
|
371
372
|
@name = name
|
373
|
+
@type_params = type_params
|
372
374
|
@type = type
|
373
375
|
@annotations = annotations
|
374
376
|
@location = location
|
@@ -378,19 +380,21 @@ module RBS
|
|
378
380
|
def ==(other)
|
379
381
|
other.is_a?(Alias) &&
|
380
382
|
other.name == name &&
|
383
|
+
other.type_params == type_params &&
|
381
384
|
other.type == type
|
382
385
|
end
|
383
386
|
|
384
387
|
alias eql? ==
|
385
388
|
|
386
389
|
def hash
|
387
|
-
self.class.hash ^ name.hash ^ type.hash
|
390
|
+
self.class.hash ^ name.hash ^ type_params.hash ^ type.hash
|
388
391
|
end
|
389
392
|
|
390
393
|
def to_json(state = _ = nil)
|
391
394
|
{
|
392
395
|
declaration: :alias,
|
393
396
|
name: name,
|
397
|
+
type_params: type_params,
|
394
398
|
type: type,
|
395
399
|
annotations: annotations,
|
396
400
|
location: location,
|
data/lib/rbs/cli.rb
CHANGED
@@ -460,7 +460,7 @@ EOU
|
|
460
460
|
|
461
461
|
env.alias_decls.each do |name, decl|
|
462
462
|
stdout.puts "Validating alias: `#{name}`..."
|
463
|
-
builder.
|
463
|
+
builder.expand_alias1(name).tap do |type|
|
464
464
|
validator.validate_type type, context: [Namespace.root]
|
465
465
|
end
|
466
466
|
validator.validate_type_alias(entry: decl)
|
@@ -102,7 +102,12 @@ module RBS
|
|
102
102
|
git 'fetch', 'origin'
|
103
103
|
end
|
104
104
|
else
|
105
|
-
|
105
|
+
begin
|
106
|
+
# git v2.27.0 or greater
|
107
|
+
git 'clone', '--filter=blob:none', remote, git_dir.to_s
|
108
|
+
rescue CommandError
|
109
|
+
git 'clone', remote, git_dir.to_s
|
110
|
+
end
|
106
111
|
end
|
107
112
|
|
108
113
|
begin
|