fix(solc): improve remappings autodetection
@@ -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: `<dep>/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();
