@@ -4918,6 +4918,63 @@ impl<'a> Hash for &'a TemplateParam {
4918
4918
}
4919
4919
}
4920
4920
4921
+ /// The `<template-param-decl>` production.
4922
+ ///
4923
+ /// ```text
4924
+ /// <template-param-decl> ::= Ty # type parameter
4925
+ /// ::= Tn <type> # non-type parameter
4926
+ /// ::= Tt <template-param-decl>* E # template parameter
4927
+ /// ::= Tp <template-param-decl> # parameter pack
4928
+ /// ```
4929
+ #[ derive( Clone , Debug , PartialEq , Eq ) ]
4930
+ pub enum TemplateParamDecl {
4931
+ /// Type Parameter (numbered)
4932
+ Type ( u8 ) ,
4933
+ }
4934
+
4935
+ impl Parse for TemplateParamDecl {
4936
+ fn parse < ' a , ' b > (
4937
+ ctx : & ' a ParseContext ,
4938
+ _subs : & ' a mut SubstitutionTable ,
4939
+ input : IndexStr < ' b > ,
4940
+ ) -> Result < ( TemplateParamDecl , IndexStr < ' b > ) > {
4941
+ try_begin_parse ! ( "TemplateParamDecl" , ctx, input) ;
4942
+
4943
+ let tail = consume ( b"T" , input) ?;
4944
+
4945
+ if let Ok ( tail) = consume ( b"y" , tail) {
4946
+ // TODO: implement a counter
4947
+ return Ok ( ( TemplateParamDecl :: Type ( 0 ) , tail) ) ;
4948
+ }
4949
+
4950
+ // TODO: implement other types as well
4951
+ Err ( error:: Error :: UnexpectedText )
4952
+ }
4953
+ }
4954
+
4955
+ impl < ' subs , W > Demangle < ' subs , W > for TemplateParamDecl
4956
+ where
4957
+ W : ' subs + DemangleWrite ,
4958
+ {
4959
+ fn demangle < ' prev , ' ctx > (
4960
+ & ' subs self ,
4961
+ ctx : & ' ctx mut DemangleContext < ' subs , W > ,
4962
+ scope : Option < ArgScopeStack < ' prev , ' subs > > ,
4963
+ ) -> fmt:: Result {
4964
+ let ctx = try_begin_demangle ! ( self , ctx, scope) ;
4965
+
4966
+ match self {
4967
+ TemplateParamDecl :: Type ( n) => {
4968
+ write ! ( ctx, "typename $T" ) ?;
4969
+ if * n > 0 {
4970
+ write ! ( ctx, "{}" , n - 1 ) ?;
4971
+ }
4972
+ }
4973
+ }
4974
+ Ok ( ( ) )
4975
+ }
4976
+ }
4977
+
4921
4978
/// The `<template-template-param>` production.
4922
4979
///
4923
4980
/// ```text
@@ -6912,7 +6969,7 @@ impl Parse for Discriminator {
6912
6969
/// <closure-type-name> ::= Ul <lambda-sig> E [ <nonnegative number> ] _
6913
6970
/// ```
6914
6971
#[ derive( Clone , Debug , PartialEq , Eq ) ]
6915
- pub struct ClosureTypeName ( LambdaSig , Option < usize > ) ;
6972
+ pub struct ClosureTypeName ( Vec < TemplateParamDecl > , LambdaSig , Option < usize > ) ;
6916
6973
6917
6974
impl Parse for ClosureTypeName {
6918
6975
fn parse < ' a , ' b > (
@@ -6922,7 +6979,13 @@ impl Parse for ClosureTypeName {
6922
6979
) -> Result < ( ClosureTypeName , IndexStr < ' b > ) > {
6923
6980
try_begin_parse ! ( "ClosureTypeName" , ctx, input) ;
6924
6981
6925
- let tail = consume ( b"Ul" , input) ?;
6982
+ let mut tail = consume ( b"Ul" , input) ?;
6983
+ let mut params = vec ! [ ] ;
6984
+ while let Ok ( _) = consume ( b"T" , tail) {
6985
+ let ( decl, _tail) = TemplateParamDecl :: parse ( ctx, subs, tail) ?;
6986
+ params. push ( decl) ;
6987
+ tail = _tail;
6988
+ }
6926
6989
let ( sig, tail) = LambdaSig :: parse ( ctx, subs, tail) ?;
6927
6990
let tail = consume ( b"E" , tail) ?;
6928
6991
let ( num, tail) = if let Ok ( ( num, tail) ) = parse_number ( 10 , false , tail) {
@@ -6931,7 +6994,7 @@ impl Parse for ClosureTypeName {
6931
6994
( None , tail)
6932
6995
} ;
6933
6996
let tail = consume ( b"_" , tail) ?;
6934
- Ok ( ( ClosureTypeName ( sig, num) , tail) )
6997
+ Ok ( ( ClosureTypeName ( params , sig, num) , tail) )
6935
6998
}
6936
6999
}
6937
7000
@@ -6946,9 +7009,22 @@ where
6946
7009
) -> fmt:: Result {
6947
7010
let ctx = try_begin_demangle ! ( self , ctx, scope) ;
6948
7011
6949
- write ! ( ctx, "{{lambda(" ) ?;
6950
- self . 0 . demangle ( ctx, scope) ?;
6951
- write ! ( ctx, ")#{}}}" , self . 1 . map_or( 1 , |n| n + 2 ) ) ?;
7012
+ write ! ( ctx, "{{lambda" ) ?;
7013
+ if !self . 0 . is_empty ( ) {
7014
+ write ! ( ctx, "<" ) ?;
7015
+ let mut need_comma = false ;
7016
+ for arg in & self . 0 {
7017
+ if need_comma {
7018
+ write ! ( ctx, ", " ) ?;
7019
+ }
7020
+ arg. demangle ( ctx, scope) ?;
7021
+ need_comma = true ;
7022
+ }
7023
+ write ! ( ctx, ">" ) ?;
7024
+ }
7025
+ write ! ( ctx, "(" ) ?;
7026
+ self . 1 . demangle ( ctx, scope) ?;
7027
+ write ! ( ctx, ")#{}}}" , self . 2 . map_or( 1 , |n| n + 2 ) ) ?;
6952
7028
Ok ( ( ) )
6953
7029
}
6954
7030
}
@@ -10307,11 +10383,11 @@ mod tests {
10307
10383
assert_parse ! ( ClosureTypeName {
10308
10384
Ok => {
10309
10385
b"UlvE_..." => {
10310
- ClosureTypeName ( LambdaSig ( vec![ ] ) , None ) ,
10386
+ ClosureTypeName ( vec! [ ] , LambdaSig ( vec![ ] ) , None ) ,
10311
10387
b"..."
10312
10388
}
10313
10389
b"UlvE36_..." => {
10314
- ClosureTypeName ( LambdaSig ( vec![ ] ) , Some ( 36 ) ) ,
10390
+ ClosureTypeName ( vec! [ ] , LambdaSig ( vec![ ] ) , Some ( 36 ) ) ,
10315
10391
b"..."
10316
10392
}
10317
10393
}
@@ -10835,6 +10911,7 @@ mod tests {
10835
10911
b"UllE_..." => {
10836
10912
UnqualifiedName :: ClosureType (
10837
10913
ClosureTypeName (
10914
+ vec![ ] ,
10838
10915
LambdaSig ( vec![
10839
10916
TypeHandle :: Builtin (
10840
10917
BuiltinType :: Standard (
0 commit comments