toString('_')); } elseif ($node instanceof PHPParser_Node_Stmt_Class || $node instanceof PHPParser_Node_Stmt_Interface || $node instanceof PHPParser_Node_Stmt_Function) { $node->name = $node->namespacedName->toString('_'); } elseif ($node instanceof PHPParser_Node_Stmt_Const) { foreach ($node->consts as $const) { $const->name = $const->namespacedName->toString('_'); } } elseif ($node instanceof PHPParser_Node_Stmt_Namespace) { // returning an array merges is into the parent array return $node->stmts; } elseif ($node instanceof PHPParser_Node_Stmt_Use) { // returning false removed the node altogether return false; } } } */ class NodeVisitor_PreprocessInclude extends PHPParser_NodeVisitorAbstract { protected $level; protected $cwd; protected $filepath; protected $prettyPrinter; public function __construct($level, $cwd, $filepath) { $this->level=$level; $this->cwd=$cwd; $this->filepath=$filepath; $this->prettyPrinter = new PHPParser_PrettyPrinter_Zend; } protected function resolveIncludePath($node) { //FIXME : Quick and dirty // no classpath checks... // no check if compound value like "dirname(__FILE__) . '/PHPParser/Autoloader.php'" return $node->expr->value; } public function enterNode(PHPParser_Node $node) { if ($node instanceof PHPParser_Node_Expr_Include) { // Already processed, go out (occurs if an unresolved include has left as is in the previous recursion level) if (is_array($node->attributes) && array_key_exists('NodeVisitor_PreprocessInclude', $node->attributes)) return $node; switch($node->type) { case PHPParser_Node_Expr_Include::TYPE_INCLUDE: case PHPParser_Node_Expr_Include::TYPE_REQUIRE: $once=0; break; case PHPParser_Node_Expr_Include::TYPE_INCLUDE_ONCE: case PHPParser_Node_Expr_Include::TYPE_REQUIRE_ONCE: $once=1; echo "TODO : include_once or require_once\n"; break; default: echo "FIXME : BUG NodeVisitor_PreprocessInclude::enterNode !!\n"; return $node; } $path=$this->resolveIncludePath($node); //FIXME : No infinite recursion check like test.php contains include('./test.php'); // Preprocess include if readable $comment_suffix=" */"; if ( ($this->level < 3) && is_readable($path)) { $comment_prefix="/* "; //FIXME : use a closure or sort of here (dependancy injection) //$stmts=recursive_parse($path, "out/rec.out1", "out/rec.out2", $this->level+1); $stmts=recursive_parse($path, "", "", $this->level+1); } else { $comment_prefix="/* UNRESOLVED : "; $node->attributes['NodeVisitor_PreprocessInclude']='unresolved'; $stmts=array($node); // Caution : can cause infinite loop (will be tried at the next step) } $comment= new PHPParser_Comment($comment_prefix . $this->prettyPrinter->prettyPrint(array($node)) . $comment_suffix); // FIXME : Get out this if() that is a trick for not returning here an array instead of a node return new PHPParser_Node_Stmt_If(new PHPParser_Node_Scalar_LNumber(1),array('stmts'=>$stmts),array('comments'=>array($comment))); } } }