- Add DISCOVERY_LOG_LEVEL=debug - Add DISCOVERY_SHOW_PROGRESS=true - Temporary changes for debugging InitializerProcessor fixes on production
169 lines
4.5 KiB
PHP
169 lines
4.5 KiB
PHP
<?php
|
|
|
|
require_once __DIR__ . '/vendor/autoload.php';
|
|
|
|
use App\Framework\Discovery\Processing\ClassExtractor;
|
|
use App\Framework\Filesystem\File;
|
|
use App\Framework\Filesystem\FilePath;
|
|
use App\Framework\Filesystem\FileSystemService;
|
|
use App\Framework\Tokenizer\Discovery\DiscoveryTokenizer;
|
|
|
|
// Test PHP code with various structures
|
|
$testCode = <<<'PHP'
|
|
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Example\Services;
|
|
|
|
use App\Framework\Http\JsonResult;
|
|
use App\Framework\Http\Route;
|
|
use App\Repository\UserRepository;
|
|
|
|
#[Route(path: '/api/users', method: 'GET')]
|
|
#[Deprecated('Use UserV2Controller instead')]
|
|
final readonly class UserController
|
|
{
|
|
public function __construct(
|
|
private UserRepository $repository
|
|
) {
|
|
}
|
|
|
|
/**
|
|
* Get all users
|
|
*
|
|
* @param int $limit Maximum number of users
|
|
* @return JsonResult<array<User>>
|
|
*/
|
|
#[Route(path: '/users/{limit}', method: 'GET')]
|
|
public function getUsers(int $limit = 10): JsonResult
|
|
{
|
|
$users = $this->repository->findAll($limit);
|
|
return new JsonResult(['users' => $users]);
|
|
}
|
|
}
|
|
|
|
interface UserServiceInterface
|
|
{
|
|
public function findById(int $id): ?User;
|
|
}
|
|
|
|
trait TimestampTrait
|
|
{
|
|
public function getCreatedAt(): \DateTime
|
|
{
|
|
return $this->createdAt;
|
|
}
|
|
}
|
|
|
|
enum UserStatus: string
|
|
{
|
|
case ACTIVE = 'active';
|
|
case INACTIVE = 'inactive';
|
|
case SUSPENDED = 'suspended';
|
|
}
|
|
|
|
function helper_function(string $name): string
|
|
{
|
|
return "Hello, {$name}!";
|
|
}
|
|
PHP;
|
|
|
|
echo "=== Testing Discovery Tokenizer ===\n\n";
|
|
|
|
// Create a temporary file for testing
|
|
$tempFile = tempnam(sys_get_temp_dir(), 'discovery_test');
|
|
file_put_contents($tempFile, $testCode);
|
|
|
|
try {
|
|
$file = File::fromSplFileInfo(new \SplFileInfo($tempFile));
|
|
$fileSystemService = new FileSystemService();
|
|
$classExtractor = new ClassExtractor($fileSystemService);
|
|
$tokenizer = new DiscoveryTokenizer();
|
|
|
|
// Test class extraction
|
|
echo "1. Class Extraction:\n";
|
|
$classes = $classExtractor->extractDetailedFromFile($file);
|
|
foreach ($classes as $class) {
|
|
echo sprintf(
|
|
" %s: %s (line %d) in namespace %s\n",
|
|
$class['type'],
|
|
$class['name'],
|
|
$class['line'],
|
|
$class['namespace'] ?? 'global'
|
|
);
|
|
}
|
|
|
|
// Test function extraction
|
|
echo "\n2. Function Extraction:\n";
|
|
$functions = $classExtractor->extractFunctionsFromFile($file);
|
|
foreach ($functions as $function) {
|
|
echo sprintf(
|
|
" %s: %s (line %d) - %s %s\n",
|
|
$function['type'],
|
|
$function['name'],
|
|
$function['line'],
|
|
$function['visibility'],
|
|
$function['class'] ? "in {$function['class']}" : 'global'
|
|
);
|
|
}
|
|
|
|
// Test attribute extraction
|
|
echo "\n3. Attribute Extraction:\n";
|
|
$attributes = $classExtractor->extractAttributesFromFile($file);
|
|
foreach ($attributes as $attribute) {
|
|
echo sprintf(
|
|
" %s (line %d) targeting %s in %s context\n",
|
|
$attribute['name'],
|
|
$attribute['line'],
|
|
$attribute['target'],
|
|
$attribute['context']
|
|
);
|
|
}
|
|
|
|
// Test use statements
|
|
echo "\n4. Use Statements:\n";
|
|
$uses = $classExtractor->extractUseStatementsFromFile($file);
|
|
foreach ($uses as $use) {
|
|
echo sprintf(
|
|
" %s%s (line %d)\n",
|
|
$use['class'],
|
|
$use['alias'] ? " as {$use['alias']}" : '',
|
|
$use['line']
|
|
);
|
|
}
|
|
|
|
// Test complete analysis
|
|
echo "\n5. Complete Analysis:\n";
|
|
$analysis = $classExtractor->analyzeFile($file);
|
|
echo sprintf(
|
|
" Classes: %d, Functions: %d, Attributes: %d, Uses: %d\n",
|
|
count($analysis['classes']),
|
|
count($analysis['functions']),
|
|
count($analysis['attributes']),
|
|
count($analysis['uses'])
|
|
);
|
|
|
|
// Compare with direct tokenizer usage
|
|
echo "\n6. Direct Tokenizer Comparison:\n";
|
|
$directClasses = $tokenizer->extractClasses($testCode);
|
|
echo " Direct tokenizer found " . count($directClasses) . " classes\n";
|
|
|
|
// Check if results match
|
|
$extractorCount = count($classes);
|
|
$tokenizerCount = count($directClasses);
|
|
$match = $extractorCount === $tokenizerCount;
|
|
|
|
echo sprintf(
|
|
" Results match: %s (Extractor: %d, Tokenizer: %d)\n",
|
|
$match ? 'YES ✓' : 'NO ✗',
|
|
$extractorCount,
|
|
$tokenizerCount
|
|
);
|
|
|
|
} finally {
|
|
// Clean up
|
|
unlink($tempFile);
|
|
}
|
|
|
|
echo "\n=== Discovery Tokenizer Test Complete ===\n"; |