ladybird/Tests/LibJS/Runtime/functions/function-duplicate-parameters.js
Andreas Kling 77bf420654 LibJS: Reject duplicate method parameters
Formal parameter early errors depend on the final parameter-list shape.
A duplicate in `function(a, a, ...rest)` was accepted because the
duplicate appeared before the rest parameter was seen.

Track the final simple-parameter-list result before checking duplicate
names, and enforce `UniqueFormalParameters` for method definitions. Add
coverage for sloppy functions with a later rest parameter and sloppy
object methods.
2026-05-22 01:56:57 +02:00

75 lines
1.8 KiB
JavaScript

test("function with duplicate parameter names", () => {
function foo(bar, _, bar) {
return bar;
}
expect(foo(1, 2, 3)).toBe(3);
});
test("syntax errors", () => {
// Regular function in strict mode
expect(`
"use strict";
function foo(bar, bar) {}
`).not.toEval();
// Arrow function in strict mode
expect(`
"use strict";
const foo = (bar, bar) => {};
`).not.toEval();
// Arrow function in non-strict mode
expect(`
const foo = (bar, bar) => {};
`).not.toEval();
// Regular function with rest parameter
expect(`
function foo(bar, ...bar) {}
`).not.toEval();
// Regular function with duplicate parameters before rest parameter
expect(`
function foo(bar, bar, ...baz) {}
`).not.toEval();
// Arrow function with rest parameter
expect(`
const foo = (bar, ...bar) => {};
`).not.toEval();
// Regular function with default parameter
expect(`
function foo(bar, bar = 1) {}
`).not.toEval();
// Arrow function with default parameter
expect(`
const foo = (bar, bar = 1) => {};
`).not.toEval();
// Duplicate across destructuring parameters
expect(`
function foo({ bar }, { bar }) {}
`).not.toEval();
// Duplicate between identifier and destructuring parameter
expect(`
function foo(bar, { bar }) {}
`).not.toEval();
// Duplicate between destructuring and identifier parameter
expect(`
function foo({ bar }, bar) {}
`).not.toEval();
// Object method with duplicate parameters
expect(`
({ foo(bar, bar) {} });
`).not.toEval();
// Object method with rest parameter
expect(`
({ foo(bar, ...bar) {} });
`).not.toEval();
});