11
22use std:: { io:: Read , fs:: File } ;
33use proc_macro2:: { TokenTree as TokenTree2 , Group , TokenStream as TokenStream2 , Delimiter , Span , Literal } ;
4- use crate :: { trees:: { sg_err, result:: TreeResult , loader:: { load_file_and_automake_tree , LoadFileAndAutoMakeTreeErr } , ttry, group:: g_stringify} , exprs:: literal:: { ExprLit , ExprLitTryNewErr } } ;
4+ use crate :: { trees:: { sg_err, result:: TreeResult , loader:: { load_file_and_automake_tree_fn , LoadFileAndAutoMakeTreeErr } , ttry, group:: g_stringify} , exprs:: literal:: { ExprLit , ExprLitTryNewErr } } ;
55
66/// A trait that specifies the final behavior for the `include` macro.
77pub trait BehMacroInclude {
@@ -16,10 +16,14 @@ pub trait BehMacroInclude {
1616 group_span : Span ,
1717 // `span` indicating a literal occurrence or group describing a future path.
1818 literal_span : Span
19- ) -> TreeResult < Option < Self :: Result > > ;
19+ ) -> TreeResult < Self :: Result > ;
20+
21+ /// Create an empty valid tree.
22+ fn make_empty_tree (
23+ group_span : Span ,
24+ ) -> Self :: Result ;
2025}
2126
22-
2327/// An argument, basically a path, written in `literals` or created with
2428/// a `group` via `stringify`.
2529#[ derive( Debug ) ]
@@ -32,9 +36,10 @@ pub enum BehMacroArg0 {
3236}
3337
3438impl BehMacroArg0 {
35- /// Get a data string without special characters, with final escaping (if required).
39+ /// Get a data string without special characters,
40+ /// with final escaping (if required).
3641 #[ inline]
37- pub fn get_str < R > (
42+ pub fn get_str_fn < R > (
3843 & self ,
3944
4045 next : impl FnOnce ( & ' _ str ) -> R ,
@@ -45,7 +50,12 @@ impl BehMacroArg0 {
4550 Self :: ExpMakeExprLit ( a) => {
4651 ExprLit :: try_new_fn (
4752 a,
48- |a| next ( & a) ,
53+ |a| {
54+ let result = next ( & a) ;
55+ drop ( a) ;
56+
57+ result
58+ } ,
4959 err
5060 )
5161 }
@@ -59,15 +69,25 @@ pub (crate) enum IncludeTt {}
5969
6070impl BehMacroInclude for IncludeTt {
6171 type Result = TokenTree2 ;
62-
72+
73+ fn make_empty_tree ( group_span : Span ) -> Self :: Result {
74+ let mut ngroup = Group :: new (
75+ Delimiter :: None ,
76+ TokenStream2 :: new ( ) ,
77+ ) ;
78+ ngroup. set_span ( group_span) ;
79+
80+ TokenTree2 :: Group ( ngroup)
81+ }
82+
6383 fn make_tree (
6484 arg0 : BehMacroArg0 ,
6585
6686 group_span : Span ,
6787 literal_span : Span ,
68- ) -> TreeResult < Option < Self :: Result > > {
69- arg0. get_str (
70- |sspath| load_file_and_automake_tree (
88+ ) -> TreeResult < Self :: Result > {
89+ arg0. get_str_fn (
90+ |sspath| load_file_and_automake_tree_fn (
7191 sspath,
7292
7393 |_| { } ,
@@ -84,7 +104,7 @@ impl BehMacroInclude for IncludeTt {
84104 ngroup. set_span ( group_span) ;
85105
86106 return TreeResult :: Ok (
87- Some ( TokenTree2 :: Group ( ngroup) )
107+ TokenTree2 :: Group ( ngroup)
88108 ) ;
89109 } ,
90110 |e| TreeResult :: Err ( e. into_tt_err ( literal_span) ) ,
@@ -102,15 +122,25 @@ pub (crate) enum IncludeTtAndFixUnkStartToken {}
102122
103123impl BehMacroInclude for IncludeTtAndFixUnkStartToken {
104124 type Result = TokenTree2 ;
105-
125+
126+ fn make_empty_tree ( group_span : Span ) -> Self :: Result {
127+ let mut ngroup = Group :: new (
128+ Delimiter :: None ,
129+ TokenStream2 :: new ( ) ,
130+ ) ;
131+ ngroup. set_span ( group_span) ;
132+
133+ TokenTree2 :: Group ( ngroup)
134+ }
135+
106136 fn make_tree (
107137 arg0 : BehMacroArg0 ,
108138
109139 group_span : Span ,
110140 literal_span : Span ,
111- ) -> TreeResult < Option < Self :: Result > > {
112- arg0. get_str (
113- |sspath| load_file_and_automake_tree (
141+ ) -> TreeResult < Self :: Result > {
142+ arg0. get_str_fn (
143+ |sspath| load_file_and_automake_tree_fn (
114144 sspath,
115145
116146 |p_string| { /*fix unk start token*/
@@ -177,7 +207,7 @@ impl BehMacroInclude for IncludeTtAndFixUnkStartToken {
177207 ngroup. set_span ( group_span) ;
178208
179209 return TreeResult :: Ok (
180- Some ( TokenTree2 :: Group ( ngroup) )
210+ TokenTree2 :: Group ( ngroup)
181211 ) ;
182212 } ,
183213 |e| TreeResult :: Err ( e. into_tt_err ( literal_span) ) ,
@@ -194,30 +224,34 @@ pub (crate) enum IncludeStr {}
194224impl BehMacroInclude for IncludeStr {
195225 type Result = TokenTree2 ;
196226
227+ fn make_empty_tree ( group_span : Span ) -> Self :: Result {
228+ let mut lit = Literal :: string ( "" ) ;
229+ lit. set_span ( group_span) ;
230+
231+ TokenTree2 :: Literal ( lit)
232+ }
233+
197234 fn make_tree (
198235 arg0 : BehMacroArg0 ,
199236
200237 group_span : Span ,
201238 literal_span : Span
202- ) -> TreeResult < Option < Self :: Result > > {
203- arg0. get_str (
239+ ) -> TreeResult < Self :: Result > {
240+ arg0. get_str_fn (
204241 |sspath| {
205242 let data = match std:: fs:: read_to_string ( sspath) {
206243 Ok ( a) => a,
207- Err ( e) => return LoadFileAndAutoMakeTreeErr :: ReadToString {
208- err : e,
209- path : sspath
210- }
211- . into_tt_err ( literal_span)
212- . into ( ) ,
244+ Err ( e) => return LoadFileAndAutoMakeTreeErr :: read_to_string ( e, sspath)
245+ . into_tt_err ( literal_span)
246+ . into ( ) ,
213247 } ;
214248
215249 let mut lit = Literal :: string ( & data) ;
216250 lit. set_span ( group_span) ;
217251
218- return TreeResult :: Ok (
219- Some ( TokenTree2 :: Literal ( lit) )
220- ) ;
252+ TreeResult :: Ok (
253+ TokenTree2 :: Literal ( lit)
254+ )
221255 } ,
222256 |e| TreeResult :: Err ( e. into_tt_err ( literal_span) ) ,
223257 )
@@ -231,33 +265,34 @@ pub (crate) enum IncludeArr {}
231265impl BehMacroInclude for IncludeArr {
232266 type Result = TokenTree2 ;
233267
268+ fn make_empty_tree ( group_span : Span ) -> Self :: Result {
269+ let mut lit = Literal :: byte_string ( & [ ] ) ;
270+ lit. set_span ( group_span) ;
271+
272+ TokenTree2 :: Literal ( lit)
273+ }
274+
234275 fn make_tree (
235276 arg0 : BehMacroArg0 ,
236277
237278 group_span : Span ,
238279 literal_span : Span
239- ) -> TreeResult < Option < Self :: Result > > {
240- arg0. get_str (
280+ ) -> TreeResult < Self :: Result > {
281+ arg0. get_str_fn (
241282 |sspath| {
242283 let vec = {
243284 let mut file = match File :: open ( sspath) {
244285 Ok ( a) => a,
245- Err ( e) => return LoadFileAndAutoMakeTreeErr :: ReadToString {
246- err : e,
247- path : sspath
248- }
249- . into_tt_err ( literal_span)
250- . into ( ) ,
286+ Err ( e) => return LoadFileAndAutoMakeTreeErr :: read_to_string ( e, sspath)
287+ . into_tt_err ( literal_span)
288+ . into ( ) ,
251289 } ;
252290
253291 let mut vec = Vec :: new ( ) ; // capacity is not required.
254292 if let Err ( e) = file. read_to_end ( & mut vec) {
255- return LoadFileAndAutoMakeTreeErr :: ReadToString {
256- err : e,
257- path : sspath
258- }
259- . into_tt_err ( literal_span)
260- . into ( ) ;
293+ return LoadFileAndAutoMakeTreeErr :: read_to_string ( e, sspath)
294+ . into_tt_err ( literal_span)
295+ . into ( ) ;
261296 } ;
262297
263298 vec
@@ -267,7 +302,7 @@ impl BehMacroInclude for IncludeArr {
267302 lit. set_span ( group_span) ;
268303
269304 return TreeResult :: Ok (
270- Some ( TokenTree2 :: Literal ( lit) )
305+ TokenTree2 :: Literal ( lit)
271306 ) ;
272307 } ,
273308 |e| TreeResult :: Err ( e. into_tt_err ( literal_span) ) ,
@@ -278,7 +313,7 @@ impl BehMacroInclude for IncludeArr {
278313/// Build macro `include`/`include_str`/`include_arr`.
279314pub fn macro_rule_include < A > (
280315 group : & ' _ Group ,
281- ) -> TreeResult < Option < A :: Result > > where A : BehMacroInclude {
316+ ) -> TreeResult < A :: Result > where A : BehMacroInclude {
282317 let stream0 = {
283318 let all_streams = group. stream ( ) ;
284319 let mut iter = all_streams. into_iter ( ) ;
@@ -294,20 +329,20 @@ pub fn macro_rule_include<A>(
294329 } ;
295330
296331 match stream0 {
297- None => TreeResult :: Ok ( None ) ,
332+ None => TreeResult :: Ok ( A :: make_empty_tree ( group . span ( ) ) ) ,
298333 Some ( TokenTree2 :: Group ( g_stream) ) => {
299334 // The path is a group of TokenTrees that can be converted to
300335 // a string and concatenated.
301336
302- match ttry ! ( g_stringify( & g_stream) ) {
337+ match ttry ! ( g_stringify( & g_stream) ) {
303338 Some ( stringify) => A :: make_tree (
304339 // The value is already ready to be used as a path.
305340 BehMacroArg0 :: Stringify ( stringify) ,
306341
307342 group. span ( ) ,
308343 g_stream. span ( )
309344 ) ,
310- None => TreeResult :: Ok ( None ) ,
345+ None => TreeResult :: Ok ( A :: make_empty_tree ( group . span ( ) ) ) ,
311346 }
312347 } ,
313348 Some ( TokenTree2 :: Literal ( literal) ) => {
0 commit comments