@@ -460,6 +460,48 @@ where
460460 break ;
461461 }
462462
463+ // Handle const generic parameters: const N: usize
464+ // Skip const generics entirely as Generic struct doesn't support const value types yet
465+ if cursor. peek_kind ( ) == Some ( TokenKind :: Const ) {
466+ cursor. advance_kind ( ) ; // consume 'const'
467+
468+ // Skip const generic name (N)
469+ if cursor. peek_kind ( ) == Some ( TokenKind :: Ident ) {
470+ cursor. consume_ident ( ) ;
471+ }
472+
473+ // Skip type annotation (: usize) if present
474+ if cursor. peek_kind ( ) == Some ( TokenKind :: Colon ) {
475+ cursor. advance_kind ( ) ; // consume ':'
476+ // Skip type annotation tokens
477+ while cursor. peek_kind ( ) != Some ( TokenKind :: Comma )
478+ && cursor. peek_kind ( ) != Some ( TokenKind :: Gt )
479+ && !cursor. at_end ( )
480+ {
481+ cursor. advance_kind ( ) ;
482+ }
483+ }
484+
485+ // Skip to comma or closing angle bracket
486+ match cursor. peek_kind ( ) {
487+ Some ( TokenKind :: Comma ) => {
488+ cursor. advance_kind ( ) ;
489+ continue ;
490+ }
491+ Some ( TokenKind :: Gt ) => break ,
492+ _ => {
493+ // Try to recover
494+ while cursor. peek_kind ( ) != Some ( TokenKind :: Comma )
495+ && cursor. peek_kind ( ) != Some ( TokenKind :: Gt )
496+ && !cursor. at_end ( )
497+ {
498+ cursor. advance_kind ( ) ;
499+ }
500+ continue ;
501+ }
502+ }
503+ }
504+
463505 let name = cursor. consume_ident ( )
464506 . unwrap_or_else ( || panic ! (
465507 "Expected generic parameter name, found {:?}" ,
@@ -647,20 +689,15 @@ where
647689 ) -> Option < & ' bump [ Param < ' a , ' bump > ] > {
648690 let mut params: SmallVec < Param < ' a , ' bump > , 8 > = SmallVec :: new ( ) ;
649691
650- loop {
692+ loop {
651693 match cursor. peek_kind ( ) {
652694 Some ( TokenKind :: RParen ) => {
653695 cursor. advance_kind ( ) ; // consume ')'
654696 break ;
655697 }
656- Some ( TokenKind :: Mut )
657- | Some ( TokenKind :: Ident )
658- | Some ( TokenKind :: I32 )
659- | Some ( TokenKind :: I64 )
660- | Some ( TokenKind :: Str )
661- | Some ( TokenKind :: Void )
662- | Some ( TokenKind :: This ) => {
663- // Check for mut modifier
698+ Some ( TokenKind :: Mul ) => {
699+ // Check for pointer types (*mut this, *this)
700+ cursor. advance_kind ( ) ; // consume '*'
664701 let is_mut = if cursor. peek_kind ( ) == Some ( TokenKind :: Mut ) {
665702 cursor. advance_kind ( ) ; // consume 'mut'
666703 true
@@ -676,9 +713,32 @@ where
676713 type_annotation : None ,
677714 } ) ;
678715 params. push ( Param :: This ( this_param) ) ;
679- continue ;
716+ // Handle comma after *this or *mut this
717+ if cursor. peek_kind ( ) == Some ( TokenKind :: Comma ) {
718+ cursor. advance_kind ( ) ;
719+ }
680720 }
681-
721+ // Skip if we had * but not followed by this
722+ continue ;
723+ }
724+ Some ( TokenKind :: Mut )
725+ | Some ( TokenKind :: Ident )
726+ | Some ( TokenKind :: I32 )
727+ | Some ( TokenKind :: I64 )
728+ | Some ( TokenKind :: Str )
729+ | Some ( TokenKind :: Void )
730+ | Some ( TokenKind :: I8 )
731+ | Some ( TokenKind :: I16 )
732+ | Some ( TokenKind :: I128 )
733+ | Some ( TokenKind :: U8 )
734+ | Some ( TokenKind :: U16 )
735+ | Some ( TokenKind :: U32 )
736+ | Some ( TokenKind :: U64 )
737+ | Some ( TokenKind :: U128 )
738+ | Some ( TokenKind :: F32 )
739+ | Some ( TokenKind :: F64 )
740+ | Some ( TokenKind :: Boolean )
741+ | Some ( TokenKind :: Char ) => {
682742 // Try to parse in different formats
683743 let ( name, param_type, is_this) = if cursor. peek_kind ( )
684744 == Some ( TokenKind :: Ident )
@@ -724,6 +784,16 @@ where
724784 ( first_ident, Type :: infer ( ) , false )
725785 }
726786 }
787+ Some ( TokenKind :: I8 ) => {
788+ cursor. advance_kind ( ) ; // consume type
789+ let name = cursor. consume_ident ( ) ?;
790+ ( name, Type :: i8 ( ) , false )
791+ }
792+ Some ( TokenKind :: I16 ) => {
793+ cursor. advance_kind ( ) ; // consume type
794+ let name = cursor. consume_ident ( ) ?;
795+ ( name, Type :: i16 ( ) , false )
796+ }
727797 Some ( TokenKind :: I32 ) => {
728798 cursor. advance_kind ( ) ; // consume type
729799 let name = cursor. consume_ident ( ) ?;
@@ -734,11 +804,61 @@ where
734804 let name = cursor. consume_ident ( ) ?;
735805 ( name, Type :: i64 ( ) , false )
736806 }
807+ Some ( TokenKind :: I128 ) => {
808+ cursor. advance_kind ( ) ; // consume type
809+ let name = cursor. consume_ident ( ) ?;
810+ ( name, Type :: i128 ( ) , false )
811+ }
812+ Some ( TokenKind :: U8 ) => {
813+ cursor. advance_kind ( ) ; // consume type
814+ let name = cursor. consume_ident ( ) ?;
815+ ( name, Type :: u8 ( ) , false )
816+ }
817+ Some ( TokenKind :: U16 ) => {
818+ cursor. advance_kind ( ) ; // consume type
819+ let name = cursor. consume_ident ( ) ?;
820+ ( name, Type :: u16 ( ) , false )
821+ }
822+ Some ( TokenKind :: U32 ) => {
823+ cursor. advance_kind ( ) ; // consume type
824+ let name = cursor. consume_ident ( ) ?;
825+ ( name, Type :: u32 ( ) , false )
826+ }
827+ Some ( TokenKind :: U64 ) => {
828+ cursor. advance_kind ( ) ; // consume type
829+ let name = cursor. consume_ident ( ) ?;
830+ ( name, Type :: u64 ( ) , false )
831+ }
832+ Some ( TokenKind :: U128 ) => {
833+ cursor. advance_kind ( ) ; // consume type
834+ let name = cursor. consume_ident ( ) ?;
835+ ( name, Type :: u128 ( ) , false )
836+ }
837+ Some ( TokenKind :: F32 ) => {
838+ cursor. advance_kind ( ) ; // consume type
839+ let name = cursor. consume_ident ( ) ?;
840+ ( name, Type :: f32 ( ) , false )
841+ }
842+ Some ( TokenKind :: F64 ) => {
843+ cursor. advance_kind ( ) ; // consume type
844+ let name = cursor. consume_ident ( ) ?;
845+ ( name, Type :: f64 ( ) , false )
846+ }
737847 Some ( TokenKind :: Str ) => {
738848 cursor. advance_kind ( ) ; // consume type
739849 let name = cursor. consume_ident ( ) ?;
740850 ( name, Type :: string ( ) , false )
741851 }
852+ Some ( TokenKind :: Boolean ) => {
853+ cursor. advance_kind ( ) ; // consume type
854+ let name = cursor. consume_ident ( ) ?;
855+ ( name, Type :: boolean ( ) , false )
856+ }
857+ Some ( TokenKind :: Char ) => {
858+ cursor. advance_kind ( ) ; // consume type
859+ let name = cursor. consume_ident ( ) ?;
860+ ( name, Type :: char ( ) , false )
861+ }
742862 Some ( TokenKind :: Void ) => {
743863 cursor. advance_kind ( ) ; // consume type
744864 let name = cursor. consume_ident ( ) ?;
@@ -751,14 +871,14 @@ where
751871 if is_this {
752872 // Create a ThisParam instead of NormalParam
753873 let this_param = self . bump . alloc_value ( ThisParam {
754- is_mut,
874+ is_mut : false ,
755875 is_move : false ,
756876 type_annotation : None ,
757877 } ) ;
758878 params. push ( Param :: This ( this_param) ) ;
759879 } else {
760880 let normal_param = self . bump . alloc_value ( NormalParam {
761- is_mut,
881+ is_mut : false ,
762882 is_move : false ,
763883 name,
764884 type_annotation : param_type,
@@ -768,6 +888,7 @@ where
768888 params. push ( Param :: Normal ( normal_param) ) ;
769889 }
770890
891+ // Handle comma separator
771892 if cursor. peek_kind ( ) == Some ( TokenKind :: Comma ) {
772893 cursor. advance_kind ( ) ;
773894 }
0 commit comments