Skip to content
Open
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
2 changes: 2 additions & 0 deletions bin/tests/manual_inherit_from.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,7 @@ generate_tests! {
"let a.b = 2; in { b = a.b; }",
"let a.b = 2; in { c = a.c; }",
"let a.b = 2; in { b = a.c; }",
// don't lint if the rhs expr is more than just an access
"let foo = { }; in { x = foo.x or \"\"; }",
],
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
source: bin/tests/manual_inherit_from.rs
expression: "\"let foo = { }; in { x = foo.x or \\\"\\\"; }\""
---

Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
source: bin/tests/manual_inherit_from.rs
expression: "\"let foo = { }; in { x = foo.x or \\\"\\\"; }\""
---

20 changes: 15 additions & 5 deletions lib/src/lints/manual_inherit_from.rs
Original file line number Diff line number Diff line change
Expand Up @@ -58,10 +58,20 @@ impl Rule for ManualInherit {
return None;
};

let Some(Expr::Select(value)) = key_value_stmt.value() else {
return None;
};
let select_attrpath = value.attrpath()?;
let select = key_value_stmt
.value()
.and_then(|value| match value {
// unfortunately we can only match on select although attr path would be enough
Expr::Select(select) => Some(select),
_ => None,
})
.filter(|select| {
// hence we have to filter out select statements that have an `or` token in the
// next step
select.or_token().is_none()
})?;

let select_attrpath = select.attrpath()?;
let mut select_attrpath_attrs = select_attrpath.attrs();
let first_attr = select_attrpath_attrs.next()?;

Expand All @@ -80,7 +90,7 @@ impl Rule for ManualInherit {
let at = node.text_range();

let replacement = {
let set = value.expr()?;
let set = select.expr()?;
make::inherit_from_stmt(set.syntax(), &[key])
.syntax()
.clone()
Expand Down