@@ -82,7 +82,14 @@ pub struct StructDecl {
82
82
#[ pub_fields]
83
83
pub struct GenericDecl {
84
84
name : Token , //Ident
85
- constraints : Vec < Type > ,
85
+ constraints : Vec < TraitType > ,
86
+ }
87
+
88
+ #[ derive( Debug , Clone ) ]
89
+ #[ pub_fields]
90
+ pub struct TraitType {
91
+ name : Token , //Ident or Self
92
+ generics : Vec < Type > ,
86
93
}
87
94
88
95
#[ derive( Debug , Clone ) ]
@@ -94,11 +101,11 @@ pub struct FieldDecl {
94
101
95
102
#[ derive( Debug , Clone ) ]
96
103
pub enum Type {
97
- ActualType ( SolidType ) ,
104
+ PhysicalType ( SolidType ) ,
98
105
Unit ,
99
106
Array ( SolidType ) ,
100
107
FP ( FunctionPointer ) ,
101
- DynamicType ( Vec < SolidType > )
108
+ DynamicType ( Vec < TraitType > )
102
109
}
103
110
104
111
@@ -336,7 +343,7 @@ impl Parsable for GenericDecl {
336
343
let constraints = if tokens. peek_consume ( TokenType :: Colon ) . is_ok ( ) {
337
344
let mut temp = vec ! [ ] ;
338
345
loop {
339
- temp. push ( Type :: parse ( tokens) ?) ;
346
+ temp. push ( TraitType :: parse ( tokens) ?) ;
340
347
if tokens. peek_consume ( TokenType :: Plus ) . is_err ( ) {
341
348
break ;
342
349
}
@@ -355,7 +362,7 @@ impl Parsable for GenericDecl {
355
362
impl Parsable for Type {
356
363
fn parse ( tokens : & mut Peekable < Iter < Token > > ) -> ParseResult < Self > {
357
364
Ok ( if tokens. peek ( ) . cannot_end ( ) . token_type == TokenType :: LParen {
358
- let traits = tokens. list_parse :: < SolidType > ( TokenType :: LParen , TokenType :: Plus , TokenType :: RParen ) ?;
365
+ let traits = tokens. list_parse :: < TraitType > ( TokenType :: LParen , TokenType :: Plus , TokenType :: RParen ) ?;
359
366
if traits. is_empty ( ) {
360
367
Self :: Unit
361
368
} else {
@@ -369,7 +376,7 @@ impl Parsable for Type {
369
376
tokens. consume ( TokenType :: RBrack ) ?;
370
377
res
371
378
} else {
372
- Self :: ActualType ( SolidType :: parse ( tokens) ?)
379
+ Self :: PhysicalType ( SolidType :: parse ( tokens) ?)
373
380
} )
374
381
}
375
382
}
@@ -403,3 +410,18 @@ impl Parsable for SolidType{
403
410
} )
404
411
}
405
412
}
413
+
414
+ impl Parsable for TraitType {
415
+ fn parse ( tokens : & mut Peekable < Iter < Token > > ) ->Result < Self , ParseError > {
416
+ let type_ = tokens. consume_multiple ( vec ! [ TokenType :: Ident , TokenType :: Self_ ] ) ?;
417
+ let generics = tokens. optional_list_parse :: < Type > (
418
+ TokenType :: LArrow ,
419
+ TokenType :: Comma ,
420
+ TokenType :: RArrow ,
421
+ ) ?;
422
+ Ok ( Self {
423
+ name : type_,
424
+ generics,
425
+ } )
426
+ }
427
+ }
0 commit comments