@@ -3,8 +3,9 @@ use std::rc::Rc;
33
44use super :: primary:: VarNode ;
55use super :: * ;
6- use crate :: ast:: ctx:: { ARRType , Ctx , Field , PLType , STType } ;
6+ use crate :: ast:: ctx:: Ctx ;
77use crate :: ast:: diag:: ErrorCode ;
8+ use crate :: ast:: pltype:: { ARRType , Field , PLType , STType } ;
89use crate :: ast:: range:: Range ;
910use crate :: utils:: read_config:: enter;
1011use inkwell:: types:: { AnyType , BasicType } ;
@@ -248,7 +249,13 @@ impl StructDefNode {
248249 refs : Rc :: new ( RefCell :: new ( vec ! [ ] ) ) ,
249250 doc : vec ! [ ] ,
250251 methods : FxHashMap :: default ( ) ,
252+ generics : None ,
253+ is_generic_place_holder : false ,
251254 } ) ) ) ;
255+ // skip generics
256+ if self . generics . is_some ( ) {
257+ return ;
258+ }
252259 ctx. context
253260 . opaque_struct_type ( & ctx. plmod . get_full_name ( & self . id . name ) ) ;
254261 _ = ctx. add_type ( self . id . name . clone ( ) , stu, self . range ) ;
@@ -289,30 +296,34 @@ impl StructDefNode {
289296 i = i + 1 ;
290297 }
291298 let name = self . id . name . as_str ( ) ;
292- let st = ctx
293- . module
294- . get_struct_type ( & ctx. plmod . get_full_name ( name) )
295- . unwrap ( ) ;
296299 let newf = order_fields. clone ( ) ;
297- st. set_body (
298- & order_fields
299- . into_iter ( )
300- . map ( |order_field| {
301- order_field
302- . pltype
303- . get_type ( ctx)
304- . unwrap ( )
305- . borrow ( )
306- . get_basic_type ( & ctx)
307- } )
308- . collect :: < Vec < _ > > ( ) ,
309- false ,
310- ) ;
300+ // skip generics
301+ if self . generics . is_none ( ) {
302+ let st = ctx
303+ . module
304+ . get_struct_type ( & ctx. plmod . get_full_name ( name) )
305+ . unwrap ( ) ;
306+ st. set_body (
307+ & order_fields
308+ . into_iter ( )
309+ . map ( |order_field| {
310+ order_field
311+ . pltype
312+ . get_type ( ctx)
313+ . unwrap ( )
314+ . borrow ( )
315+ . get_basic_type ( & ctx)
316+ } )
317+ . collect :: < Vec < _ > > ( ) ,
318+ false ,
319+ ) ;
320+ }
311321 let tp = ctx. get_type ( & self . id . name . as_str ( ) , self . range ) . unwrap ( ) ;
312322 if let PLType :: STRUCT ( st) = & mut * tp. borrow_mut ( ) {
313323 st. fields = fields;
314324 st. ordered_fields = newf;
315325 st. doc = self . doc . clone ( ) ;
326+ st. generics = self . generics . clone ( ) ;
316327 }
317328 ctx. set_if_refs_tp ( tp. clone ( ) , self . range ) ;
318329 ctx. add_doc_symbols ( tp. clone ( ) ) ;
@@ -521,3 +532,33 @@ impl Node for ArrayInitNode {
521532pub struct GenericDefNode {
522533 pub generics : Vec < Box < VarNode > > ,
523534}
535+
536+ impl GenericDefNode {
537+ pub fn child_ctx < ' a , ' ctx > ( & ' a mut self , ctx : & ' a mut Ctx < ' a , ' ctx > ) -> Ctx < ' a , ' ctx > {
538+ let mut child = ctx. new_child ( self . range . start ) ;
539+ for gen in self . generics . iter ( ) {
540+ let range = gen. range ( ) ;
541+ let name = "__generic__" . to_string ( ) + gen. name . clone ( ) . as_str ( ) ;
542+ let pltype = PLType :: STRUCT ( STType {
543+ name,
544+ path : ctx. plmod . path . clone ( ) ,
545+ fields : FxHashMap :: default ( ) ,
546+ ordered_fields : vec ! [ ] ,
547+ range,
548+ refs : Rc :: new ( RefCell :: new ( vec ! [ ] ) ) ,
549+ doc : vec ! [ ] ,
550+ methods : FxHashMap :: default ( ) ,
551+ generics : None ,
552+ is_generic_place_holder : true ,
553+ } ) ;
554+ _ = child. add_type ( gen. name . clone ( ) , Rc :: new ( RefCell :: new ( pltype) ) , range) ;
555+ }
556+ child
557+ }
558+ }
559+
560+ #[ range]
561+ #[ derive( Clone , PartialEq , Eq , Debug ) ]
562+ pub struct GenericParamNode {
563+ pub generics : Vec < Box < NodeEnum > > ,
564+ }
0 commit comments