Token.php 26 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459
  1. <?php
  2. /*
  3. * This file is part of php-token-stream.
  4. *
  5. * (c) Sebastian Bergmann <sebastian@phpunit.de>
  6. *
  7. * For the full copyright and license information, please view the LICENSE
  8. * file that was distributed with this source code.
  9. */
  10. /**
  11. * A PHP token.
  12. */
  13. abstract class PHP_Token
  14. {
  15. /**
  16. * @var string
  17. */
  18. protected $text;
  19. /**
  20. * @var int
  21. */
  22. protected $line;
  23. /**
  24. * @var PHP_Token_Stream
  25. */
  26. protected $tokenStream;
  27. /**
  28. * @var int
  29. */
  30. protected $id;
  31. /**
  32. * @param string $text
  33. * @param int $line
  34. * @param PHP_Token_Stream $tokenStream
  35. * @param int $id
  36. */
  37. public function __construct($text, $line, PHP_Token_Stream $tokenStream, $id)
  38. {
  39. $this->text = $text;
  40. $this->line = $line;
  41. $this->tokenStream = $tokenStream;
  42. $this->id = $id;
  43. }
  44. /**
  45. * @return string
  46. */
  47. public function __toString()
  48. {
  49. return $this->text;
  50. }
  51. /**
  52. * @return int
  53. */
  54. public function getLine()
  55. {
  56. return $this->line;
  57. }
  58. /**
  59. * @return int
  60. */
  61. public function getId()
  62. {
  63. return $this->id;
  64. }
  65. }
  66. abstract class PHP_TokenWithScope extends PHP_Token
  67. {
  68. /**
  69. * @var int
  70. */
  71. protected $endTokenId;
  72. /**
  73. * Get the docblock for this token
  74. *
  75. * This method will fetch the docblock belonging to the current token. The
  76. * docblock must be placed on the line directly above the token to be
  77. * recognized.
  78. *
  79. * @return string|null Returns the docblock as a string if found
  80. */
  81. public function getDocblock()
  82. {
  83. $tokens = $this->tokenStream->tokens();
  84. $currentLineNumber = $tokens[$this->id]->getLine();
  85. $prevLineNumber = $currentLineNumber - 1;
  86. for ($i = $this->id - 1; $i; $i--) {
  87. if (!isset($tokens[$i])) {
  88. return;
  89. }
  90. if ($tokens[$i] instanceof PHP_Token_FUNCTION ||
  91. $tokens[$i] instanceof PHP_Token_CLASS ||
  92. $tokens[$i] instanceof PHP_Token_TRAIT) {
  93. // Some other trait, class or function, no docblock can be
  94. // used for the current token
  95. break;
  96. }
  97. $line = $tokens[$i]->getLine();
  98. if ($line == $currentLineNumber ||
  99. ($line == $prevLineNumber &&
  100. $tokens[$i] instanceof PHP_Token_WHITESPACE)) {
  101. continue;
  102. }
  103. if ($line < $currentLineNumber &&
  104. !$tokens[$i] instanceof PHP_Token_DOC_COMMENT) {
  105. break;
  106. }
  107. return (string) $tokens[$i];
  108. }
  109. }
  110. /**
  111. * @return int
  112. */
  113. public function getEndTokenId()
  114. {
  115. $block = 0;
  116. $i = $this->id;
  117. $tokens = $this->tokenStream->tokens();
  118. while ($this->endTokenId === null && isset($tokens[$i])) {
  119. if ($tokens[$i] instanceof PHP_Token_OPEN_CURLY ||
  120. $tokens[$i] instanceof PHP_Token_CURLY_OPEN) {
  121. $block++;
  122. } elseif ($tokens[$i] instanceof PHP_Token_CLOSE_CURLY) {
  123. $block--;
  124. if ($block === 0) {
  125. $this->endTokenId = $i;
  126. }
  127. } elseif (($this instanceof PHP_Token_FUNCTION ||
  128. $this instanceof PHP_Token_NAMESPACE) &&
  129. $tokens[$i] instanceof PHP_Token_SEMICOLON) {
  130. if ($block === 0) {
  131. $this->endTokenId = $i;
  132. }
  133. }
  134. $i++;
  135. }
  136. if ($this->endTokenId === null) {
  137. $this->endTokenId = $this->id;
  138. }
  139. return $this->endTokenId;
  140. }
  141. /**
  142. * @return int
  143. */
  144. public function getEndLine()
  145. {
  146. return $this->tokenStream[$this->getEndTokenId()]->getLine();
  147. }
  148. }
  149. abstract class PHP_TokenWithScopeAndVisibility extends PHP_TokenWithScope
  150. {
  151. /**
  152. * @return string
  153. */
  154. public function getVisibility()
  155. {
  156. $tokens = $this->tokenStream->tokens();
  157. for ($i = $this->id - 2; $i > $this->id - 7; $i -= 2) {
  158. if (isset($tokens[$i]) &&
  159. ($tokens[$i] instanceof PHP_Token_PRIVATE ||
  160. $tokens[$i] instanceof PHP_Token_PROTECTED ||
  161. $tokens[$i] instanceof PHP_Token_PUBLIC)) {
  162. return strtolower(
  163. str_replace('PHP_Token_', '', get_class($tokens[$i]))
  164. );
  165. }
  166. if (isset($tokens[$i]) &&
  167. !($tokens[$i] instanceof PHP_Token_STATIC ||
  168. $tokens[$i] instanceof PHP_Token_FINAL ||
  169. $tokens[$i] instanceof PHP_Token_ABSTRACT)) {
  170. // no keywords; stop visibility search
  171. break;
  172. }
  173. }
  174. }
  175. /**
  176. * @return string
  177. */
  178. public function getKeywords()
  179. {
  180. $keywords = [];
  181. $tokens = $this->tokenStream->tokens();
  182. for ($i = $this->id - 2; $i > $this->id - 7; $i -= 2) {
  183. if (isset($tokens[$i]) &&
  184. ($tokens[$i] instanceof PHP_Token_PRIVATE ||
  185. $tokens[$i] instanceof PHP_Token_PROTECTED ||
  186. $tokens[$i] instanceof PHP_Token_PUBLIC)) {
  187. continue;
  188. }
  189. if (isset($tokens[$i]) &&
  190. ($tokens[$i] instanceof PHP_Token_STATIC ||
  191. $tokens[$i] instanceof PHP_Token_FINAL ||
  192. $tokens[$i] instanceof PHP_Token_ABSTRACT)) {
  193. $keywords[] = strtolower(
  194. str_replace('PHP_Token_', '', get_class($tokens[$i]))
  195. );
  196. }
  197. }
  198. return implode(',', $keywords);
  199. }
  200. }
  201. abstract class PHP_Token_Includes extends PHP_Token
  202. {
  203. /**
  204. * @var string
  205. */
  206. protected $name;
  207. /**
  208. * @var string
  209. */
  210. protected $type;
  211. /**
  212. * @return string
  213. */
  214. public function getName()
  215. {
  216. if ($this->name === null) {
  217. $this->process();
  218. }
  219. return $this->name;
  220. }
  221. /**
  222. * @return string
  223. */
  224. public function getType()
  225. {
  226. if ($this->type === null) {
  227. $this->process();
  228. }
  229. return $this->type;
  230. }
  231. private function process()
  232. {
  233. $tokens = $this->tokenStream->tokens();
  234. if ($tokens[$this->id + 2] instanceof PHP_Token_CONSTANT_ENCAPSED_STRING) {
  235. $this->name = trim($tokens[$this->id + 2], "'\"");
  236. $this->type = strtolower(
  237. str_replace('PHP_Token_', '', get_class($tokens[$this->id]))
  238. );
  239. }
  240. }
  241. }
  242. class PHP_Token_FUNCTION extends PHP_TokenWithScopeAndVisibility
  243. {
  244. /**
  245. * @var array
  246. */
  247. protected $arguments;
  248. /**
  249. * @var int
  250. */
  251. protected $ccn;
  252. /**
  253. * @var string
  254. */
  255. protected $name;
  256. /**
  257. * @var string
  258. */
  259. protected $signature;
  260. /**
  261. * @var bool
  262. */
  263. private $anonymous = false;
  264. /**
  265. * @return array
  266. */
  267. public function getArguments()
  268. {
  269. if ($this->arguments !== null) {
  270. return $this->arguments;
  271. }
  272. $this->arguments = [];
  273. $tokens = $this->tokenStream->tokens();
  274. $typeDeclaration = null;
  275. // Search for first token inside brackets
  276. $i = $this->id + 2;
  277. while (!$tokens[$i - 1] instanceof PHP_Token_OPEN_BRACKET) {
  278. $i++;
  279. }
  280. while (!$tokens[$i] instanceof PHP_Token_CLOSE_BRACKET) {
  281. if ($tokens[$i] instanceof PHP_Token_STRING) {
  282. $typeDeclaration = (string) $tokens[$i];
  283. } elseif ($tokens[$i] instanceof PHP_Token_VARIABLE) {
  284. $this->arguments[(string) $tokens[$i]] = $typeDeclaration;
  285. $typeDeclaration = null;
  286. }
  287. $i++;
  288. }
  289. return $this->arguments;
  290. }
  291. /**
  292. * @return string
  293. */
  294. public function getName()
  295. {
  296. if ($this->name !== null) {
  297. return $this->name;
  298. }
  299. $tokens = $this->tokenStream->tokens();
  300. for ($i = $this->id + 1; $i < count($tokens); $i++) {
  301. if ($tokens[$i] instanceof PHP_Token_STRING) {
  302. $this->name = (string) $tokens[$i];
  303. break;
  304. } elseif ($tokens[$i] instanceof PHP_Token_AMPERSAND &&
  305. $tokens[$i + 1] instanceof PHP_Token_STRING) {
  306. $this->name = (string) $tokens[$i + 1];
  307. break;
  308. } elseif ($tokens[$i] instanceof PHP_Token_OPEN_BRACKET) {
  309. $this->anonymous = true;
  310. $this->name = sprintf(
  311. 'anonymousFunction:%s#%s',
  312. $this->getLine(),
  313. $this->getId()
  314. );
  315. break;
  316. }
  317. }
  318. if (!$this->isAnonymous()) {
  319. for ($i = $this->id; $i; --$i) {
  320. if ($tokens[$i] instanceof PHP_Token_NAMESPACE) {
  321. $this->name = $tokens[$i]->getName() . '\\' . $this->name;
  322. break;
  323. }
  324. if ($tokens[$i] instanceof PHP_Token_INTERFACE) {
  325. break;
  326. }
  327. }
  328. }
  329. return $this->name;
  330. }
  331. /**
  332. * @return int
  333. */
  334. public function getCCN()
  335. {
  336. if ($this->ccn !== null) {
  337. return $this->ccn;
  338. }
  339. $this->ccn = 1;
  340. $end = $this->getEndTokenId();
  341. $tokens = $this->tokenStream->tokens();
  342. for ($i = $this->id; $i <= $end; $i++) {
  343. switch (get_class($tokens[$i])) {
  344. case 'PHP_Token_IF':
  345. case 'PHP_Token_ELSEIF':
  346. case 'PHP_Token_FOR':
  347. case 'PHP_Token_FOREACH':
  348. case 'PHP_Token_WHILE':
  349. case 'PHP_Token_CASE':
  350. case 'PHP_Token_CATCH':
  351. case 'PHP_Token_BOOLEAN_AND':
  352. case 'PHP_Token_LOGICAL_AND':
  353. case 'PHP_Token_BOOLEAN_OR':
  354. case 'PHP_Token_LOGICAL_OR':
  355. case 'PHP_Token_QUESTION_MARK':
  356. $this->ccn++;
  357. break;
  358. }
  359. }
  360. return $this->ccn;
  361. }
  362. /**
  363. * @return string
  364. */
  365. public function getSignature()
  366. {
  367. if ($this->signature !== null) {
  368. return $this->signature;
  369. }
  370. if ($this->isAnonymous()) {
  371. $this->signature = 'anonymousFunction';
  372. $i = $this->id + 1;
  373. } else {
  374. $this->signature = '';
  375. $i = $this->id + 2;
  376. }
  377. $tokens = $this->tokenStream->tokens();
  378. while (isset($tokens[$i]) &&
  379. !$tokens[$i] instanceof PHP_Token_OPEN_CURLY &&
  380. !$tokens[$i] instanceof PHP_Token_SEMICOLON) {
  381. $this->signature .= $tokens[$i++];
  382. }
  383. $this->signature = trim($this->signature);
  384. return $this->signature;
  385. }
  386. /**
  387. * @return bool
  388. */
  389. public function isAnonymous()
  390. {
  391. return $this->anonymous;
  392. }
  393. }
  394. class PHP_Token_INTERFACE extends PHP_TokenWithScopeAndVisibility
  395. {
  396. /**
  397. * @var array
  398. */
  399. protected $interfaces;
  400. /**
  401. * @return string
  402. */
  403. public function getName()
  404. {
  405. return (string) $this->tokenStream[$this->id + 2];
  406. }
  407. /**
  408. * @return bool
  409. */
  410. public function hasParent()
  411. {
  412. return $this->tokenStream[$this->id + 4] instanceof PHP_Token_EXTENDS;
  413. }
  414. /**
  415. * @return array
  416. */
  417. public function getPackage()
  418. {
  419. $className = $this->getName();
  420. $docComment = $this->getDocblock();
  421. $result = [
  422. 'namespace' => '',
  423. 'fullPackage' => '',
  424. 'category' => '',
  425. 'package' => '',
  426. 'subpackage' => ''
  427. ];
  428. for ($i = $this->id; $i; --$i) {
  429. if ($this->tokenStream[$i] instanceof PHP_Token_NAMESPACE) {
  430. $result['namespace'] = $this->tokenStream[$i]->getName();
  431. break;
  432. }
  433. }
  434. if (preg_match('/@category[\s]+([\.\w]+)/', $docComment, $matches)) {
  435. $result['category'] = $matches[1];
  436. }
  437. if (preg_match('/@package[\s]+([\.\w]+)/', $docComment, $matches)) {
  438. $result['package'] = $matches[1];
  439. $result['fullPackage'] = $matches[1];
  440. }
  441. if (preg_match('/@subpackage[\s]+([\.\w]+)/', $docComment, $matches)) {
  442. $result['subpackage'] = $matches[1];
  443. $result['fullPackage'] .= '.' . $matches[1];
  444. }
  445. if (empty($result['fullPackage'])) {
  446. $result['fullPackage'] = $this->arrayToName(
  447. explode('_', str_replace('\\', '_', $className)),
  448. '.'
  449. );
  450. }
  451. return $result;
  452. }
  453. /**
  454. * @param array $parts
  455. * @param string $join
  456. *
  457. * @return string
  458. */
  459. protected function arrayToName(array $parts, $join = '\\')
  460. {
  461. $result = '';
  462. if (count($parts) > 1) {
  463. array_pop($parts);
  464. $result = implode($join, $parts);
  465. }
  466. return $result;
  467. }
  468. /**
  469. * @return bool|string
  470. */
  471. public function getParent()
  472. {
  473. if (!$this->hasParent()) {
  474. return false;
  475. }
  476. $i = $this->id + 6;
  477. $tokens = $this->tokenStream->tokens();
  478. $className = (string) $tokens[$i];
  479. while (isset($tokens[$i + 1]) &&
  480. !$tokens[$i + 1] instanceof PHP_Token_WHITESPACE) {
  481. $className .= (string) $tokens[++$i];
  482. }
  483. return $className;
  484. }
  485. /**
  486. * @return bool
  487. */
  488. public function hasInterfaces()
  489. {
  490. return (isset($this->tokenStream[$this->id + 4]) &&
  491. $this->tokenStream[$this->id + 4] instanceof PHP_Token_IMPLEMENTS) ||
  492. (isset($this->tokenStream[$this->id + 8]) &&
  493. $this->tokenStream[$this->id + 8] instanceof PHP_Token_IMPLEMENTS);
  494. }
  495. /**
  496. * @return array|bool
  497. */
  498. public function getInterfaces()
  499. {
  500. if ($this->interfaces !== null) {
  501. return $this->interfaces;
  502. }
  503. if (!$this->hasInterfaces()) {
  504. return ($this->interfaces = false);
  505. }
  506. if ($this->tokenStream[$this->id + 4] instanceof PHP_Token_IMPLEMENTS) {
  507. $i = $this->id + 3;
  508. } else {
  509. $i = $this->id + 7;
  510. }
  511. $tokens = $this->tokenStream->tokens();
  512. while (!$tokens[$i + 1] instanceof PHP_Token_OPEN_CURLY) {
  513. $i++;
  514. if ($tokens[$i] instanceof PHP_Token_STRING) {
  515. $this->interfaces[] = (string) $tokens[$i];
  516. }
  517. }
  518. return $this->interfaces;
  519. }
  520. }
  521. class PHP_Token_ABSTRACT extends PHP_Token
  522. {
  523. }
  524. class PHP_Token_AMPERSAND extends PHP_Token
  525. {
  526. }
  527. class PHP_Token_AND_EQUAL extends PHP_Token
  528. {
  529. }
  530. class PHP_Token_ARRAY extends PHP_Token
  531. {
  532. }
  533. class PHP_Token_ARRAY_CAST extends PHP_Token
  534. {
  535. }
  536. class PHP_Token_AS extends PHP_Token
  537. {
  538. }
  539. class PHP_Token_AT extends PHP_Token
  540. {
  541. }
  542. class PHP_Token_BACKTICK extends PHP_Token
  543. {
  544. }
  545. class PHP_Token_BAD_CHARACTER extends PHP_Token
  546. {
  547. }
  548. class PHP_Token_BOOLEAN_AND extends PHP_Token
  549. {
  550. }
  551. class PHP_Token_BOOLEAN_OR extends PHP_Token
  552. {
  553. }
  554. class PHP_Token_BOOL_CAST extends PHP_Token
  555. {
  556. }
  557. class PHP_Token_BREAK extends PHP_Token
  558. {
  559. }
  560. class PHP_Token_CARET extends PHP_Token
  561. {
  562. }
  563. class PHP_Token_CASE extends PHP_Token
  564. {
  565. }
  566. class PHP_Token_CATCH extends PHP_Token
  567. {
  568. }
  569. class PHP_Token_CHARACTER extends PHP_Token
  570. {
  571. }
  572. class PHP_Token_CLASS extends PHP_Token_INTERFACE
  573. {
  574. /**
  575. * @var bool
  576. */
  577. private $anonymous = false;
  578. /**
  579. * @var string
  580. */
  581. private $name;
  582. /**
  583. * @return string
  584. */
  585. public function getName()
  586. {
  587. if ($this->name !== null) {
  588. return $this->name;
  589. }
  590. $next = $this->tokenStream[$this->id + 1];
  591. if ($next instanceof PHP_Token_WHITESPACE) {
  592. $next = $this->tokenStream[$this->id + 2];
  593. }
  594. if ($next instanceof PHP_Token_STRING) {
  595. $this->name =(string) $next;
  596. return $this->name;
  597. }
  598. if ($next instanceof PHP_Token_OPEN_CURLY ||
  599. $next instanceof PHP_Token_EXTENDS ||
  600. $next instanceof PHP_Token_IMPLEMENTS) {
  601. $this->name = sprintf(
  602. 'AnonymousClass:%s#%s',
  603. $this->getLine(),
  604. $this->getId()
  605. );
  606. $this->anonymous = true;
  607. return $this->name;
  608. }
  609. }
  610. public function isAnonymous()
  611. {
  612. return $this->anonymous;
  613. }
  614. }
  615. class PHP_Token_CLASS_C extends PHP_Token
  616. {
  617. }
  618. class PHP_Token_CLASS_NAME_CONSTANT extends PHP_Token
  619. {
  620. }
  621. class PHP_Token_CLONE extends PHP_Token
  622. {
  623. }
  624. class PHP_Token_CLOSE_BRACKET extends PHP_Token
  625. {
  626. }
  627. class PHP_Token_CLOSE_CURLY extends PHP_Token
  628. {
  629. }
  630. class PHP_Token_CLOSE_SQUARE extends PHP_Token
  631. {
  632. }
  633. class PHP_Token_CLOSE_TAG extends PHP_Token
  634. {
  635. }
  636. class PHP_Token_COLON extends PHP_Token
  637. {
  638. }
  639. class PHP_Token_COMMA extends PHP_Token
  640. {
  641. }
  642. class PHP_Token_COMMENT extends PHP_Token
  643. {
  644. }
  645. class PHP_Token_CONCAT_EQUAL extends PHP_Token
  646. {
  647. }
  648. class PHP_Token_CONST extends PHP_Token
  649. {
  650. }
  651. class PHP_Token_CONSTANT_ENCAPSED_STRING extends PHP_Token
  652. {
  653. }
  654. class PHP_Token_CONTINUE extends PHP_Token
  655. {
  656. }
  657. class PHP_Token_CURLY_OPEN extends PHP_Token
  658. {
  659. }
  660. class PHP_Token_DEC extends PHP_Token
  661. {
  662. }
  663. class PHP_Token_DECLARE extends PHP_Token
  664. {
  665. }
  666. class PHP_Token_DEFAULT extends PHP_Token
  667. {
  668. }
  669. class PHP_Token_DIV extends PHP_Token
  670. {
  671. }
  672. class PHP_Token_DIV_EQUAL extends PHP_Token
  673. {
  674. }
  675. class PHP_Token_DNUMBER extends PHP_Token
  676. {
  677. }
  678. class PHP_Token_DO extends PHP_Token
  679. {
  680. }
  681. class PHP_Token_DOC_COMMENT extends PHP_Token
  682. {
  683. }
  684. class PHP_Token_DOLLAR extends PHP_Token
  685. {
  686. }
  687. class PHP_Token_DOLLAR_OPEN_CURLY_BRACES extends PHP_Token
  688. {
  689. }
  690. class PHP_Token_DOT extends PHP_Token
  691. {
  692. }
  693. class PHP_Token_DOUBLE_ARROW extends PHP_Token
  694. {
  695. }
  696. class PHP_Token_DOUBLE_CAST extends PHP_Token
  697. {
  698. }
  699. class PHP_Token_DOUBLE_COLON extends PHP_Token
  700. {
  701. }
  702. class PHP_Token_DOUBLE_QUOTES extends PHP_Token
  703. {
  704. }
  705. class PHP_Token_ECHO extends PHP_Token
  706. {
  707. }
  708. class PHP_Token_ELSE extends PHP_Token
  709. {
  710. }
  711. class PHP_Token_ELSEIF extends PHP_Token
  712. {
  713. }
  714. class PHP_Token_EMPTY extends PHP_Token
  715. {
  716. }
  717. class PHP_Token_ENCAPSED_AND_WHITESPACE extends PHP_Token
  718. {
  719. }
  720. class PHP_Token_ENDDECLARE extends PHP_Token
  721. {
  722. }
  723. class PHP_Token_ENDFOR extends PHP_Token
  724. {
  725. }
  726. class PHP_Token_ENDFOREACH extends PHP_Token
  727. {
  728. }
  729. class PHP_Token_ENDIF extends PHP_Token
  730. {
  731. }
  732. class PHP_Token_ENDSWITCH extends PHP_Token
  733. {
  734. }
  735. class PHP_Token_ENDWHILE extends PHP_Token
  736. {
  737. }
  738. class PHP_Token_END_HEREDOC extends PHP_Token
  739. {
  740. }
  741. class PHP_Token_EQUAL extends PHP_Token
  742. {
  743. }
  744. class PHP_Token_EVAL extends PHP_Token
  745. {
  746. }
  747. class PHP_Token_EXCLAMATION_MARK extends PHP_Token
  748. {
  749. }
  750. class PHP_Token_EXIT extends PHP_Token
  751. {
  752. }
  753. class PHP_Token_EXTENDS extends PHP_Token
  754. {
  755. }
  756. class PHP_Token_FILE extends PHP_Token
  757. {
  758. }
  759. class PHP_Token_FINAL extends PHP_Token
  760. {
  761. }
  762. class PHP_Token_FOR extends PHP_Token
  763. {
  764. }
  765. class PHP_Token_FOREACH extends PHP_Token
  766. {
  767. }
  768. class PHP_Token_FUNC_C extends PHP_Token
  769. {
  770. }
  771. class PHP_Token_GLOBAL extends PHP_Token
  772. {
  773. }
  774. class PHP_Token_GT extends PHP_Token
  775. {
  776. }
  777. class PHP_Token_IF extends PHP_Token
  778. {
  779. }
  780. class PHP_Token_IMPLEMENTS extends PHP_Token
  781. {
  782. }
  783. class PHP_Token_INC extends PHP_Token
  784. {
  785. }
  786. class PHP_Token_INCLUDE extends PHP_Token_Includes
  787. {
  788. }
  789. class PHP_Token_INCLUDE_ONCE extends PHP_Token_Includes
  790. {
  791. }
  792. class PHP_Token_INLINE_HTML extends PHP_Token
  793. {
  794. }
  795. class PHP_Token_INSTANCEOF extends PHP_Token
  796. {
  797. }
  798. class PHP_Token_INT_CAST extends PHP_Token
  799. {
  800. }
  801. class PHP_Token_ISSET extends PHP_Token
  802. {
  803. }
  804. class PHP_Token_IS_EQUAL extends PHP_Token
  805. {
  806. }
  807. class PHP_Token_IS_GREATER_OR_EQUAL extends PHP_Token
  808. {
  809. }
  810. class PHP_Token_IS_IDENTICAL extends PHP_Token
  811. {
  812. }
  813. class PHP_Token_IS_NOT_EQUAL extends PHP_Token
  814. {
  815. }
  816. class PHP_Token_IS_NOT_IDENTICAL extends PHP_Token
  817. {
  818. }
  819. class PHP_Token_IS_SMALLER_OR_EQUAL extends PHP_Token
  820. {
  821. }
  822. class PHP_Token_LINE extends PHP_Token
  823. {
  824. }
  825. class PHP_Token_LIST extends PHP_Token
  826. {
  827. }
  828. class PHP_Token_LNUMBER extends PHP_Token
  829. {
  830. }
  831. class PHP_Token_LOGICAL_AND extends PHP_Token
  832. {
  833. }
  834. class PHP_Token_LOGICAL_OR extends PHP_Token
  835. {
  836. }
  837. class PHP_Token_LOGICAL_XOR extends PHP_Token
  838. {
  839. }
  840. class PHP_Token_LT extends PHP_Token
  841. {
  842. }
  843. class PHP_Token_METHOD_C extends PHP_Token
  844. {
  845. }
  846. class PHP_Token_MINUS extends PHP_Token
  847. {
  848. }
  849. class PHP_Token_MINUS_EQUAL extends PHP_Token
  850. {
  851. }
  852. class PHP_Token_MOD_EQUAL extends PHP_Token
  853. {
  854. }
  855. class PHP_Token_MULT extends PHP_Token
  856. {
  857. }
  858. class PHP_Token_MUL_EQUAL extends PHP_Token
  859. {
  860. }
  861. class PHP_Token_NEW extends PHP_Token
  862. {
  863. }
  864. class PHP_Token_NUM_STRING extends PHP_Token
  865. {
  866. }
  867. class PHP_Token_OBJECT_CAST extends PHP_Token
  868. {
  869. }
  870. class PHP_Token_OBJECT_OPERATOR extends PHP_Token
  871. {
  872. }
  873. class PHP_Token_OPEN_BRACKET extends PHP_Token
  874. {
  875. }
  876. class PHP_Token_OPEN_CURLY extends PHP_Token
  877. {
  878. }
  879. class PHP_Token_OPEN_SQUARE extends PHP_Token
  880. {
  881. }
  882. class PHP_Token_OPEN_TAG extends PHP_Token
  883. {
  884. }
  885. class PHP_Token_OPEN_TAG_WITH_ECHO extends PHP_Token
  886. {
  887. }
  888. class PHP_Token_OR_EQUAL extends PHP_Token
  889. {
  890. }
  891. class PHP_Token_PAAMAYIM_NEKUDOTAYIM extends PHP_Token
  892. {
  893. }
  894. class PHP_Token_PERCENT extends PHP_Token
  895. {
  896. }
  897. class PHP_Token_PIPE extends PHP_Token
  898. {
  899. }
  900. class PHP_Token_PLUS extends PHP_Token
  901. {
  902. }
  903. class PHP_Token_PLUS_EQUAL extends PHP_Token
  904. {
  905. }
  906. class PHP_Token_PRINT extends PHP_Token
  907. {
  908. }
  909. class PHP_Token_PRIVATE extends PHP_Token
  910. {
  911. }
  912. class PHP_Token_PROTECTED extends PHP_Token
  913. {
  914. }
  915. class PHP_Token_PUBLIC extends PHP_Token
  916. {
  917. }
  918. class PHP_Token_QUESTION_MARK extends PHP_Token
  919. {
  920. }
  921. class PHP_Token_REQUIRE extends PHP_Token_Includes
  922. {
  923. }
  924. class PHP_Token_REQUIRE_ONCE extends PHP_Token_Includes
  925. {
  926. }
  927. class PHP_Token_RETURN extends PHP_Token
  928. {
  929. }
  930. class PHP_Token_SEMICOLON extends PHP_Token
  931. {
  932. }
  933. class PHP_Token_SL extends PHP_Token
  934. {
  935. }
  936. class PHP_Token_SL_EQUAL extends PHP_Token
  937. {
  938. }
  939. class PHP_Token_SR extends PHP_Token
  940. {
  941. }
  942. class PHP_Token_SR_EQUAL extends PHP_Token
  943. {
  944. }
  945. class PHP_Token_START_HEREDOC extends PHP_Token
  946. {
  947. }
  948. class PHP_Token_STATIC extends PHP_Token
  949. {
  950. }
  951. class PHP_Token_STRING extends PHP_Token
  952. {
  953. }
  954. class PHP_Token_STRING_CAST extends PHP_Token
  955. {
  956. }
  957. class PHP_Token_STRING_VARNAME extends PHP_Token
  958. {
  959. }
  960. class PHP_Token_SWITCH extends PHP_Token
  961. {
  962. }
  963. class PHP_Token_THROW extends PHP_Token
  964. {
  965. }
  966. class PHP_Token_TILDE extends PHP_Token
  967. {
  968. }
  969. class PHP_Token_TRY extends PHP_Token
  970. {
  971. }
  972. class PHP_Token_UNSET extends PHP_Token
  973. {
  974. }
  975. class PHP_Token_UNSET_CAST extends PHP_Token
  976. {
  977. }
  978. class PHP_Token_USE extends PHP_Token
  979. {
  980. }
  981. class PHP_Token_USE_FUNCTION extends PHP_Token
  982. {
  983. }
  984. class PHP_Token_VAR extends PHP_Token
  985. {
  986. }
  987. class PHP_Token_VARIABLE extends PHP_Token
  988. {
  989. }
  990. class PHP_Token_WHILE extends PHP_Token
  991. {
  992. }
  993. class PHP_Token_WHITESPACE extends PHP_Token
  994. {
  995. }
  996. class PHP_Token_XOR_EQUAL extends PHP_Token
  997. {
  998. }
  999. // Tokens introduced in PHP 5.1
  1000. class PHP_Token_HALT_COMPILER extends PHP_Token
  1001. {
  1002. }
  1003. // Tokens introduced in PHP 5.3
  1004. class PHP_Token_DIR extends PHP_Token
  1005. {
  1006. }
  1007. class PHP_Token_GOTO extends PHP_Token
  1008. {
  1009. }
  1010. class PHP_Token_NAMESPACE extends PHP_TokenWithScope
  1011. {
  1012. /**
  1013. * @return string
  1014. */
  1015. public function getName()
  1016. {
  1017. $tokens = $this->tokenStream->tokens();
  1018. $namespace = (string) $tokens[$this->id + 2];
  1019. for ($i = $this->id + 3;; $i += 2) {
  1020. if (isset($tokens[$i]) &&
  1021. $tokens[$i] instanceof PHP_Token_NS_SEPARATOR) {
  1022. $namespace .= '\\' . $tokens[$i + 1];
  1023. } else {
  1024. break;
  1025. }
  1026. }
  1027. return $namespace;
  1028. }
  1029. }
  1030. class PHP_Token_NS_C extends PHP_Token
  1031. {
  1032. }
  1033. class PHP_Token_NS_SEPARATOR extends PHP_Token
  1034. {
  1035. }
  1036. // Tokens introduced in PHP 5.4
  1037. class PHP_Token_CALLABLE extends PHP_Token
  1038. {
  1039. }
  1040. class PHP_Token_INSTEADOF extends PHP_Token
  1041. {
  1042. }
  1043. class PHP_Token_TRAIT extends PHP_Token_INTERFACE
  1044. {
  1045. }
  1046. class PHP_Token_TRAIT_C extends PHP_Token
  1047. {
  1048. }
  1049. // Tokens introduced in PHP 5.5
  1050. class PHP_Token_FINALLY extends PHP_Token
  1051. {
  1052. }
  1053. class PHP_Token_YIELD extends PHP_Token
  1054. {
  1055. }
  1056. // Tokens introduced in PHP 5.6
  1057. class PHP_Token_ELLIPSIS extends PHP_Token
  1058. {
  1059. }
  1060. class PHP_Token_POW extends PHP_Token
  1061. {
  1062. }
  1063. class PHP_Token_POW_EQUAL extends PHP_Token
  1064. {
  1065. }
  1066. // Tokens introduced in PHP 7.0
  1067. class PHP_Token_COALESCE extends PHP_Token
  1068. {
  1069. }
  1070. class PHP_Token_SPACESHIP extends PHP_Token
  1071. {
  1072. }
  1073. class PHP_Token_YIELD_FROM extends PHP_Token
  1074. {
  1075. }
  1076. // Tokens introduced in HackLang / HHVM
  1077. class PHP_Token_ASYNC extends PHP_Token
  1078. {
  1079. }
  1080. class PHP_Token_AWAIT extends PHP_Token
  1081. {
  1082. }
  1083. class PHP_Token_COMPILER_HALT_OFFSET extends PHP_Token
  1084. {
  1085. }
  1086. class PHP_Token_ENUM extends PHP_Token
  1087. {
  1088. }
  1089. class PHP_Token_EQUALS extends PHP_Token
  1090. {
  1091. }
  1092. class PHP_Token_IN extends PHP_Token
  1093. {
  1094. }
  1095. class PHP_Token_JOIN extends PHP_Token
  1096. {
  1097. }
  1098. class PHP_Token_LAMBDA_ARROW extends PHP_Token
  1099. {
  1100. }
  1101. class PHP_Token_LAMBDA_CP extends PHP_Token
  1102. {
  1103. }
  1104. class PHP_Token_LAMBDA_OP extends PHP_Token
  1105. {
  1106. }
  1107. class PHP_Token_ONUMBER extends PHP_Token
  1108. {
  1109. }
  1110. class PHP_Token_NULLSAFE_OBJECT_OPERATOR extends PHP_Token
  1111. {
  1112. }
  1113. class PHP_Token_SHAPE extends PHP_Token
  1114. {
  1115. }
  1116. class PHP_Token_SUPER extends PHP_Token
  1117. {
  1118. }
  1119. class PHP_Token_TYPE extends PHP_Token
  1120. {
  1121. }
  1122. class PHP_Token_TYPELIST_GT extends PHP_Token
  1123. {
  1124. }
  1125. class PHP_Token_TYPELIST_LT extends PHP_Token
  1126. {
  1127. }
  1128. class PHP_Token_WHERE extends PHP_Token
  1129. {
  1130. }
  1131. class PHP_Token_XHP_ATTRIBUTE extends PHP_Token
  1132. {
  1133. }
  1134. class PHP_Token_XHP_CATEGORY extends PHP_Token
  1135. {
  1136. }
  1137. class PHP_Token_XHP_CATEGORY_LABEL extends PHP_Token
  1138. {
  1139. }
  1140. class PHP_Token_XHP_CHILDREN extends PHP_Token
  1141. {
  1142. }
  1143. class PHP_Token_XHP_LABEL extends PHP_Token
  1144. {
  1145. }
  1146. class PHP_Token_XHP_REQUIRED extends PHP_Token
  1147. {
  1148. }
  1149. class PHP_Token_XHP_TAG_GT extends PHP_Token
  1150. {
  1151. }
  1152. class PHP_Token_XHP_TAG_LT extends PHP_Token
  1153. {
  1154. }
  1155. class PHP_Token_XHP_TEXT extends PHP_Token
  1156. {
  1157. }