@@ -31,34 +31,74 @@ pub(super) struct Opt {
31
31
32
32
pub ( super ) fn do_generate_bridge ( path : & Path , opt : Opt ) -> Vec < u8 > {
33
33
let header = false ;
34
- generate ( path, opt, header)
34
+ generate_from_path ( path, opt, header)
35
35
}
36
36
37
37
pub ( super ) fn do_generate_header ( path : & Path , opt : Opt ) -> Vec < u8 > {
38
38
let header = true ;
39
- generate ( path, opt, header)
39
+ generate_from_path ( path, opt, header)
40
40
}
41
41
42
- fn generate ( path : & Path , opt : Opt , header : bool ) -> Vec < u8 > {
42
+ fn generate_from_path ( path : & Path , opt : Opt , header : bool ) -> Vec < u8 > {
43
43
let source = match fs:: read_to_string ( path) {
44
44
Ok ( source) => source,
45
45
Err ( err) => format_err ( path, "" , Error :: Io ( err) ) ,
46
46
} ;
47
- match ( || -> Result < _ > {
48
- proc_macro2:: fallback:: force ( ) ;
49
- let ref mut errors = Errors :: new ( ) ;
50
- let syntax = syn:: parse_file ( & source) ?;
51
- let bridge = find:: find_bridge_mod ( syntax) ?;
52
- let ref namespace = bridge. namespace ;
53
- let ref apis = syntax:: parse_items ( errors, bridge. module ) ;
54
- let ref types = Types :: collect ( errors, apis) ;
55
- errors. propagate ( ) ?;
56
- check:: typecheck ( errors, namespace, apis, types) ;
57
- errors. propagate ( ) ?;
58
- let out = write:: gen ( namespace, apis, types, opt, header) ;
59
- Ok ( out)
60
- } ) ( ) {
61
- Ok ( out) => out. content ( ) ,
47
+ match generate ( & source, opt, header) {
48
+ Ok ( out) => out,
62
49
Err ( err) => format_err ( path, & source, err) ,
63
50
}
64
51
}
52
+
53
+ fn generate ( source : & str , opt : Opt , header : bool ) -> Result < Vec < u8 > > {
54
+ proc_macro2:: fallback:: force ( ) ;
55
+ let ref mut errors = Errors :: new ( ) ;
56
+ let syntax = syn:: parse_file ( & source) ?;
57
+ let bridge = find:: find_bridge_mod ( syntax) ?;
58
+ let ref namespace = bridge. namespace ;
59
+ let ref apis = syntax:: parse_items ( errors, bridge. module ) ;
60
+ let ref types = Types :: collect ( errors, apis) ;
61
+ errors. propagate ( ) ?;
62
+ check:: typecheck ( errors, namespace, apis, types) ;
63
+ errors. propagate ( ) ?;
64
+ let out = write:: gen ( namespace, apis, types, opt, header) ;
65
+ Ok ( out. content ( ) )
66
+ }
67
+
68
+ #[ cfg( test) ]
69
+ mod tests {
70
+ use crate :: gen:: { generate, Opt } ;
71
+
72
+ const CPP_EXAMPLE : & ' static str = r#"
73
+ #[cxx::bridge]
74
+ mod ffi {
75
+ extern "C" {
76
+ pub fn do_cpp_thing(foo: &str);
77
+ }
78
+ }
79
+ "# ;
80
+
81
+ #[ test]
82
+ fn test_cpp ( ) {
83
+ let opts = Opt {
84
+ include : Vec :: new ( ) ,
85
+ cxx_impl_annotations : None ,
86
+ } ;
87
+ let output = generate ( CPP_EXAMPLE , opts, false ) . unwrap ( ) ;
88
+ let output = std:: str:: from_utf8 ( & output) . unwrap ( ) ;
89
+ // To avoid continual breakage we won't test every byte.
90
+ // Let's look for the major features.
91
+ assert ! ( output. contains( "void cxxbridge03$do_cpp_thing(::rust::Str::Repr foo)" ) ) ;
92
+ }
93
+
94
+ #[ test]
95
+ fn test_annotation ( ) {
96
+ let opts = Opt {
97
+ include : Vec :: new ( ) ,
98
+ cxx_impl_annotations : Some ( "ANNOTATION" . to_string ( ) ) ,
99
+ } ;
100
+ let output = generate ( CPP_EXAMPLE , opts, false ) . unwrap ( ) ;
101
+ let output = std:: str:: from_utf8 ( & output) . unwrap ( ) ;
102
+ assert ! ( output. contains( "ANNOTATION void cxxbridge03$do_cpp_thing(::rust::Str::Repr foo)" ) ) ;
103
+ }
104
+ }
0 commit comments