Skip to content

Commit

Permalink
Generic/DisallowSpaceIndent: flag heredoc/nowdoc closer using tab indent
Browse files Browse the repository at this point in the history
This is the same fix for the `Generic.WhiteSpace.DisallowSpaceIndent` sniff as was previously made in squizlabs/PHP_CodeSniffer 3640 and 533 for the sister-sniff `Generic.WhiteSpace.DisallowTabIndent`.

---

Since PHP 7.3, heredoc/nowdoc closers may be indented.
This indent can use either tabs or spaces and the indent is included in the `T_END_HEREDOC`/`T_END_NOWDOC` token contents as received from the PHP native tokenizer.

However, these tokens were not included in the tokens to look at for the `Generic.WhiteSpace.DisallowSpaceIndent` sniff, which could lead to false negatives.

Fixed now, includes tests.

And along the same lines as per 533:
* The error for space indentation of heredoc/nowdoc closers is not auto-fixable to prevent the fixer creating parse errors as the indentation of the _contents_ of the heredoc/nowdoc has to be the same as for the closer.
* The error for space indentation of heredoc/nowdoc closers has its own error code to allow for selectively ignoring the indentation of heredoc/nowdoc closers.
  • Loading branch information
jrfnl committed Jul 5, 2024
1 parent 71326b4 commit 27714f5
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,8 @@ public function process(File $phpcsFile, $stackPtr)
T_INLINE_HTML => true,
T_DOC_COMMENT_WHITESPACE => true,
T_COMMENT => true,
T_END_HEREDOC => true,
T_END_NOWDOC => true,
];

$eolLen = strlen($phpcsFile->eolChar);
Expand Down Expand Up @@ -202,8 +204,18 @@ public function process(File $phpcsFile, $stackPtr)
}
}//end if

$error = 'Tabs must be used to indent lines; spaces are not allowed';
$fix = $phpcsFile->addFixableError($error, $i, 'SpacesUsed');
$error = 'Tabs must be used to indent lines; spaces are not allowed';
$errorCode = 'SpacesUsed';

// Report, but don't auto-fix space identation for a PHP 7.3+ flexible heredoc/nowdoc closer.
// Auto-fixing this would cause parse errors as the indentation of the heredoc/nowdoc contents
// needs to use the same type of indentation. Also see: https://3v4l.org/7OF3M .
if ($tokens[$i]['code'] === T_END_HEREDOC || $tokens[$i]['code'] === T_END_NOWDOC) {
$phpcsFile->addError($error, $i, $errorCode.'HeredocCloser');
continue;
}

$fix = $phpcsFile->addFixableError($error, $i, $errorCode);
if ($fix === true) {
$padding = str_repeat("\t", $expectedTabs);
$padding .= str_repeat(' ', $expectedSpaces);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?php

$heredoc = <<<"END"
a
b
c
END;

$nowdoc = <<<'END'
a
b
c
END;
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,17 @@ public function getErrorList($testFile='')
15 => 1,
];

case 'DisallowSpaceIndentUnitTest.4.inc':
if (PHP_VERSION_ID >= 70300) {
return [
7 => 1,
13 => 1,
];
}

// PHP 7.2 or lower: PHP version which doesn't support flexible heredocs/nowdocs yet.
return [];

case 'DisallowSpaceIndentUnitTest.js':
return [3 => 1];

Expand Down

0 comments on commit 27714f5

Please sign in to comment.