diff --git a/src/needs-parens.mjs b/src/needs-parens.mjs index c601bc78a..4f876ad9b 100644 --- a/src/needs-parens.mjs +++ b/src/needs-parens.mjs @@ -162,6 +162,18 @@ function needsParens(path, options) { return node.kind === "yieldfrom" || !!(node.key || node.value); } } + case "match": + // `match (...) {...}()` and the like are syntax errors + switch (parent.kind) { + case "propertylookup": + case "nullsafepropertylookup": + case "staticlookup": + case "offsetlookup": + case "call": + return key === "what"; + default: + return false; + } case "assign": { if ( parent.kind === "for" && diff --git a/tests/match/__snapshots__/jsfmt.spec.mjs.snap b/tests/match/__snapshots__/jsfmt.spec.mjs.snap index 01b2a5291..0e2f87679 100644 --- a/tests/match/__snapshots__/jsfmt.spec.mjs.snap +++ b/tests/match/__snapshots__/jsfmt.spec.mjs.snap @@ -1,5 +1,119 @@ // Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing +exports[`dereference.php 1`] = ` +====================================options===================================== +parsers: ["php"] +phpVersion: "8.0" +printWidth: 80 +trailingCommaPHP: false + | printWidth +=====================================input====================================== + fn() => 1, + default => fn() => 2, +})(); +$first = (match ($kind) { default => [1, 2] })[0]; +$name = (match ($kind) { default => $object })->name; +$value = (match ($kind) { default => $object })?->name; +$result = (match ($kind) { default => $object })->handle(); +$constant = (match ($kind) { default => Foo::class })::BAR; +$property = (match ($kind) { default => Foo::class })::$bar; +$instance = (match ($kind) { default => Foo::class })::create(); +$plain = match ($kind) { default => 1 } + 1; + +=====================================output===================================== + fn() => 1, + default => fn() => 2 +})(); +$first = (match ($kind) { + default => [1, 2] +})[0]; +$name = (match ($kind) { + default => $object +})->name; +$value = (match ($kind) { + default => $object +})?->name; +$result = (match ($kind) { + default => $object +})->handle(); +$constant = (match ($kind) { + default => Foo::class +})::BAR; +$property = (match ($kind) { + default => Foo::class +})::$bar; +$instance = (match ($kind) { + default => Foo::class +})::create(); +$plain = + match ($kind) { + default => 1 + } + 1; + +================================================================================ +`; + +exports[`dereference.php 2`] = ` +====================================options===================================== +parsers: ["php"] +phpVersion: "8.0" +printWidth: 80 +trailingCommaPHP: true + | printWidth +=====================================input====================================== + fn() => 1, + default => fn() => 2, +})(); +$first = (match ($kind) { default => [1, 2] })[0]; +$name = (match ($kind) { default => $object })->name; +$value = (match ($kind) { default => $object })?->name; +$result = (match ($kind) { default => $object })->handle(); +$constant = (match ($kind) { default => Foo::class })::BAR; +$property = (match ($kind) { default => Foo::class })::$bar; +$instance = (match ($kind) { default => Foo::class })::create(); +$plain = match ($kind) { default => 1 } + 1; + +=====================================output===================================== + fn() => 1, + default => fn() => 2, +})(); +$first = (match ($kind) { + default => [1, 2], +})[0]; +$name = (match ($kind) { + default => $object, +})->name; +$value = (match ($kind) { + default => $object, +})?->name; +$result = (match ($kind) { + default => $object, +})->handle(); +$constant = (match ($kind) { + default => Foo::class, +})::BAR; +$property = (match ($kind) { + default => Foo::class, +})::$bar; +$instance = (match ($kind) { + default => Foo::class, +})::create(); +$plain = + match ($kind) { + default => 1, + } + 1; + +================================================================================ +`; + exports[`match.php 1`] = ` ====================================options===================================== parsers: ["php"] diff --git a/tests/match/dereference.php b/tests/match/dereference.php new file mode 100644 index 000000000..787db545b --- /dev/null +++ b/tests/match/dereference.php @@ -0,0 +1,13 @@ + fn() => 1, + default => fn() => 2, +})(); +$first = (match ($kind) { default => [1, 2] })[0]; +$name = (match ($kind) { default => $object })->name; +$value = (match ($kind) { default => $object })?->name; +$result = (match ($kind) { default => $object })->handle(); +$constant = (match ($kind) { default => Foo::class })::BAR; +$property = (match ($kind) { default => Foo::class })::$bar; +$instance = (match ($kind) { default => Foo::class })::create(); +$plain = match ($kind) { default => 1 } + 1;