Skip to content

Commit 1c578b1

Browse files
committed
fix(lints): Error when overriding workspace lints
1 parent 679cb32 commit 1c578b1

File tree

2 files changed

+38
-26
lines changed

2 files changed

+38
-26
lines changed

src/cargo/util/toml/mod.rs

Lines changed: 33 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1475,29 +1475,6 @@ impl<'de> de::Deserialize<'de> for MaybeWorkspaceBtreeMap {
14751475
}
14761476
}
14771477

1478-
type MaybeWorkspaceLints = MaybeWorkspace<TomlLints, TomlWorkspaceField>;
1479-
1480-
impl<'de> de::Deserialize<'de> for MaybeWorkspaceLints {
1481-
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
1482-
where
1483-
D: de::Deserializer<'de>,
1484-
{
1485-
let value = serde_value::Value::deserialize(deserializer)?;
1486-
1487-
if let Ok(w) = TomlWorkspaceField::deserialize(
1488-
serde_value::ValueDeserializer::<D::Error>::new(value.clone()),
1489-
) {
1490-
return if w.workspace() {
1491-
Ok(MaybeWorkspace::Workspace(w))
1492-
} else {
1493-
Err(de::Error::custom("`workspace` cannot be false"))
1494-
};
1495-
}
1496-
TomlLints::deserialize(serde_value::ValueDeserializer::<D::Error>::new(value))
1497-
.map(MaybeWorkspace::Defined)
1498-
}
1499-
}
1500-
15011478
#[derive(Deserialize, Serialize, Copy, Clone, Debug)]
15021479
pub struct TomlWorkspaceField {
15031480
#[serde(deserialize_with = "bool_no_false")]
@@ -2277,7 +2254,7 @@ impl TomlManifest {
22772254

22782255
let lints =
22792256
parse_unstable_lints::<MaybeWorkspaceLints>(me.lints.clone(), config, cx.warnings)?
2280-
.map(|mw| mw.resolve("lints", || inherit()?.lints()))
2257+
.map(|mw| mw.resolve(|| inherit()?.lints()))
22812258
.transpose()?;
22822259
let lints = verify_lints(lints)?;
22832260
let default = TomlLints::default();
@@ -3521,6 +3498,38 @@ impl fmt::Debug for PathValue {
35213498
}
35223499
}
35233500

3501+
#[derive(Deserialize, Serialize, Debug, Clone)]
3502+
#[serde(expecting = "a map")]
3503+
pub struct MaybeWorkspaceLints {
3504+
#[serde(skip_serializing_if = "is_false")]
3505+
#[serde(deserialize_with = "bool_no_false", default)]
3506+
workspace: bool,
3507+
#[serde(flatten)]
3508+
lints: TomlLints,
3509+
}
3510+
3511+
fn is_false(b: &bool) -> bool {
3512+
!b
3513+
}
3514+
3515+
impl MaybeWorkspaceLints {
3516+
fn resolve<'a>(
3517+
self,
3518+
get_ws_inheritable: impl FnOnce() -> CargoResult<TomlLints>,
3519+
) -> CargoResult<TomlLints> {
3520+
if self.workspace {
3521+
if !self.lints.is_empty() {
3522+
anyhow::bail!("cannot override `workspace.lints` in `lints`, either remove the overrides or `lints.workspace = true` and manually specify the lints");
3523+
}
3524+
get_ws_inheritable().with_context(|| {
3525+
"error inheriting `lints` from workspace root manifest's `workspace.lints`"
3526+
})
3527+
} else {
3528+
Ok(self.lints)
3529+
}
3530+
}
3531+
}
3532+
35243533
pub type TomlLints = BTreeMap<String, TomlToolLints>;
35253534

35263535
pub type TomlToolLints = BTreeMap<String, TomlLint>;

tests/testsuite/lints.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -446,9 +446,12 @@ pub fn foo(num: i32) -> u32 {
446446
foo.cargo("check -Zlints")
447447
.masquerade_as_nightly_cargo(&["lints"])
448448
.with_status(101)
449-
.with_stderr_contains(
449+
.with_stderr(
450450
"\
451-
error: usage of an `unsafe` block
451+
[ERROR] failed to parse manifest at `[CWD]/Cargo.toml`
452+
453+
Caused by:
454+
cannot override `workspace.lints` in `lints`, either remove the overrides or `lints.workspace = true` and manually specify the lints
452455
",
453456
)
454457
.run();

0 commit comments

Comments
 (0)