@@ -8,7 +8,7 @@ use std::{
88} ;
99
1010use base_db:: CrateId ;
11- use chalk_ir:: { BoundVar , TyKind } ;
11+ use chalk_ir:: { BoundVar , Safety , TyKind } ;
1212use hir_def:: {
1313 data:: adt:: VariantData ,
1414 db:: DefDatabase ,
@@ -41,7 +41,7 @@ use crate::{
4141 primitive, to_assoc_type_id,
4242 utils:: { self , detect_variant_from_bytes, generics, ClosureSubst } ,
4343 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 ,
4545 MemoryMap , Mutability , OpaqueTy , ProjectionTy , ProjectionTyExt , QuantifiedWhereClause , Scalar ,
4646 Substitution , TraitEnvironment , TraitRef , TraitRefExt , Ty , TyExt , WhereClause ,
4747} ;
@@ -879,16 +879,27 @@ impl HirDisplay for Ty {
879879 // function pointer type.
880880 return sig. hir_fmt ( f) ;
881881 }
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+ }
882890
883- f. start_location_link ( def. into ( ) ) ;
884891 match def {
885892 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( ) ) ) ?
887896 }
888897 CallableDefId :: StructId ( s) => {
898+ f. start_location_link ( def. into ( ) ) ;
889899 write ! ( f, "{}" , db. struct_data( s) . name. display( f. db. upcast( ) ) ) ?
890900 }
891901 CallableDefId :: EnumVariantId ( e) => {
902+ f. start_location_link ( def. into ( ) ) ;
892903 write ! ( f, "{}" , db. enum_variant_data( e) . name. display( f. db. upcast( ) ) ) ?
893904 }
894905 } ;
@@ -1316,9 +1327,19 @@ fn hir_fmt_generics(
13161327
13171328impl HirDisplay for CallableSig {
13181329 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+ // }
13191340 write ! ( f, "fn(" ) ?;
13201341 f. write_joined ( self . params ( ) , ", " ) ?;
1321- if self . is_varargs {
1342+ if is_varargs {
13221343 if self . params ( ) . is_empty ( ) {
13231344 write ! ( f, "..." ) ?;
13241345 } else {
@@ -1683,11 +1704,15 @@ impl HirDisplay for TypeRef {
16831704 inner. hir_fmt ( f) ?;
16841705 write ! ( f, "]" ) ?;
16851706 }
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) => {
16881708 if is_unsafe {
16891709 write ! ( f, "unsafe " ) ?;
16901710 }
1711+ if let Some ( abi) = abi {
1712+ f. write_str ( "extern \" " ) ?;
1713+ f. write_str ( abi) ?;
1714+ f. write_str ( "\" " ) ?;
1715+ }
16911716 write ! ( f, "fn(" ) ?;
16921717 if let Some ( ( ( _, return_type) , function_parameters) ) = parameters. split_last ( ) {
16931718 for index in 0 ..function_parameters. len ( ) {
0 commit comments