@@ -8,7 +8,7 @@ use std::{
8
8
} ;
9
9
10
10
use base_db:: CrateId ;
11
- use chalk_ir:: { BoundVar , TyKind } ;
11
+ use chalk_ir:: { BoundVar , Safety , TyKind } ;
12
12
use hir_def:: {
13
13
data:: adt:: VariantData ,
14
14
db:: DefDatabase ,
@@ -41,7 +41,7 @@ use crate::{
41
41
primitive, to_assoc_type_id,
42
42
utils:: { self , detect_variant_from_bytes, generics, ClosureSubst } ,
43
43
AdtId , AliasEq , AliasTy , Binders , CallableDefId , CallableSig , Const , ConstScalar , ConstValue ,
44
- DomainGoal , GenericArg , ImplTraitId , Interner , Lifetime , LifetimeData , LifetimeOutlives ,
44
+ DomainGoal , FnAbi , GenericArg , ImplTraitId , Interner , Lifetime , LifetimeData , LifetimeOutlives ,
45
45
MemoryMap , Mutability , OpaqueTy , ProjectionTy , ProjectionTyExt , QuantifiedWhereClause , Scalar ,
46
46
Substitution , TraitEnvironment , TraitRef , TraitRefExt , Ty , TyExt , WhereClause ,
47
47
} ;
@@ -879,16 +879,27 @@ impl HirDisplay for Ty {
879
879
// function pointer type.
880
880
return sig. hir_fmt ( f) ;
881
881
}
882
+ if let Safety :: Unsafe = sig. safety {
883
+ write ! ( f, "unsafe " ) ?;
884
+ }
885
+ if !matches ! ( sig. abi, FnAbi :: Rust ) {
886
+ f. write_str ( "extern \" " ) ?;
887
+ f. write_str ( sig. abi . as_str ( ) ) ?;
888
+ f. write_str ( "\" " ) ?;
889
+ }
882
890
883
- f. start_location_link ( def. into ( ) ) ;
884
891
match def {
885
892
CallableDefId :: FunctionId ( ff) => {
886
- write ! ( f, "fn {}" , db. function_data( ff) . name. display( f. db. upcast( ) ) ) ?
893
+ write ! ( f, "fn " ) ?;
894
+ f. start_location_link ( def. into ( ) ) ;
895
+ write ! ( f, "{}" , db. function_data( ff) . name. display( f. db. upcast( ) ) ) ?
887
896
}
888
897
CallableDefId :: StructId ( s) => {
898
+ f. start_location_link ( def. into ( ) ) ;
889
899
write ! ( f, "{}" , db. struct_data( s) . name. display( f. db. upcast( ) ) ) ?
890
900
}
891
901
CallableDefId :: EnumVariantId ( e) => {
902
+ f. start_location_link ( def. into ( ) ) ;
892
903
write ! ( f, "{}" , db. enum_variant_data( e) . name. display( f. db. upcast( ) ) ) ?
893
904
}
894
905
} ;
@@ -1316,9 +1327,19 @@ fn hir_fmt_generics(
1316
1327
1317
1328
impl HirDisplay for CallableSig {
1318
1329
fn hir_fmt ( & self , f : & mut HirFormatter < ' _ > ) -> Result < ( ) , HirDisplayError > {
1330
+ let CallableSig { params_and_return : _, is_varargs, safety, abi : _ } = * self ;
1331
+ if let Safety :: Unsafe = safety {
1332
+ write ! ( f, "unsafe " ) ?;
1333
+ }
1334
+ // FIXME: Enable this when the FIXME on FnAbi regarding PartialEq is fixed.
1335
+ // if !matches!(abi, FnAbi::Rust) {
1336
+ // f.write_str("extern \"")?;
1337
+ // f.write_str(abi.as_str())?;
1338
+ // f.write_str("\" ")?;
1339
+ // }
1319
1340
write ! ( f, "fn(" ) ?;
1320
1341
f. write_joined ( self . params ( ) , ", " ) ?;
1321
- if self . is_varargs {
1342
+ if is_varargs {
1322
1343
if self . params ( ) . is_empty ( ) {
1323
1344
write ! ( f, "..." ) ?;
1324
1345
} else {
@@ -1683,11 +1704,15 @@ impl HirDisplay for TypeRef {
1683
1704
inner. hir_fmt ( f) ?;
1684
1705
write ! ( f, "]" ) ?;
1685
1706
}
1686
- & TypeRef :: Fn ( ref parameters, is_varargs, is_unsafe) => {
1687
- // FIXME: Function pointer qualifiers.
1707
+ & TypeRef :: Fn ( ref parameters, is_varargs, is_unsafe, ref abi) => {
1688
1708
if is_unsafe {
1689
1709
write ! ( f, "unsafe " ) ?;
1690
1710
}
1711
+ if let Some ( abi) = abi {
1712
+ f. write_str ( "extern \" " ) ?;
1713
+ f. write_str ( abi) ?;
1714
+ f. write_str ( "\" " ) ?;
1715
+ }
1691
1716
write ! ( f, "fn(" ) ?;
1692
1717
if let Some ( ( ( _, return_type) , function_parameters) ) = parameters. split_last ( ) {
1693
1718
for index in 0 ..function_parameters. len ( ) {
0 commit comments