protected function generateSourceCode(ParsedType $type, SourceBuffer $buffer, \SplFileInfo $file) { $extends = array_map(function ($t) { return '\\' . ltrim($t, '\\'); }, $type->getExtends()); $extends = empty($extends) ? '' : implode(', ', $extends); $implements = ['\\' . MergedSourceInterface::class]; // Double inclusion safeguard: if ($type->isClass()) { $safe1 = sprintf(' if(!class_exists(%s, false)) { ', var_export($type->getName(), true)); $safe2 = ' } '; } elseif ($type->isInterface()) { $safe1 = sprintf(' if(!interface_exists(%s, false)) { ', var_export($type->getName(), true)); $safe2 = ' } '; } else { $safe1 = sprintf(' if(!trait_exists(%s, false)) { ', var_export($type->getName(), true)); $safe2 = ' } '; } $generator = new SourceGenerator($buffer); $generator->populateTypeMarker($type, ParsedType::MARKER_INTRODUCED_INTERFACES, implode(', ', $implements)); $generator->populateTypeMarker($type, ParsedType::MARKER_INTRODUCED_NAME, $type->getLocalName()); $generator->populateTypeMarker($type, ParsedType::MARKER_INTRODUCED_SUPERCLASS, $extends); $generator->populateTypeMarker($type, ParsedType::MARKER_INTRODUCED_PREPENDED_CODE, $safe1); $generator->populateTypeMarker($type, ParsedType::MARKER_INTRODUCED_EXTERNAL_CODE, $safe2); $code = trim($generator->generateCode($file->getPathname(), dirname($file->getPathname()))); $code = preg_replace("'^<\\?(?:php)?'i", '', $code) . "\n"; return $code; }
public function storeMethod(ParsedMethod $method, ParsedType $type) { $n = strtolower($type->getName()); if (empty($this->methods[$n])) { $this->methods[$n] = []; } $this->methods[$n][strtolower($method->getName())] = $method; }
public function __construct(ParsedType $type, array $fields, array $methods) { $this->key = strtolower($type->getName()); $this->type = $type; foreach ($fields as $field) { $this->fields[$field->getName()] = new ParsedFieldInfo($this, $field); } foreach ($methods as $method) { $this->methods[strtolower($method->getName())] = new ParsedMethodInfo($this, $method); } }
protected function createNode(ParsedType $type, SourceBuffer $buffer, \SplFileInfo $file) { $edges = array_map('strtolower', array_merge($type->getSupertypes(), $type->getTraits())); return new TopSortNode(strtolower($type->getName()), $edges, [$type, $buffer, $file]); }