-
Notifications
You must be signed in to change notification settings - Fork 84
Expand file tree
/
Copy pathSingleQuoteSniff.php
More file actions
68 lines (61 loc) · 1.89 KB
/
SingleQuoteSniff.php
File metadata and controls
68 lines (61 loc) · 1.89 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
<?php
/*
* This file is part of PHP CS Fixer.
*
* (c) Fabien Potencier <fabien@symfony.com>
* Dariusz Rumiński <dariusz.ruminski@gmail.com>
*
* This source file is subject to the MIT license that is bundled
* with this source code in the file LICENSE.
*/
namespace CakePHP\Sniffs\PHP;
use PHP_CodeSniffer\Files\File;
use PHP_CodeSniffer\Sniffs\Sniff;
use PHP_CodeSniffer\Util\Tokens;
/**
* Converts double quotes to single quotes for simple strings.
*
* @author Gregor Harlan <gharlan@web.de>
* @author Mark Scherer
*/
class SingleQuoteSniff implements Sniff
{
/**
* @inheritDoc
*/
public function register()
{
return [T_CONSTANT_ENCAPSED_STRING];
}
/**
* @inheritDoc
*/
public function process(File $phpcsFile, $stackPtr)
{
$tokens = $phpcsFile->getTokens();
// Skip for complex multiline
$prevIndex = $phpcsFile->findPrevious(Tokens::$emptyTokens, $stackPtr - 1, null, true);
if ($prevIndex && $tokens[$prevIndex]['code'] === T_CONSTANT_ENCAPSED_STRING) {
return;
}
$content = $tokens[$stackPtr]['content'];
if (
$content[0] === '"'
&& strpos($content, "'") === false
&& strpos($content, "\n") === false
// regex: odd number of backslashes, not followed by double quote or dollar
&& !preg_match('/(?<!\\\\)(?:\\\\{2})*\\\\(?!["$\\\\])/', $content)
) {
$fix = $phpcsFile->addFixableError(
'Use single instead of double quotes for simple strings.',
$stackPtr,
'UseSingleQuote',
);
if ($fix) {
$content = substr($content, 1, -1);
$content = str_replace(['\\"', '\\$'], ['"', '$'], $content);
$phpcsFile->fixer->replaceToken($stackPtr, '\'' . $content . '\'');
}
}
}
}