diff --git a/.changeset/light-mugs-speak.md b/.changeset/light-mugs-speak.md new file mode 100644 index 000000000000..6f40066e6fcb --- /dev/null +++ b/.changeset/light-mugs-speak.md @@ -0,0 +1,16 @@ +--- +"@biomejs/biome": patch +--- + +Fixed [#8254](https://github.com/biomejs/biome/issues/8254): The `noParameterAssign` rule with `propertyAssignment: "deny"` was incorrectly reporting an error when a function parameter was used on the right-hand side of an assignment to a local variable's property. + +The rule should only flag assignments that modify the parameter binding or its properties (L-value), not the use of its value. + +**Valid:** + +```js +(input) => { + const local = { property: 0 }; + local.property = input; +}; +``` diff --git a/crates/biome_js_analyze/src/lint/style/no_parameter_assign.rs b/crates/biome_js_analyze/src/lint/style/no_parameter_assign.rs index 960696aab93f..1bc0cc9fad33 100644 --- a/crates/biome_js_analyze/src/lint/style/no_parameter_assign.rs +++ b/crates/biome_js_analyze/src/lint/style/no_parameter_assign.rs @@ -148,10 +148,30 @@ impl Rule for NoParameterAssign { match left.as_any_js_assignment()? { AnyJsAssignment::JsComputedMemberAssignment(assignment) => { - assignment.object().ok() + if assignment + .object() + .ok()? + .get_callee_object_name()? + .token_text_trimmed() + == binding.name_token().ok()?.token_text_trimmed() + { + return assignment.object().ok(); + } + + None } AnyJsAssignment::JsStaticMemberAssignment(assignment) => { - assignment.object().ok() + if assignment + .object() + .ok()? + .get_callee_object_name()? + .token_text_trimmed() + == binding.name_token().ok()?.token_text_trimmed() + { + return assignment.object().ok(); + } + + None } _ => None, } diff --git a/crates/biome_js_analyze/tests/specs/style/noParameterAssign/parameterMutationDenyValid.js b/crates/biome_js_analyze/tests/specs/style/noParameterAssign/parameterMutationDenyValid.js new file mode 100644 index 000000000000..664f565f6994 --- /dev/null +++ b/crates/biome_js_analyze/tests/specs/style/noParameterAssign/parameterMutationDenyValid.js @@ -0,0 +1,6 @@ +// should not generate diagnostics +function copyParamValueToLocalProperty(input) { + const local = { a: 0, b: 0 }; + local.a = input; + local["b"] = input; +} diff --git a/crates/biome_js_analyze/tests/specs/style/noParameterAssign/parameterMutationDenyValid.js.snap b/crates/biome_js_analyze/tests/specs/style/noParameterAssign/parameterMutationDenyValid.js.snap new file mode 100644 index 000000000000..844dc4cf6dc7 --- /dev/null +++ b/crates/biome_js_analyze/tests/specs/style/noParameterAssign/parameterMutationDenyValid.js.snap @@ -0,0 +1,14 @@ +--- +source: crates/biome_js_analyze/tests/spec_tests.rs +expression: parameterMutationDenyValid.js +--- +# Input +```js +// should not generate diagnostics +function copyParamValueToLocalProperty(input) { + const local = { a: 0, b: 0 }; + local.a = input; + local["b"] = input; +} + +``` diff --git a/crates/biome_js_analyze/tests/specs/style/noParameterAssign/parameterMutationDenyValid.options.json b/crates/biome_js_analyze/tests/specs/style/noParameterAssign/parameterMutationDenyValid.options.json new file mode 100644 index 000000000000..c355e893080c --- /dev/null +++ b/crates/biome_js_analyze/tests/specs/style/noParameterAssign/parameterMutationDenyValid.options.json @@ -0,0 +1,15 @@ +{ + "$schema": "../../../../../../packages/@biomejs/biome/configuration_schema.json", + "linter": { + "rules": { + "style": { + "noParameterAssign": { + "level": "error", + "options": { + "propertyAssignment": "deny" + } + } + } + } + } +}