/var/www/vhosts/ihelp.ro/httpdocs/vendor/cakephp/bake/src/CodeGen
NameSizeModeActions
ClassBuilder.php25980644editdlrm
CodeParser.php74620644editdlrm
FileBuilder.php33110644editdlrm
ImportHelper.php29000644editdlrm
ParsedClass.php16470644editdlrm
ParsedFile.php17740644editdlrm
ParseException.php7340644editdlrm
Edit: /var/www/vhosts/ihelp.ro/httpdocs/vendor/cakephp/bake/src/CodeGen/CodeParser.php (7462B)
parser = (new ParserFactory())->create( ParserFactory::PREFER_PHP7, new Emulative([ 'usedAttributes' => ['comments', 'startLine', 'endLine', 'startFilePos', 'endFilePos'], ]) ); $this->traverser = new NodeTraverser(); $this->traverser->addVisitor($this); } /** * @param string $code Code to parse * @return \Bake\CodeGen\ParsedFile|null * @throws \Bake\CodeGen\ParseException */ public function parseFile(string $code): ?ParsedFile { $this->fileText = $code; try { $this->traverser->traverse($this->parser->parse($code)); } catch (Error $e) { throw new ParseException($e->getMessage(), null, $e); } if (!isset($this->parsed['namespace'], $this->parsed['class'])) { return null; } return new ParsedFile( $this->parsed['namespace'], $this->parsed['imports']['class'], $this->parsed['imports']['function'], $this->parsed['imports']['const'], $this->parsed['class'] ); } /** * @inheritDoc */ public function beforeTraverse(array $nodes) { $this->parsed = [ 'imports' => [ 'class' => [], 'function' => [], 'const' => [], ], ]; return null; } /** * @inheritDoc */ public function enterNode(Node $node) { if ($node instanceof Namespace_) { if (isset($this->parsed['namespace'])) { throw new ParseException('Multiple namespaces are not not supported, update your file'); } $this->parsed['namespace'] = (string)$node->name; return null; } if ($node instanceof Use_) { if (count($node->uses) > 1) { throw new ParseException('Multiple use statements per line are not supported, update your file'); } [$alias, $target] = $this->normalizeUse(current($node->uses)); switch ($node->type) { case Use_::TYPE_NORMAL: $this->parsed['imports']['class'][$alias] = $target; break; case Use_::TYPE_FUNCTION: $this->parsed['imports']['function'][$alias] = $target; break; case Use_::TYPE_CONSTANT: $this->parsed['imports']['const'][$alias] = $target; break; } return NodeTraverser::DONT_TRAVERSE_CHILDREN; } if ($node instanceof GroupUse) { throw new ParseException('Group use statements are not supported, update your file'); } if ($node instanceof Class_) { if (!isset($this->parsed['namespace'])) { throw new ParseException('Classes defined in the global namespace is not supported, update your file'); } if (isset($this->parsed['class'])) { throw new ParseException('Multiple classes are not supported, update your file'); } $constants = []; foreach ($node->getConstants() as $constant) { if (count($constant->consts) > 1) { throw new ParseException('Multiple constants per line are not supported, update your file'); } $name = (string)current($constant->consts)->name; $constants[$name] = $this->getNodeCode($constant); } $properties = []; foreach ($node->getProperties() as $property) { if (count($property->props) > 1) { throw new ParseException('Multiple properties per line are not supported, update your file'); } $name = (string)current($property->props)->name; $properties[$name] = $this->getNodeCode($property); } $methods = []; foreach ($node->getMethods() as $method) { $name = (string)$method->name; $methods[$name] = $this->getNodeCode($method); } $implements = array_map(function ($name) { return (string)$name; }, $node->implements); $this->parsed['class'] = new ParsedClass( (string)$node->name, $implements, $constants, $properties, $methods ); return NodeTraverser::DONT_TRAVERSE_CHILDREN; } return null; } /** * @param \PhpParser\NodeAbstract $node Parser node * @return string */ protected function getNodeCode(NodeAbstract $node): string { $code = ''; $doc = $node->getDocComment() ? $node->getDocComment()->getText() : ''; if ($doc) { $code = static::INDENT . $doc . "\n"; } $startPos = $node->getStartFilePos(); $endPos = $node->getEndFilePos(); $code .= static::INDENT . substr($this->fileText, $startPos, $endPos - $startPos + 1); return $code; } /** * @param \PhpParser\Node\Stmt\UseUse $use Use node * @param string|null $prefix Group use prefix * @return array{string, string} */ protected function normalizeUse(UseUse $use, ?string $prefix = null): array { $name = (string)$use->name; if ($prefix) { $name = $prefix . '\\' . $name; } $alias = $use->alias; if (!$alias) { $last = strrpos($name, '\\', -1); if ($last !== false) { $alias = substr($name, strrpos($name, '\\', -1) + 1); } else { $alias = $name; } } return [(string)$alias, $name]; } }