@@ -3,7 +3,7 @@ use spec_trait_utils::conversions::to_string;
33use spec_trait_utils:: parsing:: { ParseTypeOrLifetimeOrTrait , parse_type_or_lifetime_or_trait} ;
44use std:: fmt:: Debug ;
55use syn:: parse:: { Parse , ParseStream } ;
6- use syn:: { Error , Expr , Ident , Lit , Token , Type , bracketed, parenthesized , token} ;
6+ use syn:: { Error , Expr , Token , Type , bracketed, token} ;
77
88#[ derive( Debug , PartialEq , Clone ) ]
99pub enum Annotation {
@@ -87,28 +87,25 @@ impl Parse for AnnotationBody {
8787/// - `x.my_method(1u8, "abc")` -> `("x", "my_method", ["1u8", "abc"])`
8888/// - `var.foo()` -> `("var", "foo", [])`
8989fn parse_call ( input : ParseStream ) -> Result < ( String , String , Vec < String > ) , Error > {
90- let var = if input. peek ( Ident ) {
91- to_string ( & input. parse :: < Ident > ( ) ?)
92- } else if input. peek ( Lit ) {
93- to_string ( & input. parse :: < Lit > ( ) ?)
94- } else {
95- return Err ( Error :: new ( input. span ( ) , "Expected identifier or literal" ) ) ;
90+ let method_call = match input. parse :: < Expr > ( ) ? {
91+ Expr :: MethodCall ( mc) => mc,
92+ _ => {
93+ return Err ( Error :: new (
94+ input. span ( ) ,
95+ "Expected a method call of the form `variable.function(args...)`" ,
96+ ) ) ;
97+ }
9698 } ;
9799
98- input. parse :: < Token ! [ . ] > ( ) ?; // consume the '.' token
99-
100- let fn_: Ident = input. parse ( ) ?;
101-
102- let content;
103- parenthesized ! ( content in input) ; // consume the '(' and ')' token pair
104-
105- let args = content. parse_terminated ( Expr :: parse, Token ! [ , ] ) ?;
100+ let var = to_string ( & method_call. receiver ) ;
101+ let fn_ = method_call. method . to_string ( ) ;
102+ let args = method_call. args . iter ( ) . map ( to_string) . collect ( ) ;
106103
107104 if input. peek ( Token ! [ ; ] ) {
108105 input. parse :: < Token ! [ ; ] > ( ) ?; // consume the ';' token
109106 }
110107
111- Ok ( ( var, fn_. to_string ( ) , args. iter ( ) . map ( to_string ) . collect ( ) ) )
108+ Ok ( ( var, fn_, args) )
112109}
113110
114111/// Parse the variable type and argument types
@@ -229,6 +226,29 @@ mod tests {
229226 }
230227 }
231228
229+ #[ test]
230+ fn type_formats ( ) {
231+ let input = quote ! { ( a, b) . foo( ) ; ( i32 , i32 ) } ;
232+ let result = AnnotationBody :: try_from ( input) . unwrap ( ) ;
233+
234+ assert_eq ! ( result. var. replace( " " , "" ) , "(a,b)" ) ;
235+ assert_eq ! ( result. fn_, "foo" ) ;
236+ assert ! ( result. args. is_empty( ) ) ;
237+ assert_eq ! ( result. var_type. replace( " " , "" ) , "(i32,i32)" ) ;
238+ assert ! ( result. args_types. is_empty( ) ) ;
239+ assert ! ( result. annotations. is_empty( ) ) ;
240+
241+ let input = quote ! { [ 1 , 2 ] . foo( ) ; [ i32 ; 2 ] } ;
242+ let result = AnnotationBody :: try_from ( input) . unwrap ( ) ;
243+
244+ assert_eq ! ( result. var. replace( " " , "" ) , "[1,2]" ) ;
245+ assert_eq ! ( result. fn_, "foo" ) ;
246+ assert ! ( result. args. is_empty( ) ) ;
247+ assert_eq ! ( result. var_type. replace( " " , "" ) , "[i32;2]" ) ;
248+ assert ! ( result. args_types. is_empty( ) ) ;
249+ assert ! ( result. annotations. is_empty( ) ) ;
250+ }
251+
232252 #[ test]
233253 fn annotations ( ) {
234254 let input = quote ! {
0 commit comments