@@ -18,7 +18,7 @@ use self::Family::*;
18
18
use back:: svh:: Svh ;
19
19
use metadata:: cstore:: crate_metadata;
20
20
use metadata:: common:: * ;
21
- use metadata:: csearch:: MethodInfo ;
21
+ use metadata:: csearch:: { FieldInfo , MethodInfo } ;
22
22
use metadata:: csearch;
23
23
use metadata:: cstore;
24
24
use metadata:: tydecode:: { parse_ty_data, parse_region_data, parse_def_id,
@@ -727,72 +727,6 @@ pub fn maybe_get_item_ast<'tcx>(cdata: Cmd, tcx: &ty::ctxt<'tcx>, id: ast::NodeI
727
727
}
728
728
}
729
729
730
- pub fn get_enum_variant_defs ( intr : & IdentInterner ,
731
- cdata : Cmd ,
732
- id : ast:: NodeId )
733
- -> Vec < ( def:: Def , ast:: Name , ast:: Visibility ) > {
734
- let data = cdata. data ( ) ;
735
- let items = reader:: get_doc ( rbml:: Doc :: new ( data) , tag_items) ;
736
- let item = find_item ( id, items) ;
737
- enum_variant_ids ( item, cdata) . iter ( ) . map ( |did| {
738
- let item = find_item ( did. node , items) ;
739
- let name = item_name ( intr, item) ;
740
- let visibility = item_visibility ( item) ;
741
- match item_to_def_like ( item, * did, cdata. cnum ) {
742
- DlDef ( def @ def:: DefVariant ( ..) ) => ( def, name, visibility) ,
743
- _ => unreachable ! ( )
744
- }
745
- } ) . collect ( )
746
- }
747
-
748
- pub fn get_enum_variants < ' tcx > ( intr : Rc < IdentInterner > , cdata : Cmd , id : ast:: NodeId ,
749
- tcx : & ty:: ctxt < ' tcx > ) -> Vec < Rc < ty:: VariantInfo < ' tcx > > > {
750
- let data = cdata. data ( ) ;
751
- let items = reader:: get_doc ( rbml:: Doc :: new ( data) , tag_items) ;
752
- let item = find_item ( id, items) ;
753
- let mut disr_val = 0 ;
754
- enum_variant_ids ( item, cdata) . iter ( ) . map ( |did| {
755
- let item = find_item ( did. node , items) ;
756
- let ctor_ty = item_type ( ast:: DefId { krate : cdata. cnum , node : id} ,
757
- item, tcx, cdata) ;
758
- let name = item_name ( & * intr, item) ;
759
- let ( ctor_ty, arg_tys, arg_names) = match ctor_ty. sty {
760
- ty:: ty_bare_fn( _, ref f) =>
761
- ( Some ( ctor_ty) , f. sig . 0 . inputs . clone ( ) , None ) ,
762
- _ => { // Nullary or struct enum variant.
763
- let mut arg_names = Vec :: new ( ) ;
764
- let arg_tys = get_struct_fields ( intr. clone ( ) , cdata, did. node )
765
- . iter ( )
766
- . map ( |field_ty| {
767
- arg_names. push ( ast:: Ident :: new ( field_ty. name ) ) ;
768
- get_type ( cdata, field_ty. id . node , tcx) . ty
769
- } )
770
- . collect ( ) ;
771
- let arg_names = if arg_names. len ( ) == 0 { None } else { Some ( arg_names) } ;
772
-
773
- ( None , arg_tys, arg_names)
774
- }
775
- } ;
776
- match variant_disr_val ( item) {
777
- Some ( val) => { disr_val = val; }
778
- _ => { /* empty */ }
779
- }
780
- let old_disr_val = disr_val;
781
- disr_val += 1 ;
782
- Rc :: new ( ty:: VariantInfo {
783
- args : arg_tys,
784
- arg_names : arg_names,
785
- ctor_ty : ctor_ty,
786
- name : name,
787
- // I'm not even sure if we encode visibility
788
- // for variants -- TEST -- tjc
789
- id : * did,
790
- disr_val : old_disr_val,
791
- vis : ast:: Inherited
792
- } )
793
- } ) . collect ( )
794
- }
795
-
796
730
fn get_explicit_self ( item : rbml:: Doc ) -> ty:: ExplicitSelfCategory {
797
731
fn get_mutability ( ch : u8 ) -> ast:: Mutability {
798
732
match ch as char {
@@ -1089,40 +1023,166 @@ fn struct_field_family_to_visibility(family: Family) -> ast::Visibility {
1089
1023
}
1090
1024
}
1091
1025
1092
- pub fn get_struct_fields ( intr : Rc < IdentInterner > , cdata : Cmd , id : ast :: NodeId )
1093
- -> Vec < ty:: field_ty > {
1026
+ pub fn get_datatype_def < ' tcx > ( tcx : & ty :: ctxt < ' tcx > , intr : Rc < IdentInterner > ,
1027
+ cdata : Cmd , id : ast :: NodeId ) -> & ' tcx ty:: DatatypeDef < ' tcx > {
1094
1028
let data = cdata. data ( ) ;
1095
1029
let item = lookup_item ( id, data) ;
1096
- let mut result = Vec :: new ( ) ;
1030
+
1031
+ let family = item_family ( item) ;
1032
+ match family {
1033
+ Enum => get_enum_datatype_def ( tcx, & * intr, cdata, id) ,
1034
+ Struct => get_struct_datatype_def ( tcx, & * intr, cdata, id) ,
1035
+ _ => tcx. sess . bug ( "Non data-type item family in get_datatype_def" )
1036
+ }
1037
+ }
1038
+
1039
+ fn get_struct_datatype_def < ' tcx > ( tcx : & ty:: ctxt < ' tcx > , intr : & IdentInterner ,
1040
+ cdata : Cmd , id : ast:: NodeId ) -> & ' tcx ty:: DatatypeDef < ' tcx > {
1041
+ let data = cdata. data ( ) ;
1042
+ let item = lookup_item ( id, data) ;
1043
+
1044
+ let name = item_name ( intr, item) ;
1045
+ let def_id = item_def_id ( item, cdata) ;
1046
+
1047
+ let fields = get_variant_fields ( tcx, intr, cdata, item) ;
1048
+ let def = tcx. mk_datatype_def ( ty:: DatatypeDef {
1049
+ def_id : def_id,
1050
+ variants : vec ! [ ty:: VariantDef {
1051
+ id: def_id,
1052
+ name: name,
1053
+ disr_val: 0 ,
1054
+ fields: fields,
1055
+ vis: ast:: Public ,
1056
+ } ]
1057
+ } ) ;
1058
+
1059
+ tcx. datatype_defs . borrow_mut ( ) . insert ( def_id, def) ;
1060
+
1061
+ for fld in def. variants . iter ( ) . flat_map ( |v| v. fields . iter ( ) ) {
1062
+ // FIXME(aatch) I shouldn't have to use get_type here, but using item_type seems
1063
+ // to break things (Like cause infinite recursion in trans)
1064
+ let ty = get_type ( cdata, fld. id . node , tcx) . ty ;
1065
+ fld. set_ty ( ty) ;
1066
+ }
1067
+
1068
+ def
1069
+ }
1070
+
1071
+ fn get_enum_datatype_def < ' tcx > ( tcx : & ty:: ctxt < ' tcx > , intr : & IdentInterner ,
1072
+ cdata : Cmd , id : ast:: NodeId ) -> & ' tcx ty:: DatatypeDef < ' tcx > {
1073
+ let data = cdata. data ( ) ;
1074
+ let item = lookup_item ( id, data) ;
1075
+
1076
+ let def_id = item_def_id ( item, cdata) ;
1077
+
1078
+ let variants_doc = reader:: get_doc ( rbml:: Doc :: new ( data) , tag_items) ;
1079
+
1080
+ let mut disr_val = 0 ;
1081
+ let variants = enum_variant_ids ( item, cdata) . iter ( ) . map ( |did| {
1082
+ let item = find_item ( did. node , variants_doc) ;
1083
+ let vname = item_name ( intr, item) ;
1084
+ match variant_disr_val ( item) {
1085
+ Some ( val) => { disr_val = val; }
1086
+ _ => { }
1087
+ }
1088
+
1089
+ let fields = get_variant_fields ( tcx, intr, cdata, item) ;
1090
+
1091
+ ty:: VariantDef {
1092
+ id : * did,
1093
+ name : vname,
1094
+ disr_val : disr_val,
1095
+ fields : fields,
1096
+ vis : ast:: Public ,
1097
+ }
1098
+ } ) . collect ( ) ;
1099
+
1100
+ let def = tcx. mk_datatype_def ( ty:: DatatypeDef {
1101
+ def_id : def_id,
1102
+ variants : variants,
1103
+ } ) ;
1104
+
1105
+ tcx. datatype_defs . borrow_mut ( ) . insert ( def_id, def) ;
1106
+ for fld in def. variants . iter ( ) . flat_map ( |v| v. fields . iter ( ) ) {
1107
+ // FIXME(aatch) I shouldn't have to use get_type here, but using item_type seems
1108
+ // to break things (Like cause infinite recursion in trans)
1109
+ let ty = get_type ( cdata, fld. id . node , tcx) . ty ;
1110
+ fld. set_ty ( ty) ;
1111
+ }
1112
+
1113
+ def
1114
+ }
1115
+
1116
+ fn get_variant_fields < ' tcx > ( tcx : & ty:: ctxt < ' tcx > , intr : & IdentInterner , cdata : Cmd ,
1117
+ item : rbml:: Doc ) -> Vec < ty:: FieldTy < ' tcx > > {
1118
+
1119
+ let mut fields = Vec :: new ( ) ;
1097
1120
reader:: tagged_docs ( item, tag_item_field, |an_item| {
1098
1121
let f = item_family ( an_item) ;
1099
- if f == PublicField || f == InheritedField {
1100
- let name = item_name ( & * intr, an_item) ;
1101
- let did = item_def_id ( an_item, cdata) ;
1102
- let tagdoc = reader:: get_doc ( an_item, tag_item_field_origin) ;
1103
- let origin_id = translate_def_id ( cdata, reader:: with_doc_data ( tagdoc, parse_def_id) ) ;
1104
- result. push ( ty:: field_ty {
1105
- name : name,
1106
- id : did,
1107
- vis : struct_field_family_to_visibility ( f) ,
1108
- origin : origin_id,
1109
- } ) ;
1110
- }
1122
+ let name = item_name ( intr, an_item) ;
1123
+ let did = item_def_id ( an_item, cdata) ;
1124
+
1125
+ let tagdoc = reader:: get_doc ( an_item, tag_item_field_origin) ;
1126
+ let origin_id = translate_def_id ( cdata, reader:: with_doc_data ( tagdoc, parse_def_id) ) ;
1127
+ let fld = ty:: FieldTy :: new ( tcx, did, name,
1128
+ struct_field_family_to_visibility ( f) ,
1129
+ origin_id) ;
1130
+ fields. push ( fld) ;
1111
1131
true
1112
1132
} ) ;
1133
+
1113
1134
reader:: tagged_docs ( item, tag_item_unnamed_field, |an_item| {
1114
1135
let did = item_def_id ( an_item, cdata) ;
1115
1136
let tagdoc = reader:: get_doc ( an_item, tag_item_field_origin) ;
1116
1137
let f = item_family ( an_item) ;
1117
1138
let origin_id = translate_def_id ( cdata, reader:: with_doc_data ( tagdoc, parse_def_id) ) ;
1118
- result. push ( ty:: field_ty {
1139
+ let fld = ty:: FieldTy :: new ( tcx, did, special_idents:: unnamed_field. name ,
1140
+ struct_field_family_to_visibility ( f) ,
1141
+ origin_id) ;
1142
+ fields. push ( fld) ;
1143
+ true
1144
+ } ) ;
1145
+
1146
+ return fields;
1147
+ }
1148
+
1149
+ pub fn get_struct_fields ( intr : Rc < IdentInterner > ,
1150
+ cdata : Cmd , id : ast:: NodeId ) -> Vec < FieldInfo > {
1151
+ let data = cdata. data ( ) ;
1152
+ let item = lookup_item ( id, data) ;
1153
+ let mut result = Vec :: new ( ) ;
1154
+ reader:: tagged_docs ( item, tag_item_field, |an_item| {
1155
+ let f = item_family ( an_item) ;
1156
+ let name = item_name ( & * intr, an_item) ;
1157
+ let did = item_def_id ( an_item, cdata) ;
1158
+
1159
+ let tagdoc = reader:: get_doc ( an_item, tag_item_field_origin) ;
1160
+ let origin_id = translate_def_id ( cdata, reader:: with_doc_data ( tagdoc, parse_def_id) ) ;
1161
+
1162
+ result. push ( FieldInfo {
1163
+ name : name,
1164
+ def_id : did,
1165
+ vis : struct_field_family_to_visibility ( f) ,
1166
+ origin : origin_id,
1167
+ } ) ;
1168
+ true
1169
+ } ) ;
1170
+ reader:: tagged_docs ( item, tag_item_unnamed_field, |an_item| {
1171
+ let did = item_def_id ( an_item, cdata) ;
1172
+ let f = item_family ( an_item) ;
1173
+
1174
+ let tagdoc = reader:: get_doc ( an_item, tag_item_field_origin) ;
1175
+ let origin_id = translate_def_id ( cdata, reader:: with_doc_data ( tagdoc, parse_def_id) ) ;
1176
+
1177
+ result. push ( FieldInfo {
1119
1178
name : special_idents:: unnamed_field. name ,
1120
- id : did,
1179
+ def_id : did,
1121
1180
vis : struct_field_family_to_visibility ( f) ,
1122
1181
origin : origin_id,
1123
1182
} ) ;
1124
1183
true
1125
1184
} ) ;
1185
+
1126
1186
result
1127
1187
}
1128
1188
0 commit comments