@@ -88,6 +88,14 @@ impl<'src> Parser<'src> {
8888 }
8989
9090 let name = self . expect_identifier ( ) ?;
91+
92+ // Parse optional type parameters: <T, U>
93+ let type_params = if self . check ( & Token :: Less ) {
94+ self . parse_type_params ( ) ?
95+ } else {
96+ Vec :: new ( )
97+ } ;
98+
9199 self . expect ( Token :: LParen ) ?;
92100 let params = self . parse_parameter_list ( ) ?;
93101 self . expect ( Token :: RParen ) ?;
@@ -130,6 +138,7 @@ impl<'src> Parser<'src> {
130138 Ok ( FunctionDef {
131139 emote,
132140 name,
141+ type_params,
133142 params,
134143 return_type,
135144 hello,
@@ -171,6 +180,45 @@ impl<'src> Parser<'src> {
171180 } )
172181 }
173182
183+ /// Parse type parameters: <T, U: Bound>
184+ fn parse_type_params ( & mut self ) -> Result < Vec < TypeParam > , ParseError > {
185+ self . expect ( Token :: Less ) ?; // Consume '<'
186+ let mut params = Vec :: new ( ) ;
187+
188+ if self . check ( & Token :: Greater ) {
189+ self . advance ( ) ;
190+ return Ok ( params) ;
191+ }
192+
193+ params. push ( self . parse_type_param ( ) ?) ;
194+ while self . check ( & Token :: Comma ) {
195+ self . advance ( ) ;
196+ params. push ( self . parse_type_param ( ) ?) ;
197+ }
198+
199+ self . expect ( Token :: Greater ) ?; // Consume '>'
200+ Ok ( params)
201+ }
202+
203+ /// Parse a single type parameter: T or T: Bound
204+ fn parse_type_param ( & mut self ) -> Result < TypeParam , ParseError > {
205+ let name = self . expect_identifier ( ) ?;
206+ let bounds = if self . check ( & Token :: Colon ) {
207+ self . advance ( ) ;
208+ // Parse bounds separated by +
209+ let mut bounds = Vec :: new ( ) ;
210+ bounds. push ( self . expect_identifier ( ) ?) ;
211+ while self . check ( & Token :: Plus ) {
212+ self . advance ( ) ;
213+ bounds. push ( self . expect_identifier ( ) ?) ;
214+ }
215+ bounds
216+ } else {
217+ Vec :: new ( )
218+ } ;
219+ Ok ( TypeParam { name, bounds } )
220+ }
221+
174222 // === Consent Block ===
175223
176224 fn parse_consent_block ( & mut self ) -> Result < ConsentBlock , ParseError > {
@@ -515,12 +563,38 @@ impl<'src> Parser<'src> {
515563 Some ( Token :: Identifier ( name) ) => {
516564 let name = name. clone ( ) ;
517565 self . advance ( ) ;
518- Ok ( Type :: Basic ( name) )
566+ // Check for generic type arguments: Result<T, E>
567+ if self . check ( & Token :: Less ) {
568+ let args = self . parse_type_args ( ) ?;
569+ Ok ( Type :: Generic ( name, args) )
570+ } else {
571+ Ok ( Type :: Basic ( name) )
572+ }
519573 }
520574 _ => Err ( self . error ( "Expected type" ) ) ,
521575 }
522576 }
523577
578+ /// Parse type arguments: <Int, String>
579+ fn parse_type_args ( & mut self ) -> Result < Vec < Type > , ParseError > {
580+ self . expect ( Token :: Less ) ?;
581+ let mut args = Vec :: new ( ) ;
582+
583+ if self . check ( & Token :: Greater ) {
584+ self . advance ( ) ;
585+ return Ok ( args) ;
586+ }
587+
588+ args. push ( self . parse_type ( ) ?) ;
589+ while self . check ( & Token :: Comma ) {
590+ self . advance ( ) ;
591+ args. push ( self . parse_type ( ) ?) ;
592+ }
593+
594+ self . expect ( Token :: Greater ) ?;
595+ Ok ( args)
596+ }
597+
524598 // === Statement Parsing ===
525599
526600 fn parse_statement_list ( & mut self ) -> Result < Vec < Statement > , ParseError > {
@@ -1118,6 +1192,12 @@ impl<'src> Parser<'src> {
11181192 }
11191193 Some ( Token :: LParen ) => {
11201194 self . advance ( ) ;
1195+ // Check for Unit literal: ()
1196+ if self . check ( & Token :: RParen ) {
1197+ self . advance ( ) ;
1198+ let end = self . previous_span ( ) . end ;
1199+ return Ok ( Spanned :: new ( Expr :: Literal ( Literal :: Unit ) , start..end) ) ;
1200+ }
11211201 let expr = self . parse_expression ( ) ?;
11221202 self . expect ( Token :: RParen ) ?;
11231203 Ok ( expr)
0 commit comments