diff --git a/Cargo.lock b/Cargo.lock index e0e4ba10..8e081992 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -524,7 +524,7 @@ checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.41", ] [[package]] @@ -954,7 +954,7 @@ dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.41", ] [[package]] @@ -1264,7 +1264,7 @@ dependencies = [ "proc-macro2", "quote", "scratch", - "syn 2.0.38", + "syn 2.0.41", ] [[package]] @@ -1281,7 +1281,7 @@ checksum = "2fa16a70dd58129e4dfffdff535fb1bce66673f7bbeec4a5a1765a504e1ccd84" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.41", ] [[package]] @@ -1736,7 +1736,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn 1.0.109", + "syn 2.0.41", "thiserror", ] @@ -1914,7 +1914,7 @@ checksum = "f95e2801cd355d4a1a3e3953ce6ee5ae9603a5c833455343a8bfe3f44d418246" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.41", ] [[package]] @@ -2219,7 +2219,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.41", ] [[package]] @@ -2289,7 +2289,7 @@ checksum = "ba330b70a5341d3bc730b8e205aaee97ddab5d9c448c4f51a7c2d924266fa8f9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.41", ] [[package]] @@ -3516,7 +3516,7 @@ checksum = "cfb77679af88f8b125209d354a202862602672222e7f2313fdd6dc349bad4712" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.41", ] [[package]] @@ -3948,7 +3948,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.41", ] [[package]] @@ -3989,7 +3989,7 @@ checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.41", ] [[package]] @@ -4288,7 +4288,7 @@ dependencies = [ "proc-macro2", "pyo3-macros-backend", "quote", - "syn 2.0.38", + "syn 2.0.41", ] [[package]] @@ -4300,7 +4300,7 @@ dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.41", ] [[package]] @@ -4990,7 +4990,7 @@ checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.41", ] [[package]] @@ -5012,7 +5012,7 @@ checksum = "8725e1dfadb3a50f7e5ce0b1a540466f6ed3fe7a0fca2ac2b8b831d31316bd00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.41", ] [[package]] @@ -5243,7 +5243,7 @@ checksum = "7d395866cb6778625150f77a430cc0af764ce0300f6a3d3413477785fa34b6c7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.41", ] [[package]] @@ -5326,9 +5326,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.38" +version = "2.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e96b79aaa137db8f61e26363a0c9b47d8b4ec75da28b7d1d614c2303e232408b" +checksum = "44c8b28c477cc3bf0e7966561e3460130e1255f7a1cf71931075f1c5e7a7e269" dependencies = [ "proc-macro2", "quote", @@ -5462,7 +5462,7 @@ checksum = "10712f02019e9288794769fba95cd6847df9874d49d871d062172f9dd41bc4cc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.41", ] [[package]] @@ -5586,7 +5586,7 @@ checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.41", ] [[package]] @@ -5693,7 +5693,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.41", ] [[package]] @@ -5902,7 +5902,7 @@ checksum = "f7e1ba1f333bd65ce3c9f27de592fcbc256dafe3af2717f56d7c87761fbaccf4" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.41", ] [[package]] @@ -6011,7 +6011,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.41", "wasm-bindgen-shared", ] @@ -6045,7 +6045,7 @@ checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.41", "wasm-bindgen-backend", "wasm-bindgen-shared", ] diff --git a/libraries/extensions/ros2-bridge/msg-gen-macro/Cargo.toml b/libraries/extensions/ros2-bridge/msg-gen-macro/Cargo.toml index 434e42ab..5b7b7e07 100644 --- a/libraries/extensions/ros2-bridge/msg-gen-macro/Cargo.toml +++ b/libraries/extensions/ros2-bridge/msg-gen-macro/Cargo.toml @@ -12,7 +12,7 @@ nom = "7" proc-macro2 = "1.0" quote = "1.0" regex = "1" -syn = "1.0" +syn = { version = "2.0.41", features = ["parsing"] } thiserror = "1.0" dora-ros2-bridge-msg-gen = { path = "../msg-gen" } diff --git a/libraries/extensions/ros2-bridge/msg-gen-macro/src/lib.rs b/libraries/extensions/ros2-bridge/msg-gen-macro/src/lib.rs index ae6d02ab..93fb09da 100644 --- a/libraries/extensions/ros2-bridge/msg-gen-macro/src/lib.rs +++ b/libraries/extensions/ros2-bridge/msg-gen-macro/src/lib.rs @@ -12,9 +12,43 @@ use std::path::Path; use dora_ros2_bridge_msg_gen::get_packages; use proc_macro::TokenStream; use quote::quote; +use syn::{punctuated::Punctuated, MetaNameValue, Token}; + +struct Config { + create_cxx_bridge: bool, +} + +impl syn::parse::Parse for Config { + fn parse(input: syn::parse::ParseStream<'_>) -> syn::Result { + let punctuated = Punctuated::::parse_terminated(input)?; + + let mut config = Self { + create_cxx_bridge: false, + }; + + for item in &punctuated { + let ident = item.path.require_ident()?; + if ident == "cxx_bridge" { + let syn::Expr::Lit(lit) = &item.value else { + return Err(syn::Error::new_spanned(&item.value, "invalid value, expected bool")); + }; + let syn::Lit::Bool(b) = &lit.lit else { + return Err(syn::Error::new_spanned(&lit.lit, "invalid value, expected bool")); + }; + config.create_cxx_bridge = b.value; + } else { + return Err(syn::Error::new_spanned(&item.path, "invalid argument")); + } + } + + Ok(config) + } +} #[proc_macro] -pub fn msg_include_all(_input: TokenStream) -> TokenStream { +pub fn msg_include_all(input: TokenStream) -> TokenStream { + let config = syn::parse_macro_input!(input as Config); + let ament_prefix_path = std::env!("DETECTED_AMENT_PREFIX_PATH").trim(); if ament_prefix_path.is_empty() { quote! { @@ -32,7 +66,7 @@ pub fn msg_include_all(_input: TokenStream) -> TokenStream { let packages = get_packages(&paths) .unwrap() .iter() - .map(|v| v.token_stream()) + .map(|v| v.token_stream(config.create_cxx_bridge)) .collect::>(); (quote! { diff --git a/libraries/extensions/ros2-bridge/msg-gen/src/types/package.rs b/libraries/extensions/ros2-bridge/msg-gen/src/types/package.rs index 3d5c4944..bbd16369 100644 --- a/libraries/extensions/ros2-bridge/msg-gen/src/types/package.rs +++ b/libraries/extensions/ros2-bridge/msg-gen/src/types/package.rs @@ -71,13 +71,21 @@ impl Package { } } - pub fn token_stream(&self) -> impl ToTokens { + pub fn token_stream(&self, gen_cxx_bridge: bool) -> impl ToTokens { let name = Ident::new(&self.name, Span::call_site()); let messages_block = self.messages_block(); let services_block = self.services_block(); let actions_block = self.actions_block(); + let attributes = if gen_cxx_bridge { + let namespace = &self.name; + quote! { #[cxx::bridge(namespace = #namespace)] } + } else { + quote! {} + }; + quote! { + #attributes pub mod #name { #messages_block #services_block