From 598c00e55ddbe98267c82de477b355f7f73010b7 Mon Sep 17 00:00:00 2001 From: Matthias Seitz Date: Wed, 1 Jun 2022 17:25:27 +0200 Subject: [PATCH] fix(solc): improve remappings autodetection (#1335) --- ethers-solc/src/remappings.rs | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/ethers-solc/src/remappings.rs b/ethers-solc/src/remappings.rs index 7c2382bd..e512fc7d 100644 --- a/ethers-solc/src/remappings.rs +++ b/ethers-solc/src/remappings.rs @@ -452,6 +452,14 @@ impl Candidate { current_dir.to_path_buf() }; + // if the window start and the source dir are the same directory we can end early if + // we wrongfully detect something like: `/src/lib/` + if current_level > 0 && + source_dir == window_start && + (is_source_dir(&source_dir) || is_lib_dir(&source_dir)) + { + return + } candidates.push(Candidate { window_start, source_dir, window_level: current_level }); } } @@ -759,6 +767,22 @@ mod tests { assert_eq!(remappings[0].path, format!("{}/src/", path)); } + #[test] + fn can_resolve_contract_dir_combinations() { + let tmp_dir = tempdir("demo").unwrap(); + let paths = + ["lib/timeless/src/lib/A.sol", "lib/timeless/src/B.sol", "lib/timeless/src/test/C.sol"]; + mkdir_or_touch(tmp_dir.path(), &paths[..]); + + let tmp_dir_path = tmp_dir.path().join("lib"); + let remappings = Remapping::find_many(&tmp_dir_path); + let expected = vec![Remapping { + name: "timeless/".to_string(), + path: to_str(tmp_dir_path.join("timeless/src")), + }]; + pretty_assertions::assert_eq!(remappings, expected); + } + #[test] fn can_resolve_geb_remappings() { let tmp_dir = tempdir("geb").unwrap();