Autoloader.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. <?php
  2. namespace PhpParser;
  3. /**
  4. * @codeCoverageIgnore
  5. */
  6. class Autoloader
  7. {
  8. /** @var bool Whether the autoloader has been registered. */
  9. private static $registered = false;
  10. /** @var bool Whether we're running on PHP 7. */
  11. private static $runningOnPhp7;
  12. /**
  13. * Registers PhpParser\Autoloader as an SPL autoloader.
  14. *
  15. * @param bool $prepend Whether to prepend the autoloader instead of appending
  16. */
  17. static public function register($prepend = false) {
  18. if (self::$registered === true) {
  19. return;
  20. }
  21. spl_autoload_register(array(__CLASS__, 'autoload'), true, $prepend);
  22. self::$registered = true;
  23. self::$runningOnPhp7 = version_compare(PHP_VERSION, '7.0-dev', '>=');
  24. }
  25. /**
  26. * Handles autoloading of classes.
  27. *
  28. * @param string $class A class name.
  29. */
  30. static public function autoload($class) {
  31. if (0 === strpos($class, 'PhpParser\\')) {
  32. if (isset(self::$php7AliasesOldToNew[$class])) {
  33. if (self::$runningOnPhp7) {
  34. return;
  35. }
  36. // Load the new class, alias will be registered afterwards
  37. $class = self::$php7AliasesOldToNew[$class];
  38. }
  39. $fileName = dirname(__DIR__) . '/' . strtr($class, '\\', '/') . '.php';
  40. if (file_exists($fileName)) {
  41. require $fileName;
  42. }
  43. if (isset(self::$php7AliasesNewToOld[$class])) {
  44. // New class name was used, register alias for old one, otherwise
  45. // it won't be usable in "instanceof" and other non-autoloading places.
  46. if (!self::$runningOnPhp7) {
  47. class_alias($class, self::$php7AliasesNewToOld[$class]);
  48. }
  49. }
  50. } else if (0 === strpos($class, 'PHPParser_')) {
  51. if (isset(self::$nonNamespacedAliases[$class])) {
  52. // Register all aliases at once to avoid dependency issues
  53. self::registerNonNamespacedAliases();
  54. }
  55. }
  56. }
  57. private static function registerNonNamespacedAliases() {
  58. foreach (self::$nonNamespacedAliases as $old => $new) {
  59. class_alias($new, $old);
  60. }
  61. }
  62. private static $php7AliasesOldToNew = array(
  63. 'PhpParser\Node\Expr\Cast\Bool' => 'PhpParser\Node\Expr\Cast\Bool_',
  64. 'PhpParser\Node\Expr\Cast\Int' => 'PhpParser\Node\Expr\Cast\Int_',
  65. 'PhpParser\Node\Expr\Cast\Object' => 'PhpParser\Node\Expr\Cast\Object_',
  66. 'PhpParser\Node\Expr\Cast\String' => 'PhpParser\Node\Expr\Cast\String_',
  67. 'PhpParser\Node\Scalar\String' => 'PhpParser\Node\Scalar\String_',
  68. );
  69. private static $php7AliasesNewToOld = array(
  70. 'PhpParser\Node\Expr\Cast\Bool_' => 'PhpParser\Node\Expr\Cast\Bool',
  71. 'PhpParser\Node\Expr\Cast\Int_' => 'PhpParser\Node\Expr\Cast\Int',
  72. 'PhpParser\Node\Expr\Cast\Object_' => 'PhpParser\Node\Expr\Cast\Object',
  73. 'PhpParser\Node\Expr\Cast\String_' => 'PhpParser\Node\Expr\Cast\String',
  74. 'PhpParser\Node\Scalar\String_' => 'PhpParser\Node\Scalar\String',
  75. );
  76. private static $nonNamespacedAliases = array(
  77. 'PHPParser_Builder' => 'PhpParser\Builder',
  78. 'PHPParser_BuilderAbstract' => 'PhpParser\BuilderAbstract',
  79. 'PHPParser_BuilderFactory' => 'PhpParser\BuilderFactory',
  80. 'PHPParser_Comment' => 'PhpParser\Comment',
  81. 'PHPParser_Comment_Doc' => 'PhpParser\Comment\Doc',
  82. 'PHPParser_Error' => 'PhpParser\Error',
  83. 'PHPParser_Lexer' => 'PhpParser\Lexer',
  84. 'PHPParser_Lexer_Emulative' => 'PhpParser\Lexer\Emulative',
  85. 'PHPParser_Node' => 'PhpParser\Node',
  86. 'PHPParser_NodeAbstract' => 'PhpParser\NodeAbstract',
  87. 'PHPParser_NodeDumper' => 'PhpParser\NodeDumper',
  88. 'PHPParser_NodeTraverser' => 'PhpParser\NodeTraverser',
  89. 'PHPParser_NodeTraverserInterface' => 'PhpParser\NodeTraverserInterface',
  90. 'PHPParser_NodeVisitor' => 'PhpParser\NodeVisitor',
  91. 'PHPParser_NodeVisitor_NameResolver' => 'PhpParser\NodeVisitor\NameResolver',
  92. 'PHPParser_NodeVisitorAbstract' => 'PhpParser\NodeVisitorAbstract',
  93. 'PHPParser_Parser' => 'PhpParser\Parser',
  94. 'PHPParser_PrettyPrinterAbstract' => 'PhpParser\PrettyPrinterAbstract',
  95. 'PHPParser_PrettyPrinter_Default' => 'PhpParser\PrettyPrinter\Standard',
  96. 'PHPParser_PrettyPrinter_Zend' => 'PhpParser\PrettyPrinter\Standard',
  97. 'PHPParser_Serializer' => 'PhpParser\Serializer',
  98. 'PHPParser_Serializer_XML' => 'PhpParser\Serializer\XML',
  99. 'PHPParser_Unserializer' => 'PhpParser\Unserializer',
  100. 'PHPParser_Unserializer_XML' => 'PhpParser\Unserializer\XML',
  101. 'PHPParser_Builder_Class' => 'PhpParser\Builder\Class_',
  102. 'PHPParser_Builder_Function' => 'PhpParser\Builder\Function_',
  103. 'PHPParser_Builder_Interface' => 'PhpParser\Builder\Interface_',
  104. 'PHPParser_Builder_Method' => 'PhpParser\Builder\Method',
  105. 'PHPParser_Builder_Param' => 'PhpParser\Builder\Param',
  106. 'PHPParser_Builder_Property' => 'PhpParser\Builder\Property',
  107. 'PHPParser_Node_Arg' => 'PhpParser\Node\Arg',
  108. 'PHPParser_Node_Const' => 'PhpParser\Node\Const_',
  109. 'PHPParser_Node_Expr' => 'PhpParser\Node\Expr',
  110. 'PHPParser_Node_Name' => 'PhpParser\Node\Name',
  111. 'PHPParser_Node_Name_FullyQualified' => 'PhpParser\Node\Name\FullyQualified',
  112. 'PHPParser_Node_Name_Relative' => 'PhpParser\Node\Name\Relative',
  113. 'PHPParser_Node_Param' => 'PhpParser\Node\Param',
  114. 'PHPParser_Node_Scalar' => 'PhpParser\Node\Scalar',
  115. 'PHPParser_Node_Stmt' => 'PhpParser\Node\Stmt',
  116. 'PHPParser_Node_Stmt_Break' => 'PhpParser\Node\Stmt\Break_',
  117. 'PHPParser_Node_Stmt_Case' => 'PhpParser\Node\Stmt\Case_',
  118. 'PHPParser_Node_Stmt_Catch' => 'PhpParser\Node\Stmt\Catch_',
  119. 'PHPParser_Node_Stmt_Class' => 'PhpParser\Node\Stmt\Class_',
  120. 'PHPParser_Node_Stmt_ClassConst' => 'PhpParser\Node\Stmt\ClassConst',
  121. 'PHPParser_Node_Stmt_ClassMethod' => 'PhpParser\Node\Stmt\ClassMethod',
  122. 'PHPParser_Node_Stmt_Const' => 'PhpParser\Node\Stmt\Const_',
  123. 'PHPParser_Node_Stmt_Continue' => 'PhpParser\Node\Stmt\Continue_',
  124. 'PHPParser_Node_Stmt_Declare' => 'PhpParser\Node\Stmt\Declare_',
  125. 'PHPParser_Node_Stmt_DeclareDeclare' => 'PhpParser\Node\Stmt\DeclareDeclare',
  126. 'PHPParser_Node_Stmt_Do' => 'PhpParser\Node\Stmt\Do_',
  127. 'PHPParser_Node_Stmt_Echo' => 'PhpParser\Node\Stmt\Echo_',
  128. 'PHPParser_Node_Stmt_Else' => 'PhpParser\Node\Stmt\Else_',
  129. 'PHPParser_Node_Stmt_ElseIf' => 'PhpParser\Node\Stmt\ElseIf_',
  130. 'PHPParser_Node_Stmt_For' => 'PhpParser\Node\Stmt\For_',
  131. 'PHPParser_Node_Stmt_Foreach' => 'PhpParser\Node\Stmt\Foreach_',
  132. 'PHPParser_Node_Stmt_Function' => 'PhpParser\Node\Stmt\Function_',
  133. 'PHPParser_Node_Stmt_Global' => 'PhpParser\Node\Stmt\Global_',
  134. 'PHPParser_Node_Stmt_Goto' => 'PhpParser\Node\Stmt\Goto_',
  135. 'PHPParser_Node_Stmt_HaltCompiler' => 'PhpParser\Node\Stmt\HaltCompiler',
  136. 'PHPParser_Node_Stmt_If' => 'PhpParser\Node\Stmt\If_',
  137. 'PHPParser_Node_Stmt_InlineHTML' => 'PhpParser\Node\Stmt\InlineHTML',
  138. 'PHPParser_Node_Stmt_Interface' => 'PhpParser\Node\Stmt\Interface_',
  139. 'PHPParser_Node_Stmt_Label' => 'PhpParser\Node\Stmt\Label',
  140. 'PHPParser_Node_Stmt_Namespace' => 'PhpParser\Node\Stmt\Namespace_',
  141. 'PHPParser_Node_Stmt_Property' => 'PhpParser\Node\Stmt\Property',
  142. 'PHPParser_Node_Stmt_PropertyProperty' => 'PhpParser\Node\Stmt\PropertyProperty',
  143. 'PHPParser_Node_Stmt_Return' => 'PhpParser\Node\Stmt\Return_',
  144. 'PHPParser_Node_Stmt_Static' => 'PhpParser\Node\Stmt\Static_',
  145. 'PHPParser_Node_Stmt_StaticVar' => 'PhpParser\Node\Stmt\StaticVar',
  146. 'PHPParser_Node_Stmt_Switch' => 'PhpParser\Node\Stmt\Switch_',
  147. 'PHPParser_Node_Stmt_Throw' => 'PhpParser\Node\Stmt\Throw_',
  148. 'PHPParser_Node_Stmt_Trait' => 'PhpParser\Node\Stmt\Trait_',
  149. 'PHPParser_Node_Stmt_TraitUse' => 'PhpParser\Node\Stmt\TraitUse',
  150. 'PHPParser_Node_Stmt_TraitUseAdaptation' => 'PhpParser\Node\Stmt\TraitUseAdaptation',
  151. 'PHPParser_Node_Stmt_TraitUseAdaptation_Alias' => 'PhpParser\Node\Stmt\TraitUseAdaptation\Alias',
  152. 'PHPParser_Node_Stmt_TraitUseAdaptation_Precedence' => 'PhpParser\Node\Stmt\TraitUseAdaptation\Precedence',
  153. 'PHPParser_Node_Stmt_TryCatch' => 'PhpParser\Node\Stmt\TryCatch',
  154. 'PHPParser_Node_Stmt_Unset' => 'PhpParser\Node\Stmt\Unset_',
  155. 'PHPParser_Node_Stmt_UseUse' => 'PhpParser\Node\Stmt\UseUse',
  156. 'PHPParser_Node_Stmt_Use' => 'PhpParser\Node\Stmt\Use_',
  157. 'PHPParser_Node_Stmt_While' => 'PhpParser\Node\Stmt\While_',
  158. 'PHPParser_Node_Expr_AssignBitwiseAnd' => 'PhpParser\Node\Expr\AssignOp\BitwiseAnd',
  159. 'PHPParser_Node_Expr_AssignBitwiseOr' => 'PhpParser\Node\Expr\AssignOp\BitwiseOr',
  160. 'PHPParser_Node_Expr_AssignBitwiseXor' => 'PhpParser\Node\Expr\AssignOp\BitwiseXor',
  161. 'PHPParser_Node_Expr_AssignConcat' => 'PhpParser\Node\Expr\AssignOp\Concat',
  162. 'PHPParser_Node_Expr_AssignDiv' => 'PhpParser\Node\Expr\AssignOp\Div',
  163. 'PHPParser_Node_Expr_AssignMinus' => 'PhpParser\Node\Expr\AssignOp\Minus',
  164. 'PHPParser_Node_Expr_AssignMod' => 'PhpParser\Node\Expr\AssignOp\Mod',
  165. 'PHPParser_Node_Expr_AssignMul' => 'PhpParser\Node\Expr\AssignOp\Mul',
  166. 'PHPParser_Node_Expr_AssignPlus' => 'PhpParser\Node\Expr\AssignOp\Plus',
  167. 'PHPParser_Node_Expr_AssignShiftLeft' => 'PhpParser\Node\Expr\AssignOp\ShiftLeft',
  168. 'PHPParser_Node_Expr_AssignShiftRight' => 'PhpParser\Node\Expr\AssignOp\ShiftRight',
  169. 'PHPParser_Node_Expr_Cast' => 'PhpParser\Node\Expr\Cast',
  170. 'PHPParser_Node_Expr_Cast_Array' => 'PhpParser\Node\Expr\Cast\Array_',
  171. 'PHPParser_Node_Expr_Cast_Bool' => 'PhpParser\Node\Expr\Cast\Bool_',
  172. 'PHPParser_Node_Expr_Cast_Double' => 'PhpParser\Node\Expr\Cast\Double',
  173. 'PHPParser_Node_Expr_Cast_Int' => 'PhpParser\Node\Expr\Cast\Int_',
  174. 'PHPParser_Node_Expr_Cast_Object' => 'PhpParser\Node\Expr\Cast\Object_',
  175. 'PHPParser_Node_Expr_Cast_String' => 'PhpParser\Node\Expr\Cast\String_',
  176. 'PHPParser_Node_Expr_Cast_Unset' => 'PhpParser\Node\Expr\Cast\Unset_',
  177. 'PHPParser_Node_Expr_BitwiseAnd' => 'PhpParser\Node\Expr\BinaryOp\BitwiseAnd',
  178. 'PHPParser_Node_Expr_BitwiseOr' => 'PhpParser\Node\Expr\BinaryOp\BitwiseOr',
  179. 'PHPParser_Node_Expr_BitwiseXor' => 'PhpParser\Node\Expr\BinaryOp\BitwiseXor',
  180. 'PHPParser_Node_Expr_BooleanAnd' => 'PhpParser\Node\Expr\BinaryOp\BooleanAnd',
  181. 'PHPParser_Node_Expr_BooleanOr' => 'PhpParser\Node\Expr\BinaryOp\BooleanOr',
  182. 'PHPParser_Node_Expr_Concat' => 'PhpParser\Node\Expr\BinaryOp\Concat',
  183. 'PHPParser_Node_Expr_Div' => 'PhpParser\Node\Expr\BinaryOp\Div',
  184. 'PHPParser_Node_Expr_Equal' => 'PhpParser\Node\Expr\BinaryOp\Equal',
  185. 'PHPParser_Node_Expr_Greater' => 'PhpParser\Node\Expr\BinaryOp\Greater',
  186. 'PHPParser_Node_Expr_GreaterOrEqual' => 'PhpParser\Node\Expr\BinaryOp\GreaterOrEqual',
  187. 'PHPParser_Node_Expr_Identical' => 'PhpParser\Node\Expr\BinaryOp\Identical',
  188. 'PHPParser_Node_Expr_LogicalAnd' => 'PhpParser\Node\Expr\BinaryOp\LogicalAnd',
  189. 'PHPParser_Node_Expr_LogicalOr' => 'PhpParser\Node\Expr\BinaryOp\LogicalOr',
  190. 'PHPParser_Node_Expr_LogicalXor' => 'PhpParser\Node\Expr\BinaryOp\LogicalXor',
  191. 'PHPParser_Node_Expr_Minus' => 'PhpParser\Node\Expr\BinaryOp\Minus',
  192. 'PHPParser_Node_Expr_Mod' => 'PhpParser\Node\Expr\BinaryOp\Mod',
  193. 'PHPParser_Node_Expr_Mul' => 'PhpParser\Node\Expr\BinaryOp\Mul',
  194. 'PHPParser_Node_Expr_NotEqual' => 'PhpParser\Node\Expr\BinaryOp\NotEqual',
  195. 'PHPParser_Node_Expr_NotIdentical' => 'PhpParser\Node\Expr\BinaryOp\NotIdentical',
  196. 'PHPParser_Node_Expr_Plus' => 'PhpParser\Node\Expr\BinaryOp\Plus',
  197. 'PHPParser_Node_Expr_ShiftLeft' => 'PhpParser\Node\Expr\BinaryOp\ShiftLeft',
  198. 'PHPParser_Node_Expr_ShiftRight' => 'PhpParser\Node\Expr\BinaryOp\ShiftRight',
  199. 'PHPParser_Node_Expr_Smaller' => 'PhpParser\Node\Expr\BinaryOp\Smaller',
  200. 'PHPParser_Node_Expr_SmallerOrEqual' => 'PhpParser\Node\Expr\BinaryOp\SmallerOrEqual',
  201. 'PHPParser_Node_Expr_Array' => 'PhpParser\Node\Expr\Array_',
  202. 'PHPParser_Node_Expr_ArrayDimFetch' => 'PhpParser\Node\Expr\ArrayDimFetch',
  203. 'PHPParser_Node_Expr_ArrayItem' => 'PhpParser\Node\Expr\ArrayItem',
  204. 'PHPParser_Node_Expr_Assign' => 'PhpParser\Node\Expr\Assign',
  205. 'PHPParser_Node_Expr_AssignRef' => 'PhpParser\Node\Expr\AssignRef',
  206. 'PHPParser_Node_Expr_BitwiseNot' => 'PhpParser\Node\Expr\BitwiseNot',
  207. 'PHPParser_Node_Expr_BooleanNot' => 'PhpParser\Node\Expr\BooleanNot',
  208. 'PHPParser_Node_Expr_ClassConstFetch' => 'PhpParser\Node\Expr\ClassConstFetch',
  209. 'PHPParser_Node_Expr_Clone' => 'PhpParser\Node\Expr\Clone_',
  210. 'PHPParser_Node_Expr_Closure' => 'PhpParser\Node\Expr\Closure',
  211. 'PHPParser_Node_Expr_ClosureUse' => 'PhpParser\Node\Expr\ClosureUse',
  212. 'PHPParser_Node_Expr_ConstFetch' => 'PhpParser\Node\Expr\ConstFetch',
  213. 'PHPParser_Node_Expr_Empty' => 'PhpParser\Node\Expr\Empty_',
  214. 'PHPParser_Node_Expr_ErrorSuppress' => 'PhpParser\Node\Expr\ErrorSuppress',
  215. 'PHPParser_Node_Expr_Eval' => 'PhpParser\Node\Expr\Eval_',
  216. 'PHPParser_Node_Expr_Exit' => 'PhpParser\Node\Expr\Exit_',
  217. 'PHPParser_Node_Expr_FuncCall' => 'PhpParser\Node\Expr\FuncCall',
  218. 'PHPParser_Node_Expr_Include' => 'PhpParser\Node\Expr\Include_',
  219. 'PHPParser_Node_Expr_Instanceof' => 'PhpParser\Node\Expr\Instanceof_',
  220. 'PHPParser_Node_Expr_Isset' => 'PhpParser\Node\Expr\Isset_',
  221. 'PHPParser_Node_Expr_List' => 'PhpParser\Node\Expr\List_',
  222. 'PHPParser_Node_Expr_MethodCall' => 'PhpParser\Node\Expr\MethodCall',
  223. 'PHPParser_Node_Expr_New' => 'PhpParser\Node\Expr\New_',
  224. 'PHPParser_Node_Expr_PostDec' => 'PhpParser\Node\Expr\PostDec',
  225. 'PHPParser_Node_Expr_PostInc' => 'PhpParser\Node\Expr\PostInc',
  226. 'PHPParser_Node_Expr_PreDec' => 'PhpParser\Node\Expr\PreDec',
  227. 'PHPParser_Node_Expr_PreInc' => 'PhpParser\Node\Expr\PreInc',
  228. 'PHPParser_Node_Expr_Print' => 'PhpParser\Node\Expr\Print_',
  229. 'PHPParser_Node_Expr_PropertyFetch' => 'PhpParser\Node\Expr\PropertyFetch',
  230. 'PHPParser_Node_Expr_ShellExec' => 'PhpParser\Node\Expr\ShellExec',
  231. 'PHPParser_Node_Expr_StaticCall' => 'PhpParser\Node\Expr\StaticCall',
  232. 'PHPParser_Node_Expr_StaticPropertyFetch' => 'PhpParser\Node\Expr\StaticPropertyFetch',
  233. 'PHPParser_Node_Expr_Ternary' => 'PhpParser\Node\Expr\Ternary',
  234. 'PHPParser_Node_Expr_UnaryMinus' => 'PhpParser\Node\Expr\UnaryMinus',
  235. 'PHPParser_Node_Expr_UnaryPlus' => 'PhpParser\Node\Expr\UnaryPlus',
  236. 'PHPParser_Node_Expr_Variable' => 'PhpParser\Node\Expr\Variable',
  237. 'PHPParser_Node_Expr_Yield' => 'PhpParser\Node\Expr\Yield_',
  238. 'PHPParser_Node_Scalar_ClassConst' => 'PhpParser\Node\Scalar\MagicConst\Class_',
  239. 'PHPParser_Node_Scalar_DirConst' => 'PhpParser\Node\Scalar\MagicConst\Dir',
  240. 'PHPParser_Node_Scalar_FileConst' => 'PhpParser\Node\Scalar\MagicConst\File',
  241. 'PHPParser_Node_Scalar_FuncConst' => 'PhpParser\Node\Scalar\MagicConst\Function_',
  242. 'PHPParser_Node_Scalar_LineConst' => 'PhpParser\Node\Scalar\MagicConst\Line',
  243. 'PHPParser_Node_Scalar_MethodConst' => 'PhpParser\Node\Scalar\MagicConst\Method',
  244. 'PHPParser_Node_Scalar_NSConst' => 'PhpParser\Node\Scalar\MagicConst\Namespace_',
  245. 'PHPParser_Node_Scalar_TraitConst' => 'PhpParser\Node\Scalar\MagicConst\Trait_',
  246. 'PHPParser_Node_Scalar_DNumber' => 'PhpParser\Node\Scalar\DNumber',
  247. 'PHPParser_Node_Scalar_Encapsed' => 'PhpParser\Node\Scalar\Encapsed',
  248. 'PHPParser_Node_Scalar_LNumber' => 'PhpParser\Node\Scalar\LNumber',
  249. 'PHPParser_Node_Scalar_String' => 'PhpParser\Node\Scalar\String_',
  250. );
  251. }
  252. class_alias('PhpParser\Autoloader', 'PHPParser_Autoloader');