/** * Analyzes the given type and returns the FQCN variant. * * When a type is provided this method checks whether it is not a keyword or * Fully Qualified Class Name. If so it will use the given namespace and * aliases to expand the type to a FQCN representation. * * This method only works as expected if the namespace and aliases are set; * no dynamic reflection is being performed here. * * @param string $type The relative or absolute type. * * @uses getNamespace to determine with what to prefix the type name. * @uses getNamespaceAliases to check whether the first part of the relative * type name should not be replaced with another namespace. * * @return string */ protected function expand($type) { $type = trim($type); if (!$type) { return ''; } if ($this->isTypeAnArray($type)) { return $this->expand(substr($type, 0, -2)) . self::OPERATOR_ARRAY; } if ($this->isRelativeType($type) && !$this->isTypeAKeyword($type)) { $type_parts = explode(self::OPERATOR_NAMESPACE, $type, 2); $namespace_aliases = $this->context->getNamespaceAliases(); // if the first segment is not an alias; prepend namespace name and // return if (!isset($namespace_aliases[$type_parts[0]])) { $namespace = $this->context->getNamespace(); if ('' !== $namespace) { $namespace .= self::OPERATOR_NAMESPACE; } return self::OPERATOR_NAMESPACE . $namespace . $type; } $type_parts[0] = $namespace_aliases[$type_parts[0]]; $type = implode(self::OPERATOR_NAMESPACE, $type_parts); } return $type; }
public function leaveNode(PHPParser_Node $node) { $prettyPrinter = new PrettyPrinter(); switch (get_class($node)) { case 'PHPParser_Node_Stmt_Use': /** @var PHPParser_Node_Stmt_UseUse $use */ foreach ($node->uses as $use) { $this->context->setNamespaceAlias($use->alias, implode('\\', $use->name->parts)); } break; case 'PHPParser_Node_Stmt_Namespace': $this->context->setNamespace(isset($node->name) && $node->name ? implode('\\', $node->name->parts) : ''); break; case 'PHPParser_Node_Stmt_Class': $class = new ClassReflector($node, $this->context); $class->parseSubElements(); $this->classes[] = $class; break; case 'PHPParser_Node_Stmt_Trait': $trait = new TraitReflector($node, $this->context); $trait->parseSubElements(); $this->traits[] = $trait; break; case 'PHPParser_Node_Stmt_Interface': $interface = new InterfaceReflector($node, $this->context); $interface->parseSubElements(); $this->interfaces[] = $interface; break; case 'PHPParser_Node_Stmt_Function': $function = new FunctionReflector($node, $this->context); $this->functions[] = $function; break; case 'PHPParser_Node_Stmt_Const': foreach ($node->consts as $constant) { $reflector = new ConstantReflector($node, $this->context, $constant); $this->constants[] = $reflector; } break; case 'PHPParser_Node_Expr_FuncCall': if ($node->name instanceof PHPParser_Node_Name && $node->name == 'define' && isset($node->args[0]) && isset($node->args[1])) { // transform the first argument of the define function call into a constant name $name = str_replace(array('\\\\', '"', "'"), array('\\', '', ''), trim($prettyPrinter->prettyPrintExpr($node->args[0]->value), '\'')); $nameParts = explode('\\', $name); $shortName = end($nameParts); $constant = new PHPParser_Node_Const($shortName, $node->args[1]->value, $node->getAttributes()); $constant->namespacedName = new PHPParser_Node_Name($name); $constant_statement = new \PHPParser_Node_Stmt_Const(array($constant)); $constant_statement->setAttribute('comments', array($node->getDocComment())); $this->constants[] = new ConstantReflector($constant_statement, $this->context, $constant); } break; case 'PHPParser_Node_Expr_Include': $include = new IncludeReflector($node, $this->context); $this->includes[] = $include; break; } }
/** * Initializes this reflector with the correct node as produced by * PHP-Parser. * * @param PHPParser_NodeAbstract $node * @param Context $context * * @link http://github.com/nikic/PHP-Parser */ public function __construct(PHPParser_NodeAbstract $node, Context $context) { $this->node = $node; $context->setLSEN($this->getLSEN()); $this->context = $context; }