From 6f104fecad49c207770b767f851a134a6cfe9008 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Sat, 10 Aug 2024 18:19:11 -0600 Subject: [PATCH] Copy `extension_api` Rust files to `OUT_DIR` when building `extension` to work around rust-analyzer limitation (#16064) Copies rust files from extension_api/wit to the OUT_DIR to allow including them from within the crate, which is supported by rust-analyzer. This allows rust-analyzer to deal with the included files. It doesn't currently support files outside the crate. Release Notes: - N/A --- crates/extension/build.rs | 43 +++++++++++++++++++ .../src/wasm_host/wit/since_v0_0_6.rs | 2 +- .../src/wasm_host/wit/since_v0_0_7.rs | 2 +- 3 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 crates/extension/build.rs diff --git a/crates/extension/build.rs b/crates/extension/build.rs new file mode 100644 index 0000000000..c5f94abaa8 --- /dev/null +++ b/crates/extension/build.rs @@ -0,0 +1,43 @@ +use std::env; +use std::fs; +use std::path::PathBuf; + +fn main() -> Result<(), Box> { + copy_extension_api_rust_files() +} + +// rust-analyzer doesn't support include! for files from outside the crate. +// Copy them to the OUT_DIR, so we can include them from there, which is supported. +fn copy_extension_api_rust_files() -> Result<(), Box> { + let out_dir = env::var("OUT_DIR")?; + let input_dir = PathBuf::from("../extension_api/wit"); + let output_dir = PathBuf::from(out_dir); + + for entry in fs::read_dir(&input_dir)? { + let entry = entry?; + let path = entry.path(); + if path.is_dir() { + for subentry in fs::read_dir(&path)? { + let subentry = subentry?; + let subpath = subentry.path(); + if subpath.extension() == Some(std::ffi::OsStr::new("rs")) { + let relative_path = subpath.strip_prefix(&input_dir)?; + let destination = output_dir.join(relative_path); + + fs::create_dir_all(destination.parent().unwrap())?; + fs::copy(&subpath, &destination)?; + println!("cargo:rerun-if-changed={}", subpath.display()); + } + } + } else if path.extension() == Some(std::ffi::OsStr::new("rs")) { + let relative_path = path.strip_prefix(&input_dir)?; + let destination = output_dir.join(relative_path); + + fs::create_dir_all(destination.parent().unwrap())?; + fs::copy(&path, &destination)?; + println!("cargo:rerun-if-changed={}", path.display()); + } + } + + Ok(()) +} diff --git a/crates/extension/src/wasm_host/wit/since_v0_0_6.rs b/crates/extension/src/wasm_host/wit/since_v0_0_6.rs index f850b2b044..f53b0b5ab7 100644 --- a/crates/extension/src/wasm_host/wit/since_v0_0_6.rs +++ b/crates/extension/src/wasm_host/wit/since_v0_0_6.rs @@ -23,7 +23,7 @@ wasmtime::component::bindgen!({ }); mod settings { - include!("../../../../extension_api/wit/since_v0.0.6/settings.rs"); + include!(concat!(env!("OUT_DIR"), "/since_v0.0.6/settings.rs")); } pub type ExtensionWorktree = Arc; diff --git a/crates/extension/src/wasm_host/wit/since_v0_0_7.rs b/crates/extension/src/wasm_host/wit/since_v0_0_7.rs index fec8a0cc1a..ca52f1d473 100644 --- a/crates/extension/src/wasm_host/wit/since_v0_0_7.rs +++ b/crates/extension/src/wasm_host/wit/since_v0_0_7.rs @@ -37,7 +37,7 @@ wasmtime::component::bindgen!({ pub use self::zed::extension::*; mod settings { - include!("../../../../extension_api/wit/since_v0.0.7/settings.rs"); + include!(concat!(env!("OUT_DIR"), "/since_v0.0.7/settings.rs")); } pub type ExtensionWorktree = Arc;