Page MenuHomeIn-Portal Phabricator

ClassDetector.php
No OneTemporary

File Metadata

Created
Thu, Sep 25, 6:32 PM

ClassDetector.php

<?php
/**
* @version $Id: ClassDetector.php 16252 2015-09-27 06:34:45Z alex $
* @package In-Portal
* @copyright Copyright (C) 1997 - 2015 Intechnic. All rights reserved.
* @license GNU/GPL
* In-Portal is Open Source software.
* This means that this software may have been modified pursuant
* the GNU General Public License, and as distributed it includes
* or is derivative of works licensed under the GNU General Public License
* or other free or open source software licenses.
* See http://www.in-portal.org/license for copyright notices and details.
*/
namespace InPortal\Core\kernel\utility\ClassDiscovery;
use PhpParser\Node;
use PhpParser\Node\Stmt\Class_;
use PhpParser\Node\Stmt\ClassLike;
use PhpParser\Node\Stmt\Interface_;
use PhpParser\Node\Stmt\Trait_;
use PhpParser\NodeVisitorAbstract;
defined('FULL_PATH') or die('restricted access!');
class ClassDetector extends NodeVisitorAbstract
{
/**
* List of classes, discovered by the visitor.
*
* @var array
*/
protected $classes = array();
/**
* Class map builder.
*
* @var ClassMapBuilder
*/
protected $classMapBuilder;
/**
* Creates class detector instance.
*
* @param ClassMapBuilder $class_map_builder Class map builder.
*/
public function __construct(ClassMapBuilder $class_map_builder)
{
$this->classMapBuilder = $class_map_builder;
}
/**
* Remembers all encountered classes.
*
* @param Node $node Node.
*
* @return void
*/
public function enterNode(Node $node)
{
if ( $node instanceof ClassLike ) {
$class_info = array();
if ( $node instanceof Class_ ) {
$class_info['type'] = \kFactory::TYPE_CLASS;
$class_info['modifiers'] = 0;
if ( $node->isAbstract() ) {
$class_info['modifiers'] |= \kFactory::MODIFIER_ABSTRACT;
}
if ( $node->isFinal() ) {
$class_info['modifiers'] |= \kFactory::MODIFIER_FINAL;
}
$extends = array();
if ( $node->extends ) {
$extends[] = (string)$node->extends;
}
if ( $node->implements ) {
foreach ( $node->implements as $interface ) {
$extends[] = (string)$interface;
}
}
if ( $extends ) {
$class_info['extends'] = $extends;
}
}
elseif ( $node instanceof Interface_ ) {
$class_info['type'] = \kFactory::TYPE_INTERFACE;
if ( $node->extends ) {
$extends = array();
foreach ( $node->extends as $interface ) {
$extends[] = (string)$interface;
}
$class_info['extends'] = $extends;
}
}
elseif ( $node instanceof Trait_ ) {
$class_info['type'] = \kFactory::TYPE_TRAIT;
}
$this->classMapBuilder->addClass((string)$node->namespacedName, $class_info);
}
}
}

Event Timeline