Skip to content

Commit

Permalink
added ability to change after class definition created (#401)
Browse files Browse the repository at this point in the history
  • Loading branch information
romalytvynenko authored May 27, 2024
1 parent 44014e3 commit 060fd63
Show file tree
Hide file tree
Showing 5 changed files with 50 additions and 0 deletions.
4 changes: 4 additions & 0 deletions src/Infer/Analyzer/ClassAnalyzer.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@

namespace Dedoc\Scramble\Infer\Analyzer;

use Dedoc\Scramble\Infer\Context;
use Dedoc\Scramble\Infer\Definition\ClassDefinition;
use Dedoc\Scramble\Infer\Definition\ClassPropertyDefinition;
use Dedoc\Scramble\Infer\Definition\FunctionLikeDefinition;
use Dedoc\Scramble\Infer\Extensions\Event\ClassDefinitionCreatedEvent;
use Dedoc\Scramble\Infer\Scope\Index;
use Dedoc\Scramble\Support\Type\FunctionType;
use Dedoc\Scramble\Support\Type\TemplateType;
Expand Down Expand Up @@ -83,6 +85,8 @@ public function analyze(string $name): ClassDefinition

$this->index->registerClassDefinition($classDefinition);

Context::getInstance()->extensionsBroker->afterClassDefinitionCreated(new ClassDefinitionCreatedEvent($classDefinition->name, $classDefinition));

return $classDefinition;
}
}
12 changes: 12 additions & 0 deletions src/Infer/Extensions/AfterClassDefinitionCreatedExtension.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<?php

namespace Dedoc\Scramble\Infer\Extensions;

use Dedoc\Scramble\Infer\Extensions\Event\ClassDefinitionCreatedEvent;

interface AfterClassDefinitionCreatedExtension extends InferExtension
{
public function shouldHandle(string $name): bool;

public function afterClassDefinitionCreated(ClassDefinitionCreatedEvent $event);
}
14 changes: 14 additions & 0 deletions src/Infer/Extensions/Event/ClassDefinitionCreatedEvent.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?php

namespace Dedoc\Scramble\Infer\Extensions\Event;

use Dedoc\Scramble\Infer\Definition\ClassDefinition;

class ClassDefinitionCreatedEvent
{
public function __construct(
public readonly string $name,
public readonly ClassDefinition $classDefinition,
) {
}
}
12 changes: 12 additions & 0 deletions src/Infer/Extensions/ExtensionsBroker.php
Original file line number Diff line number Diff line change
Expand Up @@ -56,4 +56,16 @@ public function getStaticMethodReturnType($event)

return null;
}

public function afterClassDefinitionCreated($event)
{
$extensions = array_filter($this->extensions, function ($e) use ($event) {
return $e instanceof AfterClassDefinitionCreatedExtension
&& $e->shouldHandle($event->name);
});

foreach ($extensions as $extension) {
$extension->afterClassDefinitionCreated($event);
}
}
}
8 changes: 8 additions & 0 deletions src/Scramble.php
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,14 @@ public static function registerExtension(string $extensionClassName): void
static::$extensions[] = $extensionClassName;
}

/**
* @param class-string<ExceptionToResponseExtension|OperationExtension|TypeToSchemaExtension|InferExtension>[] $extensionClassNames
*/
public static function registerExtensions(array $extensionClassNames): void
{
static::$extensions = array_merge(static::$extensions, $extensionClassNames);
}

/**
* Modify tag generation behaviour
*
Expand Down

0 comments on commit 060fd63

Please sign in to comment.