Chris@0
|
1 <?php
|
Chris@0
|
2 /**
|
Chris@17
|
3 * \DrupalPractice\Sniffs\General\ClassNameSniff
|
Chris@0
|
4 *
|
Chris@0
|
5 * @category PHP
|
Chris@0
|
6 * @package PHP_CodeSniffer
|
Chris@0
|
7 * @link http://pear.php.net/package/PHP_CodeSniffer
|
Chris@0
|
8 */
|
Chris@0
|
9
|
Chris@17
|
10 namespace DrupalPractice\Sniffs\General;
|
Chris@17
|
11
|
Chris@17
|
12 use PHP_CodeSniffer\Files\File;
|
Chris@17
|
13 use PHP_CodeSniffer\Sniffs\Sniff;
|
Chris@17
|
14 use DrupalPractice\Project;
|
Chris@17
|
15
|
Chris@0
|
16 /**
|
Chris@0
|
17 * Checks that classes without namespaces are properly prefixed with the module
|
Chris@0
|
18 * name.
|
Chris@0
|
19 *
|
Chris@0
|
20 * @category PHP
|
Chris@0
|
21 * @package PHP_CodeSniffer
|
Chris@0
|
22 * @link http://pear.php.net/package/PHP_CodeSniffer
|
Chris@0
|
23 */
|
Chris@17
|
24 class ClassNameSniff implements Sniff
|
Chris@0
|
25 {
|
Chris@0
|
26
|
Chris@0
|
27
|
Chris@0
|
28 /**
|
Chris@0
|
29 * Returns an array of tokens this test wants to listen for.
|
Chris@0
|
30 *
|
Chris@0
|
31 * @return array
|
Chris@0
|
32 */
|
Chris@0
|
33 public function register()
|
Chris@0
|
34 {
|
Chris@0
|
35 return array(
|
Chris@0
|
36 T_CLASS,
|
Chris@0
|
37 T_INTERFACE,
|
Chris@0
|
38 );
|
Chris@0
|
39
|
Chris@0
|
40 }//end register()
|
Chris@0
|
41
|
Chris@0
|
42
|
Chris@0
|
43 /**
|
Chris@0
|
44 * Processes this test, when one of its tokens is encountered.
|
Chris@0
|
45 *
|
Chris@17
|
46 * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned.
|
Chris@17
|
47 * @param int $stackPtr The position of the function
|
Chris@17
|
48 * name in the stack.
|
Chris@0
|
49 *
|
Chris@0
|
50 * @return void
|
Chris@0
|
51 */
|
Chris@17
|
52 public function process(File $phpcsFile, $stackPtr)
|
Chris@0
|
53 {
|
Chris@0
|
54 // If there is a PHP 5.3 namespace declaration in the file we return
|
Chris@0
|
55 // immediately as classes can be named arbitrary within a namespace.
|
Chris@0
|
56 $namespace = $phpcsFile->findPrevious(T_NAMESPACE, ($stackPtr - 1));
|
Chris@0
|
57 if ($namespace !== false) {
|
Chris@0
|
58 return;
|
Chris@0
|
59 }
|
Chris@0
|
60
|
Chris@17
|
61 $moduleName = Project::getName($phpcsFile);
|
Chris@0
|
62 if ($moduleName === false) {
|
Chris@0
|
63 return;
|
Chris@0
|
64 }
|
Chris@0
|
65
|
Chris@0
|
66 $tokens = $phpcsFile->getTokens();
|
Chris@0
|
67
|
Chris@0
|
68 $className = $phpcsFile->findNext(T_STRING, $stackPtr);
|
Chris@0
|
69 $name = trim($tokens[$className]['content']);
|
Chris@0
|
70
|
Chris@0
|
71 // Underscores are omitted in class names. Also convert all characters
|
Chris@0
|
72 // to lower case to compare them later.
|
Chris@0
|
73 $classPrefix = strtolower(str_replace('_', '', $moduleName));
|
Chris@0
|
74 // Views classes might have underscores in the name, which is also fine.
|
Chris@0
|
75 $viewsPrefix = strtolower($moduleName);
|
Chris@0
|
76 $name = strtolower($name);
|
Chris@0
|
77
|
Chris@0
|
78 if (strpos($name, $classPrefix) !== 0 && strpos($name, $viewsPrefix) !== 0) {
|
Chris@0
|
79 $warning = '%s name must be prefixed with the project name "%s"';
|
Chris@0
|
80 $nameParts = explode('_', $moduleName);
|
Chris@0
|
81 $camelName = '';
|
Chris@0
|
82 foreach ($nameParts as &$part) {
|
Chris@0
|
83 $camelName .= ucfirst($part);
|
Chris@0
|
84 }
|
Chris@0
|
85
|
Chris@0
|
86 $errorData = array(
|
Chris@0
|
87 ucfirst($tokens[$stackPtr]['content']),
|
Chris@0
|
88 $camelName,
|
Chris@0
|
89 );
|
Chris@0
|
90 $phpcsFile->addWarning($warning, $className, 'ClassPrefix', $errorData);
|
Chris@0
|
91 }
|
Chris@0
|
92
|
Chris@0
|
93 }//end process()
|
Chris@0
|
94
|
Chris@0
|
95
|
Chris@0
|
96 }//end class
|