@@ -32,7 +32,7 @@ tag sty {
32
32
ty_machine ( util. common . ty_mach ) ;
33
33
ty_char;
34
34
ty_str;
35
- ty_tag ( ast. def_id ) ;
35
+ ty_tag ( ast. def_id , vec [ @t ] ) ;
36
36
ty_box ( @t) ;
37
37
ty_vec ( @t) ;
38
38
ty_tup ( vec[ @t] ) ;
@@ -42,7 +42,7 @@ tag sty {
42
42
ty_obj ( vec[ method] ) ;
43
43
ty_var ( int) ; // ephemeral type var
44
44
ty_local ( ast. def_id ) ; // type of a local var
45
- ty_param ( ast. def_id ) ; // fn type param
45
+ ty_param ( ast. def_id ) ; // fn/tag type param
46
46
ty_type;
47
47
ty_native;
48
48
// TODO: ty_fn_arg(@t), for a possibly-aliased function argument
@@ -235,9 +235,14 @@ fn ty_to_str(&@t typ) -> str {
235
235
s = "rec(" + _str. connect ( strs, "," ) + ")" ;
236
236
}
237
237
238
- case ( ty_tag ( _) ) {
238
+ case ( ty_tag ( _, ?tps ) ) {
239
239
// The user should never see this if the cname is set properly!
240
240
s = "<tag>" ;
241
+ if ( _vec. len [ @t] ( tps) > 0 u) {
242
+ auto f = ty_to_str;
243
+ auto strs = _vec. map [ @t, str] ( f, tps) ;
244
+ s += "[" + _str. connect ( strs, "," ) + "]" ;
245
+ }
241
246
}
242
247
243
248
case ( ty_fn ( ?inputs, ?output) ) {
@@ -291,7 +296,6 @@ fn fold_ty(ty_fold fld, @t ty) -> @t {
291
296
case ( ty_machine ( _) ) { ret fld. fold_simple_ty ( ty) ; }
292
297
case ( ty_char) { ret fld. fold_simple_ty ( ty) ; }
293
298
case ( ty_str) { ret fld. fold_simple_ty ( ty) ; }
294
- case ( ty_tag ( _) ) { ret fld. fold_simple_ty ( ty) ; }
295
299
case ( ty_type) { ret fld. fold_simple_ty ( ty) ; }
296
300
case ( ty_native) { ret fld. fold_simple_ty ( ty) ; }
297
301
case ( ty_box ( ?subty) ) {
@@ -300,6 +304,13 @@ fn fold_ty(ty_fold fld, @t ty) -> @t {
300
304
case ( ty_vec ( ?subty) ) {
301
305
ret rewrap ( ty, ty_vec ( fold_ty ( fld, subty) ) ) ;
302
306
}
307
+ case ( ty_tag ( ?tid, ?subtys) ) {
308
+ let vec[ @t] new_subtys = vec ( ) ;
309
+ for ( @t subty in subtys) {
310
+ new_subtys += vec ( fold_ty ( fld, subty) ) ;
311
+ }
312
+ ret rewrap( ty, ty_tag ( tid, new_subtys) ) ;
313
+ }
303
314
case ( ty_tup ( ?subtys) ) {
304
315
let vec[ @t] new_subtys = vec ( ) ;
305
316
for ( @t subty in subtys) {
@@ -364,23 +375,23 @@ fn type_is_nil(@t ty) -> bool {
364
375
365
376
fn type_is_structural( @t ty) -> bool {
366
377
alt ( ty. struct ) {
367
- case ( ty_tup( _) ) { ret true; }
368
- case ( ty_rec( _) ) { ret true; }
369
- case ( ty_tag( _) ) { ret true; }
370
- case ( ty_fn( _, _) ) { ret true; }
371
- case ( ty_obj( _) ) { ret true; }
372
- case ( _) { ret false; }
378
+ case ( ty_tup( _) ) { ret true; }
379
+ case ( ty_rec( _) ) { ret true; }
380
+ case ( ty_tag( _, _ ) ) { ret true; }
381
+ case ( ty_fn( _, _) ) { ret true; }
382
+ case ( ty_obj( _) ) { ret true; }
383
+ case ( _) { ret false; }
373
384
}
374
385
fail;
375
386
}
376
387
377
388
fn type_is_tup_like( @t ty) -> bool {
378
389
alt ( ty. struct ) {
379
- case ( ty_box( _) ) { ret true; }
380
- case ( ty_tup( _) ) { ret true; }
381
- case ( ty_rec( _) ) { ret true; }
382
- case ( ty_tag( _) ) { ret true; }
383
- case ( _) { ret false; }
390
+ case ( ty_box( _) ) { ret true; }
391
+ case ( ty_tup( _) ) { ret true; }
392
+ case ( ty_rec( _) ) { ret true; }
393
+ case ( ty_tag( _, _ ) ) { ret true; }
394
+ case ( _) { ret false; }
384
395
}
385
396
fail;
386
397
}
@@ -641,8 +652,13 @@ fn item_ty(@ast.item it) -> ty_params_and_ty {
641
652
result_ty = ann_to_type( ann) ;
642
653
}
643
654
case ( ast. item_tag( _, _, ?tps, ?did) ) {
655
+ // Create a new generic polytype.
644
656
ty_params = tps;
645
- result_ty = plain_ty( ty_tag( did) ) ;
657
+ let vec[ @t] subtys = vec( ) ;
658
+ for ( ast. ty_param tp in tps) {
659
+ subtys += vec( plain_ty( ty_param( tp. id) ) ) ;
660
+ }
661
+ result_ty = plain_ty( ty_tag( did, subtys) ) ;
646
662
}
647
663
case ( ast. item_obj( _, _, ?tps, _, ?ann) ) {
648
664
ty_params = tps;
@@ -1001,13 +1017,42 @@ fn unify(@ty.t expected, @ty.t actual, &unify_handler handler)
1001
1017
case ( ty. ty_type) { ret struct_cmp( expected, actual) ; }
1002
1018
case ( ty. ty_native) { ret struct_cmp( expected, actual) ; }
1003
1019
1004
- case ( ty. ty_tag( ?expected_id) ) {
1020
+ case ( ty. ty_tag( ?expected_id, ?expected_tps ) ) {
1005
1021
alt ( actual. struct ) {
1006
- case ( ty. ty_tag( ?actual_id) ) {
1007
- if ( expected_id. _0 == actual_id. _0 &&
1008
- expected_id. _1 == actual_id. _1) {
1009
- ret ures_ok( expected) ;
1022
+ case ( ty. ty_tag( ?actual_id, ?actual_tps) ) {
1023
+ if ( expected_id. _0 != actual_id. _0 ||
1024
+ expected_id. _1 != actual_id. _1) {
1025
+ ret ures_err( terr_mismatch, expected, actual) ;
1026
+ }
1027
+
1028
+ // TODO: factor this cruft out, see the TODO in the
1029
+ // ty.ty_tup case
1030
+ let vec[ @ty. t] result_tps = vec( ) ;
1031
+ auto i = 0 u;
1032
+ auto expected_len = _vec. len[ @ty. t] ( expected_tps) ;
1033
+ while ( i < expected_len) {
1034
+ auto expected_tp = expected_tps. ( i) ;
1035
+ auto actual_tp = actual_tps. ( i) ;
1036
+
1037
+ auto result = unify_step( bindings,
1038
+ expected_tp,
1039
+ actual_tp,
1040
+ handler) ;
1041
+
1042
+ alt ( result) {
1043
+ case ( ures_ok( ?rty) ) {
1044
+ append[ @ty. t] ( result_tps, rty) ;
1045
+ }
1046
+ case ( _) {
1047
+ ret result;
1048
+ }
1049
+ }
1050
+
1051
+ i += 1 u;
1010
1052
}
1053
+
1054
+ ret ures_ok( plain_ty( ty. ty_tag( expected_id,
1055
+ result_tps) ) ) ;
1011
1056
}
1012
1057
case ( _) { /* fall through */ }
1013
1058
}
0 commit comments