19
19
20
20
use frame_support_procedural_tools:: generate_crate_access_2018;
21
21
use proc_macro2:: TokenStream ;
22
- use quote:: ToTokens ;
23
- use syn:: { punctuated:: Punctuated , ItemImpl , Result , Token } ;
22
+ use syn:: {
23
+ braced, bracketed,
24
+ parse:: { Parse , ParseStream } ,
25
+ parse2,
26
+ punctuated:: Punctuated ,
27
+ token:: { Brace , Bracket } ,
28
+ Ident , ImplItem , ItemImpl , Result , Token , TypePath ,
29
+ } ;
24
30
25
31
mod keywords {
26
- syn:: custom_keyword!( derive_impl) ;
27
- syn:: custom_keyword!( partial_impl_block) ;
28
- syn:: custom_keyword!( implementing_type) ;
29
- syn:: custom_keyword!( type_items) ;
30
- syn:: custom_keyword!( fn_items) ;
31
- syn:: custom_keyword!( const_items) ;
32
+ use syn:: custom_keyword;
33
+
34
+ custom_keyword ! ( derive_impl) ;
35
+ custom_keyword ! ( partial_impl_block) ;
36
+ custom_keyword ! ( implementing_type) ;
37
+ custom_keyword ! ( type_items) ;
38
+ custom_keyword ! ( fn_items) ;
39
+ custom_keyword ! ( const_items) ;
32
40
}
33
41
34
42
pub struct DeriveImplDef {
35
43
/// The partial impl block that the user provides. This should be interpreted as "override".
36
- partial_impl_block : syn :: ItemImpl ,
44
+ partial_impl_block : ItemImpl ,
37
45
/// The full path to the type that can be used to receive defaults form.
38
- implementing_type : syn :: TypePath ,
46
+ implementing_type : TypePath ,
39
47
/// All of the associated type items that we must eventually implement.
40
- type_items : Punctuated < syn :: Ident , Token ! [ , ] > ,
48
+ type_items : Punctuated < Ident , Token ! [ , ] > ,
41
49
/// All of the function items that we must eventually implement.
42
- fn_items : Punctuated < syn :: Ident , Token ! [ , ] > ,
50
+ fn_items : Punctuated < Ident , Token ! [ , ] > ,
43
51
/// All of the constant items that we must eventually implement.
44
- const_items : Punctuated < syn :: Ident , Token ! [ , ] > ,
52
+ const_items : Punctuated < Ident , Token ! [ , ] > ,
45
53
}
46
54
47
- impl syn :: parse :: Parse for DeriveImplDef {
48
- fn parse ( input : syn :: parse :: ParseStream ) -> Result < Self > {
55
+ impl Parse for DeriveImplDef {
56
+ fn parse ( input : ParseStream ) -> Result < Self > {
49
57
// NOTE: unfortunately, the order the keywords here must match what the pallet macro
50
58
// expands. We can probably used a shared set of keywords later.
51
59
let mut partial_impl_block;
52
60
let _ = input. parse :: < keywords:: partial_impl_block > ( ) ?;
53
- let _ = input. parse :: < syn:: Token ![ =] > ( ) ?;
54
- let _replace_with_bracket: syn:: token:: Bracket =
55
- syn:: bracketed!( partial_impl_block in input) ;
56
- let _replace_with_brace: syn:: token:: Brace =
57
- syn:: braced!( partial_impl_block in partial_impl_block) ;
61
+ let _ = input. parse :: < Token ! [ =] > ( ) ?;
62
+ let _replace_with_bracket: Bracket = bracketed ! ( partial_impl_block in input) ;
63
+ let _replace_with_brace: Brace = braced ! ( partial_impl_block in partial_impl_block) ;
58
64
let partial_impl_block = partial_impl_block. parse ( ) ?;
59
65
60
66
let mut implementing_type;
61
67
let _ = input. parse :: < keywords:: implementing_type > ( ) ?;
62
- let _ = input. parse :: < syn:: Token ![ =] > ( ) ?;
63
- let _replace_with_bracket: syn:: token:: Bracket =
64
- syn:: bracketed!( implementing_type in input) ;
65
- let _replace_with_brace: syn:: token:: Brace =
66
- syn:: braced!( implementing_type in implementing_type) ;
68
+ let _ = input. parse :: < Token ! [ =] > ( ) ?;
69
+ let _replace_with_bracket: Bracket = bracketed ! ( implementing_type in input) ;
70
+ let _replace_with_brace: Brace = braced ! ( implementing_type in implementing_type) ;
67
71
let implementing_type = implementing_type. parse ( ) ?;
68
72
69
73
let mut type_items;
70
74
let _ = input. parse :: < keywords:: type_items > ( ) ?;
71
- let _ = input. parse :: < syn :: Token ![ =] > ( ) ?;
72
- let _replace_with_bracket: syn :: token :: Bracket = syn :: bracketed!( type_items in input) ;
73
- let _replace_with_brace: syn :: token :: Brace = syn :: braced!( type_items in type_items) ;
74
- let type_items = Punctuated :: < syn :: Ident , Token ! [ , ] > :: parse_terminated ( & type_items) ?;
75
+ let _ = input. parse :: < Token ! [ =] > ( ) ?;
76
+ let _replace_with_bracket: Bracket = bracketed ! ( type_items in input) ;
77
+ let _replace_with_brace: Brace = braced ! ( type_items in type_items) ;
78
+ let type_items = Punctuated :: < Ident , Token ! [ , ] > :: parse_terminated ( & type_items) ?;
75
79
76
80
let mut fn_items;
77
81
let _ = input. parse :: < keywords:: fn_items > ( ) ?;
78
- let _ = input. parse :: < syn :: Token ![ =] > ( ) ?;
79
- let _replace_with_bracket: syn :: token :: Bracket = syn :: bracketed!( fn_items in input) ;
80
- let _replace_with_brace: syn :: token :: Brace = syn :: braced!( fn_items in fn_items) ;
81
- let fn_items = Punctuated :: < syn :: Ident , Token ! [ , ] > :: parse_terminated ( & fn_items) ?;
82
+ let _ = input. parse :: < Token ! [ =] > ( ) ?;
83
+ let _replace_with_bracket: Bracket = bracketed ! ( fn_items in input) ;
84
+ let _replace_with_brace: Brace = braced ! ( fn_items in fn_items) ;
85
+ let fn_items = Punctuated :: < Ident , Token ! [ , ] > :: parse_terminated ( & fn_items) ?;
82
86
83
87
let mut const_items;
84
88
let _ = input. parse :: < keywords:: const_items > ( ) ?;
85
- let _ = input. parse :: < syn :: Token ![ =] > ( ) ?;
86
- let _replace_with_bracket: syn :: token :: Bracket = syn :: bracketed!( const_items in input) ;
87
- let _replace_with_brace: syn :: token :: Brace = syn :: braced!( const_items in const_items) ;
88
- let const_items = Punctuated :: < syn :: Ident , Token ! [ , ] > :: parse_terminated ( & const_items) ?;
89
+ let _ = input. parse :: < Token ! [ =] > ( ) ?;
90
+ let _replace_with_bracket: Bracket = bracketed ! ( const_items in input) ;
91
+ let _replace_with_brace: Brace = braced ! ( const_items in const_items) ;
92
+ let const_items = Punctuated :: < Ident , Token ! [ , ] > :: parse_terminated ( & const_items) ?;
89
93
90
94
Ok ( Self { partial_impl_block, type_items, fn_items, const_items, implementing_type } )
91
95
}
92
96
}
93
97
94
98
pub ( crate ) fn derive_impl_inner ( input : TokenStream ) -> Result < TokenStream > {
95
99
println ! ( "input: {}" , input) ;
96
- let DeriveImplDef { partial_impl_block, implementing_type, type_items, .. } =
97
- syn:: parse2 ( input) ?;
100
+ let DeriveImplDef { partial_impl_block, implementing_type, type_items, .. } = parse2 ( input) ?;
98
101
99
- let type_item_name = |i : & syn :: ImplItem | {
100
- if let syn :: ImplItem :: Type ( t) = i {
102
+ let type_item_name = |i : & ImplItem | {
103
+ if let ImplItem :: Type ( t) = i {
101
104
t. ident . clone ( )
102
105
} else {
103
106
panic ! ( "only support type items for now" )
@@ -125,8 +128,8 @@ pub(crate) fn derive_impl_inner(input: TokenStream) -> Result<TokenStream> {
125
128
} else {
126
129
// add it
127
130
let tokens = quote:: quote!( type #ident = <#implementing_type as #source_crate_path:: pallet:: DefaultConfig >:: #ident; ) ;
128
- let parsed: syn :: ImplItem = syn :: parse2 ( tokens) . expect ( "it is a valid type item" ) ;
129
- debug_assert ! ( matches!( parsed, syn :: ImplItem :: Type ( _) ) ) ;
131
+ let parsed: ImplItem = parse2 ( tokens) . expect ( "it is a valid type item" ) ;
132
+ debug_assert ! ( matches!( parsed, ImplItem :: Type ( _) ) ) ;
130
133
131
134
final_impl_block. items . push ( parsed)
132
135
}
@@ -136,7 +139,7 @@ pub(crate) fn derive_impl_inner(input: TokenStream) -> Result<TokenStream> {
136
139
}
137
140
138
141
pub fn derive_impl ( attrs : TokenStream , input : TokenStream ) -> Result < TokenStream > {
139
- let implementing_type: syn :: TypePath = syn :: parse2 ( attrs. clone ( ) ) ?;
142
+ let implementing_type: TypePath = parse2 ( attrs. clone ( ) ) ?;
140
143
// ideas for sam:
141
144
// let other_path_tokens = magic_macro!(path_to_other_path_token);
142
145
// let foreign_trait_def_token: Syn::TraitItem = magic_macro!(frame_system::Config);
0 commit comments