1414 */
1515class ValidTypeHintSniff implements Sniff
1616{
17- private const TEXT = '\\\\a-z0-9 ' ;
18- private const OPENER = '\<\[\{ \( ' ;
19- private const CLOSER = '\>\]\}\) ' ;
20- private const MIDDLE = '\,\: ' ;
21- private const SEPARATOR = '\&\| ' ;
17+ private const TEXT = '[ \\\\a-z0-9] ' ;
18+ private const OPENER = '\<|\[|\{| \( ' ;
19+ private const MIDDLE = '\,|\:|\=\> ' ;
20+ private const CLOSER = '\>|\]|\}|\) ' ;
21+ private const SEPARATOR = '\&| \| ' ;
2222
2323 /**
2424 * @return array
@@ -39,10 +39,12 @@ public function process(File $phpcsFile, $stackPtr): void
3939 if (in_array ($ tokens [$ stackPtr ]['content ' ], SniffHelper::TAGS_WITH_TYPE )) {
4040 preg_match (
4141 '`^((?: '
42- .'[ ' .self ::OPENER .self ::MIDDLE .self ::SEPARATOR .']\s* '
43- .'|(?:[ ' .self ::TEXT .self ::CLOSER .']\s+) '
44- .'(?=[\| ' .self ::OPENER .self ::MIDDLE .self ::CLOSER .self ::SEPARATOR .']) '
45- .'|[ ' .self ::TEXT .self ::CLOSER .'] '
42+ .'(?: ' .self ::OPENER .'| ' .self ::MIDDLE .'| ' .self ::SEPARATOR .')\s+ '
43+ .'(?= ' .self ::TEXT .'| ' .self ::OPENER .'| ' .self ::MIDDLE .'| ' .self ::CLOSER .'| ' .self ::SEPARATOR .') '
44+ .'| ' .self ::OPENER .'| ' .self ::MIDDLE .'| ' .self ::SEPARATOR
45+ .'|(?: ' .self ::TEXT .'| ' .self ::CLOSER .')\s+ '
46+ .'(?= ' .self ::OPENER .'| ' .self ::MIDDLE .'| ' .self ::CLOSER .'| ' .self ::SEPARATOR .') '
47+ .'| ' .self ::TEXT .'| ' .self ::CLOSER .''
4648 .')+)(.*)?`i ' ,
4749 $ tokens [($ stackPtr + 2 )]['content ' ],
4850 $ match
@@ -52,7 +54,6 @@ public function process(File $phpcsFile, $stackPtr): void
5254 return ;
5355 }
5456
55- // Check type (can be multiple, separated by '|').
5657 $ type = $ match [1 ];
5758 $ suggestedType = $ this ->getValidTypeName ($ type );
5859 if ($ type !== $ suggestedType ) {
@@ -84,7 +85,7 @@ private function getValidTypeName(string $typeName): string
8485 {
8586 $ typeNameWithoutSpace = str_replace (' ' , '' , $ typeName );
8687 $ parts = preg_split (
87- '/([\| ' .self ::OPENER .self ::MIDDLE .self ::CLOSER .self ::SEPARATOR .'] )/ ' ,
88+ '/( ' .self ::OPENER .' | ' . self ::MIDDLE .' | ' . self ::CLOSER .' | ' . self ::SEPARATOR .')/ ' ,
8889 $ typeNameWithoutSpace ,
8990 -1 ,
9091 PREG_SPLIT_DELIM_CAPTURE
@@ -93,9 +94,15 @@ private function getValidTypeName(string $typeName): string
9394
9495 $ validType = '' ;
9596 for ($ i = 0 ; $ i < $ partsNumber ; $ i += 2 ) {
96- $ validType .= $ this ->suggestType ($ parts [$ i ]). $ parts [ $ i + 1 ] ;
97+ $ validType .= $ this ->suggestType ($ parts [$ i ]);
9798
98- if (preg_match ('/[ ' .self ::MIDDLE .']/ ' , $ parts [$ i + 1 ])) {
99+ if ('=> ' === $ parts [$ i + 1 ]) {
100+ $ validType .= ' ' ;
101+ }
102+
103+ $ validType .= $ parts [$ i + 1 ];
104+
105+ if (preg_match ('/ ' .self ::MIDDLE .'/ ' , $ parts [$ i + 1 ])) {
99106 $ validType .= ' ' ;
100107 }
101108 }
0 commit comments