Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 5 additions & 4 deletions crates/xtask-lint-docs/src/main.rs
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
use std::fmt::Write;
use std::path::PathBuf;

use cargo::lints::Lint;
use cargo::lints::LintLevel;
use cargo::util::command_prelude::{ArgMatchesExt, flag};
use itertools::Itertools;

use std::fmt::Write;
use std::path::PathBuf;

fn cli() -> clap::Command {
clap::Command::new("xtask-lint-docs").arg(flag("check", "Check that the docs are up-to-date"))
}
Expand Down Expand Up @@ -114,7 +114,8 @@ fn lint_groups(buf: &mut String) -> anyhow::Result<()> {

fn add_lint(lint: &Lint, buf: &mut String) -> std::fmt::Result {
writeln!(buf, "## `{}`", lint.name)?;
writeln!(buf, "Group: `{}`\n", lint.primary_group.name)?;
writeln!(buf, "Group: `{}`", lint.primary_group.name)?;
writeln!(buf)?;
writeln!(buf, "Level: `{}`", lint.primary_group.default_level)?;
writeln!(buf, "{}\n", lint.docs.as_ref().unwrap())
}
Expand Down
61 changes: 13 additions & 48 deletions src/cargo/core/workspace.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@ use crate::core::{EitherManifest, Package, SourceId, VirtualManifest};
use crate::lints::analyze_cargo_lints_table;
use crate::lints::rules::blanket_hint_mostly_unused;
use crate::lints::rules::check_im_a_teapot;
use crate::lints::rules::implicit_minimum_version_req;
use crate::lints::rules::implicit_minimum_version_req_pkg;
use crate::lints::rules::implicit_minimum_version_req_ws;
use crate::lints::rules::missing_lints_inheritance;
use crate::lints::rules::non_kebab_case_bins;
use crate::lints::rules::non_kebab_case_features;
Expand Down Expand Up @@ -1357,63 +1358,27 @@ impl<'gctx> Workspace<'gctx> {
let mut run_error_count = 0;

check_im_a_teapot(pkg, &path, &cargo_lints, &mut run_error_count, self.gctx)?;
implicit_minimum_version_req(
pkg.into(),
&path,
&cargo_lints,
&mut run_error_count,
self.gctx,
)?;
non_kebab_case_packages(
pkg.into(),
&path,
&cargo_lints,
&mut run_error_count,
self.gctx,
)?;
non_snake_case_packages(
pkg.into(),
implicit_minimum_version_req_pkg(
pkg,
&path,
&cargo_lints,
&mut run_error_count,
self.gctx,
)?;
non_kebab_case_packages(pkg, &path, &cargo_lints, &mut run_error_count, self.gctx)?;
non_snake_case_packages(pkg, &path, &cargo_lints, &mut run_error_count, self.gctx)?;
non_kebab_case_bins(
self,
pkg.into(),
&path,
&cargo_lints,
&mut run_error_count,
self.gctx,
)?;
non_kebab_case_features(
pkg.into(),
&path,
&cargo_lints,
&mut run_error_count,
self.gctx,
)?;
non_snake_case_features(
pkg.into(),
&path,
&cargo_lints,
&mut run_error_count,
self.gctx,
)?;
redundant_readme(
pkg.into(),
&path,
&cargo_lints,
&mut run_error_count,
self.gctx,
)?;
redundant_homepage(
pkg.into(),
pkg,
&path,
&cargo_lints,
&mut run_error_count,
self.gctx,
)?;
non_kebab_case_features(pkg, &path, &cargo_lints, &mut run_error_count, self.gctx)?;
non_snake_case_features(pkg, &path, &cargo_lints, &mut run_error_count, self.gctx)?;
redundant_readme(pkg, &path, &cargo_lints, &mut run_error_count, self.gctx)?;
redundant_homepage(pkg, &path, &cargo_lints, &mut run_error_count, self.gctx)?;
missing_lints_inheritance(
self,
pkg,
Expand Down Expand Up @@ -1488,8 +1453,8 @@ impl<'gctx> Workspace<'gctx> {
&mut run_error_count,
self.gctx,
)?;
implicit_minimum_version_req(
self.root_maybe().into(),
implicit_minimum_version_req_ws(
self.root_maybe(),
self.root_manifest(),
&cargo_lints,
&mut run_error_count,
Expand Down
22 changes: 11 additions & 11 deletions src/cargo/lints/mod.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
use crate::core::{Edition, Feature, Features, MaybePackage, Package};
use crate::{CargoResult, GlobalContext};
use std::borrow::Cow;
use std::cmp::{Reverse, max_by_key};
use std::fmt::Display;
use std::ops::Range;
use std::path::Path;

use annotate_snippets::AnnotationKind;
use annotate_snippets::Group;
Expand All @@ -9,16 +12,13 @@ use cargo_util_schemas::manifest::TomlLintLevel;
use cargo_util_schemas::manifest::TomlToolLints;
use pathdiff::diff_paths;

use std::borrow::Cow;
use std::cmp::{Reverse, max_by_key};
use std::fmt::Display;
use std::ops::Range;
use std::path::Path;
use crate::core::{Edition, Feature, Features, MaybePackage, Package};
use crate::{CargoResult, GlobalContext};

pub mod rules;
pub use rules::LINTS;

pub const LINT_GROUPS: &[LintGroup] = &[
pub static LINT_GROUPS: &[LintGroup] = &[
COMPLEXITY,
CORRECTNESS,
NURSERY,
Expand All @@ -39,7 +39,7 @@ pub enum ManifestFor<'a> {
}

impl ManifestFor<'_> {
fn lint_level(&self, pkg_lints: &TomlToolLints, lint: Lint) -> (LintLevel, LintLevelReason) {
fn lint_level(&self, pkg_lints: &TomlToolLints, lint: &Lint) -> (LintLevel, LintLevelReason) {
lint.level(pkg_lints, self.edition(), self.unstable_features())
}

Expand Down Expand Up @@ -313,7 +313,7 @@ pub fn rel_cwd_manifest_path(path: &Path, gctx: &GlobalContext) -> String {
.to_string()
}

#[derive(Copy, Clone, Debug)]
#[derive(Clone, Debug)]
pub struct LintGroup {
pub name: &'static str,
pub default_level: LintLevel,
Expand Down Expand Up @@ -395,7 +395,7 @@ const TEST_DUMMY_UNSTABLE: LintGroup = LintGroup {
hidden: true,
};

#[derive(Copy, Clone, Debug)]
#[derive(Clone, Debug)]
pub struct Lint {
pub name: &'static str,
pub desc: &'static str,
Expand Down
2 changes: 1 addition & 1 deletion src/cargo/lints/rules/blanket_hint_mostly_unused.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ use crate::lints::SUSPICIOUS;
use crate::lints::get_key_value_span;
use crate::lints::rel_cwd_manifest_path;

pub const LINT: Lint = Lint {
pub static LINT: &Lint = &Lint {
name: "blanket_hint_mostly_unused",
desc: "blanket_hint_mostly_unused lint",
primary_group: &SUSPICIOUS,
Expand Down
2 changes: 1 addition & 1 deletion src/cargo/lints/rules/im_a_teapot.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ use crate::lints::get_key_value_span;
use crate::lints::rel_cwd_manifest_path;

/// This lint is only to be used for testing purposes
pub const LINT: Lint = Lint {
pub static LINT: &Lint = &Lint {
name: "im_a_teapot",
desc: "`im_a_teapot` is specified",
primary_group: &TEST_DUMMY_UNSTABLE,
Expand Down
55 changes: 23 additions & 32 deletions src/cargo/lints/rules/implicit_minimum_version_req.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,12 @@ use crate::core::Package;
use crate::lints::Lint;
use crate::lints::LintLevel;
use crate::lints::LintLevelReason;
use crate::lints::ManifestFor;
use crate::lints::PEDANTIC;
use crate::lints::get_key_value;
use crate::lints::rel_cwd_manifest_path;
use crate::util::OptVersionReq;

pub const LINT: Lint = Lint {
pub static LINT: &Lint = &Lint {
name: "implicit_minimum_version_req",
desc: "dependency version requirement without an explicit minimum version",
primary_group: &PEDANTIC,
Expand Down Expand Up @@ -82,44 +81,25 @@ serde = "1.0.219"
),
};

pub fn implicit_minimum_version_req(
manifest: ManifestFor<'_>,
pub fn implicit_minimum_version_req_pkg(
pkg: &Package,
manifest_path: &Path,
cargo_lints: &TomlToolLints,
error_count: &mut usize,
gctx: &GlobalContext,
) -> CargoResult<()> {
let (lint_level, reason) = manifest.lint_level(cargo_lints, LINT);
let (lint_level, reason) = LINT.level(
cargo_lints,
pkg.manifest().edition(),
pkg.manifest().unstable_features(),
);

if lint_level == LintLevel::Allow {
return Ok(());
}

let manifest_path = rel_cwd_manifest_path(manifest_path, gctx);

match manifest {
ManifestFor::Package(pkg) => {
lint_package(pkg, manifest_path, lint_level, reason, error_count, gctx)
}
ManifestFor::Workspace(maybe_pkg) => lint_workspace(
maybe_pkg,
manifest_path,
lint_level,
reason,
error_count,
gctx,
),
}
}

pub fn lint_package(
pkg: &Package,
manifest_path: String,
lint_level: LintLevel,
reason: LintLevelReason,
error_count: &mut usize,
gctx: &GlobalContext,
) -> CargoResult<()> {
let manifest = pkg.manifest();

let document = manifest.document();
Expand Down Expand Up @@ -167,14 +147,25 @@ pub fn lint_package(
Ok(())
}

pub fn lint_workspace(
pub fn implicit_minimum_version_req_ws(
maybe_pkg: &MaybePackage,
manifest_path: String,
lint_level: LintLevel,
reason: LintLevelReason,
manifest_path: &Path,
cargo_lints: &TomlToolLints,
error_count: &mut usize,
gctx: &GlobalContext,
) -> CargoResult<()> {
let (lint_level, reason) = LINT.level(
cargo_lints,
maybe_pkg.edition(),
maybe_pkg.unstable_features(),
);

if lint_level == LintLevel::Allow {
return Ok(());
}

let manifest_path = rel_cwd_manifest_path(manifest_path, gctx);

let document = maybe_pkg.document();
let contents = maybe_pkg.contents();
let toml = match maybe_pkg {
Expand Down
2 changes: 1 addition & 1 deletion src/cargo/lints/rules/missing_lints_inheritance.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ use crate::lints::LintLevel;
use crate::lints::SUSPICIOUS;
use crate::lints::rel_cwd_manifest_path;

pub const LINT: Lint = Lint {
pub static LINT: &Lint = &Lint {
name: "missing_lints_inheritance",
desc: "missing `[lints]` to inherit `[workspace.lints]`",
primary_group: &SUSPICIOUS,
Expand Down
5 changes: 3 additions & 2 deletions src/cargo/lints/rules/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@ mod unused_workspace_package_fields;

pub use blanket_hint_mostly_unused::blanket_hint_mostly_unused;
pub use im_a_teapot::check_im_a_teapot;
pub use implicit_minimum_version_req::implicit_minimum_version_req;
pub use implicit_minimum_version_req::implicit_minimum_version_req_pkg;
pub use implicit_minimum_version_req::implicit_minimum_version_req_ws;
pub use missing_lints_inheritance::missing_lints_inheritance;
pub use non_kebab_case_bins::non_kebab_case_bins;
pub use non_kebab_case_features::non_kebab_case_features;
Expand All @@ -28,7 +29,7 @@ pub use unknown_lints::output_unknown_lints;
pub use unused_workspace_dependencies::unused_workspace_dependencies;
pub use unused_workspace_package_fields::unused_workspace_package_fields;

pub const LINTS: &[crate::lints::Lint] = &[
pub static LINTS: &[&crate::lints::Lint] = &[
blanket_hint_mostly_unused::LINT,
implicit_minimum_version_req::LINT,
im_a_teapot::LINT,
Expand Down
2 changes: 1 addition & 1 deletion src/cargo/lints/rules/non_kebab_case_bins.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ use crate::lints::STYLE;
use crate::lints::get_key_value_span;
use crate::lints::rel_cwd_manifest_path;

pub const LINT: Lint = Lint {
pub static LINT: &Lint = &Lint {
name: "non_kebab_case_bins",
desc: "binaries should have a kebab-case name",
primary_group: &STYLE,
Expand Down
2 changes: 1 addition & 1 deletion src/cargo/lints/rules/non_kebab_case_features.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ use crate::lints::RESTRICTION;
use crate::lints::get_key_value_span;
use crate::lints::rel_cwd_manifest_path;

pub const LINT: Lint = Lint {
pub static LINT: &Lint = &Lint {
name: "non_kebab_case_features",
desc: "features should have a kebab-case name",
primary_group: &RESTRICTION,
Expand Down
2 changes: 1 addition & 1 deletion src/cargo/lints/rules/non_kebab_case_packages.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ use crate::lints::RESTRICTION;
use crate::lints::get_key_value_span;
use crate::lints::rel_cwd_manifest_path;

pub const LINT: Lint = Lint {
pub static LINT: &Lint = &Lint {
name: "non_kebab_case_packages",
desc: "packages should have a kebab-case name",
primary_group: &RESTRICTION,
Expand Down
2 changes: 1 addition & 1 deletion src/cargo/lints/rules/non_snake_case_features.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ use crate::lints::RESTRICTION;
use crate::lints::get_key_value_span;
use crate::lints::rel_cwd_manifest_path;

pub const LINT: Lint = Lint {
pub static LINT: &Lint = &Lint {
name: "non_snake_case_features",
desc: "features should have a snake-case name",
primary_group: &RESTRICTION,
Expand Down
2 changes: 1 addition & 1 deletion src/cargo/lints/rules/non_snake_case_packages.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ use crate::lints::RESTRICTION;
use crate::lints::get_key_value_span;
use crate::lints::rel_cwd_manifest_path;

pub const LINT: Lint = Lint {
pub static LINT: &Lint = &Lint {
name: "non_snake_case_packages",
desc: "packages should have a snake-case name",
primary_group: &RESTRICTION,
Expand Down
2 changes: 1 addition & 1 deletion src/cargo/lints/rules/redundant_homepage.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ use crate::lints::STYLE;
use crate::lints::get_key_value_span;
use crate::lints::rel_cwd_manifest_path;

pub const LINT: Lint = Lint {
pub static LINT: &Lint = &Lint {
name: "redundant_homepage",
desc: "`package.homepage` is redundant with another manifest field",
primary_group: &STYLE,
Expand Down
2 changes: 1 addition & 1 deletion src/cargo/lints/rules/redundant_readme.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ use crate::lints::get_key_value_span;
use crate::lints::rel_cwd_manifest_path;
use crate::util::toml::DEFAULT_README_FILES;

pub const LINT: Lint = Lint {
pub static LINT: &Lint = &Lint {
name: "redundant_readme",
desc: "explicit `package.readme` can be inferred",
primary_group: &STYLE,
Expand Down
2 changes: 1 addition & 1 deletion src/cargo/lints/rules/unknown_lints.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ use crate::lints::ManifestFor;
use crate::lints::SUSPICIOUS;
use crate::lints::get_key_value_span;

pub const LINT: Lint = Lint {
pub static LINT: &Lint = &Lint {
name: "unknown_lints",
desc: "unknown lint",
primary_group: &SUSPICIOUS,
Expand Down
Loading