From e1a10fa91a5f804954653e2bbbb1f2d06953f62e Mon Sep 17 00:00:00 2001 From: Jan-Hendrik Willms <tleilax+studip@gmail.com> Date: Thu, 12 Dec 2024 21:05:16 +0100 Subject: [PATCH] course block type changes rector --- lib/Rectors/Studip-6.0-Set.php | 3 +- .../RewriteCoursewareBlockTypesRector.php | 60 +++++++++++++++++++ rector-test.php | 42 +++++++++++++ 3 files changed, 104 insertions(+), 1 deletion(-) create mode 100644 lib/Rectors/Studip60/RewriteCoursewareBlockTypesRector.php diff --git a/lib/Rectors/Studip-6.0-Set.php b/lib/Rectors/Studip-6.0-Set.php index ca019b25547..438e794ac1d 100644 --- a/lib/Rectors/Studip-6.0-Set.php +++ b/lib/Rectors/Studip-6.0-Set.php @@ -8,7 +8,8 @@ use Studip\Rectors\Studip60\RemoveIncludesRector; return RectorConfig::configure() ->withRules([ Studip\Rectors\Studip60\RemoveGetConfigRector::class, - Studip\Rectors\Studip60\RemoveSidebarMethodsRector::class + Studip\Rectors\Studip60\RemoveSidebarMethodsRector::class, + Studip\Rectors\Studip60\RewriteCoursewareBlockTypesRector::class, ]) ->withConfiguredRule(RenameFunctionRector::class, [ 'studip_json_decode' => 'json_decode', diff --git a/lib/Rectors/Studip60/RewriteCoursewareBlockTypesRector.php b/lib/Rectors/Studip60/RewriteCoursewareBlockTypesRector.php new file mode 100644 index 00000000000..396257e6eb7 --- /dev/null +++ b/lib/Rectors/Studip60/RewriteCoursewareBlockTypesRector.php @@ -0,0 +1,60 @@ +<?php +declare(strict_types=1); + +namespace Studip\Rectors\Studip60; + +use PhpParser\Node; +use PhpParser\Node\Expr\StaticCall; +use PhpParser\Node\Stmt\Class_; +use PhpParser\Node\Stmt\ClassMethod; +use Rector\Rector\AbstractRector; + +final class RewriteCoursewareBlockTypesRector extends AbstractRector +{ + + public function getNodeTypes(): array + { + return [StaticCall::class, Class_::class]; + } + + /** + * @param StaticCall|Class_ $node + */ + public function refactor(Node $node) + { + if ($this->shouldSkip($node)) { + return null; + } + + if ($node instanceof Class_) { + $this->traverseNodesWithCallable( + $node->getMethods(), + [$this, 'refactor'] + ); + + return null; + } elseif ($node instanceof ClassMethod) { + $node->returnType = new Node\Identifier('string'); + return $node; + } elseif ($node instanceof StaticCall) { + return $node->args[0]->value; + } + + } + + public function shouldSkip(Node $node): bool + { + return !( + $node instanceof Class_ + && $this->isName($node->extends, 'Courseware\BlockTypes\BlockType') + ) && !( + $node instanceof ClassMethod + && $this->isName($node->name, 'getJsonSchema') + && $this->isName($node->returnType, 'Opis\JsonSchema\Schema') + ) && !( + $node instanceof StaticCall + && $this->isName($node->class, 'Opis\JsonSchema\Schema') + && $this->isName($node->name, 'fromJsonString') + ); + } +} diff --git a/rector-test.php b/rector-test.php index 046b79a519a..86f491a7cd0 100644 --- a/rector-test.php +++ b/rector-test.php @@ -51,3 +51,45 @@ try { echo 'some exception'; } +class TestBlockType extends \Courseware\BlockTypes\BlockType +{ + public static function getType(): string + { + return ''; + } + + public static function getTitle(): string + { + return ''; + } + + public static function getDescription(): string + { + return ''; + } + + public function initialPayload(): array + { + return []; + } + + public static function getCategories(): array + { + return []; + } + + public static function getContentTypes(): array + { + return []; + } + + public static function getFileTypes(): array + { + return []; + } + + public static function getJsonSchema(): \Opis\JsonSchema\Schema + { + return \Opis\JsonSchema\Schema::fromJsonString(file_get_contents(__FILE__)); + } +} -- GitLab