2018-10-22 08:39:51 -05:00
use crate ::utils ::span_lint ;
2018-12-29 09:04:45 -06:00
use rustc ::lint ::{ EarlyContext , EarlyLintPass , LintArray , LintPass } ;
2019-04-08 15:43:55 -05:00
use rustc ::{ declare_lint_pass , declare_tool_lint } ;
2018-12-29 09:04:45 -06:00
use syntax ::{ ast ::* , source_map ::DUMMY_SP } ;
2018-10-22 08:39:51 -05:00
use cargo_metadata ;
2018-12-03 23:47:41 -06:00
use if_chain ::if_chain ;
2018-10-22 08:39:51 -05:00
use semver ;
declare_clippy_lint! {
2019-03-05 10:50:33 -06:00
/// **What it does:** Checks for wildcard dependencies in the `Cargo.toml`.
///
/// **Why is this bad?** [As the edition guide says](https://rust-lang-nursery.github.io/edition-guide/rust-2018/cargo-and-crates-io/crates-io-disallows-wildcard-dependencies.html),
/// it is highly unlikely that you work with any possible version of your dependency,
/// and wildcard dependencies would cause unnecessary breakage in the ecosystem.
///
/// **Known problems:** None.
///
/// **Example:**
///
/// ```toml
/// [dependencies]
/// regex = "*"
/// ```
2018-10-22 08:39:51 -05:00
pub WILDCARD_DEPENDENCIES ,
cargo ,
" wildcard dependencies being used "
}
2019-04-08 15:43:55 -05:00
declare_lint_pass! ( WildcardDependencies = > [ WILDCARD_DEPENDENCIES ] ) ;
2018-10-22 08:39:51 -05:00
2019-04-08 15:43:55 -05:00
impl EarlyLintPass for WildcardDependencies {
2018-10-24 09:18:01 -05:00
fn check_crate ( & mut self , cx : & EarlyContext < '_ > , _ : & Crate ) {
2019-01-25 13:27:07 -06:00
let metadata = if let Ok ( metadata ) = cargo_metadata ::MetadataCommand ::new ( ) . no_deps ( ) . exec ( ) {
2018-10-22 08:39:51 -05:00
metadata
} else {
2018-10-24 07:15:27 -05:00
span_lint ( cx , WILDCARD_DEPENDENCIES , DUMMY_SP , " could not read cargo metadata " ) ;
2018-10-22 08:39:51 -05:00
return ;
} ;
for dep in & metadata . packages [ 0 ] . dependencies {
2018-10-24 06:18:19 -05:00
// VersionReq::any() does not work
2018-12-03 01:12:35 -06:00
if_chain! {
if let Ok ( wildcard_ver ) = semver ::VersionReq ::parse ( " * " ) ;
if let Some ( ref source ) = dep . source ;
if ! source . starts_with ( " git " ) ;
if dep . req = = wildcard_ver ;
then {
2018-10-24 06:18:19 -05:00
span_lint (
cx ,
WILDCARD_DEPENDENCIES ,
DUMMY_SP ,
& format! ( " wildcard dependency for ` {} ` " , dep . name ) ,
) ;
}
2018-10-22 08:39:51 -05:00
}
}
}
}