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