@@ -26,7 +26,6 @@ use ra_ap_hir_ty::Ty;
2626use ra_ap_hir_ty:: TyExt ;
2727use ra_ap_hir_ty:: TyLoweringContext ;
2828use ra_ap_hir_ty:: WhereClause ;
29- use ra_ap_hir_ty:: db:: InternedCallableDefId ;
3029use ra_ap_hir_ty:: from_assoc_type_id;
3130use ra_ap_hir_ty:: { Binders , FnPointer } ;
3231use ra_ap_hir_ty:: { Interner , ProjectionTy } ;
@@ -347,8 +346,61 @@ fn emit_function(
347346 function : ra_ap_hir_def:: FunctionId ,
348347 visibility : Visibility ,
349348) -> Option < trap:: Label < generated:: Item > > {
350- db. value_ty ( function. into ( ) )
351- . map ( |type_| const_or_function ( db, name, trap, type_, visibility) )
349+ let name = Some ( trap. emit ( generated:: Name {
350+ id : trap:: TrapId :: Star ,
351+ text : Some ( name. to_owned ( ) ) ,
352+ } ) ) ;
353+ let visibility = emit_visibility ( db, trap, visibility) ;
354+ let generic_param_list = emit_generic_param_list ( trap, db, function. into ( ) ) ;
355+ let data = db. function_data ( function) ;
356+ let sig = db. callable_item_signature ( function. into ( ) ) ;
357+ let sig = sig. skip_binders ( ) ;
358+ let params = sig
359+ . params ( )
360+ . iter ( )
361+ . map ( |p| {
362+ let type_repr = emit_hir_ty ( trap, db, p) ;
363+ trap. emit ( generated:: Param {
364+ id : trap:: TrapId :: Star ,
365+ attrs : vec ! [ ] ,
366+ type_repr,
367+ pat : None ,
368+ } )
369+ } )
370+ . collect ( ) ;
371+
372+ let ret_type = emit_hir_ty ( trap, db, sig. ret ( ) ) ;
373+ let param_list = trap. emit ( generated:: ParamList {
374+ id : trap:: TrapId :: Star ,
375+ params,
376+ self_param : None ,
377+ } ) ;
378+ let ret_type = ret_type. map ( |ret_type| {
379+ trap. emit ( generated:: RetTypeRepr {
380+ id : trap:: TrapId :: Star ,
381+ type_repr : Some ( ret_type) ,
382+ } )
383+ } ) ;
384+ Some (
385+ trap. emit ( generated:: Function {
386+ id : trap:: TrapId :: Star ,
387+ name,
388+ attrs : vec ! [ ] ,
389+ body : None ,
390+ is_const : data. is_const ( ) ,
391+ is_default : data. is_default ( ) ,
392+ visibility,
393+ abi : None ,
394+ is_async : data. is_async ( ) ,
395+ is_gen : false ,
396+ is_unsafe : data. is_unsafe ( ) ,
397+ generic_param_list,
398+ param_list : Some ( param_list) ,
399+ ret_type,
400+ where_clause : None ,
401+ } )
402+ . into ( ) ,
403+ )
352404}
353405
354406fn emit_const (
@@ -838,96 +890,7 @@ fn emit_visibility(
838890 } )
839891 } )
840892}
841- fn const_or_function (
842- db : & dyn HirDatabase ,
843- name : & str ,
844- trap : & mut TrapFile ,
845- type_ : Binders < Ty > ,
846- visibility : Visibility ,
847- ) -> trap:: Label < generated:: Item > {
848- let type_: & chalk_ir:: Ty < Interner > = type_. skip_binders ( ) ;
849- match type_. kind ( ra_ap_hir_ty:: Interner ) {
850- chalk_ir:: TyKind :: FnDef ( fn_def_id, parameters) => {
851- let callable_def_id =
852- db. lookup_intern_callable_def ( InternedCallableDefId :: from ( * fn_def_id) ) ;
853- let data = db. fn_def_datum ( callable_def_id) ;
854- let sig = ra_ap_hir_ty:: CallableSig :: from_def ( db, * fn_def_id, parameters) ;
855- let params = sig
856- . params ( )
857- . iter ( )
858- . map ( |p| {
859- let type_repr = emit_hir_ty ( trap, db, p) ;
860- trap. emit ( generated:: Param {
861- id : trap:: TrapId :: Star ,
862- attrs : vec ! [ ] ,
863- type_repr,
864- pat : None ,
865- } )
866- } )
867- . collect ( ) ;
868893
869- let ret_type = emit_hir_ty ( trap, db, sig. ret ( ) ) ;
870- let param_list = trap. emit ( generated:: ParamList {
871- id : trap:: TrapId :: Star ,
872- params,
873- self_param : None ,
874- } ) ;
875- let ret_type = ret_type. map ( |ret_type| {
876- trap. emit ( generated:: RetTypeRepr {
877- id : trap:: TrapId :: Star ,
878- type_repr : Some ( ret_type) ,
879- } )
880- } ) ;
881- let name = Some ( trap. emit ( generated:: Name {
882- id : trap:: TrapId :: Star ,
883- text : Some ( name. to_owned ( ) ) ,
884- } ) ) ;
885- let visibility = emit_visibility ( db, trap, visibility) ;
886- let callable_def_id = db. lookup_intern_callable_def ( ( * fn_def_id) . into ( ) ) ;
887- let generic_def_id = GenericDefId :: from_callable ( db. upcast ( ) , callable_def_id) ;
888- let generic_param_list: Option < trap:: Label < generated:: GenericParamList > > =
889- emit_generic_param_list ( trap, db, generic_def_id) ;
890-
891- trap. emit ( generated:: Function {
892- id : trap:: TrapId :: Star ,
893- name,
894- attrs : vec ! [ ] ,
895- body : None ,
896- is_const : false ,
897- is_default : false ,
898- visibility,
899- abi : None ,
900- is_async : false ,
901- is_gen : false ,
902- is_unsafe : matches ! ( data. sig. safety, Safety :: Unsafe ) ,
903- generic_param_list,
904- param_list : Some ( param_list) ,
905- ret_type,
906- where_clause : None ,
907- } )
908- . into ( )
909- }
910- _ => {
911- let type_repr = emit_hir_ty ( trap, db, type_) ;
912- let name = Some ( trap. emit ( generated:: Name {
913- id : trap:: TrapId :: Star ,
914- text : Some ( name. to_owned ( ) ) ,
915- } ) ) ;
916- let visibility = emit_visibility ( db, trap, visibility) ;
917- trap. emit ( generated:: Const {
918- id : trap:: TrapId :: Star ,
919- name,
920- attrs : vec ! [ ] ,
921- body : None ,
922- is_const : false ,
923- is_default : false ,
924- type_repr,
925- visibility,
926- } )
927- . into ( )
928- }
929- }
930- }
931894fn emit_hir_type_bound (
932895 db : & dyn HirDatabase ,
933896 trap : & mut TrapFile ,
0 commit comments