rbs 1.7.0 → 2.0.0.pre1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (79) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +95 -3
  3. data/core/array.rbs +3 -3
  4. data/core/builtin.rbs +4 -0
  5. data/core/enumerable.rbs +3 -3
  6. data/core/thread.rbs +1 -1
  7. data/docs/collection.md +23 -1
  8. data/docs/syntax.md +117 -61
  9. data/ext/rbs_extension/constants.c +2 -6
  10. data/ext/rbs_extension/constants.h +1 -2
  11. data/ext/rbs_extension/parser.c +221 -185
  12. data/ext/rbs_extension/parserstate.c +6 -2
  13. data/ext/rbs_extension/parserstate.h +10 -0
  14. data/ext/rbs_extension/ruby_objs.c +17 -17
  15. data/ext/rbs_extension/ruby_objs.h +3 -4
  16. data/lib/rbs/ast/declarations.rb +6 -99
  17. data/lib/rbs/ast/type_param.rb +134 -0
  18. data/lib/rbs/cli.rb +33 -5
  19. data/lib/rbs/collection/config/lockfile_generator.rb +26 -18
  20. data/lib/rbs/collection/sources/git.rb +18 -7
  21. data/lib/rbs/collection/sources/rubygems.rb +7 -0
  22. data/lib/rbs/collection/sources/stdlib.rb +6 -0
  23. data/lib/rbs/definition.rb +9 -0
  24. data/lib/rbs/definition_builder.rb +78 -16
  25. data/lib/rbs/environment.rb +32 -8
  26. data/lib/rbs/environment_loader.rb +0 -2
  27. data/lib/rbs/environment_walker.rb +4 -1
  28. data/lib/rbs/errors.rb +31 -6
  29. data/lib/rbs/location_aux.rb +2 -0
  30. data/lib/rbs/method_type.rb +29 -6
  31. data/lib/rbs/prototype/rb.rb +3 -3
  32. data/lib/rbs/prototype/rbi.rb +8 -6
  33. data/lib/rbs/prototype/runtime.rb +4 -4
  34. data/lib/rbs/type_alias_regularity.rb +115 -0
  35. data/lib/rbs/types.rb +100 -23
  36. data/lib/rbs/validator.rb +99 -15
  37. data/lib/rbs/variance_calculator.rb +60 -31
  38. data/lib/rbs/version.rb +1 -1
  39. data/lib/rbs/writer.rb +2 -14
  40. data/lib/rbs.rb +2 -0
  41. data/schema/decls.json +19 -46
  42. data/schema/methodType.json +1 -1
  43. data/schema/typeParam.json +36 -0
  44. data/schema/types.json +8 -2
  45. data/sig/collection/collections.rbs +13 -2
  46. data/sig/collection/config.rbs +2 -2
  47. data/sig/declarations.rbs +15 -62
  48. data/sig/definition.rbs +11 -1
  49. data/sig/definition_builder.rbs +37 -1
  50. data/sig/environment.rbs +7 -1
  51. data/sig/environment_walker.rbs +26 -0
  52. data/sig/errors.rbs +28 -3
  53. data/sig/location.rbs +3 -1
  54. data/sig/locator.rbs +1 -1
  55. data/sig/method_types.rbs +25 -4
  56. data/sig/type_alias_regularity.rbs +92 -0
  57. data/sig/type_param.rbs +74 -0
  58. data/sig/types.rbs +37 -8
  59. data/sig/validator.rbs +38 -2
  60. data/sig/variance_calculator.rbs +50 -0
  61. data/sig/writer.rbs +1 -1
  62. data/stdlib/bigdecimal-math/0/manifest.yaml +2 -0
  63. data/stdlib/csv/0/manifest.yaml +2 -0
  64. data/stdlib/date/0/date.rbs +2 -2
  65. data/stdlib/logger/0/manifest.yaml +2 -0
  66. data/stdlib/net-http/0/manifest.yaml +2 -0
  67. data/stdlib/openssl/0/manifest.yaml +2 -0
  68. data/stdlib/prime/0/manifest.yaml +2 -0
  69. data/stdlib/resolv/0/manifest.yaml +3 -0
  70. data/stdlib/set/0/set.rbs +3 -3
  71. data/stdlib/uri/0/common.rbs +10 -5
  72. data/stdlib/uri/0/ftp.rbs +10 -0
  73. data/stdlib/uri/0/mailto.rbs +5 -0
  74. data/stdlib/uri/0/ws.rbs +10 -0
  75. data/stdlib/uri/0/wss.rbs +7 -0
  76. data/stdlib/yaml/0/manifest.yaml +3 -0
  77. data/steep/Gemfile.lock +10 -10
  78. metadata +21 -5
  79. data/lib/ruby/signature.rb +0 -7
@@ -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 = ID2SYM(INTERN_TOKEN(state, state->current_token));
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);
@@ -741,6 +741,90 @@ static VALUE parse_symbol(parserstate *state) {
741
741
  );
742
742
  }
743
743
 
744
+ /*
745
+ instance_type ::= {type_name} <type_args>
746
+
747
+ type_args ::= {} <> /empty/
748
+ | {} `[` type_list <`]`>
749
+ */
750
+ static VALUE parse_instance_type(parserstate *state, bool parse_alias) {
751
+ range name_range;
752
+ range args_range;
753
+ range type_range;
754
+
755
+ TypeNameKind expected_kind = INTERFACE_NAME | CLASS_NAME;
756
+ if (parse_alias) {
757
+ expected_kind |= ALIAS_NAME;
758
+ }
759
+
760
+ VALUE typename = parse_type_name(state, expected_kind, &name_range);
761
+ VALUE types = rb_ary_new();
762
+
763
+ TypeNameKind kind;
764
+ if (state->current_token.type == tUIDENT) {
765
+ kind = CLASS_NAME;
766
+ } else if (state->current_token.type == tULIDENT) {
767
+ kind = INTERFACE_NAME;
768
+ } else if (state->current_token.type == tLIDENT) {
769
+ kind = ALIAS_NAME;
770
+ } else {
771
+ rbs_abort();
772
+ }
773
+
774
+ if (state->next_token.type == pLBRACKET) {
775
+ parser_advance(state);
776
+ args_range.start = state->current_token.range.start;
777
+ parse_type_list(state, pRBRACKET, types);
778
+ parser_advance_assert(state, pRBRACKET);
779
+ args_range.end = state->current_token.range.end;
780
+ } else {
781
+ args_range = NULL_RANGE;
782
+ }
783
+
784
+ type_range.start = name_range.start;
785
+ type_range.end = nonnull_pos_or(args_range.end, name_range.end);
786
+
787
+ VALUE location = rbs_new_location(state->buffer, type_range);
788
+ rbs_loc *loc = rbs_check_location(location);
789
+ rbs_loc_add_required_child(loc, rb_intern("name"), name_range);
790
+ rbs_loc_add_optional_child(loc, rb_intern("args"), args_range);
791
+
792
+ if (kind == CLASS_NAME) {
793
+ return rbs_class_instance(typename, types, location);
794
+ } else if (kind == INTERFACE_NAME) {
795
+ return rbs_interface(typename, types, location);
796
+ } else if (kind == ALIAS_NAME) {
797
+ return rbs_alias(typename, types, location);
798
+ } else {
799
+ return Qnil;
800
+ }
801
+ }
802
+
803
+ /*
804
+ singleton_type ::= {`singleton`} `(` type_name <`)`>
805
+ */
806
+ static VALUE parse_singleton_type(parserstate *state) {
807
+ range name_range;
808
+ range type_range;
809
+
810
+ parser_assert(state, kSINGLETON);
811
+
812
+ type_range.start = state->current_token.range.start;
813
+ parser_advance_assert(state, pLPAREN);
814
+ parser_advance(state);
815
+
816
+ VALUE typename = parse_type_name(state, CLASS_NAME, &name_range);
817
+
818
+ parser_advance_assert(state, pRPAREN);
819
+ type_range.end = state->current_token.range.end;
820
+
821
+ VALUE location = rbs_new_location(state->buffer, type_range);
822
+ rbs_loc *loc = rbs_check_location(location);
823
+ rbs_loc_add_required_child(loc, rb_intern("name"), name_range);
824
+
825
+ return rbs_class_singleton(typename, location);
826
+ }
827
+
744
828
  /*
745
829
  simple ::= {} `(` type <`)`>
746
830
  | {} <base type>
@@ -813,82 +897,12 @@ static VALUE parse_simple(parserstate *state) {
813
897
  }
814
898
  // fallthrough for type name
815
899
  }
816
- case tULIDENT:
817
- // fallthrough
818
- case pCOLON2: {
819
- range name_range;
820
- range args_range;
821
- range type_range;
822
-
823
- VALUE typename = parse_type_name(state, INTERFACE_NAME | CLASS_NAME | ALIAS_NAME, &name_range);
824
- VALUE types = rb_ary_new();
825
-
826
- TypeNameKind kind;
827
- if (state->current_token.type == tUIDENT) {
828
- kind = CLASS_NAME;
829
- } else if (state->current_token.type == tULIDENT) {
830
- kind = INTERFACE_NAME;
831
- } else if (state->current_token.type == tLIDENT) {
832
- kind = ALIAS_NAME;
833
- } else {
834
- rbs_abort();
835
- }
836
-
837
- if (state->next_token.type == pLBRACKET) {
838
- parser_advance(state);
839
- args_range.start = state->current_token.range.start;
840
- parse_type_list(state, pRBRACKET, types);
841
- parser_advance_assert(state, pRBRACKET);
842
- args_range.end = state->current_token.range.end;
843
- } else {
844
- args_range = NULL_RANGE;
845
- }
846
-
847
- type_range.start = name_range.start;
848
- type_range.end = nonnull_pos_or(args_range.end, name_range.end);
849
-
850
- VALUE location = rbs_new_location(state->buffer, type_range);
851
- rbs_loc *loc = rbs_check_location(location);
852
- rbs_loc_add_required_child(loc, rb_intern("name"), name_range);
853
- rbs_loc_add_optional_child(loc, rb_intern("args"), args_range);
854
-
855
- if (kind == CLASS_NAME) {
856
- return rbs_class_instance(typename, types, location);
857
- } else if (kind == INTERFACE_NAME) {
858
- return rbs_interface(typename, types, location);
859
- } else if (kind == ALIAS_NAME) {
860
- return rbs_alias(typename, location);
861
- } else {
862
- return Qnil;
863
- }
864
- }
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
- case kSINGLETON: {
874
- range name_range;
875
- range type_range;
876
-
877
- type_range.start = state->current_token.range.start;
878
- parser_advance_assert(state, pLPAREN);
879
- parser_advance(state);
880
-
881
- VALUE typename = parse_type_name(state, CLASS_NAME, &name_range);
882
-
883
- parser_advance_assert(state, pRPAREN);
884
- type_range.end = state->current_token.range.end;
885
-
886
- VALUE location = rbs_new_location(state->buffer, type_range);
887
- rbs_loc *loc = rbs_check_location(location);
888
- rbs_loc_add_required_child(loc, rb_intern("name"), name_range);
889
-
890
- return rbs_class_singleton(typename, location);
891
- }
900
+ case tULIDENT: // fallthrough
901
+ case tLIDENT: // fallthrough
902
+ case pCOLON2:
903
+ return parse_instance_type(state, true);
904
+ case kSINGLETON:
905
+ return parse_singleton_type(state);
892
906
  case pLBRACKET: {
893
907
  range rg;
894
908
  rg.start = state->current_token.range.start;
@@ -976,53 +990,151 @@ VALUE parse_type(parserstate *state) {
976
990
  }
977
991
 
978
992
  /*
979
- method_type ::= {} `[` type_vars `]` <function>
980
- | {} <function>
993
+ type_params ::= {} `[` type_param `,` ... <`]`>
994
+ | {<>}
995
+
996
+ type_param ::= kUNCHECKED? (kIN|kOUT|) tUIDENT (module_type_params == true)
997
+
998
+ type_param ::= tUIDENT (module_type_params == false)
981
999
  */
982
- VALUE parse_method_type(parserstate *state) {
983
- VALUE function = Qnil;
984
- VALUE block = Qnil;
985
- id_table *table = parser_push_typevar_table(state, false);
986
1000
 
987
- position start = state->next_token.range.start;
1001
+ VALUE parse_type_params(parserstate *state, range *rg, bool module_type_params) {
1002
+ VALUE params = rb_ary_new();
988
1003
 
989
1004
  if (state->next_token.type == pLBRACKET) {
990
1005
  parser_advance(state);
991
1006
 
1007
+ rg->start = state->current_token.range.start;
1008
+
992
1009
  while (true) {
1010
+ VALUE name;
1011
+ bool unchecked = false;
1012
+ VALUE variance = ID2SYM(rb_intern("invariant"));
1013
+ VALUE upper_bound = Qnil;
1014
+
1015
+ range param_range = NULL_RANGE;
1016
+ range name_range;
1017
+ range variance_range = NULL_RANGE;
1018
+ range unchecked_range = NULL_RANGE;
1019
+ range upper_bound_range = NULL_RANGE;
1020
+
1021
+ param_range.start = state->next_token.range.start;
1022
+
1023
+ if (module_type_params) {
1024
+ if (state->next_token.type == kUNCHECKED) {
1025
+ unchecked = true;
1026
+ parser_advance(state);
1027
+ unchecked_range = state->current_token.range;
1028
+ }
1029
+
1030
+ if (state->next_token.type == kIN || state->next_token.type == kOUT) {
1031
+ switch (state->next_token.type) {
1032
+ case kIN:
1033
+ variance = ID2SYM(rb_intern("contravariant"));
1034
+ break;
1035
+ case kOUT:
1036
+ variance = ID2SYM(rb_intern("covariant"));
1037
+ break;
1038
+ default:
1039
+ rbs_abort();
1040
+ }
1041
+
1042
+ parser_advance(state);
1043
+ variance_range = state->current_token.range;
1044
+ }
1045
+ }
1046
+
993
1047
  parser_advance_assert(state, tUIDENT);
994
- ID name = INTERN_TOKEN(state, state->current_token);
995
- parser_insert_typevar(state, name);
1048
+ name_range = state->current_token.range;
1049
+ param_range.end = state->current_token.range.end;
996
1050
 
997
- if (state->next_token.type == pCOMMA) {
1051
+ ID id = INTERN_TOKEN(state, state->current_token);
1052
+ name = ID2SYM(id);
1053
+
1054
+ parser_insert_typevar(state, id);
1055
+
1056
+ if (state->next_token.type == pLT) {
998
1057
  parser_advance(state);
999
- if (state->next_token.type == pRBRACKET) {
1000
- break;
1058
+
1059
+ if (state->next_token.type == kSINGLETON) {
1060
+ parser_advance(state);
1061
+ upper_bound = parse_singleton_type(state);
1062
+ } else {
1063
+ parser_advance(state);
1064
+ upper_bound = parse_instance_type(state, false);
1001
1065
  }
1002
- } else {
1066
+ }
1067
+
1068
+ VALUE location = rbs_new_location(state->buffer, param_range);
1069
+ rbs_loc *loc = rbs_check_location(location);
1070
+ rbs_loc_add_required_child(loc, rb_intern("name"), name_range);
1071
+ rbs_loc_add_optional_child(loc, rb_intern("variance"), variance_range);
1072
+ rbs_loc_add_optional_child(loc, rb_intern("unchecked"), unchecked_range);
1073
+ rbs_loc_add_optional_child(loc, rb_intern("upper_bound"), upper_bound_range);
1074
+
1075
+ VALUE param = rbs_ast_type_param(name, variance, unchecked, upper_bound, location);
1076
+ rb_ary_push(params, param);
1077
+
1078
+ if (state->next_token.type == pCOMMA) {
1079
+ parser_advance(state);
1080
+ }
1081
+
1082
+ if (state->next_token.type == pRBRACKET) {
1003
1083
  break;
1004
1084
  }
1005
1085
  }
1006
1086
 
1007
1087
  parser_advance_assert(state, pRBRACKET);
1088
+ rg->end = state->current_token.range.end;
1089
+ } else {
1090
+ *rg = NULL_RANGE;
1008
1091
  }
1009
1092
 
1010
- parse_function(state, &function, &block);
1093
+ rb_funcall(
1094
+ RBS_AST_TypeParam,
1095
+ rb_intern("resolve_variables"),
1096
+ 1,
1097
+ params
1098
+ );
1011
1099
 
1012
- position end = state->current_token.range.end;
1100
+ return params;
1101
+ }
1013
1102
 
1014
- VALUE type_params = rb_ary_new();
1015
- for (size_t i = 0; i < table->count; i++) {
1016
- rb_ary_push(type_params, ID2SYM(table->ids[i]));
1017
- }
1103
+ /*
1104
+ method_type ::= {} type_params <function>
1105
+ */
1106
+ VALUE parse_method_type(parserstate *state) {
1107
+ range rg;
1108
+ range params_range = NULL_RANGE;
1109
+ range type_range;
1110
+
1111
+ VALUE function = Qnil;
1112
+ VALUE block = Qnil;
1113
+ parser_push_typevar_table(state, false);
1114
+
1115
+ rg.start = state->next_token.range.start;
1116
+
1117
+ VALUE type_params = parse_type_params(state, &params_range, false);
1118
+
1119
+ type_range.start = state->next_token.range.start;
1120
+
1121
+ parse_function(state, &function, &block);
1122
+
1123
+ rg.end = state->current_token.range.end;
1124
+ type_range.end = rg.end;
1018
1125
 
1019
1126
  parser_pop_typevar_table(state);
1020
1127
 
1128
+ VALUE location = rbs_new_location(state->buffer, rg);
1129
+ rbs_loc *loc = rbs_check_location(location);
1130
+ rbs_loc_add_required_child(loc, rb_intern("type"), type_range);
1131
+ rbs_loc_add_optional_child(loc, rb_intern("type_params"), params_range);
1132
+
1021
1133
  return rbs_method_type(
1022
1134
  type_params,
1023
1135
  function,
1024
1136
  block,
1025
- rbs_location_pp(state->buffer, &start, &end)
1137
+ location
1026
1138
  );
1027
1139
  }
1028
1140
 
@@ -1098,7 +1210,9 @@ VALUE parse_const_decl(parserstate *state) {
1098
1210
  */
1099
1211
  VALUE parse_type_decl(parserstate *state, position comment_pos, VALUE annotations) {
1100
1212
  range decl_range;
1101
- range keyword_range, name_range, eq_range;
1213
+ range keyword_range, name_range, params_range, eq_range;
1214
+
1215
+ parser_push_typevar_table(state, true);
1102
1216
 
1103
1217
  decl_range.start = state->current_token.range.start;
1104
1218
  comment_pos = nonnull_pos_or(comment_pos, decl_range.start);
@@ -1108,6 +1222,8 @@ VALUE parse_type_decl(parserstate *state, position comment_pos, VALUE annotation
1108
1222
  parser_advance(state);
1109
1223
  VALUE typename = parse_type_name(state, ALIAS_NAME, &name_range);
1110
1224
 
1225
+ VALUE type_params = parse_type_params(state, &params_range, true);
1226
+
1111
1227
  parser_advance_assert(state, pEQ);
1112
1228
  eq_range = state->current_token.range;
1113
1229
 
@@ -1118,10 +1234,14 @@ VALUE parse_type_decl(parserstate *state, position comment_pos, VALUE annotation
1118
1234
  rbs_loc *loc = rbs_check_location(location);
1119
1235
  rbs_loc_add_required_child(loc, rb_intern("keyword"), keyword_range);
1120
1236
  rbs_loc_add_required_child(loc, rb_intern("name"), name_range);
1237
+ rbs_loc_add_optional_child(loc, rb_intern("type_params"), params_range);
1121
1238
  rbs_loc_add_required_child(loc, rb_intern("eq"), eq_range);
1122
1239
 
1240
+ parser_pop_typevar_table(state);
1241
+
1123
1242
  return rbs_ast_decl_alias(
1124
1243
  typename,
1244
+ type_params,
1125
1245
  type,
1126
1246
  annotations,
1127
1247
  location,
@@ -1184,90 +1304,6 @@ VALUE parse_annotation(parserstate *state) {
1184
1304
  return rbs_ast_annotation(string, location);
1185
1305
  }
1186
1306
 
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
1307
  /*
1272
1308
  annotations ::= {} annotation ... <annotation>
1273
1309
  | {<>}
@@ -1966,7 +2002,7 @@ VALUE parse_interface_decl(parserstate *state, position comment_pos, VALUE annot
1966
2002
  parser_advance(state);
1967
2003
 
1968
2004
  VALUE name = parse_type_name(state, INTERFACE_NAME, &name_range);
1969
- VALUE params = parse_module_type_params(state, &type_params_range);
2005
+ VALUE params = parse_type_params(state, &type_params_range, true);
1970
2006
  VALUE members = parse_interface_members(state);
1971
2007
 
1972
2008
  parser_advance_assert(state, kEND);
@@ -2130,7 +2166,7 @@ VALUE parse_module_decl(parserstate *state, position comment_pos, VALUE annotati
2130
2166
 
2131
2167
  parser_advance(state);
2132
2168
  VALUE module_name = parse_type_name(state, CLASS_NAME, &name_range);
2133
- VALUE type_params = parse_module_type_params(state, &type_params_range);
2169
+ VALUE type_params = parse_type_params(state, &type_params_range, true);
2134
2170
  VALUE self_types = rb_ary_new();
2135
2171
 
2136
2172
  if (state->next_token.type == pCOLON) {
@@ -2237,7 +2273,7 @@ VALUE parse_class_decl(parserstate *state, position comment_pos, VALUE annotatio
2237
2273
 
2238
2274
  parser_advance(state);
2239
2275
  name = parse_type_name(state, CLASS_NAME, &name_range);
2240
- type_params = parse_module_type_params(state, &type_params_range);
2276
+ type_params = parse_type_params(state, &type_params_range, true);
2241
2277
  super = parse_class_decl_super(state, &lt_range);
2242
2278
  members = parse_module_members(state);
2243
2279
  parser_advance_assert(state, kEND);
@@ -130,8 +130,7 @@ bool parser_advance_if(parserstate *state, enum TokenType type) {
130
130
  }
131
131
  }
132
132
 
133
- void parser_advance_assert(parserstate *state, enum TokenType type) {
134
- parser_advance(state);
133
+ void parser_assert(parserstate *state, enum TokenType type) {
135
134
  if (state->current_token.type != type) {
136
135
  raise_syntax_error(
137
136
  state,
@@ -142,6 +141,11 @@ void parser_advance_assert(parserstate *state, enum TokenType type) {
142
141
  }
143
142
  }
144
143
 
144
+ void parser_advance_assert(parserstate *state, enum TokenType type) {
145
+ parser_advance(state);
146
+ parser_assert(state, type);
147
+ }
148
+
145
149
  void print_token(token tok) {
146
150
  printf(
147
151
  "%s char=%d...%d\n",
@@ -107,11 +107,21 @@ void free_parser(parserstate *parser);
107
107
  * Advance one token.
108
108
  * */
109
109
  void parser_advance(parserstate *state);
110
+
111
+ /**
112
+ * @brief Raises an exception if `current_token->type != type`.
113
+ *
114
+ * @param state
115
+ * @param type
116
+ */
117
+ void parser_assert(parserstate *state, enum TokenType type);
118
+
110
119
  /**
111
120
  * Advance one token, and assert the current token type.
112
121
  * Raises an exception if `current_token->type != type`.
113
122
  * */
114
123
  void parser_advance_assert(parserstate *state, enum TokenType type);
124
+
115
125
  /**
116
126
  * Advance one token if the next_token is a token of the type.
117
127
  * */
@@ -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 args = rb_hash_new();
75
- rb_hash_aset(args, ID2SYM(rb_intern("name")), typename);
76
- rb_hash_aset(args, ID2SYM(rb_intern("location")), location);
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
- &args
82
+ &kwargs
82
83
  );
83
84
  }
84
85
 
@@ -293,22 +294,20 @@ VALUE rbs_ast_annotation(VALUE string, VALUE location) {
293
294
  );
294
295
  }
295
296
 
296
- VALUE rbs_ast_decl_module_type_params() {
297
- return rb_funcall(RBS_AST_Declarations_ModuleTypeParams, rb_intern("new"), 0);
298
- }
299
-
300
- VALUE rbs_ast_decl_module_type_params_param(VALUE name, VALUE variance, VALUE skip_validation, VALUE location) {
297
+ VALUE rbs_ast_type_param(VALUE name, VALUE variance, bool unchecked, VALUE upper_bound, VALUE location) {
301
298
  VALUE args = rb_hash_new();
302
299
  rb_hash_aset(args, ID2SYM(rb_intern("name")), name);
303
300
  rb_hash_aset(args, ID2SYM(rb_intern("variance")), variance);
304
- rb_hash_aset(args, ID2SYM(rb_intern("skip_validation")), skip_validation);
301
+ rb_hash_aset(args, ID2SYM(rb_intern("upper_bound")), upper_bound);
305
302
  rb_hash_aset(args, ID2SYM(rb_intern("location")), location);
306
303
 
307
- return CLASS_NEW_INSTANCE(
308
- RBS_AST_Declarations_ModuleTypeParams_TypeParam,
309
- 1,
310
- &args
311
- );
304
+ VALUE type_param = CLASS_NEW_INSTANCE(RBS_AST_TypeParam, 1, &args);
305
+
306
+ if (unchecked) {
307
+ rb_funcall(type_param, rb_intern("unchecked!"), 0);
308
+ }
309
+
310
+ return type_param;
312
311
  }
313
312
 
314
313
  VALUE rbs_ast_decl_constant(VALUE name, VALUE type, VALUE location, VALUE comment) {
@@ -339,9 +338,10 @@ VALUE rbs_ast_decl_global(VALUE name, VALUE type, VALUE location, VALUE comment)
339
338
  );
340
339
  }
341
340
 
342
- VALUE rbs_ast_decl_alias(VALUE name, VALUE type, VALUE annotations, VALUE location, VALUE comment) {
341
+ VALUE rbs_ast_decl_alias(VALUE name, VALUE type_params, VALUE type, VALUE annotations, VALUE location, VALUE comment) {
343
342
  VALUE args = rb_hash_new();
344
343
  rb_hash_aset(args, ID2SYM(rb_intern("name")), name);
344
+ rb_hash_aset(args, ID2SYM(rb_intern("type_params")), type_params);
345
345
  rb_hash_aset(args, ID2SYM(rb_intern("type")), type);
346
346
  rb_hash_aset(args, ID2SYM(rb_intern("annotations")), annotations);
347
347
  rb_hash_aset(args, ID2SYM(rb_intern("location")), location);
@@ -3,18 +3,17 @@
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_type_param(VALUE name, VALUE variance, bool unchecked, VALUE upper_bound, VALUE location);
10
+ VALUE rbs_ast_decl_alias(VALUE name, VALUE type_params, VALUE type, VALUE annotations, VALUE location, VALUE comment);
10
11
  VALUE rbs_ast_decl_class_super(VALUE name, VALUE args, VALUE location);
11
12
  VALUE rbs_ast_decl_class(VALUE name, VALUE type_params, VALUE super_class, VALUE members, VALUE annotations, VALUE location, VALUE comment);
12
13
  VALUE rbs_ast_decl_constant(VALUE name, VALUE type, VALUE location, VALUE comment);
13
14
  VALUE rbs_ast_decl_global(VALUE name, VALUE type, VALUE location, VALUE comment);
14
15
  VALUE rbs_ast_decl_interface(VALUE name, VALUE type_params, VALUE members, VALUE annotations, VALUE location, VALUE comment);
15
16
  VALUE rbs_ast_decl_module_self(VALUE name, VALUE args, VALUE location);
16
- VALUE rbs_ast_decl_module_type_params_param(VALUE name, VALUE variance, VALUE skip_validation, VALUE location);
17
- VALUE rbs_ast_decl_module_type_params();
18
17
  VALUE rbs_ast_decl_module(VALUE name, VALUE type_params, VALUE self_types, VALUE members, VALUE annotations, VALUE location, VALUE comment);
19
18
  VALUE rbs_ast_members_alias(VALUE new_name, VALUE old_name, VALUE kind, VALUE annotations, VALUE location, VALUE comment);
20
19
  VALUE rbs_ast_members_attribute(VALUE klass, VALUE name, VALUE type, VALUE ivar_name, VALUE kind, VALUE annotations, VALUE location, VALUE comment);