@@ -3,8 +3,9 @@ use std::rc::Rc;
3
3
4
4
use super :: primary:: VarNode ;
5
5
use super :: * ;
6
- use crate :: ast:: ctx:: { ARRType , Ctx , Field , PLType , STType } ;
6
+ use crate :: ast:: ctx:: Ctx ;
7
7
use crate :: ast:: diag:: ErrorCode ;
8
+ use crate :: ast:: pltype:: { ARRType , Field , PLType , STType } ;
8
9
use crate :: ast:: range:: Range ;
9
10
use crate :: utils:: read_config:: enter;
10
11
use inkwell:: types:: { AnyType , BasicType } ;
@@ -248,7 +249,13 @@ impl StructDefNode {
248
249
refs : Rc :: new ( RefCell :: new ( vec ! [ ] ) ) ,
249
250
doc : vec ! [ ] ,
250
251
methods : FxHashMap :: default ( ) ,
252
+ generics : None ,
253
+ is_generic_place_holder : false ,
251
254
} ) ) ) ;
255
+ // skip generics
256
+ if self . generics . is_some ( ) {
257
+ return ;
258
+ }
252
259
ctx. context
253
260
. opaque_struct_type ( & ctx. plmod . get_full_name ( & self . id . name ) ) ;
254
261
_ = ctx. add_type ( self . id . name . clone ( ) , stu, self . range ) ;
@@ -289,30 +296,34 @@ impl StructDefNode {
289
296
i = i + 1 ;
290
297
}
291
298
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 ( ) ;
296
299
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
+ }
311
321
let tp = ctx. get_type ( & self . id . name . as_str ( ) , self . range ) . unwrap ( ) ;
312
322
if let PLType :: STRUCT ( st) = & mut * tp. borrow_mut ( ) {
313
323
st. fields = fields;
314
324
st. ordered_fields = newf;
315
325
st. doc = self . doc . clone ( ) ;
326
+ st. generics = self . generics . clone ( ) ;
316
327
}
317
328
ctx. set_if_refs_tp ( tp. clone ( ) , self . range ) ;
318
329
ctx. add_doc_symbols ( tp. clone ( ) ) ;
@@ -521,3 +532,33 @@ impl Node for ArrayInitNode {
521
532
pub struct GenericDefNode {
522
533
pub generics : Vec < Box < VarNode > > ,
523
534
}
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