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