@@ -364,6 +364,7 @@ class PHP extends Tokenizer
364364 T_FUNC_C => 12 ,
365365 T_GLOBAL => 6 ,
366366 T_GOTO => 4 ,
367+ T_GOTO_COLON => 1 ,
367368 T_HALT_COMPILER => 15 ,
368369 T_IF => 2 ,
369370 T_IMPLEMENTS => 10 ,
@@ -2252,45 +2253,67 @@ function return types. We want to keep the parenthesis map clean,
22522253
22532254 if ($ tokenIsArray === true
22542255 && $ token [0 ] === T_STRING
2255- && isset ($ tokens [($ stackPtr + 1 )]) === true
2256- && $ tokens [($ stackPtr + 1 )] === ': '
22572256 && (is_array ($ tokens [($ stackPtr - 1 )]) === false
22582257 || $ tokens [($ stackPtr - 1 )][0 ] !== T_PAAMAYIM_NEKUDOTAYIM )
22592258 ) {
2260- $ stopTokens = [
2261- T_CASE => true ,
2262- T_SEMICOLON => true ,
2263- T_OPEN_TAG => true ,
2264- T_OPEN_CURLY_BRACKET => true ,
2265- T_INLINE_THEN => true ,
2266- T_ENUM => true ,
2267- ];
2268-
2269- for ($ x = ($ newStackPtr - 1 ); $ x > 0 ; $ x --) {
2270- if (isset ($ stopTokens [$ finalTokens [$ x ]['code ' ]]) === true ) {
2271- break ;
2259+ // Find next non-empty token.
2260+ for ($ i = ($ stackPtr + 1 ); $ i < $ numTokens ; $ i ++) {
2261+ if (is_array ($ tokens [$ i ]) === true
2262+ && isset (Tokens::$ emptyTokens [$ tokens [$ i ][0 ]]) === true
2263+ ) {
2264+ continue ;
22722265 }
2266+
2267+ break ;
22732268 }
22742269
2275- if ($ finalTokens [$ x ]['code ' ] !== T_CASE
2276- && $ finalTokens [$ x ]['code ' ] !== T_INLINE_THEN
2277- && $ finalTokens [$ x ]['code ' ] !== T_ENUM
2278- ) {
2279- $ finalTokens [$ newStackPtr ] = [
2280- 'content ' => $ token [1 ].': ' ,
2281- 'code ' => T_GOTO_LABEL ,
2282- 'type ' => 'T_GOTO_LABEL ' ,
2270+ if (isset ($ tokens [$ i ]) === true && $ tokens [$ i ] === ': ' ) {
2271+ // Okay, so we have a colon, now we need to make sure that this is not
2272+ // class constant access, a ternary, enum or switch case.
2273+ $ stopTokens = [
2274+ T_CASE => true ,
2275+ T_SEMICOLON => true ,
2276+ T_OPEN_TAG => true ,
2277+ T_OPEN_CURLY_BRACKET => true ,
2278+ T_INLINE_THEN => true ,
2279+ T_ENUM => true ,
22832280 ];
22842281
2285- if (PHP_CODESNIFFER_VERBOSITY > 1 ) {
2286- StatusWriter::write ("* token $ stackPtr changed from T_STRING to T_GOTO_LABEL " , 2 );
2287- StatusWriter::write ('* skipping T_COLON token ' .($ stackPtr + 1 ), 2 );
2282+ for ($ x = ($ newStackPtr - 1 ); $ x > 0 ; $ x --) {
2283+ if (isset ($ stopTokens [$ finalTokens [$ x ]['code ' ]]) === true ) {
2284+ break ;
2285+ }
22882286 }
22892287
2290- $ newStackPtr ++;
2291- $ stackPtr ++;
2292- continue ;
2293- }
2288+ if ($ finalTokens [$ x ]['code ' ] !== T_CASE
2289+ && $ finalTokens [$ x ]['code ' ] !== T_INLINE_THEN
2290+ && $ finalTokens [$ x ]['code ' ] !== T_ENUM
2291+ ) {
2292+ $ finalTokens [$ newStackPtr ] = [
2293+ 'content ' => $ token [1 ],
2294+ 'code ' => T_GOTO_LABEL ,
2295+ 'type ' => 'T_GOTO_LABEL ' ,
2296+ ];
2297+
2298+ if (PHP_CODESNIFFER_VERBOSITY > 1 ) {
2299+ StatusWriter::write ("* token $ stackPtr changed from T_STRING to T_GOTO_LABEL " , 2 );
2300+ }
2301+
2302+ // Modify the original token stack for the colon as potential
2303+ // whitespace/comments between still needs to get the normal treatment.
2304+ $ tokens [$ i ] = [
2305+ 0 => T_GOTO_COLON ,
2306+ 1 => ': ' ,
2307+ ];
2308+
2309+ if (PHP_CODESNIFFER_VERBOSITY > 1 ) {
2310+ StatusWriter::write ("* token $ i changed from \": \" to T_GOTO_COLON in the original token stack " , 2 );
2311+ }
2312+
2313+ $ newStackPtr ++;
2314+ continue ;
2315+ }//end if
2316+ }//end if
22942317 }//end if
22952318
22962319 /*
0 commit comments