@@ -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,18 @@ 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+ if !matches ! ( abi, FnAbi :: Rust ) {
1335+ f. write_str ( "extern \" " ) ?;
1336+ f. write_str ( abi. as_str ( ) ) ?;
1337+ f. write_str ( "\" " ) ?;
1338+ }
13191339 write ! ( f, "fn(" ) ?;
13201340 f. write_joined ( self . params ( ) , ", " ) ?;
1321- if self . is_varargs {
1341+ if is_varargs {
13221342 if self . params ( ) . is_empty ( ) {
13231343 write ! ( f, "..." ) ?;
13241344 } else {
@@ -1683,11 +1703,15 @@ impl HirDisplay for TypeRef {
16831703 inner. hir_fmt ( f) ?;
16841704 write ! ( f, "]" ) ?;
16851705 }
1686- & TypeRef :: Fn ( ref parameters, is_varargs, is_unsafe) => {
1687- // FIXME: Function pointer qualifiers.
1706+ & TypeRef :: Fn ( ref parameters, is_varargs, is_unsafe, ref abi) => {
16881707 if is_unsafe {
16891708 write ! ( f, "unsafe " ) ?;
16901709 }
1710+ if let Some ( abi) = abi {
1711+ f. write_str ( "extern \" " ) ?;
1712+ f. write_str ( abi) ?;
1713+ f. write_str ( "\" " ) ?;
1714+ }
16911715 write ! ( f, "fn(" ) ?;
16921716 if let Some ( ( ( _, return_type) , function_parameters) ) = parameters. split_last ( ) {
16931717 for index in 0 ..function_parameters. len ( ) {
0 commit comments