@@ -11,13 +11,7 @@ use crate::{
11
11
} ;
12
12
13
13
use super :: {
14
- IRBuilderContext , Symbol ,
15
- adts:: { lower_enum, lower_struct} ,
16
- constants:: lower_constant,
17
- functions:: { lower_func, lower_func_decl} ,
18
- ir:: { IR , ModuleIndex , Type } ,
19
- traits:: { TraitDatabase , TraitImpl } ,
20
- types:: lower_type,
14
+ adts:: { lower_enum, lower_struct} , constants:: lower_constant, functions:: { lower_func, lower_func_decl} , ir:: { ModuleIndex , Type , IR } , traits:: { TraitDatabase , TraitGeneric , TraitImpl } , types:: lower_type, IRBuilderContext , Symbol
21
15
} ;
22
16
23
17
/// Lowers the ast compile units, the last should be the "main" unit whose unit tests are saved.
@@ -632,16 +626,47 @@ pub fn lower_module(
632
626
path : builder. get_current_module ( ) . file_path . clone ( ) ,
633
627
} ) ?;
634
628
629
+ let mut trait_generics = Vec :: new ( ) ;
630
+
631
+ for g in & impl_trait. generic_params {
632
+ if let Some ( ty) = builder. context . generics_mapping . get ( & g. name . name ) {
633
+ trait_generics. push ( TraitGeneric :: Type ( * ty) ) ;
634
+ } else {
635
+ trait_generics. push ( TraitGeneric :: Generic ) ;
636
+ }
637
+ }
638
+
639
+ let target_ty = if !impl_trait. generic_params . is_empty ( ) {
640
+ let adt_symbol = Symbol {
641
+ name : impl_trait. target . get_name ( ) . unwrap ( ) ,
642
+ method_of : None ,
643
+ generics : Vec :: new ( ) ,
644
+ } ;
645
+
646
+ let id = * builder
647
+ . symbols
648
+ . get ( & builder. get_current_module_idx ( ) )
649
+ . unwrap ( )
650
+ . aggregates
651
+ . get ( & adt_symbol)
652
+ . unwrap ( ) ;
653
+
654
+ let type_id = * builder. adt_to_type_idx . get ( & id) . unwrap ( ) ;
655
+ type_id
656
+ } else {
657
+ lower_type ( builder, & impl_trait. target ) ?
658
+ } ;
659
+
660
+ builder. trait_db . add_trait_impl (
661
+ trait_id,
662
+ TraitImpl {
663
+ implementor : target_ty,
664
+ generics : trait_generics,
665
+ } ,
666
+ ) ;
667
+
635
668
if impl_trait. generic_params . is_empty ( ) {
636
- let target_ty = lower_type ( builder, & impl_trait. target ) ?;
637
669
builder. context . self_ty = Some ( target_ty) ;
638
- builder. trait_db . add_trait_impl (
639
- trait_id,
640
- TraitImpl {
641
- implementor : target_ty,
642
- generics : Vec :: new ( ) ,
643
- } ,
644
- ) ;
645
670
for method in & impl_trait. methods {
646
671
if method. decl . generic_params . is_empty ( ) {
647
672
lower_func ( builder, method, Some ( target_ty) ) ?;
0 commit comments