/** * @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() : '') . '}'; }
/** * @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; }
/** * @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; }