@@ -17,6 +17,8 @@ use std::sync::Once;
17
17
mod options;
18
18
use crate :: options:: builder_from_flags;
19
19
20
+ mod parse_callbacks;
21
+
20
22
// Run `rustfmt` on the given source string and return a tuple of the formatted
21
23
// bindings, and rustfmt's stderr.
22
24
fn rustfmt ( source : String ) -> ( String , String ) {
@@ -115,7 +117,7 @@ The latest `rustfmt` is required to run the `bindgen` test suite. Install
115
117
116
118
fn compare_generated_header (
117
119
header : & PathBuf ,
118
- builder : Builder ,
120
+ builder : BuilderState ,
119
121
check_roundtrip : bool ,
120
122
) -> Result < ( ) , Error > {
121
123
let file_name = header. file_name ( ) . ok_or ( Error :: new (
@@ -190,13 +192,8 @@ fn compare_generated_header(
190
192
) ,
191
193
} ;
192
194
193
- let flags = if check_roundtrip {
194
- let mut flags = builder. command_line_flags ( ) ;
195
- flags. insert ( 0 , "bindgen" . into ( ) ) ;
196
- flags
197
- } else {
198
- vec ! [ ]
199
- } ;
195
+
196
+ let ( builder, roundtrip_builder) = builder. into_builder ( check_roundtrip) ?;
200
197
201
198
// We skip the generate() error here so we get a full diff below
202
199
let ( actual, rustfmt_stderr) = match builder. generate ( ) {
@@ -262,8 +259,7 @@ fn compare_generated_header(
262
259
return Err ( Error :: new ( ErrorKind :: Other , "Header and binding differ! Run with BINDGEN_OVERWRITE_EXPECTED=1 in the environment to automatically overwrite the expectation or with BINDGEN_TESTS_DIFFTOOL=meld to do this manually." ) ) ;
263
260
}
264
261
265
- if check_roundtrip {
266
- let roundtrip_builder = builder_from_flags ( flags. into_iter ( ) ) ?. 0 ;
262
+ if let Some ( roundtrip_builder) = roundtrip_builder {
267
263
if let Err ( e) =
268
264
compare_generated_header ( & header, roundtrip_builder, false )
269
265
{
@@ -281,7 +277,29 @@ fn builder() -> Builder {
281
277
bindgen:: builder ( ) . disable_header_comment ( )
282
278
}
283
279
284
- fn create_bindgen_builder ( header : & PathBuf ) -> Result < Builder , Error > {
280
+ struct BuilderState {
281
+ builder : Builder ,
282
+ parse_callbacks : Vec < String > ,
283
+ }
284
+
285
+ impl BuilderState {
286
+ fn into_builder ( self , with_roundtrip_builder : bool ) -> Result < ( Builder , Option < BuilderState > ) , Error > {
287
+ let roundtrip_builder = if with_roundtrip_builder {
288
+ let mut flags = self . builder . command_line_flags ( ) ;
289
+ flags. insert ( 0 , "bindgen" . into ( ) ) ;
290
+ let mut builder = builder_from_flags ( flags. into_iter ( ) ) ?. 0 ;
291
+ for parse_cb in & self . parse_callbacks {
292
+ builder = builder. parse_callbacks ( parse_callbacks:: lookup ( parse_cb) ) ;
293
+ }
294
+ Some ( BuilderState { builder, parse_callbacks : self . parse_callbacks } )
295
+ } else {
296
+ None
297
+ } ;
298
+ Ok ( ( self . builder , roundtrip_builder) )
299
+ }
300
+ }
301
+
302
+ fn create_bindgen_builder ( header : & PathBuf ) -> Result < BuilderState , Error > {
285
303
#[ cfg( feature = "logging" ) ]
286
304
let _ = env_logger:: try_init ( ) ;
287
305
@@ -290,6 +308,7 @@ fn create_bindgen_builder(header: &PathBuf) -> Result<Builder, Error> {
290
308
291
309
// Scoop up bindgen-flags from test header
292
310
let mut flags = Vec :: with_capacity ( 2 ) ;
311
+ let mut parse_callbacks = vec ! [ ] ;
293
312
294
313
for line in reader. lines ( ) {
295
314
let line = line?;
@@ -311,6 +330,12 @@ fn create_bindgen_builder(header: &PathBuf) -> Result<Builder, Error> {
311
330
. map ( ToString :: to_string)
312
331
. chain ( flags)
313
332
. collect ( ) ;
333
+ } else if line. contains ( "bindgen-parse-callbacks: " ) {
334
+ let parse_cb = line
335
+ . split ( "bindgen-parse-callbacks: " )
336
+ . last ( )
337
+ . unwrap ( ) ;
338
+ parse_callbacks. push ( parse_cb. to_owned ( ) ) ;
314
339
}
315
340
}
316
341
@@ -353,7 +378,11 @@ fn create_bindgen_builder(header: &PathBuf) -> Result<Builder, Error> {
353
378
. map ( ToString :: to_string)
354
379
. chain ( flags. into_iter ( ) ) ;
355
380
356
- builder_from_flags ( args) . map ( |( builder, _, _) | builder)
381
+ let mut builder = builder_from_flags ( args) ?. 0 ;
382
+ for parse_cb in & parse_callbacks {
383
+ builder = builder. parse_callbacks ( parse_callbacks:: lookup ( parse_cb) ) ;
384
+ }
385
+ Ok ( BuilderState { builder, parse_callbacks } )
357
386
}
358
387
359
388
macro_rules! test_header {
0 commit comments