@@ -265,6 +265,51 @@ private function getDocblock(array $tokens, $idx) {
265
265
}
266
266
}
267
267
268
+ /**
269
+ * @return integer
270
+ */
271
+ private function getEndTokenId (array $ tokens , $ idx )
272
+ {
273
+ $ block = 0 ;
274
+ $ i = $ idx ;
275
+ $ endTokenId = null ;
276
+
277
+ while ($ endTokenId === null && isset ($ tokens [$ i ])) {
278
+ $ token = $ tokens [$ i ];
279
+ $ tclass = $ this ->tclass ($ token );
280
+ $ tconst = $ this ->tconst ($ token );
281
+ if ($ tclass === 'PHP_Token_OPEN_CURLY ' || $ tclass === 'PHP_Token_CURLY_OPEN ' ) {
282
+ $ block ++;
283
+ } elseif ($ tclass === 'PHP_Token_CLOSE_CURLY ' ) {
284
+ $ block --;
285
+
286
+ if ($ block === 0 ) {
287
+ $ endTokenId = $ i ;
288
+ }
289
+ } elseif (($ tconst === T_FUNCTION || $ tconst === T_NAMESPACE ) && $ tclass === 'PHP_Token_SEMICOLON ' ) {
290
+ if ($ block === 0 ) {
291
+ $ endTokenId = $ i ;
292
+ }
293
+ }
294
+
295
+ $ i ++;
296
+ }
297
+
298
+ if ($ endTokenId === null ) {
299
+ $ endTokenId = $ idx ;
300
+ }
301
+
302
+ return $ endTokenId ;
303
+ }
304
+
305
+ /**
306
+ * @return integer
307
+ */
308
+ private function getEndLine (array $ tokens , $ idx )
309
+ {
310
+ return $ this ->tline ($ tokens [$ this ->getEndTokenId ($ tokens , $ idx )]);
311
+ }
312
+
268
313
public function tokenize () {
269
314
$ sourceCode = file_get_contents ($ this ->filename );
270
315
$ tokens = token_get_all ($ sourceCode );
@@ -308,25 +353,27 @@ public function tokenize() {
308
353
309
354
case 'PHP_Token_CLASS ' :
310
355
case 'PHP_Token_TRAIT ' :
356
+ $ endLine = $ this ->getEndLine ($ tokens , $ i );
357
+
311
358
$ tmp = array (
312
359
'methods ' => array (),
313
360
'parent ' => $ this ->getParent ($ tokens , $ i ),
314
361
'interfaces ' => $ this ->getInterfaces ($ tokens , $ i ),
315
362
'keywords ' => $ this ->getKeywords ($ tokens , $ i ),
316
363
'docblock ' => $ this ->getDocblock ($ tokens , $ i ),
317
364
'startLine ' => $ this ->tline ($ token ),
318
- 'endLine ' => $ token -> getEndLine () ,
365
+ 'endLine ' => $ endLine ,
319
366
'package ' => $ token ->getPackage (),
320
367
'file ' => $ this ->filename
321
368
);
322
369
323
370
if ($ this ->tconst ($ token ) === T_CLASS ) {
324
371
$ class = $ this ->tname ($ tokens , $ i + 2 );
325
- $ classEndLine = $ token -> getEndLine () ;
372
+ $ classEndLine = $ endLine ;
326
373
$ this ->classes [$ class ] = $ tmp ;
327
374
} else {
328
375
$ trait = $ this ->tname ($ tokens , $ i + 2 );
329
- $ traitEndLine = $ token -> getEndLine () ;
376
+ $ traitEndLine = $ endLine ;
330
377
$ this ->traits [$ trait ] = $ tmp ;
331
378
}
332
379
break ;
@@ -339,7 +386,7 @@ public function tokenize() {
339
386
'visibility ' => $ this ->getVisibility ($ tokens , $ i ),
340
387
'signature ' => $ token ->getSignature (),
341
388
'startLine ' => $ this ->tline ($ token ),
342
- 'endLine ' => $ token ->getEndLine (),
389
+ 'endLine ' => $ this ->getEndLine ($ tokens , $ i ),
343
390
'ccn ' => $ token ->getCCN (),
344
391
'file ' => $ this ->filename
345
392
);
0 commit comments