From edb39fd4a3e59c3d70bb3fae826ca48b6ceaad64 Mon Sep 17 00:00:00 2001 From: Pat Hickey Date: Wed, 11 Mar 2020 14:17:35 -0700 Subject: [PATCH] wiggle: make paths relative to use site of macro prior to this change, they were relative to CARGO_MANIFEST_DIR for the wiggle-generate crate. --- crates/wiggle/crates/generate/src/config.rs | 26 ++++++++++----------- crates/wiggle/src/lib.rs | 5 +++- 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/crates/wiggle/crates/generate/src/config.rs b/crates/wiggle/crates/generate/src/config.rs index e61742193c..0d4ada6402 100644 --- a/crates/wiggle/crates/generate/src/config.rs +++ b/crates/wiggle/crates/generate/src/config.rs @@ -1,4 +1,4 @@ -use std::path::PathBuf; +use std::path::{Path, PathBuf}; use proc_macro2::Span; use syn::{ @@ -78,24 +78,24 @@ pub struct WitxConf { pub paths: Vec, } +impl WitxConf { + pub fn make_paths_relative_to>(&mut self, root: P) { + self.paths.iter_mut().for_each(|p| { + if !p.is_absolute() { + *p = PathBuf::from(root.as_ref()).join(p.clone()); + } + }); + } +} + impl Parse for WitxConf { fn parse(input: ParseStream) -> Result { let content; let _ = bracketed!(content in input); let path_lits: Punctuated = content.parse_terminated(Parse::parse)?; - let paths: Vec = path_lits + let paths = path_lits .iter() - .map(|lit| { - let p = PathBuf::from(lit.value()); - if p.is_absolute() { - p - } else { - let mut root = PathBuf::from(env!("CARGO_MANIFEST_DIR")); - root.pop(); - root.pop(); - root.join(p) - } - }) + .map(|lit| PathBuf::from(lit.value())) .collect(); Ok(WitxConf { paths }) } diff --git a/crates/wiggle/src/lib.rs b/crates/wiggle/src/lib.rs index 84b96f1895..22eeeff462 100644 --- a/crates/wiggle/src/lib.rs +++ b/crates/wiggle/src/lib.rs @@ -5,7 +5,10 @@ use syn::parse_macro_input; #[proc_macro] pub fn from_witx(args: TokenStream) -> TokenStream { - let config = parse_macro_input!(args as wiggle_generate::Config); + let mut config = parse_macro_input!(args as wiggle_generate::Config); + config.witx.make_paths_relative_to( + std::env::var("CARGO_MANIFEST_DIR").expect("CARGO_MANIFEST_DIR env var"), + ); let doc = witx::load(&config.witx.paths).expect("loading witx"); TokenStream::from(wiggle_generate::generate(&doc, &config)) }