1 #![feature(let_chains)]
4 #![feature(rustc_private)]
5 #![cfg_attr(feature = "deny-warnings", deny(warnings))]
6 // warn on lints, that are included in `rust-lang/rust`s bootstrap
7 #![warn(rust_2018_idioms, unused_lifetimes)]
9 extern crate rustc_lexer;
11 use std::path::PathBuf;
22 static CARGO_CLIPPY_EXE: &str = "cargo-clippy";
24 static CARGO_CLIPPY_EXE: &str = "cargo-clippy.exe";
26 /// Returns the path to the `cargo-clippy` binary
28 pub fn cargo_clippy_path() -> PathBuf {
29 let mut path = std::env::current_exe().expect("failed to get current executable name");
30 path.set_file_name(CARGO_CLIPPY_EXE);
34 /// Returns the path to the Clippy project directory
38 /// Panics if the current directory could not be retrieved, there was an error reading any of the
39 /// Cargo.toml files or ancestor directory is the clippy root directory
41 pub fn clippy_project_root() -> PathBuf {
42 let current_dir = std::env::current_dir().unwrap();
43 for path in current_dir.ancestors() {
44 let result = std::fs::read_to_string(path.join("Cargo.toml"));
45 if let Err(err) = &result {
46 if err.kind() == std::io::ErrorKind::NotFound {
51 let content = result.unwrap();
52 if content.contains("[package]\nname = \"clippy\"") {
53 return path.to_path_buf();
56 panic!("error: Can't determine root of project. Please run inside a Clippy working dir.");