PageRenderTime 49ms CodeModel.GetById 21ms RepoModel.GetById 1ms app.codeStats 0ms

/scanner/PHP-Parser/lib/PHPParser/NodeTraverser.php

https://bitbucket.org/theguly/thaps
PHP | 126 lines | 88 code | 20 blank | 18 comment | 12 complexity | 7546a28f2f990d19ea4f66f4e28f2166 MD5 | raw file
Possible License(s): GPL-3.0, BSD-3-Clause
  1. <?php
  2. class PHPParser_NodeTraverser
  3. {
  4. /**
  5. * @var PHPParser_NodeVisitor[] Visitors
  6. */
  7. protected $visitors;
  8. /**
  9. * Constructs a node traverser.
  10. */
  11. public function __construct() {
  12. $this->visitors = array();
  13. }
  14. /**
  15. * Adds a visitor.
  16. *
  17. * @param PHPParser_NodeVisitor $visitor Visitor to add
  18. */
  19. public function addVisitor(PHPParser_NodeVisitor $visitor) {
  20. $this->visitors[] = $visitor;
  21. }
  22. /**
  23. * Traverses an array of nodes using the registered visitors.
  24. *
  25. * @param PHPParser_Node[] $nodes Array of nodes
  26. *
  27. * @return PHPParser_Node[] Traversed array of nodes
  28. */
  29. public function traverse(array $nodes) {
  30. foreach ($this->visitors as $visitor) {
  31. if (null !== $return = $visitor->beforeTraverse($nodes)) {
  32. $nodes = $return;
  33. }
  34. }
  35. $nodes = $this->traverseArray($nodes);
  36. foreach ($this->visitors as $visitor) {
  37. if (null !== $return = $visitor->afterTraverse($nodes)) {
  38. $nodes = $return;
  39. }
  40. }
  41. return $nodes;
  42. }
  43. protected function traverseNode(PHPParser_Node $node) {
  44. $node = clone $node;
  45. foreach ($node->getSubNodeNames() as $name) {
  46. $subNode =& $node->$name;
  47. if (is_array($subNode)) {
  48. $subNode = $this->traverseArray($subNode);
  49. } elseif ($subNode instanceof PHPParser_Node) {
  50. foreach ($this->visitors as $visitor) {
  51. if (null !== $return = $visitor->enterNode($subNode)) {
  52. if ($return === false) {
  53. $subNode = null;
  54. continue 2;
  55. }
  56. $subNode = $return;
  57. }
  58. }
  59. $subNode = $this->traverseNode($subNode);
  60. foreach ($this->visitors as $visitor) {
  61. if (null !== $return = $visitor->leaveNode($subNode)) {
  62. $subNode = $return;
  63. }
  64. }
  65. }
  66. }
  67. return $node;
  68. }
  69. protected function traverseArray(array $nodes) {
  70. $doNodes = array();
  71. foreach ($nodes as $i => &$node) {
  72. if (is_array($node)) {
  73. $node = $this->traverseArray($node);
  74. } elseif ($node instanceof PHPParser_Node) {
  75. foreach ($this->visitors as $visitor) {
  76. if (null !== $return = $visitor->enterNode($node)) {
  77. if ($return === false) {
  78. $node = null;
  79. continue 2;
  80. }
  81. $node = $return;
  82. }
  83. }
  84. $node = $this->traverseNode($node);
  85. foreach ($this->visitors as $visitor) {
  86. $return = $visitor->leaveNode($node);
  87. if (false === $return) {
  88. $doNodes[] = array($i, array());
  89. break;
  90. } elseif (is_array($return)) {
  91. $doNodes[] = array($i, $return);
  92. break;
  93. } elseif (null !== $return) {
  94. $node = $return;
  95. }
  96. }
  97. }
  98. }
  99. if (!empty($doNodes)) {
  100. while (list($i, $replace) = array_pop($doNodes)) {
  101. array_splice($nodes, $i, 1, $replace);
  102. }
  103. }
  104. return $nodes;
  105. }
  106. }