@@ -5,7 +5,6 @@ class PHP_CodeCoverage_Util_Tokenizer {
5
5
private $ functions = [];
6
6
private $ classes = [];
7
7
private $ traits = [];
8
- private $ tlines = [];
9
8
private $ linesOfCode = array ('loc ' => 0 , 'cloc ' => 0 , 'ncloc ' => 0 );
10
9
11
10
/**
@@ -46,6 +45,7 @@ public function __construct($filename) {
46
45
$ this ->filename = $ filename ;
47
46
}
48
47
48
+
49
49
private function tconst ($ token ) {
50
50
if (is_array ($ token )) {
51
51
return $ token [0 ];
@@ -148,7 +148,7 @@ private function getKeywords(array $tokens, $idx) {
148
148
149
149
for ($ i = $ idx - 2 ; $ i > $ idx - 7 ; $ i -= 2 ) {
150
150
if (isset ($ tokens [$ i ])) {
151
- $ tconst = $ this -> tconst ( $ tokens [$ i ]) ;
151
+ $ tconst = $ tokens [$ i ]-> tconst ;
152
152
153
153
if ($ tconst === T_PRIVATE || $ tconst === T_PROTECTED || $ tconst === T_PUBLIC ) {
154
154
continue ;
@@ -169,12 +169,12 @@ private function getKeywords(array $tokens, $idx) {
169
169
170
170
private function getParent (array $ tokens , $ i ) {
171
171
$ parent = false ;
172
- if ($ this -> tconst ( $ tokens [$ i +4 ]) === T_EXTENDS ) {
172
+ if ($ tokens [$ i +4 ]-> tconst === T_EXTENDS ) {
173
173
$ ci = $ i + 6 ;
174
- $ className = $ this -> tstring ( $ tokens [$ ci ]) ;
174
+ $ className = $ tokens [$ ci ]-> tstring ;
175
175
176
- while (isset ($ tokens [$ ci +1 ]) && !($ this -> tconst ( $ tokens [$ ci +1 ]) === T_WHITESPACE )) {
177
- $ className .= $ this -> tstring ( $ tokens [++$ ci ]) ;
176
+ while (isset ($ tokens [$ ci +1 ]) && !($ tokens [$ ci +1 ]-> tconst === T_WHITESPACE )) {
177
+ $ className .= $ tokens [++$ ci ]-> tstring ;
178
178
}
179
179
180
180
$ parent = $ className ;
@@ -184,19 +184,19 @@ private function getParent(array $tokens, $i) {
184
184
185
185
private function getInterfaces (array $ tokens , $ i ) {
186
186
$ interfaces = false ;
187
- if (isset ($ tokens [$ i + 4 ]) && $ this -> tconst ( $ tokens [$ i + 4 ]) === T_IMPLEMENTS ||
188
- isset ($ tokens [$ i + 8 ]) && $ this -> tconst ( $ tokens [$ i + 8 ]) === T_IMPLEMENTS ) {
189
- if ($ this -> tconst ( $ tokens [$ i + 4 ]) === T_IMPLEMENTS ) {
187
+ if (isset ($ tokens [$ i + 4 ]) && $ tokens [$ i + 4 ]-> tconst === T_IMPLEMENTS ||
188
+ isset ($ tokens [$ i + 8 ]) && $ tokens [$ i + 8 ]-> tconst === T_IMPLEMENTS ) {
189
+ if ($ tokens [$ i + 4 ]-> tconst === T_IMPLEMENTS ) {
190
190
$ ii = $ i + 3 ;
191
191
} else {
192
192
$ ii = $ i + 7 ;
193
193
}
194
194
195
- while (! $ this -> tclass ( $ tokens [$ ii +1 ]) = == 'PHP_Token_OPEN_CURLY ' ) {
195
+ while ($ tokens [$ ii +1 ]-> tclass ! == 'PHP_Token_OPEN_CURLY ' ) {
196
196
$ ii ++;
197
197
198
- if ($ this -> tconst ( $ tokens [$ ii ]) === T_STRING ) {
199
- $ interfaces [] = $ this -> tstring ( $ tokens [$ ii ]) ;
198
+ if ($ tokens [$ ii ]-> tconst === T_STRING ) {
199
+ $ interfaces [] = $ tokens [$ ii ]-> tstring ;
200
200
}
201
201
}
202
202
}
@@ -211,7 +211,7 @@ private function getVisibility(array $tokens, $idx)
211
211
{
212
212
for ($ i = $ idx - 2 ; $ i > $ idx - 7 ; $ i -= 2 ) {
213
213
if (isset ($ tokens [$ i ])) {
214
- $ tconst = $ this -> tconst ( $ tokens [$ i ]) ;
214
+ $ tconst = $ tokens [$ i ]-> tconst ;
215
215
216
216
if ($ tconst === T_PRIVATE ) {
217
217
return "private " ;
@@ -239,7 +239,7 @@ private function getVisibility(array $tokens, $idx)
239
239
* @return string|null Returns the docblock as a string if found
240
240
*/
241
241
private function getDocblock (array $ tokens , $ idx ) {
242
- $ currentLineNumber = $ this ->tline ( $ idx ) ;
242
+ $ currentLineNumber = $ tokens [ $ idx ] ->tline ;
243
243
$ prevLineNumber = $ currentLineNumber - 1 ;
244
244
245
245
for ($ i = $ idx - 1 ; $ i ; $ i --) {
@@ -248,15 +248,15 @@ private function getDocblock(array $tokens, $idx) {
248
248
}
249
249
250
250
$ token = $ tokens [$ i ];
251
- $ tconst = $ this ->tconst ( $ token ) ;
251
+ $ tconst = $ token ->tconst ;
252
252
253
253
if ($ tconst === T_FUNCTION || $ tconst === T_CLASS || $ tconst === T_TRAIT ) {
254
254
// Some other trait, class or function, no docblock can be
255
255
// used for the current token
256
256
break ;
257
257
}
258
258
259
- $ line = $ this ->tline ( $ i ) ;
259
+ $ line = $ tokens [ $ i ] ->tline ;
260
260
261
261
if ($ line == $ currentLineNumber || ($ line == $ prevLineNumber && $ tconst === T_WHITESPACE )) {
262
262
continue ;
@@ -266,7 +266,7 @@ private function getDocblock(array $tokens, $idx) {
266
266
break ;
267
267
}
268
268
269
- return $ this ->tstring ( $ token ) ;
269
+ return $ token ->tstring ;
270
270
}
271
271
}
272
272
@@ -281,8 +281,8 @@ private function getEndTokenId(array $tokens, $idx)
281
281
282
282
while ($ endTokenId === null && isset ($ tokens [$ i ])) {
283
283
$ token = $ tokens [$ i ];
284
- $ tclass = $ this ->tclass ( $ token ) ;
285
- $ tconst = $ this ->tconst ( $ token ) ;
284
+ $ tclass = $ token ->tclass ;
285
+ $ tconst = $ token ->tconst ;
286
286
if ($ tclass === 'PHP_Token_OPEN_CURLY ' || $ tclass === 'PHP_Token_CURLY_OPEN ' ) {
287
287
$ block ++;
288
288
} elseif ($ tclass === 'PHP_Token_CLOSE_CURLY ' ) {
@@ -312,7 +312,7 @@ private function getEndTokenId(array $tokens, $idx)
312
312
*/
313
313
private function getEndLine (array $ tokens , $ idx )
314
314
{
315
- return $ this -> tline ( $ this ->getEndTokenId ($ tokens , $ idx )) ;
315
+ return $ tokens [ $ this ->getEndTokenId ($ tokens , $ idx )]-> tline ;
316
316
}
317
317
318
318
/**
@@ -321,7 +321,7 @@ private function getEndLine(array $tokens, $idx)
321
321
private function getPackage (array $ tokens , $ idx )
322
322
{
323
323
$ token = $ tokens [$ idx ];
324
- $ className = $ this -> tname ( $ tokens, $ idx) ;
324
+ $ className = $ tokens[ $ idx]-> tname ;
325
325
$ docComment = $ this ->getDocblock ($ tokens , $ idx );
326
326
327
327
$ result = array (
@@ -333,9 +333,9 @@ private function getPackage(array $tokens, $idx)
333
333
);
334
334
335
335
for ($ i = $ idx ; $ i ; --$ i ) {
336
- $ tconst = $ this -> tconst ( $ tokens [$ i ]) ;
336
+ $ tconst = $ tokens [$ i ]-> tconst ;
337
337
if ($ tconst === T_NAMESPACE ) {
338
- $ result ['namespace ' ] = $ this -> tname ( $ tokens, $ i ) ;
338
+ $ result ['namespace ' ] = $ tokens[ $ i ]-> tname ;
339
339
break ;
340
340
}
341
341
}
@@ -382,18 +382,18 @@ private function arrayToName(array $parts, $join = '\\')
382
382
*/
383
383
private function getSignature (array $ tokens , $ idx )
384
384
{
385
- if ($ this -> tname ( $ tokens, $ idx) == 'anonymous function ' ) {
385
+ if ($ tokens[ $ idx]-> tname == 'anonymous function ' ) {
386
386
$ signature = 'anonymous function ' ;
387
387
$ i = $ idx + 1 ;
388
388
} else {
389
389
$ signature = '' ;
390
390
$ i = $ idx + 2 ;
391
391
}
392
392
393
- while (isset ($ tokens [$ i ]) && ( $ tclass = $ this -> tclass ( $ tokens [ $ i ])) &&
394
- $ tclass !== 'PHP_Token_OPEN_CURLY ' &&
395
- $ tclass !== 'PHP_Token_SEMICOLON ' ) {
396
- $ signature .= $ this -> tstring ( $ tokens [$ i ++]) ;
393
+ while (isset ($ tokens [$ i ]) &&
394
+ $ tokens [ $ i ]-> tclass !== 'PHP_Token_OPEN_CURLY ' &&
395
+ $ tokens [ $ i ]-> tclass !== 'PHP_Token_SEMICOLON ' ) {
396
+ $ signature .= $ tokens [$ i ++]-> tstring ;
397
397
}
398
398
399
399
$ signature = trim ($ signature );
@@ -423,11 +423,11 @@ private function getCCN($tokens, $idx)
423
423
T_LOGICAL_OR
424
424
);
425
425
for ($ i = $ idx ; $ i <= $ end ; $ i ++) {
426
- $ tconst = $ this -> tconst ( $ tokens [$ i ]) ;
426
+ $ tconst = $ tokens [$ i ]-> tconst ;
427
427
if (in_array ($ tconst , $ ccnTokens )) {
428
428
$ ccn ++;
429
429
}
430
- $ tclass = $ this -> tclass ( $ tokens [$ i ]) ;
430
+ $ tclass = $ tokens [$ i ]-> tclass ;
431
431
if ($ tclass === 'PHP_Token_QUESTION_MARK ' ) {
432
432
$ ccn ++;
433
433
}
@@ -443,21 +443,23 @@ public function tokenize() {
443
443
444
444
// precalculate in which line the tokens reside, for later lookaheads
445
445
$ line = 1 ;
446
+ $ ccTokens = array ();
446
447
for ($ i = 0 ; $ i < $ numTokens ; ++$ i ) {
447
- $ token = $ tokens [$ i ];
448
-
449
- if ( is_array ( $ token )) {
450
- $ name = substr ( token_name ( $ token [ 0 ]), 2 );
451
- $ text = $ token [ 1 ];
452
- } else {
453
- $ text = $ token ;
454
- }
455
-
456
- $ this -> tlines [ $ i ] = $ line ;
448
+ $ preToken = $ tokens [$ i ];
449
+ $ text = $ this -> tstring ( $ preToken );
450
+
451
+ $ ccTokens [] = new CodeCoverage_Token (
452
+ $ this -> tname ( $ tokens , $ i ),
453
+ $ this -> tconst ( $ preToken ),
454
+ $ this -> tclass ( $ preToken ),
455
+ $ text ,
456
+ $ line
457
+ ) ;
457
458
458
459
$ lines = substr_count ($ text , "\n" );
459
460
$ line += $ lines ;
460
461
}
462
+ $ tokens = $ ccTokens ;
461
463
462
464
$ class = false ;
463
465
$ classEndLine = false ;
@@ -468,16 +470,8 @@ public function tokenize() {
468
470
$ line = 1 ;
469
471
for ($ i = 0 ; $ i < $ numTokens ; ++$ i ) {
470
472
$ token = $ tokens [$ i ];
471
-
472
- if (is_array ($ token )) {
473
- $ name = substr (token_name ($ token [0 ]), 2 );
474
- $ text = $ token [1 ];
475
-
476
- $ tokenClass = 'PHP_Token_ ' . $ name ;
477
- } else {
478
- $ text = $ token ;
479
- $ tokenClass = self ::$ customTokens [$ token ];
480
- }
473
+ $ text = $ token ->tstring ;
474
+ $ tokenClass = $ token ->tclass ;
481
475
482
476
$ lines = substr_count ($ text , "\n" );
483
477
$ line += $ lines ;
@@ -487,15 +481,15 @@ public function tokenize() {
487
481
break 2 ;
488
482
489
483
case 'PHP_Token_INTERFACE ' :
490
- $ interface = $ this -> tname ( $ tokens, $ i ) ;
484
+ $ interface = $ tokens[ $ i ]-> tname ;
491
485
$ interfaceEndLine = $ this ->getEndLine ($ tokens , $ i );
492
486
493
487
$ this ->interfaces [$ interface ] = array (
494
488
'methods ' => array (),
495
489
'parent ' => $ this ->getParent ($ tokens , $ i ),
496
490
'keywords ' => $ this ->getKeywords ($ tokens , $ i ),
497
491
'docblock ' => $ this ->getDocblock ($ tokens , $ i ),
498
- 'startLine ' => $ this ->tline ( $ i ) ,
492
+ 'startLine ' => $ token ->tline ,
499
493
'endLine ' => $ interfaceEndLine ,
500
494
'package ' => $ this ->getPackage ($ tokens , $ i ),
501
495
'file ' => $ this ->filename
@@ -512,32 +506,32 @@ public function tokenize() {
512
506
'interfaces ' => $ this ->getInterfaces ($ tokens , $ i ),
513
507
'keywords ' => $ this ->getKeywords ($ tokens , $ i ),
514
508
'docblock ' => $ this ->getDocblock ($ tokens , $ i ),
515
- 'startLine ' => $ this ->tline ( $ i ) ,
509
+ 'startLine ' => $ token ->tline ,
516
510
'endLine ' => $ endLine ,
517
511
'package ' => $ this ->getPackage ($ tokens , $ i ),
518
512
'file ' => $ this ->filename
519
513
);
520
514
521
- $ tclass = $ this ->tclass ( $ token ) ;
515
+ $ tclass = $ token ->tclass ;
522
516
if ($ tclass === 'PHP_Token_CLASS ' ) {
523
- $ class = $ this -> tname ( $ tokens, $ i ) ;
517
+ $ class = $ tokens[ $ i ]-> tname ;
524
518
$ classEndLine = $ endLine ;
525
519
$ this ->classes [$ class ] = $ tmp ;
526
520
} else {
527
- $ trait = $ this -> tname ( $ tokens, $ i ) ;
521
+ $ trait = $ tokens[ $ i ]-> tname ;
528
522
$ traitEndLine = $ endLine ;
529
523
$ this ->traits [$ trait ] = $ tmp ;
530
524
}
531
525
break ;
532
526
533
527
case 'PHP_Token_FUNCTION ' :
534
- $ tname = $ this -> tname ( $ tokens, $ i ) ;
528
+ $ tname = $ tokens[ $ i ]-> tname ;
535
529
$ tmp = array (
536
530
'docblock ' => $ this ->getDocblock ($ tokens , $ i ),
537
531
'keywords ' => $ this ->getKeywords ($ tokens , $ i ),
538
532
'visibility ' => $ this ->getVisibility ($ tokens , $ i ),
539
533
'signature ' => $ this ->getSignature ($ tokens , $ i ),
540
- 'startLine ' => $ this ->tline ( $ i ) ,
534
+ 'startLine ' => $ token ->tline ,
541
535
'endLine ' => $ this ->getEndLine ($ tokens , $ i ),
542
536
'ccn ' => $ this ->getCCN ($ tokens , $ i ),
543
537
'file ' => $ this ->filename
@@ -555,13 +549,13 @@ public function tokenize() {
555
549
break ;
556
550
557
551
case 'PHP_Token_CLOSE_CURLY ' :
558
- if ($ classEndLine !== false && $ classEndLine == $ this ->tline ( $ i ) ) {
552
+ if ($ classEndLine !== false && $ classEndLine == $ token ->tline ) {
559
553
$ class = false ;
560
554
$ classEndLine = false ;
561
- } elseif ($ traitEndLine !== false && $ traitEndLine == $ this ->tline ( $ i ) ) {
555
+ } elseif ($ traitEndLine !== false && $ traitEndLine == $ token ->tline ) {
562
556
$ trait = false ;
563
557
$ traitEndLine = false ;
564
- } elseif ($ interfaceEndLine !== false && $ interfaceEndLine == $ this ->tline ( $ i ) ) {
558
+ } elseif ($ interfaceEndLine !== false && $ interfaceEndLine == $ token ->tline ) {
565
559
$ interface = false ;
566
560
$ interfaceEndLine = false ;
567
561
}
@@ -594,4 +588,20 @@ public function getTraits() {
594
588
public function getFunctions () {
595
589
return $ this ->functions ;
596
590
}
591
+ }
592
+
593
+ class CodeCoverage_Token {
594
+ public $ tname ;
595
+ public $ tconst ;
596
+ public $ tclass ;
597
+ public $ tstring ;
598
+ public $ tline ;
599
+
600
+ public function __construct ($ tname , $ tconst , $ tclass , $ tstring , $ tline ) {
601
+ $ this ->tname = $ tname ;
602
+ $ this ->tconst = $ tconst ;
603
+ $ this ->tclass = $ tclass ;
604
+ $ this ->tstring = $ tstring ;
605
+ $ this ->tline = $ tline ;
606
+ }
597
607
}
0 commit comments