@@ -18,6 +18,7 @@ use ra_ap_hir_def::{
18
18
} ;
19
19
use ra_ap_hir_def:: { HasModule , visibility:: VisibilityExplicitness } ;
20
20
use ra_ap_hir_def:: { ModuleId , resolver:: HasResolver } ;
21
+ use ra_ap_hir_ty:: GenericArg ;
21
22
use ra_ap_hir_ty:: TraitRefExt ;
22
23
use ra_ap_hir_ty:: Ty ;
23
24
use ra_ap_hir_ty:: TyExt ;
@@ -244,7 +245,7 @@ fn emit_reexport(
244
245
name,
245
246
} )
246
247
} ) ;
247
- let path = make_qualified_path ( trap, path_components) ;
248
+ let path = make_qualified_path ( trap, path_components, None ) ;
248
249
let use_tree = trap. emit ( generated:: UseTree {
249
250
id : trap:: TrapId :: Star ,
250
251
is_glob : false ,
@@ -638,15 +639,13 @@ fn emit_module_impls(
638
639
module. scope . impls ( ) . for_each ( |imp| {
639
640
let self_ty = db. impl_self_ty ( imp) ;
640
641
let self_ty = emit_hir_ty ( trap, db, self_ty. skip_binders ( ) ) ;
641
- let imp_data = db. impl_data ( imp) ;
642
- let trait_ = imp_data
643
- . target_trait
644
- . as_ref ( )
645
- . and_then ( |t| make_qualified_path ( trap, emit_hir_path ( & imp_data. types_map [ t. path ] ) ) ) ;
646
- let trait_ = trait_. map ( |trait_| {
642
+ let path = db
643
+ . impl_trait ( imp)
644
+ . map ( |trait_ref| trait_path ( db, trap, trait_ref. skip_binders ( ) ) ) ;
645
+ let trait_ = path. map ( |path| {
647
646
trap. emit ( generated:: PathTypeRepr {
648
647
id : trap:: TrapId :: Star ,
649
- path : Some ( trait_ ) ,
648
+ path,
650
649
} )
651
650
. into ( )
652
651
} ) ;
@@ -759,7 +758,7 @@ fn emit_visibility(
759
758
Visibility :: Module ( _, VisibilityExplicitness :: Implicit ) => None ,
760
759
} ;
761
760
path. map ( |path| {
762
- let path = make_qualified_path ( trap, path) ;
761
+ let path = make_qualified_path ( trap, path, None ) ;
763
762
trap. emit ( generated:: Visibility {
764
763
id : trap:: TrapId :: Star ,
765
764
path,
@@ -859,14 +858,7 @@ fn emit_hir_type_bound(
859
858
) -> Option < trap:: Label < generated:: TypeBound > > {
860
859
match type_bound. skip_binders ( ) {
861
860
WhereClause :: Implemented ( trait_ref) => {
862
- let mut path = make_path ( db, trait_ref. hir_trait_id ( ) ) ;
863
- path. push (
864
- db. trait_data ( trait_ref. hir_trait_id ( ) )
865
- . name
866
- . as_str ( )
867
- . to_owned ( ) ,
868
- ) ;
869
- let path = make_qualified_path ( trap, path) ;
861
+ let path = trait_path ( db, trap, trait_ref) ;
870
862
let type_repr = Some (
871
863
trap. emit ( generated:: PathTypeRepr {
872
864
id : trap:: TrapId :: Star ,
@@ -887,11 +879,22 @@ fn emit_hir_type_bound(
887
879
}
888
880
}
889
881
890
- fn emit_hir_path ( path : & ra_ap_hir_def:: path:: Path ) -> Vec < String > {
891
- path. segments ( )
892
- . iter ( )
893
- . map ( |x| x. name . as_str ( ) . to_owned ( ) )
894
- . collect ( )
882
+ fn trait_path (
883
+ db : & dyn HirDatabase ,
884
+ trap : & mut TrapFile ,
885
+ trait_ref : & chalk_ir:: TraitRef < Interner > ,
886
+ ) -> Option < trap:: Label < generated:: Path > > {
887
+ let mut path = make_path ( db, trait_ref. hir_trait_id ( ) ) ;
888
+ path. push (
889
+ db. trait_data ( trait_ref. hir_trait_id ( ) )
890
+ . name
891
+ . as_str ( )
892
+ . to_owned ( ) ,
893
+ ) ;
894
+ let generic_arg_list =
895
+ emit_generic_arg_list ( trap, db, & trait_ref. substitution . as_slice ( Interner ) [ 1 ..] ) ;
896
+ let path = make_qualified_path ( trap, path, generic_arg_list) ;
897
+ path
895
898
}
896
899
897
900
fn emit_hir_fn_ptr (
@@ -995,22 +998,25 @@ fn make_path_mod(db: &dyn DefDatabase, module: ModuleId) -> Vec<String> {
995
998
path. reverse ( ) ;
996
999
path
997
1000
}
1001
+
998
1002
fn make_qualified_path (
999
1003
trap : & mut TrapFile ,
1000
1004
path : Vec < String > ,
1005
+ generic_arg_list : Option < trap:: Label < generated:: GenericArgList > > ,
1001
1006
) -> Option < trap:: Label < generated:: Path > > {
1002
1007
fn qualified_path (
1003
1008
trap : & mut TrapFile ,
1004
1009
qualifier : Option < trap:: Label < generated:: Path > > ,
1005
1010
name : String ,
1011
+ generic_arg_list : Option < trap:: Label < generated:: GenericArgList > > ,
1006
1012
) -> trap:: Label < generated:: Path > {
1007
1013
let identifier = Some ( trap. emit ( generated:: NameRef {
1008
1014
id : trap:: TrapId :: Star ,
1009
1015
text : Some ( name) ,
1010
1016
} ) ) ;
1011
1017
let segment = Some ( trap. emit ( generated:: PathSegment {
1012
1018
id : trap:: TrapId :: Star ,
1013
- generic_arg_list : None ,
1019
+ generic_arg_list,
1014
1020
identifier,
1015
1021
parenthesized_arg_list : None ,
1016
1022
ret_type : None ,
@@ -1022,8 +1028,10 @@ fn make_qualified_path(
1022
1028
segment,
1023
1029
} )
1024
1030
}
1031
+ let args = std:: iter:: repeat_n ( None , & path. len ( ) - 1 ) . chain ( std:: iter:: once ( generic_arg_list) ) ;
1025
1032
path. into_iter ( )
1026
- . fold ( None , |q, p| Some ( qualified_path ( trap, q, p) ) )
1033
+ . zip ( args)
1034
+ . fold ( None , |q, ( p, a) | Some ( qualified_path ( trap, q, p, a) ) )
1027
1035
}
1028
1036
fn emit_hir_ty (
1029
1037
trap : & mut TrapFile ,
@@ -1109,7 +1117,7 @@ fn emit_hir_ty(
1109
1117
)
1110
1118
}
1111
1119
1112
- chalk_ir:: TyKind :: Adt ( adt_id, _substitution ) => {
1120
+ chalk_ir:: TyKind :: Adt ( adt_id, substitution ) => {
1113
1121
let mut path = make_path ( db, adt_id. 0 ) ;
1114
1122
let name = match adt_id. 0 {
1115
1123
ra_ap_hir_def:: AdtId :: StructId ( struct_id) => {
@@ -1123,7 +1131,8 @@ fn emit_hir_ty(
1123
1131
}
1124
1132
} ;
1125
1133
path. push ( name) ;
1126
- let path = make_qualified_path ( trap, path) ;
1134
+ let generic_arg_list = emit_generic_arg_list ( trap, db, substitution. as_slice ( Interner ) ) ;
1135
+ let path = make_qualified_path ( trap, path, generic_arg_list) ;
1127
1136
Some (
1128
1137
trap. emit ( generated:: PathTypeRepr {
1129
1138
id : trap:: TrapId :: Star ,
@@ -1133,7 +1142,7 @@ fn emit_hir_ty(
1133
1142
)
1134
1143
}
1135
1144
chalk_ir:: TyKind :: Scalar ( scalar) => {
1136
- let path = make_qualified_path ( trap, vec ! [ scalar_to_str( scalar) . to_owned( ) ] ) ;
1145
+ let path = make_qualified_path ( trap, vec ! [ scalar_to_str( scalar) . to_owned( ) ] , None ) ;
1137
1146
Some (
1138
1147
trap. emit ( generated:: PathTypeRepr {
1139
1148
id : trap:: TrapId :: Star ,
@@ -1143,7 +1152,7 @@ fn emit_hir_ty(
1143
1152
)
1144
1153
}
1145
1154
chalk_ir:: TyKind :: Str => {
1146
- let path = make_qualified_path ( trap, vec ! [ "str" . to_owned( ) ] ) ;
1155
+ let path = make_qualified_path ( trap, vec ! [ "str" . to_owned( ) ] , None ) ;
1147
1156
Some (
1148
1157
trap. emit ( generated:: PathTypeRepr {
1149
1158
id : trap:: TrapId :: Star ,
@@ -1234,7 +1243,7 @@ fn emit_hir_ty(
1234
1243
}
1235
1244
chalk_ir:: TyKind :: BoundVar ( var) => {
1236
1245
let var = format ! ( "T_{}_{}" , var. debruijn. depth( ) , var. index) ;
1237
- let path = make_qualified_path ( trap, vec ! [ var] ) ;
1246
+ let path = make_qualified_path ( trap, vec ! [ var] , None ) ;
1238
1247
Some (
1239
1248
trap. emit ( generated:: PathTypeRepr {
1240
1249
id : trap:: TrapId :: Star ,
@@ -1255,6 +1264,66 @@ fn emit_hir_ty(
1255
1264
}
1256
1265
}
1257
1266
1267
+ fn emit_generic_arg_list (
1268
+ trap : & mut TrapFile ,
1269
+ db : & dyn HirDatabase ,
1270
+ args : & [ GenericArg ] ,
1271
+ ) -> Option < trap:: Label < generated:: GenericArgList > > {
1272
+ if args. is_empty ( ) {
1273
+ return None ;
1274
+ }
1275
+ let generic_args = args
1276
+ . iter ( )
1277
+ . flat_map ( |arg| {
1278
+ if let Some ( ty) = arg. ty ( Interner ) {
1279
+ let type_repr = emit_hir_ty ( trap, db, ty) ;
1280
+ Some (
1281
+ trap. emit ( generated:: TypeArg {
1282
+ id : trap:: TrapId :: Star ,
1283
+ type_repr,
1284
+ } )
1285
+ . into ( ) ,
1286
+ )
1287
+ } else if let Some ( l) = arg. lifetime ( Interner ) {
1288
+ let text = match l. data ( Interner ) {
1289
+ chalk_ir:: LifetimeData :: BoundVar ( var) => {
1290
+ format ! ( "'T_{}_{}" , var. debruijn. depth( ) , var. index) . into ( )
1291
+ }
1292
+ chalk_ir:: LifetimeData :: Static => "'static'" . to_owned ( ) . into ( ) ,
1293
+ _ => None ,
1294
+ } ;
1295
+ let lifetime = trap. emit ( generated:: Lifetime {
1296
+ id : trap:: TrapId :: Star ,
1297
+ text,
1298
+ } ) ;
1299
+ Some (
1300
+ trap. emit ( generated:: LifetimeArg {
1301
+ id : trap:: TrapId :: Star ,
1302
+ lifetime : Some ( lifetime) ,
1303
+ } )
1304
+ . into ( ) ,
1305
+ )
1306
+ } else if let Some ( _) = arg. constant ( Interner ) {
1307
+ Some (
1308
+ trap. emit ( generated:: ConstArg {
1309
+ id : trap:: TrapId :: Star ,
1310
+ expr : None ,
1311
+ } )
1312
+ . into ( ) ,
1313
+ )
1314
+ } else {
1315
+ None
1316
+ }
1317
+ } )
1318
+ . collect ( ) ;
1319
+
1320
+ trap. emit ( generated:: GenericArgList {
1321
+ id : trap:: TrapId :: Star ,
1322
+ generic_args,
1323
+ } )
1324
+ . into ( )
1325
+ }
1326
+
1258
1327
enum Variant {
1259
1328
Unit ,
1260
1329
Record ( trap:: Label < generated:: StructFieldList > ) ,
0 commit comments