From 6f9790e8aa0910d68ea77b81de594a95cf8a9229 Mon Sep 17 00:00:00 2001 From: Kristijan <470003+eldair@users.noreply.github.com> Date: Fri, 31 May 2024 15:17:00 +0200 Subject: [PATCH] Adjustment for overlooked nested lookups in chain breaks (#2322) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix for lookups * Further adjustments --------- Co-authored-by: Kristijan Novaković --- src/printer.mjs | 4 +- src/util.mjs | 38 +++++++++++++------ .../__snapshots__/jsfmt.spec.mjs.snap | 35 ++++++++++++++--- tests/member_chain/offsetlookup.php | 10 +++++ 4 files changed, 68 insertions(+), 19 deletions(-) diff --git a/src/printer.mjs b/src/printer.mjs index 53f812a09..cf7388092 100644 --- a/src/printer.mjs +++ b/src/printer.mjs @@ -509,8 +509,8 @@ function printMemberChain(path, options, print) { printIndentedGroup(groups.slice(shouldMerge ? 2 : 1)), ]; - const callExpressions = printedNodes.filter((tuple) => - ["call", "new"].includes(tuple.node.kind) + const callExpressions = printedNodes.filter( + (tuple) => tuple.node.kind === "call" ); // We don't want to print in one line if there's: diff --git a/src/util.mjs b/src/util.mjs index 1bda959a2..b4bf9e473 100644 --- a/src/util.mjs +++ b/src/util.mjs @@ -622,27 +622,35 @@ function createTypeCheckFunction(kindsArray) { } const isSingleWordType = createTypeCheckFunction([ - "variable", + "variadicplaceholder", + "namedargument", + "nullkeyword", + "identifier", "parameter", + "variable", "variadic", - "clone", - "cast", "boolean", + "literal", "number", "string", - "literal", - "nullkeyword", - "namedargument", - "variadicplaceholder", + "clone", + "cast", ]); const isArrayExpression = createTypeCheckFunction(["array"]); -const isCallOrNewExpression = createTypeCheckFunction(["call", "new"]); +const isCallLikeExpression = createTypeCheckFunction([ + "nullsafepropertylookup", + "propertylookup", + "staticlookup", + "offsetlookup", + "call", + "new", +]); const isArrowFuncExpression = createTypeCheckFunction(["arrowfunc"]); function getChainParts(node, prev = []) { const parts = prev; - if (isCallOrNewExpression(node)) { + if (isCallLikeExpression(node)) { parts.push(node); } @@ -668,11 +676,17 @@ function isSimpleCallArgument(node, depth = 2) { return node.items.every((x) => x === null || isChildSimple(x)); } - if (isCallOrNewExpression(node)) { + if (isCallLikeExpression(node)) { const parts = getChainParts(node); + parts.unshift(); + return ( - parts.filter((node) => node.kind === "call").length <= depth && - parts.every((node) => node.arguments.every(isChildSimple)) + parts.length <= depth && + parts.every((node) => + isLookupNode(node) + ? isChildSimple(node.offset) + : node.arguments.every(isChildSimple) + ) ); } diff --git a/tests/member_chain/__snapshots__/jsfmt.spec.mjs.snap b/tests/member_chain/__snapshots__/jsfmt.spec.mjs.snap index 5089bfdca..283177c24 100644 --- a/tests/member_chain/__snapshots__/jsfmt.spec.mjs.snap +++ b/tests/member_chain/__snapshots__/jsfmt.spec.mjs.snap @@ -583,11 +583,9 @@ $var = Foo::keys($items) return $x * 2; }); -(new static(func_get_args())) - ->push($this) - ->each(function ($item) { - VarDumper::dump($item); - }); +(new static(func_get_args()))->push($this)->each(function ($item) { + VarDumper::dump($item); +}); (new static(func_get_args())) ->offset(10) ->push($this) @@ -721,6 +719,16 @@ $window->{call()} return $b; }); + +$window->call($foo->bar->baz)->first()->second(); +$window->call($foo->bar->baz->foo())->first()->second(); + +(new Foo())->call($foo->bar->baz)->first()->second(); +(new Foo())->call($foo->bar->baz->foo())->first()->second(); + +Foo::call($foo->bar->baz)->first()->second(); +Foo::call($foo->bar->baz->foo())->first()->second(); + =====================================output===================================== {call()} return $b; }); +$window->call($foo->bar->baz)->first()->second(); +$window + ->call($foo->bar->baz->foo()) + ->first() + ->second(); + +(new Foo())->call($foo->bar->baz)->first()->second(); +(new Foo()) + ->call($foo->bar->baz->foo()) + ->first() + ->second(); + +Foo::call($foo->bar->baz)->first()->second(); +Foo::call($foo->bar->baz->foo()) + ->first() + ->second(); + ================================================================================ `; diff --git a/tests/member_chain/offsetlookup.php b/tests/member_chain/offsetlookup.php index a619ac7cf..5b37bc39e 100644 --- a/tests/member_chain/offsetlookup.php +++ b/tests/member_chain/offsetlookup.php @@ -53,3 +53,13 @@ ->catch(function () { return $b; }); + + +$window->call($foo->bar->baz)->first()->second(); +$window->call($foo->bar->baz->foo())->first()->second(); + +(new Foo())->call($foo->bar->baz)->first()->second(); +(new Foo())->call($foo->bar->baz->foo())->first()->second(); + +Foo::call($foo->bar->baz)->first()->second(); +Foo::call($foo->bar->baz->foo())->first()->second();