From 53058cc252bee31316174c51c8006d39d954e6c5 Mon Sep 17 00:00:00 2001 From: fghzxm Date: Tue, 18 May 2021 12:43:07 +0800 Subject: [PATCH] Fix groups inside namespaces in `build!` (#806) --- crates/macros/src/build_macro.rs | 26 +++++++++++++++++++------- tests/build_groups/build.rs | 3 ++- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/crates/macros/src/build_macro.rs b/crates/macros/src/build_macro.rs index 76225e59f5..54fb1ea4d6 100644 --- a/crates/macros/src/build_macro.rs +++ b/crates/macros/src/build_macro.rs @@ -52,9 +52,17 @@ impl Parse for BuildMacro { fn walk( reader: &'static TypeReader, tree: &UseTree, - namespace: &mut String, + mut namespace: String, build: &mut BuildMacro, ) -> Result<()> { + fn render_namespace(namespace: &String) -> &str { + if namespace.is_empty() { + "(global namespace)" + } else { + namespace + } + } + match tree { UseTree::Path(input) => { if !namespace.is_empty() { @@ -67,28 +75,32 @@ impl Parse for BuildMacro { UseTree::Name(input) => { let name = input.ident.to_string(); - if let Some((namespace, name)) = reader.get_type_name(namespace, &name) { + if let Some((namespace, name)) = reader.get_type_name(&namespace, &name) { build.import(namespace, name); } else { return Err(Error::new_spanned( input, - format!("`{}.{}` not found in metadata", namespace, name), + format!( + "`{}.{}` not found in metadata", + render_namespace(&namespace), + name + ), )); } } UseTree::Glob(input) => { - if let Some(namespace) = reader.get_namespace(namespace) { + if let Some(namespace) = reader.get_namespace(&namespace) { build.import_namespace(namespace); } else { return Err(Error::new_spanned( input, - format!("`{}` not found in metadata", namespace), + format!("`{}` not found in metadata", render_namespace(&namespace)), )); } } UseTree::Group(input) => { for tree in &input.items { - walk(reader, tree, namespace, build)?; + walk(reader, tree, namespace.clone(), build)?; } } UseTree::Rename(input) => { @@ -99,7 +111,7 @@ impl Parse for BuildMacro { Ok(()) } - walk(reader, &tree, &mut String::new(), &mut build)?; + walk(reader, &tree, String::new(), &mut build)?; if !input.is_empty() { input.parse::()?; diff --git a/tests/build_groups/build.rs b/tests/build_groups/build.rs index 315c1fca57..19e8d30892 100644 --- a/tests/build_groups/build.rs +++ b/tests/build_groups/build.rs @@ -5,7 +5,8 @@ fn main() { // Test for https://github.com/microsoft/windows-rs/issues/699 Windows::Win32::System::Diagnostics::{ - Debug::GetLastError + Debug::GetLastError, + ProcessSnapshotting::PssCaptureSnapshot, } ); }