Example #1
0
 /**
  * @param Node[]  $stmts
  * @param unknown $fileName
  *
  * @return string
  */
 public function collect(array $stmts, $fileName)
 {
     $namespace = null;
     $class = null;
     foreach ($this->nodeFetcher->foreachNodes($stmts) as $nodeData) {
         $node = $nodeData['node'];
         if ($node instanceof Expr\Include_) {
             throw new \Exception('Include not supported in ' . $fileName . ' on line ' . $node->getLine());
         } elseif ($node instanceof Stmt\Goto_) {
             throw new \Exception('Goto not supported in ' . $fileName . ' on line ' . $node->getLine());
         } elseif ($node instanceof Stmt\InlineHTML) {
             throw new \Exception('InlineHTML not supported in ' . $fileName . ' on line ' . $node->getLine());
         } elseif ($node instanceof Stmt\HaltCompiler) {
             throw new \Exception('HaltCompiler not supported in ' . $fileName . ' on line ' . $node->getLine());
         } elseif ($node instanceof MagicConst\Trait_) {
             throw new \Exception('MagicConst\\Trait_ not supported in ' . $fileName . ' on line ' . $node->getLine());
         } elseif ($node instanceof Stmt\Namespace_) {
             $namespace = implode('\\', $node->name->parts);
         } elseif ($node instanceof Stmt\Interface_ || $node instanceof Stmt\Class_) {
             if ($class !== null) {
                 throw new \Exception('Multiple class find in ' . $fileName);
             }
             $class = $namespace . '\\' . $this->reservedWordReplacer->replace($node->name);
         }
     }
     if ($namespace === null) {
         throw new \Exception('Namespace not found in ' . $fileName);
     }
     if ($class === null) {
         throw new \Exception('No class found in ' . $fileName);
     }
     $this->collected[$class] = $stmts;
     return $class;
 }
 /**
  * @param mixed $node
  *
  * @return array
  */
 public function collectAssignInCondition($node)
 {
     $collected = array('extracted' => array());
     foreach ($this->nodeFetcher->foreachNodes($node) as $stmtData) {
         $collected = $this->extract($stmtData['node'], $collected, $stmtData['parentClass']);
     }
     $collected = $this->extract($node, $collected);
     return $collected;
 }
 /**
  * @param mixed $node
  *
  * @return ArrayDto
  */
 public function collectAssignInCondition($node, ArrayDto $arrayDto = null)
 {
     if ($arrayDto === null) {
         $arrayDto = new ArrayDto();
     }
     foreach ($this->nodeFetcher->foreachNodes($node) as $stmtData) {
         $collected = $this->extract($stmtData['node'], $arrayDto, $stmtData['parentClass']);
     }
     return $this->extract($node, $arrayDto);
 }
 public function convert(Stmt\Class_ $node)
 {
     $this->classManipulator->registerClassImplements($node);
     $node->name = $this->reservedWordReplacer->replace($node->name);
     $addArrayPlusMethod = false;
     foreach ($this->nodeFetcher->foreachNodes($node->stmts) as $stmt) {
         if ($stmt['node'] instanceof AssignOp\Plus && $stmt['node']->expr instanceof Array_) {
             $addArrayPlusMethod = true;
             break;
         }
     }
     return $this->dispatcher->pModifiers($node->type) . 'class ' . $node->name . (null !== $node->extends ? ' extends ' . $this->dispatcher->p($node->extends) : '') . (!empty($node->implements) ? ' implements ' . $this->dispatcher->pCommaSeparated($node->implements) : '') . "\n" . '{' . $this->dispatcher->pStmts($node->stmts) . "\n" . ($addArrayPlusMethod === true ? $this->printArrayPlusMethod() : '') . '}';
 }
Example #5
0
 /**
  * @param array $stmts
  *
  * @return array
  */
 private function findAdditionalClasses(array $stmts)
 {
     $closurePrinter = new ClosurePrinter($this->dispatcher, $this->logger);
     $lastMethod = null;
     $aditionalClass = array();
     $number = 0;
     foreach ($this->nodeFetcher->foreachNodes($stmts) as $nodeData) {
         $node = $nodeData['node'];
         if ($node instanceof Stmt\ClassMethod) {
             $lastMethod = $node->name;
         } elseif ($node instanceof Expr\Closure) {
             $aditionalClass[] = $closurePrinter->createClosureClass($node, $lastMethod, $number);
             $number++;
         }
     }
     return $aditionalClass;
 }
Example #6
0
 /**
  * @param ClassMethod $classInfo
  * @param string      $name
  *
  * @throws \InvalidArgumentException
  *
  * @return \PhpParser\Node\Stmt\ClassMethod
  */
 private function findMethod(array $classInfo, $name)
 {
     foreach ($this->nodeFetcher->foreachNodes($classInfo) as $stmtData) {
         $stmt = $stmtData['node'];
         if ($stmt instanceof ClassMethod && $stmt->name === $name) {
             return $stmt;
         }
     }
     throw new \InvalidArgumentException(sprintf('method %s not found', $name));
 }
 /**
  * @param array         $nodes
  * @param ClassMetadata $classMetadata
  *
  * @return ClassMetadata
  */
 public function build(array $nodes, ClassMetadata $classMetadata)
 {
     $class = null;
     foreach ($this->nodeFetcher->foreachNodes($nodes) as $nodeData) {
         $node = $nodeData['node'];
         if ($node instanceof Stmt\UseUse) {
             $classMetadata->addUse($node);
             $classMetadata->addClasses($this->reservedWordReplacer->replace(implode('\\', $node->name->parts)));
             if ($node->name->getLast() !== $node->alias) {
                 $classMetadata->addClassesAlias($node->alias, $this->reservedWordReplacer->replace(implode('\\', $node->name->parts)));
             }
         } elseif ($node instanceof Stmt\Namespace_) {
             $classMetadata->setNamespace(implode('\\', $node->name->parts));
         } elseif ($node instanceof Stmt\Interface_ || $node instanceof Stmt\Class_) {
             if ($class !== null) {
                 throw new \Exception('Multiple class find in ' . $fileName);
             }
             $class = $this->reservedWordReplacer->replace($node->name);
             $classMetadata->setClass($class);
         }
     }
     return $classMetadata;
 }
 /**
  * @param \ArrayIterator|array $node
  * @param array                $vars
  *
  * @return \ArrayIterator|array
  */
 private function collectVars($node, array $vars = array())
 {
     if (is_array($node) === true) {
         $nodes = $node;
     } elseif (is_string($node) === false && method_exists($node, 'getIterator') === true) {
         $nodes = $node->getIterator();
     } else {
         return $vars;
     }
     foreach ($nodes as $stmt) {
         if ($stmt instanceof Expr\Assign) {
             if ($stmt->var instanceof Expr\PropertyFetch === false && $stmt->var instanceof Expr\StaticPropertyFetch === false) {
                 if (is_object($stmt->var->name) === false) {
                     // if true it is a dynamic var
                     $vars[] = $stmt->var->name;
                 }
             }
         } elseif ($stmt instanceof Stmt\Foreach_) {
             if (null !== $stmt->keyVar) {
                 $vars[] = $stmt->keyVar->name;
             }
             $vars[] = $stmt->valueVar->name;
         } elseif ($stmt instanceof Stmt\For_) {
             foreach ($stmt->init as $init) {
                 if ($init instanceof Expr\Assign) {
                     $vars[] = $init->var->name;
                 }
             }
         } elseif ($stmt instanceof Stmt\If_) {
             foreach ($this->nodeFetcher->foreachNodes($stmt) as $nodeData) {
                 $node = $nodeData['node'];
                 if ($node instanceof Expr\Assign) {
                     $vars[] = $node->var->name;
                 } elseif ($node instanceof Expr\Array_) {
                     $vars[] = 'tmpArray' . md5(serialize($node->items));
                 }
             }
         } elseif ($stmt instanceof Stmt\Catch_) {
             $vars[] = $stmt->var;
         } elseif ($stmt instanceof Stmt\Return_ && $stmt->expr instanceof Expr\Array_) {
             $vars[] = 'tmpArray' . md5(serialize($stmt->expr->items));
         }
         $vars = array_merge($vars, $this->collectVars($stmt));
     }
     $vars = array_map(array($this->reservedWordReplacer, 'replace'), $vars);
     return $vars;
 }
 /**
  * @param \ArrayIterator|array $node
  * @param array                $vars
  *
  * @return \ArrayIterator|array
  */
 private function collectVars($node, array $vars = array())
 {
     $noFetcher = new NodeFetcher();
     foreach ($noFetcher->foreachNodes($node) as &$stmt) {
         if ($stmt['node'] instanceof Expr\Assign) {
             if ($stmt['node']->var instanceof Expr\PropertyFetch === false && $stmt['node']->var instanceof Expr\StaticPropertyFetch === false && $stmt['node']->var instanceof Expr\ArrayDimFetch === false) {
                 if (is_object($stmt['node']->var->name) === false) {
                     // if true it is a dynamic var
                     $vars[] = $stmt['node']->var->name;
                 }
             }
         } elseif ($stmt['node'] instanceof Stmt\Foreach_) {
             if (null !== $stmt['node']->keyVar) {
                 $vars[] = $stmt['node']->keyVar->name;
             }
             $vars[] = $stmt['node']->valueVar->name;
         } elseif ($stmt['node'] instanceof Stmt\For_) {
             foreach ($stmt['node']->init as $init) {
                 if ($init instanceof Expr\Assign) {
                     $vars[] = $init->var->name;
                 }
             }
         } elseif ($stmt['node'] instanceof Stmt\If_) {
             foreach ($this->nodeFetcher->foreachNodes($stmt['node']->cond) as $nodeData) {
                 $node = $nodeData['node'];
                 if ($node instanceof Expr\Array_) {
                     $vars[] = 'tmpArray' . md5(serialize($node->items));
                 }
             }
         } elseif ($stmt['node'] instanceof Stmt\Catch_) {
             $vars[] = $stmt['node']->var;
         } elseif ($stmt['node'] instanceof Stmt\Return_ && $stmt['node']->expr instanceof Expr\Array_) {
             $vars[] = 'tmpArray' . md5(serialize($stmt['node']->expr->items));
         } elseif ($stmt['node'] instanceof Stmt\Static_) {
             foreach ($stmt['node']->vars as $var) {
                 $vars[] = $var->name;
             }
         } elseif ($stmt['node'] instanceof Arg && $stmt['node']->value instanceof Expr\Array_) {
             $vars[] = 'tmpArray' . md5(serialize($stmt['node']->value->items));
         }
     }
     $vars = array_map(array($this->reservedWordReplacer, 'replace'), $vars);
     return $vars;
 }
 /**
  * @param \ArrayIterator|array $node
  * @param array                $vars
  *
  * @return \ArrayIterator|array
  */
 private function collectVars($node, array $vars = array())
 {
     $noFetcher = new NodeFetcher();
     foreach ($noFetcher->foreachNodes($node) as &$stmt) {
         if ($stmt['node'] instanceof Expr\Assign) {
             if ($stmt['node']->var instanceof Expr\PropertyFetch === false && $stmt['node']->var instanceof Expr\StaticPropertyFetch === false && $stmt['node']->var instanceof Expr\ArrayDimFetch === false && $stmt['node']->var instanceof Expr\List_ === false) {
                 if (is_object($stmt['node']->var->name) === false) {
                     // if true it is a dynamic var
                     $vars[] = $stmt['node']->var->name;
                 }
             } elseif ($stmt['node']->var instanceof Expr\List_ === true) {
                 $varInList = array();
                 foreach ($stmt['node']->var->vars as $var) {
                     if (null !== $var) {
                         $varInList[] = $this->dispatcher->p($var);
                         if ($var instanceof Expr\ArrayDimFetch === false) {
                             $vars[] = $this->dispatcher->p($var);
                         }
                     }
                 }
                 $vars[] = 'tmpList' . str_replace(array('[', ']', '"'), '', implode('', $varInList));
             }
         } elseif ($stmt['node'] instanceof Stmt\Foreach_) {
             if (null !== $stmt['node']->keyVar) {
                 $vars[] = $stmt['node']->keyVar->name;
             }
             $vars[] = $stmt['node']->valueVar->name;
         } elseif ($stmt['node'] instanceof Stmt\For_) {
             foreach ($stmt['node']->init as $init) {
                 if ($init instanceof Expr\Assign) {
                     $vars[] = $init->var->name;
                 }
             }
         } elseif ($stmt['node'] instanceof Stmt\If_) {
             foreach ($this->nodeFetcher->foreachNodes($stmt['node']->cond) as $nodeData) {
                 $node = $nodeData['node'];
                 if ($node instanceof Expr\Array_) {
                     $vars[] = 'tmpArray' . md5(serialize($node->items));
                 }
             }
         } elseif ($stmt['node'] instanceof Stmt\Catch_) {
             $vars[] = $stmt['node']->var;
         } elseif ($stmt['node'] instanceof Stmt\Return_ && $stmt['node']->expr instanceof Expr\Array_) {
             $vars[] = 'tmpArray' . md5(serialize($stmt['node']->expr->items));
         } elseif ($stmt['node'] instanceof Stmt\Static_) {
             foreach ($stmt['node']->vars as $var) {
                 $vars[] = $var->name;
             }
         } elseif ($stmt['node'] instanceof Arg && $stmt['node']->value instanceof Expr\Array_) {
             $vars[] = 'tmpArray' . md5(serialize($stmt['node']->value->items));
         }
         if ($stmt['node'] instanceof Expr\ArrayDimFetch && !in_array("PhpParser\\Node\\Expr\\ArrayDimFetch", $stmt['parentClass'])) {
             $varCreatedInArray = $this->dispatcher->pExpr_ArrayDimFetch($stmt['node'], true);
             foreach ($varCreatedInArray['vars'] as $var) {
                 $vars[] = $var;
             }
         }
     }
     $vars = array_map(array($this->reservedWordReplacer, 'replace'), $vars);
     return $vars;
 }
 /**
  * @param Node[]            $node
  * @param Expr\ClosureUse[] $uses
  */
 private function convertUseToMemberAttribute($node, $uses)
 {
     $noFetcher = new NodeFetcher();
     foreach ($noFetcher->foreachNodes($node) as &$stmt) {
         if ($stmt['node'] instanceof Expr\Variable) {
             foreach ($uses as $use) {
                 if ($use->var === $stmt['node']->name) {
                     $stmt['node']->name = 'this->' . $stmt['node']->name;
                 }
             }
         }
     }
     return $node;
 }