Skip to content

Commit 37ac2c2

Browse files
authored
Apply input module visibility to output module (#284)
This commit makes `#[swift_bridge::bridge]` respect the bridge module's visibility. Here's an example of using this. ```rust // enums.rs // NOTE that we can now use `pub mod`, `pub(crate) mod`, etc #[swift_bridge::bridge] pub mod ffi { enum MyEnum { VariantA, VariantB, VariantC, } } // lib.rs mod enums; use enums::ffi::MyEnum; #[swift_bridge::bridge] mod ffi { #[swift_bridge(already_declared)] enum MyEnum {} extern "Rust" { fn getEnum() -> MyEnum; } } ``` Closes #252.
1 parent 34ce1ff commit 37ac2c2

File tree

3 files changed

+22
-2
lines changed

3 files changed

+22
-2
lines changed

crates/swift-bridge-ir/src/codegen/generate_rust_tokens.rs

+18-1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ mod vec;
1818
impl ToTokens for SwiftBridgeModule {
1919
fn to_tokens(&self, tokens: &mut TokenStream) {
2020
let mod_name = &self.name;
21+
let vis = &self.vis;
2122
let swift_bridge_path = &self.swift_bridge_path;
2223

2324
let mut extern_rust_fn_tokens = vec![];
@@ -298,7 +299,7 @@ impl ToTokens for SwiftBridgeModule {
298299
let t = quote! {
299300
#[allow(non_snake_case)]
300301
#(#module_attributes)*
301-
mod #mod_name {
302+
#vis mod #mod_name {
302303
#module_inner
303304
}
304305
};
@@ -1045,4 +1046,20 @@ mod tests {
10451046
&expected_fn,
10461047
);
10471048
}
1049+
1050+
/// Verify that we apply the module's visibility to the output.
1051+
#[test]
1052+
fn module_visibility() {
1053+
let start = quote! {
1054+
pub(super) mod foo {
1055+
}
1056+
};
1057+
let expected = quote! {
1058+
#[allow(non_snake_case)]
1059+
pub(super) mod foo {
1060+
}
1061+
};
1062+
1063+
assert_tokens_eq(&parse_ok(start).to_token_stream(), &expected);
1064+
}
10481065
}

crates/swift-bridge-ir/src/lib.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
#![deny(missing_docs)]
99

1010
use proc_macro2::Ident;
11-
use syn::Path;
11+
use syn::{Path, Visibility};
1212

1313
use crate::bridge_module_attributes::CfgAttr;
1414
use crate::parse::TypeDeclarations;
@@ -58,6 +58,7 @@ const SWIFT_BRIDGE_PREFIX: &'static str = "__swift_bridge__";
5858
/// ```
5959
pub struct SwiftBridgeModule {
6060
name: Ident,
61+
vis: Visibility,
6162
types: TypeDeclarations,
6263
functions: Vec<ParsedExternFn>,
6364
swift_bridge_path: Path,

crates/swift-bridge-ir/src/parse.rs

+2
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ impl Parse for SwiftBridgeModuleAndErrors {
5757

5858
if let Ok(item_mod) = input.parse::<ItemMod>() {
5959
let module_name = item_mod.ident;
60+
let vis = item_mod.vis;
6061

6162
let mut functions = vec![];
6263
let mut type_declarations = TypeDeclarations::default();
@@ -125,6 +126,7 @@ impl Parse for SwiftBridgeModuleAndErrors {
125126

126127
let module = SwiftBridgeModule {
127128
name: module_name,
129+
vis,
128130
types: type_declarations,
129131
functions,
130132
swift_bridge_path: syn::parse2(quote! { swift_bridge }).unwrap(),

0 commit comments

Comments
 (0)