@@ -11,17 +11,20 @@ use ra_ap_base_db::{Crate, RootQueryDb};
11
11
use ra_ap_cfg:: CfgAtom ;
12
12
use ra_ap_hir:: { DefMap , ModuleDefId , PathKind , db:: HirDatabase } ;
13
13
use ra_ap_hir:: { VariantId , Visibility , db:: DefDatabase } ;
14
+ use ra_ap_hir_def:: GenericDefId ;
14
15
use ra_ap_hir_def:: Lookup ;
15
16
use ra_ap_hir_def:: {
16
- AssocItemId , LocalModuleId , data:: adt:: VariantData , item_scope:: ImportOrGlob ,
17
- item_tree:: ImportKind , nameres:: ModuleData , path:: ImportAlias ,
17
+ AssocItemId , ConstParamId , LocalModuleId , TypeOrConstParamId , data:: adt:: VariantData ,
18
+ generics:: TypeOrConstParamData , item_scope:: ImportOrGlob , item_tree:: ImportKind ,
19
+ nameres:: ModuleData , path:: ImportAlias ,
18
20
} ;
19
21
use ra_ap_hir_def:: { HasModule , visibility:: VisibilityExplicitness } ;
20
22
use ra_ap_hir_def:: { ModuleId , resolver:: HasResolver } ;
21
23
use ra_ap_hir_ty:: GenericArg ;
22
24
use ra_ap_hir_ty:: TraitRefExt ;
23
25
use ra_ap_hir_ty:: Ty ;
24
26
use ra_ap_hir_ty:: TyExt ;
27
+ use ra_ap_hir_ty:: TyLoweringContext ;
25
28
use ra_ap_hir_ty:: WhereClause ;
26
29
use ra_ap_hir_ty:: db:: InternedCallableDefId ;
27
30
use ra_ap_hir_ty:: from_assoc_type_id;
@@ -432,7 +435,98 @@ fn emit_enum_variant(
432
435
}
433
436
items
434
437
}
438
+ fn emit_generic_param_list (
439
+ trap : & mut TrapFile ,
440
+ db : & dyn HirDatabase ,
441
+ def : GenericDefId ,
442
+ ) -> Option < trap:: Label < generated:: GenericParamList > > {
443
+ let params = db. generic_params ( def) ;
444
+ let trait_self_param = params. trait_self_param ( ) ;
445
+ if params. is_empty ( ) || params. len ( ) == 1 && trait_self_param. is_some ( ) {
446
+ return None ;
447
+ }
448
+ let mut generic_params = Vec :: new ( ) ;
449
+ generic_params. extend ( params. iter_lt ( ) . map (
450
+ |( _, param) | -> trap:: Label < generated:: GenericParam > {
451
+ let lifetime = trap
452
+ . emit ( generated:: Lifetime {
453
+ id : trap:: TrapId :: Star ,
454
+ text : Some ( param. name . as_str ( ) . to_owned ( ) ) ,
455
+ } )
456
+ . into ( ) ;
435
457
458
+ trap. emit ( generated:: LifetimeParam {
459
+ id : trap:: TrapId :: Star ,
460
+ attrs : vec ! [ ] ,
461
+ lifetime,
462
+ type_bound_list : None ,
463
+ } )
464
+ . into ( )
465
+ } ,
466
+ ) ) ;
467
+ generic_params. extend (
468
+ params
469
+ . iter_type_or_consts ( )
470
+ . filter ( |( id, _) | trait_self_param != Some ( * id) )
471
+ . map (
472
+ |( param_id, param) | -> trap:: Label < generated:: GenericParam > {
473
+ match param {
474
+ TypeOrConstParamData :: TypeParamData ( param) => {
475
+ let name = Some ( trap. emit ( generated:: Name {
476
+ id : trap:: TrapId :: Star ,
477
+ text : param. name . as_ref ( ) . map ( |name| name. as_str ( ) . to_owned ( ) ) ,
478
+ } ) ) ;
479
+ let resolver = def. resolver ( db. upcast ( ) ) ;
480
+ let mut ctx = TyLoweringContext :: new (
481
+ db,
482
+ & resolver,
483
+ & params. types_map ,
484
+ def. into ( ) ,
485
+ ) ;
486
+
487
+ let default_type = param
488
+ . default
489
+ . and_then ( |ty| emit_hir_ty ( trap, db, & ctx. lower_ty ( ty) ) ) ;
490
+ trap. emit ( generated:: TypeParam {
491
+ id : trap:: TrapId :: Star ,
492
+ attrs : vec ! [ ] ,
493
+ name,
494
+ default_type,
495
+ type_bound_list : None ,
496
+ } )
497
+ . into ( )
498
+ }
499
+ TypeOrConstParamData :: ConstParamData ( param) => {
500
+ let name = Some ( trap. emit ( generated:: Name {
501
+ id : trap:: TrapId :: Star ,
502
+ text : param. name . as_str ( ) . to_owned ( ) . into ( ) ,
503
+ } ) ) ;
504
+ let param_id = TypeOrConstParamId {
505
+ parent : def,
506
+ local_id : param_id,
507
+ } ;
508
+ let ty = db. const_param_ty ( ConstParamId :: from_unchecked ( param_id) ) ;
509
+ let type_repr = emit_hir_ty ( trap, db, & ty) ;
510
+ trap. emit ( generated:: ConstParam {
511
+ id : trap:: TrapId :: Star ,
512
+ attrs : vec ! [ ] ,
513
+ name,
514
+ default_val : None ,
515
+ is_const : true ,
516
+ type_repr,
517
+ } )
518
+ . into ( )
519
+ }
520
+ }
521
+ } ,
522
+ ) ,
523
+ ) ;
524
+ trap. emit ( generated:: GenericParamList {
525
+ id : trap:: TrapId :: Star ,
526
+ generic_params,
527
+ } )
528
+ . into ( )
529
+ }
436
530
fn emit_adt (
437
531
db : & dyn HirDatabase ,
438
532
name : & str ,
@@ -441,6 +535,7 @@ fn emit_adt(
441
535
visibility : Visibility ,
442
536
) -> Vec < trap:: Label < generated:: Item > > {
443
537
let mut items = Vec :: new ( ) ;
538
+
444
539
match adt_id {
445
540
ra_ap_hir_def:: AdtId :: StructId ( struct_id) => {
446
541
let name = Some ( trap. emit ( generated:: Name {
@@ -449,13 +544,14 @@ fn emit_adt(
449
544
} ) ) ;
450
545
let field_list = emit_variant_data ( trap, db, struct_id. into ( ) ) . into ( ) ;
451
546
let visibility = emit_visibility ( db, trap, visibility) ;
547
+ let generic_param_list = emit_generic_param_list ( trap, db, adt_id. into ( ) ) ;
452
548
items. push (
453
549
trap. emit ( generated:: Struct {
454
550
id : trap:: TrapId :: Star ,
455
551
name,
456
552
attrs : vec ! [ ] ,
457
553
field_list,
458
- generic_param_list : None ,
554
+ generic_param_list,
459
555
visibility,
460
556
where_clause : None ,
461
557
} )
@@ -493,12 +589,13 @@ fn emit_adt(
493
589
text : Some ( name. to_owned ( ) ) ,
494
590
} ) ) ;
495
591
let visibility = emit_visibility ( db, trap, visibility) ;
592
+ let generic_param_list = emit_generic_param_list ( trap, db, adt_id. into ( ) ) ;
496
593
items. push (
497
594
trap. emit ( generated:: Enum {
498
595
id : trap:: TrapId :: Star ,
499
596
name,
500
597
attrs : vec ! [ ] ,
501
- generic_param_list : None ,
598
+ generic_param_list,
502
599
variant_list,
503
600
visibility,
504
601
where_clause : None ,
@@ -513,13 +610,14 @@ fn emit_adt(
513
610
} ) ) ;
514
611
let struct_field_list = emit_variant_data ( trap, db, union_id. into ( ) ) . into ( ) ;
515
612
let visibility = emit_visibility ( db, trap, visibility) ;
613
+ let generic_param_list = emit_generic_param_list ( trap, db, adt_id. into ( ) ) ;
516
614
items. push (
517
615
trap. emit ( generated:: Union {
518
616
id : trap:: TrapId :: Star ,
519
617
name,
520
618
attrs : vec ! [ ] ,
521
619
struct_field_list,
522
- generic_param_list : None ,
620
+ generic_param_list,
523
621
visibility,
524
622
where_clause : None ,
525
623
} )
@@ -538,8 +636,8 @@ fn emit_trait(
538
636
visibility : Visibility ,
539
637
) -> Vec < trap:: Label < generated:: Item > > {
540
638
let mut items = Vec :: new ( ) ;
541
- let data = db. trait_items ( trait_id) ;
542
- let assoc_items: Vec < trap:: Label < generated:: AssocItem > > = data
639
+ let trait_items = db. trait_items ( trait_id) ;
640
+ let assoc_items: Vec < trap:: Label < generated:: AssocItem > > = trait_items
543
641
. items
544
642
. iter ( )
545
643
. flat_map ( |( name, item) | {
@@ -577,6 +675,7 @@ fn emit_trait(
577
675
text : Some ( name. as_str ( ) . to_owned ( ) ) ,
578
676
} ) ) ;
579
677
let visibility = emit_visibility ( db, trap, visibility) ;
678
+ let generic_param_list = emit_generic_param_list ( trap, db, ( * function) . into ( ) ) ;
580
679
Some (
581
680
trap. emit ( generated:: Function {
582
681
id : trap:: TrapId :: Star ,
@@ -590,7 +689,7 @@ fn emit_trait(
590
689
is_async : false ,
591
690
is_gen : false ,
592
691
is_unsafe : matches ! ( sig. to_fn_ptr( ) . sig. safety, Safety :: Unsafe ) ,
593
- generic_param_list : None , //TODO
692
+ generic_param_list,
594
693
param_list : Some ( param_list) ,
595
694
ret_type,
596
695
where_clause : None ,
@@ -612,13 +711,14 @@ fn emit_trait(
612
711
text : Some ( name. to_owned ( ) ) ,
613
712
} ) ) ;
614
713
let visibility = emit_visibility ( db, trap, visibility) ;
714
+ let generic_param_list = emit_generic_param_list ( trap, db, trait_id. into ( ) ) ;
615
715
items. push (
616
716
trap. emit ( generated:: Trait {
617
717
id : trap:: TrapId :: Star ,
618
718
name,
619
719
assoc_item_list,
620
720
attrs : vec ! [ ] ,
621
- generic_param_list : None ,
721
+ generic_param_list,
622
722
is_auto : false ,
623
723
is_unsafe : false ,
624
724
type_bound_list : None ,
@@ -694,7 +794,7 @@ fn emit_module_impls(
694
794
data. visibility
695
795
. resolve ( db. upcast ( ) , & function. resolver ( db. upcast ( ) ) ) ,
696
796
) ;
697
-
797
+ let generic_param_list = emit_generic_param_list ( trap , db , ( * function ) . into ( ) ) ;
698
798
Some (
699
799
trap. emit ( generated:: Function {
700
800
id : trap:: TrapId :: Star ,
@@ -708,7 +808,7 @@ fn emit_module_impls(
708
808
is_async : false ,
709
809
is_gen : false ,
710
810
is_unsafe : matches ! ( sig. to_fn_ptr( ) . sig. safety, Safety :: Unsafe ) ,
711
- generic_param_list : None , //TODO
811
+ generic_param_list,
712
812
param_list : Some ( param_list) ,
713
813
ret_type,
714
814
where_clause : None ,
@@ -725,14 +825,15 @@ fn emit_module_impls(
725
825
assoc_items,
726
826
attrs : vec ! [ ] ,
727
827
} ) ) ;
828
+ let generic_param_list = emit_generic_param_list ( trap, db, imp. into ( ) ) ;
728
829
items. push (
729
830
trap. emit ( generated:: Impl {
730
831
id : trap:: TrapId :: Star ,
731
832
trait_,
732
833
self_ty,
733
834
assoc_item_list,
734
835
attrs : vec ! [ ] ,
735
- generic_param_list : None ,
836
+ generic_param_list,
736
837
is_const : false ,
737
838
is_default : false ,
738
839
is_unsafe : false ,
@@ -778,7 +879,6 @@ fn const_or_function(
778
879
let callable_def_id =
779
880
db. lookup_intern_callable_def ( InternedCallableDefId :: from ( * fn_def_id) ) ;
780
881
let data = db. fn_def_datum ( callable_def_id) ;
781
-
782
882
let sig = ra_ap_hir_ty:: CallableSig :: from_def ( db, * fn_def_id, parameters) ;
783
883
let params = sig
784
884
. params ( )
@@ -811,6 +911,11 @@ fn const_or_function(
811
911
text : Some ( name. to_owned ( ) ) ,
812
912
} ) ) ;
813
913
let visibility = emit_visibility ( db, trap, visibility) ;
914
+ let callable_def_id = db. lookup_intern_callable_def ( ( * fn_def_id) . into ( ) ) ;
915
+ let generic_def_id = GenericDefId :: from_callable ( db. upcast ( ) , callable_def_id) ;
916
+ let generic_param_list: Option < trap:: Label < generated:: GenericParamList > > =
917
+ emit_generic_param_list ( trap, db, generic_def_id) ;
918
+
814
919
trap. emit ( generated:: Function {
815
920
id : trap:: TrapId :: Star ,
816
921
name,
@@ -823,7 +928,7 @@ fn const_or_function(
823
928
is_async : false ,
824
929
is_gen : false ,
825
930
is_unsafe : matches ! ( data. sig. safety, Safety :: Unsafe ) ,
826
- generic_param_list : None , //TODO
931
+ generic_param_list,
827
932
param_list : Some ( param_list) ,
828
933
ret_type,
829
934
where_clause : None ,
0 commit comments