diff --git a/bin/tests/manual_inherit_from.rs b/bin/tests/manual_inherit_from.rs index 3d6dd99c..c99a72e4 100644 --- a/bin/tests/manual_inherit_from.rs +++ b/bin/tests/manual_inherit_from.rs @@ -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 \"\"; }", ], } diff --git a/bin/tests/snapshots/manual_inherit_from__fix_8469aedc88bfd1e6301d53e1233a35b1025094e3cde4646b7a275bdf197056d5.snap b/bin/tests/snapshots/manual_inherit_from__fix_8469aedc88bfd1e6301d53e1233a35b1025094e3cde4646b7a275bdf197056d5.snap new file mode 100644 index 00000000..6ce0adfa --- /dev/null +++ b/bin/tests/snapshots/manual_inherit_from__fix_8469aedc88bfd1e6301d53e1233a35b1025094e3cde4646b7a275bdf197056d5.snap @@ -0,0 +1,5 @@ +--- +source: bin/tests/manual_inherit_from.rs +expression: "\"let foo = { }; in { x = foo.x or \\\"\\\"; }\"" +--- + diff --git a/bin/tests/snapshots/manual_inherit_from__lint_8469aedc88bfd1e6301d53e1233a35b1025094e3cde4646b7a275bdf197056d5.snap b/bin/tests/snapshots/manual_inherit_from__lint_8469aedc88bfd1e6301d53e1233a35b1025094e3cde4646b7a275bdf197056d5.snap new file mode 100644 index 00000000..6ce0adfa --- /dev/null +++ b/bin/tests/snapshots/manual_inherit_from__lint_8469aedc88bfd1e6301d53e1233a35b1025094e3cde4646b7a275bdf197056d5.snap @@ -0,0 +1,5 @@ +--- +source: bin/tests/manual_inherit_from.rs +expression: "\"let foo = { }; in { x = foo.x or \\\"\\\"; }\"" +--- + diff --git a/lib/src/lints/manual_inherit_from.rs b/lib/src/lints/manual_inherit_from.rs index 83d10751..36bff9b4 100644 --- a/lib/src/lints/manual_inherit_from.rs +++ b/lib/src/lints/manual_inherit_from.rs @@ -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()?; @@ -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()