Skip to content

Commit

Permalink
cxx-qt-gen: ensure that constructor and threading free methods are qu…
Browse files Browse the repository at this point in the history
…alified

Related to KDAB#404
  • Loading branch information
ahayzen-kdab committed Jul 24, 2023
1 parent e6ca8c2 commit 86a5233
Show file tree
Hide file tree
Showing 5 changed files with 69 additions and 50 deletions.
46 changes: 25 additions & 21 deletions crates/cxx-qt-gen/src/generator/rust/constructor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,7 @@ pub fn generate(
qobject_idents: &QObjectName,
namespace: &NamespaceName,
qualified_mappings: &BTreeMap<Ident, Path>,
module_ident: &Ident,
) -> Result<GeneratedRustQObjectBlocks> {
if constructors.is_empty() {
return Ok(generate_default_constructor(qobject_idents, namespace));
Expand Down Expand Up @@ -280,7 +281,7 @@ pub fn generate(
result.cxx_qt_mod_contents.append(&mut vec![parse_quote_spanned! {
constructor.imp.span() =>
#[doc(hidden)]
pub fn #route_arguments_rust(#(#route_arguments_parameters),*) -> #arguments_rust {
pub fn #route_arguments_rust(#(#route_arguments_parameters),*) -> #module_ident::#arguments_rust {
// These variables won't be used if the corresponding argument list is empty.
#[allow(unused_variables)]
#[allow(clippy::let_unit_value)]
Expand All @@ -290,18 +291,18 @@ pub fn generate(
initialize_arguments
) = <#qobject_name_rust_qualified as cxx_qt::Constructor<(#(#argument_types,)*)>>
::route_arguments((#(#assign_arguments,)*));
#arguments_rust {
base: #init_base_arguments,
initialize: #init_initalize_arguments,
new: #init_new_arguments,
#module_ident::#arguments_rust {
base: #module_ident::#init_base_arguments,
initialize: #module_ident::#init_initalize_arguments,
new: #module_ident::#init_new_arguments,
}
}
},
parse_quote_spanned! {
constructor.imp.span() =>
#[doc(hidden)]
#[allow(unused_variables)]
pub fn #new_rust(new_arguments: #new_arguments_rust) -> std::boxed::Box<#rust_struct_name_rust> {
pub fn #new_rust(new_arguments: #module_ident::#new_arguments_rust) -> std::boxed::Box<#rust_struct_name_rust> {
std::boxed::Box::new(<#qobject_name_rust_qualified as cxx_qt::Constructor<(#(#argument_types,)*)>>::new((#(#extract_new_arguments,)*)))
}
},
Expand All @@ -311,7 +312,7 @@ pub fn generate(
#[allow(unused_variables)]
pub fn #initialize_rust(
qobject: core::pin::Pin<&mut #qobject_name_rust_qualified>,
initialize_arguments: #initialize_arguments_rust
initialize_arguments: #module_ident::#initialize_arguments_rust
) {
<#qobject_name_rust_qualified as cxx_qt::Constructor<(#(#argument_types,)*)>>::initialize(
qobject,
Expand All @@ -327,6 +328,8 @@ mod tests {
use super::*;
use crate::tests::assert_tokens_eq;

use quote::format_ident;

fn mock_constructor() -> Constructor {
Constructor {
new_arguments: vec![],
Expand All @@ -352,6 +355,7 @@ mod tests {
&mock_name(),
&mock_namespace(),
&BTreeMap::<Ident, Path>::default(),
&format_ident!("ffi"),
)
.unwrap()
}
Expand Down Expand Up @@ -463,17 +467,17 @@ mod tests {
&blocks.cxx_qt_mod_contents[0],
quote! {
#[doc(hidden)]
pub fn route_arguments_my_object_0() -> CxxQtConstructorArgumentsMyObject0
pub fn route_arguments_my_object_0() -> ffi::CxxQtConstructorArgumentsMyObject0
{
#[allow(unused_variables)]
#[allow(clippy::let_unit_value)]
let (new_arguments, base_arguments, initialize_arguments) =
<MyObject as cxx_qt::Constructor<()> >::route_arguments(());

CxxQtConstructorArgumentsMyObject0 {
base: CxxQtConstructorBaseArgumentsMyObject0 { not_empty: 0 },
initialize: CxxQtConstructorInitializeArgumentsMyObject0 { not_empty: 0 },
new: CxxQtConstructorNewArgumentsMyObject0 { not_empty : 0 },
ffi::CxxQtConstructorArgumentsMyObject0 {
base: ffi::CxxQtConstructorBaseArgumentsMyObject0 { not_empty: 0 },
initialize: ffi::CxxQtConstructorInitializeArgumentsMyObject0 { not_empty: 0 },
new: ffi::CxxQtConstructorNewArgumentsMyObject0 { not_empty : 0 },
}
}
},
Expand All @@ -483,7 +487,7 @@ mod tests {
quote! {
#[doc(hidden)]
#[allow(unused_variables)]
pub fn new_rs_my_object_0(new_arguments: CxxQtConstructorNewArgumentsMyObject0) -> std::boxed::Box<MyObjectRust> {
pub fn new_rs_my_object_0(new_arguments: ffi::CxxQtConstructorNewArgumentsMyObject0) -> std::boxed::Box<MyObjectRust> {
std::boxed::Box::new(
<MyObject as cxx_qt::Constructor<()> >::new(())
)
Expand All @@ -497,7 +501,7 @@ mod tests {
#[allow(unused_variables)]
pub fn initialize_my_object_0(
qobject: core::pin::Pin<&mut MyObject>,
initialize_arguments: CxxQtConstructorInitializeArgumentsMyObject0)
initialize_arguments: ffi::CxxQtConstructorInitializeArgumentsMyObject0)
{
<MyObject as cxx_qt::Constructor<()> >::initialize(qobject, ());
}
Expand Down Expand Up @@ -584,24 +588,24 @@ mod tests {
&blocks.cxx_qt_mod_contents[3],
quote! {
#[doc(hidden)]
pub fn route_arguments_my_object_1(arg0: *const QObject) -> CxxQtConstructorArgumentsMyObject1
pub fn route_arguments_my_object_1(arg0: *const QObject) -> ffi::CxxQtConstructorArgumentsMyObject1
{
#[allow(unused_variables)]
#[allow(clippy::let_unit_value)]
let (new_arguments, base_arguments, initialize_arguments) =
<MyObject as cxx_qt::Constructor<(*const QObject,)> >::route_arguments((arg0,));

CxxQtConstructorArgumentsMyObject1 {
base: CxxQtConstructorBaseArgumentsMyObject1 {
ffi::CxxQtConstructorArgumentsMyObject1 {
base: ffi::CxxQtConstructorBaseArgumentsMyObject1 {
arg0: base_arguments.0,
arg1: base_arguments.1,
arg2: base_arguments.2,
},
initialize: CxxQtConstructorInitializeArgumentsMyObject1 {
initialize: ffi::CxxQtConstructorInitializeArgumentsMyObject1 {
arg0: initialize_arguments.0,
arg1: initialize_arguments.1,
},
new: CxxQtConstructorNewArgumentsMyObject1 {
new: ffi::CxxQtConstructorNewArgumentsMyObject1 {
arg0: new_arguments.0,
},
}
Expand All @@ -613,7 +617,7 @@ mod tests {
quote! {
#[doc(hidden)]
#[allow(unused_variables)]
pub fn new_rs_my_object_1(new_arguments: CxxQtConstructorNewArgumentsMyObject1) -> std::boxed::Box<MyObjectRust> {
pub fn new_rs_my_object_1(new_arguments: ffi::CxxQtConstructorNewArgumentsMyObject1) -> std::boxed::Box<MyObjectRust> {
std::boxed::Box::new(
<MyObject as cxx_qt::Constructor<(*const QObject,)> >::new(
(new_arguments.arg0,)))
Expand All @@ -627,7 +631,7 @@ mod tests {
#[allow(unused_variables)]
pub fn initialize_my_object_1(
qobject: core::pin::Pin<&mut MyObject>,
initialize_arguments: CxxQtConstructorInitializeArgumentsMyObject1)
initialize_arguments: ffi::CxxQtConstructorInitializeArgumentsMyObject1)
{
<MyObject as cxx_qt::Constructor<(*const QObject,)> >::initialize(
qobject,
Expand Down
6 changes: 5 additions & 1 deletion crates/cxx-qt-gen/src/generator/rust/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,11 @@ impl GeneratedRustBlocks {
.qobjects
.values()
.map(|qobject| {
GeneratedRustQObject::from(qobject, &parser.cxx_qt_data.qualified_mappings)
GeneratedRustQObject::from(
qobject,
&parser.cxx_qt_data.qualified_mappings,
&parser.passthrough_module.ident,
)
})
.collect::<Result<Vec<GeneratedRustQObject>>>()?,
})
Expand Down
7 changes: 7 additions & 0 deletions crates/cxx-qt-gen/src/generator/rust/qobject.rs
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ impl GeneratedRustQObject {
pub fn from(
qobject: &ParsedQObject,
qualified_mappings: &BTreeMap<Ident, Path>,
module_ident: &Ident,
) -> Result<GeneratedRustQObject> {
// Create the base object
let qobject_idents = QObjectName::from(qobject);
Expand Down Expand Up @@ -127,6 +128,7 @@ impl GeneratedRustQObject {
&qobject_idents,
&namespace_idents,
qualified_mappings,
module_ident,
)?);
}

Expand All @@ -152,6 +154,7 @@ impl GeneratedRustQObject {
&qobject_idents,
&namespace_idents,
qualified_mappings,
module_ident,
)?);

generated.blocks.append(&mut cxxqttype::generate(
Expand Down Expand Up @@ -230,6 +233,7 @@ mod tests {

use crate::parser::Parser;
use crate::tests::assert_tokens_eq;
use quote::format_ident;
use syn::{parse_quote, ItemMod};

#[test]
Expand All @@ -248,6 +252,7 @@ mod tests {
let rust = GeneratedRustQObject::from(
parser.cxx_qt_data.qobjects.values().next().unwrap(),
&BTreeMap::<Ident, Path>::default(),
&format_ident!("ffi"),
)
.unwrap();
assert_eq!(rust.cpp_struct_ident, "MyObject");
Expand All @@ -271,6 +276,7 @@ mod tests {
let rust = GeneratedRustQObject::from(
parser.cxx_qt_data.qobjects.values().next().unwrap(),
&BTreeMap::<Ident, Path>::default(),
&format_ident!("ffi"),
)
.unwrap();
assert_eq!(rust.cpp_struct_ident, "MyObject");
Expand All @@ -294,6 +300,7 @@ mod tests {
let rust = GeneratedRustQObject::from(
parser.cxx_qt_data.qobjects.values().next().unwrap(),
&BTreeMap::<Ident, Path>::default(),
&format_ident!("ffi"),
)
.unwrap();
assert_eq!(rust.blocks.cxx_mod_contents.len(), 6);
Expand Down
32 changes: 18 additions & 14 deletions crates/cxx-qt-gen/src/generator/rust/threading.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ pub fn generate(
qobject_ident: &QObjectName,
namespace_ident: &NamespaceName,
qualified_mappings: &BTreeMap<Ident, Path>,
module_ident: &Ident,
) -> Result<GeneratedRustQObjectBlocks> {
let mut blocks = GeneratedRustQObjectBlocks::default();

Expand Down Expand Up @@ -91,13 +92,13 @@ pub fn generate(
type BoxedQueuedFn = #cxx_qt_thread_queued_fn_ident;
type ThreadingTypeId = cxx::type_id!(#cxx_qt_thread_ident_type_id_str);

fn qt_thread(&self) -> #cxx_qt_thread_ident
fn qt_thread(&self) -> #module_ident::#cxx_qt_thread_ident
{
self.cxx_qt_ffi_qt_thread()
}

#[doc(hidden)]
fn queue<F>(cxx_qt_thread: &#cxx_qt_thread_ident, f: F) -> std::result::Result<(), cxx::Exception>
fn queue<F>(cxx_qt_thread: &#module_ident::#cxx_qt_thread_ident, f: F) -> std::result::Result<(), cxx::Exception>
where
F: FnOnce(core::pin::Pin<&mut #qualified_impl>),
F: Send + 'static,
Expand All @@ -114,19 +115,19 @@ pub fn generate(
(arg.inner)(obj)
}
let arg = #cxx_qt_thread_queued_fn_ident { inner: std::boxed::Box::new(f) };
#cxx_qt_thread_queue_fn(cxx_qt_thread, func, std::boxed::Box::new(arg))
#module_ident::#cxx_qt_thread_queue_fn(cxx_qt_thread, func, std::boxed::Box::new(arg))
}

#[doc(hidden)]
fn threading_clone(cxx_qt_thread: &#cxx_qt_thread_ident) -> #cxx_qt_thread_ident
fn threading_clone(cxx_qt_thread: &#module_ident::#cxx_qt_thread_ident) -> #module_ident::#cxx_qt_thread_ident
{
#cxx_qt_thread_clone(cxx_qt_thread)
#module_ident::#cxx_qt_thread_clone(cxx_qt_thread)
}

#[doc(hidden)]
fn threading_drop(cxx_qt_thread: &mut #cxx_qt_thread_ident)
fn threading_drop(cxx_qt_thread: &mut #module_ident::#cxx_qt_thread_ident)
{
#cxx_qt_thread_drop(cxx_qt_thread);
#module_ident::#cxx_qt_thread_drop(cxx_qt_thread);
}
}
},
Expand Down Expand Up @@ -159,6 +160,8 @@ mod tests {

use crate::parser::qobject::tests::create_parsed_qobject;

use quote::format_ident;

#[test]
fn test_generate_rust_threading() {
let qobject = create_parsed_qobject();
Expand All @@ -169,6 +172,7 @@ mod tests {
&qobject_idents,
&namespace_ident,
&BTreeMap::<Ident, Path>::default(),
&format_ident!("ffi"),
)
.unwrap();

Expand Down Expand Up @@ -231,13 +235,13 @@ mod tests {
type BoxedQueuedFn = MyObjectCxxQtThreadQueuedFn;
type ThreadingTypeId = cxx::type_id!("MyObjectCxxQtThread");

fn qt_thread(&self) -> MyObjectCxxQtThread
fn qt_thread(&self) -> ffi::MyObjectCxxQtThread
{
self.cxx_qt_ffi_qt_thread()
}

#[doc(hidden)]
fn queue<F>(cxx_qt_thread: &MyObjectCxxQtThread, f: F) -> std::result::Result<(), cxx::Exception>
fn queue<F>(cxx_qt_thread: &ffi::MyObjectCxxQtThread, f: F) -> std::result::Result<(), cxx::Exception>
where
F: FnOnce(core::pin::Pin<&mut MyObject>),
F: Send + 'static,
Expand All @@ -254,19 +258,19 @@ mod tests {
(arg.inner)(obj)
}
let arg = MyObjectCxxQtThreadQueuedFn { inner: std::boxed::Box::new(f) };
cxx_qt_ffi_my_object_queue_boxed_fn(cxx_qt_thread, func, std::boxed::Box::new(arg))
ffi::cxx_qt_ffi_my_object_queue_boxed_fn(cxx_qt_thread, func, std::boxed::Box::new(arg))
}

#[doc(hidden)]
fn threading_clone(cxx_qt_thread: &MyObjectCxxQtThread) -> MyObjectCxxQtThread
fn threading_clone(cxx_qt_thread: &ffi::MyObjectCxxQtThread) -> ffi::MyObjectCxxQtThread
{
cxx_qt_ffi_my_object_threading_clone(cxx_qt_thread)
ffi::cxx_qt_ffi_my_object_threading_clone(cxx_qt_thread)
}

#[doc(hidden)]
fn threading_drop(cxx_qt_thread: &mut MyObjectCxxQtThread)
fn threading_drop(cxx_qt_thread: &mut ffi::MyObjectCxxQtThread)
{
cxx_qt_ffi_my_object_threading_drop(cxx_qt_thread);
ffi::cxx_qt_ffi_my_object_threading_drop(cxx_qt_thread);
}
}
},
Expand Down
Loading

0 comments on commit 86a5233

Please sign in to comment.