From 47aa9b96ed5dc0d54106f954a4b3385b53928cfd Mon Sep 17 00:00:00 2001 From: Sebastian Fischer Date: Fri, 10 Nov 2023 13:06:58 +0100 Subject: [PATCH] Add missing class consts --- Classes/Composer/ClassComposer.php | 1 + .../Composer/Generator/ConstantGenerator.php | 78 +++++++++++++++++++ Classes/Parser/ClassParser.php | 1 + Classes/Parser/FileSegments.php | 24 ++++++ Classes/Parser/Visitor/ConstantVisitor.php | 31 ++++++++ Documentation/Settings.cfg | 4 +- ext_emconf.php | 2 +- 7 files changed, 138 insertions(+), 3 deletions(-) create mode 100644 Classes/Composer/Generator/ConstantGenerator.php create mode 100644 Classes/Parser/Visitor/ConstantVisitor.php diff --git a/Classes/Composer/ClassComposer.php b/Classes/Composer/ClassComposer.php index 098954b..438c40e 100644 --- a/Classes/Composer/ClassComposer.php +++ b/Classes/Composer/ClassComposer.php @@ -25,6 +25,7 @@ class ClassComposer Generator\UseGenerator::class, Generator\ClassGenerator::class, Generator\TraitGenerator::class, + Generator\ConstantGenerator::class, Generator\PropertyGenerator::class, Generator\ConstructorGenerator::class, Generator\ClassMethodGenerator::class, diff --git a/Classes/Composer/Generator/ConstantGenerator.php b/Classes/Composer/Generator/ConstantGenerator.php new file mode 100644 index 0000000..9908f70 --- /dev/null +++ b/Classes/Composer/Generator/ConstantGenerator.php @@ -0,0 +1,78 @@ +getNamespace($statements); + $class = $this->getClass($namespace); + + if ($class) { + $class->stmts = [...$class->stmts, ...$this->getUniqueClassConstants($fileSegments)]; + } + + return $statements; + } + + protected function getUniqueClassConstants(array $fileSegments): array + { + $classConstant = []; + /** @var FileSegments $fileSegment */ + foreach ($fileSegments as $fileSegment) { + foreach ($fileSegment->getClassConsts() as $currentClassConstant) { + foreach ($currentClassConstant->consts as $currentConst) { + if (isset($classConstant[(string)$currentConst->name])) { + continue; + } + $classConstant[(string)$currentConst->name] = new ClassConst([$currentConst]); + } + } + } + return array_values($classConstant); + } + + protected function getNamespace(array $statements): ?Namespace_ + { + $namespace = null; + foreach ($statements as $statement) { + if ($statement instanceof Namespace_) { + $namespace = $statement; + break; + } + } + return $namespace; + } + + protected function getClass(Namespace_ $namespace): ?Class_ + { + /** @var ?Class_ $class */ + $class = null; + foreach ($namespace->stmts as $node) { + if ($node instanceof Class_) { + $class = $node; + break; + } + } + return $class; + } +} diff --git a/Classes/Parser/ClassParser.php b/Classes/Parser/ClassParser.php index c05d6bb..b849312 100644 --- a/Classes/Parser/ClassParser.php +++ b/Classes/Parser/ClassParser.php @@ -27,6 +27,7 @@ class ClassParser Visitor\UseVisitor::class, Visitor\ClassVisitor::class, Visitor\TraitVisitor::class, + Visitor\ConstantVisitor::class, Visitor\PropertyVisitor::class, Visitor\ConstructorVisitor::class, Visitor\ClassMethodVisitor::class, diff --git a/Classes/Parser/FileSegments.php b/Classes/Parser/FileSegments.php index 9ba7088..037c669 100644 --- a/Classes/Parser/FileSegments.php +++ b/Classes/Parser/FileSegments.php @@ -18,6 +18,7 @@ use PhpParser\Node\Name; use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; +use PhpParser\Node\Stmt\ClassConst; use PhpParser\Node\Stmt\Property; use PhpParser\Node\Stmt\TraitUse; use PhpParser\Node\Stmt\UseUse; @@ -46,6 +47,11 @@ class FileSegments implements \JsonSerializable */ protected array $traits = []; + /** + * @var ClassConst[] + */ + protected array $classConsts = []; + /** * @var Property[] */ @@ -154,6 +160,24 @@ public function addTrait(TraitUse $traitUse): void $this->traits[] = $traitUse; } + /** + * @return ClassConst[] + */ + public function getClassConsts(): array + { + return $this->classConsts; + } + + public function setClassConsts(array $classConst): void + { + $this->classConsts = $classConst; + } + + public function addClassConst(ClassConst $classConst): void + { + $this->classConsts[] = $classConst; + } + /** * @return Property[] */ diff --git a/Classes/Parser/Visitor/ConstantVisitor.php b/Classes/Parser/Visitor/ConstantVisitor.php new file mode 100644 index 0000000..7445a01 --- /dev/null +++ b/Classes/Parser/Visitor/ConstantVisitor.php @@ -0,0 +1,31 @@ +fileSegment->addClassConst($node); + } + } +} diff --git a/Documentation/Settings.cfg b/Documentation/Settings.cfg index 60b97d2..70ccb3e 100644 --- a/Documentation/Settings.cfg +++ b/Documentation/Settings.cfg @@ -1,8 +1,8 @@ [general] project = extender -version = 10.0.0 -release = 10.0.0 +version = 10.0.1 +release = 10.0.1 copyright = since 2014 by evoWeb # code highlight https://app.codeimage.dev/ diff --git a/ext_emconf.php b/ext_emconf.php index 0ba9744..7b990bb 100644 --- a/ext_emconf.php +++ b/ext_emconf.php @@ -9,7 +9,7 @@ 'author_email' => 'extender@evoweb.de', 'author_company' => 'evoWeb', 'state' => 'stable', - 'version' => '10.0.0', + 'version' => '10.0.1', 'constraints' => [ 'depends' => [ 'typo3' => '11.0.0-12.2.99',