Skip to content

Commit d0cc1d6

Browse files
authored
fix: heredoc/nowdoc trailing newlines (#1295)
1 parent 53cd1d8 commit d0cc1d6

3 files changed

Lines changed: 109 additions & 13 deletions

File tree

src/util.js

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -277,10 +277,10 @@ function isDocNode(node) {
277277
* Heredoc/Nowdoc nodes need a trailing linebreak if they
278278
* appear as function arguments or array elements
279279
*/
280-
function docShouldHaveTrailingNewline(path) {
281-
const node = path.getValue();
282-
const parent = path.getParentNode();
283-
const parentParent = path.getParentNode(1);
280+
function docShouldHaveTrailingNewline(path, recurse = 0) {
281+
const node = path.getNode(recurse);
282+
const parent = path.getNode(recurse + 1);
283+
const parentParent = path.getNode(recurse + 2);
284284

285285
if (!parent) {
286286
return false;
@@ -319,11 +319,9 @@ function docShouldHaveTrailingNewline(path) {
319319
}
320320

321321
if (parent.kind === "bin") {
322-
if (parentParent && parentParent.kind === "bin") {
323-
return true;
324-
}
325-
326-
return parent.left === node;
322+
return (
323+
parent.left === node || docShouldHaveTrailingNewline(path, recurse + 1)
324+
);
327325
}
328326

329327
if (parent.kind === "case" && parent.test === node) {
@@ -369,6 +367,10 @@ function docShouldHaveTrailingNewline(path) {
369367
return index !== lastIndex;
370368
}
371369

370+
if (parent.kind === "retif") {
371+
return docShouldHaveTrailingNewline(path, recurse + 1);
372+
}
373+
372374
return false;
373375
}
374376

tests/nowdoc/__snapshots__/jsfmt.spec.js.snap

Lines changed: 69 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -929,8 +929,7 @@ string
929929
string
930930
string
931931
EOD
932-
,
933-
$var
932+
, $var
934933
);
935934
936935
$array = [
@@ -958,6 +957,33 @@ $php73FlexibleNowdoc2 = <<<'EOD'
958957
c
959958
EOD;
960959
960+
[
961+
$var ? "foo" : <<<'EOD'
962+
string
963+
EOD
964+
, "bar"
965+
];
966+
967+
[
968+
$var ? "foo" : $var2 ? "bar" : <<<'EOD'
969+
string
970+
EOD
971+
, "bar"
972+
];
973+
974+
[
975+
$var ?? <<<'EOD'
976+
string
977+
EOD
978+
, "bar"
979+
];
980+
981+
[
982+
$a ?? $b ?? <<<'EOD'
983+
string
984+
EOD
985+
, "bar"
986+
];
961987
=====================================output=====================================
962988
<?php
963989
@@ -1998,6 +2024,47 @@ $php73FlexibleNowdoc2 = <<<'EOD'
19982024
c
19992025
EOD;
20002026
2027+
[
2028+
$var
2029+
? "foo"
2030+
: <<<'EOD'
2031+
string
2032+
EOD
2033+
,
2034+
"bar",
2035+
];
2036+
2037+
[
2038+
($var
2039+
? "foo"
2040+
: $var2)
2041+
? "bar"
2042+
: <<<'EOD'
2043+
string
2044+
EOD
2045+
,
2046+
"bar",
2047+
];
2048+
2049+
[
2050+
$var ??
2051+
<<<'EOD'
2052+
string
2053+
EOD
2054+
,
2055+
"bar",
2056+
];
2057+
2058+
[
2059+
$a ??
2060+
($b ??
2061+
<<<'EOD'
2062+
string
2063+
EOD
2064+
),
2065+
"bar",
2066+
];
2067+
20012068
================================================================================
20022069
`;
20032070

tests/nowdoc/nowdoc.php

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -921,8 +921,7 @@ function generator()
921921
string
922922
string
923923
EOD
924-
,
925-
$var
924+
, $var
926925
);
927926

928927
$array = [
@@ -949,3 +948,31 @@ function generator()
949948
b
950949
c
951950
EOD;
951+
952+
[
953+
$var ? "foo" : <<<'EOD'
954+
string
955+
EOD
956+
, "bar"
957+
];
958+
959+
[
960+
$var ? "foo" : $var2 ? "bar" : <<<'EOD'
961+
string
962+
EOD
963+
, "bar"
964+
];
965+
966+
[
967+
$var ?? <<<'EOD'
968+
string
969+
EOD
970+
, "bar"
971+
];
972+
973+
[
974+
$a ?? $b ?? <<<'EOD'
975+
string
976+
EOD
977+
, "bar"
978+
];

0 commit comments

Comments
 (0)