Example #1
0
 /**
  * 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;
 }
Example #2
0
 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;
     }
 }
Example #3
0
 /**
  * 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;
 }