From 06ef852d050000c1cb18a35ccb351cd02bba731f Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Sun, 4 Oct 2026 20:38:32 +0200 Subject: [PATCH 1/2] Treat a cast-prefixed array as an array literal in reflow isArrayLiteralOpen rejected a "[" preceded by ")" as a call-result index access, but "(object) [...]" (or any cast) opens an array literal, so ArrayListItemNewline now splits it one item per line like php engine. --- blink/internal/fixer/rules/array_indentation.go | 9 ++++++++- .../fixer/rules/array_list_item_newline_test.go | 11 +++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/blink/internal/fixer/rules/array_indentation.go b/blink/internal/fixer/rules/array_indentation.go index 035ffbb381..5ecd4bd2cd 100644 --- a/blink/internal/fixer/rules/array_indentation.go +++ b/blink/internal/fixer/rules/array_indentation.go @@ -165,7 +165,14 @@ func isArrayLiteralOpen(s *tokens.Stream, open int) bool { return false case token.Punct: switch t.Value { - case ")", "]", "}": + case ")": + // a cast before "[" ("(object) [...]") opens an array literal, not an + // access on a call result + if o := s.MatchBackward(p); o >= 0 && isCastParen(s, o) { + return true + } + return false + case "]", "}": return false } } diff --git a/blink/internal/fixer/rules/array_list_item_newline_test.go b/blink/internal/fixer/rules/array_list_item_newline_test.go index e64315ccc3..8d32c5c82a 100644 --- a/blink/internal/fixer/rules/array_list_item_newline_test.go +++ b/blink/internal/fixer/rules/array_list_item_newline_test.go @@ -26,4 +26,15 @@ func TestArrayListItemNewline(t *testing.T) { if _, changed := apply(t, f, " 1,\n];"); changed { t.Fatal("already-multiline array must be a no-op") } + + // a cast before "[" opens an array literal, so it still splits + got, changed = apply(t, f, " 1, 'y' => 2];") + if want := " 1,\n 'y' => 2,\n];"; !changed || got != want { + t.Fatalf("cast: changed=%v got=%q", changed, got) + } + + // an index access on a call result is not an array literal, so it is left alone + if _, changed := apply(t, f, " Date: Sun, 4 Oct 2026 20:40:33 +0200 Subject: [PATCH 2/2] Skip destructuring targets in array reflow fixers A single-line "[$a => ..., ...] = $x" destructuring target was expanded onto multiple lines by the three Symplify array-newline fixers. php-cs-fixer tags it as destructuring, not an array literal, so each now skips it. --- blink/internal/fixer/rules/array_list_item_newline.go | 3 +++ blink/internal/fixer/rules/array_opener_and_closer_newline.go | 3 +++ .../internal/fixer/rules/standalone_line_in_multiline_array.go | 3 +++ 3 files changed, 9 insertions(+) diff --git a/blink/internal/fixer/rules/array_list_item_newline.go b/blink/internal/fixer/rules/array_list_item_newline.go index 7f97987ac7..39bdd4b525 100644 --- a/blink/internal/fixer/rules/array_list_item_newline.go +++ b/blink/internal/fixer/rules/array_list_item_newline.go @@ -30,6 +30,9 @@ func (ArrayListItemNewline) Fix(s *tokens.Stream) bool { if !isArrayLiteralOpen(s, open) { continue } + if isDestructuringAssignOpen(s, open) { + continue // "[$a, $b] = ..." is a destructuring target, not an array literal + } closeIdx := s.MatchForward(open) if closeIdx < 0 || sigNext(s, open) == closeIdx { continue // empty [] diff --git a/blink/internal/fixer/rules/array_opener_and_closer_newline.go b/blink/internal/fixer/rules/array_opener_and_closer_newline.go index 417f85ecf4..5c97fad343 100644 --- a/blink/internal/fixer/rules/array_opener_and_closer_newline.go +++ b/blink/internal/fixer/rules/array_opener_and_closer_newline.go @@ -31,6 +31,9 @@ func (ArrayOpenerAndCloserNewline) Fix(s *tokens.Stream) bool { if !isArrayLiteralOpen(s, open) { continue } + if isDestructuringAssignOpen(s, open) { + continue // destructuring target, not an array literal + } closeIdx := s.MatchForward(open) if closeIdx < 0 { continue diff --git a/blink/internal/fixer/rules/standalone_line_in_multiline_array.go b/blink/internal/fixer/rules/standalone_line_in_multiline_array.go index 415849266e..9cb3daca44 100644 --- a/blink/internal/fixer/rules/standalone_line_in_multiline_array.go +++ b/blink/internal/fixer/rules/standalone_line_in_multiline_array.go @@ -31,6 +31,9 @@ func (StandaloneLineInMultilineArray) Fix(s *tokens.Stream) bool { if !isArrayLiteralOpen(s, open) { continue } + if isDestructuringAssignOpen(s, open) { + continue // destructuring target, not an array literal + } closeIdx := s.MatchForward(open) if closeIdx < 0 || sigNext(s, open) == closeIdx { continue // empty []